diff --git a/docs/assets/css/bootstrap-responsive.css b/docs/assets/css/bootstrap-responsive.css
index daafa918..63b6bfaa 100644
--- a/docs/assets/css/bootstrap-responsive.css
+++ b/docs/assets/css/bootstrap-responsive.css
@@ -1038,3 +1038,142 @@
overflow: visible !important;
}
}
+/*!
+ * Jasny Bootstrap Responsive Extensions j1
+ *
+ * Copyright 2012 Jasny BV
+ * Licensed under the Apache License v2.0
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Extended with pride by @ArnoldDaniels of jasny.net
+ */
+
+.clearfix {
+ *zoom: 1;
+}
+
+.clearfix:before,
+.clearfix:after {
+ display: table;
+ line-height: 0;
+ content: "";
+}
+
+.clearfix:after {
+ clear: both;
+}
+
+.hide-text {
+ font: 0/0 a;
+ color: transparent;
+ text-shadow: none;
+ background-color: transparent;
+ border: 0;
+}
+
+.input-block-level {
+ display: block;
+ width: 100%;
+ min-height: 30px;
+ -webkit-box-sizing: border-box;
+ -moz-box-sizing: border-box;
+ box-sizing: border-box;
+}
+
+.container-semifluid {
+ max-width: 1170px;
+}
+
+@media (min-width: 768px) and (max-width: 979px) {
+ .row-desktop.row-fluid {
+ width: 100%;
+ }
+ .row-desktop.row {
+ margin-left: 0;
+ }
+ .row-desktop > [class*="span"],
+ .row-desktop > [class*="span"] {
+ display: block;
+ float: none;
+ width: auto;
+ margin: 0;
+ }
+}
+
+@media (max-width: 480px) {
+ .form-horizontal .controls,
+ .form-horizontal .well .controls,
+ .small-labels .controls {
+ margin-left: 0;
+ }
+}
+
+@media (max-width: 768px) {
+ .form-horizontal .form-actions {
+ padding-left: 18px;
+ }
+}
+
+@media (min-width: 768px) and (max-width: 979px) {
+ .form-horizontal .control-label {
+ width: 100px;
+ }
+ .form-horizontal .controls {
+ margin-left: 110px;
+ }
+ .form-horizontal .form-actions {
+ padding-left: 110px;
+ }
+ .form-horizontal .well .control-label {
+ width: 80px;
+ }
+ .form-horizontal .well .controls {
+ margin-left: 90px;
+ }
+ .small-labels .control-group > label {
+ width: 50px;
+ }
+ .small-labels .controls {
+ margin-left: 60px;
+ }
+ .small-labels .form-actions {
+ padding-left: 60px;
+ }
+}
+
+@media (min-width: 1200px) {
+ .small-labels .control-group > label {
+ width: 80px;
+ }
+ .small-labels .controls {
+ margin-left: 100px;
+ }
+ .small-labels .form-actions {
+ padding-left: 100px;
+ }
+}
+
+@media (max-width: 480px) {
+ .page-alert {
+ position: static;
+ width: auto;
+ }
+ .page-alert .alert {
+ width: auto;
+ margin-left: 0;
+ border-top-width: 1px;
+ -webkit-border-radius: 4px;
+ -moz-border-radius: 4px;
+ border-radius: 4px;
+ }
+ body > .page-alert {
+ position: static;
+ }
+}
+
+@media (min-width: 1200px) {
+ .page-alert .alert {
+ width: 700px;
+ margin-left: -375px;
+ }
+}
diff --git a/docs/assets/css/bootstrap.css b/docs/assets/css/bootstrap.css
index 0664207a..1628396d 100644
--- a/docs/assets/css/bootstrap.css
+++ b/docs/assets/css/bootstrap.css
@@ -5622,3 +5622,1414 @@ a.badge:hover {
.affix {
position: fixed;
}
+/*!
+ * Jasny Bootstrap Extensions j1
+ *
+ * Copyright 2012 Jasny BV
+ * Licensed under the Apache License v2.0
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Extended with pride by @ArnoldDaniels of jasny.net
+ */
+
+.clearfix {
+ *zoom: 1;
+}
+
+.clearfix:before,
+.clearfix:after {
+ display: table;
+ line-height: 0;
+ content: "";
+}
+
+.clearfix:after {
+ clear: both;
+}
+
+.hide-text {
+ font: 0/0 a;
+ color: transparent;
+ text-shadow: none;
+ background-color: transparent;
+ border: 0;
+}
+
+.input-block-level {
+ display: block;
+ width: 100%;
+ min-height: 30px;
+ -webkit-box-sizing: border-box;
+ -moz-box-sizing: border-box;
+ box-sizing: border-box;
+}
+
+.container-semifluid {
+ max-width: 940px;
+ padding-right: 20px;
+ padding-left: 20px;
+ margin-right: auto;
+ margin-left: auto;
+ *zoom: 1;
+}
+
+.container-semifluid:before,
+.container-semifluid:after {
+ display: table;
+ line-height: 0;
+ content: "";
+}
+
+.container-semifluid:after {
+ clear: both;
+}
+
+form > *:last-child {
+ margin-bottom: 0;
+}
+
+label input[type="image"],
+label input[type="checkbox"],
+label input[type="radio"] {
+ vertical-align: middle;
+}
+
+.small-labels .control-group > label {
+ width: 70px;
+}
+
+.small-labels .controls {
+ margin-left: 80px;
+}
+
+.small-labels .form-actions {
+ padding-left: 80px;
+}
+
+.form-vertical .form-horizontal .control-group > label {
+ text-align: left;
+}
+
+.form-horizontal .form-vertical .control-group > label {
+ float: none;
+ padding-top: 0;
+ text-align: left;
+}
+
+.form-horizontal .form-vertical .controls {
+ margin-left: 0;
+}
+
+.form-horizontal .form-vertical.form-actions,
+.form-horizontal .form-vertical .form-actions {
+ padding-left: 20px;
+}
+
+.control-group .control-group {
+ margin-bottom: 0;
+}
+
+.form-horizontal .well .control-label {
+ width: 120px;
+}
+
+.form-horizontal .well .controls {
+ margin-left: 140px;
+}
+
+form .well > *:last-child {
+ margin-bottom: 0;
+}
+
+.uneditable-input,
+.uneditable-textarea {
+ display: inline-block;
+ padding: 4px 3px 4px 5px;
+ font-size: 14px;
+ line-height: 20px;
+ color: #555555;
+ cursor: not-allowed;
+ background-color: #ffffff;
+ border: 1px solid #eee;
+ -webkit-border-radius: 3px;
+ -moz-border-radius: 3px;
+ border-radius: 3px;
+ -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025);
+ -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+ -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025);
+ -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+ box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+ box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025);
+}
+
+.uneditable-input {
+ height: 20px;
+ overflow: hidden;
+ white-space: pre;
+}
+
+.uneditable-textarea {
+ overflow-x: hidden;
+ overflow-y: auto;
+ white-space: pre-wrap;
+}
+
+select[disabled],
+textarea[disabled],
+input[type="text"][disabled],
+input[type="password"][disabled],
+input[type="datetime"][disabled],
+input[type="datetime-local"][disabled],
+input[type="date"][disabled],
+input[type="month"][disabled],
+input[type="time"][disabled],
+input[type="week"][disabled],
+input[type="number"][disabled],
+input[type="email"][disabled],
+input[type="url"][disabled],
+input[type="search"][disabled] {
+ color: #999;
+}
+
+.uneditable-input.disabled,
+.uneditable-textarea.disabled {
+ color: #999;
+ cursor: not-allowed;
+ background-color: #f5f5f5;
+ border-color: #ddd;
+}
+
+textarea,
+.uneditable-textarea {
+ height: 60px;
+}
+
+textarea[rows="1"],
+.uneditable-textarea[rows="1"] {
+ height: 40px;
+}
+
+textarea[rows="2"],
+.uneditable-textarea[rows="2"] {
+ height: 60px;
+}
+
+textarea[rows="3"],
+.uneditable-textarea[rows="3"] {
+ height: 80px;
+}
+
+textarea[rows="4"],
+.uneditable-textarea[rows="4"] {
+ height: 100px;
+}
+
+textarea[rows="5"],
+.uneditable-textarea[rows="5"] {
+ height: 120px;
+}
+
+textarea[rows="6"],
+.uneditable-textarea[rows="6"] {
+ height: 140px;
+}
+
+textarea[rows="7"],
+.uneditable-textarea[rows="7"] {
+ height: 160px;
+}
+
+textarea[rows="8"],
+.uneditable-textarea[rows="8"] {
+ height: 180px;
+}
+
+textarea[rows="9"],
+.uneditable-textarea[rows="9"] {
+ height: 200px;
+}
+
+textarea[rows="10"],
+.uneditable-textarea[rows="10"] {
+ height: 220px;
+}
+
+textarea[rows="11"],
+.uneditable-textarea[rows="11"] {
+ height: 240px;
+}
+
+textarea[rows="12"],
+.uneditable-textarea[rows="12"] {
+ height: 260px;
+}
+
+textarea[rows="13"],
+.uneditable-textarea[rows="13"] {
+ height: 280px;
+}
+
+textarea[rows="14"],
+.uneditable-textarea[rows="14"] {
+ height: 300px;
+}
+
+textarea[rows="15"],
+.uneditable-textarea[rows="15"] {
+ height: 320px;
+}
+
+textarea[rows="16"],
+.uneditable-textarea[rows="16"] {
+ height: 340px;
+}
+
+textarea[rows="17"],
+.uneditable-textarea[rows="17"] {
+ height: 360px;
+}
+
+textarea[rows="18"],
+.uneditable-textarea[rows="18"] {
+ height: 380px;
+}
+
+textarea[rows="19"],
+.uneditable-textarea[rows="19"] {
+ height: 400px;
+}
+
+textarea[rows="20"],
+.uneditable-textarea[rows="20"] {
+ height: 420px;
+}
+
+textarea[rows="21"],
+.uneditable-textarea[rows="21"] {
+ height: 440px;
+}
+
+textarea[rows="22"],
+.uneditable-textarea[rows="22"] {
+ height: 460px;
+}
+
+textarea[rows="23"],
+.uneditable-textarea[rows="23"] {
+ height: 480px;
+}
+
+textarea[rows="24"],
+.uneditable-textarea[rows="24"] {
+ height: 500px;
+}
+
+textarea[rows="25"],
+.uneditable-textarea[rows="25"] {
+ height: 520px;
+}
+
+textarea[rows="26"],
+.uneditable-textarea[rows="26"] {
+ height: 540px;
+}
+
+textarea[rows="27"],
+.uneditable-textarea[rows="27"] {
+ height: 560px;
+}
+
+textarea[rows="28"],
+.uneditable-textarea[rows="28"] {
+ height: 580px;
+}
+
+textarea[rows="29"],
+.uneditable-textarea[rows="29"] {
+ height: 600px;
+}
+
+textarea[rows="30"],
+.uneditable-textarea[rows="30"] {
+ height: 620px;
+}
+
+textarea[rows="35"],
+.uneditable-textarea[rows="35"] {
+ height: 720px;
+}
+
+textarea[rows="40"],
+.uneditable-textarea[rows="40"] {
+ height: 820px;
+}
+
+textarea[rows="45"],
+.uneditable-textarea[rows="45"] {
+ height: 920px;
+}
+
+textarea[rows="50"],
+.uneditable-textarea[rows="50"] {
+ height: 1020px;
+}
+
+textarea[rows="55"],
+.uneditable-textarea[rows="55"] {
+ height: 1120px;
+}
+
+textarea[rows="60"],
+.uneditable-textarea[rows="60"] {
+ height: 1220px;
+}
+
+textarea[rows="65"],
+.uneditable-textarea[rows="65"] {
+ height: 1320px;
+}
+
+textarea[rows="70"],
+.uneditable-textarea[rows="70"] {
+ height: 1420px;
+}
+
+textarea[rows="75"],
+.uneditable-textarea[rows="75"] {
+ height: 1520px;
+}
+
+textarea[rows="80"],
+.uneditable-textarea[rows="80"] {
+ height: 1620px;
+}
+
+textarea[rows="85"],
+.uneditable-textarea[rows="85"] {
+ height: 1720px;
+}
+
+textarea[rows="90"],
+.uneditable-textarea[rows="90"] {
+ height: 1820px;
+}
+
+textarea[rows="95"],
+.uneditable-textarea[rows="95"] {
+ height: 1920px;
+}
+
+textarea[rows="100"],
+.uneditable-textarea[rows="100"] {
+ height: 2020px;
+}
+
+.uneditable-textarea {
+ -webkit-box-sizing: border-box;
+ -moz-box-sizing: border-box;
+ box-sizing: border-box;
+}
+
+.uneditable-input[class*="span"],
+.uneditable-textarea[class*="span"],
+.row-fluid .uneditable-input[class*="span"],
+.row-fluid .uneditable-textarea[class*="span"] {
+ float: none;
+ margin-left: 0;
+}
+
+.input-append .uneditable-input,
+.input-prepend .uneditable-input {
+ vertical-align: top;
+}
+
+.input-append .uneditable-input[class*="span"],
+.input-prepend .uneditable-input[class*="span"] {
+ display: inline-block;
+}
+
+.uneditable-form input[disabled],
+.uneditable-form textarea[disabled],
+.uneditable-form select[disabled] {
+ cursor: auto;
+}
+
+.uneditable-form .uneditable-input,
+.uneditable-form .uneditable-textarea {
+ cursor: text;
+}
+
+.uneditable-form .form-actions {
+ background-color: transparent;
+}
+
+.editor {
+ width: 100%;
+ height: 100px;
+ padding: 5px;
+ -webkit-box-sizing: border-box;
+ -moz-box-sizing: border-box;
+ box-sizing: border-box;
+}
+
+.uneditable-textarea.editor-html {
+ padding: 5px 3px 5px 5px;
+ white-space: normal;
+}
+
+textarea.editor-html {
+ visibility: hidden;
+}
+
+.header-actions {
+ padding: 0 20px;
+ line-height: 36px;
+}
+
+.table-actions {
+ padding-bottom: 20px;
+ *zoom: 1;
+}
+
+.table-actions:before,
+.table-actions:after {
+ display: table;
+ line-height: 0;
+ content: "";
+}
+
+.table-actions:after {
+ clear: both;
+}
+
+tr.rowlink td {
+ cursor: pointer;
+}
+
+tr.rowlink td.nolink {
+ cursor: auto;
+}
+
+.table tbody tr.rowlink:hover td {
+ background-color: #cfcfcf;
+}
+
+a.rowlink {
+ font: inherit;
+ color: inherit;
+ text-decoration: inherit;
+}
+
+.act {
+ display: inline;
+ padding: 0;
+ font-weight: bold;
+ color: #555555;
+ background: inherit;
+ border: none;
+ -webkit-transition: text-shadow 0.1s linear;
+ -moz-transition: text-shadow 0.1s linear;
+ -o-transition: text-shadow 0.1s linear;
+ transition: text-shadow 0.1s linear;
+}
+
+.act:hover {
+ color: #333333;
+ text-decoration: none;
+ text-shadow: 1px 1px 3px rgba(85, 85, 85, 0.5);
+}
+
+.act-primary {
+ color: #006dcc;
+}
+
+.act-primary:hover {
+ color: #0044cc;
+ text-shadow: 1px 1px 3px rgba(0, 109, 204, 0.5);
+}
+
+.act-info {
+ color: #49afcd;
+}
+
+.act-info:hover {
+ color: #2f96b4;
+ text-shadow: 1px 1px 3px rgba(75, 175, 206, 0.5);
+}
+
+.act-success {
+ color: #51a351;
+}
+
+.act-success:hover {
+ color: #468847;
+ text-shadow: 1px 1px 3px rgba(81, 164, 81, 0.5);
+}
+
+.act-warning {
+ color: #c09853;
+}
+
+.act-warning:hover {
+ color: #f89406;
+ text-shadow: 1px 1px 3px rgba(192, 152, 84, 0.5);
+}
+
+.act-danger {
+ color: #b94a48;
+}
+
+.act-danger:hover {
+ color: #bd362f;
+ text-shadow: 1px 1px 3px rgba(185, 72, 70, 0.5);
+}
+
+.act.disabled,
+.act[disabled] {
+ color: #AAAAAA;
+ cursor: not-allowed;
+}
+
+.act.disabled:hover,
+.act[disabled]:hover {
+ color: #AAAAAA;
+ text-shadow: none;
+}
+
+.form-actions .act {
+ line-height: 30px;
+}
+
+@font-face {
+ font-family: IconicStroke;
+ font-weight: normal;
+ src: url('../fonts/iconic_stroke.eot');
+ src: local('IconicStroke'), url('iconic_stroke.eot?#iefix') format('../fonts/embedded-opentype'), url('../fonts/iconic_stroke.woff') format('woff'), url('../fonts/iconic_stroke.ttf') format('truetype'), url('iconic_stroke.svg#iconic') format('svg'), url('../fonts/iconic_stroke.otf') format('opentype');
+}
+
+@font-face {
+ font-family: IconicFill;
+ font-weight: normal;
+ src: url('../fonts/iconic_fill.eot');
+ src: local('IconicFill'), url('../fonts/iconic_fill.eot?#iefix') format('embedded-opentype'), url('../fonts/iconic_fill.woff') format('woff'), url('../fonts/iconic_fill.ttf') format('truetype'), url('iconic_fill.svg#iconic') format('svg'), url('../fonts/iconic_fill.otf') format('opentype');
+}
+
+@media screen, print {
+ [class*="iconic-"] {
+ font-style: inherit;
+ font-weight: normal;
+ vertical-align: bottom;
+ }
+ [class*="iconic-"]:before {
+ display: inline-block;
+ width: 1em;
+ font-family: IconicFill;
+ font-size: 0.9em;
+ text-align: center;
+ vertical-align: middle;
+ content: "";
+ }
+ .iconic-stroke:before {
+ font-family: IconicStroke;
+ }
+ .iconic-hash:before {
+ content: '\23';
+ }
+ .iconic-question-mark:before {
+ content: '\3f';
+ }
+ .iconic-at:before {
+ content: '\40';
+ }
+ .iconic-pilcrow:before {
+ content: '\b6';
+ }
+ .iconic-info:before {
+ content: '\2139';
+ }
+ .iconic-arrow-left:before {
+ content: '\2190';
+ }
+ .iconic-arrow-up:before {
+ content: '\2191';
+ }
+ .iconic-arrow-right:before {
+ content: '\2192';
+ }
+ .iconic-arrow-down:before {
+ content: '\2193';
+ }
+ .iconic-home:before {
+ content: '\2302';
+ }
+ .iconic-sun:before {
+ content: '\2600';
+ }
+ .iconic-cloud:before {
+ content: '\2601';
+ }
+ .iconic-umbrella:before {
+ content: '\2602';
+ }
+ .iconic-star:before {
+ content: '\2605';
+ }
+ .iconic-moon:before {
+ content: '\263e';
+ }
+ .iconic-heart:before {
+ content: '\2764';
+ }
+ .iconic-cog:before {
+ content: '\2699';
+ }
+ .iconic-bolt:before {
+ content: '\26a1';
+ }
+ .iconic-key:before {
+ content: '\26bf';
+ }
+ .iconic-rain:before {
+ content: '\26c6';
+ }
+ .iconic-denied:before {
+ content: '\26d4';
+ }
+ .iconic-mail:before {
+ content: '\2709';
+ }
+ .iconic-pen:before {
+ content: '\270e';
+ }
+ .iconic-x:before {
+ content: '\2717';
+ }
+ .iconic-o-x:before {
+ content: '\2718';
+ }
+ .iconic-check:before {
+ content: '\2713';
+ }
+ .iconic-o-check:before {
+ content: '\2714';
+ }
+ .iconic-left-quote:before {
+ content: '\275d';
+ }
+ .iconic-right-quote:before {
+ content: '\275e';
+ }
+ .iconic-plus:before {
+ content: '\2795';
+ }
+ .iconic-minus:before {
+ content: '\2796';
+ }
+ .iconic-curved-arrow:before {
+ content: '\2935';
+ }
+ .iconic-document-alt:before {
+ content: '\e000';
+ }
+ .iconic-calendar:before {
+ content: '\e001';
+ }
+ .iconic-map-pin-alt:before {
+ content: '\e002';
+ }
+ .iconic-comment-alt1:before {
+ content: '\e003';
+ }
+ .iconic-comment-alt2:before {
+ content: '\e004';
+ }
+ .iconic-pen-alt:before {
+ content: '\e005';
+ }
+ .iconic-pen-alt2:before {
+ content: '\e006';
+ }
+ .iconic-chat-alt:before {
+ content: '\e007';
+ }
+ .iconic-o-plus:before {
+ content: '\e008';
+ }
+ .iconic-o-minus:before {
+ content: '\e009';
+ }
+ .iconic-bars-alt:before {
+ content: '\e00a';
+ }
+ .iconic-book-alt:before {
+ content: '\e00b';
+ }
+ .iconic-aperture-alt:before {
+ content: '\e00c';
+ }
+ .iconic-beaker-alt:before {
+ content: '\e010';
+ }
+ .iconic-left-quote-alt:before {
+ content: '\e011';
+ }
+ .iconic-right-quote-alt:before {
+ content: '\e012';
+ }
+ .iconic-o-arrow-left:before {
+ content: '\e013';
+ }
+ .iconic-o-arrow-up:before {
+ content: '\e014';
+ }
+ .iconic-o-arrow-right:before {
+ content: '\e015';
+ }
+ .iconic-o-arrow-down:before {
+ content: '\e016';
+ }
+ .iconic-o-arrow-left-alt:before {
+ content: '\e017';
+ }
+ .iconic-o-arrow-up-alt:before {
+ content: '\e018';
+ }
+ .iconic-o-arrow-right-alt:before {
+ content: '\e019';
+ }
+ .iconic-o-arrow-down-alt:before {
+ content: '\e01a';
+ }
+ .iconic-brush:before {
+ content: '\e01b';
+ }
+ .iconic-brush-alt:before {
+ content: '\e01c';
+ }
+ .iconic-eyedropper:before {
+ content: '\e01e';
+ }
+ .iconic-layers:before {
+ content: '\e01f';
+ }
+ .iconic-layers-alt:before {
+ content: '\e020';
+ }
+ .iconic-compass:before {
+ content: '\e021';
+ }
+ .iconic-award:before {
+ content: '\e022';
+ }
+ .iconic-beaker:before {
+ content: '\e023';
+ }
+ .iconic-steering-wheel:before {
+ content: '\e024';
+ }
+ .iconic-eye:before {
+ content: '\e025';
+ }
+ .iconic-aperture:before {
+ content: '\e026';
+ }
+ .iconic-image:before {
+ content: '\e027';
+ }
+ .iconic-chart:before {
+ content: '\e028';
+ }
+ .iconic-chart-alt:before {
+ content: '\e029';
+ }
+ .iconic-target:before {
+ content: '\e02a';
+ }
+ .iconic-tag:before {
+ content: '\e02b';
+ }
+ .iconic-rss:before {
+ content: '\e02c';
+ }
+ .iconic-rss-alt:before {
+ content: '\e02d';
+ }
+ .iconic-share:before {
+ content: '\e02e';
+ }
+ .iconic-undo:before {
+ content: '\e02f';
+ }
+ .iconic-reload:before {
+ content: '\e030';
+ }
+ .iconic-reload-alt:before {
+ content: '\e031';
+ }
+ .iconic-loop:before {
+ content: '\e032';
+ }
+ .iconic-loop-alt:before {
+ content: '\e033';
+ }
+ .iconic-back-forth:before {
+ content: '\e034';
+ }
+ .iconic-back-forth-alt:before {
+ content: '\e035';
+ }
+ .iconic-spin:before {
+ content: '\e036';
+ }
+ .iconic-spin-alt:before {
+ content: '\e037';
+ }
+ .iconic-move-horizontal:before {
+ content: '\e038';
+ }
+ .iconic-move-horizontal-alt:before {
+ content: '\e039';
+ }
+ .iconic-o-move-horizontal:before {
+ content: '\e03a';
+ }
+ .iconic-move-vertical:before {
+ content: '\e03b';
+ }
+ .iconic-move-vertical-alt:before {
+ content: '\e03c';
+ }
+ .iconic-o-move-vertical:before {
+ content: '\e03d';
+ }
+ .iconic-move:before {
+ content: '\e03e';
+ }
+ .iconic-move-alt:before {
+ content: '\e03f';
+ }
+ .iconic-o-move:before {
+ content: '\e040';
+ }
+ .iconic-transfer:before {
+ content: '\e041';
+ }
+ .iconic-download:before {
+ content: '\e042';
+ }
+ .iconic-upload:before {
+ content: '\e043';
+ }
+ .iconic-cloud-download:before {
+ content: '\e044';
+ }
+ .iconic-cloud-upload:before {
+ content: '\e045';
+ }
+ .iconic-fork:before {
+ content: '\e046';
+ }
+ .iconic-play:before {
+ content: '\e047';
+ }
+ .iconic-o-play:before {
+ content: '\e048';
+ }
+ .iconic-pause:before {
+ content: '\e049';
+ }
+ .iconic-stop:before {
+ content: '\e04a';
+ }
+ .iconic-eject:before {
+ content: '\e04b';
+ }
+ .iconic-first:before {
+ content: '\e04c';
+ }
+ .iconic-last:before {
+ content: '\e04d';
+ }
+ .iconic-fullscreen:before {
+ content: '\e04e';
+ }
+ .iconic-fullscreen-alt:before {
+ content: '\e04f';
+ }
+ .iconic-fullscreen-exit:before {
+ content: '\e050';
+ }
+ .iconic-fullscreen-exit-alt:before {
+ content: '\e051';
+ }
+ .iconic-equalizer:before {
+ content: '\e052';
+ }
+ .iconic-article:before {
+ content: '\e053';
+ }
+ .iconic-read-more:before {
+ content: '\e054';
+ }
+ .iconic-list:before {
+ content: '\e055';
+ }
+ .iconic-list-nested:before {
+ content: '\e056';
+ }
+ .iconic-cursor:before {
+ content: '\e057';
+ }
+ .iconic-dial:before {
+ content: '\e058';
+ }
+ .iconic-new-window:before {
+ content: '\e059';
+ }
+ .iconic-trash:before {
+ content: '\e05a';
+ }
+ .iconic-battery-half:before {
+ content: '\e05b';
+ }
+ .iconic-battery-empty:before {
+ content: '\e05c';
+ }
+ .iconic-battery-charging:before {
+ content: '\e05d';
+ }
+ .iconic-chat:before {
+ content: '\e05e';
+ }
+ .iconic-mic:before {
+ content: '\e05f';
+ }
+ .iconic-movie:before {
+ content: '\e060';
+ }
+ .iconic-headphones:before {
+ content: '\e061';
+ }
+ .iconic-user:before {
+ content: '\e062';
+ }
+ .iconic-lightbulb:before {
+ content: '\e063';
+ }
+ .iconic-cd:before {
+ content: '\e064';
+ }
+ .iconic-folder:before {
+ content: '\e065';
+ }
+ .iconic-document:before {
+ content: '\e066';
+ }
+ .iconic-pin:before {
+ content: '\e067';
+ }
+ .iconic-map-pin:before {
+ content: '\e068';
+ }
+ .iconic-book:before {
+ content: '\e069';
+ }
+ .iconic-book-alt2:before {
+ content: '\e06a';
+ }
+ .iconic-box:before {
+ content: '\e06b';
+ }
+ .iconic-calendar-alt:before {
+ content: '\e06c';
+ }
+ .iconic-comment:before {
+ content: '\e06d';
+ }
+ .iconic-iphone:before {
+ content: '\e06e';
+ }
+ .iconic-bars:before {
+ content: '\e06f';
+ }
+ .iconic-camera:before {
+ content: '\e070';
+ }
+ .iconic-volume-mute:before {
+ content: '\e071';
+ }
+ .iconic-volume:before {
+ content: '\e072';
+ }
+ .iconic-battery-full:before {
+ content: '\e073';
+ }
+ .iconic-magnifying-glass:before {
+ content: '\e074';
+ }
+ .iconic-lock:before {
+ content: '\e075';
+ }
+ .iconic-unlock:before {
+ content: '\e076';
+ }
+ .iconic-link:before {
+ content: '\e077';
+ }
+ .iconic-wrench:before {
+ content: '\e078';
+ }
+ .iconic-clock:before {
+ content: '\e079';
+ }
+ .iconic-sun-stroke:before {
+ font-family: IconicStroke;
+ content: '\2600';
+ }
+ .iconic-moon-stroke:before {
+ font-family: IconicStroke;
+ content: '\263e';
+ }
+ .iconic-star-stroke:before {
+ font-family: IconicStroke;
+ content: '\2605';
+ }
+ .iconic-heart-stroke:before {
+ font-family: IconicStroke;
+ content: '\2764';
+ }
+ .iconic-key-stroke:before {
+ font-family: IconicStroke;
+ content: '\26bf';
+ }
+ .iconic-document-alt-stroke:before {
+ font-family: IconicStroke;
+ content: '\e000';
+ }
+ .iconic-comment-alt1-stroke:before {
+ font-family: IconicStroke;
+ content: '\e003';
+ }
+ .iconic-comment-alt2-stroke:before {
+ font-family: IconicStroke;
+ content: '\e004';
+ }
+ .iconic-pen-alt-stroke:before {
+ font-family: IconicStroke;
+ content: '\e005';
+ }
+ .iconic-chat-alt-stroke:before {
+ font-family: IconicStroke;
+ content: '\e007';
+ }
+ .iconic-award-stroke:before {
+ font-family: IconicStroke;
+ content: '\e022';
+ }
+ .iconic-tag-stroke:before {
+ font-family: IconicStroke;
+ content: '\e02b';
+ }
+ .iconic-trash-stroke:before {
+ font-family: IconicStroke;
+ content: '\e05a';
+ }
+ .iconic-folder-stroke:before {
+ font-family: IconicStroke;
+ content: '\e065';
+ }
+ .iconic-document-stroke:before {
+ font-family: IconicStroke;
+ content: '\e066';
+ }
+ .iconic-map-pin-stroke:before {
+ font-family: IconicStroke;
+ content: '\e068';
+ }
+ .iconic-calendar-alt-stroke:before {
+ font-family: IconicStroke;
+ content: '\e06c';
+ }
+ .iconic-comment-stroke:before {
+ font-family: IconicStroke;
+ content: '\e06d';
+ }
+ .iconic-lock-stroke:before {
+ font-family: IconicStroke;
+ content: '\e075';
+ }
+ .iconic-unlock-stroke:before {
+ font-family: IconicStroke;
+ content: '\e076';
+ }
+}
+
+.page-alert {
+ position: absolute;
+ top: 0;
+ left: 50%;
+ z-index: 1020;
+ width: 0;
+}
+
+.page-alert .alert {
+ width: 550px;
+ margin-left: -300px;
+ border-top-width: 0;
+ -webkit-border-radius: 0 0 4px 4px;
+ -moz-border-radius: 0 0 4px 4px;
+ border-radius: 0 0 4px 4px;
+}
+
+.navbar-fixed-top + .page-alert {
+ top: 40px;
+}
+
+body > .page-alert {
+ position: fixed;
+}
+
+.btn-file {
+ position: relative;
+ overflow: hidden;
+ vertical-align: middle;
+}
+
+.btn-file > input {
+ position: absolute;
+ top: 0;
+ right: 0;
+ margin: 0;
+ cursor: pointer;
+ border: solid transparent;
+ border-width: 0 0 100px 200px;
+ opacity: 0;
+ filter: alpha(opacity=0);
+ -moz-transform: translate(-300px, 0) scale(4);
+ direction: ltr;
+}
+
+.fileupload {
+ margin-bottom: 9px;
+}
+
+.fileupload .uneditable-input {
+ display: inline-block;
+ margin-bottom: 0;
+ vertical-align: middle;
+ cursor: text;
+}
+
+.fileupload .thumbnail {
+ display: inline-block;
+ margin-bottom: 5px;
+ overflow: hidden;
+ text-align: center;
+ vertical-align: middle;
+}
+
+.fileupload .thumbnail > img {
+ display: inline-block;
+ max-height: 100%;
+ vertical-align: middle;
+}
+
+.fileupload .btn {
+ vertical-align: middle;
+}
+
+.fileupload-exists .fileupload-new,
+.fileupload-new .fileupload-exists {
+ display: none;
+}
+
+.fileupload-inline .fileupload-controls {
+ display: inline;
+}
+
+.fileupload-new .input-append .btn-file {
+ -webkit-border-radius: 0 3px 3px 0;
+ -moz-border-radius: 0 3px 3px 0;
+ border-radius: 0 3px 3px 0;
+}
+
+.thumbnail-borderless .thumbnail {
+ padding: 0;
+ border: none;
+ -webkit-border-radius: 0;
+ -moz-border-radius: 0;
+ border-radius: 0;
+ -webkit-box-shadow: none;
+ -moz-box-shadow: none;
+ box-shadow: none;
+}
+
+.fileupload-new.thumbnail-borderless .thumbnail {
+ border: 1px solid #ddd;
+}
+
+.nav-tabs > li > a,
+.nav-pills > li > a {
+ outline: none;
+}
+
+.nav-tabs > li.disabled > a {
+ color: #CCCCCC;
+ cursor: not-allowed;
+}
+
+.tabbable {
+ border-color: #ddd;
+ border-style: solid;
+ border-width: 0;
+ *zoom: 1;
+}
+
+.tabbable:before,
+.tabbable:after {
+ display: table;
+ line-height: 0;
+ content: "";
+}
+
+.tabbable:after {
+ clear: both;
+}
+
+.tabbable > .nav-tabs {
+ margin: 0;
+}
+
+.tab-content {
+ padding: 18px 0 0 0;
+ overflow: auto;
+ border-color: #ddd;
+ border-style: solid;
+ border-width: 0;
+}
+
+.tabbable-bordered {
+ -webkit-border-radius: 4px;
+ -moz-border-radius: 4px;
+ border-radius: 4px;
+}
+
+.tabbable-bordered > .tab-content {
+ padding: 20px 20px 10px 20px;
+ border-width: 0 1px 1px 1px;
+ -webkit-border-radius: 0 0 4px 4px;
+ -moz-border-radius: 0 0 4px 4px;
+ border-radius: 0 0 4px 4px;
+}
+
+body > .container.tabbable > .nav-tabs {
+ padding-top: 15px;
+}
+
+.tabs-below > .tab-content {
+ padding: 0 0 10px 0;
+}
+
+.tabs-below.tabbable-bordered > .tab-content {
+ padding: 20px 20px 10px 20px;
+ border-width: 1px 1px 0 1px;
+ -webkit-border-radius: 4px 4px 0 0;
+ -moz-border-radius: 4px 4px 0 0;
+ border-radius: 4px 4px 0 0;
+}
+
+body > .container.tabs-below.tabbable-bodered > .tab-content {
+ border-top-width: 0;
+ -webkit-border-radius: 0;
+ -moz-border-radius: 0;
+ border-radius: 0;
+}
+
+.tabs-left,
+.tabs-right {
+ margin-bottom: 20px;
+}
+
+.tabs-left > .nav-tabs,
+.tabs-right > .nav-tabs {
+ position: relative;
+ z-index: 1;
+ margin-bottom: 0;
+}
+
+.tabs-left > .tab-content,
+.tabs-right > .tab-content {
+ overflow: hidden;
+}
+
+.tabs-left > .nav-tabs {
+ left: 1px;
+}
+
+.tabs-left > .nav-tabs > .active > a,
+.tabs-left > .nav-tabs > .active > a:hover {
+ border-color: #ddd transparent #ddd #ddd;
+ *border-right-color: #ffffff;
+}
+
+.tabs-left > .tab-content {
+ padding: 0 0 0 19px;
+ border-left-width: 1px;
+}
+
+.tabs-left.tabbable-bordered {
+ border-width: 0 1px 0 0;
+}
+
+.tabs-left.tabbable-bordered > .tab-content {
+ padding: 20px 20px 10px 20px;
+ border-width: 1px 0 1px 1px;
+ -webkit-border-radius: 0 4px 4px 0;
+ -moz-border-radius: 0 4px 4px 0;
+ border-radius: 0 4px 4px 0;
+}
+
+body > .container.tabs-left.tabbable-bodered > .tab-content {
+ border-top-width: 0;
+ -webkit-border-radius: 0 0 4px 0;
+ -moz-border-radius: 0 0 4px 0;
+ border-radius: 0 0 4px 0;
+}
+
+.tabs-right > .nav-tabs {
+ right: 1px;
+}
+
+.tabs-right > .nav-tabs > .active > a,
+.tabs-right > .nav-tabs > .active > a:hover {
+ border-color: #ddd #ddd #ddd transparent;
+ *border-left-color: #ffffff;
+}
+
+.tabs-right > .tab-content {
+ padding: 0 19px 0 0;
+ border-right-width: 1px;
+}
+
+.tabs-right.tabbable-bordered {
+ border-width: 0 0 0 1px;
+}
+
+.tabs-right.tabbable-bordered > .tab-content {
+ padding: 20px 20px 10px 20px;
+ border-width: 1px 1px 1px 0;
+ -webkit-border-radius: 4px 0 0 4px;
+ -moz-border-radius: 4px 0 0 4px;
+ border-radius: 4px 0 0 4px;
+}
+
+body > .container.tabs-right.tabbable-bodered > .tab-content {
+ border-top-width: 0;
+ -webkit-border-radius: 0 0 0 4px;
+ -moz-border-radius: 0 0 0 4px;
+ border-radius: 0 0 0 4px;
+}
+
+.modal form {
+ margin-bottom: 0;
+}
diff --git a/docs/assets/fonts/iconic_fill.eot b/docs/assets/fonts/iconic_fill.eot
new file mode 100644
index 00000000..dc8aa7dc
Binary files /dev/null and b/docs/assets/fonts/iconic_fill.eot differ
diff --git a/docs/assets/fonts/iconic_fill.otf b/docs/assets/fonts/iconic_fill.otf
new file mode 100644
index 00000000..52da7907
Binary files /dev/null and b/docs/assets/fonts/iconic_fill.otf differ
diff --git a/docs/assets/fonts/iconic_fill.svg b/docs/assets/fonts/iconic_fill.svg
new file mode 100644
index 00000000..f228fab1
--- /dev/null
+++ b/docs/assets/fonts/iconic_fill.svg
@@ -0,0 +1,475 @@
+
+
+
diff --git a/docs/assets/fonts/iconic_fill.ttf b/docs/assets/fonts/iconic_fill.ttf
new file mode 100644
index 00000000..194a753c
Binary files /dev/null and b/docs/assets/fonts/iconic_fill.ttf differ
diff --git a/docs/assets/fonts/iconic_fill.woff b/docs/assets/fonts/iconic_fill.woff
new file mode 100644
index 00000000..833f4632
Binary files /dev/null and b/docs/assets/fonts/iconic_fill.woff differ
diff --git a/docs/assets/fonts/iconic_stroke.eot b/docs/assets/fonts/iconic_stroke.eot
new file mode 100644
index 00000000..430ae76c
Binary files /dev/null and b/docs/assets/fonts/iconic_stroke.eot differ
diff --git a/docs/assets/fonts/iconic_stroke.otf b/docs/assets/fonts/iconic_stroke.otf
new file mode 100644
index 00000000..9d611150
Binary files /dev/null and b/docs/assets/fonts/iconic_stroke.otf differ
diff --git a/docs/assets/fonts/iconic_stroke.svg b/docs/assets/fonts/iconic_stroke.svg
new file mode 100644
index 00000000..18e8c345
--- /dev/null
+++ b/docs/assets/fonts/iconic_stroke.svg
@@ -0,0 +1,492 @@
+
+
+
diff --git a/docs/assets/fonts/iconic_stroke.ttf b/docs/assets/fonts/iconic_stroke.ttf
new file mode 100644
index 00000000..f0b1878c
Binary files /dev/null and b/docs/assets/fonts/iconic_stroke.ttf differ
diff --git a/docs/assets/fonts/iconic_stroke.woff b/docs/assets/fonts/iconic_stroke.woff
new file mode 100644
index 00000000..b2649347
Binary files /dev/null and b/docs/assets/fonts/iconic_stroke.woff differ
diff --git a/docs/assets/js/bootstrap-fileupload.js b/docs/assets/js/bootstrap-fileupload.js
new file mode 100644
index 00000000..d25f9153
--- /dev/null
+++ b/docs/assets/js/bootstrap-fileupload.js
@@ -0,0 +1,137 @@
+/* ===========================================================
+ * bootstrap-fileupload.js j2
+ * http://jasny.github.com/bootstrap/javascript.html#fileupload
+ * ===========================================================
+ * Copyright 2012 Jasny BV, Netherlands.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License")
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ========================================================== */
+
+!function ($) {
+
+ "use strict"; // jshint ;_
+
+ /* INPUTMASK PUBLIC CLASS DEFINITION
+ * ================================= */
+
+ var Fileupload = function (element, options) {
+ this.$element = $(element)
+ this.type = this.$element.data('uploadtype') || (this.$element.find('.thumbnail').length > 0 ? "image" : "file")
+
+ this.$input = this.$element.find(':file')
+ if (this.$input.length === 0) return
+
+ this.name = this.$input.attr('name') || options.name
+
+ this.$hidden = this.$element.find(':hidden[name="'+this.name+'"]')
+ if (this.$hidden.length === 0) {
+ this.$hidden = $('')
+ this.$element.prepend(this.$hidden)
+ }
+
+ this.$preview = this.$element.find('.fileupload-preview')
+ var height = this.$preview.css('height')
+ if (this.$preview.css('display') != 'inline' && height != '0px' && height != 'none') this.$preview.css('line-height', height)
+
+ this.$remove = this.$element.find('[data-dismiss="fileupload"]')
+
+ this.$element.find('[data-trigger="fileupload"]').on('click.fileupload', $.proxy(this.trigger, this))
+
+ this.listen()
+ }
+
+ Fileupload.prototype = {
+
+ listen: function() {
+ this.$input.on('change.fileupload', $.proxy(this.change, this))
+ if (this.$remove) this.$remove.on('click.fileupload', $.proxy(this.clear, this))
+ },
+
+ change: function(e, invoked) {
+ var file = e.target.files !== undefined ? e.target.files[0] : (e.target.value ? { name: e.target.value.replace(/^.+\\/, '') } : null)
+ if (!file || invoked === 'clear') return
+
+ this.$hidden.val('')
+ this.$hidden.attr('name', '')
+ this.$input.attr('name', this.name)
+
+ if (this.type === "image" && this.$preview.length > 0 && (typeof file.type !== "undefined" ? file.type.match('image.*') : file.name.match('\\.(gif|png|jpe?g)$')) && typeof FileReader !== "undefined") {
+ var reader = new FileReader()
+ var preview = this.$preview
+ var element = this.$element
+
+ reader.onload = function(e) {
+ preview.html('')
+ element.addClass('fileupload-exists').removeClass('fileupload-new')
+ }
+
+ reader.readAsDataURL(file)
+ } else {
+ this.$preview.text(file.name)
+ this.$element.addClass('fileupload-exists').removeClass('fileupload-new')
+ }
+ },
+
+ clear: function(e) {
+ this.$hidden.val('')
+ this.$hidden.attr('name', this.name)
+ this.$input.attr('name', '')
+ this.$input.val('') // Doesn't work in IE, which causes issues when selecting the same file twice
+
+ this.$preview.html('')
+ this.$element.addClass('fileupload-new').removeClass('fileupload-exists')
+
+ this.$input.trigger('change', [ 'clear' ])
+
+ e.preventDefault()
+ },
+
+ trigger: function(e) {
+ this.$input.trigger('click')
+ e.preventDefault()
+ }
+ }
+
+
+ /* INPUTMASK PLUGIN DEFINITION
+ * =========================== */
+
+ $.fn.fileupload = function (options) {
+ return this.each(function () {
+ var $this = $(this)
+ , data = $this.data('fileupload')
+ if (!data) $this.data('fileupload', (data = new Fileupload(this, options)))
+ })
+ }
+
+ $.fn.fileupload.Constructor = Fileupload
+
+
+ /* INPUTMASK DATA-API
+ * ================== */
+
+ $(function () {
+ $('body').on('click.fileupload.data-api', '[data-provides="fileupload"]', function (e) {
+ var $this = $(this)
+ if ($this.data('fileupload')) return
+ $this.fileupload($this.data())
+
+ var $target = $(e.target).parents('[data-dismiss=fileupload],[data-trigger=fileupload]').first()
+ if ($target.length > 0) {
+ $target.trigger('click.fileupload')
+ e.preventDefault()
+ }
+ })
+ })
+
+}(window.jQuery)
diff --git a/docs/assets/js/bootstrap-inputmask.js b/docs/assets/js/bootstrap-inputmask.js
new file mode 100644
index 00000000..438074b6
--- /dev/null
+++ b/docs/assets/js/bootstrap-inputmask.js
@@ -0,0 +1,361 @@
+/* ===========================================================
+ * bootstrap-inputmask.js j1
+ * http://twitter.github.com/bootstrap/javascript.html#tooltips
+ * Based on Masked Input plugin by Josh Bush (digitalbush.com)
+ * ===========================================================
+ * Copyright 2012 Jasny BV, Netherlands.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License")
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ========================================================== */
+
+!function ($) {
+
+ "use strict"; // jshint ;_;
+
+ var isIphone = (window.orientation !== undefined),
+ isAndroid = navigator.userAgent.toLowerCase().indexOf("android") > -1
+
+ $.mask = {
+ //Predefined character definitions
+ definitions: {
+ '9': "[0-9]",
+ 'a': "[A-Za-z]",
+ '?': "[A-Za-z0-9]",
+ '*': "."
+ },
+ dataName:"rawMaskFn"
+ }
+
+
+ /* INPUTMASK PUBLIC CLASS DEFINITION
+ * ================================= */
+
+ var Inputmask = function (element, options) {
+ if (isAndroid) return // No support because caret positioning doesn't work on Android
+
+ this.$element = $(element)
+ this.mask = options.mask
+ this.options = $.extend({}, $.fn.inputmask.defaults, options)
+
+ this.init()
+ this.listen()
+
+ this.checkVal() //Perform initial check for existing values
+ }
+
+ Inputmask.prototype = {
+
+ init: function() {
+ var defs = $.mask.definitions
+ var len = this.mask.length
+
+ this.tests = []
+ this.partialPosition = this.mask.length
+ this.firstNonMaskPos = null
+
+ $.each(this.mask.split(""), $.proxy(function(i, c) {
+ if (c == '?') {
+ len--
+ this.partialPosition = i
+ } else if (defs[c]) {
+ this.tests.push(new RegExp(defs[c]))
+ if(this.firstNonMaskPos === null)
+ this.firstNonMaskPos = this.tests.length - 1
+ } else {
+ this.tests.push(null)
+ }
+ }, this))
+
+ this.buffer = $.map(this.mask.split(""), $.proxy(function(c, i) {
+ if (c != '?') return defs[c] ? this.options.placeholder : c
+ }, this))
+
+ this.focusText = this.$element.val()
+
+ this.$element.data($.mask.dataName, $.proxy(function() {
+ return $.map(this.buffer, function(c, i) {
+ return this.tests[i] && c != this.options.placeholder ? c : null
+ }).join('')
+ }, this))
+ },
+
+ listen: function() {
+ if (this.$element.attr("readonly")) return
+
+ var pasteEventName = ($.browser.msie ? 'paste' : 'input') + ".mask"
+
+ this.$element
+ .on("unmask", $.proxy(this.unmask, this))
+
+ .on("focus.mask", $.proxy(this.focusEvent, this))
+ .on("blur.mask", $.proxy(this.blurEvent, this))
+
+ .on("keydown.mask", $.proxy(this.keydownEvent, this))
+ .on("keypress.mask", $.proxy(this.keypressEvent, this))
+
+ .on(pasteEventName, $.proxy(this.pasteEvent, this))
+ },
+
+ //Helper Function for Caret positioning
+ caret: function(begin, end) {
+ if (this.$element.length === 0) return
+ if (typeof begin == 'number') {
+ end = (typeof end == 'number') ? end : begin
+ return this.$element.each(function() {
+ if (this.setSelectionRange) {
+ this.setSelectionRange(begin, end)
+ } else if (this.createTextRange) {
+ var range = this.createTextRange()
+ range.collapse(true)
+ range.moveEnd('character', end)
+ range.moveStart('character', begin)
+ range.select()
+ }
+ })
+ } else {
+ if (this.$element[0].setSelectionRange) {
+ begin = this.$element[0].selectionStart
+ end = this.$element[0].selectionEnd
+ } else if (document.selection && document.selection.createRange) {
+ var range = document.selection.createRange()
+ begin = 0 - range.duplicate().moveStart('character', -100000)
+ end = begin + range.text.length
+ }
+ return {
+ begin: begin,
+ end: end
+ }
+ }
+ },
+
+ seekNext: function(pos) {
+ var len = this.mask.length
+ while (++pos <= len && !this.tests[pos]);
+
+ return pos
+ },
+
+ seekPrev: function(pos) {
+ while (--pos >= 0 && !this.tests[pos]);
+
+ return pos
+ },
+
+ shiftL: function(begin,end) {
+ var len = this.mask.length
+
+ if(begin<0) return
+
+ for (var i = begin,j = this.seekNext(end); i < len; i++) {
+ if (this.tests[i]) {
+ if (j < len && this.tests[i].test(this.buffer[j])) {
+ this.buffer[i] = this.buffer[j]
+ this.buffer[j] = this.options.placeholder
+ } else
+ break
+ j = this.seekNext(j)
+ }
+ }
+ this.writeBuffer()
+ this.caret(Math.max(this.firstNonMaskPos, begin))
+ },
+
+ shiftR: function(pos) {
+ var len = this.mask.length
+
+ for (var i = pos, c = this.options.placeholder; i < len; i++) {
+ if (this.tests[i]) {
+ var j = this.seekNext(i)
+ var t = this.buffer[i]
+ this.buffer[i] = c
+ if (j < len && this.tests[j].test(t))
+ c = t
+ else
+ break
+ }
+ }
+ },
+
+ unmask: function() {
+ this.$element
+ .unbind(".mask")
+ .removeData("inputmask")
+ },
+
+ focusEvent: function() {
+ this.focusText = this.$element.val()
+ var len = this.mask.length
+ var pos = this.checkVal()
+ this.writeBuffer()
+
+ var that = this
+ var moveCaret = function() {
+ if (pos == len)
+ that.caret(0, pos)
+ else
+ that.caret(pos)
+ }
+
+ if ($.browser.msie)
+ moveCaret()
+ else
+ setTimeout(moveCaret, 0)
+ },
+
+ blurEvent: function() {
+ this.checkVal()
+ if (this.$element.val() != this.focusText)
+ this.$element.trigger('change')
+ },
+
+ keydownEvent: function(e) {
+ var k=e.which
+
+ //backspace, delete, and escape get special treatment
+ if (k == 8 || k == 46 || (isIphone && k == 127)) {
+ var pos = this.caret(),
+ begin = pos.begin,
+ end = pos.end
+
+ if (end-begin === 0) {
+ begin = k!=46 ? this.seekPrev(begin) : (end=this.seekNext(begin-1))
+ end = k==46 ? this.seekNext(end) : end
+ }
+ this.clearBuffer(begin, end)
+ this.shiftL(begin,end-1)
+
+ return false
+ } else if (k == 27) {//escape
+ this.$element.val(this.focusText)
+ this.caret(0, this.checkVal())
+ return false
+ }
+ },
+
+ keypressEvent: function(e) {
+ var len = this.mask.length
+
+ var k = e.which,
+ pos = this.caret()
+
+ if (e.ctrlKey || e.altKey || e.metaKey || k<32) {//Ignore
+ return true
+ } else if (k) {
+ if (pos.end - pos.begin !== 0) {
+ this.clearBuffer(pos.begin, pos.end)
+ this.shiftL(pos.begin, pos.end-1)
+ }
+
+ var p = this.seekNext(pos.begin - 1)
+ if (p < len) {
+ var c = String.fromCharCode(k)
+ if (this.tests[p].test(c)) {
+ this.shiftR(p)
+ this.buffer[p] = c
+ this.writeBuffer()
+ var next = this.seekNext(p)
+ this.caret(next)
+ }
+ }
+ return false
+ }
+ },
+
+ pasteEvent: function() {
+ var that = this
+
+ setTimeout(function() {
+ that.caret(that.checkVal(true))
+ }, 0)
+ },
+
+ clearBuffer: function(start, end) {
+ var len = this.mask.length
+
+ for (var i = start; i < end && i < len; i++) {
+ if (this.tests[i])
+ this.buffer[i] = this.options.placeholder
+ }
+ },
+
+ writeBuffer: function() {
+ return this.$element.val(this.buffer.join('')).val()
+ },
+
+ checkVal: function(allow) {
+ var len = this.mask.length
+ //try to place characters where they belong
+ var test = this.$element.val()
+ var lastMatch = -1
+
+ for (var i = 0, pos = 0; i < len; i++) {
+ if (this.tests[i]) {
+ this.buffer[i] = this.options.placeholder
+ while (pos++ < test.length) {
+ var c = test.charAt(pos - 1)
+ if (this.tests[i].test(c)) {
+ this.buffer[i] = c
+ lastMatch = i
+ break
+ }
+ }
+ if (pos > test.length)
+ break
+ } else if (this.buffer[i] == test.charAt(pos) && i != this.partialPosition) {
+ pos++
+ lastMatch = i
+ }
+ }
+ if (!allow && lastMatch + 1 < this.partialPosition) {
+ this.$element.val("")
+ this.clearBuffer(0, len)
+ } else if (allow || lastMatch + 1 >= this.partialPosition) {
+ this.writeBuffer()
+ if (!allow) this.$element.val(this.$element.val().substring(0, lastMatch + 1))
+ }
+ return (this.partialPosition ? i : this.firstNonMaskPos)
+ }
+ }
+
+
+ /* INPUTMASK PLUGIN DEFINITION
+ * =========================== */
+
+ $.fn.inputmask = function (options) {
+ return this.each(function () {
+ var $this = $(this)
+ , data = $this.data('inputmask')
+ if (!data) $this.data('inputmask', (data = new Inputmask(this, options)))
+ })
+ }
+
+ $.fn.inputmask.defaults = {
+ placeholder: "_"
+ }
+
+ $.fn.inputmask.Constructor = Inputmask
+
+
+ /* INPUTMASK DATA-API
+ * ================== */
+
+ $(function () {
+ $('body').on('focus.inputmask.data-api', '[data-mask]', function (e) {
+ var $this = $(this)
+ if ($this.data('inputmask')) return
+ e.preventDefault()
+ $this.inputmask($this.data())
+ })
+ })
+
+}(window.jQuery)
\ No newline at end of file
diff --git a/docs/assets/js/bootstrap-rowlink.js b/docs/assets/js/bootstrap-rowlink.js
new file mode 100644
index 00000000..3b964fd2
--- /dev/null
+++ b/docs/assets/js/bootstrap-rowlink.js
@@ -0,0 +1,71 @@
+/* ============================================================
+ * bootstrap-rowlink.js j1
+ * http://jasny.github.com/bootstrap/javascript.html#rowlink
+ * ============================================================
+ * Copyright 2012 Jasny BV, Netherlands.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============================================================ */
+
+!function ($) {
+
+ "use strict"; // jshint ;_;
+
+ var Rowlink = function (element, options) {
+ options = $.extend({}, $.fn.rowlink.defaults, options)
+ var tr = element.nodeName == 'tr' ? $(element) : $(element).find('tr:has(td)')
+
+ tr.each(function() {
+ var link = $(this).find(options.target).first()
+ if (!link.length) return
+
+ var href = link.attr('href')
+
+ $(this).find('td').not('.nolink').click(function() {
+ window.location = href;
+ })
+
+ $(this).addClass('rowlink')
+ link.replaceWith(link.html())
+ })
+ }
+
+
+ /* ROWLINK PLUGIN DEFINITION
+ * =========================== */
+
+ $.fn.rowlink = function (options) {
+ return this.each(function () {
+ var $this = $(this)
+ , data = $this.data('rowlink')
+ if (!data) $this.data('rowlink', (data = new Rowlink(this, options)))
+ })
+ }
+
+ $.fn.rowlink.defaults = {
+ target: "a"
+ }
+
+ $.fn.rowlink.Constructor = Rowlink
+
+
+ /* ROWLINK DATA-API
+ * ================== */
+
+ $(function () {
+ $('[data-provides="rowlink"]').each(function () {
+ $(this).rowlink($(this).data())
+ })
+ })
+
+}(window.jQuery)
diff --git a/docs/assets/js/bootstrap.js b/docs/assets/js/bootstrap.js
index 7f303eb8..1b5139fc 100644
--- a/docs/assets/js/bootstrap.js
+++ b/docs/assets/js/bootstrap.js
@@ -1921,6 +1921,574 @@
})
}(window.jQuery);
+/* ===========================================================
+ * bootstrap-inputmask.js j1
+ * http://twitter.github.com/bootstrap/javascript.html#tooltips
+ * Based on Masked Input plugin by Josh Bush (digitalbush.com)
+ * ===========================================================
+ * Copyright 2012 Jasny BV, Netherlands.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License")
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ========================================================== */
+
+!function ($) {
+
+ "use strict"; // jshint ;_;
+
+ var isIphone = (window.orientation !== undefined),
+ isAndroid = navigator.userAgent.toLowerCase().indexOf("android") > -1
+
+ $.mask = {
+ //Predefined character definitions
+ definitions: {
+ '9': "[0-9]",
+ 'a': "[A-Za-z]",
+ '?': "[A-Za-z0-9]",
+ '*': "."
+ },
+ dataName:"rawMaskFn"
+ }
+
+
+ /* INPUTMASK PUBLIC CLASS DEFINITION
+ * ================================= */
+
+ var Inputmask = function (element, options) {
+ if (isAndroid) return // No support because caret positioning doesn't work on Android
+
+ this.$element = $(element)
+ this.mask = options.mask
+ this.options = $.extend({}, $.fn.inputmask.defaults, options)
+
+ this.init()
+ this.listen()
+
+ this.checkVal() //Perform initial check for existing values
+ }
+
+ Inputmask.prototype = {
+
+ init: function() {
+ var defs = $.mask.definitions
+ var len = this.mask.length
+
+ this.tests = []
+ this.partialPosition = this.mask.length
+ this.firstNonMaskPos = null
+
+ $.each(this.mask.split(""), $.proxy(function(i, c) {
+ if (c == '?') {
+ len--
+ this.partialPosition = i
+ } else if (defs[c]) {
+ this.tests.push(new RegExp(defs[c]))
+ if(this.firstNonMaskPos === null)
+ this.firstNonMaskPos = this.tests.length - 1
+ } else {
+ this.tests.push(null)
+ }
+ }, this))
+
+ this.buffer = $.map(this.mask.split(""), $.proxy(function(c, i) {
+ if (c != '?') return defs[c] ? this.options.placeholder : c
+ }, this))
+
+ this.focusText = this.$element.val()
+
+ this.$element.data($.mask.dataName, $.proxy(function() {
+ return $.map(this.buffer, function(c, i) {
+ return this.tests[i] && c != this.options.placeholder ? c : null
+ }).join('')
+ }, this))
+ },
+
+ listen: function() {
+ if (this.$element.attr("readonly")) return
+
+ var pasteEventName = ($.browser.msie ? 'paste' : 'input') + ".mask"
+
+ this.$element
+ .on("unmask", $.proxy(this.unmask, this))
+
+ .on("focus.mask", $.proxy(this.focusEvent, this))
+ .on("blur.mask", $.proxy(this.blurEvent, this))
+
+ .on("keydown.mask", $.proxy(this.keydownEvent, this))
+ .on("keypress.mask", $.proxy(this.keypressEvent, this))
+
+ .on(pasteEventName, $.proxy(this.pasteEvent, this))
+ },
+
+ //Helper Function for Caret positioning
+ caret: function(begin, end) {
+ if (this.$element.length === 0) return
+ if (typeof begin == 'number') {
+ end = (typeof end == 'number') ? end : begin
+ return this.$element.each(function() {
+ if (this.setSelectionRange) {
+ this.setSelectionRange(begin, end)
+ } else if (this.createTextRange) {
+ var range = this.createTextRange()
+ range.collapse(true)
+ range.moveEnd('character', end)
+ range.moveStart('character', begin)
+ range.select()
+ }
+ })
+ } else {
+ if (this.$element[0].setSelectionRange) {
+ begin = this.$element[0].selectionStart
+ end = this.$element[0].selectionEnd
+ } else if (document.selection && document.selection.createRange) {
+ var range = document.selection.createRange()
+ begin = 0 - range.duplicate().moveStart('character', -100000)
+ end = begin + range.text.length
+ }
+ return {
+ begin: begin,
+ end: end
+ }
+ }
+ },
+
+ seekNext: function(pos) {
+ var len = this.mask.length
+ while (++pos <= len && !this.tests[pos]);
+
+ return pos
+ },
+
+ seekPrev: function(pos) {
+ while (--pos >= 0 && !this.tests[pos]);
+
+ return pos
+ },
+
+ shiftL: function(begin,end) {
+ var len = this.mask.length
+
+ if(begin<0) return
+
+ for (var i = begin,j = this.seekNext(end); i < len; i++) {
+ if (this.tests[i]) {
+ if (j < len && this.tests[i].test(this.buffer[j])) {
+ this.buffer[i] = this.buffer[j]
+ this.buffer[j] = this.options.placeholder
+ } else
+ break
+ j = this.seekNext(j)
+ }
+ }
+ this.writeBuffer()
+ this.caret(Math.max(this.firstNonMaskPos, begin))
+ },
+
+ shiftR: function(pos) {
+ var len = this.mask.length
+
+ for (var i = pos, c = this.options.placeholder; i < len; i++) {
+ if (this.tests[i]) {
+ var j = this.seekNext(i)
+ var t = this.buffer[i]
+ this.buffer[i] = c
+ if (j < len && this.tests[j].test(t))
+ c = t
+ else
+ break
+ }
+ }
+ },
+
+ unmask: function() {
+ this.$element
+ .unbind(".mask")
+ .removeData("inputmask")
+ },
+
+ focusEvent: function() {
+ this.focusText = this.$element.val()
+ var len = this.mask.length
+ var pos = this.checkVal()
+ this.writeBuffer()
+
+ var that = this
+ var moveCaret = function() {
+ if (pos == len)
+ that.caret(0, pos)
+ else
+ that.caret(pos)
+ }
+
+ if ($.browser.msie)
+ moveCaret()
+ else
+ setTimeout(moveCaret, 0)
+ },
+
+ blurEvent: function() {
+ this.checkVal()
+ if (this.$element.val() != this.focusText)
+ this.$element.trigger('change')
+ },
+
+ keydownEvent: function(e) {
+ var k=e.which
+
+ //backspace, delete, and escape get special treatment
+ if (k == 8 || k == 46 || (isIphone && k == 127)) {
+ var pos = this.caret(),
+ begin = pos.begin,
+ end = pos.end
+
+ if (end-begin === 0) {
+ begin = k!=46 ? this.seekPrev(begin) : (end=this.seekNext(begin-1))
+ end = k==46 ? this.seekNext(end) : end
+ }
+ this.clearBuffer(begin, end)
+ this.shiftL(begin,end-1)
+
+ return false
+ } else if (k == 27) {//escape
+ this.$element.val(this.focusText)
+ this.caret(0, this.checkVal())
+ return false
+ }
+ },
+
+ keypressEvent: function(e) {
+ var len = this.mask.length
+
+ var k = e.which,
+ pos = this.caret()
+
+ if (e.ctrlKey || e.altKey || e.metaKey || k<32) {//Ignore
+ return true
+ } else if (k) {
+ if (pos.end - pos.begin !== 0) {
+ this.clearBuffer(pos.begin, pos.end)
+ this.shiftL(pos.begin, pos.end-1)
+ }
+
+ var p = this.seekNext(pos.begin - 1)
+ if (p < len) {
+ var c = String.fromCharCode(k)
+ if (this.tests[p].test(c)) {
+ this.shiftR(p)
+ this.buffer[p] = c
+ this.writeBuffer()
+ var next = this.seekNext(p)
+ this.caret(next)
+ }
+ }
+ return false
+ }
+ },
+
+ pasteEvent: function() {
+ var that = this
+
+ setTimeout(function() {
+ that.caret(that.checkVal(true))
+ }, 0)
+ },
+
+ clearBuffer: function(start, end) {
+ var len = this.mask.length
+
+ for (var i = start; i < end && i < len; i++) {
+ if (this.tests[i])
+ this.buffer[i] = this.options.placeholder
+ }
+ },
+
+ writeBuffer: function() {
+ return this.$element.val(this.buffer.join('')).val()
+ },
+
+ checkVal: function(allow) {
+ var len = this.mask.length
+ //try to place characters where they belong
+ var test = this.$element.val()
+ var lastMatch = -1
+
+ for (var i = 0, pos = 0; i < len; i++) {
+ if (this.tests[i]) {
+ this.buffer[i] = this.options.placeholder
+ while (pos++ < test.length) {
+ var c = test.charAt(pos - 1)
+ if (this.tests[i].test(c)) {
+ this.buffer[i] = c
+ lastMatch = i
+ break
+ }
+ }
+ if (pos > test.length)
+ break
+ } else if (this.buffer[i] == test.charAt(pos) && i != this.partialPosition) {
+ pos++
+ lastMatch = i
+ }
+ }
+ if (!allow && lastMatch + 1 < this.partialPosition) {
+ this.$element.val("")
+ this.clearBuffer(0, len)
+ } else if (allow || lastMatch + 1 >= this.partialPosition) {
+ this.writeBuffer()
+ if (!allow) this.$element.val(this.$element.val().substring(0, lastMatch + 1))
+ }
+ return (this.partialPosition ? i : this.firstNonMaskPos)
+ }
+ }
+
+
+ /* INPUTMASK PLUGIN DEFINITION
+ * =========================== */
+
+ $.fn.inputmask = function (options) {
+ return this.each(function () {
+ var $this = $(this)
+ , data = $this.data('inputmask')
+ if (!data) $this.data('inputmask', (data = new Inputmask(this, options)))
+ })
+ }
+
+ $.fn.inputmask.defaults = {
+ placeholder: "_"
+ }
+
+ $.fn.inputmask.Constructor = Inputmask
+
+
+ /* INPUTMASK DATA-API
+ * ================== */
+
+ $(function () {
+ $('body').on('focus.inputmask.data-api', '[data-mask]', function (e) {
+ var $this = $(this)
+ if ($this.data('inputmask')) return
+ e.preventDefault()
+ $this.inputmask($this.data())
+ })
+ })
+
+}(window.jQuery)/* ============================================================
+ * bootstrap-rowlink.js j1
+ * http://jasny.github.com/bootstrap/javascript.html#rowlink
+ * ============================================================
+ * Copyright 2012 Jasny BV, Netherlands.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============================================================ */
+
+!function ($) {
+
+ "use strict"; // jshint ;_;
+
+ var Rowlink = function (element, options) {
+ options = $.extend({}, $.fn.rowlink.defaults, options)
+ var tr = element.nodeName == 'tr' ? $(element) : $(element).find('tr:has(td)')
+
+ tr.each(function() {
+ var link = $(this).find(options.target).first()
+ if (!link.length) return
+
+ var href = link.attr('href')
+
+ $(this).find('td').not('.nolink').click(function() {
+ window.location = href;
+ })
+
+ $(this).addClass('rowlink')
+ link.replaceWith(link.html())
+ })
+ }
+
+
+ /* ROWLINK PLUGIN DEFINITION
+ * =========================== */
+
+ $.fn.rowlink = function (options) {
+ return this.each(function () {
+ var $this = $(this)
+ , data = $this.data('rowlink')
+ if (!data) $this.data('rowlink', (data = new Rowlink(this, options)))
+ })
+ }
+
+ $.fn.rowlink.defaults = {
+ target: "a"
+ }
+
+ $.fn.rowlink.Constructor = Rowlink
+
+
+ /* ROWLINK DATA-API
+ * ================== */
+
+ $(function () {
+ $('[data-provides="rowlink"]').each(function () {
+ $(this).rowlink($(this).data())
+ })
+ })
+
+}(window.jQuery)
+/* ===========================================================
+ * bootstrap-fileupload.js j2
+ * http://jasny.github.com/bootstrap/javascript.html#fileupload
+ * ===========================================================
+ * Copyright 2012 Jasny BV, Netherlands.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License")
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ========================================================== */
+
+!function ($) {
+
+ "use strict"; // jshint ;_
+
+ /* INPUTMASK PUBLIC CLASS DEFINITION
+ * ================================= */
+
+ var Fileupload = function (element, options) {
+ this.$element = $(element)
+ this.type = this.$element.data('uploadtype') || (this.$element.find('.thumbnail').length > 0 ? "image" : "file")
+
+ this.$input = this.$element.find(':file')
+ if (this.$input.length === 0) return
+
+ this.name = this.$input.attr('name') || options.name
+
+ this.$hidden = this.$element.find(':hidden[name="'+this.name+'"]')
+ if (this.$hidden.length === 0) {
+ this.$hidden = $('')
+ this.$element.prepend(this.$hidden)
+ }
+
+ this.$preview = this.$element.find('.fileupload-preview')
+ var height = this.$preview.css('height')
+ if (this.$preview.css('display') != 'inline' && height != '0px' && height != 'none') this.$preview.css('line-height', height)
+
+ this.$remove = this.$element.find('[data-dismiss="fileupload"]')
+
+ this.$element.find('[data-trigger="fileupload"]').on('click.fileupload', $.proxy(this.trigger, this))
+
+ this.listen()
+ }
+
+ Fileupload.prototype = {
+
+ listen: function() {
+ this.$input.on('change.fileupload', $.proxy(this.change, this))
+ if (this.$remove) this.$remove.on('click.fileupload', $.proxy(this.clear, this))
+ },
+
+ change: function(e, invoked) {
+ var file = e.target.files !== undefined ? e.target.files[0] : (e.target.value ? { name: e.target.value.replace(/^.+\\/, '') } : null)
+ if (!file || invoked === 'clear') return
+
+ this.$hidden.val('')
+ this.$hidden.attr('name', '')
+ this.$input.attr('name', this.name)
+
+ if (this.type === "image" && this.$preview.length > 0 && (typeof file.type !== "undefined" ? file.type.match('image.*') : file.name.match('\\.(gif|png|jpe?g)$')) && typeof FileReader !== "undefined") {
+ var reader = new FileReader()
+ var preview = this.$preview
+ var element = this.$element
+
+ reader.onload = function(e) {
+ preview.html('
')
+ element.addClass('fileupload-exists').removeClass('fileupload-new')
+ }
+
+ reader.readAsDataURL(file)
+ } else {
+ this.$preview.text(file.name)
+ this.$element.addClass('fileupload-exists').removeClass('fileupload-new')
+ }
+ },
+
+ clear: function(e) {
+ this.$hidden.val('')
+ this.$hidden.attr('name', this.name)
+ this.$input.attr('name', '')
+ this.$input.val('') // Doesn't work in IE, which causes issues when selecting the same file twice
+
+ this.$preview.html('')
+ this.$element.addClass('fileupload-new').removeClass('fileupload-exists')
+
+ this.$input.trigger('change', [ 'clear' ])
+
+ e.preventDefault()
+ },
+
+ trigger: function(e) {
+ this.$input.trigger('click')
+ e.preventDefault()
+ }
+ }
+
+
+ /* INPUTMASK PLUGIN DEFINITION
+ * =========================== */
+
+ $.fn.fileupload = function (options) {
+ return this.each(function () {
+ var $this = $(this)
+ , data = $this.data('fileupload')
+ if (!data) $this.data('fileupload', (data = new Fileupload(this, options)))
+ })
+ }
+
+ $.fn.fileupload.Constructor = Fileupload
+
+
+ /* INPUTMASK DATA-API
+ * ================== */
+
+ $(function () {
+ $('body').on('click.fileupload.data-api', '[data-provides="fileupload"]', function (e) {
+ var $this = $(this)
+ if ($this.data('fileupload')) return
+ $this.fileupload($this.data())
+
+ var $target = $(e.target).parents('[data-dismiss=fileupload],[data-trigger=fileupload]').first()
+ if ($target.length > 0) {
+ $target.trigger('click.fileupload')
+ e.preventDefault()
+ }
+ })
+ })
+
+}(window.jQuery)
/* ==========================================================
* bootstrap-affix.js v2.1.0
* http://twitter.github.com/bootstrap/javascript.html#affix
diff --git a/docs/assets/js/bootstrap.min.js b/docs/assets/js/bootstrap.min.js
index 9e4ac042..0b9fc3fc 100644
--- a/docs/assets/js/bootstrap.min.js
+++ b/docs/assets/js/bootstrap.min.js
@@ -3,4 +3,5 @@
* Copyright 2012 Twitter, Inc.
* http://www.apache.org/licenses/LICENSE-2.0.txt
*/
-!function(a){a(function(){"use strict",a.support.transition=function(){var a=function(){var a=document.createElement("bootstrap"),b={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"},c;for(c in b)if(a.style[c]!==undefined)return b[c]}();return a&&{end:a}}()})}(window.jQuery),!function(a){"use strict";var b='[data-dismiss="alert"]',c=function(c){a(c).on("click",b,this.close)};c.prototype.close=function(b){function f(){e.trigger("closed").remove()}var c=a(this),d=c.attr("data-target"),e;d||(d=c.attr("href"),d=d&&d.replace(/.*(?=#[^\s]*$)/,"")),e=a(d),b&&b.preventDefault(),e.length||(e=c.hasClass("alert")?c:c.parent()),e.trigger(b=a.Event("close"));if(b.isDefaultPrevented())return;e.removeClass("in"),a.support.transition&&e.hasClass("fade")?e.on(a.support.transition.end,f):f()},a.fn.alert=function(b){return this.each(function(){var d=a(this),e=d.data("alert");e||d.data("alert",e=new c(this)),typeof b=="string"&&e[b].call(d)})},a.fn.alert.Constructor=c,a(function(){a("body").on("click.alert.data-api",b,c.prototype.close)})}(window.jQuery),!function(a){"use strict";var b=function(b,c){this.$element=a(b),this.options=a.extend({},a.fn.button.defaults,c)};b.prototype.setState=function(a){var b="disabled",c=this.$element,d=c.data(),e=c.is("input")?"val":"html";a+="Text",d.resetText||c.data("resetText",c[e]()),c[e](d[a]||this.options[a]),setTimeout(function(){a=="loadingText"?c.addClass(b).attr(b,b):c.removeClass(b).removeAttr(b)},0)},b.prototype.toggle=function(){var a=this.$element.parent('[data-toggle="buttons-radio"]');a&&a.find(".active").removeClass("active"),this.$element.toggleClass("active")},a.fn.button=function(c){return this.each(function(){var d=a(this),e=d.data("button"),f=typeof c=="object"&&c;e||d.data("button",e=new b(this,f)),c=="toggle"?e.toggle():c&&e.setState(c)})},a.fn.button.defaults={loadingText:"loading..."},a.fn.button.Constructor=b,a(function(){a("body").on("click.button.data-api","[data-toggle^=button]",function(b){var c=a(b.target);c.hasClass("btn")||(c=c.closest(".btn")),c.button("toggle")})})}(window.jQuery),!function(a){"use strict";var b=function(b,c){this.$element=a(b),this.options=c,this.options.slide&&this.slide(this.options.slide),this.options.pause=="hover"&&this.$element.on("mouseenter",a.proxy(this.pause,this)).on("mouseleave",a.proxy(this.cycle,this))};b.prototype={cycle:function(b){return b||(this.paused=!1),this.options.interval&&!this.paused&&(this.interval=setInterval(a.proxy(this.next,this),this.options.interval)),this},to:function(b){var c=this.$element.find(".item.active"),d=c.parent().children(),e=d.index(c),f=this;if(b>d.length-1||b<0)return;return this.sliding?this.$element.one("slid",function(){f.to(b)}):e==b?this.pause().cycle():this.slide(b>e?"next":"prev",a(d[b]))},pause:function(b){return b||(this.paused=!0),this.$element.find(".next, .prev").length&&a.support.transition.end&&(this.$element.trigger(a.support.transition.end),this.cycle()),clearInterval(this.interval),this.interval=null,this},next:function(){if(this.sliding)return;return this.slide("next")},prev:function(){if(this.sliding)return;return this.slide("prev")},slide:function(b,c){var d=this.$element.find(".item.active"),e=c||d[b](),f=this.interval,g=b=="next"?"left":"right",h=b=="next"?"first":"last",i=this,j=a.Event("slide",{relatedTarget:e[0]});this.sliding=!0,f&&this.pause(),e=e.length?e:this.$element.find(".item")[h]();if(e.hasClass("active"))return;if(a.support.transition&&this.$element.hasClass("slide")){this.$element.trigger(j);if(j.isDefaultPrevented())return;e.addClass(b),e[0].offsetWidth,d.addClass(g),e.addClass(g),this.$element.one(a.support.transition.end,function(){e.removeClass([b,g].join(" ")).addClass("active"),d.removeClass(["active",g].join(" ")),i.sliding=!1,setTimeout(function(){i.$element.trigger("slid")},0)})}else{this.$element.trigger(j);if(j.isDefaultPrevented())return;d.removeClass("active"),e.addClass("active"),this.sliding=!1,this.$element.trigger("slid")}return f&&this.cycle(),this}},a.fn.carousel=function(c){return this.each(function(){var d=a(this),e=d.data("carousel"),f=a.extend({},a.fn.carousel.defaults,typeof c=="object"&&c),g=typeof c=="string"?c:f.slide;e||d.data("carousel",e=new b(this,f)),typeof c=="number"?e.to(c):g?e[g]():f.interval&&e.cycle()})},a.fn.carousel.defaults={interval:5e3,pause:"hover"},a.fn.carousel.Constructor=b,a(function(){a("body").on("click.carousel.data-api","[data-slide]",function(b){var c=a(this),d,e=a(c.attr("data-target")||(d=c.attr("href"))&&d.replace(/.*(?=#[^\s]+$)/,"")),f=!e.data("modal")&&a.extend({},e.data(),c.data());e.carousel(f),b.preventDefault()})})}(window.jQuery),!function(a){"use strict";var b=function(b,c){this.$element=a(b),this.options=a.extend({},a.fn.collapse.defaults,c),this.options.parent&&(this.$parent=a(this.options.parent)),this.options.toggle&&this.toggle()};b.prototype={constructor:b,dimension:function(){var a=this.$element.hasClass("width");return a?"width":"height"},show:function(){var b,c,d,e;if(this.transitioning)return;b=this.dimension(),c=a.camelCase(["scroll",b].join("-")),d=this.$parent&&this.$parent.find("> .accordion-group > .in");if(d&&d.length){e=d.data("collapse");if(e&&e.transitioning)return;d.collapse("hide"),e||d.data("collapse",null)}this.$element[b](0),this.transition("addClass",a.Event("show"),"shown"),a.support.transition&&this.$element[b](this.$element[0][c])},hide:function(){var b;if(this.transitioning)return;b=this.dimension(),this.reset(this.$element[b]()),this.transition("removeClass",a.Event("hide"),"hidden"),this.$element[b](0)},reset:function(a){var b=this.dimension();return this.$element.removeClass("collapse")[b](a||"auto")[0].offsetWidth,this.$element[a!==null?"addClass":"removeClass"]("collapse"),this},transition:function(b,c,d){var e=this,f=function(){c.type=="show"&&e.reset(),e.transitioning=0,e.$element.trigger(d)};this.$element.trigger(c);if(c.isDefaultPrevented())return;this.transitioning=1,this.$element[b]("in"),a.support.transition&&this.$element.hasClass("collapse")?this.$element.one(a.support.transition.end,f):f()},toggle:function(){this[this.$element.hasClass("in")?"hide":"show"]()}},a.fn.collapse=function(c){return this.each(function(){var d=a(this),e=d.data("collapse"),f=typeof c=="object"&&c;e||d.data("collapse",e=new b(this,f)),typeof c=="string"&&e[c]()})},a.fn.collapse.defaults={toggle:!0},a.fn.collapse.Constructor=b,a(function(){a("body").on("click.collapse.data-api","[data-toggle=collapse]",function(b){var c=a(this),d,e=c.attr("data-target")||b.preventDefault()||(d=c.attr("href"))&&d.replace(/.*(?=#[^\s]+$)/,""),f=a(e).data("collapse")?"toggle":c.data();c[a(e).hasClass("in")?"addClass":"removeClass"]("collapsed"),a(e).collapse(f)})})}(window.jQuery),!function(a){function d(){e(a(b)).removeClass("open")}function e(b){var c=b.attr("data-target"),d;return c||(c=b.attr("href"),c=c&&c.replace(/.*(?=#[^\s]*$)/,"")),d=a(c),d.length||(d=b.parent()),d}"use strict";var b="[data-toggle=dropdown]",c=function(b){var c=a(b).on("click.dropdown.data-api",this.toggle);a("html").on("click.dropdown.data-api",function(){c.parent().removeClass("open")})};c.prototype={constructor:c,toggle:function(b){var c=a(this),f,g;if(c.is(".disabled, :disabled"))return;return f=e(c),g=f.hasClass("open"),d(),g||(f.toggleClass("open"),c.focus()),!1},keydown:function(b){var c,d,f,g,h,i;if(!/(38|40|27)/.test(b.keyCode))return;c=a(this),b.preventDefault(),b.stopPropagation();if(c.is(".disabled, :disabled"))return;g=e(c),h=g.hasClass("open");if(!h||h&&b.keyCode==27)return c.click();d=a("[role=menu] li:not(.divider) a",g);if(!d.length)return;i=d.index(d.filter(":focus")),b.keyCode==38&&i>0&&i--,b.keyCode==40&&i
Fundamental HTML elements styled and enhanced with extensible classes.
+
@@ -91,8 +92,10 @@
If you have a lot of fields in a form, you might want to use three or four columns. However labels can start taking up to much space. Simple add .small-labels to a horizontal form (or section within a form) to solve this.
+<form class="form-horizontal small-labels"> + … +</div>
Present data in a form that's not editable without using actual form markup.
<span class="input-xlarge uneditable-input">Some value here</span> +<div class="input-xlarge uneditable-textarea" rows="3"> + Some text here + on multiple lines +</div> ++ +
Add .editor to any textarea or .uneditable-textarea to create a larger field for content editing.
Also add .editor-html, if the textarea will be replaced by e.g. CKEditor or TinyMCE.
+<textarea class="editor"> + Some text here + on multiple lines +</textarea>
Sometimes a button will pull to much attention to an action. In those cases, you can use action links instead.
+Action links can be used just like buttons, simply use .act instead.
| Action link | +Class | +Description | +
|---|---|---|
| Default | +.act |
+ Standard gray text | +
| Primary | +.act-primary |
+ Provides extra visual weight | +
| Info | +.act-info |
+ Used as an alternate to the default styles | +
| Success | +.act-success |
+ Indicates a successful or positive action | +
| Warning | +.act-warning |
+ Indicates caution should be taken with this action | +
| Danger | +.act-danger |
+ Indicates a dangerous or potentially negative action | +
+<div class="form-actions"> + <button class="btn btn-primary" type="submit">Save changes</button> + <button class="btn" type="reset">Cancel</button> + <a href="#" class="act act-danger pull-right">Delete account</a> +</div> ++ +
For disabled action links, use .disabled for links and the disabled attribute for <button> elements.
+<div class="form-actions"> + <button class="btn btn-primary" type="submit">Save changes</button> + <button class="btn" type="reset">Cancel</button> + <button class="act act-danger pull-right" disabled="disabled">Disabled action</button> +</div> ++
+<div class="tabbable tabs-right"> + <ul class="nav nav-tabs"> + ... + </ul> + <div class="tab-content"> + ... + </div> +</div> ++ +
You can place a border around the tab content by adding .tabbable-bordered to the .tabbable.
I'm in Section A.
+Howdy, I'm in Section B.
+What up girl, this is Section C.
++<div class="tabbable tabbable-bordered"> + <ul class="nav nav-tabs"> + ... + </ul> + <div class="tab-content"> + ... + </div> +</div>@@ -2015,6 +2082,26 @@ </div> +
Know those nice little alerts after you save your profile? With .page-alert the alert will be shown on top op your page.
Cras justo odio, dapibus ac facilisis in, egestas eget quam. Donec id elit non mi porta gravida at eget metus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cras justo odio, dapibus ac facilisis in, egestas eget quam. Donec id elit non mi porta gravida at eget metus. Nullam id dolor id nibh ultricies vehicula ut id elit.
++<body> + <div class="navbar"> ... </div> + <div class="page-alert"> + <div class="alert"> + ... + </div> + </div> +@@ -2289,8 +2376,10 @@ class="clearfix"
Designed and built with all the love in the world @twitter by @mdo and @fat.
+Extended with pride by @ArnoldDaniels of Jasny Software solutions.
Code licensed under the Apache License v2.0. Documentation licensed under CC BY 3.0.
Icons from Glyphicons Free, licensed under CC BY 3.0.
+Iconic icon set font, licensed under the SIL Open Font License.