diff --git a/docs/assets/css/bootstrap-responsive.css b/docs/assets/css/bootstrap-responsive.css
index 06e55c0b..3f83bdb5 100644
--- a/docs/assets/css/bootstrap-responsive.css
+++ b/docs/assets/css/bootstrap-responsive.css
@@ -813,3 +813,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;
+ 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: 28px;
+ -webkit-box-sizing: border-box;
+ -moz-box-sizing: border-box;
+ -ms-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 bb40c85f..e66ec446 100644
--- a/docs/assets/css/bootstrap.css
+++ b/docs/assets/css/bootstrap.css
@@ -4981,3 +4981,1414 @@ a.badge:hover {
.invisible {
visibility: hidden;
}
+/*!
+ * 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;
+ 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: 28px;
+ -webkit-box-sizing: border-box;
+ -moz-box-sizing: border-box;
+ -ms-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;
+ 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: 13px;
+ line-height: 18px;
+ 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: 18px;
+ 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: 54px;
+}
+
+textarea[rows="1"],
+.uneditable-textarea[rows="1"] {
+ height: 36px;
+}
+
+textarea[rows="2"],
+.uneditable-textarea[rows="2"] {
+ height: 54px;
+}
+
+textarea[rows="3"],
+.uneditable-textarea[rows="3"] {
+ height: 72px;
+}
+
+textarea[rows="4"],
+.uneditable-textarea[rows="4"] {
+ height: 90px;
+}
+
+textarea[rows="5"],
+.uneditable-textarea[rows="5"] {
+ height: 108px;
+}
+
+textarea[rows="6"],
+.uneditable-textarea[rows="6"] {
+ height: 126px;
+}
+
+textarea[rows="7"],
+.uneditable-textarea[rows="7"] {
+ height: 144px;
+}
+
+textarea[rows="8"],
+.uneditable-textarea[rows="8"] {
+ height: 162px;
+}
+
+textarea[rows="9"],
+.uneditable-textarea[rows="9"] {
+ height: 180px;
+}
+
+textarea[rows="10"],
+.uneditable-textarea[rows="10"] {
+ height: 198px;
+}
+
+textarea[rows="11"],
+.uneditable-textarea[rows="11"] {
+ height: 216px;
+}
+
+textarea[rows="12"],
+.uneditable-textarea[rows="12"] {
+ height: 234px;
+}
+
+textarea[rows="13"],
+.uneditable-textarea[rows="13"] {
+ height: 252px;
+}
+
+textarea[rows="14"],
+.uneditable-textarea[rows="14"] {
+ height: 270px;
+}
+
+textarea[rows="15"],
+.uneditable-textarea[rows="15"] {
+ height: 288px;
+}
+
+textarea[rows="16"],
+.uneditable-textarea[rows="16"] {
+ height: 306px;
+}
+
+textarea[rows="17"],
+.uneditable-textarea[rows="17"] {
+ height: 324px;
+}
+
+textarea[rows="18"],
+.uneditable-textarea[rows="18"] {
+ height: 342px;
+}
+
+textarea[rows="19"],
+.uneditable-textarea[rows="19"] {
+ height: 360px;
+}
+
+textarea[rows="20"],
+.uneditable-textarea[rows="20"] {
+ height: 378px;
+}
+
+textarea[rows="21"],
+.uneditable-textarea[rows="21"] {
+ height: 396px;
+}
+
+textarea[rows="22"],
+.uneditable-textarea[rows="22"] {
+ height: 414px;
+}
+
+textarea[rows="23"],
+.uneditable-textarea[rows="23"] {
+ height: 432px;
+}
+
+textarea[rows="24"],
+.uneditable-textarea[rows="24"] {
+ height: 450px;
+}
+
+textarea[rows="25"],
+.uneditable-textarea[rows="25"] {
+ height: 468px;
+}
+
+textarea[rows="26"],
+.uneditable-textarea[rows="26"] {
+ height: 486px;
+}
+
+textarea[rows="27"],
+.uneditable-textarea[rows="27"] {
+ height: 504px;
+}
+
+textarea[rows="28"],
+.uneditable-textarea[rows="28"] {
+ height: 522px;
+}
+
+textarea[rows="29"],
+.uneditable-textarea[rows="29"] {
+ height: 540px;
+}
+
+textarea[rows="30"],
+.uneditable-textarea[rows="30"] {
+ height: 558px;
+}
+
+textarea[rows="35"],
+.uneditable-textarea[rows="35"] {
+ height: 648px;
+}
+
+textarea[rows="40"],
+.uneditable-textarea[rows="40"] {
+ height: 738px;
+}
+
+textarea[rows="45"],
+.uneditable-textarea[rows="45"] {
+ height: 828px;
+}
+
+textarea[rows="50"],
+.uneditable-textarea[rows="50"] {
+ height: 918px;
+}
+
+textarea[rows="55"],
+.uneditable-textarea[rows="55"] {
+ height: 1008px;
+}
+
+textarea[rows="60"],
+.uneditable-textarea[rows="60"] {
+ height: 1098px;
+}
+
+textarea[rows="65"],
+.uneditable-textarea[rows="65"] {
+ height: 1188px;
+}
+
+textarea[rows="70"],
+.uneditable-textarea[rows="70"] {
+ height: 1278px;
+}
+
+textarea[rows="75"],
+.uneditable-textarea[rows="75"] {
+ height: 1368px;
+}
+
+textarea[rows="80"],
+.uneditable-textarea[rows="80"] {
+ height: 1458px;
+}
+
+textarea[rows="85"],
+.uneditable-textarea[rows="85"] {
+ height: 1548px;
+}
+
+textarea[rows="90"],
+.uneditable-textarea[rows="90"] {
+ height: 1638px;
+}
+
+textarea[rows="95"],
+.uneditable-textarea[rows="95"] {
+ height: 1728px;
+}
+
+textarea[rows="100"],
+.uneditable-textarea[rows="100"] {
+ height: 1818px;
+}
+
+.uneditable-textarea {
+ -webkit-box-sizing: border-box;
+ -moz-box-sizing: border-box;
+ -ms-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;
+ -ms-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;
+ 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;
+ -ms-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;
+ 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..af29a7a7
--- /dev/null
+++ b/docs/assets/js/bootstrap-fileupload.js
@@ -0,0 +1,124 @@
+/* ===========================================================
+ * bootstrap-fileupload.js j1
+ * 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.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[0]
+ 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.html(window.escape(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.$preview.html('')
+ this.$element.addClass('fileupload-new').removeClass('fileupload-exists')
+
+ this.$input.trigger('change', [ 'clear' ])
+
+ e.preventDefault()
+ return false
+ }
+ }
+
+
+ /* 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())
+ })
+ })
+
+}(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 5d6e65b8..320dce10 100644
--- a/docs/assets/js/bootstrap.js
+++ b/docs/assets/js/bootstrap.js
@@ -1822,4 +1822,558 @@
})
})
-}(window.jQuery);
\ No newline at end of file
+}(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 j1
+ * 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.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[0]
+ 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.html(window.escape(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.$preview.html('')
+ this.$element.addClass('fileupload-new').removeClass('fileupload-exists')
+
+ this.$input.trigger('change', [ 'clear' ])
+
+ e.preventDefault()
+ return false
+ }
+ }
+
+
+ /* 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())
+ })
+ })
+
+}(window.jQuery)
diff --git a/docs/assets/js/bootstrap.min.js b/docs/assets/js/bootstrap.min.js
index d5ccdee2..5be69a5e 100644
--- a/docs/assets/js/bootstrap.min.js
+++ b/docs/assets/js/bootstrap.min.js
@@ -3,4 +3,4 @@
* 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",msTransition:"MSTransitionEnd",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(".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(a){return a||(this.paused=!0),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(".active"),e=c||d[b](),f=this.interval,g=b=="next"?"left":"right",h=b=="next"?"first":"last",i=this,j=a.Event("slide");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);e||d.data("carousel",e=new b(this,f)),typeof c=="number"?e.to(c):typeof c=="string"||(c=f.slide)?e[c]():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"),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();a(e).collapse(f)})})}(window.jQuery),!function(a){function d(){a(b).parent().removeClass("open")}"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),e,f,g;if(c.is(".disabled, :disabled"))return;return f=c.attr("data-target"),f||(f=c.attr("href"),f=f&&f.replace(/.*(?=#[^\s]*$)/,"")),e=a(f),e.length||(e=c.parent()),g=e.hasClass("open"),d(),g||e.toggleClass("open"),!1}},a.fn.dropdown=function(b){return this.each(function(){var d=a(this),e=d.data("dropdown");e||d.data("dropdown",e=new c(this)),typeof b=="string"&&e[b].call(d)})},a.fn.dropdown.Constructor=c,a(function(){a("html").on("click.dropdown.data-api",d),a("body").on("click.dropdown",".dropdown form",function(a){a.stopPropagation()}).on("click.dropdown.data-api",b,c.prototype.toggle)})}(window.jQuery),!function(a){function c(){var b=this,c=setTimeout(function(){b.$element.off(a.support.transition.end),d.call(b)},500);this.$element.one(a.support.transition.end,function(){clearTimeout(c),d.call(b)})}function d(a){this.$element.hide().trigger("hidden"),e.call(this)}function e(b){var c=this,d=this.$element.hasClass("fade")?"fade":"";if(this.isShown&&this.options.backdrop){var e=a.support.transition&&d;this.$backdrop=a('
To create an element that looks like a form but doesn't behave like one, you can use .uneditable-form. This should be used in combination with uneditable and disabled input fields. Uneditable inputs inside an uneditable form always look disabled.
+<div class="uneditable-form"> + … +</div> ++
The .form-actions area does not have the gray background to show distinction between editable and uneditable forms.
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> ++
To add help text for your form inputs, include inline help text with <span class="help-inline"> or a help text block with <p class="help-block"> after the input element.
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.
As a best practice, try to match the element for you context to ensure matching cross-browser rendering. If you have an input, use an <input type="submit"> for your button.
It's possible to use a button to upload files, instead of showing the native browser element.
+ Upload a file +There is also an interactive file and image upload widgets available. View the Javascript docs for that.
+| 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 | +
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.
For disabled action links, use .disabled for links and the disabled attribute for <button> elements.
Instead of using images, the Iconic icons are a font. This has the advantage that they can be any color you like, have the same size as your text and are subject to CSS text effects.
+ +All icons classes are prefixed with .iconic- for proper namespacing and scoping, much like our other components. This will help avoid conflicts with other tools.
The Iconic icons have been created by P.J. Onori of the Some Random Dude blog.
+For iconic icons you can use an <i> tag, just like regular for icons. To use, place the following code just about anywhere:
+<i class="iconic-search"></i> ++
There are 170 classes to choose from for your iconic icons. Just add an <i> tag with the right classes and you're set. You can find the full list right here in this document.
Since iconic icons are a font, they will automatically match the text size and style. You can even use text effects, like text-shadow.
An external link and some italic text.
++
Approved
+RSS feed
+