diff --git a/.gitignore b/.gitignore index 023591ca5..88a0d68d3 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,4 @@ -.idea/* -node_modules/* \ No newline at end of file +.idea +_gh_pages +node_modules +bower_components \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index 99cd913c1..a701461d8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,23 +1,602 @@ # Change Log -v0.1.1 -* #16: Disable client side validation in HTML 5 -* #17: Support default Bootstrap form without labels -* #19: Support select box validator +## v0.5.3 (2014-11-05) + +__New Features__ +* [#807](https://github.com/nghuuphuoc/bootstrapvalidator/issues/807), [#821](https://github.com/nghuuphuoc/bootstrapvalidator/pull/821): Add ```min```, ```max``` options for the [date](http://bootstrapvalidator.com/validators/date/) validator, thanks to [@Arkni](https://github.com/Arkni) +* [#822](https://github.com/nghuuphuoc/bootstrapvalidator/pull/822): Add color validator, thanks to [@emilchristensen](https://github.com/emilchristensen) +* [#844](https://github.com/nghuuphuoc/bootstrapvalidator/pull/844), [#874](https://github.com/nghuuphuoc/bootstrapvalidator/pull/874): The [stringLength](http://bootstrapvalidator.com/validators/stringLength/) validator adds option to evaluate length in UTF-8 bytes, thanks to [@thx2001r](https://github.com/thx2001r) +* [#960](https://github.com/nghuuphuoc/bootstrapvalidator/issues/960), [#1052](https://github.com/nghuuphuoc/bootstrapvalidator/issues/1052): Add ```trim``` option for the [stringLength](http://bootstrapvalidator.com/validators/stringLength/) validator +* [#1001](https://github.com/nghuuphuoc/bootstrapvalidator/pull/1001): Add ```minFiles```, ```maxFiles```, ```minTotalSize```, ```maxTotalSize``` options for the [file](http://bootstrapvalidator.com/validators/file/) validator, thanks to [@morrizon](https://github.com/morrizon) +* [#1008](https://github.com/nghuuphuoc/bootstrapvalidator/pull/1008): Add France [postal code](http://bootstrapvalidator.com/validators/zipCode/) validator, thanks to [@jazzzz](https://github.com/jazzzz) +* [#1010](https://github.com/nghuuphuoc/bootstrapvalidator/pull/1010): Add Ireland [postal code](http://bootstrapvalidator.com/validators/zipCode/) validator, thanks to [@zmira](https://github.com/zmira) +* [#1018](https://github.com/nghuuphuoc/bootstrapvalidator/pull/1018): Add German [phone number](http://bootstrapvalidator.com/validators/phone/) and [postal code](http://bootstrapvalidator.com/validators/zipCode/) validators, thanks to [@jhadenfeldt](https://github.com/jhadenfeldt) +* [#1022](https://github.com/nghuuphuoc/bootstrapvalidator/pull/1022): Add Portugal [postal code](http://bootstrapvalidator.com/validators/zipCode/) validator, thanks to [@zmira](https://github.com/zmira) +* [#1033](https://github.com/nghuuphuoc/bootstrapvalidator/issues/1033), [#1043](https://github.com/nghuuphuoc/bootstrapvalidator/issues/1043), [#1068](https://github.com/nghuuphuoc/bootstrapvalidator/issues/1068): Add ```autoFocus``` option +* [#1072](https://github.com/nghuuphuoc/bootstrapvalidator/pull/1072): Add Austria and Switzerland [postal code](http://bootstrapvalidator.com/validators/zipCode/) validators, thanks to [@thomaslhotta](https://github.com/thomaslhotta) + +__Improvements__ +* [#823](https://github.com/nghuuphuoc/bootstrapvalidator/issues/823): The [hexColor](http://bootstrapvalidator.com/validators/hexColor/) validator only accepts 6 hex character values when using HTML 5 ```type='color'``` attribute +* [#864](https://github.com/nghuuphuoc/bootstrapvalidator/pull/864): Comma separator handling in [greaterThan](http://bootstrapvalidator.com/validators/greaterThan/), [lessThan](http://bootstrapvalidator.com/validators/lessThan/) validators, thanks to [@mgibas](https://github.com/mgibas) +* [#999](https://github.com/nghuuphuoc/bootstrapvalidator/pull/999), [#1048](https://github.com/nghuuphuoc/bootstrapvalidator/issues/1048): Replace ',' with '.' to validate decimal numbers correct, thanks to [@johanronn77](https://github.com/johanronn77) +* [#1002](https://github.com/nghuuphuoc/bootstrapvalidator/pull/1002): Put tooltip/popover on bottom if there is not enough space on top, thanks to [@jazzzz](https://github.com/jazzzz) +* [#1015](https://github.com/nghuuphuoc/bootstrapvalidator/pull/1015): The [remote](http://bootstrapvalidator.com/validators/remote/) validator allows to set ```data``` options via HTML attributes, thanks to [@jazzzz](https://github.com/jazzzz) +* [#1017](https://github.com/nghuuphuoc/bootstrapvalidator/pull/1017): Enable validator when setting ```data-bv-validatorname="data-bv-validatorname"```, thanks to [@jazzzz](https://github.com/jazzzz) +* [#1026](https://github.com/nghuuphuoc/bootstrapvalidator/issues/1026): Requires jQuery 1.9.1 or higher + +__Bug Fixes__ +* [#343](https://github.com/nghuuphuoc/bootstrapvalidator/issues/343), [#481](https://github.com/nghuuphuoc/bootstrapvalidator/issues/481), [#1045](https://github.com/nghuuphuoc/bootstrapvalidator/pull/1045): Fix double submit with defered validators, thanks to [@jazzzz](https://github.com/jazzzz) +* [#933](https://github.com/nghuuphuoc/bootstrapvalidator/issues/933), [#959](https://github.com/nghuuphuoc/bootstrapvalidator/issues/959), [#1047](https://github.com/nghuuphuoc/bootstrapvalidator/issues/1047): Tooltip/popover isn't destroyed when the field is valid +* [#991](https://github.com/nghuuphuoc/bootstrapvalidator/issues/991): The field is validated only one time when setting ```trigger: 'blur'```, ```container: 'tooltip'``` +* [#1014](https://github.com/nghuuphuoc/bootstrapvalidator/pull/1014): Fix [isValidField()](http://bootstrapvalidator.com/api/#is-valid-field) and [validateField()](http://bootstrapvalidator.com/api/#validate-field) methods for fields without validators, thanks to [@jazzzz](https://github.com/jazzzz) +* [#1050](https://github.com/nghuuphuoc/bootstrapvalidator/issues/1050): Fix the issue when using multiple fields with same name, the tooltip of the last element is always shown +* [#1055](https://github.com/nghuuphuoc/bootstrapvalidator/issues/1055), [#1063](https://github.com/nghuuphuoc/bootstrapvalidator/pull/1063): The [error.field.bv](http://bootstrapvalidator.com/settings/#event-field) event isn't triggered if verbose is set to false, thanks to [@shineability](https://github.com/shineability) +* [#1057](https://github.com/nghuuphuoc/bootstrapvalidator/issues/1057), [#1063](https://github.com/nghuuphuoc/bootstrapvalidator/pull/1063): The [verbose](http://bootstrapvalidator.com/settings/#field-verbose) option for field doesn't override the form level, thanks to [@shineability](https://github.com/shineability) + +__Document__ +* [#848](https://github.com/nghuuphuoc/bootstrapvalidator/pull/848): Update the [stringLength](http://bootstrapvalidator.com/validators/stringLength) document, thanks to [@Relequestual](https://github.com/Relequestual) +* [#885](https://github.com/nghuuphuoc/bootstrapvalidator/issues/885): Add a notification about setting [identical](http://bootstrapvalidator.com/validators/identical/) validator for both fields +* [#912](https://github.com/nghuuphuoc/bootstrapvalidator/issues/912): Add [Using language package](http://bootstrapvalidator.com/examples/using-language-package/) example +* [#920](https://github.com/nghuuphuoc/bootstrapvalidator/issues/920), [#929](https://github.com/nghuuphuoc/bootstrapvalidator/pull/929), [#936](https://github.com/nghuuphuoc/bootstrapvalidator/pull/936): Update the [Changing the tooltip, popover's position](http://bootstrapvalidator.com/examples/tooltip-popover-position/) example, thanks to [@Arkni](https://github.com/Arkni) +* [#938](https://github.com/nghuuphuoc/bootstrapvalidator/issues/938): Add [time](http://bootstrapvalidator.com/validators/regexp/#html-5-example) validator example +* [#979](https://github.com/nghuuphuoc/bootstrapvalidator/issues/979): Add [Rails usage](http://bootstrapvalidator.com/validators/stringLength/#using-with-rails-form) for stringLength validator +* [#1006](https://github.com/nghuuphuoc/bootstrapvalidator/pull/1006): Fix the order of [parameters](http://bootstrapvalidator.com/settings/#validator-enabled) for [enableFieldValidators()](http://bootstrapvalidator.com/api/#enable-field-validators) method, thanks to [@mchrapka](https://github.com/mchrapka) +* [#1009](https://github.com/nghuuphuoc/bootstrapvalidator/pull/1009): Fix mixed data/delay in [remote](http://bootstrapvalidator.com/validators/remote/) doc, thanks to [@jazzzz](https://github.com/jazzzz) +* [#1019](https://github.com/nghuuphuoc/bootstrapvalidator/pull/1019): Updated docs for added German [postal code](http://bootstrapvalidator.com/validators/zipCode/) and [phone number](http://bootstrapvalidator.com/validators/phone/) validators, thanks to [@jhadenfeldt](https://github.com/jhadenfeldt) +* [#1038](https://github.com/nghuuphuoc/bootstrapvalidator/pull/1038): Fix [Changing tooltip, popover's position](http://bootstrapvalidator.com/examples/changing-tooltip-position/) example link, thanks to [@Arkni](https://github.com/Arkni) + +__Language Packages__ +* [#827](https://github.com/nghuuphuoc/bootstrapvalidator/pull/827): Update Dutch language package, thanks to [@JvanderHeide](https://github.com/JvanderHeide) +* [#829](https://github.com/nghuuphuoc/bootstrapvalidator/pull/829): Update Swedish language package, thanks to [@ulsa](https://github.com/ulsa) +* [#834](https://github.com/nghuuphuoc/bootstrapvalidator/pull/834): Update Ukrainian and Russian language packages, thanks to [@oleg-voloshyn](https://github.com/oleg-voloshyn) +* [#835](https://github.com/nghuuphuoc/bootstrapvalidator/pull/835): Update Belgium (French) language package, thanks to [@neilime](https://github.com/neilime) +* [#836](https://github.com/nghuuphuoc/bootstrapvalidator/pull/836): Update French language package, thanks to [@neilime](https://github.com/neilime) +* [#837](https://github.com/nghuuphuoc/bootstrapvalidator/pull/837): Update Bulgarian language package, thanks to [@mraiur](https://github.com/mraiur) +* [#846](https://github.com/nghuuphuoc/bootstrapvalidator/pull/846): Update simplified Chinese language package, thanks to [@shamiao](https://github.com/shamiao) +* [#849](https://github.com/nghuuphuoc/bootstrapvalidator/pull/849): Update Serbian language package, thanks to [@markocrni](https://github.com/markocrni) +* [#850](https://github.com/nghuuphuoc/bootstrapvalidator/issues/850), [#851](https://github.com/nghuuphuoc/bootstrapvalidator/pull/851): Update Danish language package, thanks to [@Djarnis](https://github.com/Djarnis) +* [#869](https://github.com/nghuuphuoc/bootstrapvalidator/pull/869): Update Polish language package, thanks to [@grzesiek](https://github.com/grzesiek) +* [#870](https://github.com/nghuuphuoc/bootstrapvalidator/pull/870): Update Traditional Chinese language package, thanks to [@tureki](https://github.com/tureki) +* [#871](https://github.com/nghuuphuoc/bootstrapvalidator/pull/871): Update Czech language package, thanks to [@cuchac](https://github.com/cuchac) +* [#872](https://github.com/nghuuphuoc/bootstrapvalidator/pull/872): Update Indonesian language package, thanks to [@egig](https://github.com/egig) +* [#879](https://github.com/nghuuphuoc/bootstrapvalidator/pull/879): Update Romanian language package, thanks to [@filipac](https://github.com/filipac) +* [#880](https://github.com/nghuuphuoc/bootstrapvalidator/pull/880): Update Belgium (Dutch) language package, thanks to [@dokterpasta](https://github.com/dokterpasta) +* [#881](https://github.com/nghuuphuoc/bootstrapvalidator/pull/881): Update Italian language package, thanks to [@maramazza](https://github.com/maramazza) +* [#882](https://github.com/nghuuphuoc/bootstrapvalidator/pull/882): Update Spanish language package, thanks to [@vadail](https://github.com/vadail) +* [#891](https://github.com/nghuuphuoc/bootstrapvalidator/pull/891): Update Portuguese (Brazil) language package, thanks to [@dgmike](https://github.com/dgmike) +* [#893](https://github.com/nghuuphuoc/bootstrapvalidator/pull/893): Fix country name of Dominican Republic, thanks to [@sventech](https://github.com/sventech) +* [#900](https://github.com/nghuuphuoc/bootstrapvalidator/pull/900): Update Persian (Farsi) language package, thanks to [@i0](https://github.com/i0) +* [#903](https://github.com/nghuuphuoc/bootstrapvalidator/pull/903): Update Hungarian language package, thanks to [@blackfyre](https://github.com/blackfyre) +* [#910](https://github.com/nghuuphuoc/bootstrapvalidator/pull/910): Update Greek language package, thanks to [@pRieStaKos](https://github.com/pRieStaKos) +* [#913](https://github.com/nghuuphuoc/bootstrapvalidator/pull/913): Update Thai language package, thanks to [@figgaro](https://github.com/figgaro) +* [#915](https://github.com/nghuuphuoc/bootstrapvalidator/pull/915): Update Turkish language package, thanks to [@CeRBeR666](https://github.com/CeRBeR666) +* [#961](https://github.com/nghuuphuoc/bootstrapvalidator/pull/961): Update Chilean Spanish language package, thanks to [@marceloampuerop6](https://github.com/marceloampuerop6) +* [#967](https://github.com/nghuuphuoc/bootstrapvalidator/pull/967): Add Hebrew language package, thanks to [@yakidahan](https://github.com/yakidahan) +* [#974](https://github.com/nghuuphuoc/bootstrapvalidator/pull/974): Add Albanian language package, thanks to [@desaretiuss](https://github.com/desaretiuss) +* [#1025](https://github.com/nghuuphuoc/bootstrapvalidator/pull/1025): Fix French emailAddress message, thanks to [@jazzzz](https://github.com/jazzzz) +* [#1051](https://github.com/nghuuphuoc/bootstrapvalidator/pull/1051): Add Portuguese language package, thanks to [@rtbfreitas](https://github.com/rtbfreitas) + +## v0.5.2 (2014-09-25) + +__New Features__ +* [#480](https://github.com/nghuuphuoc/bootstrapvalidator/pull/480): Add ```verbose``` option, thanks to [@mbezhanov](https://github.com/mbezhanov) +* [#542](https://github.com/nghuuphuoc/bootstrapvalidator/issues/542), [#666](https://github.com/nghuuphuoc/bootstrapvalidator/pull/666): Add blank validator, thanks to [@bermo](https://github.com/bermo) +* [#617](https://github.com/nghuuphuoc/bootstrapvalidator/issues/617): Add ```init``` and ```destroy``` methods to validator +* [#724](https://github.com/nghuuphuoc/bootstrapvalidator/pull/724): Add Venezuelan VAT number (RIF) validator, thanks to [@paquitodev](https://github.com/paquitodev) +* [#739](https://github.com/nghuuphuoc/bootstrapvalidator/pull/739): Add China phone number validator, thanks to [@caijh](https://github.com/caijh) +* [#743](https://github.com/nghuuphuoc/bootstrapvalidator/pull/743): Add Venezuela phone number validator, thanks to [@paquitodev](https://github.com/paquitodev) +* [#760](https://github.com/nghuuphuoc/bootstrapvalidator/pull/760): Add Romania phone number validator, thanks to [@adrian-dks](https://github.com/adrian-dks) +* [#761](https://github.com/nghuuphuoc/bootstrapvalidator/pull/761): Add Romania postal code validator, thanks to [@adrian-dks](https://github.com/adrian-dks) +* [#785](https://github.com/nghuuphuoc/bootstrapvalidator/pull/785): Add Denmark phone number validator, thanks to [@emilchristensen](https://github.com/emilchristensen) +* [#787](https://github.com/nghuuphuoc/bootstrapvalidator/pull/787): Add Thailand phone number and ID validator, thanks to [@figgaro](https://github.com/figgaro) +* [#793](https://github.com/nghuuphuoc/bootstrapvalidator/pull/793), [#798](https://github.com/nghuuphuoc/bootstrapvalidator/pull/798): Add Chinese citizen ID validator, thanks to [@shamiao](https://github.com/shamiao) +* [#802](https://github.com/nghuuphuoc/bootstrapvalidator/pull/802): Add Russia phone number validator, thanks to [@cylon-v](https://github.com/cylon-v). [#816](https://github.com/nghuuphuoc/bootstrapvalidator/pull/816): Improved by [@stepin](https://github.com/stepin) +* [#816](https://github.com/nghuuphuoc/bootstrapvalidator/pull/816): Add Russian postal code validator, thanks to [@stepin](https://github.com/stepin) +* [#867](https://github.com/nghuuphuoc/bootstrapvalidator/pull/867): Add Czech and Slovakia phone number and postal code validators, thanks to [@cuchac](https://github.com/cuchac) + +__Changes__ +* [#753](https://github.com/nghuuphuoc/bootstrapvalidator/issues/753): Change the default type of [remote](http://bootstrapvalidator.com/validators/remote/) validator to GET + +__Improvements__ +* [#249](https://github.com/nghuuphuoc/bootstrapvalidator/pull/249), [#574](https://github.com/nghuuphuoc/bootstrapvalidator/issues/574), [#669](https://github.com/nghuuphuoc/bootstrapvalidator/issues/669): Add ```delay``` option to the [remote](http://bootstrapvalidator.com/validators/remote/) validator, thanks to [@q-state](https://github.com/q-state) +* [#345](https://github.com/nghuuphuoc/bootstrapvalidator/issues/345), [#454](https://github.com/nghuuphuoc/bootstrapvalidator/pull/454): The [different](http://bootstrapvalidator.com/validators/different/) validator allows more than a 2-way comparison, thanks to [@AlaskanShade](https://github.com/AlaskanShade) +* [#557](https://github.com/nghuuphuoc/bootstrapvalidator/issues/557), [#569](https://github.com/nghuuphuoc/bootstrapvalidator/pull/569): The [container](http://bootstrapvalidator.com/settings/#form-container) option can be defined by a callback, thanks to [@mattrick](https://github.com/mattrick) +* [#570](https://github.com/nghuuphuoc/bootstrapvalidator/issues/570): Use CSS classes instead of inline styling to fix icons with ```input-group```, thanks to [@dlcrush](https://github.com/dlcrush) +* [#578](https://github.com/nghuuphuoc/bootstrapvalidator/issues/578), [#813](https://github.com/nghuuphuoc/bootstrapvalidator/pull/813): The [stringLength](http://bootstrapvalidator.com/validators/stringLength/) validator supports HTML 5 ```minlength``` attribute, thanks to [@emilchristensen](https://github.com/emilchristensen) +* [#675](https://github.com/nghuuphuoc/bootstrapvalidator/pull/675): The [emailAddress](http://bootstrapvalidator.com/validators/emailAddress/) validator accepts multiple email addresses, thanks to [@kenny-evitt](https://github.com/kenny-evitt) +* [#716](https://github.com/nghuuphuoc/bootstrapvalidator/issues/716), [#765](https://github.com/nghuuphuoc/bootstrapvalidator/issues/765): Reuse data returned by [callback](http://bootstrapvalidator.com/validators/callback/), [remote](http://bootstrapvalidator.com/validators/remote/), custom validators +* [#734](https://github.com/nghuuphuoc/bootstrapvalidator/pull/734): The [uri](http://bootstrapvalidator.com/validators/uri/) validator adds support for custom protocol, thanks to [@bcamarneiro](https://github.com/bcamarneiro) +* [#737](https://github.com/nghuuphuoc/bootstrapvalidator/issues/737): Support VAT number without prefixing by country code +* [#754](https://github.com/nghuuphuoc/bootstrapvalidator/issues/754): Support latest Bootstrap when using tooltip/popover to show the message +* [#783](https://github.com/nghuuphuoc/bootstrapvalidator/issues/783): Improve behaviour of the [different](http://bootstrapvalidator.com/validators/different/) validator +* [#792](https://github.com/nghuuphuoc/bootstrapvalidator/pull/792): Add "BootstrapValidator's JavaScript requires jQuery" warning, thanks to [@Arkni](https://github.com/Arkni) +* [#803](https://github.com/nghuuphuoc/bootstrapvalidator/pull/803): Add ```minSize``` option for the [file](http://bootstrapvalidator.com/validators/file/) validator, thanks to [@Arkni](https://github.com/Arkni) +* [#824](https://github.com/nghuuphuoc/bootstrapvalidator/issues/824): Add [phone](http://bootstrapvalidator.com/validators/phone/) number validator test suite + +__Bug Fixes__ +* [#611](https://github.com/nghuuphuoc/bootstrapvalidator/issues/611), [#703](https://github.com/nghuuphuoc/bootstrapvalidator/issues/703): Tabs get red even form is valid +* [#612](https://github.com/nghuuphuoc/bootstrapvalidator/issues/612), [#740](https://github.com/nghuuphuoc/bootstrapvalidator/pull/740), [#741](https://github.com/nghuuphuoc/bootstrapvalidator/pull/741): Fix the [emailAddress](http://bootstrapvalidator.com/validators/emailAddress/) issue which email@server is not valid email address, thanks to [@kromit](https://github.com/kromit) +* [#687](https://github.com/nghuuphuoc/bootstrapvalidator/issues/687), [#711](https://github.com/nghuuphuoc/bootstrapvalidator/pull/711): Keep disabled validators VALID, thanks to [@talberti](https://github.com/talberti) +* [#725](https://github.com/nghuuphuoc/bootstrapvalidator/pull/725): Fix the issue when adding field which does not exist but is already set in "fields" option +* [#732](https://github.com/nghuuphuoc/bootstrapvalidator/issues/732): Fix the issue when removing the radio or checkbox field +* [#746](https://github.com/nghuuphuoc/bootstrapvalidator/issues/746): The form is still submitted when clicking on submit button which is set ```onclick="return false;"``` +* [#758](https://github.com/nghuuphuoc/bootstrapvalidator/issues/758): Using [notEmpty](http://bootstrapvalidator.com/validators/notEmpty/) validator with ```type="number"``` +* [#759](https://github.com/nghuuphuoc/bootstrapvalidator/issues/759), [#764](https://github.com/nghuuphuoc/bootstrapvalidator/pull/764): The tooltip/popover isn't shown if there is disabled validator. +The tooltip/popover is shown automatically when the field gets the focus, thanks to [@leedorian](https://github.com/leedorian) +* [#797](https://github.com/nghuuphuoc/bootstrapvalidator/issues/797), [#799](https://github.com/nghuuphuoc/bootstrapvalidator/pull/799): Can't validate ipv4 and ipv6 at the same time. Add ip validator test suite, thanks to [@Arkni](https://github.com/Arkni) +* [#816](https://github.com/nghuuphuoc/bootstrapvalidator/pull/816): Fix Russian [VAT](http://bootstrapvalidator.com/validators/vat/) number validator, thanks to [@stepin](https://github.com/stepin) +* [#832](https://github.com/nghuuphuoc/bootstrapvalidator/issues/832): The form won't be validated if the submit button contains a HTML tag + +__Document__ +* [#709](https://github.com/nghuuphuoc/bootstrapvalidator/issues/709), [#715](https://github.com/nghuuphuoc/bootstrapvalidator/pull/715): Add [Bootstrap Select](http://bootstrapvalidator.com/examples/bootstrap-select/) and [Select2](http://bootstrapvalidator.com/examples/select2/) examples, thanks to [@Arkni](https://github.com/Arkni) +* [#855](https://github.com/nghuuphuoc/bootstrapvalidator/issues/855), [#858](https://github.com/nghuuphuoc/bootstrapvalidator/pull/858): Add [TinyMCE](http://bootstrapvalidator.com/examples/tinymce/) example, thanks to [@Arkni](https://github.com/Arkni) +* [#859](https://github.com/nghuuphuoc/bootstrapvalidator/issues/859), [#862](https://github.com/nghuuphuoc/bootstrapvalidator/issues/862), [#865](https://github.com/nghuuphuoc/bootstrapvalidator/pull/865): Add [Changing tooltip/popover position](http://bootstrapvalidator.com/examples/tooltip-popover-position/) example, thanks to [@Arkni](https://github.com/Arkni) + +__Language Packages__ +* [#706](https://github.com/nghuuphuoc/bootstrapvalidator/pull/706): Japanese language package, thanks to [@tsuyoshifujii](https://github.com/tsuyoshifujii) +* [#712](https://github.com/nghuuphuoc/bootstrapvalidator/pull/712): Swedish language package, thanks to [@ulsa](https://github.com/ulsa) +* [#727](https://github.com/nghuuphuoc/bootstrapvalidator/pull/727): Belgium (French) language package, thanks to [@neilime](https://github.com/neilime) +* [#729](https://github.com/nghuuphuoc/bootstrapvalidator/pull/729): Persian (Farsi) language package, thanks to [@i0](https://github.com/i0) +* [#779](https://github.com/nghuuphuoc/bootstrapvalidator/pull/779): Romanian language package, thanks to [@filipac](https://github.com/filipac) +* [#787](https://github.com/nghuuphuoc/bootstrapvalidator/pull/787): Thai language package, thanks to [@figgaro](https://github.com/figgaro) +* [#788](https://github.com/nghuuphuoc/bootstrapvalidator/pull/788): Fully re-translated Simplified Chinese language package, thanks to [@shamiao](https://github.com/shamiao) +* [#795](https://github.com/nghuuphuoc/bootstrapvalidator/pull/795): Re-translated traditional Chinese language package, thanks to [@tureki](https://github.com/tureki) +* [#802](https://github.com/nghuuphuoc/bootstrapvalidator/pull/802): Russian language package, thanks to [@cylon-v](https://github.com/cylon-v). [#816](https://github.com/nghuuphuoc/bootstrapvalidator/pull/816): Improved by [@stepin](https://github.com/stepin) +* [#806](https://github.com/nghuuphuoc/bootstrapvalidator/pull/806): Ukrainian language package, thanks to [@oleg-voloshyn](https://github.com/oleg-voloshyn) +* [#840](https://github.com/nghuuphuoc/bootstrapvalidator/pull/840): Serbian language package, thanks to [@markocrni](https://github.com/markocrni) +* [#856](https://github.com/nghuuphuoc/bootstrapvalidator/pull/856): Norwegian language package, thanks to [@trondulseth](https://github.com/trondulseth) +* [#868](https://github.com/nghuuphuoc/bootstrapvalidator/pull/868): Indonesian language package, thanks to [@egig](https://github.com/egig) + +## v0.5.1 (2014-08-22) + +__New Features__ +* [#218](https://github.com/nghuuphuoc/bootstrapvalidator/issues/218), [#531](https://github.com/nghuuphuoc/bootstrapvalidator/pull/531): Add meid validator, thanks to [@troymccabe](https://github.com/troymccabe) +* [#267](https://github.com/nghuuphuoc/bootstrapvalidator/issues/267), [#532](https://github.com/nghuuphuoc/bootstrapvalidator/pull/532): Add imo validator, thanks to [@troymccabe](https://github.com/troymccabe) +* [#510](https://github.com/nghuuphuoc/bootstrapvalidator/pull/510), [#646](https://github.com/nghuuphuoc/bootstrapvalidator/pull/646): Add French [phone number](http://bootstrapvalidator.com/validators/phone/) validator, thanks to [@dlucazeau](https://github.com/dlucazeau) +* [#536](https://github.com/nghuuphuoc/bootstrapvalidator/pull/536): Add Spanish [phone number](http://bootstrapvalidator.com/validators/phone/) validator, thanks to [@vadail](https://github.com/vadail) +* [#519](https://github.com/nghuuphuoc/bootstrapvalidator/pull/519): Add Iceland [VAT](http://bootstrapvalidator.com/validators/vat/) number validator, thanks to [@evilchili](https://github.com/evilchili) +* [#620](https://github.com/nghuuphuoc/bootstrapvalidator/issues/620), [#621](https://github.com/nghuuphuoc/bootstrapvalidator/pull/621): Add Pakistan [phone number](http://bootstrapvalidator.com/validators/phone/) validator, thanks to [@abuzer](https://github.com/abuzer) +* [#630](https://github.com/nghuuphuoc/bootstrapvalidator/issues/630), [#640](https://github.com/nghuuphuoc/bootstrapvalidator/pull/640): Add event name options to avoid window.onerror being invoked by jQuery, thanks to [@roryprimrose](https://github.com/roryprimrose). Thanks to [@stephengreentree](https://github.com/stephengreentree) for creating the test suite ([#657](https://github.com/nghuuphuoc/bootstrapvalidator/pull/657)) +* [#637](https://github.com/nghuuphuoc/bootstrapvalidator/pull/637): Add South African [VAT](http://bootstrapvalidator.com/validators/vat/) number validator, thanks to [@evilchili](https://github.com/evilchili) +* [#638](https://github.com/nghuuphuoc/bootstrapvalidator/pull/638), [#647](https://github.com/nghuuphuoc/bootstrapvalidator/pull/647): Add Brazilian [phone number](http://bootstrapvalidator.com/validators/phone/) and [postal code](http://bootstrapvalidator.com/validators/zipCode/) validator, thanks to [@fhferreira](https://github.com/fhferreira) +* [#643](https://github.com/nghuuphuoc/bootstrapvalidator/pull/643): Add [zipCode](http://bootstrapvalidator.com/validators/zipCode/) and [phone number](http://bootstrapvalidator.com/validators/phone/) validators for Morocco, thanks to [@Arkni](https://github.com/Arkni) +* [#650](https://github.com/nghuuphuoc/bootstrapvalidator/pull/650): Add Brazilian [VAT](http://bootstrapvalidator.com/validators/vat/) number validator, thanks to [@fhferreira](https://github.com/fhferreira) + +__Improvements__ +* [#502](https://github.com/nghuuphuoc/bootstrapvalidator/pull/502): Allowing sites without TLD to pass URI validation, thanks to [@troymccabe](https://github.com/troymccabe) +* [#549](https://github.com/nghuuphuoc/bootstrapvalidator/pull/549), [#600](https://github.com/nghuuphuoc/bootstrapvalidator/pull/600): Change the CSS/JS path in ```demo/remote.html``` and ```demo/message.html```, thanks to [@leegtang](https://github.com/leegtang), [@Arkni](https://github.com/Arkni) +* [#604](https://github.com/nghuuphuoc/bootstrapvalidator/pull/604): Fix the ```demo/date.html``` and ```demo/tab.html``` examples, thanks to [@Arkni](https://github.com/Arkni) +* [#609](https://github.com/nghuuphuoc/bootstrapvalidator/pull/609): Add content-type header for ```demo/remote.php```, thanks to [@etorres](https://github.com/etorres) +* [#661](https://github.com/nghuuphuoc/bootstrapvalidator/pull/661): Add ```headers``` option to the [remote](http://bootstrapvalidator.com/validators/remote/) validator, thanks to [@ryan2049](https://github.com/ryan2049) +* [#664](https://github.com/nghuuphuoc/bootstrapvalidator/issues/664): Fix the feedback icon position for Bootstrap 3.2 +* [#683](https://github.com/nghuuphuoc/bootstrapvalidator/issues/683): Force the format option to be ```YYYY-MM-DD``` when using `````` +* [#698](https://github.com/nghuuphuoc/bootstrapvalidator/issues/698): Ignore type checking if the file type is empty + +__Bug Fixes__ +* [#284](https://github.com/nghuuphuoc/bootstrapvalidator/issues/284), [#294](https://github.com/nghuuphuoc/bootstrapvalidator/issues/294), [#441](https://github.com/nghuuphuoc/bootstrapvalidator/issues/441), [#516](https://github.com/nghuuphuoc/bootstrapvalidator/issues/516), [#580](https://github.com/nghuuphuoc/bootstrapvalidator/issues/580): The HTML 5 `````` input allows to input non-digits characters +* [#548](https://github.com/nghuuphuoc/bootstrapvalidator/issues/548): Fix the issue when using [different](http://bootstrapvalidator.com/validators/different/) validator to compare with not existing field +* [#550](https://github.com/nghuuphuoc/bootstrapvalidator/issues/550), [#551](https://github.com/nghuuphuoc/bootstrapvalidator/pull/551): Cannot validate against both ipv4 and ipv6 at the same time, thanks to [@beeglebug](https://github.com/beeglebug) +* [#588](https://github.com/nghuuphuoc/bootstrapvalidator/issues/588): Don't use min, max attributes (greaterThan, lessThan validators) for `````` +* [#665](https://github.com/nghuuphuoc/bootstrapvalidator/issues/665): The [submitButtons](http://bootstrapvalidator.com/settings/#form-submit-buttons) option doesn't work correctly +* [#672](https://github.com/nghuuphuoc/bootstrapvalidator/issues/672): The [zipCode](http://bootstrapvalidator.com/validators/zipCode/) validator throw an exception when passing not supported country code +* [#681](https://github.com/nghuuphuoc/bootstrapvalidator/issues/681): Fix the [date](http://bootstrapvalidator.com/validators/date/) validator issue where one of date/month/year or hours/minutes/seconds is prefixed by zero +* [#692](https://github.com/nghuuphuoc/bootstrapvalidator/issues/692): The [remote](http://bootstrapvalidator.com/validators/remote/) validator can't set the type option via HTML attribute +* [#700](https://github.com/nghuuphuoc/bootstrapvalidator/issues/700): The [between](http://bootstrapvalidator.com/validators/between/), [greaterThan](http://bootstrapvalidator.com/validators/greaterThan/), [lessThan](http://bootstrapvalidator.com/validators/lessThan/) validators accept param which isn't number + +__Language Packages__ +* [#400](https://github.com/nghuuphuoc/bootstrapvalidator/pull/400): Italian language package, thanks to [@maramazza](https://github.com/maramazza) +* [#503](https://github.com/nghuuphuoc/bootstrapvalidator/pull/503): French language package, thanks to [@dlucazeau](https://github.com/dlucazeau) +* [#505](https://github.com/nghuuphuoc/bootstrapvalidator/pull/505): Czech language package, thanks to [@AdwinTrave](https://github.com/AdwinTrave) +* [#507](https://github.com/nghuuphuoc/bootstrapvalidator/pull/507): Polish language package, thanks to [@grzesiek](https://github.com/grzesiek). [#624](https://github.com/nghuuphuoc/bootstrapvalidator/pull/624): Typos fixed by [@lukaszbanasiak](https://github.com/lukaszbanasiak) +* [#517](https://github.com/nghuuphuoc/bootstrapvalidator/pull/517): Belgium (Dutch) language package, thanks to [@dokterpasta](https://github.com/dokterpasta) +* [#527](https://github.com/nghuuphuoc/bootstrapvalidator/pull/527): Bulgarian language package, thanks to [@mraiur](https://github.com/mraiur) +* [#534](https://github.com/nghuuphuoc/bootstrapvalidator/pull/534): Turkish language package, thanks to [@CeRBeR666](https://github.com/CeRBeR666) +* [#536](https://github.com/nghuuphuoc/bootstrapvalidator/pull/536): Spanish language package, thanks to [@vadail](https://github.com/vadail) +* [#544](https://github.com/nghuuphuoc/bootstrapvalidator/pull/544): Greek language package, thanks to [@pRieStaKos](https://github.com/pRieStaKos) +* [#545](https://github.com/nghuuphuoc/bootstrapvalidator/pull/545): Portuguese (Brazil) language package, thanks to [@marcuscarvalho6](https://github.com/marcuscarvalho6) +* [#598](https://github.com/nghuuphuoc/bootstrapvalidator/pull/598): Danish language package, thanks to [@Djarnis](https://github.com/Djarnis) +* [#674](https://github.com/nghuuphuoc/bootstrapvalidator/pull/674), [#677](https://github.com/nghuuphuoc/bootstrapvalidator/pull/677): Dutch language package, thanks to [@jvanderheide](https://github.com/jvanderheide) +* [#679](https://github.com/nghuuphuoc/bootstrapvalidator/pull/679): Add Arabic language package, thanks to [@Arkni](https://github.com/Arkni) + +## v0.5.0 (2014-07-14) + +__New Features__ +* [#2](https://github.com/nghuuphuoc/bootstrapvalidator/issues/2), [#387](https://github.com/nghuuphuoc/bootstrapvalidator/issues/387): Provide the default error messages +* [#93](https://github.com/nghuuphuoc/bootstrapvalidator/issues/93), [#385](https://github.com/nghuuphuoc/bootstrapvalidator/issues/385): Support translating error messages. Provide the Vietnamese language file +* [#121](https://github.com/nghuuphuoc/bootstrapvalidator/issues/121): Add events for form validate successfully or not +* [#125](https://github.com/nghuuphuoc/bootstrapvalidator/issues/125): Support dynamic fields +* [#130](https://github.com/nghuuphuoc/bootstrapvalidator/pull/130): Add ```addField()``` and ```removeField()``` methods for managing dynamic fields, thanks to [@jcnmulio](https://github.com/jcnmulio) +* [#164](https://github.com/nghuuphuoc/bootstrapvalidator/issues/164): Add ```container``` option for indicating the element showing all errors +* [#175](https://github.com/nghuuphuoc/bootstrapvalidator/issues/175): Showing errors in tooltip or popover +* [#195](https://github.com/nghuuphuoc/bootstrapvalidator/issues/195): Add events for field validation +* [#211](https://github.com/nghuuphuoc/bootstrapvalidator/issues/211), [#235](https://github.com/nghuuphuoc/bootstrapvalidator/issues/235): Add new method ```getInvalidFields()``` that returns all invalid fields +* [#275](https://github.com/nghuuphuoc/bootstrapvalidator/issues/275): Add ```destroy()``` method +* [#282](https://github.com/nghuuphuoc/bootstrapvalidator/issues/282), [#347](https://github.com/nghuuphuoc/bootstrapvalidator/issues/347): Use error message that is returned from [callback](http://bootstrapvalidator.com/validators/callback/), [remote](http://bootstrapvalidator.com/validators/remote/) validators +* Add ```status.field.bv``` event which is triggered after updating the field status. It can be used to solve [#300](https://github.com/nghuuphuoc/bootstrapvalidator/issues/300), [#301](https://github.com/nghuuphuoc/bootstrapvalidator/issues/301) +* [#316](https://github.com/nghuuphuoc/bootstrapvalidator/issues/316): Add ```isValidContainer(container)``` method +* [#320](https://github.com/nghuuphuoc/bootstrapvalidator/issues/320): Add ```separator``` option to the [date validator](http://bootstrapvalidator.com/validators/date/) +* [#323](https://github.com/nghuuphuoc/bootstrapvalidator/issues/323): Add ```isValidField(field)``` method +* [#324](https://github.com/nghuuphuoc/bootstrapvalidator/issues/324): Add ```success.validator.bv``` and ```error.validator.bv``` events triggered after a validator completes +* [#332](https://github.com/nghuuphuoc/bootstrapvalidator/pull/332): Add UK phone number support for the [phone validator](http://bootstrapvalidator.com/validators/phone/), thanks to [@aca02djr](https://github.com/aca02djr) +* [#336](https://github.com/nghuuphuoc/bootstrapvalidator/issues/336): Add ```$field``` instance to the [callback validator](http://bootstrapvalidator.com/validators/callback/) +* [#356](https://github.com/nghuuphuoc/bootstrapvalidator/issues/356): Add ```group``` option +* [#374](https://github.com/nghuuphuoc/bootstrapvalidator/pull/374): Add Singapore postal code to the [zipCode validator](http://bootstrapvalidator.com/validators/zipCode/), thanks to [@thisisclement](https://github.com/thisisclement) +* [#406](https://github.com/nghuuphuoc/bootstrapvalidator/issues/406): Add ```revalidateField(field)``` method +* [#433](https://github.com/nghuuphuoc/bootstrapvalidator/issues/433): Add ```resetField(field, resetValue)``` method +* [#434](https://github.com/nghuuphuoc/bootstrapvalidator/issues/434): Add ```updateMessage(field, validator, message)``` method + +__Changes__ +* [#42](https://github.com/nghuuphuoc/bootstrapvalidator/issues/42): Remove the submit button from ```submitHandler()```. You can use new ```getSubmitButton()``` method to get the clicked submit button +* [#109](https://github.com/nghuuphuoc/bootstrapvalidator/issues/109): Remove the ```setLiveMode()``` method +* ```$.fn.bootstrapValidator.helpers``` renames ```mod_11_10``` to ```mod11And10```, ```mod_37_36``` to ```mod37And36``` +* Remove ```submitHandler()``` option. Use ```success.form.bv``` event instead: + +_v0.4.5 and earlier versions_ +```javascript +$(form).bootstrapValidator({ + submitHandler: function(form, validator, submitButton) { + ... + } +}); +``` + +_v0.5.0_ +Using ```success.form.bv``` event: + +```javascript +$(form) + .bootstrapValidator(options) + .on('success.form.bv', function(e) { + // Prevent form submission + e.preventDefault(); + + var $form = $(e.target), + validator = $form.data('bootstrapValidator'), + submitButton = validator.getSubmitButton(); + + // Do whatever you want here ... + }); +``` + +__Improvements__ +* [#244](https://github.com/nghuuphuoc/bootstrapvalidator/pull/244): Only enable the submit buttons if all fields are valid, thanks to [@smeagol74](https://github.com/smeagol74) +* [#262](https://github.com/nghuuphuoc/bootstrapvalidator/issues/262): Improve the [```updateStatus()``` method](http://bootstrapvalidator.com/api/#update-status). The plugin now doesn't show the errors, feedback icons of given field if there are uncompleted validators +* [#274](https://github.com/nghuuphuoc/bootstrapvalidator/pull/274): Fix feedback icons in ```input-group```, thanks to [@tiagofontella](https://github.com/tiagofontella) +* [#287](https://github.com/nghuuphuoc/bootstrapvalidator/issues/287), [#291](https://github.com/nghuuphuoc/bootstrapvalidator/issues/291): Only send the submit button which is clicked. It's an enhancement for [#238](https://github.com/nghuuphuoc/bootstrapvalidator/issues/238) +* [#297](https://github.com/nghuuphuoc/bootstrapvalidator/issues/297): Disable feedback icons for particular fields +* [#348](https://github.com/nghuuphuoc/bootstrapvalidator/issues/348): The [uri validator](http://bootstrapvalidator.com/validators/uri/) now provides an option to support private/local network address +* [#364](https://github.com/nghuuphuoc/bootstrapvalidator/issues/364): Clicking the feedback icon also effect to the checkbox, radio fields +* [#366](https://github.com/nghuuphuoc/bootstrapvalidator/issues/366): Don't change the enable setting when the new one is the same +* [#371](https://github.com/nghuuphuoc/bootstrapvalidator/pull/371): Add H character to the Canadian postcode, thanks to [@jzhang6](https://github.com/jzhang6) +* [#382](https://github.com/nghuuphuoc/bootstrapvalidator/issues/382): Add JSHint to Grunt build +* [#388](https://github.com/nghuuphuoc/bootstrapvalidator/issues/388): Allow to override the default options. Useful for using multiple forms in the same page +* [#393](https://github.com/nghuuphuoc/bootstrapvalidator/pull/393): The [remote validator](http://bootstrapvalidator.com/validators/remote/) adds support for dynamic ```url``` and method type (GET/POST), thanks to [@ericnakagawa](https://github.com/ericnakagawa) +* [#416](https://github.com/nghuuphuoc/bootstrapvalidator/issues/416), [#448](https://github.com/nghuuphuoc/bootstrapvalidator/pull/448): Add ```updateOption()``` method for updating the particular validator option, thanks to [@AlaskanShade](https://github.com/AlaskanShade) +* [#420](https://github.com/nghuuphuoc/bootstrapvalidator/issues/420): Enable/disable particular validator +* [#422](https://github.com/nghuuphuoc/bootstrapvalidator/issues/422): Exclude particular field by ```excluded``` option or ```data-bv-excluded``` attribute +* [#426](https://github.com/nghuuphuoc/bootstrapvalidator/issues/426): Add test suite +* [#430](https://github.com/nghuuphuoc/bootstrapvalidator/issues/430): [between](http://bootstrapvalidator.com/validators/between/), [greaterThan](http://bootstrapvalidator.com/validators/greaterThan/), [lessThan](http://bootstrapvalidator.com/validators/lessThan/) add support for comparing to other field, return value of a callback function +* [#431](https://github.com/nghuuphuoc/bootstrapvalidator/issues/431): Add built time to the build file +* [#432](https://github.com/nghuuphuoc/bootstrapvalidator/issues/432): Define the callback via ```data-bv-callback-callback``` attribute +* [#447](https://github.com/nghuuphuoc/bootstrapvalidator/pull/447): [zipCode validator](http://bootstrapvalidator.com/validators/zipCode/) allow to set the country code via another field or callback, thanks to [@AlaskanShade](https://github.com/AlaskanShade) +* [#451](https://github.com/nghuuphuoc/bootstrapvalidator/pull/451): Validation of numeric fields with decimal steps, thanks to [@Azuka](https://github.com/Azuka) +* [#456](https://github.com/nghuuphuoc/bootstrapvalidator/issues/456): Adjust the feedback icon position for ```.input-group``` element +* [#465](https://github.com/nghuuphuoc/bootstrapvalidator/issues/465): Support dynamic message + +__Bug Fixes__ +* [#288](https://github.com/nghuuphuoc/bootstrapvalidator/issues/288): Fix [date validator](http://bootstrapvalidator.com/validators/date/) issue on IE8 +* [#292](https://github.com/nghuuphuoc/bootstrapvalidator/pull/292): Fix identical validator issue with not clearing ```has-error``` class, thanks to [@alavers](https://github.com/alavers) +* [#305](https://github.com/nghuuphuoc/bootstrapvalidator/pull/305), [#306](https://github.com/nghuuphuoc/bootstrapvalidator/pull/306), [#307](https://github.com/nghuuphuoc/bootstrapvalidator/pull/307): Fix ```inclusive``` option in the [between](http://bootstrapvalidator.com/validators/between/), [greaterThan](http://bootstrapvalidator.com/validators/greaterThan/) and [lessThan](http://bootstrapvalidator.com/validators/lessThan/) validators, thanks to [@johanronn77](https://github.com/johanronn77) +* [#310](https://github.com/nghuuphuoc/bootstrapvalidator/issues/310), [#475](https://github.com/nghuuphuoc/bootstrapvalidator/issues/475): The [date validator](http://bootstrapvalidator.com/validators/date/) still return valid if the value doesn't contain digits +* [#311](https://github.com/nghuuphuoc/bootstrapvalidator/issues/311): file validation extension is case sensitive +* [#312](https://github.com/nghuuphuoc/bootstrapvalidator/pull/312): Fix broacast typo in the [uri validator](http://bootstrapvalidator.com/validators/uri/), thanks to [@mrpollo](https://github.com/mrpollo) +* [#313](https://github.com/nghuuphuoc/bootstrapvalidator/issues/313): Fix the [file validator](http://bootstrapvalidator.com/validators/file/) issue on IE 8 +* [#314](https://github.com/nghuuphuoc/bootstrapvalidator/issues/314): The [creditCard validator](http://bootstrapvalidator.com/validators/creditCard/) doesn't work on IE 8 +* [#315](https://github.com/nghuuphuoc/bootstrapvalidator/issues/315): The [cvv validator](http://bootstrapvalidator.com/validators/cvv/) doesn't work on IE 8 +* [#325](https://github.com/nghuuphuoc/bootstrapvalidator/issues/325): The [```threshold``` option](http://bootstrapvalidator.com/settings/#threshold) doesn't work on IE 8 +* [#358](https://github.com/nghuuphuoc/bootstrapvalidator/issues/358): The [zipCode validator](http://bootstrapvalidator.com/validators/zipCode/) doesn't work for Canadian zip code +* [#375](https://github.com/nghuuphuoc/bootstrapvalidator/issues/375): Don't submit form when the [callback validator](http://bootstrapvalidator.com/validators/callback/) completes and the submit button isn't clicked +* [#377](https://github.com/nghuuphuoc/bootstrapvalidator/issues/377): The [id](http://bootstrapvalidator.com/validators/id/), [vat](http://bootstrapvalidator.com/validators/vat/) validators should return ```false``` if the country code is not supported +* [#389](https://github.com/nghuuphuoc/bootstrapvalidator/issues/389): When using multiple forms with HTML attributes on the same page, the plugin options will be the same as the last one +* [#401](https://github.com/nghuuphuoc/bootstrapvalidator/issues/401): [stringLength validator](http://bootstrapvalidator.com/validators/stringLength/) allows spaces after max length +* [#411](https://github.com/nghuuphuoc/bootstrapvalidator/pull/411): Fix the [ean validator](http://bootstrapvalidator.com/validators/ean/) when the check digit is zero, thanks to [@manish-in-java](https://github.com/manish-in-java) +* [#417](https://github.com/nghuuphuoc/bootstrapvalidator/issues/417): IPv6 validator doesn't work +* [#425](https://github.com/nghuuphuoc/bootstrapvalidator/issues/425): Custom trigger event is ignored by field validators +* [#447](https://github.com/nghuuphuoc/bootstrapvalidator/pull/447): Skip the ```_isExcluded()``` when initializing the form. This fixes [#269](https://github.com/nghuuphuoc/bootstrapvalidator/issues/269), [#273](https://github.com/nghuuphuoc/bootstrapvalidator/issues/273). Thanks to [@AlaskanShade](https://github.com/AlaskanShade) +* [#483](https://github.com/nghuuphuoc/bootstrapvalidator/issues/483), [#487](https://github.com/nghuuphuoc/bootstrapvalidator/pull/487): Added the letters 'W' and 'Z' in the second and third letter list for Canada postal code, thanks to [@jzhang6](https://github.com/jzhang6) +* [#492](https://github.com/nghuuphuoc/bootstrapvalidator/issues/492), [#493](https://github.com/nghuuphuoc/bootstrapvalidator/pull/493): Fixed Chilean ID (RUT/RUN) finished in 'K' or 'k', thanks to [@marceloampuerop6](https://github.com/marceloampuerop6) + +__Document__ +* [#259](https://github.com/nghuuphuoc/bootstrapvalidator/issues/259): Typo "Support almost Bootstrap forms", thanks to [@lloydde](https://github.com/lloydde) +* [#261](https://github.com/nghuuphuoc/bootstrapvalidator/pull/261): English fix to 'amazing contributors' section, thanks to [@lloydde](https://github.com/lloydde) +* [#278](https://github.com/nghuuphuoc/bootstrapvalidator/pull/278): Update the [choice validator](http://bootstrapvalidator.com/validators/choice/) document, thanks to [@MrC0mm0n](https://github.com/MrC0mm0n) +* [#303](https://github.com/nghuuphuoc/bootstrapvalidator/pull/303): Fix typo in [remote validator](http://bootstrapvalidator.com/validators/remote/) document, thanks to [@MartinDevillers](https://github.com/MartinDevillers) +* [#334](https://github.com/nghuuphuoc/bootstrapvalidator/pull/334): No ID is specified on the form object for registration, thanks to [@jjshoe](https://github.com/jjshoe) +* [#423](https://github.com/nghuuphuoc/bootstrapvalidator/pull/423): Add default column to settings table, thanks to [@MartinDevillers](https://github.com/MartinDevillers) +* [#452](https://github.com/nghuuphuoc/bootstrapvalidator/pull/452): Update 'United State' to 'United States', thanks to [@mike1e](https://github.com/mike1e) + +__Language Packages__ +* [#396](https://github.com/nghuuphuoc/bootstrapvalidator/pull/396): German language package, thanks to [@logemann](https://github.com/logemann) +* [#474](https://github.com/nghuuphuoc/bootstrapvalidator/pull/474): Hungarian language package, thanks to [@blackfyre](https://github.com/blackfyre) +* [#478](https://github.com/nghuuphuoc/bootstrapvalidator/pull/478): Simplified and traditional Chinese language package, thanks to [@tureki](https://github.com/tureki) +* [#494](https://github.com/nghuuphuoc/bootstrapvalidator/pull/494): Chilean Spanish language package, thanks to [@marceloampuerop6](https://github.com/marceloampuerop6) + +## v0.4.5 (2014-05-15) + +* Add ```$.fn.bootstrapValidator.helpers.date``` for validating a date, re-used in [date](http://bootstrapvalidator.com/validators/date/), [id](http://bootstrapvalidator.com/validators/id/), [vat](http://bootstrapvalidator.com/validators/vat/) validators +* [#233](https://github.com/nghuuphuoc/bootstrapvalidator/issues/233): Add ```threshold``` option +* [#232](https://github.com/nghuuphuoc/bootstrapvalidator/issues/232): Add [id validator](http://bootstrapvalidator.com/validators/id/) +* [#242](https://github.com/nghuuphuoc/bootstrapvalidator/issues/242): Add ```separator``` option to the [numeric validator](http://bootstrapvalidator.com/validators/numeric/) +* [#248](https://github.com/nghuuphuoc/bootstrapvalidator/issues/248): Add [isin (International Securities Identification Number) validator](http://bootstrapvalidator.com/validators/issn/) +* [#250](https://github.com/nghuuphuoc/bootstrapvalidator/issues/250): Add [rtn (Routing transit number) validator](http://bootstrapvalidator.com/validators/rtn/) +* [#251](https://github.com/nghuuphuoc/bootstrapvalidator/issues/251): Add [cusip (North American Securities) validator](http://bootstrapvalidator.com/validators/cusip/) +* [#252](https://github.com/nghuuphuoc/bootstrapvalidator/issues/252): Add [sedol (Stock Exchange Daily Official List) validator](http://bootstrapvalidator.com/validators/sedol/) +* The [zipCode validator](http://bootstrapvalidator.com/validators/zipCode/) adds support for Italian, Dutch postcodes +* [#245](https://github.com/nghuuphuoc/bootstrapvalidator/pull/245): The [cvv validator](http://bootstrapvalidator.com/validators/cvv/) should support spaces in credit card, thanks to [@evilchili](https://github.com/evilchili) +* Change default ```submitButtons``` to ```[type="submit"]``` to support ```input type="submit"``` +* [#226](https://github.com/nghuuphuoc/bootstrapvalidator/issues/226): Fix the conflict issue with MooTools +* [#238](https://github.com/nghuuphuoc/bootstrapvalidator/issues/238): The submit buttons are not sent +* [#253](https://github.com/nghuuphuoc/bootstrapvalidator/issues/253): The [iban validator](http://bootstrapvalidator.com/validators/iban/) does not work on IE8 +* [#257](https://github.com/nghuuphuoc/bootstrapvalidator/issues/257): Plugin method invocation don't work +* Fix the issue that the hidden fields generated by other plugins might not be validated +* When parsing options from HTML attributes, don't add the field which hasn't validators. It improves fixes for [#191](https://github.com/nghuuphuoc/bootstrapvalidator/issues/191), [#223](https://github.com/nghuuphuoc/bootstrapvalidator/issues/223) + +## v0.4.4 (2014-05-05) + +* Add ```$.fn.bootstrapValidator.helpers.mod_11_10``` method that implements modulus 11, 10 (ISO 7064) algorithm. The helper is then reused in validating [German and Croatian VAT](http://bootstrapvalidator.com/validators/vat/) numbers +* Add ```$.fn.bootstrapValidator.helpers.mod_37_36``` method that implements modulus 37, 36 (ISO 7064) algorithm, used in [GRid validator](http://bootstrapvalidator.com/validators/grid/) +* [#213](https://github.com/nghuuphuoc/bootstrapvalidator/issues/213): Add [EAN (International Article Number) validator](http://bootstrapvalidator.com/validators/ean/) +* [#214](https://github.com/nghuuphuoc/bootstrapvalidator/issues/214): Add [GRId (Global Release Identifier) validator](http://bootstrapvalidator.com/validators/grid/) +* [#215](https://github.com/nghuuphuoc/bootstrapvalidator/issues/215): Add [IMEI (International Mobile Station Equipment Identity) validator](http://bootstrapvalidator.com/validators/imei/) +* [#216](https://github.com/nghuuphuoc/bootstrapvalidator/issues/216): Add [ISMN (International Standard Music Number) validator](http://bootstrapvalidator.com/validators/ismn/) +* [#217](https://github.com/nghuuphuoc/bootstrapvalidator/issues/217): Add [ISSN (International Standard Serial Number) validator](http://bootstrapvalidator.com/validators/issn/) +* [#191](https://github.com/nghuuphuoc/bootstrapvalidator/issues/191), [#223](https://github.com/nghuuphuoc/bootstrapvalidator/issues/223): Support using both the ```name``` attribute and ```selector``` option for field +* [#206](https://github.com/nghuuphuoc/bootstrapvalidator/issues/206): Indicate success/error tab +* [#220](https://github.com/nghuuphuoc/bootstrapvalidator/issues/220): Add UK postcode support for the [zipCode validator](http://bootstrapvalidator.com/validators/zipCode/) +* [#229](https://github.com/nghuuphuoc/bootstrapvalidator/issues/229): The [date validator](http://bootstrapvalidator.com/validators/date/) supports seconds +* [#231](https://github.com/nghuuphuoc/bootstrapvalidator/issues/231): Wrong prefix of Laser [credit card](http://bootstrapvalidator.com/validators/creditCard/) number + +## v0.4.3 (2014-04-26) + +* Add ```$.fn.bootstrapValidator.helpers.luhn``` method that implements the Luhn algorithm +* [#77](https://github.com/nghuuphuoc/bootstrapvalidator/issues/77): Add [file validator](http://bootstrapvalidator.com/validators/file/) +* [#179](https://github.com/nghuuphuoc/bootstrapvalidator/issues/179): Add [vat validator](http://bootstrapvalidator.com/validators/vat/), support 32 countries +* [#198](https://github.com/nghuuphuoc/bootstrapvalidator/pull/198), [#199](https://github.com/nghuuphuoc/bootstrapvalidator/pull/199): Add Canadian Postal Code support for the [zipCode validator](http://bootstrapvalidator.com/validators/zipCode/), thanks to [@Francismori7](https://github.com/Francismori7) +* [#201](https://github.com/nghuuphuoc/bootstrapvalidator/issues/201): The [choice validator](http://bootstrapvalidator.com/validators/choice/) supports ```select``` element +* [#202](https://github.com/nghuuphuoc/bootstrapvalidator/issues/202): Activate tab containing the first invalid field +* [#205](https://github.com/nghuuphuoc/bootstrapvalidator/issues/205): Plugin method invocation +* [#207](https://github.com/nghuuphuoc/bootstrapvalidator/issues/207): IE8 error. The field is only validated when its value is changed. It also fixes [#153](https://github.com/nghuuphuoc/bootstrapvalidator/issues/153), [#193](https://github.com/nghuuphuoc/bootstrapvalidator/issues/193), [#197](https://github.com/nghuuphuoc/bootstrapvalidator/issues/197) +* [#209](https://github.com/nghuuphuoc/bootstrapvalidator/issues/209): The [```excluded: ':disabled'``` setting](http://bootstrapvalidator.com/settings/#excluded) does not work on IE 8, thanks to [@adgrafik](https://github.com/adgrafik) +* [#210](https://github.com/nghuuphuoc/bootstrapvalidator/issues/210): The [isbn validator](http://bootstrapvalidator.com/validators/isbn/) accepts letters and special characters + +## v0.4.2 (2014-04-19) + +* [#168](https://github.com/nghuuphuoc/bootstrapvalidator/pull/168): Add [siren](http://bootstrapvalidator.com/validators/siren/) and [siret](http://bootstrapvalidator.com/validators/siret/) validators, thanks to [@jswale](https://github.com/jswale) +* [#177](https://github.com/nghuuphuoc/bootstrapvalidator/issues/177): Add [Vehicle Identification Number (VIN) validator](http://bootstrapvalidator.com/validators/vin/) +* [#184](https://github.com/nghuuphuoc/bootstrapvalidator/issues/184): Add [```excluded``` option](http://bootstrapvalidator.com/settings/#excluded) +* [#171](https://github.com/nghuuphuoc/bootstrapvalidator/pull/171): The [phone validator](http://bootstrapvalidator.com/validators/phone/) now supports +1 country code and area code for US phone number, thanks to [@tomByrer](https://github.com/tomByrer) +* [#173](https://github.com/nghuuphuoc/bootstrapvalidator/pull/173): The [remote validator](http://bootstrapvalidator.com/validators/remote/) allows to override ```name``` option, thanks to [@jswale](https://github.com/jswale) +* [#178](https://github.com/nghuuphuoc/bootstrapvalidator/pull/178): Do not validate fields that ```enabled``` is set to ```false```, thanks to [@henningda](https://github.com/henningda) +* [#182](https://github.com/nghuuphuoc/bootstrapvalidator/pull/182): Improve [zipCode validator](http://bootstrapvalidator.com/validators/zipCode/), thanks to [@gercheq](https://github.com/gercheq) +* [#169](https://github.com/nghuuphuoc/bootstrapvalidator/pull/169): Better to say: ```{validatorname}``` and ```{validatoroption}``` must be lowercase, thanks to [@tomByrer](https://github.com/tomByrer) + +## v0.4.1 (2014-04-12) + +* [#144](https://github.com/nghuuphuoc/bootstrapvalidator/issues/144), [#158](https://github.com/nghuuphuoc/bootstrapvalidator/issues/158): Fixed an issue that the custom submit handler is not fired from the second time +* [#106](https://github.com/nghuuphuoc/bootstrapvalidator/issues/106): Prevent the [```validate()```](http://bootstrapvalidator.com/api/#validate) method from submit the form automatically. So we can call ```validate()``` to validate the form +* [#131](https://github.com/nghuuphuoc/bootstrapvalidator/issues/131): Doesn't trigger validation on the first focus +* [#145](https://github.com/nghuuphuoc/bootstrapvalidator/issues/145): The row state is now only marked as success if all fields on it are valid +* [#157](https://github.com/nghuuphuoc/bootstrapvalidator/issues/157): Added support for element outside of form using the [```selector```](http://bootstrapvalidator.com/settings/#fields) option +* [#159](https://github.com/nghuuphuoc/bootstrapvalidator/issues/159), [#163](https://github.com/nghuuphuoc/bootstrapvalidator/pull/163): User doesn't need to submit the form twice when remote validator complete, thanks to [@jswale](https://github.com/jswale) +* [#162](https://github.com/nghuuphuoc/bootstrapvalidator/pull/162): Fix errors in IE 8, thanks to [@adgrafik](https://github.com/adgrafik) +* [#166](https://github.com/nghuuphuoc/bootstrapvalidator/issues/166), [#167](https://github.com/nghuuphuoc/bootstrapvalidator/pull/167): The [phone validator](http://bootstrapvalidator.com/validators/phone/) now also checks the length of US phone number, thanks to [@gercheq](https://github.com/gercheq) + +## v0.4.0 (2014-04-03) + +* [#14](https://github.com/nghuuphuoc/bootstrapvalidator/issues/14), [#57](https://github.com/nghuuphuoc/bootstrapvalidator/issues/57): Set validator option by using [HTML 5 attributes](http://bootstrapvalidator.com/examples/#attribute) + +Form attributes: + +```html +
+``` + +Field attributes: + +```html + +``` + +* Support [HTML 5 input types](http://bootstrapvalidator.com/examples/#html5): + +HTML 5 attribute | Validator +----------------------|---------- +```min="..."``` | [greaterThan validator](http://bootstrapvalidator.com/validators/greaterThan/) +```max="..."``` | [lessThan validator](http://bootstrapvalidator.com/validators/lessThan/) +```maxlength="..."``` | [stringLength validator](http://bootstrapvalidator.com/validators/stringLength/) +```pattern="..."``` | [regexp validator](http://bootstrapvalidator.com/validators/regexp/) +```required``` | [notEmpty validator](http://bootstrapvalidator.com/validators/notEmpty/) +```type="color"``` | [hexColor validator](http://bootstrapvalidator.com/validators/hexColor/) +```type="email"``` | [emailAddress validator](http://bootstrapvalidator.com/validators/emailAddress/) +```type="range"``` | [between validator](http://bootstrapvalidator.com/validators/between/) +```type="url"``` | [uri validator](http://bootstrapvalidator.com/validators/uri/) + +* [#74](https://github.com/nghuuphuoc/bootstrapvalidator/issues/74), [#103](https://github.com/nghuuphuoc/bootstrapvalidator/issues/103), [#122](https://github.com/nghuuphuoc/bootstrapvalidator/issues/122): Set the custom [trigger event](http://bootstrapvalidator.com/settings/#trigger) + +It's possible to use ```data-bv-trigger``` attribute: + +```html + + + ... + +
+``` + +or ```trigger``` option: + +```javascript +$(form).bootstrapValidator({ + trigger: 'blur', // Set for all fields + fields: { + firstName: { + trigger: 'keyup', // Custom for each field. Can be 'event1 event2 event3' + validators: { + ... + } + }, + lastName: { + trigger: 'blur', + validators: { + ... + } + } + } +}); +``` + +* [#136](https://github.com/nghuuphuoc/bootstrapvalidator/issues/136): Support multiple elements with the [same name](http://bootstrapvalidator.com/examples/#fields-with-same-name) + +```html +
+ +
+
+ +
+
+ +
+``` + +* [#109](https://github.com/nghuuphuoc/bootstrapvalidator/issues/109): Add [```setLiveMode()``` method](http://bootstrapvalidator.com/api/#set-live-mode) to turn on/off the live validating mode +* [#114](https://github.com/nghuuphuoc/bootstrapvalidator/issues/114): Add [iban validator](http://bootstrapvalidator.com/validators/iban/) for validating IBAN (International Bank Account Number) +* [#116](https://github.com/nghuuphuoc/bootstrapvalidator/issues/116): Add [uuid validator](http://bootstrapvalidator.com/validators/uuid/), support UUID v3, v4, v5 +* [#128](https://github.com/nghuuphuoc/bootstrapvalidator/issues/128): Add [numeric validator](http://bootstrapvalidator.com/validators/numeric/) +* [#135](https://github.com/nghuuphuoc/bootstrapvalidator/issues/135): Add [integer validator](http://bootstrapvalidator.com/validators/integer/) +* [#138](https://github.com/nghuuphuoc/bootstrapvalidator/issues/138): Add [hex validator](http://bootstrapvalidator.com/validators/hex/) +* [#139](https://github.com/nghuuphuoc/bootstrapvalidator/issues/139): Add [stringCase validator](http://bootstrapvalidator.com/validators/stringCase/) to check a string is lower or upper case +* [#137](https://github.com/nghuuphuoc/bootstrapvalidator/issues/137): Register the plugin with [jQuery plugins site](http://plugins.jquery.com/) +* [#133](https://github.com/nghuuphuoc/bootstrapvalidator/issues/133): The [regexp validator](http://bootstrapvalidator.com/validators/regexp/) allows to pass a string +* [#140](https://github.com/nghuuphuoc/bootstrapvalidator/pull/140): Do not validate hidden (```type="hidden"```) and invisible element, thanks to [@easonhan007](https://github.com/easonhan007) +* [```disableSubmitButtons()```](http://bootstrapvalidator.com/api/#disable-submit-buttons) is now marked as a public API +* The first parameter of [```updateStatus()``` method](http://bootstrapvalidator.com/api/#update-status) now accepts the field name only +* [#126](https://github.com/nghuuphuoc/bootstrapvalidator/issues/126): Submit button remains disabled after calling custom ```submitHandler``` and the form is valid +* [#132](https://github.com/nghuuphuoc/bootstrapvalidator/issues/132): The ```fields.[fieldName].message``` option is not used when showing the error message + +## v0.3.3 (2014-03-27) + +* [#50](https://github.com/nghuuphuoc/bootstrapvalidator/issues/50): Don't validate disabled element +* [#34](https://github.com/nghuuphuoc/bootstrapvalidator/issues/34), [#105](https://github.com/nghuuphuoc/bootstrapvalidator/issues/105): Cannot call ```form.submit()``` inside [```submitHandler```](http://bootstrapvalidator.com/settings/#submit-handler) +* [#77](https://github.com/nghuuphuoc/bootstrapvalidator/issues/77), [#117](https://github.com/nghuuphuoc/bootstrapvalidator/issues/117): The [notEmpty validator](http://bootstrapvalidator.com/validators/notEmpty/) doesn't work on file input +* [#120](https://github.com/nghuuphuoc/bootstrapvalidator/pull/120): Handle case where a field is removed after the bootstrap validation, thanks to [@patmoore](https://github.com/patmoore) + +## v0.3.2 (2014-03-21) + +* [#56](https://github.com/nghuuphuoc/bootstrapvalidator/issues/56): Add [```selector``` option](http://bootstrapvalidator.com/settings/#fields) for each field. The field can be defined by CSS validator instead of the ```name``` attribute +* [#107](https://github.com/nghuuphuoc/bootstrapvalidator/issues/107): Add [```container``` option](http://bootstrapvalidator.com/settings/#fields) for each field to indicate where the error messages are shown +* [#5](https://github.com/nghuuphuoc/bootstrapvalidator/issues/5): Add [ip validator](http://bootstrapvalidator.com/validators/ip/). Support both IPv4 and IPv6 +* [#6](https://github.com/nghuuphuoc/bootstrapvalidator/issues/6): Add [isbn validator](http://bootstrapvalidator.com/validators/isbn/), support both ISBN 10 and ISBN 13 +* [#7](https://github.com/nghuuphuoc/bootstrapvalidator/issues/7): Add [step validator](http://bootstrapvalidator.com/validators/step/) +* [#95](https://github.com/nghuuphuoc/bootstrapvalidator/issues/95): Add [mac validator](http://bootstrapvalidator.com/validators/mac/) +* [#96](https://github.com/nghuuphuoc/bootstrapvalidator/issues/96): Add [base64 validator](http://bootstrapvalidator.com/validators/base64/) +* [#97](https://github.com/nghuuphuoc/bootstrapvalidator/issues/97): Add [cvv validator](http://bootstrapvalidator.com/validators/cvv/) +* [#99](https://github.com/nghuuphuoc/bootstrapvalidator/issues/99), [#100](https://github.com/nghuuphuoc/bootstrapvalidator/pull/100): Add [phone validator](http://bootstrapvalidator.com/validators/phone/). Support US phone number only, thanks to [@gercheq](https://github.com/gercheq) +* [#112](https://github.com/nghuuphuoc/bootstrapvalidator/issues/112): [creditCard validator](http://bootstrapvalidator.com/validators/creditCard/) now validates both IIN ranges and length + +## v0.3.1 (2014-03-17) + +* [#4](https://github.com/nghuuphuoc/bootstrapvalidator/issues/4): Add [date validator](http://bootstrapvalidator.com/validators/date/) +* [#72](https://github.com/nghuuphuoc/bootstrapvalidator/issues/72), [#79](https://github.com/nghuuphuoc/bootstrapvalidator/issues/79): Improve [```updateStatus()``` method](http://bootstrapvalidator.com/api/#update-status) to make the plugin play well with another +* [#80](https://github.com/nghuuphuoc/bootstrapvalidator/issues/80): Add [```enabled``` option](http://bootstrapvalidator.com/settings/#fields) and [```enableFieldValidators()``` method](http://bootstrapvalidator.com/api/#enable-field-validators) to enable/disable all validators to given field +* [#90](https://github.com/nghuuphuoc/bootstrapvalidator/pull/90): Add ```bower.json``` file, thanks to [@ikanedo](https://github.com/ikanedo) +* [#3](https://github.com/nghuuphuoc/bootstrapvalidator/issues/3), [#92](https://github.com/nghuuphuoc/bootstrapvalidator/issues/92): Support more form controls on the same row +* Remove the ```columns``` option. Now the plugin works normally no matter how many columns the form uses +* [#102](https://github.com/nghuuphuoc/bootstrapvalidator/issues/102): The [```resetForm``` method](http://bootstrapvalidator.com/api/#reset-form) now only resets fields with validator rules +* [#82](https://github.com/nghuuphuoc/bootstrapvalidator/issues/82), [#84](https://github.com/nghuuphuoc/bootstrapvalidator/issues/84): The error messages aren't shown if the form field doesn't have label +* [#89](https://github.com/nghuuphuoc/bootstrapvalidator/issues/89): [```submitHandler```](http://bootstrapvalidator.com/settings/#submit-handler) or default submission isn't called after [remote validation](http://bootstrapvalidator.com/validators/remote/) completes + +## v0.3.0 (2014-03-10) + +* [#44](https://github.com/nghuuphuoc/bootstrapvalidator/issues/44): Rewrite entirely using Deferred +* [#26](https://github.com/nghuuphuoc/bootstrapvalidator/issues/26), [#27](https://github.com/nghuuphuoc/bootstrapvalidator/issues/27), [#67](https://github.com/nghuuphuoc/bootstrapvalidator/pull/67): Add [choice validator](http://bootstrapvalidator.com/validators/choice/), thanks to [@emilchristensen](https://github.com/emilchristensen) +* [#31](https://github.com/nghuuphuoc/bootstrapvalidator/issues/31): The [remote validator](http://bootstrapvalidator.com/validators/remote/) supports dynamic data +* [#36](https://github.com/nghuuphuoc/bootstrapvalidator/issues/36), [#58](https://github.com/nghuuphuoc/bootstrapvalidator/issues/58): Add method to [validate form](http://bootstrapvalidator.com/api/#validate) manually +* [#41](https://github.com/nghuuphuoc/bootstrapvalidator/issues/41): Disable submit button on successful form submit +* [#42](https://github.com/nghuuphuoc/bootstrapvalidator/issues/42): Add submit button to [```submitHandler()```](http://bootstrapvalidator.com/settings/#submit-handler) parameter +* [#48](https://github.com/nghuuphuoc/bootstrapvalidator/issues/48): Add optional [feedback icons](http://bootstrapvalidator.com/settings/#feedback-icons) +* [#64](https://github.com/nghuuphuoc/bootstrapvalidator/pull/64): Support [Danish zip code](http://bootstrapvalidator.com/validators/zipCode/), thanks to [@emilchristensen](https://github.com/emilchristensen) +* [#65](https://github.com/nghuuphuoc/bootstrapvalidator/pull/65): Support [Sweden zip code](http://bootstrapvalidator.com/validators/zipCode/), thanks to [@emilchristensen](https://github.com/emilchristensen) +* [#70](https://github.com/nghuuphuoc/bootstrapvalidator/issues/70): Support custom grid columns +* [#71](https://github.com/nghuuphuoc/bootstrapvalidator/issues/71): Show all errors +* [#76](https://github.com/nghuuphuoc/bootstrapvalidator/issues/76): Add [```resetForm()``` method](http://bootstrapvalidator.com/api/#reset-form) +* [#50](https://github.com/nghuuphuoc/bootstrapvalidator/issues/50): Don't validate disabled element +* [#51](https://github.com/nghuuphuoc/bootstrapvalidator/issues/51): Submit after submit doesn't work +* [#53](https://github.com/nghuuphuoc/bootstrapvalidator/issues/53), [#54](https://github.com/nghuuphuoc/bootstrapvalidator/pull/54): Fix [notEmpty validator](http://bootstrapvalidator.com/validators/notEmpty/) for radios and checkboxes, thanks to [@kristian-puccio](https://github.com/kristian-puccio) +* [#55](https://github.com/nghuuphuoc/bootstrapvalidator/issues/55): The plugin doesn't validate other fields if the [remote validator](http://bootstrapvalidator.com/validators/remote/) returns ```true``` +* [#62](https://github.com/nghuuphuoc/bootstrapvalidator/pull/62): The [callback validator](http://bootstrapvalidator.com/validators/callback/) passes wrong parameter, thanks to [@iplus](https://github.com/iplus) +* [#59](https://github.com/nghuuphuoc/bootstrapvalidator/pull/59): Add example for Rail field convention, thanks to [@narutosanjiv](https://github.com/narutosanjiv) +* [#60](https://github.com/nghuuphuoc/bootstrapvalidator/pull/60): Update the installation guide, thanks to [@vaz](https://github.com/vaz) +* [#73](https://github.com/nghuuphuoc/bootstrapvalidator/issues/73): Describe which version should be [included](http://bootstrapvalidator.com/getting-started/#including-library) in the Usage section + +## v0.2.2 (2014-01-07) + +* [#15](https://github.com/nghuuphuoc/bootstrapvalidator/issues/15): Focus to the first invalid element +* [#31](https://github.com/nghuuphuoc/bootstrapvalidator/issues/31): [remote validator](http://bootstrapvalidator.com/validators/remote/): Allow to set additional data to remote URL +* [#32](https://github.com/nghuuphuoc/bootstrapvalidator/issues/32), [#43](https://github.com/nghuuphuoc/bootstrapvalidator/issues/43), [#47](https://github.com/nghuuphuoc/bootstrapvalidator/issues/47): Only validate not empty field +* [#39](https://github.com/nghuuphuoc/bootstrapvalidator/issues/39): Validate existing fields only +* [#34](https://github.com/nghuuphuoc/bootstrapvalidator/issues/34): Avoid from calling form submit recursively +* [#40](https://github.com/nghuuphuoc/bootstrapvalidator/issues/40): Fix the issue when the form label doesn't have class + +## v0.2.1 (2013-11-08) + +* [#29](https://github.com/nghuuphuoc/bootstrapvalidator/issues/29): Upgrade Bootstrap to v3.0.2 +* [#30](https://github.com/nghuuphuoc/bootstrapvalidator/issues/30): Hide the error block containers before validating + +## v0.2.0 (2013-10-21) + +* [#24](https://github.com/nghuuphuoc/bootstrapvalidator/issues/24): Add [```live``` option](http://bootstrapvalidator.com/settings/#live) +* [#20](https://github.com/nghuuphuoc/bootstrapvalidator/issues/20): Add custom submit handler using [```submitHandler``` option](http://bootstrapvalidator.com/settings/#submit-handler) +* [#9](https://github.com/nghuuphuoc/bootstrapvalidator/issues/9): Add [creditCard validator](http://bootstrapvalidator.com/validators/creditCard/) +* [#18](https://github.com/nghuuphuoc/bootstrapvalidator/issues/18): Add [different validator](http://bootstrapvalidator.com/validators/different/) +* [#21](https://github.com/nghuuphuoc/bootstrapvalidator/issues/21): Add [callback validator](http://bootstrapvalidator.com/validators/callback/) +* [#22](https://github.com/nghuuphuoc/bootstrapvalidator/issues/22): Support form that labels are placed in extra small (```col-xs-```), small (```col-sm-```), medium (```col-md-```) elements +* [#25](https://github.com/nghuuphuoc/bootstrapvalidator/issues/25): The [regexp validator](http://bootstrapvalidator.com/validators/regexp/) does not work + +## v0.1.1 (2013-10-17) + +* Added [```submitButtons``` option](http://bootstrapvalidator.com/settings/#submit-buttons) +* [#16](https://github.com/nghuuphuoc/bootstrapvalidator/issues/16): Added disabling client side validation in HTML 5 +* [#17](https://github.com/nghuuphuoc/bootstrapvalidator/issues/17): Added support for default Bootstrap form without labels +* [#19](https://github.com/nghuuphuoc/bootstrapvalidator/issues/19): Added support for select box validator + +## v0.1.0 (2013-10-14) -v0.1.0 (2013-10-14) * First release -* Provide various validators - - between - - digits - - emailAddress - - greaterThan - - hexColor - - identical - - lessThan - - notEmpty - - regexp - - remote - - stringLength - - uri - - usZipCode \ No newline at end of file +* Provide various validators: + - [between validator](http://bootstrapvalidator.com/validators/between/) + - [digits validator](http://bootstrapvalidator.com/validators/digits/) + - [emailAddress validator](http://bootstrapvalidator.com/validators/emailAddress/) + - [greaterThan validator](http://bootstrapvalidator.com/validators/greaterThan/) + - [hexColor validator](http://bootstrapvalidator.com/validators/hexColor/) + - [identical validator](http://bootstrapvalidator.com/validators/identical/) + - [lessThan validator](http://bootstrapvalidator.com/validators/lessThan/) + - [notEmpty validator](http://bootstrapvalidator.com/validators/notEmpty/) + - [regexp validator](http://bootstrapvalidator.com/validators/regexp/) + - [remote validator](http://bootstrapvalidator.com/validators/remote/) + - [stringLength validator](http://bootstrapvalidator.com/validators/stringLength/) + - [uri validator](http://bootstrapvalidator.com/validators/uri/) + - [zipCode validator](http://bootstrapvalidator.com/validators/zipCode/) \ No newline at end of file diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md new file mode 100644 index 000000000..632b0df6b --- /dev/null +++ b/CONTRIBUTORS.md @@ -0,0 +1,114 @@ +# Contributors + +Contributions are welcome! + +Please notice that your code may be used as part of a commercial product if the pull request is merged. + +I would like to give big thanks to the following contributors: + +* [@abuzer](https://github.com/abuzer) +* [@aca02djr](https://github.com/aca02djr) +* [@adgrafik](https://github.com/adgrafik) +* [@adrian-dks](https://github.com/adrian-dks) +* [@AdwinTrave](https://github.com/AdwinTrave) +* [@AlaskanShade](https://github.com/AlaskanShade) +* [@alavers](https://github.com/alavers) +* [@Arkni](https://github.com/Arkni) +* [@Azuka](https://github.com/Azuka) +* [@bcamarneiro](https://github.com/bcamarneiro) +* [@beeglebug](https://github.com/beeglebug) +* [@bermo](https://github.com/bermo) +* [@blackfyre](https://github.com/blackfyre) +* [@caijh](https://github.com/caijh) +* [@CeRBeR666](https://github.com/CeRBeR666) +* [@cuchac](https://github.com/cuchac) +* [@cylon-v](https://github.com/cylon-v) +* [@desaretiuss](https://github.com/desaretiuss) +* [@dgmike](https://github.com/dgmike) +* [@Djarnis](https://github.com/Djarnis) +* [@dlcrush](https://github.com/dlcrush) +* [@dlucazeau](https://github.com/dlucazeau) +* [@dokterpasta](https://github.com/dokterpasta) +* [@easonhan007](https://github.com/easonhan007) +* [@egig](https://github.com/egig) +* [@emilchristensen](https://github.com/emilchristensen) +* [@ericnakagawa](https://github.com/ericnakagawa) +* [@etorres](https://github.com/etorres) +* [@evilchili](https://github.com/evilchili) +* [@fhferreira](https://github.com/fhferreira) +* [@figgaro](https://github.com/figgaro) +* [@filipac](https://github.com/filipac) +* [@Francismori7](https://github.com/Francismori7) +* [@gercheq](https://github.com/gercheq) +* [@grzesiek](https://github.com/grzesiek) +* [@henningda](https://github.com/henningda) +* [@i0](https://github.com/i0) +* [@ikanedo](https://github.com/ikanedo) +* [@iplus](https://github.com/iplus) +* [@jazzzz](https://github.com/jazzzz) +* [@jcnmulio](https://github.com/jcnmulio) +* [@jhadenfeldt](https://github.com/jhadenfeldt) +* [@jjshoe](https://github.com/jjshoe) +* [@johanronn77](https://github.com/johanronn77) +* [@jswale](https://github.com/jswale) +* [@Jvanderheide](https://github.com/Jvanderheide) +* [@jzhang6](https://github.com/jzhang6) +* [@kenny-evitt](https://github.com/kenny-evitt) +* [@khangvm53](https://github.com/khangvm53) +* [@kristian-puccio](https://github.com/kristian-puccio) +* [@kromit](https://github.com/kromit) +* [@leedorian](https://github.com/leedorian) +* [@leegtang](https://github.com/leegtang) +* [@lloydde](https://github.com/lloydde) +* [@logemann](https://github.com/logemann) +* [@lukaszbanasiak](https://github.com/lukaszbanasiak) +* [@manish-in-java](https://github.com/manish-in-java) +* [@maramazza](https://github.com/maramazza) +* [@marceloampuerop6](https://github.com/marceloampuerop6) +* [@marcuscarvalho6](https://github.com/marcuscarvalho6) +* [@markocrni](https://github.com/markocrni) +* [@MartinDevillers](https://github.com/MartinDevillers) +* [@mattrick](https://github.com/mattrick) +* [@mbezhanov](https://github.com/mbezhanov) +* [@mchrapka](https://github.com/mchrapka) +* [@mgibas](https://github.com/mgibas) +* [@mike1e](https://github.com/mike1e) +* [@morrizon](https://github.com/morrizon) +* [@mraiur](https://github.com/mraiur) +* [@MrC0mm0n](https://github.com/MrC0mm0n) +* [@mrpollo](https://github.com/mrpollo) +* [@narutosanjiv](https://github.com/narutosanjiv) +* [@nathanrosspowell](https://github.com/nathanrosspowell) +* [@neilime](https://github.com/neilime) +* [@oleg-voloshyn](https://github.com/oleg-voloshyn) +* [@paquitodev](https://github.com/paquitodev) +* [@patmoore](https://github.com/patmoore) +* [@phillprice](https://github.com/phillprice) +* [@pRieStaKos](https://github.com/pRieStaKos) +* [@q-state](https://github.com/q-state) +* [@Relequestual](https://github.com/Relequestual) +* [@roryprimrose](https://github.com/roryprimrose) +* [@rtbfreitas](https://github.com/rtbfreitas) +* [@ryan2049](https://github.com/ryan2049) +* [@shamiao](https://github.com/shamiao) +* [@shineability](https://github.com/shineability) +* [@smeagol74](https://github.com/smeagol74) +* [@stephengreentree](https://github.com/stephengreentree) +* [@stepin](https://github.com/stepin) +* [@sventech](https://github.com/sventech) +* [@talberti](https://github.com/talberti) +* [@thisisclement](https://github.com/thisisclement) +* [@thomaslhotta](https://github.com/thomaslhotta) +* [@thx2001r](https://github.com/thx2001r) +* [@tiagofontella](https://github.com/tiagofontella) +* [@tomByrer](https://github.com/tomByrer) +* [@trondulseth](https://github.com/trondulseth) +* [@troymccabe](https://github.com/troymccabe) +* [@tsuyoshifujii](https://github.com/tsuyoshifujii) +* [@tureki](https://github.com/tureki) +* [@ulsa](https://github.com/ulsa) +* [@vadail](https://github.com/vadail) +* [@vaz](https://github.com/vaz) +* [@yakidahan](https://github.com/yakidahan) +* [@zmira](https://github.com/zmira) +* ... might be you! Let's [fork](https://github.com/nghuuphuoc/bootstrapvalidator/fork) and make a pull request. diff --git a/Gruntfile.js b/Gruntfile.js index 270264c7e..428f10321 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -1,50 +1,69 @@ module.exports = function(grunt) { grunt.initConfig({ + // --- + // Variables + // --- + pkg: grunt.file.readJSON('package.json'), - buildDir: 'dist', + dirs: { + src: 'src', + dist: 'dist', + test: 'test' + }, banner: [ - '/**', - ' * BootstrapValidator v<%= pkg.version %> (<%= pkg.homepage %>)', + '/*!', + ' * BootstrapValidator (<%= pkg.homepage %>)', + ' * <%= pkg.description %>', ' *', - ' * A jQuery plugin to validate form fields. Use with Bootstrap 3', - ' *', - ' * @author Nguyen Huu Phuoc ', - ' * @copyright (c) 2013 Nguyen Huu Phuoc', - ' * @license MIT', - ' */\n\n' + ' * @version v<%= pkg.version %>, built on <%= grunt.template.today("yyyy-mm-dd h:MM:ss TT") %>', + ' * @author <%= pkg.author.url %>', + ' * @copyright (c) 2013 - <%= grunt.template.today("yyyy") %> Nguyen Huu Phuoc', + ' * @license Commercial: <%= pkg.homepage %>/license/', + ' * Non-commercial: http://creativecommons.org/licenses/by-nc-nd/3.0/', + ' */\n' ].join('\n'), + // --- + // Tasks + // --- + copy: { main: { files: [ - { cwd: 'src/css', src: '**', dest: '<%= buildDir %>/css', expand: true, flatten: true, filter: 'isFile' } + { cwd: '<%= dirs.src %>/css', src: '**', dest: '<%= dirs.dist %>/css', expand: true, flatten: true, filter: 'isFile' }, + { cwd: '<%= dirs.src %>/js/language', src: '**', dest: '<%= dirs.dist %>/js/language', expand: true, flatten: true, filter: 'isFile' } ] } }, cssmin: { - minify: { expand: true, cwd: 'src/css/', src: ['*.css'], dest: '<%= buildDir %>/css/', ext: '.min.css' }, + minify: { expand: true, cwd: '<%= dirs.src %>/css/', src: ['*.css'], dest: '<%= dirs.dist %>/css/', ext: '.min.css' }, add_banner: { options: { + stripBanners: true, banner: '<%= banner %>' }, files: { - '<%= buildDir %>/css/bootstrapValidator.min.css': ['src/css/bootstrapValidator.css'] + '<%= dirs.dist %>/css/bootstrapValidator.min.css': ['<%= dirs.src %>/css/bootstrapValidator.css'] } } }, concat: { - options: { - separator: ';', - stripBanners: true, - banner: '<%= banner %>' + source: { + options: { + separator: ';', + stripBanners: true, + banner: '<%= banner %>' + }, + src: ['<%= dirs.src %>/js/bootstrapValidator.js', '<%= dirs.src %>/js/validator/*.js'], + dest: '<%= dirs.dist %>/js/bootstrapValidator.js' }, - dist: { - src: ['src/js/bootstrapValidator.js', 'src/js/validator/*.js'], - dest: '<%= buildDir %>/js/bootstrapValidator.js' + test: { + src: ['<%= dirs.test %>/spec/*.js', '<%= dirs.test %>/spec/validator/*.js'], + dest: '<%= dirs.test %>/spec.js' } }, @@ -53,28 +72,56 @@ module.exports = function(grunt) { banner: '<%= banner %>' }, build: { - src: ['<%= buildDir %>/js/bootstrapValidator.js'], - dest: '<%= buildDir %>/js/bootstrapValidator.min.js' + src: ['<%= dirs.dist %>/js/bootstrapValidator.js'], + dest: '<%= dirs.dist %>/js/bootstrapValidator.min.js' + } + }, + + jshint: { + all: [ + '<%= dirs.src %>/js/**/*.js' + ], + options: { + browser: true, + camelcase: true, + curly: true, + eqeqeq: true, + eqnull: true, + es3: true, + expr: true, + laxbreak: true, // Allow line breaking before && or || + loopfunc: true, + newcap: true, + noarg: true, + onevar: true, + sub: true, + undef: true, + white: true } }, watch: { - scripts: { - files: ['src/css/**', 'src/js/**'], + source: { + files: ['<%= dirs.src %>/css/**', '<%= dirs.src %>/js/**'], tasks: ['build'], options: { spawn: false } + }, + test: { + files: ['<%= dirs.test %>/spec/**'], + tasks: ['concat:test'] } } }); grunt.registerTask('default', 'build'); - grunt.registerTask('build', ['copy', 'cssmin', 'concat', 'uglify']); + grunt.registerTask('build', ['copy', 'cssmin', 'concat', 'uglify']); grunt.loadNpmTasks('grunt-contrib-concat'); grunt.loadNpmTasks('grunt-contrib-copy'); grunt.loadNpmTasks('grunt-contrib-cssmin'); + grunt.loadNpmTasks('grunt-contrib-jshint'); grunt.loadNpmTasks('grunt-contrib-uglify'); grunt.loadNpmTasks('grunt-contrib-watch'); }; diff --git a/LICENSE.txt b/LICENSE.txt new file mode 100644 index 000000000..829416bc7 --- /dev/null +++ b/LICENSE.txt @@ -0,0 +1,58 @@ +BootstrapValidator Licenses +--- + +BootstrapValidator is free to use in non-commercial projects under the terms of the Creative +Commons BY-NC-ND 3.0 (http://creativecommons.org/licenses/by-nc-nd/3.0/) license. +If you use BootstrapValidator in commercial projects and products, you must purchase a commercial license. + +For more information about the license, see http://bootstrapvalidator.com/license/ + +## BootstrapValidator commercial license agreement + +This Commercial License Agreement is a binding legal agreement between you and Nguyen Huu Phuoc. +By installing, copying, or using BootstrapValidator (the Software), you agree to be bound +by these terms of this Agreement. + +### Grant of license + +Subject to the payment of the fee required and the conditions herein, you are hereby granted +a non-exclusive, non-transferable right to use BootstrapValidator (the Software) to design +and develop commercial applications (Applications). + +### Developer grant + +The BootstrapValidator Commercial Developer License grants one license for you as one designated +user (Developer) to use the Software for developing Applications. A Developer is an individual +who implements the Software into Applications, most often writing the necessary code to do so. +You must purchase another separate license to the Software for each and any additional Developer, +or purchase a BootstrapValidator Commercial Organization License to cover your entire organization. + +### Organization grant + +The BootstrapValidator Commercial Organization License grants one license for your Organization +as one designated, collective user (Organization) to use the Software for developing Applications. +There is no limit or restriction of the number of Developers within your Organization who +may develop Applications using the Software. + +### Usage + +You are granted the right to use and to modify the source code of the Software for use in +Applications. There is no limit or restriction of the number of Applications which use the +Software. You own any original work authored by you. Nguyen Huu Phuoc continues to retain +all copyright and other intellectual property rights in the Software. You are not permitted +to move, remove, edit, or obscure any copyright, trademark, attribution, warning or disclaimer +notices in the Software. + +You may use the Software only to create Applications that are significantly different than +and do not compete with the Software. You are granted the license to distribute the Software +as part of your Applications on a royalty-free basis. Users of your Applications are permitted +to use the Software or your modifications of the Software as part of your Applications. +Users do not need to purchase their own commercial license for the Software, so long as they +are not acting as Developers, developing their own commercial Applications with the Software. + +### Warranties and remedies + +The Software is provided "as is", without warranty of any kind, express or implied, including +but not limited to the warranties of merchantability, fitness for a particular purpose and +non-infringement. Nguyen Huu Phuoc's entire liability and your exclusive remedy under this +agreement shall be return of the price paid for the Software. \ No newline at end of file diff --git a/README.md b/README.md index ec4012b6f..9ff8e8bba 100644 --- a/README.md +++ b/README.md @@ -1,198 +1,5 @@ -# BootstrapValidator +This repository is for anyone who still use the BootstrapValidator. -A jQuery plugin to validate form fields. Use with Bootstrap 3 +__It's no longer supported.__ -## Features - -* Built from scratch -* Many built-in [validators](#validators) - -## Required - -* [jQuery](http://jquery.com/) -* [Bootstrap 3](http://getbootstrap.com/) - -## Demo - -You can see the live demo here: - -* [Sample demo](https://rawgithub.com/nghuuphuoc/bootstrapvalidate/master/demo/index.html) -* [Validator examples](https://rawgithub.com/nghuuphuoc/bootstrapvalidate/master/demo/validators.html) - -## Usage - -Since the bootstrapValidator plugin requires jQuery and Bootstrap 3, you have to include the required CSS and JS files to your page: - -```html - - - - - - -``` - -Call the plugin to validate the form as following: - -```javascript -$(document).ready(function() { - $(
).bootstrapValidator({ - // The default error message for all fields - // You can specify the error message for any fields - message: ..., - - // The submit buttons selector - // These buttons will be disabled when the form input are invalid - submitButtons: ..., - - // The fields which need to be validated - fields: { - ... - // The field name - : { - // The default error message for this field - message: ..., - - // Array of validators - validators: { - ... - : - ... - } - } - ... - } - }); -}); -``` - -The `````` can be the name of the built-in validator which are described in the [Validators](#validators) section - -## Validators - -Below is the list of built-in validators sorted in alphabetical order: - -Validator name | Description -----------------------------------------|------------ -[between](#between-validator) | Check if the input value is between (strictly or not) two given numbers -digits | Return true if the value contains only digits -emailAddress | Validate an email address -[greaterThan](#greaterthan-validator) | Return true if the value is greater than or equals to given number -hexColor | Validate a hex color -[identical](#identical-validator) | Check if the value is the same as one of particular field -[lessThan](#lessthan-validator) | Return true if the value is less than or equals to given number -notEmpty | Check if the value is empty -[regexp](#regexp-validator) | Check if the value matches given Javascript regular expression -[remote](#remote-validator) | Perform remote checking via Ajax request -[stringLength](#stringlength-validator) | Validate the length of a string -uri | Validate an URL address -usZipCode | Validate a US zip code - -The validator options are described in the following section: - -### Between Validator - -Option name | Default | Description -------------|---------|------------ -message | n/a | The error message -min | n/a | The lower value in the range. This option is required -max | n/a | The upper value in the range. This option is required -inclusive | true | Can be true or false. If true, the input value must be in the range strictly - -### GreaterThan Validator - -| Option name | Default | Description -|-------------|---------|------------ -| message | n/a | The error message -| value | n/a | The number to make a comparison to. This option is required -| inclusive | n/a | Can be true or false -| | | If true, the input value must be greater than the comparison one -| | | If false, the input value must be greater than or equal to the comparison one - -### Identical Validator - -Option name | Default | Description -------------|---------|------------ -message | n/a | The error message -field | n/a | The name of field that will be used to compare with current one. This option is required - -### LessThan Validator - -| Option name | Default | Description -| ------------|---------|------------ -| message | n/a | The error message -| value | n/a | The number to make a comparison to. This option is required -| inclusive | n/a | Can be true or false -| | | If true, the input value must be less than the comparison one -| | | If false, the input value must be less than or equal to the comparison one - -### Regexp Validator - -Option name | Default | Description -------------|---------|------------ -message | n/a | The error message -regexp | n/a | The Javascript regular expression. This option is required - -### Remote Validator - -| Option name | Default | Description -| ------------|---------|------------ -| message | n/a | The error message -| url | n/a | The remote URL. -| | | The remote URL must response an encoded JSON of array containing the 'valid' key -| | | This option is required - -### StringLength Validator - -Option name | Default | Description -------------|---------|------------ -message | n/a | The error message -min | n/a | The minimum length -max | n/a | The maximum length. One of 'min', 'max' options is required - -## Build - -BootstrapValidator uses [grunt](http://gruntjs.com) to simplify building process. - -From the BootstrapValidator root directory, execute the following commands to install the dependent packages (the administrator permission might be required): - -```bash -$ npm install grunt --save-dev -$ npm install grunt-contrib-concat --save-dev -$ npm install grunt-contrib-copy --save-dev -$ npm install grunt-contrib-cssmin --save-dev -$ npm install grunt-contrib-uglify --save-dev -$ npm install grunt-contrib-watch --save-dev -``` - -Then, uses grunt to build: - -```bash -$ grunt -``` - -If you want grunt to generate scripts whenever the original scripts (located in ```src```) change, use the following command: - -```bash -$ grunt watch -``` - -The generated scripts (including source and compressed versions) are placed inside the ```dist``` directory. - -## Release History - -Look at the [Change Log](CHANGELOG.md) - -## Author - -Nguyen Huu Phuoc ([Email](mailto: phuoc@huuphuoc.me) / [Twitter](http://twitter.com/nghuuphuoc) / [Github](http://github.com/nghuuphuoc)) - -Big thanks to the contributors: - -* Vu Minh Khang ([Email](mailto: khangvm530@gmail.com) / [Github](https://github.com/khangvm53)) - -## License - -Copyright (c) 2013 Nguyen Huu Phuoc - -BootstrapValidator is licensed under the MIT license. \ No newline at end of file +__Please upgrade to use [FormValidation](http://formvalidation.io).__ diff --git a/bootstrapValidator.jquery.json b/bootstrapValidator.jquery.json new file mode 100644 index 000000000..aab56fe72 --- /dev/null +++ b/bootstrapValidator.jquery.json @@ -0,0 +1,26 @@ +{ + "name": "bootstrapValidator", + "version": "0.5.3", + "title": "BootstrapValidator", + "author": { + "name": "Nguyen Huu Phuoc", + "email": "phuoc@huuphuoc.me", + "url": "https://twitter.com/nghuuphuoc" + }, + "licenses": [ + { + "url": "http://bootstrapvalidator.com/license/" + } + ], + "dependencies": { + "jquery": ">= 1.9.1", + "bootstrap": ">= 3.0.0" + }, + "description": "The best jQuery plugin to validate form fields. Designed to use with Bootstrap 3", + "keywords": ["jQuery", "plugin", "validate", "validator", "form", "Bootstrap"], + "homepage": "http://bootstrapvalidator.com", + "bugs": "https://github.com/nghuuphuoc/bootstrapvalidator/issues", + "maintainers": [ + { "name": "Nguyen Huu Phuoc", "email": "phuoc@huuphuoc.me", "url": "https://twitter.com/nghuuphuoc" } + ] +} \ No newline at end of file diff --git a/bower.json b/bower.json new file mode 100644 index 000000000..800fc6b9b --- /dev/null +++ b/bower.json @@ -0,0 +1,33 @@ +{ + "name": "bootstrapvalidator", + "description": "The best jQuery plugin to validate form fields. Designed to use with Bootstrap 3", + "version": "0.5.3", + "ignore": [ + "demo", + "screenshots", + "test", + "vendor", + "*.md", + "bootstrapValidator.jquery.json", + "Gruntfile.js", + "package.json" + ], + "main": [ + "dist/css/bootstrapValidator.css", + "dist/js/bootstrapValidator.js" + ], + "license": "http://bootstrapvalidator.com/license/", + "keywords": ["jQuery", "plugin", "validate", "validator", "form", "Bootstrap"], + "authors": [ + { "name": "Nguyen Huu Phuoc", "email": "phuoc@huuphuoc.me"," homepage": "https://twitter.com/nghuuphuoc" } + ], + "homepage": "http://bootstrapvalidator.com", + "repository": { + "type": "git", + "url": "https://github.com/nghuuphuoc/bootstrapvalidator.git" + }, + "dependencies": { + "jquery": ">= 1.9.1", + "bootstrap": ">= 3.0.0" + } +} diff --git a/demo/ajaxSubmit.html b/demo/ajaxSubmit.html new file mode 100644 index 000000000..3e6a39b95 --- /dev/null +++ b/demo/ajaxSubmit.html @@ -0,0 +1,122 @@ + + + + Using Ajax to submit data + + + + + + + + + +
+
+
+ + + +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+
+ +
+
+ +
+
+
+ + + + \ No newline at end of file diff --git a/demo/ajaxSubmit.php b/demo/ajaxSubmit.php new file mode 100644 index 000000000..5442c2762 --- /dev/null +++ b/demo/ajaxSubmit.php @@ -0,0 +1,6 @@ + sprintf('Welcome %s', $userName), +)); diff --git a/demo/attribute.html b/demo/attribute.html new file mode 100644 index 000000000..d86345d2e --- /dev/null +++ b/demo/attribute.html @@ -0,0 +1,218 @@ + + + + BootstrapValidator demo + + + + + + + + + +
+
+ +
+
+ + +
+
+ +
+ +
+
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+
+ +
+
+ +
+
+ +
+
+
+ +
+ +
+ (YYYY/MM/DD) +
+
+ +
+ +
+ +
+
+ +
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+
+ +
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+
+ +
+
+ +
+
+
+
+
+ +
+
+ + + + \ No newline at end of file diff --git a/demo/choice.html b/demo/choice.html new file mode 100644 index 000000000..557e2cdff --- /dev/null +++ b/demo/choice.html @@ -0,0 +1,128 @@ + + + + BootstrapValidator demo + + + + + + + + + +
+
+
+
+ + +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+
+ +
+ +
+ +
+
+ +
+
+ +
+
+
+
+
+
+
+ + + + \ No newline at end of file diff --git a/demo/collapse.html b/demo/collapse.html new file mode 100644 index 000000000..8910e4d0b --- /dev/null +++ b/demo/collapse.html @@ -0,0 +1,267 @@ + + + + BootstrapValidator demo + + + + + + + + +
+
+
+ + +
+
+ +
+
+

Account

+
+
+
+
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+
+
+
+ + +
+
+

Personal

+
+
+
+
+ +
+ +
+
+ +
+
+ +
+ +
+
+ +
+
+ +
+
+ +
+
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+
+
+
+ + +
+
+

Contact

+
+
+
+
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+
+ +
+
+
+
+
+
+
+
+
+
+ + + + \ No newline at end of file diff --git a/demo/container.html b/demo/container.html new file mode 100644 index 000000000..cb8d65728 --- /dev/null +++ b/demo/container.html @@ -0,0 +1,99 @@ + + + + BootstrapValidator demo + + + + + + + + + +
+
+ +
+
+ + +
+
+ +
+ + +
+
+ + +
+
+ +
+ +
+ +
+
+ +
+
+ +
+
+
+
+
+ +
+
+ + + + \ No newline at end of file diff --git a/demo/container2.html b/demo/container2.html new file mode 100644 index 000000000..aff0b88c1 --- /dev/null +++ b/demo/container2.html @@ -0,0 +1,169 @@ + + + + BootstrapValidator demo + + + + + + + + +
+
+ +
+
+ + +
+
+ +
+ +
+
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+
+ +
+
+ +
+
+ +
+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+
+
+ +
+
+ + + + \ No newline at end of file diff --git a/demo/container3.html b/demo/container3.html new file mode 100644 index 000000000..22004af98 --- /dev/null +++ b/demo/container3.html @@ -0,0 +1,179 @@ + + + + BootstrapValidator demo + + + + + + + + +
+
+
+ + +
+
+ +
+ +
+
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+
+ +
+
+ +
+
+ +
+
+
+ +
+
+ +
+
+
+
+
+
+ + + + \ No newline at end of file diff --git a/demo/container4.html b/demo/container4.html new file mode 100644 index 000000000..758194fa9 --- /dev/null +++ b/demo/container4.html @@ -0,0 +1,185 @@ + + + + BootstrapValidator demo + + + + + + + + +
+
+ +
+
+ + +
+
+ +
+ +
+
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+
+ +
+
+ +
+
+ +
+
+
+ +
+
+
    +
    +
    + +
    +
    + +
    +
    +
    +
    +
    + +
    +
    + + + + \ No newline at end of file diff --git a/demo/date.html b/demo/date.html new file mode 100644 index 000000000..9bfef7d2c --- /dev/null +++ b/demo/date.html @@ -0,0 +1,185 @@ + + + + BootstrapValidator demo + + + + + + + + + + + + + + + + +
    +
    + +
    +
    + + +
    +
    + +
    + +
    +
    + +
    + +
    + +
    +
    + +
    + +
    + +
    +
    + +
    + +
    + +
    +
    + +
    + +
    + +
    +
    + + +
    + +
    +
    + + +
    +
    +
    + +
    +
    + +
    +
    +
    +
    +
    + +
    +
    + + + + \ No newline at end of file diff --git a/demo/defaultMessage.html b/demo/defaultMessage.html new file mode 100644 index 000000000..d2dd13a6a --- /dev/null +++ b/demo/defaultMessage.html @@ -0,0 +1,317 @@ + + + + BootstrapValidator demo + + + + + + + + + +
    +
    +
    + + +
    +
    + +
    + +
    +
    + +
    +
    + +
    + +
    + +
    +
    + +
    + +
    + +
    +
    + +
    + +
    + +
    +
    + +
    + +
    + +
    +
    + +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    +
    + +
    + +
    + +
    +
    + +
    + +
    + +
    +
    + +
    + +
    + +
    +
    + +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    +
    + +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    + + + + \ No newline at end of file diff --git a/demo/dynamic.html b/demo/dynamic.html new file mode 100644 index 000000000..1f2bf7f7e --- /dev/null +++ b/demo/dynamic.html @@ -0,0 +1,166 @@ + + + + BootstrapValidator demo + + + + + + + + + +
    +
    + +
    +
    + + +
    +
    + +
    + +
    +
    + +
    +
    +
    +
    + +
    +
    + +
    +
    + +
    + +
    +
    + +
    + +
    + +
    +
    +
    + +
    + +
    +
    + +
    + +
    + +
    +
    +
    + +
    +
    + +
    +
    +
    +
    +
    + +
    +
    + + + + \ No newline at end of file diff --git a/demo/dynamic2.html b/demo/dynamic2.html new file mode 100644 index 000000000..15f86180f --- /dev/null +++ b/demo/dynamic2.html @@ -0,0 +1,131 @@ + + + + BootstrapValidator demo + + + + + + + + + +
    +
    +
    + + +
    +
    + +
    + +
    +
    +
    + + +
    +
    +
    + + + + +
    +
    + +
    +
    +
    +
    +
    +
    + + + + \ No newline at end of file diff --git a/demo/dynamic3.html b/demo/dynamic3.html new file mode 100644 index 000000000..2a8e807b6 --- /dev/null +++ b/demo/dynamic3.html @@ -0,0 +1,200 @@ + + + + BootstrapValidator demo + + + + + + + + + +
    +
    +
    + + +

    Please enter the information of sender and receiver:

    + +
    +
    + Sender + +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + Receiver +
    +
    +
    + +
    +
    +
    + + +
    + +
    +
    + +
    +
    +
    +
    +
    +
    + + + + \ No newline at end of file diff --git a/demo/dynamic4.html b/demo/dynamic4.html new file mode 100644 index 000000000..ef4e3257e --- /dev/null +++ b/demo/dynamic4.html @@ -0,0 +1,182 @@ + + + + BootstrapValidator demo + + + + + + + + + +
    +
    +
    + + +
    +
    + +
    + +
    +
    + +
    + +
    +
    + +
    +
    + +
    +
    +
    + +
    +
    + CSS +

    Choose the frameworks that support responsive:

    + +
    +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    +
    +
    +
    + +
    +
    + Javascript +

    Name 4 Javascript frameworks you have heard about

    + +
    +
    + +
    +
    +
    +
    + +
    +
    +
    +
    + +
    +
    +
    +
    + +
    +
    +
    +
    + +
    +
    + +
    +
    +
    +
    +
    +
    + + + + \ No newline at end of file diff --git a/demo/enable.html b/demo/enable.html new file mode 100644 index 000000000..b4c8b3bff --- /dev/null +++ b/demo/enable.html @@ -0,0 +1,213 @@ + + + + BootstrapValidator demo + + + + + + + + + +
    +
    + +
    +
    + + +
    +
    + +
    +
    + +
    +
    + +
    +
    +
    + +
    +
    + +
    + +
    +
    + +
    + +
    + +
    +
    + +
    + +
    + +
    +
    + +
    + +
    + + Required if you choose United States country +
    +
    +
    + +
    +
    + +
    +
    +
    +
    +
    + +
    +
    + + + + \ No newline at end of file diff --git a/demo/enable2.html b/demo/enable2.html new file mode 100644 index 000000000..eed53e854 --- /dev/null +++ b/demo/enable2.html @@ -0,0 +1,112 @@ + + + + BootstrapValidator demo + + + + + + + + + +
    +
    +
    + + +
    +
    + +
    + +
    +
    + +
    + +
    + + Leave it blank if you don't want to change it +
    +
    + +
    + +
    + + Required if the password above is not empty +
    +
    + +
    +
    + +
    +
    +
    +
    +
    +
    + + + + \ No newline at end of file diff --git a/demo/event.html b/demo/event.html new file mode 100644 index 000000000..f231f1d17 --- /dev/null +++ b/demo/event.html @@ -0,0 +1,321 @@ + + + + BootstrapValidator demo + + + + + + + + +
    +
    + +
    +
    + + +
    +
    + +
    + +
    +
    + +
    +
    + +
    + +
    + +
    +
    + +
    + +
    + +
    +
    + +
    + +
    + +
    +
    + +
    + +
    + +
    +
    + +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    +
    + +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    +
    + +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    +
    + +
    +
    + + +
    +
    +
    +
    +
    + +
    +
    + + + + \ No newline at end of file diff --git a/demo/event2.html b/demo/event2.html new file mode 100644 index 000000000..824569d82 --- /dev/null +++ b/demo/event2.html @@ -0,0 +1,88 @@ + + + + BootstrapValidator demo + + + + + + + + + +
    +
    +
    + + +
    +
    + +
    +
    + Singapore + +
    +
    +
    + +
    +
    + +
    +
    + +
    +
    +
    +
    +
    +
    + + + + \ No newline at end of file diff --git a/demo/event3.html b/demo/event3.html new file mode 100644 index 000000000..6658956e7 --- /dev/null +++ b/demo/event3.html @@ -0,0 +1,100 @@ + + + + BootstrapValidator demo + + + + + + + + + +
    +
    +
    + + +
    +
    + +
    + +
    +
    + +
    + +
    + +
    +
    + +
    +
    + +
    +
    +
    +
    +
    +
    + + + + \ No newline at end of file diff --git a/demo/feedbackIcons.html b/demo/feedbackIcons.html new file mode 100644 index 000000000..f22ec8106 --- /dev/null +++ b/demo/feedbackIcons.html @@ -0,0 +1,166 @@ + + + + BootstrapValidator demo + + + + + + + + +
    +
    +
    + + +
    +
    + +
    + +
    +
    + +
    +
    + +
    + +
    + +
    +
    + +
    + +
    + +
    +
    + +
    + +
    + +
    +
    + +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    +
    + +
    +
    +
      +
      +
      + +
      +
      + +
      +
      +
      +
      +
      + + + + \ No newline at end of file diff --git a/demo/file.html b/demo/file.html new file mode 100644 index 000000000..186c7a6c6 --- /dev/null +++ b/demo/file.html @@ -0,0 +1,122 @@ + + + + BootstrapValidator demo + + + + + + + + + +
      +
      +
      + + +
      +
      + +
      + + Choose a pdf file. +
      +
      + +
      + +
      + + Choose a pdf file with a size more than 1M. +
      +
      + +
      + +
      + + Choose a pdf file with a size less than 10M. +
      +
      + +
      + +
      + + Choose a pdf file with a size between 1M and 10M. +
      +
      + +
      +
      + +
      +
      +
      +
      +
      +
      + + + + \ No newline at end of file diff --git a/demo/formWithoutLabels.html b/demo/formWithoutLabels.html deleted file mode 100644 index 66a9d6c69..000000000 --- a/demo/formWithoutLabels.html +++ /dev/null @@ -1,109 +0,0 @@ - - - - BootstrapValidator demo - - - - - - - - - -
      -
      -
      -
      -
      -

      Sign up

      -
      - -
      -
      -
      - -
      - -
      - -
      - -
      - -
      - -
      - -
      - -
      - -
      -
      -
      -
      -
      -
      -
      - - - - \ No newline at end of file diff --git a/demo/group.html b/demo/group.html new file mode 100644 index 000000000..e00696f0e --- /dev/null +++ b/demo/group.html @@ -0,0 +1,144 @@ + + + + BootstrapValidator demo + + + + + + + + + +
      +
      +
      + + +
      +
      +
      + +
      + +
      +
      +
      + +
      + +
      +
      +
      + +
      + +
      + +
      +
      + +
      + +
      + +
      +
      + +
      + +
      + +
      +
      + +
      +
      + +
      +
      +
      +
      +
      +
      + + + + \ No newline at end of file diff --git a/demo/html5.html b/demo/html5.html new file mode 100644 index 000000000..433aa9b54 --- /dev/null +++ b/demo/html5.html @@ -0,0 +1,110 @@ + + + + BootstrapValidator demo + + + + + + + + + +
      +
      + +
      +
      + + +
      +
      + +
      + +
      +
      + +
      +
      + +
      + +
      + +
      +
      + +
      + +
      + +
      +
      + +
      + +
      + +
      +
      + +
      + +
      + +
      +
      + +
      + +
      + + +
      +
      + +
      + +
      + +
      +
      + +
      +
      + +
      +
      +
      +
      +
      + +
      +
      + + + + \ No newline at end of file diff --git a/demo/i18n.html b/demo/i18n.html new file mode 100644 index 000000000..061700d6c --- /dev/null +++ b/demo/i18n.html @@ -0,0 +1,316 @@ + + + + BootstrapValidator demo + + + + + + + + + + +
      +
      +
      + + +
      +
      + +
      + +
      +
      + +
      +
      + +
      + +
      + +
      +
      + +
      + +
      + +
      +
      + +
      + +
      + +
      +
      + +
      + +
      + +
      +
      + +
      + +
      +
      + +
      +
      + +
      +
      + +
      +
      +
      + +
      + +
      + +
      +
      + +
      + +
      + +
      +
      + +
      + +
      + +
      +
      + +
      + +
      +
      + +
      +
      + +
      +
      + +
      +
      + +
      +
      + +
      +
      +
      + +
      + +
      +
      + +
      +
      + +
      +
      + +
      +
      + +
      +
      + +
      +
      + +
      +
      + +
      +
      + +
      +
      +
      + +
      +
      + + +
      +
      +
      +
      +
      +
      + + + + \ No newline at end of file diff --git a/demo/index.html b/demo/index.html index ef945ea3b..2dd08187b 100644 --- a/demo/index.html +++ b/demo/index.html @@ -6,7 +6,10 @@ - + + + + @@ -20,7 +23,17 @@

      Sign up

      -
      + +
      + +
      + +
      +
      + +
      +
      +
      @@ -49,9 +62,124 @@

      Sign up

      +
      + +
      +
      + +
      +
      + +
      +
      + +
      +
      +
      + +
      + +
      + (YYYY/MM/DD) +
      +
      + +
      + +
      +
      + +
      +
      + +
      +
      + +
      +
      + +
      +
      + +
      +
      +
      + +
      + +
      +
      + +
      +
      + +
      +
      + +
      +
      + +
      +
      + +
      +
      + +
      +
      + +
      +
      + +
      +
      +
      + +
      + +
      + +
      +
      +
      - + + + +
      @@ -63,14 +191,42 @@

      Sign up

      diff --git a/demo/invisible.html b/demo/invisible.html new file mode 100644 index 000000000..f805f6938 --- /dev/null +++ b/demo/invisible.html @@ -0,0 +1,124 @@ + + + + BootstrapValidator demo + + + + + + + + + +
      +
      + +
      +
      + + +
      +
      + +
      + +
      +
      + +
      +
      + +
      + +
      + +
      +
      + +
      +
      + + + +
      + +
      + +
      +
      + +
      +
      + + + +
      +
      + +
      +
      +
      +
      +
      + +
      +
      + + + + \ No newline at end of file diff --git a/demo/message.html b/demo/message.html new file mode 100644 index 000000000..d0c583fc6 --- /dev/null +++ b/demo/message.html @@ -0,0 +1,138 @@ + + + + BootstrapValidator demo + + + + + + + + + +
      +
      + + +
      +
      +
      + +
      + +
      +
      + +
      + +
      + +
      +
      + +
      + +
      + +
      +
      + +
      +
      + +
      +
      +
      +
      +
      + + + + \ No newline at end of file diff --git a/demo/multiple.html b/demo/multiple.html new file mode 100644 index 000000000..98a13f8db --- /dev/null +++ b/demo/multiple.html @@ -0,0 +1,149 @@ + + + + BootstrapValidator demo + + + + + + + + + +
      +
      +
      +
      + + +
      +
      + +
      +
      + +
      +
      + +
      +
      + +
      +
      +
      + +
      + +
      +
      + +
      +
      + +
      +
      + +
      +
      + +
      +
      + +
      +
      + +
      +
      +
      + +
      + +
      + +
      +
      +
      +
      + +
      +
      +
      +
      + +
      +
      +
      +
      + +
      +
      + +
      +
      + +
      +
      +
      +
      +
      +
      +
      + + + + \ No newline at end of file diff --git a/demo/remote.html b/demo/remote.html index 3bd3d096a..6b92c672d 100644 --- a/demo/remote.html +++ b/demo/remote.html @@ -3,12 +3,12 @@ BootstrapValidator demo - - + + - - - + + +
      @@ -20,7 +20,7 @@

      Sign up

      -
      +
      @@ -31,7 +31,14 @@

      Sign up

      - + +
      +
      + +
      + +
      +
      @@ -95,6 +102,12 @@

      Sign up

      $(document).ready(function() { $('#defaultForm').bootstrapValidator({ message: 'This value is not valid', +// live: 'disabled', + feedbackIcons: { + valid: 'glyphicon glyphicon-ok', + invalid: 'glyphicon glyphicon-remove', + validating: 'glyphicon glyphicon-refresh' + }, fields: { username: { message: 'The username is not valid', @@ -103,12 +116,18 @@

      Sign up

      message: 'The username is required and can\'t be empty' }, remote: { + type: 'POST', url: 'remote.php', - message: 'The username is not available' + message: 'The username is not available', + delay: 1000 + }, + different: { + field: 'password', + message: 'The username and password can\'t be the same as each other' } } }, - email: { + 'email[]': { validators: { notEmpty: { message: 'The email address is required and can\'t be empty' @@ -117,8 +136,10 @@

      Sign up

      message: 'The input is not a valid email address' }, remote: { + type: 'POST', url: 'remote.php', - message: 'The email is not available' + message: 'The email is not available', + delay: 2000 } } }, @@ -130,6 +151,10 @@

      Sign up

      identical: { field: 'confirmPassword', message: 'The password and its confirm are not the same' + }, + different: { + field: 'username', + message: 'The password can\'t be the same as username' } } }, @@ -170,4 +195,4 @@

      Sign up

      }); - \ No newline at end of file + diff --git a/demo/remote.php b/demo/remote.php index 5721a7131..750225af7 100644 --- a/demo/remote.php +++ b/demo/remote.php @@ -4,7 +4,9 @@ // and open the remote.html file: // http://domain.com/demo/remote.html -sleep(5); +header('Content-type: application/json'); + +//sleep(5); $valid = true; @@ -17,7 +19,7 @@ if (isset($_POST['username']) && array_key_exists($_POST['username'], $users)) { $valid = false; } else if (isset($_POST['email'])) { - $email = $_POST['email']; + $email = $_POST['email'][0]; foreach ($users as $k => $v) { if ($email == $v) { $valid = false; diff --git a/demo/remote2.php b/demo/remote2.php new file mode 100644 index 000000000..19a8d7b07 --- /dev/null +++ b/demo/remote2.php @@ -0,0 +1,34 @@ + 'admin@domain.com', + 'administrator' => 'administrator@domain.com', + 'root' => 'root@domain.com', +); + +if (isset($_POST['username']) && array_key_exists($_POST['username'], $users)) { + $valid = false; + $message = 'The username is not available'; +} else if (isset($_POST['email'])) { + $email = $_POST['email']; + foreach ($users as $k => $v) { + if ($email == $v) { + $valid = false; + $message = 'The email is not available'; + break; + } + } +} + +echo json_encode( + $valid ? array('valid' => $valid) : array('valid' => $valid, 'message' => $message) +); diff --git a/demo/reset.html b/demo/reset.html new file mode 100644 index 000000000..5b413d11a --- /dev/null +++ b/demo/reset.html @@ -0,0 +1,151 @@ + + + + BootstrapValidator demo + + + + + + + + + +
      +
      +
      + + + +
      + +
      + +
      +
      + +
      +
      + +
      + +
      + +
      +
      + +
      + +
      +
      + +
      +
      + +
      +
      + +
      +
      +
      + +
      +
      + +
      +
      + +
      +
      +
      + + + + + + + \ No newline at end of file diff --git a/demo/selector.html b/demo/selector.html new file mode 100644 index 000000000..2ce360c10 --- /dev/null +++ b/demo/selector.html @@ -0,0 +1,180 @@ + + + + BootstrapValidator demo + + + + + + + + + +
      +
      +
      +
      + + +
      +
      + +
      + +
      +
      + +
      + +
      + +
      +
      + +
      + +
      + +
      +
      + +
      +
      + +
      + +
      + +
      +
      + +
      +
      + +
      +
      +
      +
      +
      +
      +
      + + + + \ No newline at end of file diff --git a/demo/selector2.html b/demo/selector2.html new file mode 100644 index 000000000..f95ffc88f --- /dev/null +++ b/demo/selector2.html @@ -0,0 +1,92 @@ + + + + + BootstrapValidator demo + + + + + + + + + +
      +
      +
      +
      + + +
      +
      + +
      + +
      +
      +
      +
      + +
      +
      +
      +
      + +
      +
      +
      +
      + +
      +
      +
      +
      +
      +
      +
      + + + + \ No newline at end of file diff --git a/demo/specialName.html b/demo/specialName.html new file mode 100644 index 000000000..3cb05c992 --- /dev/null +++ b/demo/specialName.html @@ -0,0 +1,175 @@ + + + + BootstrapValidator demo + + + + + + + + + +
      +
      +
      + + +
      +
      + +
      + +
      +
      + +
      +
      + +
      + +
      + +
      +
      + +
      + +
      + +
      +
      + +
      + +
      + +
      +
      + +
      + +
      +
      + +
      +
      + +
      +
      + +
      +
      +
      + +
      + +
      + (YYYY/MM/DD) +
      +
      + +
      +
      + +
      +
      +
      +
      +
      +
      + + + + \ No newline at end of file diff --git a/demo/submitHandler.html b/demo/submitHandler.html new file mode 100644 index 000000000..f90a38702 --- /dev/null +++ b/demo/submitHandler.html @@ -0,0 +1,122 @@ + + + + Submit Handler Demo + + + + + + + + + +
      +
      + +
      +
      + + +
      + + +
      + +
      + +
      +
      + +
      + +
      + +
      +
      + +
      + +
      + +
      +
      + +
      +
      + +
      +
      +
      +
      +
      + +
      +
      + + + + \ No newline at end of file diff --git a/demo/tab.html b/demo/tab.html new file mode 100644 index 000000000..e220f7b58 --- /dev/null +++ b/demo/tab.html @@ -0,0 +1,169 @@ + + + + BootstrapValidator demo + + + + + + + + + + +
      +
      +
      +
      + + + + +
      +
      +
      +
      + +
      + +
      +
      +
      + +
      + +
      +
      +
      + +
      + +
      +
      +
      +
      +
      + +
      + +
      +
      +
      + +
      + +
      +
      +
      + +
      + +
      +
      +
      +
      +
      +
      + +
      +
      +
      +
      +
      +
      +
      + + + + \ No newline at end of file diff --git a/demo/target.php b/demo/target.php new file mode 100644 index 000000000..b71d9e865 --- /dev/null +++ b/demo/target.php @@ -0,0 +1,17 @@ + + + + BootstrapValidator demo + + + +
      +
      +

      Form data

      +
      +

      This is a simple page showing the data you have just submitted

      +
      +
      +
      + + \ No newline at end of file diff --git a/demo/tooltip.html b/demo/tooltip.html new file mode 100644 index 000000000..fcf3630a6 --- /dev/null +++ b/demo/tooltip.html @@ -0,0 +1,96 @@ + + + + BootstrapValidator demo + + + + + + + + + +
      +
      +
      +
      + + +
      +
      + +
      + +
      +
      + +
      + +
      + +
      +
      + +
      +
      + +
      +
      +
      +
      +
      +
      +
      + + + + \ No newline at end of file diff --git a/demo/validators.html b/demo/validators.html index 7b7b50e82..5e48f6679 100644 --- a/demo/validators.html +++ b/demo/validators.html @@ -6,7 +6,7 @@ - + @@ -20,7 +20,7 @@

      Bootstrap Validate plugin

      -
      +
      Not Empty validator @@ -48,7 +48,7 @@

      Bootstrap Validate plugin

      -
      +
      Accept the terms and policies
      @@ -74,19 +74,33 @@

      Bootstrap Validate plugin

      - +
      - +
      - + +
      + +
      +
      + +
      +
      +
      + +
      + +
      +
      +
      @@ -140,6 +154,11 @@

      Bootstrap Validate plugin

      $(document).ready(function() { $('#defaultForm').bootstrapValidator({ message: 'This value is not valid', + feedbackIcons: { + valid: 'glyphicon glyphicon-ok', + invalid: 'glyphicon glyphicon-remove', + validating: 'glyphicon glyphicon-refresh' + }, fields: { username: { message: 'The username is not valid', @@ -185,27 +204,43 @@

      Bootstrap Validate plugin

      website: { validators: { uri: { + allowLocal: true, message: 'The input is not a valid URL' } } }, - phoneNumber: { + phoneNumberUS: { validators: { - digits: { - message: 'The value can contain only digits' + phone: { + message: 'The input is not a valid US phone number' } } }, + phoneNumberUK: { + validators: { + phone: { + message: 'The input is not a valid UK phone number', + country: 'GB' + } + } + }, color: { validators: { - hexColor: { - message: 'The input is not a valid hex color' + color: { + type: ['hex', 'rgb', 'hsl', 'keyword'], + message: 'Must be a valid %s color' } } }, + colorAll: { + validators: { + color: { } + } + }, zipCode: { validators: { - usZipCode: { + zipCode: { + country: 'US', message: 'The input is not a valid US zip code' } } diff --git a/dist/css/bootstrapValidator.css b/dist/css/bootstrapValidator.css index 81862c312..4347416a0 100644 --- a/dist/css/bootstrapValidator.css +++ b/dist/css/bootstrapValidator.css @@ -1,11 +1,31 @@ /** - * BootstrapValidator (https://github.com/nghuuphuoc/bootstrapvalidator) + * BootstrapValidator (http://bootstrapvalidator.com) + * The best jQuery plugin to validate form fields. Designed to use with Bootstrap 3 * - * A jQuery plugin to validate form fields. Use with Bootstrap 3 - * - * @author Nguyen Huu Phuoc - * @copyright (c) 2013 Nguyen Huu Phuoc - * @license MIT + * @author http://twitter.com/nghuuphuoc + * @copyright (c) 2013 - 2014 Nguyen Huu Phuoc + * @license Commercial: http://bootstrapvalidator.com/license/ + * Non-commercial: http://creativecommons.org/licenses/by-nc-nd/3.0/ */ -.bootstrap-validator-form .help-block { - margin-bottom: 0; } + +.bv-form .help-block { + margin-bottom: 0; +} +.bv-form .tooltip-inner { + text-align: left; +} +.nav-tabs li.bv-tab-success > a { + color: #3c763d; +} +.nav-tabs li.bv-tab-error > a { + color: #a94442; +} + +.bv-form .bv-icon-no-label { + top: 0; +} + +.bv-form .bv-icon-input-group { + top: 0; + z-index: 100; +} \ No newline at end of file diff --git a/dist/css/bootstrapValidator.min.css b/dist/css/bootstrapValidator.min.css index 55ad4246a..62d7b5946 100644 --- a/dist/css/bootstrapValidator.min.css +++ b/dist/css/bootstrapValidator.min.css @@ -1,12 +1,12 @@ -/** - * BootstrapValidator v0.1.1-dev (http://github.com/nghuuphuoc/bootstrapvalidator) +/*! + * BootstrapValidator (http://bootstrapvalidator.com) + * The best jQuery plugin to validate form fields. Designed to use with Bootstrap 3 * - * A jQuery plugin to validate form fields. Use with Bootstrap 3 - * - * @author Nguyen Huu Phuoc - * @copyright (c) 2013 Nguyen Huu Phuoc - * @license MIT + * @version v0.5.3, built on 2014-11-05 9:14:18 PM + * @author https://twitter.com/nghuuphuoc + * @copyright (c) 2013 - 2014 Nguyen Huu Phuoc + * @license Commercial: http://bootstrapvalidator.com/license/ + * Non-commercial: http://creativecommons.org/licenses/by-nc-nd/3.0/ */ - -.bootstrap-validator-form .help-block{margin-bottom:0} \ No newline at end of file +.bv-form .help-block{margin-bottom:0}.bv-form .tooltip-inner{text-align:left}.nav-tabs li.bv-tab-success>a{color:#3c763d}.nav-tabs li.bv-tab-error>a{color:#a94442}.bv-form .bv-icon-no-label{top:0}.bv-form .bv-icon-input-group{top:0;z-index:100} \ No newline at end of file diff --git a/dist/css/bootstrapValidator.scss b/dist/css/bootstrapValidator.scss deleted file mode 100644 index d2f6229dc..000000000 --- a/dist/css/bootstrapValidator.scss +++ /dev/null @@ -1,15 +0,0 @@ -/** - * BootstrapValidator (https://github.com/nghuuphuoc/bootstrapvalidator) - * - * A jQuery plugin to validate form fields. Use with Bootstrap 3 - * - * @author Nguyen Huu Phuoc - * @copyright (c) 2013 Nguyen Huu Phuoc - * @license MIT - */ - -.bootstrap-validator-form { - .help-block { - margin-bottom: 0; - } -} diff --git a/dist/js/bootstrapValidator.js b/dist/js/bootstrapValidator.js index ec04c9928..7291c1db8 100644 --- a/dist/js/bootstrapValidator.js +++ b/dist/js/bootstrapValidator.js @@ -1,40 +1,60 @@ -/** - * BootstrapValidator v0.1.1-dev (http://github.com/nghuuphuoc/bootstrapvalidator) +/*! + * BootstrapValidator (http://bootstrapvalidator.com) + * The best jQuery plugin to validate form fields. Designed to use with Bootstrap 3 * - * A jQuery plugin to validate form fields. Use with Bootstrap 3 - * - * @author Nguyen Huu Phuoc - * @copyright (c) 2013 Nguyen Huu Phuoc - * @license MIT + * @version v0.5.3, built on 2014-11-05 9:14:18 PM + * @author https://twitter.com/nghuuphuoc + * @copyright (c) 2013 - 2014 Nguyen Huu Phuoc + * @license Commercial: http://bootstrapvalidator.com/license/ + * Non-commercial: http://creativecommons.org/licenses/by-nc-nd/3.0/ */ +if (typeof jQuery === 'undefined') { + throw new Error('BootstrapValidator requires jQuery'); +} + +(function($) { + var version = $.fn.jquery.split(' ')[0].split('.'); + if ((+version[0] < 2 && +version[1] < 9) || (+version[0] === 1 && +version[1] === 9 && +version[2] < 1)) { + throw new Error('BootstrapValidator requires jQuery version 1.9.1 or higher'); + } +}(window.jQuery)); (function($) { var BootstrapValidator = function(form, options) { this.$form = $(form); - this.options = $.extend({}, BootstrapValidator.DEFAULT_OPTIONS, options); + this.options = $.extend({}, $.fn.bootstrapValidator.DEFAULT_OPTIONS, options); - this.invalidFields = {}; - this.xhrRequests = {}; - this.numPendingRequests = null; - this.formSubmited = false; + this.$invalidFields = $([]); // Array of invalid fields + this.$submitButton = null; // The submit button which is clicked to submit form + this.$hiddenButton = null; - this._init(); - }; + // Validating status + this.STATUS_NOT_VALIDATED = 'NOT_VALIDATED'; + this.STATUS_VALIDATING = 'VALIDATING'; + this.STATUS_INVALID = 'INVALID'; + this.STATUS_VALID = 'VALID'; - // The default options - BootstrapValidator.DEFAULT_OPTIONS = { - // The form CSS class - elementClass: 'bootstrap-validator-form', + // Determine the event that is fired when user change the field value + // Most modern browsers supports input event except IE 7, 8. + // IE 9 supports input event but the event is still not fired if I press the backspace key. + // Get IE version + // https://gist.github.com/padolsey/527683/#comment-7595 + var ieVersion = (function() { + var v = 3, div = document.createElement('div'), a = div.all || []; + while (div.innerHTML = '', a[0]) {} + return v > 4 ? v : !v; + }()); - // Default invalid message - message: 'This value is not valid', + var el = document.createElement('div'); + this._changeEvent = (ieVersion === 9 || !('oninput' in el)) ? 'keyup' : 'input'; - // The submit buttons selector - // These buttons will be disabled when the form input are invalid - submitButtons: 'button[type="submit"]', + // The flag to indicate that the form is ready to submit when a remote/callback validator returns + this._submitIfValid = null; - // Map the field name with validator rules - fields: null + // Field elements + this._cacheFields = {}; + + this._init(); }; BootstrapValidator.prototype = { @@ -44,30 +64,90 @@ * Init form */ _init: function() { - if (this.options.fields == null) { - return; - } + var that = this, + options = { + autoFocus: this.$form.attr('data-bv-autofocus'), + container: this.$form.attr('data-bv-container'), + events: { + formInit: this.$form.attr('data-bv-events-form-init'), + formError: this.$form.attr('data-bv-events-form-error'), + formSuccess: this.$form.attr('data-bv-events-form-success'), + fieldAdded: this.$form.attr('data-bv-events-field-added'), + fieldRemoved: this.$form.attr('data-bv-events-field-removed'), + fieldInit: this.$form.attr('data-bv-events-field-init'), + fieldError: this.$form.attr('data-bv-events-field-error'), + fieldSuccess: this.$form.attr('data-bv-events-field-success'), + fieldStatus: this.$form.attr('data-bv-events-field-status'), + validatorError: this.$form.attr('data-bv-events-validator-error'), + validatorSuccess: this.$form.attr('data-bv-events-validator-success') + }, + excluded: this.$form.attr('data-bv-excluded'), + feedbackIcons: { + valid: this.$form.attr('data-bv-feedbackicons-valid'), + invalid: this.$form.attr('data-bv-feedbackicons-invalid'), + validating: this.$form.attr('data-bv-feedbackicons-validating') + }, + group: this.$form.attr('data-bv-group'), + live: this.$form.attr('data-bv-live'), + message: this.$form.attr('data-bv-message'), + onError: this.$form.attr('data-bv-onerror'), + onSuccess: this.$form.attr('data-bv-onsuccess'), + submitButtons: this.$form.attr('data-bv-submitbuttons'), + threshold: this.$form.attr('data-bv-threshold'), + trigger: this.$form.attr('data-bv-trigger'), + verbose: this.$form.attr('data-bv-verbose'), + fields: {} + }; - var that = this; this.$form // Disable client side validation in HTML 5 .attr('novalidate', 'novalidate') .addClass(this.options.elementClass) - .on('submit', function(e) { - that.formSubmited = true; - if (that.options.fields) { - for (var field in that.options.fields) { - if (that.numPendingRequests > 0 || that.numPendingRequests == null) { - // Check if the field is valid - var $field = that.getFieldElement(field); - if ($field.data('bootstrapValidator.isValid') !== true) { - that.validateField(field); - } - } + // Disable the default submission first + .on('submit.bv', function(e) { + e.preventDefault(); + that.validate(); + }) + .on('click.bv', this.options.submitButtons, function() { + that.$submitButton = $(this); + // The user just click the submit button + that._submitIfValid = true; + }) + // Find all fields which have either "name" or "data-bv-field" attribute + .find('[name], [data-bv-field]') + .each(function() { + var $field = $(this), + field = $field.attr('name') || $field.attr('data-bv-field'), + opts = that._parseOptions($field); + if (opts) { + $field.attr('data-bv-field', field); + options.fields[field] = $.extend({}, opts, options.fields[field]); } - if (!that.isValid()) { - that.$form.find(that.options.submitButtons).attr('disabled', 'disabled'); - e.preventDefault(); + }); + + this.options = $.extend(true, this.options, options); + + // When pressing Enter on any field in the form, the first submit button will do its job. + // The form then will be submitted. + // I create a first hidden submit button + this.$hiddenButton = $('', + '
      ', + '' + ].join('')).appendTo('body'); + + this.bv = $('#autoFocusForm') + .bootstrapValidator() + .submit(function(e) { + e.preventDefault(); + }) + .data('bootstrapValidator'); + this.$username = this.bv.getFieldElements('username'); + this.$email = this.bv.getFieldElements('email'); + }); + + afterEach(function() { + $('#autoFocusForm').bootstrapValidator('destroy').remove(); + }); + + it('default option (autoFocus=true)', function() { + $('#submitButton').click(); + expect(this.$username.is(':focus')).toBeTruthy(); + expect($(document.activeElement).attr('name')).toEqual('username'); + + this.bv.resetForm(); + this.$username.val('user_name'); + this.$email.val(''); + $('#submitButton').click(); + expect(this.$email.is(':focus')).toBeTruthy(); + expect($(document.activeElement).attr('name')).toEqual('email'); + }); + + it('set autoFocus=false for form', function() { + $('#autoFocusForm') + .bootstrapValidator('destroy') + .bootstrapValidator({ + autoFocus: false + }); + this.$username.val(''); + this.$email.val('invalid#email'); + $('#submitButton').click(); + + expect(this.$username.is(':focus')).toBeFalsy(); + expect(this.$email.is(':focus')).toBeFalsy(); + }); + + it('set autoFocus=false for all fields', function() { + this.bv + .addField('username', { + autoFocus: false + }) + .addField('email', { + autoFocus: false + }); + this.$username.val('user_name'); + this.$email.val('invalid#email'); + $('#submitButton').click(); + + expect(this.$username.is(':focus')).toBeFalsy(); + expect(this.$email.is(':focus')).toBeFalsy(); + }); + + it('set different autoFocus value for fields', function() { + this.bv + .addField('username', { + autoFocus: false + }) + .addField('email', { + autoFocus: true + }); + this.$username.val(''); + this.$email.val('invalid_email'); + $('#submitButton').click(); + + expect(this.$username.is(':focus')).toBeFalsy(); + expect(this.$email.is(':focus')).toBeTruthy(); + expect($(document.activeElement).attr('name')).toEqual('email'); + }); +}); + +describe('container form option', function() { + beforeEach(function() { + $([ + '
      ', + '
      ', + '', + '
      ', + '', + '
      ', + '
      ', + '', + '
      ', + '
      ', + '
      ', + '
      ' + ].join('')).appendTo('body'); + }); + + afterEach(function() { + $('#containerForm').bootstrapValidator('destroy').remove(); + }); + + it('form container declarative', function() { + $('#containerForm') + .attr('data-bv-container', '#errors') + .bootstrapValidator(); + + this.bv = $('#containerForm').data('bootstrapValidator'); + this.$firstName = this.bv.getFieldElements('firstName'); + this.$lastName = this.bv.getFieldElements('lastName'); + + expect($('#errors').find('.help-block').length).toBeGreaterThan(0); + + this.$firstName.val('First'); + this.$lastName.val(''); + this.bv.validate(); + expect($('#errors').find('.help-block:visible[data-bv-for="firstName"]').length).toEqual(0); + expect($('#errors').find('.help-block:visible[data-bv-for="lastName"]').length).toBeGreaterThan(0); + }); + + it('form container programmatically', function() { + $('#containerForm').bootstrapValidator({ + container: '#errors' + }); + + this.bv = $('#containerForm').data('bootstrapValidator'); + this.$firstName = this.bv.getFieldElements('firstName'); + this.$lastName = this.bv.getFieldElements('lastName'); + + expect($('#errors').find('.help-block').length).toBeGreaterThan(0); + + this.$firstName.val(''); + this.$lastName.val('Last'); + this.bv.validate(); + expect($('#errors').find('.help-block:visible[data-bv-for="firstName"]').length).toBeGreaterThan(0); + expect($('#errors').find('.help-block:visible[data-bv-for="lastName"]').length).toEqual(0); + + this.bv.resetForm(); + this.$firstName.val('First'); + this.$lastName.val('Last'); + this.bv.validate(); + expect($('#errors').find('.help-block:visible').length).toEqual(0); + }); +}); + +describe('container field option', function() { + beforeEach(function() { + $([ + '
      ', + '
      ', + '', + '
      ', + '', + '', + '
      ', + '
      ', + '', + '', + '
      ', + '
      ', + '
      ' + ].join('')).appendTo('body'); + + $('#containerForm').bootstrapValidator({ + feedbackIcons: { + valid: 'glyphicon glyphicon-ok', + invalid: 'glyphicon glyphicon-remove', + validating: 'glyphicon glyphicon-refresh' + }, + fields: { + lastName: { + container: '.lastNameMessage' + } + } + }); + + this.bv = $('#containerForm').data('bootstrapValidator'); + this.$firstName = this.bv.getFieldElements('firstName'); + this.$lastName = this.bv.getFieldElements('lastName'); + }); + + afterEach(function() { + $('#containerForm').bootstrapValidator('destroy').remove(); + }); + + it('field container declarative', function() { + expect($.trim($('#firstNameMessage').text())).toEqual('The first name is required'); + expect($.trim($('.lastNameMessage').text())).toEqual('The last name is required'); + }); + + it('field container programmatically', function() { + this.$firstName.val('First'); + this.$lastName.val(''); + this.bv.validate(); + expect($('#firstNameMessage').find('.help-block:visible').length).toEqual(0); + expect($('.lastNameMessage').find('.help-block:visible').length).toBeGreaterThan(0); + + this.bv.resetForm(); + this.$firstName.val(''); + this.$lastName.val('Last'); + this.bv.validate(); + expect($('#firstNameMessage').find('.help-block:visible').length).toBeGreaterThan(0); + expect($('.lastNameMessage').find('.help-block:visible').length).toEqual(0); + }); +}); + +describe('container tooltip/popover', function() { + beforeEach(function() { + $([ + '
      ', + '
      ', + '', + '
      ', + '', + '
      ', + '
      ', + '', + '
      ', + '
      ', + '
      ', + '
      ' + ].join('')).appendTo('body'); + }); + + afterEach(function() { + $('#containerForm').bootstrapValidator('destroy').remove(); + }); + + it('container declarative', function() { + $('#containerForm') + .attr('data-bv-container', 'tooltip') + .find('[name="lastName"]') + .attr('data-bv-container', 'popover') + .end() + .bootstrapValidator(); + + this.bv = $('#containerForm').data('bootstrapValidator'); + this.$firstName = this.bv.getFieldElements('firstName'); + this.$lastName = this.bv.getFieldElements('lastName'); + + this.bv.validate(); + expect(this.$firstName.parent().find('i').data('bs.tooltip')).toBeDefined(); + expect(this.$firstName.parent().find('i').data('bs.tooltip').type).toEqual('tooltip'); + expect(this.$lastName.parent().find('i').data('bs.popover')).toBeDefined(); + expect(this.$lastName.parent().find('i').data('bs.popover').type).toEqual('popover'); + + this.bv.resetForm(); + this.$firstName.val('First'); + this.$lastName.val('Last'); + this.bv.validate(); + expect(this.$firstName.parent().find('i').data('bs.tooltip')).toBeUndefined(); + expect(this.$lastName.parent().find('i').data('bs.popover')).toBeUndefined(); + }); + + it('container programmatically', function() { + $('#containerForm').bootstrapValidator({ + container: 'tooltip', + fields: { + lastName: { + container: 'popover' + } + } + }); + + this.bv = $('#containerForm').data('bootstrapValidator'); + this.$firstName = this.bv.getFieldElements('firstName'); + this.$lastName = this.bv.getFieldElements('lastName'); + + this.bv.validate(); + expect(this.$firstName.parent().find('i').data('bs.tooltip')).toBeDefined(); + expect(this.$firstName.parent().find('i').data('bs.tooltip').type).toEqual('tooltip'); + expect(this.$lastName.parent().find('i').data('bs.popover')).toBeDefined(); + expect(this.$lastName.parent().find('i').data('bs.popover').type).toEqual('popover'); + + this.bv.resetForm(); + this.$firstName.val('First'); + this.$lastName.val('Last'); + this.bv.validate(); + expect(this.$firstName.parent().find('i').data('bs.tooltip')).toBeUndefined(); + expect(this.$lastName.parent().find('i').data('bs.popover')).toBeUndefined(); + }); + + // #991: Validate once when setting trigger: blur, container: tooltip + it('trigger: blur, container: tooltip', function() { + $('#containerForm').bootstrapValidator({ + container: 'tooltip', + trigger: 'blur', + fields: { + firstName: { + validators: { + stringLength: { + min: 5, + message: 'The first name must be more than 5 characters' + }, + notEmpty: { + message: 'The first name is required' + }, + regexp: { + regexp: /^[a-z]+$/i, + message: 'The first name must consist of a-z, A-Z characters only' + } + } + }, + lastName: { + validators: { + stringLength: { + min: 5, + message: 'The last name must be more than 5 characters' + }, + notEmpty: { + message: 'The last name is required' + }, + regexp: { + regexp: /^[a-z]+$/i, + message: 'The last name must consist of a-z, A-Z characters only' + } + } + } + } + }); + + this.bv = $('#containerForm').data('bootstrapValidator'); + this.$firstName = this.bv.getFieldElements('firstName'); + this.$lastName = this.bv.getFieldElements('lastName'); + + this.$firstName.val('').trigger('blur'); + this.bv.validate(); + expect(this.$firstName.parent().find('i').data('bs.tooltip')).toBeDefined(); + expect(this.$firstName.parent().find('i').data('bs.tooltip').type).toEqual('tooltip'); + expect(this.$firstName.parent().find('i').data('bs.tooltip').getTitle()).toEqual('The first name is required'); + + this.bv.resetForm(); + this.$firstName.val('@not#valid'); + this.$lastName.val('').focus(); + this.bv.validate(); + expect(this.$firstName.parent().find('i').data('bs.tooltip')).toBeDefined(); + expect(this.$firstName.parent().find('i').data('bs.tooltip').type).toEqual('tooltip'); + expect(this.$firstName.parent().find('i').data('bs.tooltip').getTitle()).toEqual('The first name must consist of a-z, A-Z characters only'); + + this.bv.resetForm(); + this.$firstName.val('Phuo'); + this.$lastName.val('').focus(); + this.bv.validate(); + expect(this.$firstName.parent().find('i').data('bs.tooltip')).toBeDefined(); + expect(this.$firstName.parent().find('i').data('bs.tooltip').type).toEqual('tooltip'); + expect(this.$firstName.parent().find('i').data('bs.tooltip').getTitle()).toEqual('The first name must be more than 5 characters'); + + this.bv.resetForm(); + this.$firstName.val('Phuoc'); + this.$lastName.val('').focus(); + this.bv.validate(); + expect(this.$firstName.parent().find('i').data('bs.tooltip')).toBeUndefined(); + }); +}); + +describe('dynamic fields', function() { + beforeEach(function() { + $([ + '
      ', + '
      ', + '', + '
      ', + '
      ' + ].join('\n')).appendTo('body'); + + $('#dynamicForm').bootstrapValidator({ + fields: { + fullName: { + validators: { + notEmpty: { + message: 'The full name is required and cannot be empty' + }, + stringLength: { + min: 8, + max: 40, + message: 'The full name must be more than %s and less than %s characters long' + }, + regexp: { + enabled: false, + regexp: /^[a-zA-Z\s]+$/, + message: 'The full name can only consist of alphabetical, number, and space' + } + } + }, + // #725: Note that the email field isn't available in the form yet + email: { + validators: { + emailAddress: { + message: 'The email address is not valid' + } + } + } + } + }); + + this.bv = $('#dynamicForm').data('bootstrapValidator'); + this.$fullName = this.bv.getFieldElements('fullName'); + }); + + afterEach(function() { + $('#dynamicForm').bootstrapValidator('destroy').remove(); + }); + + // https://github.com/nghuuphuoc/bootstrapvalidator/pull/725 + it('adding field [does not exist but is already set in "fields" option]', function() { + var $div = $('
      ').addClass('form-group').appendTo($('#dynamicForm')); + $email = $('') + .attr('type', 'text') + .addClass('form-control') + .attr('name', 'email') + .appendTo($div); + + this.bv.addField('email'); + + this.$fullName.val('Phuoc Nguyen'); + + $email.val('not valid@email'); + this.bv.validate(); + expect(this.bv.isValidField('email')).toBeFalsy(); + expect(this.bv.isValid()).toBeFalsy(); + + this.bv.resetForm(); + $email.val('valid@email.com'); + this.bv.validate(); + expect(this.bv.isValidField('email')).toBeTruthy(); + expect(this.bv.isValid()).toBeTruthy(); + }); +}); + +describe('enable validators', function() { + beforeEach(function() { + $([ + '
      ', + '
      ', + '', + '
      ', + '
      ' + ].join('\n')).appendTo('body'); + + $('#enableForm').bootstrapValidator({ + fields: { + fullName: { + validators: { + notEmpty: { + message: 'The full name is required and cannot be empty' + }, + stringLength: { + min: 8, + max: 40, + message: 'The full name must be more than %s and less than %s characters long' + }, + regexp: { + enabled: false, + regexp: /^[a-zA-Z\s]+$/, + message: 'The full name can only consist of alphabetical, number, and space' + } + } + } + } + }); + + this.bv = $('#enableForm').data('bootstrapValidator'); + this.$fullName = this.bv.getFieldElements('fullName'); + }); + + afterEach(function() { + $('#enableForm').bootstrapValidator('destroy').remove(); + }); + + it('enable all validators', function() { + this.$fullName.val('@ $full N@m3'); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + + this.bv.resetForm(); + this.$fullName.val('Contain#$@'); + this.bv.enableFieldValidators('fullName', true); + this.bv.validate(); + expect(this.bv.isValidField('fullName')).toEqual(false); + expect(this.bv.isValid()).toEqual(false); + }); + + it('disable all validators', function() { + this.bv.resetForm(); + this.bv.enableFieldValidators('fullName', false); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + }); + + it('enabled option particular validator', function() { + this.$fullName.val('Contain@#$'); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + + var messages = this.bv.getMessages('fullName'); + expect(messages.length).toEqual(0); + }); + + it('enable particular validators', function() { + // Enable stringLength validator + this.bv.resetForm(); + this.bv.enableFieldValidators('fullName', true, 'stringLength'); + this.bv.enableFieldValidators('fullName', true, 'regexp'); + this.$fullName.val('Full@'); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + + var messages = this.bv.getMessages('fullName'); + expect($.inArray('The full name must be more than 8 and less than 40 characters long', messages)).toBeGreaterThan(-1); + expect($.inArray('The full name can only consist of alphabetical, number, and space', messages)).toBeGreaterThan(-1); + }); + + it('disable particular validators', function() { + // Disable stringLength validator + this.bv.enableFieldValidators('fullName', false, 'stringLength'); + this.$fullName.val('Full'); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + + var messages = this.bv.getMessages('fullName'); + expect($.inArray('The full name must be more than 8 and less than 40 characters long', messages)).toEqual(-1); + + // Disable regexp validator + this.bv.enableFieldValidators('fullName', false, 'regexp'); + this.$fullName.val('Special@#$'); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + + var messages = this.bv.getMessages('fullName'); + expect($.inArray('The full name can only consist of alphabetical, number, and space', messages)).toEqual(-1); + }); +}); + +TestSuite = $.extend({}, TestSuite, { + Event: { + onEmailValid: function(e, data) { + $('#msg').html('TestSuite.Event.onEmailValid() called, ' + data.field + ' is valid'); + }, + + onEmailInvalid: function(e, data) { + $('#msg').html('TestSuite.Event.onEmailInvalid() called, ' + data.field + ' is invalid'); + }, + + onEmailStatus: function(e, data) { + $('#status').html('TestSuite.Event.onEmailStatus() called; status = ' + data.status); + }, + + onFormValid: function(e) { + $('#msg').html('TestSuite.Event.onFormValid() called, form ' + $(e.target).attr('id') + ' is valid'); + }, + + onFormInvalid: function(e) { + $('#msg').html('TestSuite.Event.onFormInvalid() called, form ' + $(e.target).attr('id') + ' is invalid'); + } + } +}); + +// --- +// Form events +// --- + +function onFormValid(e) { + $('#msg').html('form ' + $(e.target).attr('id') + ' is valid'); +}; + +function onFormInvalid(e) { + $('#msg').html('form ' + $(e.target).attr('id') + ' is invalid'); +}; + +describe('event form attribute callback global', function() { + beforeEach(function() { + $([ + '
      ', + '
      ', + '
      ', + '', + '
      ', + '
      ' + ].join('\n')).appendTo('body'); + + $('#eventForm').bootstrapValidator(); + + this.bv = $('#eventForm').data('bootstrapValidator'); + this.$email = this.bv.getFieldElements('email'); + }); + + afterEach(function() { + $('#eventForm').bootstrapValidator('destroy').remove(); + }); + + it('call data-bv-onsuccess', function() { + this.$email.val('email@domain.com'); + this.bv.validate(); + expect($('#msg').html()).toEqual('form eventForm is valid'); + }); + + it('call data-bv-onerror', function() { + this.$email.val('a@b@c@example.com'); + this.bv.validate(); + expect($('#msg').html()).toEqual('form eventForm is invalid'); + }); +}); + +describe('event form attribute callback namespace', function() { + beforeEach(function() { + $([ + '
      ', + '
      ', + '
      ', + '', + '
      ', + '
      ' + ].join('\n')).appendTo('body'); + + $('#eventForm').bootstrapValidator(); + + this.bv = $('#eventForm').data('bootstrapValidator'); + this.$email = this.bv.getFieldElements('email'); + }); + + afterEach(function() { + $('#eventForm').bootstrapValidator('destroy').remove(); + }); + + it('call data-bv-onsuccess', function() { + this.$email.val('email@domain.com'); + this.bv.validate(); + expect($('#msg').html()).toEqual('TestSuite.Event.onFormValid() called, form eventForm is valid'); + }); + + it('call data-bv-onerror', function() { + this.$email.val('just"not"right@example.com'); + this.bv.validate(); + expect($('#msg').html()).toEqual('TestSuite.Event.onFormInvalid() called, form eventForm is invalid'); + }); +}); + +describe('event form trigger', function() { + beforeEach(function() { + $([ + '
      ', + '
      ', + '
      ', + '', + '
      ', + '
      ' + ].join('\n')).appendTo('body'); + + $('#eventForm') + .bootstrapValidator() + .on('success.form.bv', function(e) { + $('#msg').html('form ' + $(e.target).attr('id') + ' triggered success.form.bv event'); + }) + .on('error.form.bv', function(e) { + $('#msg').html('form ' + $(e.target).attr('id') + ' triggered error.form.bv event'); + }); + + this.bv = $('#eventForm').data('bootstrapValidator'); + this.$email = this.bv.getFieldElements('email'); + }); + + afterEach(function() { + $('#eventForm').bootstrapValidator('destroy').remove(); + }); + + it('trigger success.form.bv', function() { + this.$email.val('email@domain.com'); + this.bv.validate(); + expect($('#msg').html()).toEqual('form eventForm triggered success.form.bv event'); + }); + + it('trigger error.form.bv', function() { + this.$email.val('this is"not\\allowed@example.com'); + this.bv.validate(); + expect($('#msg').html()).toEqual('form eventForm triggered error.form.bv event'); + }); +}); + +describe('event form programmatically', function() { + beforeEach(function() { + $([ + '
      ', + '
      ', + '
      ', + '', + '
      ', + '
      ' + ].join('\n')).appendTo('body'); + + $('#eventForm').bootstrapValidator({ + onSuccess: function(e) { + $('#msg').html('onSuccess() called'); + }, + onError: function(e) { + $('#msg').html('onError() called'); + } + }); + + this.bv = $('#eventForm').data('bootstrapValidator'); + this.$email = this.bv.getFieldElements('email'); + }); + + afterEach(function() { + $('#eventForm').bootstrapValidator('destroy').remove(); + }); + + it('call onSuccess()', function() { + this.$email.val('email@domain.com'); + this.bv.validate(); + expect($('#msg').html()).toEqual('onSuccess() called'); + }); + + it('call onError()', function() { + this.$email.val('Abc.example.com'); + this.bv.validate(); + expect($('#msg').html()).toEqual('onError() called'); + }); +}); + +// --- +// Field events +// --- + +function onEmailValid(e, data) { + $('#msg').html(data.field + ' is valid'); +}; + +function onEmailInvalid(e, data) { + $('#msg').html(data.field + ' is invalid'); +}; + +function onEmailStatus(e, data) { + $('#status').html(data.status); +}; + +describe('event field attribute callback global', function() { + beforeEach(function() { + $([ + '
      ', + '
      ', + '
      ', + '
      ', + '', + '
      ', + '
      ' + ].join('\n')).appendTo('body'); + + $('#eventForm').bootstrapValidator(); + + this.bv = $('#eventForm').data('bootstrapValidator'); + this.$email = this.bv.getFieldElements('email'); + }); + + afterEach(function() { + $('#eventForm').bootstrapValidator('destroy').remove(); + }); + + it('call data-bv-onsuccess', function() { + this.$email.val('email@domain.com'); + this.bv.validate(); + expect($('#msg').html()).toEqual('email is valid'); + expect($('#status').html()).toEqual(this.bv.STATUS_VALID); + }); + + it('call data-bv-onerror', function() { + this.$email.val('A@b@c@example.com'); + this.bv.validate(); + expect($('#msg').html()).toEqual('email is invalid'); + expect($('#status').html()).toEqual(this.bv.STATUS_INVALID); + }); +}); + +describe('event field attribute callback namespace', function() { + beforeEach(function() { + $([ + '
      ', + '
      ', + '
      ', + '
      ', + '', + '
      ', + '
      ' + ].join('\n')).appendTo('body'); + + $('#eventForm').bootstrapValidator(); + + this.bv = $('#eventForm').data('bootstrapValidator'); + this.$email = this.bv.getFieldElements('email'); + }); + + afterEach(function() { + $('#eventForm').bootstrapValidator('destroy').remove(); + }); + + it('call data-bv-onsuccess', function() { + this.$email.val('email@domain.com'); + this.bv.validate(); + expect($('#msg').html()).toEqual('TestSuite.Event.onEmailValid() called, email is valid'); + expect($('#status').html()).toEqual('TestSuite.Event.onEmailStatus() called; status = ' + this.bv.STATUS_VALID); + }); + + it('call data-bv-onerror', function() { + this.$email.val('a"b(c)d,e:f;gi[j\\k]l@example.com'); + this.bv.validate(); + expect($('#msg').html()).toEqual('TestSuite.Event.onEmailInvalid() called, email is invalid'); + expect($('#status').html()).toEqual('TestSuite.Event.onEmailStatus() called; status = ' + this.bv.STATUS_INVALID); + }); +}); + +describe('event field trigger', function() { + beforeEach(function() { + $([ + '
      ', + '
      ', + '
      ', + '', + '
      ', + '
      ' + ].join('\n')).appendTo('body'); + + $('#eventForm') + .bootstrapValidator() + .on('success.field.bv', '[name="email"]', function(e, data) { + $('#msg').html('triggered success.field.bv on ' + data.field); + }) + .on('error.field.bv', '[name="email"]', function(e, data) { + $('#msg').html('triggered error.field.bv on ' + data.field); + }); + + this.bv = $('#eventForm').data('bootstrapValidator'); + this.$email = this.bv.getFieldElements('email'); + }); + + afterEach(function() { + $('#eventForm').bootstrapValidator('destroy').remove(); + }); + + it('trigger success.field.bv', function() { + this.$email.val('email@domain.com'); + this.bv.validate(); + expect($('#msg').html()).toEqual('triggered success.field.bv on email'); + }); + + it('trigger error.field.bv', function() { + this.$email.val('just"not"right@example.com'); + this.bv.validate(); + expect($('#msg').html()).toEqual('triggered error.field.bv on email'); + }); +}); + +describe('event field programmatically', function() { + beforeEach(function() { + $([ + '
      ', + '
      ', + '
      ', + '', + '
      ', + '
      ' + ].join('\n')).appendTo('body'); + + $('#eventForm').bootstrapValidator({ + fields: { + email: { + onSuccess: function(e, data) { + $('#msg').html('onSuccess() called'); + }, + onError: function(e, data) { + $('#msg').html('onError() called'); + } + } + } + }); + + this.bv = $('#eventForm').data('bootstrapValidator'); + this.$email = this.bv.getFieldElements('email'); + }); + + afterEach(function() { + $('#eventForm').bootstrapValidator('destroy').remove(); + }); + + it('call onSuccess()', function() { + this.$email.val('email@domain.com'); + this.bv.validate(); + expect($('#msg').html()).toEqual('onSuccess() called'); + }); + + it('call onError()', function() { + this.$email.val('this is"not\\allowed@example.com'); + this.bv.validate(); + expect($('#msg').html()).toEqual('onError() called'); + }); +}); + +// --- +// Modifying default events +// --- + +describe('event form trigger with default events', function() { + beforeEach(function() { + $([ + '
      ', + '
      ', + '
      ', + '', + '
      ', + '
      ' + ].join('\n')).appendTo('body'); + + $('#eventForm1') + .bootstrapValidator() + .on('bv.form.success', function(e) { + $('#msg').html('form ' + $(e.target).attr('id') + ' triggered bv.form.success event'); + }) + .on('success.form.bv', function(e) { + $('#msg').html('form ' + $(e.target).attr('id') + ' triggered success.form.bv event'); + }) + .on('bv.form.error', function(e) { + $('#msg').html('form ' + $(e.target).attr('id') + ' triggered bv.form.error event'); + }) + .on('error.form.bv', function(e) { + $('#msg').html('form ' + $(e.target).attr('id') + ' triggered error.form.bv event'); + }); + + this.bv = $('#eventForm1').data('bootstrapValidator'); + this.$email = this.bv.getFieldElements('email'); + }); + + afterEach(function() { + $('#eventForm1').bootstrapValidator('destroy').remove(); + }); + + it('does not trigger bv.form.success', function() { + this.$email.val('email@domain.com'); + this.bv.validate(); + expect($('#msg').html()).not.toEqual('form eventForm1 triggered bv.form.success event'); + }); + + it('triggers success.form.bv', function() { + this.$email.val('email@domain.com'); + this.bv.validate(); + expect($('#msg').html()).toEqual('form eventForm1 triggered success.form.bv event'); + }); + + it('does not trigger bv.form.error', function() { + this.$email.val('A@b@c@example.com'); + this.bv.validate(); + expect($('#msg').html()).not.toEqual('form eventForm1 triggered bv.form.error event'); + }); + + it('triggers error.form.bv', function() { + this.$email.val('A@b@c@example.com'); + this.bv.validate(); + expect($('#msg').html()).toEqual('form eventForm1 triggered error.form.bv event'); + }); +}); + +describe('event field trigger with default events', function() { + beforeEach(function() { + $([ + '
      ', + '
      ', + '
      ', + '', + '
      ', + '
      ' + ].join('\n')).appendTo('body'); + + $('#eventForm3') + .bootstrapValidator() + .on('success.field.bv', '[name="email"]', function(e, data) { + $('#msg').html('triggered success.field.bv on ' + data.field); + }) + .on('error.field.bv', '[name="email"]', function(e, data) { + $('#msg').html('triggered error.field.bv on ' + data.field); + }) + .on('bv.field.success', '[name="email"]', function(e, data) { + $('#msg').html('triggered bv.field.success on ' + data.field); + }) + .on('bv.field.error', '[name="email"]', function(e, data) { + $('#msg').html('triggered bv.field.error on ' + data.field); + }); + + this.bv = $('#eventForm3').data('bootstrapValidator'); + this.$email = this.bv.getFieldElements('email'); + }); + + afterEach(function() { + $('#eventForm3').bootstrapValidator('destroy').remove(); + }); + + it('triggers success.field.bv', function() { + this.$email.val('email@domain.com'); + this.bv.validate(); + expect($('#msg').html()).toEqual('triggered success.field.bv on email'); + }); + + it('does not trigger bv.field.success', function() { + this.$email.val('email@domain.com'); + this.bv.validate(); + expect($('#msg').html()).not.toEqual('triggered bv.field.success on email'); + }); + + it('does not trigger error.field.bv', function() { + this.$email.val('just"not"right@example.com'); + this.bv.validate(); + expect($('#msg').html()).toEqual('triggered error.field.bv on email'); + }); + + it('triggers bv.field.error', function() { + this.$email.val('just"not"right@example.com'); + this.bv.validate(); + expect($('#msg').html()).not.toEqual('triggered bv.field.error on email'); + }); +}); + +describe('event form trigger with events changed', function() { + var defaultOptions = $.fn.bootstrapValidator.DEFAULT_OPTIONS; + + beforeEach(function() { + $.fn.bootstrapValidator.DEFAULT_OPTIONS = $.extend({}, $.fn.bootstrapValidator.DEFAULT_OPTIONS, { + events: { + formInit: 'init.form.bv', + formError: 'bv.form.error', + formSuccess: 'bv.form.success', + fieldAdded: 'added.field.bv', + fieldRemoved: 'removed.field.bv', + fieldInit: 'init.field.bv', + fieldError: 'bv.field.error', + fieldSuccess: 'bv.field.success', + fieldStatus: 'status.field.bv', + validatorError: 'bv.validator.error', + validatorSuccess: 'success.validator.bv' + } + }); + + $([ + '
      ', + '
      ', + '
      ', + '', + '
      ', + '
      ' + ].join('\n')).appendTo('body'); + + $('#eventForm2') + .bootstrapValidator() + .on('bv.form.success', function(e) { + $('#msg').html('form ' + $(e.target).attr('id') + ' triggered bv.form.success event'); + }) + .on('success.form.bv', function(e) { + $('#msg').html('form ' + $(e.target).attr('id') + ' triggered success.form.bv event'); + }) + .on('bv.form.error', function(e) { + $('#msg').html('form ' + $(e.target).attr('id') + ' triggered bv.form.error event'); + }) + .on('error.form.bv', function(e) { + $('#msg').html('form ' + $(e.target).attr('id') + ' triggered error.form.bv event'); + }); + + this.bv = $('#eventForm2').data('bootstrapValidator'); + this.$email = this.bv.getFieldElements('email'); + }); + + afterEach(function() { + $('#eventForm2').bootstrapValidator('destroy').remove(); + $.fn.bootstrapValidator.DEFAULT_OPTIONS = defaultOptions; + }); + + it('triggers bv.form.success', function() { + this.$email.val('email@domain.com'); + this.bv.validate(); + expect($('#msg').html()).toEqual('form eventForm2 triggered bv.form.success event'); + }); + + it('does not trigger success.form.bv', function() { + this.$email.val('email@domain.com'); + this.bv.validate(); + expect($('#msg').html()).not.toEqual('form eventForm2 triggered success.form.bv event'); + }); + + it('triggers bv.form.error', function() { + spyOn(window, 'onerror'); + + this.$email.val('this is"not\\allowed@example.com'); + this.bv.validate(); + expect($('#msg').html()).toEqual('form eventForm2 triggered bv.form.error event'); + + expect(window.onerror).not.toHaveBeenCalled(); + }); +}); + +describe('event field trigger with events changed', function() { + var defaultOptions = $.fn.bootstrapValidator.DEFAULT_OPTIONS; + + beforeEach(function() { + $.fn.bootstrapValidator.DEFAULT_OPTIONS = $.extend({}, $.fn.bootstrapValidator.DEFAULT_OPTIONS, { + events: { + formInit: 'init.form.bv', + formError: 'bv.form.error', + formSuccess: 'bv.form.success', + fieldAdded: 'added.field.bv', + fieldRemoved: 'removed.field.bv', + fieldInit: 'init.field.bv', + fieldError: 'bv.field.error', + fieldSuccess: 'bv.field.success', + fieldStatus: 'status.field.bv', + validatorError: 'bv.validator.error', + validatorSuccess: 'success.validator.bv' + } + }); + + $([ + '
      ', + '
      ', + '
      ', + '', + '
      ', + '
      ' + ].join('\n')).appendTo('body'); + + $('#eventForm4') + .bootstrapValidator() + .on('success.field.bv', '[name="email"]', function(e, data) { + $('#msg').html('triggered success.field.bv on ' + data.field); + }) + .on('error.field.bv', '[name="email"]', function(e, data) { + $('#msg').html('triggered error.field.bv on ' + data.field); + }) + .on('bv.field.success', '[name="email"]', function(e, data) { + $('#msg').html('triggered bv.field.success on ' + data.field); + }) + .on('bv.field.error', '[name="email"]', function(e, data) { + $('#msg').html('triggered bv.field.error on ' + data.field); + }); + + this.bv = $('#eventForm4').data('bootstrapValidator'); + this.$email = this.bv.getFieldElements('email'); + }); + + afterEach(function() { + $('#eventForm4').bootstrapValidator('destroy').remove(); + $.fn.bootstrapValidator.DEFAULT_OPTIONS = defaultOptions; + }); + + it('triggers success.field.bv', function() { + this.$email.val('email@domain.com'); + this.bv.validate(); + expect($('#msg').html()).not.toEqual('triggered success.field.bv on email'); + }); + + it('does not trigger bv.field.success', function() { + this.$email.val('email@domain.com'); + this.bv.validate(); + expect($('#msg').html()).toEqual('triggered bv.field.success on email'); + }); + + it('does not trigger error.field.bv', function() { + this.$email.val('Abc.example.com'); + this.bv.validate(); + expect($('#msg').html()).not.toEqual('triggered error.field.bv on email'); + }); + + it('triggers bv.field.error', function() { + spyOn(window, 'onerror'); + + this.$email.val('Abc.example.com'); + this.bv.validate(); + expect($('#msg').html()).toEqual('triggered bv.field.error on email'); + + expect(window.onerror).not.toHaveBeenCalled(); + }); +}); + +// --- +// Validator events +// --- + +function onEmailAddressValidatorSuccess(e, data) { + $('#msg').html(data.validator + ' validator passed'); +}; + +function onEmailAddressValidatorError(e, data) { + $('#msg').html(data.validator + ' validator did not pass'); +}; + +describe('event validator declarative', function() { + beforeEach(function() { + $([ + '
      ', + '
      ', + '
      ', + '', + '
      ', + '
      ' + ].join('\n')).appendTo('body'); + + $('#eventForm').bootstrapValidator(); + + this.bv = $('#eventForm').data('bootstrapValidator'); + this.$email = this.bv.getFieldElements('email'); + }); + + afterEach(function() { + $('#eventForm').bootstrapValidator('destroy').remove(); + }); + + it('trigger data-bv-emailaddress-onsuccess', function() { + this.$email.val('email@domain.com'); + this.bv.validate(); + expect($('#msg').html()).toEqual('emailAddress validator passed'); + }); + + it('trigger data-bv-emailaddress-onerror', function() { + this.$email.val('A@b@c@example.com'); + this.bv.validate(); + expect($('#msg').html()).toEqual('emailAddress validator did not pass'); + }); +}); + +describe('event validator programmatically', function() { + beforeEach(function() { + $([ + '
      ', + '
      ', + '
      ', + '', + '
      ', + '
      ' + ].join('\n')).appendTo('body'); + + $('#eventForm').bootstrapValidator({ + fields: { + email: { + validators: { + emailAddress: { + onSuccess: function(e, data) { + $('#msg').html('emailAddress validator: onSuccess() called'); + }, + onError: function(e, data) { + $('#msg').html('emailAddress validator: onError() called'); + }, + message: 'The email address is not valid' + } + } + } + } + }); + + this.bv = $('#eventForm').data('bootstrapValidator'); + this.$email = this.bv.getFieldElements('email'); + }); + + afterEach(function() { + $('#eventForm').bootstrapValidator('destroy').remove(); + }); + + it('call onSuccess()', function() { + this.$email.val('email@domain.com'); + this.bv.validate(); + expect($('#msg').html()).toEqual('emailAddress validator: onSuccess() called'); + }); + + it('call onError()', function() { + this.$email.val('A@b@c@example.com'); + this.bv.validate(); + expect($('#msg').html()).toEqual('emailAddress validator: onError() called'); + }); +}); + +describe('excluded', function() { + beforeEach(function() { + $([ + '
      ', + '
      ', + '
      ', + '', + '
      ', + '
      ', + '', + '
      ', + '
      ', + '
      ' + ].join('')).appendTo('body'); + + $('#excludedForm').bootstrapValidator(); + + this.bv = $('#excludedForm').data('bootstrapValidator'); + this.$username = this.bv.getFieldElements('username'); + this.$email = this.bv.getFieldElements('email'); + }); + + afterEach(function() { + $('#excludedForm').bootstrapValidator('destroy').parent().remove(); + }); + + it('excluded form declarative', function() { + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + + this.bv.resetForm(); + this.$username.val('your_user_name'); + this.$email.val(''); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + }); + + it('excluded form programmatically', function() { + this.bv.destroy(); + $('#excludedForm').removeAttr('data-bv-excluded'); + + $('#excludedForm').bootstrapValidator({ + excluded: '[name="username"]' + }); + + this.bv = $('#excludedForm').data('bootstrapValidator'); + this.$username = this.bv.getFieldElements('username'); + this.$email = this.bv.getFieldElements('email'); + + this.$username.val(''); + this.$email.val('invalid#email.com'); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + + this.bv.resetForm(); + this.$email.val('valid@email.com'); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + }); + + it('excluded field declarative', function() { + this.bv.destroy(); + $('#excludedForm').removeAttr('data-bv-excluded'); + $('#excludedForm').find('[name="username"]').attr('data-bv-excluded', 'true'); + $('#excludedForm').find('[name="email"]').attr('data-bv-excluded', 'false'); + + this.bv = $('#excludedForm').bootstrapValidator().data('bootstrapValidator'); + this.$username = this.bv.getFieldElements('username'); + this.$email = this.bv.getFieldElements('email'); + + this.$username.val(''); + this.$email.val(''); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + + this.bv.resetForm(); + this.$email.val('invalid#email.com'); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + + this.bv.resetForm(); + this.$email.val('valid@email.com'); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + }); + + it('excluded field programmatically true/false', function() { + this.bv.destroy(); + $('#excludedForm').removeAttr('data-bv-excluded'); + + $('#excludedForm').bootstrapValidator({ + fields: { + username: { + excluded: true + }, + email: { + excluded: false + } + } + }); + + this.bv = $('#excludedForm').bootstrapValidator().data('bootstrapValidator'); + this.$username = this.bv.getFieldElements('username'); + this.$email = this.bv.getFieldElements('email'); + + this.$username.val(''); + this.$email.val(''); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + + this.bv.resetForm(); + this.$email.val('invalid#email.com'); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + + this.bv.resetForm(); + this.$email.val('valid@email.com'); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + }); + + it('excluded field programmatically "true"/"false"', function() { + this.bv.destroy(); + $('#excludedForm').removeAttr('data-bv-excluded'); + + $('#excludedForm').bootstrapValidator({ + fields: { + username: { + excluded: 'false' + }, + email: { + excluded: 'true' + } + } + }); + + this.bv = $('#excludedForm').bootstrapValidator().data('bootstrapValidator'); + this.$username = this.bv.getFieldElements('username'); + this.$email = this.bv.getFieldElements('email'); + + this.$username.val(''); + this.$email.val('valid@email.com'); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + + this.bv.resetForm(); + this.$username.val('your_user_name'); + this.$email.val('invalid#email.com'); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + }); +}); + +describe('group option', function() { + beforeEach(function() { + $([ + '
      ', + '
      ', + '
      ', + '', + '
      ', + '', + '
      ', + '
      ', + '
      ', + '', + '
      ', + '', + '
      ', + '
      ', + '
      ', + + '
      ', + '', + '
      ', + '', + '
      ', + '
      ', + '
      ' + ].join('')).appendTo('body'); + + $('#groupForm').bootstrapValidator({ + fields: { + firstName: { + group: '.firstNameGroup', + validators: { + notEmpty: { + message: 'The first name is required and cannot be empty' + } + } + }, + lastName: { + validators: { + notEmpty: { + message: 'The last name is required and cannot be empty' + } + } + }, + username: { + validators: { + notEmpty: { + message: 'The username is required and cannot be empty' + }, + stringLength: { + min: 6, + max: 30, + message: 'The username must be more than 6 and less than 30 characters long' + }, + regexp: { + regexp: /^[a-zA-Z0-9_\.]+$/, + message: 'The username can only consist of alphabetical, number, dot and underscore' + } + } + } + } + }); + + this.bv = $('#groupForm').data('bootstrapValidator'); + this.$firstName = this.bv.getFieldElements('firstName'); + this.$lastName = this.bv.getFieldElements('lastName'); + this.$username = this.bv.getFieldElements('username'); + }); + + afterEach(function() { + $('#groupForm').bootstrapValidator('destroy').remove(); + }); + + it('group default', function() { + this.$username.val('123@#$'); + this.bv.validate(); + expect(this.$username.parents('.form-group').hasClass('has-error')).toBeTruthy(); + expect(this.$username.parents('.form-group').hasClass('has-success')).toEqual(false); + + this.bv.resetForm(); + this.$username.val('validUser.Name'); + this.bv.validate(); + expect(this.$username.parents('.form-group').hasClass('has-success')).toBeTruthy(); + expect(this.$username.parents('.form-group').hasClass('has-error')).toEqual(false); + }); + + it('group programmatically', function() { + this.$firstName.val(''); + this.bv.validate(); + expect(this.$firstName.parents('.firstNameGroup').hasClass('has-error')).toBeTruthy(); + expect(this.$firstName.parents('.firstNameGroup').hasClass('has-success')).toEqual(false); + expect(this.$firstName.parents('.form-group').hasClass('has-error')).toEqual(false); + }); + + it('group declarative', function() { + this.$firstName.val('First'); + this.$lastName.val('Last'); + this.bv.validate(); + expect(this.$lastName.parents('.lastNameGroup').hasClass('has-success')).toBeTruthy(); + expect(this.$lastName.parents('.lastNameGroup').hasClass('has-error')).toEqual(false); + expect(this.$lastName.parents('.form-group').hasClass('has-success')).toEqual(false); + expect(this.$lastName.parents('.form-group').hasClass('has-error')).toEqual(false); + }); +}); + +describe('i18n', function() { + beforeEach(function() { + $([ + '
      ', + '
      ', + '', + '
      ', + '', + '
      ', + '
      ', + + '
      ', + '', + '
      ', + '', + '
      ', + '
      ', + + '
      ', + '', + '
      ', + '', + '
      ', + '
      ', + + '
      ', + '', + '
      ', + '', + '
      ', + '
      ', + + '
      ', + '', + '
      ', + '', + '
      ', + '
      ', + + '
      ', + '', + '
      ', + '
      ', + '', + '
      ', + '
      ', + '', + '
      ', + '
      ', + '', + '
      ', + '
      ', + '
      ', + + '
      ', + '', + '
      ', + '', + '
      ', + '
      ', + + '
      ', + '', + '
      ', + '', + '
      ', + '
      ', + + '
      ', + '', + '
      ', + '', + '
      ', + '
      ', + + '
      ', + '', + '
      ', + '
      ', + '', + '
      ', + '
      ', + '', + '
      ', + '
      ', + '', + '
      ', + '
      ', + '', + '
      ', + '
      ', + '', + '
      ', + '
      ', + '
      ', + + '
      ', + '', + '
      ', + '
      ', + '', + '
      ', + '
      ', + '', + '
      ', + '
      ', + '', + '
      ', + '
      ', + '', + '
      ', + '
      ', + '', + '
      ', + '
      ', + '', + '
      ', + '
      ', + '', + '
      ', + '
      ', + '', + '
      ', + '
      ', + '
      ', + '
      ' + ].join('')).appendTo('body'); + + $('#i18nForm').bootstrapValidator({ + feedbackIcons: { + valid: 'glyphicon glyphicon-ok', + invalid: 'glyphicon glyphicon-remove', + validating: 'glyphicon glyphicon-refresh' + }, + fields: { + fullName: { + validators: { + notEmpty: {}, + stringCase: { + 'case': 'upper' + } + } + }, + username: { + validators: { + notEmpty: {}, + stringLength: { + min: 6, + max: 20 + }, + regexp: { + regexp: /^[a-zA-Z0-9_\.]+$/ + }, + different: { + field: 'password' + } + } + }, + email: { + validators: { + emailAddress: {} + } + }, + password: { + validators: { + notEmpty: {}, + identical: { + field: 'confirmPassword' + }, + different: { + field: 'username' + } + } + }, + confirmPassword: { + validators: { + notEmpty: {}, + identical: { + field: 'password' + }, + different: { + field: 'username' + } + } + }, + age: { + validators: { + notEmpty: {}, + digits: {}, + greaterThan: { + value: 18 + }, + lessThan: { + value: 100 + } + } + }, + website: { + validators: { + notEmpty: {}, + uri: {} + } + }, + phoneNumber: { + validators: { + notEmpty: {}, + digits: {}, + phone: { + country: 'US' + } + } + }, + gender: { + validators: { + notEmpty: {} + } + }, + 'languages[]': { + validators: { + notEmpty: {} + } + }, + 'programs[]': { + validators: { + choice: { + min: 2, + max: 4 + } + } + } + } + }); + + this.bv = $('#i18nForm').data('bootstrapValidator'); + this.$fullName = this.bv.getFieldElements('fullName'); + this.$email = this.bv.getFieldElements('email'); + this.$userName = this.bv.getFieldElements('username'); + this.$password = this.bv.getFieldElements('password'); + this.$confirm = this.bv.getFieldElements('confirmPassword'); + this.$age = this.bv.getFieldElements('age'); + this.$website = this.bv.getFieldElements('website'); + this.$phone = this.bv.getFieldElements('phoneNumber'); + this.$program = this.bv.getFieldElements('programs[]'); + }); + + afterEach(function() { + $('#i18nForm').bootstrapValidator('destroy').remove(); + }); + + it('default message', function() { + var format = $.fn.bootstrapValidator.helpers.format, + i18n = $.fn.bootstrapValidator.i18n; + + this.bv.validate(); + expect(this.bv.getMessages(this.$fullName, 'notEmpty')[0]).toEqual(i18n.notEmpty['default']); + + this.$fullName.val('lowerName'); + this.bv.revalidateField('fullName'); + expect(this.bv.getMessages('fullName', 'stringCase')[0]).toEqual(i18n.stringCase.upper); + + this.bv.resetForm(); + this.$userName.val('123'); + this.bv.validate(); + expect(this.bv.getMessages('username', 'stringLength')[0]).toEqual(format(i18n.stringLength.between, [6, 20])); + + this.bv.resetForm(); + this.$userName.val('contain@#$'); + this.bv.validate(); + expect(this.bv.getMessages(this.$userName, 'regexp')[0]).toEqual(i18n.regexp['default']); + + this.bv.resetForm(); + this.$userName.val('validUserName'); + this.$password.val('validUserName'); + this.bv.validate(); + expect(this.bv.getMessages('username', 'different')[0]).toEqual(i18n.different['default']); + + this.bv.resetForm(); + this.$email.val('A@b@c@example.com'); + this.bv.validate(); + expect(this.bv.getMessages(this.$email, 'emailAddress')[0]).toEqual(i18n.emailAddress['default']); + + this.bv.resetForm(); + this.$password.val('@S3cur3P@@w0rd'); + this.$confirm.val('notMatch'); + this.bv.validate(); + expect(this.bv.getMessages('password', 'identical')[0]).toEqual(i18n.identical['default']); + + this.bv.resetForm(); + this.$age.val('notDigit'); + this.bv.validate(); + expect(this.bv.getMessages('age', 'digits')[0]).toEqual(i18n.digits['default']); + + this.bv.resetForm(); + this.$age.val(10); + this.bv.validate(); + expect(this.bv.getMessages(this.$age, 'greaterThan')[0]).toEqual(format(i18n.greaterThan['default'], 18)); + + this.bv.resetForm(); + this.$age.val(120); + this.bv.validate(); + expect(this.bv.getMessages('age', 'lessThan')[0]).toEqual(format(i18n.lessThan['default'], 100)); + + this.bv.resetForm(); + this.$website.val('http://invalidWebsite'); + this.bv.validate(); + expect(this.bv.getMessages('website', 'uri')[0]).toEqual(i18n.uri['default']); + + this.bv.resetForm(); + this.$phone.val('123456'); + this.bv.validate(); + expect(this.bv.getMessages('phoneNumber', 'phone')[0]).toEqual(format(i18n.phone.country, i18n.phone.countries['US'])); + + this.bv.resetForm(); + this.$program.eq(0).prop('checked', 'checked'); + this.bv.validate(); + expect(this.bv.getMessages(this.$program, 'choice')[0]).toEqual(format(i18n.choice.between, [2, 4])); + + this.bv.resetForm(); + this.$program.prop('checked', 'checked'); + this.bv.validate(); + expect(this.bv.getMessages('programs[]', 'choice')[0]).toEqual(format(i18n.choice.between, [2, 4])); + }); +}); + +describe('message', function() { + beforeEach(function() { + var html = [ + '
      ', + '
      ', + '
      ', + '', + '
      ', + '
      ', + '
      ' + ].join('\n'); + + $(html).appendTo('body'); + $('#messageForm').bootstrapValidator({ + fields: { + password: { + validators: { + notEmpty: { + message: 'The password is required' + }, + callback: { + callback: function(value, validator) { + // Check the password strength + if (value.length < 6) { + return { + valid: false, + message: 'The password must be more than 6 characters' + } + } + + if (value === value.toLowerCase()) { + return { + valid: false, + message: 'The password must contain at least one upper case character' + } + } + if (value === value.toUpperCase()) { + return { + valid: false, + message: 'The password must contain at least one lower case character' + } + } + if (value.search(/[0-9]/) < 0) { + return { + valid: false, + message: 'The password must contain at least one digit' + } + } + + return true; + } + } + } + } + } + }); + + this.bv = $('#messageForm').data('bootstrapValidator'); + this.$password = this.bv.getFieldElements('password'); + }); + + afterEach(function() { + $('#messageForm').bootstrapValidator('destroy').parent().remove(); + }); + + it('update message from callback', function() { + this.bv.resetForm(); + this.$password.val('123'); + this.bv.validate(); + expect(this.bv.getMessages('password', 'callback')[0]).toEqual('The password must be more than 6 characters'); + + this.bv.resetForm(); + this.$password.val('no_upper_case!@#'); + this.bv.validate(); + expect(this.bv.getMessages('password', 'callback')[0]).toEqual('The password must contain at least one upper case character'); + + this.bv.resetForm(); + this.$password.val('NO_LOWER_CASE123'); + this.bv.validate(); + expect(this.bv.getMessages('password', 'callback')[0]).toEqual('The password must contain at least one lower case character'); + + this.bv.resetForm(); + this.$password.val('NoDigits!@#'); + this.bv.validate(); + expect(this.bv.getMessages('password', 'callback')[0]).toEqual('The password must contain at least one digit'); + }); + + it('call updateMessage()', function() { + this.bv.updateStatus('password', this.bv.STATUS_INVALID, 'callback'); + + this.bv.updateMessage('password', 'callback', 'The password is weak'); + expect(this.bv.getMessages('password', 'callback')[0]).toEqual('The password is weak'); + + this.bv.updateMessage(this.$password, 'callback', 'The password is not strong'); + expect(this.bv.getMessages(this.$password, 'callback')[0]).toEqual('The password is not strong'); + }); +}); + +describe('submit', function() { + var submitted, originalTimeout; + + $.fn.bootstrapValidator.validators.fake_remote = { + validate: function(validator, $field, options) { + var dfd = new $.Deferred(); + setTimeout(function() { + dfd.resolve($field, 'fake_remote', { valid: options.valid }); + }, 0); + return dfd; + } + }; + + beforeEach(function() { + $([ + '
      ', + '
      ', + '', + '
      ', + '', + '
      ' + ].join('\n')).appendTo('body'); + + this.$form = $('#submitForm'); + this.$form + .bootstrapValidator() + .on('success.form.bv', function(e) { + e.preventDefault(); + ++submitted; + }) + .submit(function(e) { + e.preventDefault(); + }); + + submitted = 0; + this.bv = this.$form.data('bootstrapValidator'); + this.$username = this.bv.getFieldElements('username'); + + originalTimeout = jasmine.DEFAULT_TIMEOUT_INTERVAL; + jasmine.DEFAULT_TIMEOUT_INTERVAL = 10000; + }); + + afterEach(function() { + $('#submitForm').bootstrapValidator('destroy').remove(); + jasmine.DEFAULT_TIMEOUT_INTERVAL = originalTimeout; + }); + + // #481 + it('without callback nor remote', function(done) { + $('#sendButton').click(); + setTimeout(function() { + expect(submitted).toBe(1); + done(); + }, 0); + }); + + // #481 + it('with callback returning true', function(done) { + this.bv.addField('username', { + validators: { + callback: { + message: 'Please enter an username', + callback: function(value, validator, $field) { + return true; + } + } + } + }); + $('#sendButton').click(); + setTimeout(function() { + expect(submitted).toBe(1); + done(); + }, 0); + }); + + // #481 + it('with callback returning false', function(done) { + this.bv.addField('username', { + validators: { + callback: { + message: 'Please enter an username', + callback: function(value, validator, $field) { + return false; + } + } + } + }); + $('#sendButton').click(); + setTimeout(function() { + expect(submitted).toBe(0); + done(); + }, 0); + }); + + // #481 + it('with remote returning true', function(done) { + this.bv.addField('username', { + validators: { + remote: { + url: 'http://echo.jsontest.com/valid/true', + message: 'The username is not available' + } + } + }); + $('#sendButton').click(); + setTimeout(function() { + expect(submitted).toBe(1); + done(); + }, 3000); + }); + + // #481 + it('with remote returning false', function(done) { + this.bv.addField('username', { + validators: { + remote: { + url: 'http://echo.jsontest.com/valid/false', + message: 'The username is not available' + } + } + }); + $('#sendButton').click(); + setTimeout(function() { + expect(submitted).toBe(0); + done(); + }, 3000); + }); + + // #481 + it('with fake remote returning true', function(done) { + this.bv.addField('username', { + validators: { + fake_remote: { + message: 'The username is not available', + valid: true + } + } + }); + $('#sendButton').click(); + setTimeout(function() { + expect(submitted).toBe(1); + done(); + }, 100); + }); + + // #481 + it('with fake remote returning false', function(done) { + this.bv.addField('username', { + validators: { + fake_remote: { + message: 'The username is not available', + valid: false + } + } + }); + $('#sendButton').click(); + setTimeout(function() { + expect(submitted).toBe(0); + done(); + }, 100); + }); +}); + +describe('verbose option', function() { + beforeEach(function() { + $([ + '
      ', + '
      ', + '', + '
      ', + '
      ' + ].join('\n')).appendTo('body'); + + // The order of validators are alphabetical: + // - notEmpty + // - regexp + // - stringLength + }); + + afterEach(function() { + $('#verboseForm').bootstrapValidator('destroy').remove(); + }); + + it('set data-bv-verbose="false" for form', function() { + var bv = $('#verboseForm') + .attr('data-bv-verbose', 'false') + .bootstrapValidator('destroy') + .bootstrapValidator() + .data('bootstrapValidator'), + $fullName = bv.getFieldElements('fullName'), + messages; + + $fullName.val(''); + bv.validate(); + messages = bv.getMessages('fullName'); + expect(messages.length).toEqual(1); + expect(messages[0]).toEqual($fullName.attr('data-bv-notempty-message')); + + bv.resetForm(); + $fullName.val('Spe@#$'); + bv.validate(); + messages = bv.getMessages('fullName'); + expect(messages.length).toEqual(1); + expect(messages[0]).toEqual($fullName.attr('data-bv-regexp-message')); + + bv.resetForm(); + $fullName.val('Full'); + bv.validate(); + messages = bv.getMessages('fullName'); + expect(messages.length).toEqual(1); + expect(messages[0]).toEqual($fullName.attr('data-bv-stringlength-message')); + }); + + it('set data-bv-verbose="false" for field', function() { + var bv = $('#verboseForm') + .attr('data-bv-verbose', 'true') + .find('[name="fullName"]') + .attr('data-bv-verbose', 'false') + .end() + .bootstrapValidator('destroy') + .bootstrapValidator() + .data('bootstrapValidator'), + $fullName = bv.getFieldElements('fullName'), + messages; + + $fullName.val(''); + bv.validate(); + messages = bv.getMessages('fullName'); + expect(messages.length).toEqual(1); + expect(messages[0]).toEqual($fullName.attr('data-bv-notempty-message')); + + bv.resetForm(); + $fullName.val('Spe@#$'); + bv.validate(); + messages = bv.getMessages('fullName'); + expect(messages.length).toEqual(1); + expect(messages[0]).toEqual($fullName.attr('data-bv-regexp-message')); + + bv.resetForm(); + $fullName.val('Full'); + bv.validate(); + messages = bv.getMessages('fullName'); + expect(messages.length).toEqual(1); + expect(messages[0]).toEqual($fullName.attr('data-bv-stringlength-message')); + }); + + it('set verbose: "false" for form', function() { + var bv = $('#verboseForm') + .bootstrapValidator('destroy') + .bootstrapValidator({ verbose: false }) + .data('bootstrapValidator'), + $fullName = bv.getFieldElements('fullName'), + messages; + + $fullName.val(''); + bv.validate(); + messages = bv.getMessages('fullName'); + expect(messages.length).toEqual(1); + expect(messages[0]).toEqual($fullName.attr('data-bv-notempty-message')); + + bv.resetForm(); + $fullName.val('Spe@#$'); + bv.validate(); + messages = bv.getMessages('fullName'); + expect(messages.length).toEqual(1); + expect(messages[0]).toEqual($fullName.attr('data-bv-regexp-message')); + + bv.resetForm(); + $fullName.val('Full'); + bv.validate(); + messages = bv.getMessages('fullName'); + expect(messages.length).toEqual(1); + expect(messages[0]).toEqual($fullName.attr('data-bv-stringlength-message')); + }); + + // #1057 + it('set verbose: "false" for field', function() { + var bv = $('#verboseForm') + .attr('data-bv-verbose', 'true') + .bootstrapValidator('destroy') + .bootstrapValidator({ + verbose: true, + fields: { + fullName: { + verbose: false + } + } + }) + .data('bootstrapValidator'), + $fullName = bv.getFieldElements('fullName'), + messages; + + $fullName.val(''); + bv.validate(); + messages = bv.getMessages('fullName'); + expect(messages.length).toEqual(1); + expect(messages[0]).toEqual($fullName.attr('data-bv-notempty-message')); + + bv.resetForm(); + $fullName.val('Spe@#$'); + bv.validate(); + messages = bv.getMessages('fullName'); + expect(messages.length).toEqual(1); + expect(messages[0]).toEqual($fullName.attr('data-bv-regexp-message')); + + bv.resetForm(); + $fullName.val('Full'); + bv.validate(); + messages = bv.getMessages('fullName'); + expect(messages.length).toEqual(1); + expect(messages[0]).toEqual($fullName.attr('data-bv-stringlength-message')); + }); + + // #1055 + it('trigger "error.field.bv" event', function() { + var validators = [], // Array of not passed validators + bv = $('#verboseForm') + .attr('data-bv-verbose', 'true') + .bootstrapValidator('destroy') + .bootstrapValidator({ + verbose: true, + fields: { + fullName: { + verbose: false + } + } + }) + .on('error.field.bv', function(e, data) { + validators.push(data.validator); + }) + .data('bootstrapValidator'), + $fullName = bv.getFieldElements('fullName'); + + $fullName.val(''); + bv.validate(); + expect(validators.length).toEqual(1); + expect(validators[0]).toEqual('notEmpty'); + + validators = []; + bv.resetForm(); + $fullName.val('Spe@#$'); + bv.validate(); + expect(validators.length).toEqual(1); + expect(validators[0]).toEqual('regexp'); + + validators = []; + bv.resetForm(); + $fullName.val('Full'); + bv.validate(); + expect(validators.length).toEqual(1); + expect(validators[0]).toEqual('stringLength'); + }); +}); + +function betweenCompareMin() { + var compareTo = $('#betweenForm').find('[name="minAge"]').val(); + $('#msgMin').html('betweenCompareMin() called; compare to ' + compareTo); + return compareTo; +}; + +function betweenCompareMax() { + var compareTo = $('#betweenForm').find('[name="maxAge"]').val(); + $('#msgMax').html('betweenCompareMax() called; compare to ' + compareTo); + return compareTo; +}; + +TestSuite = $.extend({}, TestSuite, { + between: { + compareToMin: function(value, validator, $field) { + var compareTo = $('#betweenForm').find('[name="minAge"]').val(); + $('#msgMin').html('TestSuite.between.compareToMin() called; compare to ' + compareTo); + return compareTo; + }, + + compareToMax: function(value, validator, $field) { + var compareTo = $('#betweenForm').find('[name="maxAge"]').val(); + $('#msgMax').html('TestSuite.between.compareToMax() called; compare to ' + compareTo); + return compareTo; + } + } +}); + +describe('between', function() { + beforeEach(function() { + $([ + '
      ', + '
      ', + '
      ', + '
      ', + '', + '
      ', + '
      ', + '', + '
      ', + '
      ', + '', + '
      ', + '
      ' + ].join('\n')).appendTo('body'); + + $('#betweenForm').bootstrapValidator(); + + this.bv = $('#betweenForm').data('bootstrapValidator'); + this.$minAge = this.bv.getFieldElements('minAge'); + this.$maxAge = this.bv.getFieldElements('maxAge'); + this.$age = this.bv.getFieldElements('age'); + }); + + afterEach(function() { + $('#betweenForm').bootstrapValidator('destroy').remove(); + }); + + it('not a number', function() { + this.$age.val('50abc'); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + }); + + it('compare to value', function() { + this.$age.val(10); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + + this.bv.resetForm(); + this.$age.val(120); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + + this.bv.resetForm(); + this.$age.val(30); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + }); + + it('compare to other field', function() { + this.bv.updateOption('age', 'between', 'min', 'minAge'); + this.bv.updateOption('age', 'between', 'max', 'maxAge'); + + this.$minAge.val(2); + this.$maxAge.val(10); + this.$age.val(5); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + + this.bv.resetForm(); + this.$minAge.val(20); + this.$maxAge.val(40); + this.$age.val(50); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + expect(this.bv.getMessages('age', 'between')[0]).toEqual($.fn.bootstrapValidator.helpers.format($.fn.bootstrapValidator.i18n.between['default'], [this.$minAge.val(), this.$maxAge.val()])); + }); + + // #1048 + it('compare to other field that value has comma', function() { + this.bv.updateOption('age', 'between', 'min', 'minAge'); + this.bv.updateOption('age', 'between', 'max', 'maxAge'); + + this.$minAge.val('2,5'); + this.$maxAge.val('10,5'); + this.$age.val(5); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + + this.bv.resetForm(); + this.$minAge.val('20,5'); + this.$maxAge.val('40,5'); + this.$age.val(50); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + expect(this.bv.getMessages('age', 'between')[0]).toEqual($.fn.bootstrapValidator.helpers.format($.fn.bootstrapValidator.i18n.between['default'], [this.$minAge.val(), this.$maxAge.val()])); + }); + + it('compare to return value of a function', function() { + this.bv.updateOption('age', 'between', 'min', 'betweenCompareMin'); + this.bv.updateOption('age', 'between', 'max', 'betweenCompareMax'); + + this.$minAge.val(20); + this.$maxAge.val(30); + this.$age.val(18); + this.bv.validate(); + expect($('#msgMin').html()).toEqual('betweenCompareMin() called; compare to 20'); + expect($('#msgMax').html()).toEqual('betweenCompareMax() called; compare to 30'); + expect(this.bv.isValid()).toEqual(false); + expect(this.bv.getMessages('age', 'between')[0]).toEqual($.fn.bootstrapValidator.helpers.format($.fn.bootstrapValidator.i18n.between['default'], [this.$minAge.val(), this.$maxAge.val()])); + + this.bv.resetForm(); + this.$minAge.val(2); + this.$maxAge.val(10); + this.$age.val(6); + this.bv.validate(); + expect($('#msgMin').html()).toEqual('betweenCompareMin() called; compare to 2'); + expect($('#msgMax').html()).toEqual('betweenCompareMax() called; compare to 10'); + expect(this.bv.isValid()).toBeTruthy(); + }); + + it('compare to return value of a namespace function', function() { + this.bv.updateOption('age', 'between', 'min', 'TestSuite.between.compareToMin'); + this.bv.updateOption('age', 'between', 'max', 'TestSuite.between.compareToMax'); + + this.$minAge.val(20); + this.$maxAge.val(30); + this.$age.val(40); + this.bv.validate(); + expect($('#msgMin').html()).toEqual('TestSuite.between.compareToMin() called; compare to 20'); + expect($('#msgMax').html()).toEqual('TestSuite.between.compareToMax() called; compare to 30'); + expect(this.bv.isValid()).toEqual(false); + expect(this.bv.getMessages('age', 'between')[0]).toEqual($.fn.bootstrapValidator.helpers.format($.fn.bootstrapValidator.i18n.between['default'], [this.$minAge.val(), this.$maxAge.val()])); + + this.bv.resetForm(); + this.$minAge.val(2); + this.$maxAge.val(10); + this.$age.val(5); + this.bv.validate(); + expect($('#msgMin').html()).toEqual('TestSuite.between.compareToMin() called; compare to 2'); + expect($('#msgMax').html()).toEqual('TestSuite.between.compareToMax() called; compare to 10'); + expect(this.bv.isValid()).toBeTruthy(); + }); +}); + +function validateCaptcha(value, validator, $field) { + var items = $('#captchaOperation').html().split(' '), sum = parseInt(items[0]) + parseInt(items[2]); + return value === sum + ''; +}; + +describe('callback', function() { + beforeEach(function() { + $([ + '
      ', + '
      ', + '', + '
      ', + '', + '
      ', + '
      ', + '
      ', + '
      ', + '', + '
      ', + '
      ', + '
      ' + ].join('\n')).appendTo('body'); + + $('#callbackForm').bootstrapValidator({ + fields: { + captcha: { + validators: { + callback: { + message: 'Wrong answer', + callback: function(value, validator, $field) { + return validateCaptcha(value, validator, $field); + } + } + } + } + } + }); + + this.bv = $('#callbackForm').data('bootstrapValidator'); + this.$captcha = this.bv.getFieldElements('captcha'); + this.$declarativeCaptcha = this.bv.getFieldElements('declarativeCaptcha'); + }); + + afterEach(function() { + $('#callbackForm').bootstrapValidator('destroy').remove(); + }); + + it('execute the callback', function() { + $('#captchaOperation').html('1 + 2'); + + this.$captcha.val('3'); + this.bv.validate(); + expect(this.bv.isValidField('captcha')).toBeTruthy(); + + this.bv.resetForm(); + this.$captcha.val('5'); + this.bv.validate(); + expect(this.bv.isValidField('captcha')).toEqual(false); + }); + + it('callback declarative', function() { + $('#captchaOperation').html('10 + 20'); + + this.$declarativeCaptcha.val('40'); + this.bv.validate(); + expect(this.bv.isValidField('declarativeCaptcha')).toEqual(false); + + this.bv.resetForm(); + this.$declarativeCaptcha.val('30'); + this.bv.validate(); + expect(this.bv.isValidField('declarativeCaptcha')).toBeTruthy(); + }); +}); + +describe('color', function() { + beforeEach(function() { + $([ + '
      ', + '
      ', + '', + '
      ', + '
      ', + '', + '
      ', + '
      ', + '', + '
      ', + '
      ', + '', + '
      ', + '
      ', + '', + '
      ', + '
      ', + '', + '
      ', + '
      ', + '', + '
      ', + '
      ', + '', + '
      ', + '
      ' + ].join('\n')).appendTo('body'); + + $('#colorForm').bootstrapValidator({ + fields: { + color: { + validators: { + color: { } + } + }, + colorMultiple: { + validators: { + color: { + type: [ + 'hex', + 'rgb' + ] + } + } + }, + colorHex: { + validators: { + color: { + type: ['hex'] + } + } + }, + colorRgb: { + validators: { + color: { + type: ['rgb'] + } + } + }, + colorRgba: { + validators: { + color: { + type: ['rgba'] + } + } + }, + colorHsl: { + validators: { + color: { + type: ['hsl'] + } + } + }, + colorHsla: { + validators: { + color: { + type: ['hsla'] + } + } + }, + colorKeyword: { + validators: { + color: { + type: ['keyword'] + } + } + } + } + }); + + this.bv = $('#colorForm').data('bootstrapValidator'); + this.$color = this.bv.getFieldElements('color'); + this.$colorMultiple = this.bv.getFieldElements('colorMultiple'); + this.$colorHex = this.bv.getFieldElements('colorHex'); + this.$colorRgb = this.bv.getFieldElements('colorRgb'); + this.$colorRgba = this.bv.getFieldElements('colorRgba'); + this.$colorHsl = this.bv.getFieldElements('colorHsl'); + this.$colorHsla = this.bv.getFieldElements('colorHsla'); + this.$colorKeyword = this.bv.getFieldElements('colorKeyword'); + }); + + afterEach(function() { + $('#colorForm').bootstrapValidator('destroy').remove(); + }); + + // Start hsla() tests + it('Run hsla() test suite on hsla only field', function() { + this.$colorHsla.val('hsla(120,50%,50%,1)'); + this.bv.validate(); + expect(this.bv.isValidField('colorHsla')).toBeTruthy(); + + this.bv.resetForm(); + this.$colorHsla.val('hsla( 120 , 50% , 50%, 1 )'); + this.bv.validate(); + expect(this.bv.isValidField('colorHsla')).toBeTruthy(); + + this.bv.resetForm(); + this.$colorHsla.val('hsla( 120, 50%, 50% , 1 )'); + this.bv.validate(); + expect(this.bv.isValidField('colorHsla')).toBeTruthy(); + + this.bv.resetForm(); + this.$colorHsla.val('hsla(-120,50%,50%,1)'); + this.bv.validate(); + expect(this.bv.isValidField('colorHsla')).toBeTruthy(); + + this.bv.resetForm(); + this.$colorHsla.val('hsla(480,50%,50%,1)'); + this.bv.validate(); + expect(this.bv.isValidField('colorHsla')).toBeTruthy(); + + this.bv.resetForm(); + this.$colorHsla.val('hsla(120,50%,100%,0)'); + this.bv.validate(); + expect(this.bv.isValidField('colorHsla')).toBeTruthy(); + + this.bv.resetForm(); + this.$colorHsla.val('hsla(120,50%,100%,1)'); + this.bv.validate(); + expect(this.bv.isValidField('colorHsla')).toBeTruthy(); + + this.bv.resetForm(); + this.$colorHsla.val('hsla(120,50%,100%,0.5)'); + this.bv.validate(); + expect(this.bv.isValidField('colorHsla')).toBeTruthy(); + + this.bv.resetForm(); + this.$colorHsla.val('hsla(120,50%,100%,.5)'); + this.bv.validate(); + expect(this.bv.isValidField('colorHsla')).toBeTruthy(); + + this.bv.resetForm(); + this.$colorHsla.val('hsla(120,50%,100%,.524141)'); + this.bv.validate(); + expect(this.bv.isValidField('colorHsla')).toBeTruthy(); + + this.bv.resetForm(); + this.$colorHsla.val('hsla(120,50%,100%,50%)'); + this.bv.validate(); + expect(this.bv.isValidField('colorHsla')).toEqual(false); + + this.bv.resetForm(); + this.$colorHsla.val('hsla(120,50%,100%,2)'); + this.bv.validate(); + expect(this.bv.isValidField('colorHsla')).toEqual(false); + + this.bv.resetForm(); + this.$colorHsla.val('hsla(120,50%,100%,-1)'); + this.bv.validate(); + expect(this.bv.isValidField('colorHsla')).toEqual(false); + + this.bv.resetForm(); + this.$colorHsla.val('hsla(120,50%,100%,1.000000000001)'); + this.bv.validate(); + expect(this.bv.isValidField('colorHsla')).toEqual(false); + + this.bv.resetForm(); + this.$colorHsla.val('hsla(120,50%,100%,-0.5)'); + this.bv.validate(); + expect(this.bv.isValidField('colorHsla')).toEqual(false); + + this.bv.resetForm(); + this.$colorHsla.val('hsla(120,50%,100%,2.3)'); + this.bv.validate(); + expect(this.bv.isValidField('colorHsla')).toEqual(false); + + this.bv.resetForm(); + this.$colorHsla.val('hsla(10,-50%,50%,1)'); + this.bv.validate(); + expect(this.bv.isValidField('colorHsla')).toEqual(false); + + this.bv.resetForm(); + this.$colorHsla.val('hsla(10,50%,-50%,1)'); + this.bv.validate(); + expect(this.bv.isValidField('colorHsla')).toEqual(false); + + this.bv.resetForm(); + this.$colorHsla.val('120,50%,50%,1'); + this.bv.validate(); + expect(this.bv.isValidField('colorHsla')).toEqual(false); + + this.bv.resetForm(); + this.$colorHsla.val('hsla(120,100%,101%,1)'); + this.bv.validate(); + expect(this.bv.isValidField('colorHsla')).toEqual(false); + + this.bv.resetForm(); + this.$colorHsla.val('hsla (120,50%,50%,1)'); + this.bv.validate(); + expect(this.bv.isValidField('colorHsla')).toEqual(false); + + this.bv.resetForm(); + this.$colorHsla.val(' hsla(120,50%,50%,1)'); + this.bv.validate(); + expect(this.bv.isValidField('colorHsla')).toEqual(false); + + this.bv.resetForm(); + this.$colorHsla.val('hsla(120,50%,50%,1) '); + this.bv.validate(); + expect(this.bv.isValidField('colorHsla')).toEqual(false); + + this.bv.resetForm(); + this.$colorHsla.val('hsla(50%, 50%, 100%,1)'); + this.bv.validate(); + expect(this.bv.isValidField('colorHsla')).toEqual(false); + + this.bv.resetForm(); + this.$colorHsla.val('hsla(120, 50, 100%,1)'); + this.bv.validate(); + expect(this.bv.isValidField('colorHsla')).toEqual(false); + + this.bv.resetForm(); + this.$colorHsla.val('hsla(120, 50%, 100,1)'); + this.bv.validate(); + expect(this.bv.isValidField('colorHsla')).toEqual(false); + }); + + // Start hsl() tests + it('Run hsl() test suite on hsl only field', function() { + this.$colorHsl.val('hsl(120,50%,50%)'); + this.bv.validate(); + expect(this.bv.isValidField('colorHsl')).toBeTruthy(); + + this.bv.resetForm(); + this.$colorHsl.val('hsl( 120 , 50% , 50% )'); + this.bv.validate(); + expect(this.bv.isValidField('colorHsl')).toBeTruthy(); + + this.bv.resetForm(); + this.$colorHsl.val('hsl( 120, 50%, 50% )'); + this.bv.validate(); + expect(this.bv.isValidField('colorHsl')).toBeTruthy(); + + this.bv.resetForm(); + this.$colorHsl.val('hsl(-120,50%,50%)'); + this.bv.validate(); + expect(this.bv.isValidField('colorHsl')).toBeTruthy(); + + this.bv.resetForm(); + this.$colorHsl.val('hsl(480,50%,50%)'); + this.bv.validate(); + expect(this.bv.isValidField('colorHsl')).toBeTruthy(); + + this.bv.resetForm(); + this.$colorHsl.val('hsl(10,-50%,50%)'); + this.bv.validate(); + expect(this.bv.isValidField('colorHsl')).toEqual(false); + + this.bv.resetForm(); + this.$colorHsl.val('hsl(10,50%,-50%)'); + this.bv.validate(); + expect(this.bv.isValidField('colorHsl')).toEqual(false); + + this.bv.resetForm(); + this.$colorHsl.val('120,50%,50%'); + this.bv.validate(); + expect(this.bv.isValidField('colorHsl')).toEqual(false); + + this.bv.resetForm(); + this.$colorHsl.val('hsl(120,100%,101%)'); + this.bv.validate(); + expect(this.bv.isValidField('colorHsl')).toEqual(false); + + this.bv.resetForm(); + this.$colorHsl.val('hsl (120,50%,50%)'); + this.bv.validate(); + expect(this.bv.isValidField('colorHsl')).toEqual(false); + + this.bv.resetForm(); + this.$colorHsl.val(' hsl(120,50%,50%)'); + this.bv.validate(); + expect(this.bv.isValidField('colorHsl')).toEqual(false); + + this.bv.resetForm(); + this.$colorHsl.val('hsl(120,50%,50%) '); + this.bv.validate(); + expect(this.bv.isValidField('colorHsl')).toEqual(false); + + this.bv.resetForm(); + this.$colorHsl.val('hsl(50%, 50%, 100%)'); + this.bv.validate(); + expect(this.bv.isValidField('colorHsl')).toEqual(false); + + this.bv.resetForm(); + this.$colorHsl.val('hsl(120, 50, 100%)'); + this.bv.validate(); + expect(this.bv.isValidField('colorHsl')).toEqual(false); + + this.bv.resetForm(); + this.$colorHsl.val('hsl(120, 50%, 100)'); + this.bv.validate(); + expect(this.bv.isValidField('colorHsl')).toEqual(false); + }); + + // Start keyword test + it('Run keyword test suite on keyword only field', function() { + this.$colorKeyword.val('transparent'); + this.bv.validate(); + expect(this.bv.isValidField('colorKeyword')).toBeTruthy(); + + this.bv.resetForm(); + this.$colorKeyword.val('transparent'); + this.bv.validate(); + expect(this.bv.isValidField('colorKeyword')).toBeTruthy(); + + this.bv.resetForm(); + this.$colorKeyword.val('blueviolet red'); + this.bv.validate(); + expect(this.bv.isValidField('colorKeyword')).toEqual(false); + + this.bv.resetForm(); + this.$colorKeyword.val('shady'); + this.bv.validate(); + expect(this.bv.isValidField('colorKeyword')).toEqual(false); + + this.bv.resetForm(); + this.$colorKeyword.val('blueish'); + this.bv.validate(); + expect(this.bv.isValidField('colorKeyword')).toEqual(false); + }); + + // Start rgba() test + it('Run rgba() test suite on rgba only field', function() { + this.$colorRgba.val('rgba(255,255,255,1)'); + this.bv.validate(); + expect(this.bv.isValidField('colorRgba')).toBeTruthy(); + + this.bv.resetForm(); + this.$colorRgba.val('rgba( 255 , 255 , 255 , 1 )'); + this.bv.validate(); + expect(this.bv.isValidField('colorRgba')).toBeTruthy(); + + this.bv.resetForm(); + this.$colorRgba.val('rgba( 255 , 255 , 255 , 1 )'); + this.bv.validate(); + expect(this.bv.isValidField('colorRgba')).toBeTruthy(); + + this.bv.resetForm(); + this.$colorRgba.val('rgba(255,255,255,1)'); + this.bv.validate(); + expect(this.bv.isValidField('colorRgba')).toBeTruthy(); + + this.bv.resetForm(); + this.$colorRgba.val('rgba(100%,100%,100%,1)'); + this.bv.validate(); + expect(this.bv.isValidField('colorRgba')).toBeTruthy(); + + this.bv.resetForm(); + this.$colorRgba.val('rgba(255,255,255,0)'); + this.bv.validate(); + expect(this.bv.isValidField('colorRgba')).toBeTruthy(); + + this.bv.resetForm(); + this.$colorRgba.val('rgba(255,255,255,1)'); + this.bv.validate(); + expect(this.bv.isValidField('colorRgba')).toBeTruthy(); + + this.bv.resetForm(); + this.$colorRgba.val('rgba(255,255,255,0.5)'); + this.bv.validate(); + expect(this.bv.isValidField('colorRgba')).toBeTruthy(); + + this.bv.resetForm(); + this.$colorRgba.val('rgba(255,255,255,.5)'); + this.bv.validate(); + expect(this.bv.isValidField('colorRgba')).toBeTruthy(); + + this.bv.resetForm(); + this.$colorRgba.val('rgba(255,255,255,.524141)'); + this.bv.validate(); + expect(this.bv.isValidField('colorRgba')).toBeTruthy(); + + this.bv.resetForm(); + this.$colorRgba.val('rgba(100%,100%,100%,0)'); + this.bv.validate(); + expect(this.bv.isValidField('colorRgba')).toBeTruthy(); + + this.bv.resetForm(); + this.$colorRgba.val('rgba(100%,100%,100%,1)'); + this.bv.validate(); + expect(this.bv.isValidField('colorRgba')).toBeTruthy(); + + this.bv.resetForm(); + this.$colorRgba.val('rgba(100%,100%,100%,0.5)'); + this.bv.validate(); + expect(this.bv.isValidField('colorRgba')).toBeTruthy(); + + this.bv.resetForm(); + this.$colorRgba.val('rgba(100%,100%,100%,.5)'); + this.bv.validate(); + expect(this.bv.isValidField('colorRgba')).toBeTruthy(); + + this.bv.resetForm(); + this.$colorRgba.val('rgba(100%,100%,100%,.524141)'); + this.bv.validate(); + expect(this.bv.isValidField('colorRgba')).toBeTruthy(); + + this.bv.resetForm(); + this.$colorRgba.val('rgba(100%,100%,100%,50%)'); + this.bv.validate(); + expect(this.bv.isValidField('colorRgba')).toEqual(false); + + this.bv.resetForm(); + this.$colorRgba.val('rgba(255,255,255,2)'); + this.bv.validate(); + expect(this.bv.isValidField('colorRgba')).toEqual(false); + + this.bv.resetForm(); + this.$colorRgba.val('rgba(255,255,255,-1)'); + this.bv.validate(); + expect(this.bv.isValidField('colorRgba')).toEqual(false); + + this.bv.resetForm(); + this.$colorRgba.val('rgba(255,255,255,1.000000000001)'); + this.bv.validate(); + expect(this.bv.isValidField('colorRgba')).toEqual(false); + + this.bv.resetForm(); + this.$colorRgba.val('rgba(255,255,255,-0.5)'); + this.bv.validate(); + expect(this.bv.isValidField('colorRgba')).toEqual(false); + + this.bv.resetForm(); + this.$colorRgba.val('rgba(255,255,255,2.3)'); + this.bv.validate(); + expect(this.bv.isValidField('colorRgba')).toEqual(false); + + this.bv.resetForm(); + this.$colorRgba.val('rgba(255,255,100%,1)'); + this.bv.validate(); + expect(this.bv.isValidField('colorRgba')).toEqual(false); + + this.bv.resetForm(); + this.$colorRgba.val('rgba(-10,255,255,1)'); + this.bv.validate(); + expect(this.bv.isValidField('colorRgba')).toEqual(false); + + this.bv.resetForm(); + this.$colorRgba.val('rgba(-10%,100%,100%,1)'); + this.bv.validate(); + expect(this.bv.isValidField('colorRgba')).toEqual(false); + + this.bv.resetForm(); + this.$colorRgba.val('255,255,255,1'); + this.bv.validate(); + expect(this.bv.isValidField('colorRgba')).toEqual(false); + + this.bv.resetForm(); + this.$colorRgba.val('rgba(255,255,256),1'); + this.bv.validate(); + expect(this.bv.isValidField('colorRgba')).toEqual(false); + + this.bv.resetForm(); + this.$colorRgba.val('rgba(100%,100%,101%,1)'); + this.bv.validate(); + expect(this.bv.isValidField('colorRgba')).toEqual(false); + + this.bv.resetForm(); + this.$colorRgba.val('rgba (255,255,255,1)'); + this.bv.validate(); + expect(this.bv.isValidField('colorRgba')).toEqual(false); + + this.bv.resetForm(); + this.$colorRgba.val(' rgba(255,255,255,1)'); + this.bv.validate(); + expect(this.bv.isValidField('colorRgba')).toEqual(false); + + this.bv.resetForm(); + this.$colorRgba.val('rgba(255,255,255,1) '); + this.bv.validate(); + expect(this.bv.isValidField('colorRgba')).toEqual(false); + }); + + // Start rgb() test + it('Run rgb() test suite on rgb only field', function() { + this.$colorRgb.val('rgb(255,255,255)'); + this.bv.validate(); + expect(this.bv.isValidField('colorRgb')).toBeTruthy(); + + this.bv.resetForm(); + this.$colorRgb.val('rgb( 255 , 255 , 255 )'); + this.bv.validate(); + expect(this.bv.isValidField('colorRgb')).toBeTruthy(); + + this.bv.resetForm(); + this.$colorRgb.val('rgb( 255, 255, 255 )'); + this.bv.validate(); + expect(this.bv.isValidField('colorRgb')).toBeTruthy(); + + this.bv.resetForm(); + this.$colorRgb.val('rgb(255,255,255)'); + this.bv.validate(); + expect(this.bv.isValidField('colorRgb')).toBeTruthy(); + + this.bv.resetForm(); + this.$colorRgb.val('rgb(100%,100%,100%)'); + this.bv.validate(); + expect(this.bv.isValidField('colorRgb')).toBeTruthy(); + + this.bv.resetForm(); + this.$colorRgb.val('rgb(255,255,100%)'); + this.bv.validate(); + expect(this.bv.isValidField('colorRgb')).toEqual(false); + + this.bv.resetForm(); + this.$colorRgb.val('rgb(-10,255,255)'); + this.bv.validate(); + expect(this.bv.isValidField('colorRgb')).toEqual(false); + + this.bv.resetForm(); + this.$colorRgb.val('rgb(-10%,100%,100%)'); + this.bv.validate(); + expect(this.bv.isValidField('colorRgb')).toEqual(false); + + this.bv.resetForm(); + this.$colorRgb.val('255,255,255'); + this.bv.validate(); + expect(this.bv.isValidField('colorRgb')).toEqual(false); + + this.bv.resetForm(); + this.$colorRgb.val('rgb(255,255,256)'); + this.bv.validate(); + expect(this.bv.isValidField('colorRgb')).toEqual(false); + + this.bv.resetForm(); + this.$colorRgb.val('rgb(100%,100%,101%)'); + this.bv.validate(); + expect(this.bv.isValidField('colorRgb')).toEqual(false); + + this.bv.resetForm(); + this.$colorRgb.val('rgb (255,255,255)'); + this.bv.validate(); + expect(this.bv.isValidField('colorRgb')).toEqual(false); + + this.bv.resetForm(); + this.$colorRgb.val(' rgb(255,255,255)'); + this.bv.validate(); + expect(this.bv.isValidField('colorRgb')).toEqual(false); + + this.bv.resetForm(); + this.$colorRgb.val('rgb(255,255,255) '); + this.bv.validate(); + expect(this.bv.isValidField('colorRgb')).toEqual(false); + }); + + /* Run individual tests */ + it('Individual field keyword: accept keyword', function() { + this.$colorKeyword.val('blue'); + this.bv.validate(); + expect(this.bv.isValidField('colorKeyword')).toBeTruthy(); + }); + + it('Individual field keyword: reject rgb', function() { + this.$colorKeyword.val('rgb(255,255,255)'); + this.bv.validate(); + expect(this.bv.isValidField('colorKeyword')).toEqual(false); + }); + + it('Individual field hex: accept 6 char hex', function() { + this.$colorHex.val('#0000FF'); + this.bv.validate(); + expect(this.bv.isValidField('colorHex')).toBeTruthy(); + }); + + it('Individual field hex: accept 3 char hex', function() { + this.$colorHex.val('#00F'); + this.bv.validate(); + expect(this.bv.isValidField('colorHex')).toBeTruthy(); + }); + it('Individual field hex: reject keyword', function() { + this.$colorHex.val('blue'); + this.bv.validate(); + expect(this.bv.isValidField('colorHex')).toEqual(false); + }); + + it('Individual field rgb(): accept rgb()', function() { + this.$colorRgb.val('rgb(255,255,255)'); + this.bv.validate(); + expect(this.bv.isValidField('colorRgb')).toBeTruthy(); + }); + + it('Individual field rgb(): reject hex', function() { + this.$colorRgb.val('#0000FF'); + this.bv.validate(); + expect(this.bv.isValidField('colorRgb')).toEqual(false); + }); + + it('Individual field rgba(): accept rgba()', function() { + this.$colorRgba.val('rgba(255,255,255,1)'); + this.bv.validate(); + expect(this.bv.isValidField('colorRgba')).toBeTruthy(); + }); + + it('Individual field rgba(): reject rgb()', function() { + this.$colorRgba.val('rgb(255,255,255)'); + this.bv.validate(); + expect(this.bv.isValidField('colorRgba')).toEqual(false); + }); + + it('Individual field hsl(): accept hsl()', function() { + this.$colorHsl.val('hsl(120,50%,50%)'); + this.bv.validate(); + expect(this.bv.isValidField('colorHsl')).toBeTruthy(); + }); + + it('Individual field hsl(): reject rgba()', function() { + this.$colorHsl.val('rgba(255,255,255,1)'); + this.bv.validate(); + expect(this.bv.isValidField('colorHsl')).toEqual(false); + }); + + it('Individual field hsla(): accept hsla()', function() { + this.$colorHsla.val('hsla(120,50%,50%,1)'); + this.bv.validate(); + expect(this.bv.isValidField('colorHsla')).toBeTruthy(); + }); + + it('Individual field hsla(): reject hsl()', function() { + this.$colorHsla.val('hsl(120,50%,50%)'); + this.bv.validate(); + expect(this.bv.isValidField('colorHsla')).toEqual(false); + }); + + /* Run validation message tests */ + it('Validation message tests', function() { + this.$color.val('notacolor'); + this.bv.validate(); + expect(this.bv.isValidField('color')).toEqual(false); + expect(this.bv.getMessages(this.$color, 'color')[0]).toEqual($.fn.bootstrapValidator.i18n.color.default); + }); +}); + +describe('creditCard', function() { + // Get the fake credit card number at http://www.getcreditcardnumbers.com/ + + beforeEach(function() { + var html = [ + '
      ', + '
      ', + '
      ', + '', + '
      ', + '
      ', + '
      ' + ].join('\n'); + + $(html).appendTo('body'); + $('#ccForm').bootstrapValidator(); + + this.bv = $('#ccForm').data('bootstrapValidator'); + this.$creditCard = this.bv.getFieldElements('cc'); + }); + + afterEach(function() { + $('#ccForm').bootstrapValidator('destroy').parent().remove(); + }); + + it('accept spaces', function() { + this.$creditCard.val('5267 9789 9451 9654'); + this.bv.validate(); + expect(this.bv.isValidField('cc')).toBeTruthy(); + }); + + it('accept dashes', function() { + this.$creditCard.val('6011-2649-6840-4521'); + this.bv.validate(); + expect(this.bv.isValidField('cc')).toBeTruthy(); + }); + + it('invalid format', function() { + this.$creditCard.val('4539.1870.2954.3862'); + this.bv.validate(); + expect(this.bv.isValidField('cc')).toEqual(false); + }); + + it('American Express', function() { + this.$creditCard.val('340653705597107'); + this.bv.validate(); + expect(this.bv.isValidField('cc')).toBeTruthy(); + }); + + it('American Express invalid length', function() { + this.$creditCard.val('3744148309166730'); + this.bv.validate(); + expect(this.bv.isValidField('cc')).toEqual(false); + }); + + it('American Express invalid prefix', function() { + this.$creditCard.val('356120148436654'); + this.bv.validate(); + expect(this.bv.isValidField('cc')).toEqual(false); + }); + + it('Diners Club', function() { + this.$creditCard.val('30130708434187'); + this.bv.validate(); + expect(this.bv.isValidField('cc')).toBeTruthy(); + }); + + it('Diners Club (US)', function() { + this.$creditCard.val('5517479515603901'); + this.bv.validate(); + expect(this.bv.isValidField('cc')).toBeTruthy(); + }); + + it('Discover', function() { + this.$creditCard.val('6011734674929094'); + this.bv.validate(); + expect(this.bv.isValidField('cc')).toBeTruthy(); + }); + + it('JCB', function() { + this.$creditCard.val('3566002020360505'); + this.bv.validate(); + expect(this.bv.isValidField('cc')).toBeTruthy(); + }); + + it('Laser', function() { + this.$creditCard.val('6304 9000 1774 0292 441'); + this.bv.validate(); + expect(this.bv.isValidField('cc')).toBeTruthy(); + }); + + it('Maestro', function() { + this.$creditCard.val('6762835098779303'); + this.bv.validate(); + expect(this.bv.isValidField('cc')).toBeTruthy(); + }); + + it('Mastercard', function() { + this.$creditCard.val('5303765013600904'); + this.bv.validate(); + expect(this.bv.isValidField('cc')).toBeTruthy(); + }); + + it('Solo', function() { + this.$creditCard.val('6334580500000000'); + this.bv.validate(); + expect(this.bv.isValidField('cc')).toBeTruthy(); + }); + + it('Visa', function() { + this.$creditCard.val('4929248980295542'); + this.bv.validate(); + expect(this.bv.isValidField('cc')).toBeTruthy(); + }); + + it('Visa invalid check digit', function() { + this.$creditCard.val('4532599916257826'); + this.bv.validate(); + expect(this.bv.isValidField('cc')).toEqual(false); + }); +}); + +function getDate(value, validator, $field) { + return validator.getFieldElements('date').val(); +}; + +TestSuite = $.extend({}, TestSuite, { + Date: { + getDate: function(value, validator, $field) { + return validator.getFieldElements('date').val(); + } + } +}); + +describe('date', function() { + beforeEach(function() { + $([ + '
      ', + '
      ', + '
      ', + '', + '
      ', + '
      ', + '', + '
      ', + '
      ', + '', + '
      ', + '
      ', + '', + '
      ', + '
      ' + ].join('\n')).appendTo('body'); + + $('#dateForm').bootstrapValidator(); + + this.bv = $('#dateForm').data('bootstrapValidator'); + this.$date = this.bv.getFieldElements('date'); + this.$minDate = this.bv.getFieldElements('minDate'); + this.$maxDate = this.bv.getFieldElements('maxDate'); + this.$range = this.bv.getFieldElements('range'); + }); + + afterEach(function() { + $('#dateForm').bootstrapValidator('destroy').remove(); + }); + + it('YYYY/MM/DD', function() { + this.bv.updateOption('date', 'date', 'format', 'YYYY/MM/DD'); + + this.$date.val('2000/01/30'); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + + // Invalid year + this.bv.resetForm(); + this.$date.val('100/10/20'); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + + // Invalid month + this.bv.resetForm(); + this.$date.val('2000/00/10'); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + + this.bv.resetForm(); + this.$date.val('2000/15/10'); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + + // Invalid day + this.bv.resetForm(); + this.$date.val('2000/03/00'); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + + this.bv.resetForm(); + this.$date.val('2000/10/32'); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + + // Negative number + this.bv.resetForm(); + this.$date.val('-2000/10/20'); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + + this.bv.resetForm(); + this.$date.val('2000/-10/20'); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + + this.bv.resetForm(); + this.$date.val('2000/10/-20'); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + + // Consist invalid characters + // Issue #310 + this.bv.resetForm(); + this.$date.val('aaaa/'); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + + this.bv.resetForm(); + this.$date.val('2004df/1dd1/5ffg'); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + + // Issue #475 + this.bv.resetForm(); + this.$date.val('2014/09'); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + + this.bv.resetForm(); + this.$date.val('2014/09/'); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + + this.bv.resetForm(); + this.$date.val('2014//15'); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + + this.bv.resetForm(); + this.$date.val('/09/15'); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + }); + + it('MM/DD/YYYY', function() { + this.bv.updateOption('date', 'date', 'format', 'MM/DD/YYYY'); + + this.$date.val('09/15/2020'); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + + this.bv.resetForm(); + this.$date.val('09/15'); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + + this.bv.resetForm(); + this.$date.val('09/15/'); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + }); + + it('number of days in February', function() { + this.bv.updateOption('date', 'date', 'format', 'YYYY/MM/DD'); + + this.$date.val('2000/02/28'); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + + this.bv.resetForm(); + this.$date.val('2000/02/29'); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + + this.bv.resetForm(); + this.$date.val('2001/02/29'); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + }); + + // Issue #681 + it('date, month, year are prefixed by zero', function() { + this.bv.updateOption('date', 'date', 'format', 'MM/DD/YYYY'); + + this.$date.val('0012/08/2014'); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + + this.bv.resetForm(); + this.$date.val('12/0008/2014'); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + + this.bv.resetForm(); + this.$date.val('12/08/002014'); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + + this.bv.resetForm(); + this.$date.val('12/08/2014'); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + }); + + it('hours, minutes, seconds are prefixed by zero', function() { + this.bv.updateOption('date', 'date', 'format', 'YYYY/MM/DD h:m:s'); + + this.$date.val('2014/08/17 0007:30:00'); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + + this.bv.resetForm(); + this.$date.val('2014/08/17 07:030:00'); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + + this.bv.resetForm(); + this.$date.val('2014/08/17 07:30:0000'); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + + this.bv.resetForm(); + this.$date.val('2014/08/17 07:30:00'); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + }); + + // min test suite + it('min date format YYYY/MM/DD', function() { + this.bv.updateOption('minDate', 'date', 'format', 'YYYY/MM/DD'); + this.bv.updateOption('minDate', 'date', 'min', '2010/01/01'); + + this.$minDate.val('2010/01/02'); + this.bv.validate(); + expect(this.bv.isValidField('minDate')).toBeTruthy(); + + this.bv.resetForm(); + this.$minDate.val('2010/01/002'); // day prefexid by 0 not allowed + this.bv.validate(); + expect(this.bv.isValidField('minDate')).toEqual(false); + + this.bv.resetForm(); + this.$minDate.val('2014/08/17'); + this.bv.validate(); + expect(this.bv.isValidField('minDate')).toBeTruthy(); + + this.bv.resetForm(); + this.$minDate.val('2009/12/31'); + this.bv.validate(); + expect(this.bv.isValidField('minDate')).toEqual(false); + + this.bv.resetForm(); + this.$minDate.val('2000/01/01'); + this.bv.validate(); + expect(this.bv.isValidField('minDate')).toEqual(false); + }); + + it('min date format YYYY-MM-DD', function() { + this.bv.updateOption('minDate', 'date', 'format', 'YYYY-MM-DD'); + this.bv.updateOption('minDate', 'date', 'min', '2010-01-01'); + + this.$minDate.val('2010-01-02'); + this.bv.validate(); + expect(this.bv.isValidField('minDate')).toBeTruthy(); + + this.bv.resetForm(); + this.$minDate.val('2010-001-02'); // month prefexid by 0 not allowed + this.bv.validate(); + expect(this.bv.isValidField('minDate')).toEqual(false); + + this.bv.resetForm(); + this.$minDate.val('2014-08-17'); + this.bv.validate(); + expect(this.bv.isValidField('minDate')).toBeTruthy(); + + this.bv.resetForm(); + this.$minDate.val('2009-12-31'); + this.bv.validate(); + expect(this.bv.isValidField('minDate')).toEqual(false); + + this.bv.resetForm(); + this.$minDate.val('2000-01-01'); + this.bv.validate(); + expect(this.bv.isValidField('minDate')).toEqual(false); + }); + + it('min date format DD/MM/YYYY', function() { + this.bv.updateOption('minDate', 'date', 'format', 'DD/MM/YYYY'); + this.bv.updateOption('minDate', 'date', 'min', '01/01/2010'); + + this.$minDate.val('02/01/2010'); + this.bv.validate(); + expect(this.bv.isValidField('minDate')).toBeTruthy(); + + this.bv.resetForm(); + this.$minDate.val('17/08/2014'); + this.bv.validate(); + expect(this.bv.isValidField('minDate')).toBeTruthy(); + + this.bv.resetForm(); + this.$minDate.val('02/01/02010'); // year prefixed by 0 not allowed + this.bv.validate(); + expect(this.bv.isValidField('minDate')).toEqual(false); + + this.bv.resetForm(); + this.$minDate.val('31/12/2009'); + this.bv.validate(); + expect(this.bv.isValidField('minDate')).toEqual(false); + + this.bv.resetForm(); + this.$minDate.val('01/01/2000'); + this.bv.validate(); + expect(this.bv.isValidField('minDate')).toEqual(false); + }); + + it('min date format YYYY-MM-DD h:m:s', function() { + this.bv.updateOption('minDate', 'date', 'format', 'YYYY-MM-DD h:m:s'); + this.bv.updateOption('minDate', 'date', 'min', '2010-01-01 01:00:00'); + + this.bv.resetForm(); + this.$minDate.val('2010-01-01 01:00:01'); + this.bv.validate(); + expect(this.bv.isValidField('minDate')).toBeTruthy(); + + this.$minDate.val('2010-01-02 01:00:01'); + this.bv.validate(); + expect(this.bv.isValidField('minDate')).toBeTruthy(); + + this.bv.resetForm(); + this.$minDate.val('2014-08-17 12:00:00'); + this.bv.validate(); + expect(this.bv.isValidField('minDate')).toBeTruthy(); + + this.bv.resetForm(); + this.$minDate.val('2009-12-31 00:00:00'); + this.bv.validate(); + expect(this.bv.isValidField('minDate')).toEqual(false); + + this.bv.resetForm(); + this.$minDate.val('2009-12-31 010:00:00'); // hours prefixed by 0 not allowed + this.bv.validate(); + expect(this.bv.isValidField('minDate')).toEqual(false); + + this.bv.resetForm(); + this.$minDate.val('2009-12-31 10:001:00'); // minutes prefixed by 0 not allowed + this.bv.validate(); + expect(this.bv.isValidField('minDate')).toEqual(false); + + this.bv.resetForm(); + this.$minDate.val('2009-12-31 10:01:012'); // seconds prefixed by 0 not allowed + this.bv.validate(); + expect(this.bv.isValidField('minDate')).toEqual(false); + + this.bv.resetForm(); + this.$minDate.val('2009-12-31 00:00:00'); + this.bv.validate(); + expect(this.bv.isValidField('minDate')).toEqual(false); + + this.bv.resetForm(); + this.$minDate.val('2000-01-01 23:00:12'); + this.bv.validate(); + expect(this.bv.isValidField('minDate')).toEqual(false); + }); + + // max test suite + it('max date format YYYY/MM/DD', function() { + this.bv.updateOption('maxDate', 'date', 'format', 'YYYY/MM/DD'); + this.bv.updateOption('maxDate', 'date', 'max', '2014/09/10'); + + this.$maxDate.val('2014/09/09'); + this.bv.validate(); + expect(this.bv.isValidField('maxDate')).toBeTruthy(); + + this.bv.resetForm(); + this.$maxDate.val('2014/08/17'); + this.bv.validate(); + expect(this.bv.isValidField('maxDate')).toBeTruthy(); + + this.bv.resetForm(); + this.$maxDate.val('02014/012/031'); // year, month or day prefixed by 0 not allowed + this.bv.validate(); + expect(this.bv.isValidField('maxDate')).toEqual(false); + + this.bv.resetForm(); + this.$maxDate.val('2014/12/31'); + this.bv.validate(); + expect(this.bv.isValidField('maxDate')).toEqual(false); + + this.bv.resetForm(); + this.$maxDate.val('2015/01/01'); + this.bv.validate(); + expect(this.bv.isValidField('maxDate')).toEqual(false); + }); + + it('max date format YYYY-MM-DD', function() { + this.bv.updateOption('maxDate', 'date', 'format', 'YYYY-MM-DD'); + this.bv.updateOption('maxDate', 'date', 'max', '2014-09-10'); + + this.$maxDate.val('2014-09-09'); + this.bv.validate(); + expect(this.bv.isValidField('maxDate')).toBeTruthy(); + + this.bv.resetForm(); + this.$maxDate.val('2014-08-17'); + this.bv.validate(); + expect(this.bv.isValidField('maxDate')).toBeTruthy(); + + this.bv.resetForm(); + this.$maxDate.val('02014-012-031'); // year, month or day prefixed by 0 not allowed + this.bv.validate(); + expect(this.bv.isValidField('maxDate')).toEqual(false); + + this.bv.resetForm(); + this.$maxDate.val('2014-12-31'); + this.bv.validate(); + expect(this.bv.isValidField('maxDate')).toEqual(false); + + this.bv.resetForm(); + this.$maxDate.val('2015-01-01'); + this.bv.validate(); + expect(this.bv.isValidField('maxDate')).toEqual(false); + }); + + it('max date format DD/MM/YYYY', function() { + this.bv.updateOption('maxDate', 'date', 'format', 'DD/MM/YYYY'); + this.bv.updateOption('maxDate', 'date', 'max', '10/09/2014'); + + this.$maxDate.val('09/09/2014'); + this.bv.validate(); + expect(this.bv.isValidField('maxDate')).toBeTruthy(); + + this.bv.resetForm(); + this.$maxDate.val('17/08/2014'); + this.bv.validate(); + expect(this.bv.isValidField('maxDate')).toBeTruthy(); + + this.bv.resetForm(); + this.$maxDate.val('031/012/02014'); // year, month or day prefixed by 0 not allowed + this.bv.validate(); + expect(this.bv.isValidField('maxDate')).toEqual(false); + + this.bv.resetForm(); + this.$maxDate.val('31/12/2014'); + this.bv.validate(); + expect(this.bv.isValidField('maxDate')).toEqual(false); + + this.bv.resetForm(); + this.$maxDate.val('01/01/2015'); + this.bv.validate(); + expect(this.bv.isValidField('maxDate')).toEqual(false); + }); + + it('max date format YYYY-MM-DD h:m:s', function() { + this.bv.updateOption('maxDate', 'date', 'format', 'YYYY-MM-DD h:m:s'); + this.bv.updateOption('maxDate', 'date', 'max', '2014-09-10 01:00:00'); + + this.$maxDate.val('2014-09-09 01:00:01'); + this.bv.validate(); + expect(this.bv.isValidField('maxDate')).toBeTruthy(); + + this.bv.resetForm(); + this.$maxDate.val('2014-08-17 12:00:00'); + this.bv.validate(); + expect(this.bv.isValidField('maxDate')).toBeTruthy(); + + this.bv.resetForm(); + this.$maxDate.val('2014-09-09 001:001:001'); // hours, minutes or seconds prefixed by 0 not allowed + this.bv.validate(); + expect(this.bv.isValidField('maxDate')).toEqual(false); + + this.bv.resetForm(); + this.$maxDate.val('2014-12-31 00:00:00'); + this.bv.validate(); + expect(this.bv.isValidField('maxDate')).toEqual(false); + + this.bv.resetForm(); + this.$maxDate.val('2015-01-01 23:00:12'); + this.bv.validate(); + expect(this.bv.isValidField('maxDate')).toEqual(false); + }); + + // range test suite + it('range format YYYY/MM/DD', function() { + this.bv.updateOption('range', 'date', 'format', 'YYYY/MM/DD'); + this.bv.updateOption('range', 'date', 'min', '2010/09/10'); + this.bv.updateOption('range', 'date', 'max', '2014/09/10'); + + this.$range.val('2011/01/01'); + this.bv.validate(); + expect(this.bv.isValidField('range')).toBeTruthy(); + + this.bv.resetForm(); + this.$range.val('2014/09/09'); + this.bv.validate(); + expect(this.bv.isValidField('range')).toBeTruthy(); + + this.bv.resetForm(); + this.$range.val('02014/001/031'); // year, month or day prefixed by 0 not allowed + this.bv.validate(); + expect(this.bv.isValidField('range')).toEqual(false); + + this.bv.resetForm(); + this.$range.val('2010/09/09'); + this.bv.validate(); + expect(this.bv.isValidField('range')).toEqual(false); + + this.bv.resetForm(); + this.$range.val('2014/09/11'); + this.bv.validate(); + expect(this.bv.isValidField('range')).toEqual(false); + }); + + it('range format YYYY-MM-DD', function() { + this.bv.updateOption('range', 'date', 'format', 'YYYY-MM-DD'); + this.bv.updateOption('range', 'date', 'min', '2010-09-10'); + this.bv.updateOption('range', 'date', 'max', '2014-09-10'); + + this.$range.val('2012-01-12'); + this.bv.validate(); + expect(this.bv.isValidField('range')).toBeTruthy(); + + this.bv.resetForm(); + this.$range.val('2014-09-09'); + this.bv.validate(); + expect(this.bv.isValidField('range')).toBeTruthy(); + + this.bv.resetForm(); + this.$range.val('02014-003-031'); // year, month or day prefixed by 0 not allowed + this.bv.validate(); + expect(this.bv.isValidField('range')).toEqual(false); + + this.bv.resetForm(); + this.$range.val('2009-12-31'); + this.bv.validate(); + expect(this.bv.isValidField('range')).toEqual(false); + + this.bv.resetForm(); + this.$range.val('2015-01-01'); + this.bv.validate(); + expect(this.bv.isValidField('range')).toEqual(false); + }); + + it('range format DD/MM/YYYY', function() { + this.bv.updateOption('range', 'date', 'format', 'DD/MM/YYYY'); + this.bv.updateOption('range', 'date', 'min', '10/09/2010'); + this.bv.updateOption('range', 'date', 'max', '10/09/2014'); + + this.$range.val('11/11/2011'); + this.bv.validate(); + expect(this.bv.isValidField('range')).toBeTruthy(); + + this.bv.resetForm(); + this.$range.val('17/08/2014'); + this.bv.validate(); + expect(this.bv.isValidField('range')).toBeTruthy(); + + this.bv.resetForm(); + this.$range.val('031/012/02013'); // year, month or day prefixed by 0 not allowed + this.bv.validate(); + expect(this.bv.isValidField('range')).toEqual(false); + + this.bv.resetForm(); + this.$range.val('31/01/2010'); + this.bv.validate(); + expect(this.bv.isValidField('range')).toEqual(false); + + this.bv.resetForm(); + this.$range.val('25/03/2015'); + this.bv.validate(); + expect(this.bv.isValidField('range')).toEqual(false); + }); + + it('range format YYYY-MM-DD h:m:s', function() { + this.bv.updateOption('range', 'date', 'format', 'YYYY-MM-DD h:m:s'); + this.bv.updateOption('range', 'date', 'min', '2010-05-15 22:00:00'); + this.bv.updateOption('range', 'date', 'max', '2015-05-15 22:00:00'); + + this.$range.val('2012-07-17 01:00:01'); + this.bv.validate(); + expect(this.bv.isValidField('range')).toBeTruthy(); + + this.bv.resetForm(); + this.$range.val('2013-08-17 12:00:00'); + this.bv.validate(); + expect(this.bv.isValidField('range')).toBeTruthy(); + + this.bv.resetForm(); + this.$range.val('2011-06-19 001:001:001'); // hours, minutes or seconds prefixed by 0 not allowed + this.bv.validate(); + expect(this.bv.isValidField('range')).toEqual(false); + + this.bv.resetForm(); + this.$range.val('2008-11-27 23:15:00'); + this.bv.validate(); + expect(this.bv.isValidField('range')).toEqual(false); + + this.bv.resetForm(); + this.$range.val('2015-05-15 22:00:01'); + this.bv.validate(); + expect(this.bv.isValidField('range')).toEqual(false); + }); + + // dynamic min option + it('dynamic min: name of field', function() { + this.$minDate.attr('data-bv-date-min', 'date'); + this.bv.destroy(); + this.bv = $('#dateForm').bootstrapValidator().data('bootstrapValidator'); + this.bv.updateOption('minDate', 'date', 'format', 'YYYY/MM/DD'); + + this.$date.val('2014/09/08'); + this.$minDate.val('2014/09/09'); + this.bv.validate(); + expect(this.bv.isValidField('minDate')).toBeTruthy(); + + this.bv.resetForm(); + this.$date.val('2014/09/08'); + this.$minDate.val('2014/08/17'); + this.bv.validate(); + expect(this.bv.isValidField('minDate')).toBeFalsy(); + }); + + it('dynamic min: callback declarative function', function() { + this.$minDate.attr('data-bv-date-min', 'getDate'); + this.bv.destroy(); + this.bv = $('#dateForm').bootstrapValidator().data('bootstrapValidator'); + this.bv.updateOption('minDate', 'date', 'format', 'YYYY/MM/DD'); + + this.$date.val('2014/09/08'); + this.$minDate.val('2014/09/09'); + this.bv.validate(); + expect(this.bv.isValidField('minDate')).toBeTruthy(); + + this.bv.resetForm(); + this.$date.val('2014/10/01'); + this.$minDate.val('2014/08/17'); + this.bv.validate(); + expect(this.bv.isValidField('minDate')).toBeFalsy(); + }); + + it('dynamic min: callback declarative function()', function() { + this.$minDate.attr('data-bv-date-min', 'getDate()'); + this.bv.destroy(); + this.bv = $('#dateForm').bootstrapValidator().data('bootstrapValidator'); + this.bv.updateOption('minDate', 'date', 'format', 'YYYY/MM/DD'); + + this.$date.val('2014/09/08'); + this.$minDate.val('2014/09/09'); + this.bv.validate(); + expect(this.bv.isValidField('minDate')).toBeTruthy(); + + this.bv.resetForm(); + this.$date.val('2014/10/01'); + this.$minDate.val('2014/08/17'); + this.bv.validate(); + expect(this.bv.isValidField('minDate')).toBeFalsy(); + }); + + it('dynamic min: callback declarative A.B.C', function() { + this.$minDate.attr('data-bv-date-min', 'TestSuite.Date.getDate'); + this.bv.destroy(); + this.bv = $('#dateForm').bootstrapValidator().data('bootstrapValidator'); + this.bv.updateOption('minDate', 'date', 'format', 'YYYY/MM/DD'); + + this.$date.val('2014/09/08'); + this.$minDate.val('2014/09/09'); + this.bv.validate(); + expect(this.bv.isValidField('minDate')).toBeTruthy(); + + this.bv.resetForm(); + this.$date.val('2014/10/01'); + this.$minDate.val('2014/08/17'); + this.bv.validate(); + expect(this.bv.isValidField('minDate')).toBeFalsy(); + }); + + it('dynamic min: callback declarative A.B.C()', function() { + this.$minDate.attr('data-bv-date-min', 'TestSuite.Date.getDate()'); + this.bv.destroy(); + this.bv = $('#dateForm').bootstrapValidator().data('bootstrapValidator'); + this.bv.updateOption('minDate', 'date', 'format', 'YYYY/MM/DD'); + + this.$date.val('2014/09/08'); + this.$minDate.val('2014/09/09'); + this.bv.validate(); + expect(this.bv.isValidField('minDate')).toBeTruthy(); + + this.bv.resetForm(); + this.$date.val('2014/10/01'); + this.$minDate.val('2014/08/17'); + this.bv.validate(); + expect(this.bv.isValidField('minDate')).toBeFalsy(); + }); + + it('dynamic min: callback programmatically', function() { + this.$minDate.removeAttr('data-bv-date-min'); + this.bv.destroy(); + this.bv = $('#dateForm') + .bootstrapValidator({ + fields: { + minDate: { + validators: { + date: { + min: function(value, validator, $field) { + return getDate(value, validator, $field); + } + } + } + } + } + }) + .data('bootstrapValidator'); + this.bv.updateOption('minDate', 'date', 'format', 'YYYY/MM/DD'); + + this.$date.val('2014/09/08'); + this.$minDate.val('2014/09/09'); + this.bv.validate(); + expect(this.bv.isValidField('minDate')).toBeTruthy(); + + this.bv.resetForm(); + this.$date.val('2014/10/01'); + this.$minDate.val('2014/08/17'); + this.bv.validate(); + expect(this.bv.isValidField('minDate')).toBeFalsy(); + }); + + // dynamic max option + it('dynamic max: name of field', function() { + this.$maxDate.attr('data-bv-date-max', 'date'); + this.bv.destroy(); + this.bv = $('#dateForm').bootstrapValidator().data('bootstrapValidator'); + this.bv.updateOption('maxDate', 'date', 'format', 'YYYY/MM/DD'); + + this.$date.val('2015/01/01'); + this.$maxDate.val('2014/09/09'); + this.bv.validate(); + expect(this.bv.isValidField('maxDate')).toBeTruthy(); + + this.bv.resetForm(); + this.$date.val('2014/01/01'); + this.$maxDate.val('2014/08/17'); + this.bv.validate(); + expect(this.bv.isValidField('maxDate')).toBeFalsy(); + }); + + it('dynamic max: callback declarative function', function() { + this.$maxDate.attr('data-bv-date-max', 'getDate'); + this.bv.destroy(); + this.bv = $('#dateForm').bootstrapValidator().data('bootstrapValidator'); + this.bv.updateOption('maxDate', 'date', 'format', 'YYYY/MM/DD'); + + this.$date.val('2015/01/01'); + this.$maxDate.val('2014/09/09'); + this.bv.validate(); + expect(this.bv.isValidField('maxDate')).toBeTruthy(); + + this.bv.resetForm(); + this.$date.val('2014/01/01'); + this.$maxDate.val('2014/08/17'); + this.bv.validate(); + expect(this.bv.isValidField('maxDate')).toBeFalsy(); + }); + + it('dynamic max: callback declarative function()', function() { + this.$maxDate.attr('data-bv-date-max', 'getDate()'); + this.bv.destroy(); + this.bv = $('#dateForm').bootstrapValidator().data('bootstrapValidator'); + this.bv.updateOption('maxDate', 'date', 'format', 'YYYY/MM/DD'); + + this.$date.val('2015/01/01'); + this.$maxDate.val('2014/09/09'); + this.bv.validate(); + expect(this.bv.isValidField('maxDate')).toBeTruthy(); + + this.bv.resetForm(); + this.$date.val('2014/01/01'); + this.$maxDate.val('2014/08/17'); + this.bv.validate(); + expect(this.bv.isValidField('maxDate')).toBeFalsy(); + }); + + it('dynamic max: callback declarative A.B.C', function() { + this.$maxDate.attr('data-bv-date-max', 'TestSuite.Date.getDate'); + this.bv.destroy(); + this.bv = $('#dateForm').bootstrapValidator().data('bootstrapValidator'); + this.bv.updateOption('maxDate', 'date', 'format', 'YYYY/MM/DD'); + + this.$date.val('2015/01/01'); + this.$maxDate.val('2014/09/09'); + this.bv.validate(); + expect(this.bv.isValidField('maxDate')).toBeTruthy(); + + this.bv.resetForm(); + this.$date.val('2014/01/01'); + this.$maxDate.val('2014/08/17'); + this.bv.validate(); + expect(this.bv.isValidField('maxDate')).toBeFalsy(); + }); + + it('dynamic max: callback declarative A.B.C()', function() { + this.$maxDate.attr('data-bv-date-max', 'TestSuite.Date.getDate()'); + this.bv.destroy(); + this.bv = $('#dateForm').bootstrapValidator().data('bootstrapValidator'); + this.bv.updateOption('maxDate', 'date', 'format', 'YYYY/MM/DD'); + + this.$date.val('2015/01/01'); + this.$maxDate.val('2014/09/09'); + this.bv.validate(); + expect(this.bv.isValidField('maxDate')).toBeTruthy(); + + this.bv.resetForm(); + this.$date.val('2014/01/01'); + this.$maxDate.val('2014/08/17'); + this.bv.validate(); + expect(this.bv.isValidField('maxDate')).toBeFalsy(); + }); + + it('dynamic max: callback programmatically', function() { + this.$maxDate.removeAttr('data-bv-date-max'); + this.bv.destroy(); + this.bv = $('#dateForm') + .bootstrapValidator({ + fields: { + maxDate: { + validators: { + date: { + max: function(value, validator, $field) { + return getDate(value, validator, $field); + } + } + } + } + } + }) + .data('bootstrapValidator'); + this.bv.updateOption('maxDate', 'date', 'format', 'YYYY/MM/DD'); + + this.$date.val('2015/01/01'); + this.$maxDate.val('2014/09/09'); + this.bv.validate(); + expect(this.bv.isValidField('maxDate')).toBeTruthy(); + + this.bv.resetForm(); + this.$date.val('2014/01/01'); + this.$maxDate.val('2014/08/17'); + this.bv.validate(); + expect(this.bv.isValidField('maxDate')).toBeFalsy(); + }); +}); + +describe('ean', function() { + beforeEach(function() { + var html = [ + '
      ', + '
      ', + '
      ', + '', + '
      ', + '
      ', + '
      ' + ].join('\n'); + + $(html).appendTo('body'); + $('#eanForm').bootstrapValidator(); + + this.bv = $('#eanForm').data('bootstrapValidator'); + this.$ean = this.bv.getFieldElements('ean'); + }); + + afterEach(function() { + $('#eanForm').bootstrapValidator('destroy').parent().remove(); + }); + + it('valid', function() { + var samples = ['73513537', '9780471117094', '4006381333931']; + + for (var i in samples) { + this.$ean.val(samples[i]); + this.bv.validate(); + expect(this.bv.isValidField('ean')).toBeTruthy(); + } + }); + + it('contains only digits', function() { + this.$ean.val('123abcDEF!@#'); + this.bv.validate(); + expect(this.bv.isValidField('ean')).toEqual(false); + }); + + it('invalid length', function() { + this.$ean.val('1234567'); + this.bv.validate(); + expect(this.bv.isValidField('ean')).toEqual(false); + }); + + it('invalid check digit', function() { + this.$ean.val('73513536'); + this.bv.validate(); + expect(this.bv.isValidField('ean')).toEqual(false); + }); +}); + +describe('emailAddress', function() { + beforeEach(function() { + $([ + '
      ', + '
      ', + '
      ', + '', + '
      ', + '
      ' + ].join('\n')).appendTo('body'); + + $('#emailAddressForm').bootstrapValidator(); + + this.bv = $('#emailAddressForm').data('bootstrapValidator'); + this.$emailAddressOrAddresses = this.bv.getFieldElements('email-address-or-addresses'); + }); + + afterEach(function() { + $('#emailAddressForm').bootstrapValidator('destroy').remove(); + }); + + var validEmailAddresses = [ + 'admin@mailserver1', + 'niceandsimple@example.com', + 'very.common@example.com', + 'a.little.lengthy.but.fine@dept.example.com', + 'disposable.style.email.with+symbol@example.com', + 'other.email-with-dash@example.com', + '"much.more unusual"@example.com', + '"very.unusual.@.unusual.com"@example.com', + '"very.(),:;<>[]\".VERY.\"very@\\ \"very\".unusual"@strange.example.com', + '" "@example.org', + 'üñîçøðé@example.com' + ]; + + var invalidEmailAddresses = [ + // "!#$%&'*+-/=?^_`{}|~@example.org", // This is actually passing validation; see https://github.com/nghuuphuoc/bootstrapvalidator/issues/673 + 'üñîçøðé@üñîçøðé.com', + 'Abc.example.com', + 'A@b@c@example.com', + 'a"b(c)d,e:f;gi[j\k]l@example.com', + 'just"not"right@example.com', + 'this is"not\allowed@example.com', + 'this\ still\"not\\allowed@example.com' + ]; + + var validMultipleEmailAddressesForDefaultSeparators = [ + 'niceandsimple@example.com,very.common@example.com', + 'niceandsimple@example.com;very.common@example.com', + 'niceandsimple@example.com;very.common@example.com,a.little.lengthy.but.fine@dept.example.com' + ]; + + var invalidMultipleEmailAddressesForDefaultSeparators = [ + 'niceandsimple@example.com+very.common@example.com', + 'niceandsimple@example.com|very.common@example.com' + ]; + + var validMultipleEmailAddressesForCommaOrDollarSignSeparators = [ + 'niceandsimple@example.com,very.common@example.com', + 'niceandsimple@example.com$very.common@example.com', + 'niceandsimple@example.com,very.common@example.com$a.little.lengthy.but.fine@dept.example.com' + ]; + + var invalidMultipleEmailAddressesForCommaOrDollarSignSeparators = [ + 'niceandsimple@example.com;very.common@example.com', + 'niceandsimple@example.com;very.common@example.com,a.little.lengthy.but.fine@dept.example.com' + ]; + + it('Valid email addresses (multiple=false)', function() { + var that = this; + $.each(validEmailAddresses, function(index, emailAddress) { + that.bv.resetForm(); + that.$emailAddressOrAddresses.val(emailAddress); + that.bv.validate(); + expect(that.bv.isValid()).toBeTruthy(); + }); + }); + + it('Invalid email addresses (multiple=false)', function() { + var that = this; + + var addresses = invalidEmailAddresses + .concat(validMultipleEmailAddressesForDefaultSeparators) + .concat(invalidMultipleEmailAddressesForDefaultSeparators) + .concat(validMultipleEmailAddressesForCommaOrDollarSignSeparators) + .concat(invalidMultipleEmailAddressesForCommaOrDollarSignSeparators); + + $.each(addresses, function(index, emailAddress) { + that.bv.resetForm(); + that.$emailAddressOrAddresses.val(emailAddress); + that.bv.validate(); + expect(that.bv.isValid()).toEqual(false); + }); + }); + + it('Invalid email addresses (multiple=false,separator=/[,\$]/)', function() { + var that = this; + that.bv.updateOption('email-address-or-addresses', 'emailAddress', 'separator', /[,;]/); + + var addresses = invalidEmailAddresses + .concat(validMultipleEmailAddressesForDefaultSeparators) + .concat(invalidMultipleEmailAddressesForDefaultSeparators) + .concat(validMultipleEmailAddressesForCommaOrDollarSignSeparators) + .concat(invalidMultipleEmailAddressesForCommaOrDollarSignSeparators); + + $.each(addresses, function(index, emailAddress) { + that.bv.resetForm(); + that.$emailAddressOrAddresses.val(emailAddress); + that.bv.validate(); + expect(that.bv.isValid()).toEqual(false); + }); + }); + + it('Valid email addresses (multiple=true)', function() { + var that = this; + that.bv.updateOption('email-address-or-addresses', 'emailAddress', 'multiple', true); + + var addresses = validEmailAddresses + .concat(validMultipleEmailAddressesForDefaultSeparators); + + $.each(addresses, function(index, emailAddress) { + that.bv.resetForm(); + that.$emailAddressOrAddresses.val(emailAddress); + that.bv.validate(); + expect(that.bv.isValid()).toBeTruthy(); + }); + }); + + it('Invalid email addresses (multiple=true)', function() { + var that = this; + that.bv.updateOption('email-address-or-addresses', 'emailAddress', 'multiple', true); + + var addresses = invalidEmailAddresses + .concat(invalidMultipleEmailAddressesForDefaultSeparators); + + $.each(addresses, function(index, emailAddress) { + that.bv.resetForm(); + that.$emailAddressOrAddresses.val(emailAddress); + that.bv.validate(); + expect(that.bv.isValid()).toEqual(false); + }); + }); + + it('Valid email addresses (multiple=true,separator=/[,\$]/)', function() { + var that = this; + that.bv.updateOption('email-address-or-addresses', 'emailAddress', 'multiple', true); + that.bv.updateOption('email-address-or-addresses', 'emailAddress', 'separator', /[,\$]/); + + var addresses = validEmailAddresses + .concat(validMultipleEmailAddressesForCommaOrDollarSignSeparators); + + $.each(addresses, function(index, emailAddress) { + that.bv.resetForm(); + that.$emailAddressOrAddresses.val(emailAddress); + that.bv.validate(); + expect(that.bv.isValid()).toBeTruthy(); + }); + }); + + it('Invalid email addresses (multiple=true,separator=/[,\$]/)', function() { + var that = this; + that.bv.updateOption('email-address-or-addresses', 'emailAddress', 'multiple', true); + that.bv.updateOption('email-address-or-addresses', 'emailAddress', 'separator', /[,\$]/); + + var addresses = invalidEmailAddresses + .concat(invalidMultipleEmailAddressesForCommaOrDollarSignSeparators); + + $.each(addresses, function(index, emailAddress) { + that.bv.resetForm(); + that.$emailAddressOrAddresses.val(emailAddress); + that.bv.validate(); + expect(that.bv.isValid()).toEqual(false); + }); + }); +}); + +function greaterThanCompare() { + var compareTo = $('#greaterThanForm').find('[name="minAge"]').val(); + $('#msg').html('greaterThanCompare() called; compare to ' + compareTo); + return compareTo; +}; + +TestSuite = $.extend({}, TestSuite, { + greaterThan: { + compareTo: function(value, validator, $field) { + var compareTo = $('#greaterThanForm').find('[name="minAge"]').val(); + $('#msg').html('TestSuite.greaterThan.compareTo() called; compare to ' + compareTo); + return compareTo; + } + } +}); + +describe('greaterThan', function() { + beforeEach(function() { + $([ + '
      ', + '
      ', + '
      ', + '', + '
      ', + '
      ', + '', + '
      ', + '
      ' + ].join('\n')).appendTo('body'); + + $('#greaterThanForm').bootstrapValidator(); + + this.bv = $('#greaterThanForm').data('bootstrapValidator'); + this.$minAge = this.bv.getFieldElements('minAge'); + this.$age = this.bv.getFieldElements('age'); + }); + + afterEach(function() { + $('#greaterThanForm').bootstrapValidator('destroy').remove(); + }); + + it('not a number', function() { + this.$age.val('20abc'); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + }); + + it('compare to value', function() { + this.$age.val(10); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + + this.bv.resetForm(); + this.$age.val(20); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + }); + + it('value with comma separator', function() { + this.$age.val('10,4'); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + + this.bv.resetForm(); + this.$age.val('18,678'); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + }); + + it('compare to other field', function() { + this.bv.updateOption('age', 'greaterThan', 'value', 'minAge'); + + this.$minAge.val(10); + this.$age.val(20); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + + this.bv.resetForm(); + this.$minAge.val(20); + this.$age.val(10); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + expect(this.bv.getMessages('age', 'greaterThan')[0]).toEqual($.fn.bootstrapValidator.helpers.format($.fn.bootstrapValidator.i18n.greaterThan['default'], this.$minAge.val())); + }); + + // #1048 + it('compare to other field that value has comma', function() { + this.bv.updateOption('age', 'greaterThan', 'value', 'minAge'); + this.$minAge.val('10,5'); + this.$age.val(20); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + + this.bv.resetForm(); + this.$minAge.val('20,5'); + this.$age.val(10); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + expect(this.bv.getMessages('age', 'greaterThan')[0]).toEqual($.fn.bootstrapValidator.helpers.format($.fn.bootstrapValidator.i18n.greaterThan['default'], this.$minAge.val())); + }); + + it('compare to return value of a function', function() { + this.bv.updateOption('age', 'greaterThan', 'value', 'greaterThanCompare'); + + this.$minAge.val(20); + this.$age.val(18); + this.bv.validate(); + expect($('#msg').html()).toEqual('greaterThanCompare() called; compare to 20'); + expect(this.bv.isValid()).toEqual(false); + expect(this.bv.getMessages('age', 'greaterThan')[0]).toEqual($.fn.bootstrapValidator.helpers.format($.fn.bootstrapValidator.i18n.greaterThan['default'], this.$minAge.val())); + + this.bv.resetForm(); + this.$minAge.val(18); + this.$age.val(20); + this.bv.validate(); + expect($('#msg').html()).toEqual('greaterThanCompare() called; compare to 18'); + expect(this.bv.isValid()).toBeTruthy(); + }); + + it('compare to return value of a namespace function', function() { + this.bv.updateOption('age', 'greaterThan', 'value', 'TestSuite.greaterThan.compareTo'); + + this.$minAge.val(20); + this.$age.val(18); + this.bv.validate(); + expect($('#msg').html()).toEqual('TestSuite.greaterThan.compareTo() called; compare to 20'); + expect(this.bv.isValid()).toEqual(false); + expect(this.bv.getMessages('age', 'greaterThan')[0]).toEqual($.fn.bootstrapValidator.helpers.format($.fn.bootstrapValidator.i18n.greaterThan['default'], this.$minAge.val())); + + this.bv.resetForm(); + this.$minAge.val(18); + this.$age.val(20); + this.bv.validate(); + expect($('#msg').html()).toEqual('TestSuite.greaterThan.compareTo() called; compare to 18'); + expect(this.bv.isValid()).toBeTruthy(); + }); +}); + +describe('iban', function() { + beforeEach(function() { + $([ + '
      ', + '
      ', + '', + '
      ', + '
      ', + '', + '
      ', + '
      ' + ].join('\n')).appendTo('body'); + + $('#ibanForm').bootstrapValidator(); + + this.bv = $('#ibanForm').data('bootstrapValidator'); + this.$country = this.bv.getFieldElements('country'); + this.$iban = this.bv.getFieldElements('iban'); + }); + + afterEach(function() { + $('#ibanForm').bootstrapValidator('destroy').remove(); + }); + + it('not supported country', function() { + this.$iban.val('US123456789'); + this.bv.validate(); + expect(this.bv.isValidField('iban')).toEqual(false); + }); + + it('dynamic country', function() { + this.$iban.attr('data-bv-iban-country', 'country'); + this.bv.destroy(); + this.bv = $('#ibanForm').bootstrapValidator().data('bootstrapValidator'); + + this.$country.val('AT'); + this.$iban.val('AT611904300234573201'); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + + this.bv.resetForm(); + this.$country.val('BG'); + this.$iban.val('HR1210010051863000160'); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + }); + + it('Albania', function() { + this.$iban.val('AL47212110090000000235698741'); + this.bv.validate(); + expect(this.bv.isValidField('iban')).toBeTruthy(); + }); + + it('Algeria', function() { + this.$iban.val('DZ4000400174401001050486'); + this.bv.validate(); + expect(this.bv.isValidField('iban')).toBeTruthy(); + }); + + it('Andorra', function() { + this.$iban.val('AD1200012030200359100100'); + this.bv.validate(); + expect(this.bv.isValidField('iban')).toBeTruthy(); + }); + + it('Angola', function() { + this.$iban.val('AO06000600000100037131174'); + this.bv.validate(); + expect(this.bv.isValidField('iban')).toBeTruthy(); + }); + + it('Austria', function() { + this.$iban.val('AT611904300234573201'); + this.bv.validate(); + expect(this.bv.isValidField('iban')).toBeTruthy(); + }); + + it('Azerbaijan', function() { + this.$iban.val('AZ21NABZ00000000137010001944'); + this.bv.validate(); + expect(this.bv.isValidField('iban')).toBeTruthy(); + }); + + it('Bahrain', function() { + this.$iban.val('BH29BMAG1299123456BH00'); + this.bv.validate(); + expect(this.bv.isValidField('iban')).toBeTruthy(); + }); + + it('Belgium', function() { + this.$iban.val('BE68539007547034'); + this.bv.validate(); + expect(this.bv.isValidField('iban')).toBeTruthy(); + }); + + it('Benin', function() { + this.$iban.val('BJ11B00610100400271101192591'); + this.bv.validate(); + expect(this.bv.isValidField('iban')).toBeTruthy(); + }); + + it('Brazil', function() { + this.$iban.val('BR9700360305000010009795493P1'); + this.bv.validate(); + expect(this.bv.isValidField('iban')).toBeTruthy(); + }); + + it('Bulgaria', function() { + this.$iban.val('BG80BNBG96611020345678'); + this.bv.validate(); + expect(this.bv.isValidField('iban')).toBeTruthy(); + }); + + it('Burkina Faso', function() { + this.$iban.val('BF1030134020015400945000643'); + this.bv.validate(); + expect(this.bv.isValidField('iban')).toBeTruthy(); + }); + it('Burundi', function() { + this.$iban.val('BI43201011067444'); + this.bv.validate(); + expect(this.bv.isValidField('iban')).toBeTruthy(); + }); + + it('Cameroon', function() { + this.$iban.val('CM2110003001000500000605306'); + this.bv.validate(); + expect(this.bv.isValidField('iban')).toBeTruthy(); + }); + + it('Cape Verde', function() { + this.$iban.val('CV64000300004547069110176'); + this.bv.validate(); + expect(this.bv.isValidField('iban')).toBeTruthy(); + }); + + it('Costa Rica', function() { + this.$iban.val('CR0515202001026284066'); + this.bv.validate(); + expect(this.bv.isValidField('iban')).toBeTruthy(); + }); + + it('Croatia', function() { + this.$iban.val('HR1210010051863000160'); + this.bv.validate(); + expect(this.bv.isValidField('iban')).toBeTruthy(); + }); + it('Cyprus', function() { + this.$iban.val('CY17002001280000001200527600'); + this.bv.validate(); + expect(this.bv.isValidField('iban')).toBeTruthy(); + }); + + it('Czech Republic', function() { + this.$iban.val('CZ6508000000192000145399'); + this.bv.validate(); + expect(this.bv.isValidField('iban')).toBeTruthy(); + }); + + it('Denmark', function() { + this.$iban.val('DK5000400440116243'); + this.bv.validate(); + expect(this.bv.isValidField('iban')).toBeTruthy(); + }); + + it('Dominican Republic', function() { + this.$iban.val('DO28BAGR00000001212453611324'); + this.bv.validate(); + expect(this.bv.isValidField('iban')).toBeTruthy(); + }); + + it('Estonia', function() { + this.$iban.val('EE382200221020145685'); + this.bv.validate(); + expect(this.bv.isValidField('iban')).toBeTruthy(); + }); + it('Faroe Islands', function() { + this.$iban.val('FO1464600009692713'); + this.bv.validate(); + expect(this.bv.isValidField('iban')).toBeTruthy(); + }); + + it('Finland', function() { + this.$iban.val('FI2112345600000785'); + this.bv.validate(); + expect(this.bv.isValidField('iban')).toBeTruthy(); + }); + + it('France', function() { + this.$iban.val('FR1420041010050500013M02606'); + this.bv.validate(); + expect(this.bv.isValidField('iban')).toBeTruthy(); + }); + + it('Guatemala', function() { + this.$iban.val('GT82TRAJ01020000001210029690'); + this.bv.validate(); + expect(this.bv.isValidField('iban')).toBeTruthy(); + }); + + it('Georgia', function() { + this.$iban.val('GE29NB0000000101904917'); + this.bv.validate(); + expect(this.bv.isValidField('iban')).toBeTruthy(); + }); + + it('Germany', function() { + this.$iban.val('DE89370400440532013000'); + this.bv.validate(); + expect(this.bv.isValidField('iban')).toBeTruthy(); + }); + + it('Gibraltar', function() { + this.$iban.val('GI75NWBK000000007099453'); + this.bv.validate(); + expect(this.bv.isValidField('iban')).toBeTruthy(); + }); + + it('Greece', function() { + this.$iban.val('GR1601101250000000012300695'); + this.bv.validate(); + expect(this.bv.isValidField('iban')).toBeTruthy(); + }); + + it('Greenland', function() { + this.$iban.val('GL8964710001000206'); + this.bv.validate(); + expect(this.bv.isValidField('iban')).toBeTruthy(); + }); + + it('Hungary', function() { + this.$iban.val('HU42117730161111101800000000'); + this.bv.validate(); + expect(this.bv.isValidField('iban')).toBeTruthy(); + }); + + it('Iceland', function() { + this.$iban.val('IS140159260076545510730339'); + this.bv.validate(); + expect(this.bv.isValidField('iban')).toBeTruthy(); + }); + + it('Iran', function() { + this.$iban.val('IR580540105180021273113007'); + this.bv.validate(); + expect(this.bv.isValidField('iban')).toBeTruthy(); + }); + + it('Ireland', function() { + this.$iban.val('IE29AIBK93115212345678'); + this.bv.validate(); + expect(this.bv.isValidField('iban')).toBeTruthy(); + }); + + it('Israel', function() { + this.$iban.val('IL620108000000099999999'); + this.bv.validate(); + expect(this.bv.isValidField('iban')).toBeTruthy(); + }); + + it('Italy', function() { + this.$iban.val('IT60X0542811101000000123456'); + this.bv.validate(); + expect(this.bv.isValidField('iban')).toBeTruthy(); + }); + + it('Ivory Coast', function() { + this.$iban.val('CI05A00060174100178530011852'); + this.bv.validate(); + expect(this.bv.isValidField('iban')).toBeTruthy(); + }); + + it('Jordan', function() { + this.$iban.val('JO94CBJO0010000000000131000302'); + this.bv.validate(); + expect(this.bv.isValidField('iban')).toBeTruthy(); + }); + + it('Kazakhstan', function() { + this.$iban.val('KZ176010251000042993'); + this.bv.validate(); + expect(this.bv.isValidField('iban')).toBeTruthy(); + }); + + it('Kuwait', function() { + this.$iban.val('KW74NBOK0000000000001000372151'); + this.bv.validate(); + expect(this.bv.isValidField('iban')).toBeTruthy(); + }); + + it('Latvia', function() { + this.$iban.val('LV80BANK0000435195001'); + this.bv.validate(); + expect(this.bv.isValidField('iban')).toBeTruthy(); + }); + + it('Lebanon', function() { + this.$iban.val('LB30099900000001001925579115'); + this.bv.validate(); + expect(this.bv.isValidField('iban')).toBeTruthy(); + }); + + it('Liechtenstein', function() { + this.$iban.val('LI21088100002324013AA'); + this.bv.validate(); + expect(this.bv.isValidField('iban')).toBeTruthy(); + }); + + it('Lithuania', function() { + this.$iban.val('LT121000011101001000'); + this.bv.validate(); + expect(this.bv.isValidField('iban')).toBeTruthy(); + }); + + it('Luxembourg', function() { + this.$iban.val('LU280019400644750000'); + this.bv.validate(); + expect(this.bv.isValidField('iban')).toBeTruthy(); + }); + + it('Macedonia', function() { + this.$iban.val('MK07300000000042425'); + this.bv.validate(); + expect(this.bv.isValidField('iban')).toBeTruthy(); + }); + + it('Madagascar', function() { + this.$iban.val('MG4600005030010101914016056'); + this.bv.validate(); + expect(this.bv.isValidField('iban')).toBeTruthy(); + }); + + it('Malta', function() { + this.$iban.val('MT84MALT011000012345MTLCAST001S'); + this.bv.validate(); + expect(this.bv.isValidField('iban')).toBeTruthy(); + }); + + it('Mauritania', function() { + this.$iban.val('MR1300012000010000002037372'); + this.bv.validate(); + expect(this.bv.isValidField('iban')).toBeTruthy(); + }); + + it('Mauritius', function() { + this.$iban.val('MU17BOMM0101101030300200000MUR'); + this.bv.validate(); + expect(this.bv.isValidField('iban')).toBeTruthy(); + }); + + it('Mali', function() { + this.$iban.val('ML03D00890170001002120000447'); + this.bv.validate(); + expect(this.bv.isValidField('iban')).toBeTruthy(); + }); + + it('Moldova', function() { + this.$iban.val('MD24AG000225100013104168'); + this.bv.validate(); + expect(this.bv.isValidField('iban')).toBeTruthy(); + }); + + it('Monaco', function() { + this.$iban.val('MC5813488000010051108001292'); + this.bv.validate(); + expect(this.bv.isValidField('iban')).toBeTruthy(); + }); + + it('Montenegro', function() { + this.$iban.val('ME25505000012345678951'); + this.bv.validate(); + expect(this.bv.isValidField('iban')).toBeTruthy(); + }); + + it('Mozambique', function() { + this.$iban.val('MZ59000100000011834194157'); + this.bv.validate(); + expect(this.bv.isValidField('iban')).toBeTruthy(); + }); + + it('Netherlands', function() { + this.$iban.val('NL91ABNA0417164300'); + this.bv.validate(); + expect(this.bv.isValidField('iban')).toBeTruthy(); + }); + + it('Norway', function() { + this.$iban.val('NO9386011117947'); + this.bv.validate(); + expect(this.bv.isValidField('iban')).toBeTruthy(); + }); + + it('Pakistan', function() { + this.$iban.val('PK24SCBL0000001171495101'); + this.bv.validate(); + expect(this.bv.isValidField('iban')).toBeTruthy(); + }); + + it('Palestine', function() { + this.$iban.val('PS92PALS000000000400123456702'); + this.bv.validate(); + expect(this.bv.isValidField('iban')).toBeTruthy(); + }); + + it('Poland', function() { + this.$iban.val('PL27114020040000300201355387'); + this.bv.validate(); + expect(this.bv.isValidField('iban')).toBeTruthy(); + }); + + it('Portugal', function() { + this.$iban.val('PT50000201231234567890154'); + this.bv.validate(); + expect(this.bv.isValidField('iban')).toBeTruthy(); + }); + + it('Qatar', function() { + this.$iban.val('QA58DOHB00001234567890ABCDEFG'); + this.bv.validate(); + expect(this.bv.isValidField('iban')).toBeTruthy(); + }); + + it('Romania', function() { + this.$iban.val('RO49AAAA1B31007593840000'); + this.bv.validate(); + expect(this.bv.isValidField('iban')).toBeTruthy(); + }); + + it('San Marino', function() { + this.$iban.val('SM86U0322509800000000270100'); + this.bv.validate(); + expect(this.bv.isValidField('iban')).toBeTruthy(); + }); + + it('Saudi Arabia', function() { + this.$iban.val('SA0380000000608010167519'); + this.bv.validate(); + expect(this.bv.isValidField('iban')).toBeTruthy(); + }); + + it('Senegal', function() { + this.$iban.val('SN12K00100152000025690007542'); + this.bv.validate(); + expect(this.bv.isValidField('iban')).toBeTruthy(); + }); + + it('Serbia', function() { + this.$iban.val('RS35260005601001611379'); + this.bv.validate(); + expect(this.bv.isValidField('iban')).toBeTruthy(); + }); + + it('Slovakia', function() { + this.$iban.val('SK3112000000198742637541'); + this.bv.validate(); + expect(this.bv.isValidField('iban')).toBeTruthy(); + }); + + it('Slovenia', function() { + this.$iban.val('SI56191000000123438'); + this.bv.validate(); + expect(this.bv.isValidField('iban')).toBeTruthy(); + }); + + it('Spain', function() { + this.$iban.val('ES9121000418450200051332'); + this.bv.validate(); + expect(this.bv.isValidField('iban')).toBeTruthy(); + }); + + it('Sweden', function() { + this.$iban.val('SE3550000000054910000003'); + this.bv.validate(); + expect(this.bv.isValidField('iban')).toBeTruthy(); + }); + + it('Switzerland', function() { + this.$iban.val('CH9300762011623852957'); + this.bv.validate(); + expect(this.bv.isValidField('iban')).toBeTruthy(); + }); + + it('Tunisia', function() { + this.$iban.val('TN5914207207100707129648'); + this.bv.validate(); + expect(this.bv.isValidField('iban')).toBeTruthy(); + }); + + it('Turkey', function() { + this.$iban.val('TR330006100519786457841326'); + this.bv.validate(); + expect(this.bv.isValidField('iban')).toBeTruthy(); + }); + + it('United Arab Emirates', function() { + this.$iban.val('AE260211000000230064016'); + this.bv.validate(); + expect(this.bv.isValidField('iban')).toBeTruthy(); + }); + + it('United Kingdom', function() { + this.$iban.val('GB29NWBK60161331926819'); + this.bv.validate(); + expect(this.bv.isValidField('iban')).toBeTruthy(); + }); + + it('Virgin Islands, British', function() { + this.$iban.val('VG96VPVG0000012345678901'); + this.bv.validate(); + expect(this.bv.isValidField('iban')).toBeTruthy(); + }); + + it('invalid checksum', function() { + this.$iban.val('TR330006100519786457841325'); + this.bv.validate(); + expect(this.bv.isValidField('iban')).toEqual(false); + }); +}); + +describe('id', function() { + beforeEach(function() { + $([ + '
      ', + '
      ', + '', + '
      ', + '
      ', + '', + '
      ', + '
      ' + ].join('\n')).appendTo('body'); + + $('#idForm').bootstrapValidator(); + + /** + * @type {BootstrapValidator} + */ + this.bv = $('#idForm').data('bootstrapValidator'); + this.$country = this.bv.getFieldElements('country'); + this.$id = this.bv.getFieldElements('id'); + }); + + afterEach(function() { + $('#idForm').bootstrapValidator('destroy').remove(); + }); + + it('dynamic country', function() { + this.$id.attr('data-bv-id-country', 'country'); + this.bv.destroy(); + this.bv = $('#idForm').bootstrapValidator().data('bootstrapValidator'); + + this.$country.val('BG'); + this.$id.val('7552010005'); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + + this.bv.resetForm(); + this.$country.val('BR'); + this.$id.val('231.002.999-00'); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + }); + + it('Bulgarian national identification number (EGN)', function() { + this.bv.updateOption('id', 'id', 'country', 'BG'); + + // Valid samples + var validSamples = ['7523169263', '8032056031', '803205 603 1', '8001010008', '7501020018', '7552010005', '7542011030']; + for (var i in validSamples) { + this.bv.resetForm(); + this.$id.val(validSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + } + + // Invalid samples + var invalidSamples = ['8019010008']; + for (i in invalidSamples) { + this.bv.resetForm(); + this.$id.val(invalidSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + } + }); + + it('Brazilian national identification number (CPF)', function() { + this.bv.updateOption('id', 'id', 'country', 'BR'); + + // Valid samples + var validSamples = ['39053344705', '390.533.447-05', '111.444.777-35']; + for (var i in validSamples) { + this.bv.resetForm(); + this.$id.val(validSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + } + + // Invalid samples + var invalidSamples = ['231.002.999-00']; + for (i in invalidSamples) { + this.bv.resetForm(); + this.$id.val(invalidSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + } + }); + + it('Swiss Social Security Number (AHV-Nr/No AVS)', function() { + this.bv.updateOption('id', 'id', 'country', 'CH'); + + // Valid samples + var validSamples = ['756.1234.5678.95', '7561234567895']; + for (var i in validSamples) { + this.bv.resetForm(); + this.$id.val(validSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + } + }); + + it('Chilean national identification number (RUN/RUT)', function() { + this.bv.updateOption('id', 'id', 'country', 'CL'); + + // Valid samples + var validSamples = ['76086428-5', '22060449-7', '12531909-2','12937893-K','12937893-k']; + for (var i in validSamples) { + this.bv.resetForm(); + this.$id.val(validSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + } + }); + + // #793 + it('Chinese citizen identification number', function() { + this.bv.updateOption('id', 'id', 'country', 'CN'); + + // Valid samples + var validSamples = ['450202201409072332', '22011219930407001X', '110108601017023']; + for (var i in validSamples) { + this.bv.resetForm(); + this.$id.val(validSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + } + + // Invalid samples + var invalidSamples = ['999999199304070016', '220112190002290016', '220112199304070019', '999999601017023', '110108999999023']; + for (i in invalidSamples) { + this.bv.resetForm(); + this.$id.val(invalidSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + } + }); + + it('Czech national identification number (RC)', function() { + this.bv.updateOption('id', 'id', 'country', 'CZ'); + + // Valid samples + var validSamples = ['7103192745', '991231123']; + for (var i in validSamples) { + this.bv.resetForm(); + this.$id.val(validSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + } + + // Invalid samples + var invalidSamples = ['1103492745', '590312123']; + for (i in invalidSamples) { + this.bv.resetForm(); + this.$id.val(invalidSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + } + }); + + it('Danish Personal Identification number (CPR)', function() { + this.bv.updateOption('id', 'id', 'country', 'DK'); + + // Valid samples + var validSamples = ['2110625629', '211062-5629']; + for (var i in validSamples) { + this.bv.resetForm(); + this.$id.val(validSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + } + + // Invalid samples + var invalidSamples = ['511062-5629']; + for (i in invalidSamples) { + this.bv.resetForm(); + this.$id.val(invalidSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + } + }); + + it('Estonian Personal Identification Code (isikukood)', function() { + this.bv.updateOption('id', 'id', 'country', 'EE'); + + // Valid samples + var validSamples = ['37605030299']; + for (var i in validSamples) { + this.bv.resetForm(); + this.$id.val(validSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + } + }); + + it('Spanish personal identity code (DNI/NIE)', function() { + this.bv.updateOption('id', 'id', 'country', 'ES'); + + // Valid samples + var validSamples = ['54362315K', '54362315-K', 'X2482300W', 'X-2482300W', 'X-2482300-W']; + for (var i in validSamples) { + this.bv.resetForm(); + this.$id.val(validSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + } + + // Invalid samples + var invalidSamples = ['54362315Z', 'X-2482300A']; + for (i in invalidSamples) { + this.bv.resetForm(); + this.$id.val(invalidSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + } + }); + + it('Finnish Personal Identity Code (HETU)', function() { + this.bv.updateOption('id', 'id', 'country', 'FI'); + + // Valid samples + var validSamples = ['311280-888Y', '131052-308T']; + for (var i in validSamples) { + this.bv.resetForm(); + this.$id.val(validSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + } + + // Invalid samples + var invalidSamples = ['131052-308U', '310252-308Y']; + for (i in invalidSamples) { + this.bv.resetForm(); + this.$id.val(invalidSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + } + }); + + it('Croatian personal identification number (OIB)', function() { + this.bv.updateOption('id', 'id', 'country', 'HR'); + + // Valid samples + var validSamples = ['33392005961']; + for (var i in validSamples) { + this.bv.resetForm(); + this.$id.val(validSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + } + + // Invalid samples + var invalidSamples = ['33392005962']; + for (i in invalidSamples) { + this.bv.resetForm(); + this.$id.val(invalidSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + } + }); + + it('Irish Personal Public Service Number (PPS)', function() { + this.bv.updateOption('id', 'id', 'country', 'IE'); + + // Valid samples + var validSamples = ['6433435F', '6433435FT', '6433435FW', '6433435OA', '6433435IH', '1234567TW', '1234567FA']; + for (var i in validSamples) { + this.bv.resetForm(); + this.$id.val(validSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + } + + // Invalid samples + var invalidSamples = ['6433435E', '6433435VH']; + for (i in invalidSamples) { + this.bv.resetForm(); + this.$id.val(invalidSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + } + }); + + it('Iceland national identification number (Kennitala)', function() { + this.bv.updateOption('id', 'id', 'country', 'IS'); + + // Valid samples + var validSamples = ['120174-3399', '1201743399', '0902862349']; + for (var i in validSamples) { + this.bv.resetForm(); + this.$id.val(validSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + } + }); + + it('Lithuanian Personal Code (Asmens kodas)', function() { + this.bv.updateOption('id', 'id', 'country', 'LT'); + + // Valid samples + var validSamples = ['38703181745']; + for (var i in validSamples) { + this.bv.resetForm(); + this.$id.val(validSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + } + + // Invalid samples + var invalidSamples = ['38703181746', '78703181745', '38703421745']; + for (i in invalidSamples) { + this.bv.resetForm(); + this.$id.val(invalidSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + } + }); + + it('Latvian Personal Code (Personas kods)', function() { + this.bv.updateOption('id', 'id', 'country', 'LV'); + + // Valid samples + var validSamples = ['161175-19997', '16117519997']; + for (var i in validSamples) { + this.bv.resetForm(); + this.$id.val(validSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + } + + // Invalid samples + var invalidSamples = ['161375-19997']; + for (i in invalidSamples) { + this.bv.resetForm(); + this.$id.val(invalidSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + } + }); + + it('Dutch national identification number (BSN)', function() { + this.bv.updateOption('id', 'id', 'country', 'NL'); + + // Valid samples + var validSamples = ['111222333', '941331490', '9413.31.490']; + for (var i in validSamples) { + this.bv.resetForm(); + this.$id.val(validSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + } + + // Invalid samples + var invalidSamples = ['111252333']; + for (i in invalidSamples) { + this.bv.resetForm(); + this.$id.val(invalidSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + } + }); + + it('Romanian numerical personal code (CNP)', function() { + this.bv.updateOption('id', 'id', 'country', 'RO'); + + // Valid samples + var validSamples = ['1630615123457', '1800101221144']; + for (var i in validSamples) { + this.bv.resetForm(); + this.$id.val(validSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + } + + // Invalid samples + var invalidSamples = ['8800101221144', '1632215123457', '1630615123458']; + for (i in invalidSamples) { + this.bv.resetForm(); + this.$id.val(invalidSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + } + }); + + it('Swedish personal identity number (personnummer)', function() { + this.bv.updateOption('id', 'id', 'country', 'SE'); + + // Valid samples + var validSamples = ['8112289874', '811228-9874', '811228+9874']; + for (var i in validSamples) { + this.bv.resetForm(); + this.$id.val(validSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + } + + // Invalid samples + var invalidSamples = ['811228-9873']; + for (i in invalidSamples) { + this.bv.resetForm(); + this.$id.val(invalidSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + } + }); + + it('Slovak national identifier number (RC)', function() { + this.bv.updateOption('id', 'id', 'country', 'SK'); + + // Valid samples + var validSamples = ['7103192745', '991231123']; + for (var i in validSamples) { + this.bv.resetForm(); + this.$id.val(validSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + } + + // Invalid samples + var invalidSamples = ['7103192746', '1103492745']; + for (i in invalidSamples) { + this.bv.resetForm(); + this.$id.val(invalidSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + } + }); + + it('South African ID', function() { + this.bv.updateOption('id', 'id', 'country', 'ZA'); + + // Valid samples + var validSamples = ['8001015009087']; + for (var i in validSamples) { + this.bv.resetForm(); + this.$id.val(validSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + } + + // Invalid samples + var invalidSamples = ['8001015009287', '8001015009086']; + for (i in invalidSamples) { + this.bv.resetForm(); + this.$id.val(invalidSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + } + }); + + it('Thailand citizen number', function() { + this.bv.updateOption('id', 'id', 'country', 'TH'); + + // Valid samples + var validSamples = ['7145620509547', '3688699975685', '2368719339716']; + for (var i in validSamples) { + this.bv.resetForm(); + this.$id.val(validSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + } + + // Invalid samples + var invalidSamples = ['1100800092310']; + for (i in invalidSamples) { + this.bv.resetForm(); + this.$id.val(invalidSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + } + }); +}); + +describe('imo', function() { + beforeEach(function() { + $([ + '
      ', + '
      ', + '', + '
      ', + '
      ' + ].join('\n')).appendTo('body'); + + $('#imoForm').bootstrapValidator(); + + this.bv = $('#imoForm').data('bootstrapValidator'); + this.$imo = this.bv.getFieldElements('imo'); + }); + + afterEach(function() { + $('#imoForm').bootstrapValidator('destroy').remove(); + }); + + it('Valid IMO (upper)', function() { + this.bv.resetForm(); + this.$imo.val('IMO 9074729'); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + }); + + it('Valid IMO (lower)', function() { + this.bv.resetForm(); + this.$imo.val('imo 9074729'); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + }); + + it('Invalid IMO (bad format)', function() { + this.bv.resetForm(); + this.$imo.val('9074729'); + this.bv.validate(); + expect(this.bv.isValid()).toBeFalsy(); + }); + + it('Invalid IMO (bad check digit)', function() { + this.bv.resetForm(); + this.$imo.val('IMO 9074728'); + this.bv.validate(); + expect(this.bv.isValid()).toBeFalsy(); + }); +}); + +describe('ip', function() { + beforeEach(function() { + $([ + '
      ', + '
      ', + '', + '
      ', + '
      ', + '', + '
      ', + '
      ', + '', + '
      ', + '
      ' + ].join('\n')).appendTo('body'); + + $('#ipForm').bootstrapValidator(); + + this.bv = $('#ipForm').data('bootstrapValidator'); + this.$ipv4 = this.bv.getFieldElements('ipv4'); + this.$ipv6 = this.bv.getFieldElements('ipv6'); + this.$both = this.bv.getFieldElements('both'); + }); + + afterEach(function() { + $('#ipForm').bootstrapValidator('destroy').remove(); + }); + + it('Valid ipv4', function() { + this.$ipv4.val('0.0.0.0'); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + + this.bv.resetForm(); + this.$ipv4.val('192.168.1.1'); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + + this.bv.resetForm(); + this.$ipv4.val('255.255.255.255'); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + }); + + it('Invalid ipv4', function() { + this.$ipv4.val('10.168.0001.100'); // extra 0 not allowed + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + + this.bv.resetForm(); + this.$ipv4.val('0.0.0.256'); // 256 not allowed, max is 255 + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + + this.bv.resetForm(); + this.$ipv4.val('256.255.255.255'); // max is 255.255.255.255 + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + + this.bv.resetForm(); + this.$ipv4.val('192.168. 224.0'); // internal space + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + + this.bv.resetForm(); + this.$ipv4.val('192.168.224.0 1'); // junk after valid address + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + }); + + it('Valid ipv6', function() { + this.$ipv6.val('0000:0000:0000:0000:0000:0000:0000:0000'); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + + this.bv.resetForm(); + this.$ipv6.val('fe00::1'); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + + this.bv.resetForm(); + this.$ipv6.val('fe80::217:f2ff:fe07:ed62'); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + + this.bv.resetForm(); + this.$ipv6.val('ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff'); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + }); + + it('Invalid ipv6', function() { + this.$ipv6.val('02001:0000:1234:0000:0000:C1C0:ABCD:0876'); // extra 0 not allowed + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + + this.bv.resetForm(); + this.$ipv6.val('2001:0000:1234:0000:00001:C1C0:ABCD:0876'); // extra 0 not allowed + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + + this.bv.resetForm(); + this.$ipv6.val('2001:0000:1234: 0000:0000:C1C0:ABCD:0876'); // internal space + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + + this.bv.resetForm(); + this.$ipv6.val('2001:0000:1234:0000:0000:C1C0:ABCD:0876 0'); // junk after valid address + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + + this.bv.resetForm(); + this.$ipv6.val('3ffe:0b00:0000:0001:0000:0000:000a'); // seven segment + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + + this.bv.resetForm(); + this.$ipv6.val('FF02:0000:0000:0000:0000:0000:0000:0000:0001'); // nine segment + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + + this.bv.resetForm(); + this.$ipv6.val('::1111:2222:3333:4444:5555:6666::'); // double "::" + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + + this.bv.resetForm(); + this.$ipv6.val('3ffe:b00::1::a'); // double "::" + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + }); + + it('Both', function() { + this.$both.val('255.255.255.255'); // valid + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + + this.bv.resetForm(); + this.$both.val('256.0.0.0'); // 256 not allowed, max is 255 + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + + this.bv.resetForm(); + this.$both.val('2001:0db8:0000:85a3:0000:0000:ac1f:8001'); // valid + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + + this.bv.resetForm(); + this.$both.val('2001:0000:1234:0000:0000:C1C0:ABCD:0876 0'); // junk after valid address + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + }); + +}); +describe('isbn', function() { + beforeEach(function() { + var html = [ + '
      ', + '
      ', + '
      ', + '', + '
      ', + '
      ', + '
      ' + ].join('\n'); + + $(html).appendTo('body'); + $('#isbnForm').bootstrapValidator(); + + this.bv = $('#isbnForm').data('bootstrapValidator'); + this.$isbn = this.bv.getFieldElements('isbn'); + }); + + afterEach(function() { + $('#isbnForm').bootstrapValidator('destroy').parent().remove(); + }); + + it('isbn10 hyphen', function() { + var samples = ['99921-58-10-7', '9971-5-0210-0', '960-425-059-0', '80-902734-1-6']; + + for (var i in samples) { + this.$isbn.val(samples[i]); + this.bv.validate(); + expect(this.bv.isValidField('isbn')).toBeTruthy(); + } + }); + + it('isbn10 space', function() { + var samples = ['85 359 0277 5', '1 84356 028 3', '0 684 84328 5', '0 85131 041 9', '0 943396 04 2']; + + for (var i in samples) { + this.$isbn.val(samples[i]); + this.bv.validate(); + expect(this.bv.isValidField('isbn')).toBeTruthy(); + } + }); + + it('isbn10 hyphen with X', function() { + var samples = ['0-8044-2957-X', '0-9752298-0-X']; + for (var i in samples) { + this.$isbn.val(samples[i]); + this.bv.validate(); + expect(this.bv.isValidField('isbn')).toBeTruthy(); + } + }); + + it('isbn10 invalid check digit', function() { + this.$isbn.val('99921-58-10-6'); + this.bv.validate(); + expect(this.bv.isValidField('isbn')).toEqual(false); + }); + + it('isbn13', function() { + this.$isbn.val('978-0-306-40615-7'); + this.bv.validate(); + expect(this.bv.isValidField('isbn')).toBeTruthy(); + }); + + it('isbn13 invalid check digit', function() { + this.$isbn.val('978-0-306-40615-6'); + this.bv.validate(); + expect(this.bv.isValidField('isbn')).toEqual(false); + }); +}); + +describe('isin', function() { + beforeEach(function() { + var html = [ + '
      ', + '
      ', + '
      ', + '', + '
      ', + '
      ', + '
      ' + ].join('\n'); + + $(html).appendTo('body'); + $('#isinForm').bootstrapValidator(); + + this.bv = $('#isinForm').data('bootstrapValidator'); + this.$isin = this.bv.getFieldElements('isin'); + }); + + afterEach(function() { + $('#isinForm').bootstrapValidator('destroy').parent().remove(); + }); + + it('valid', function() { + var samples = ['US0378331005', 'AU0000XVGZA3', 'GB0002634946']; + + for (var i in samples) { + this.$isin.val(samples[i]); + this.bv.validate(); + expect(this.bv.isValidField('isin')).toBeTruthy(); + } + }); + + it('invalid country code', function() { + this.$isin.val('AA0000XVGZA3'); + this.bv.validate(); + expect(this.bv.isValidField('isin')).toEqual(false); + }); + + it('contains only digits and alphabet', function() { + this.$isin.val('US12345ABC@#$'); + this.bv.validate(); + expect(this.bv.isValidField('isin')).toEqual(false); + }); + + it('invalid length', function() { + this.$isin.val('US1234567'); + this.bv.validate(); + expect(this.bv.isValidField('isin')).toEqual(false); + }); + + it('invalid check digit', function() { + this.$isin.val('US0378331004'); + this.bv.validate(); + expect(this.bv.isValidField('isin')).toEqual(false); + }); +}); + +describe('ismn', function() { + beforeEach(function() { + var html = [ + '
      ', + '
      ', + '
      ', + '', + '
      ', + '
      ', + '
      ' + ].join('\n'); + + $(html).appendTo('body'); + $('#ismnForm').bootstrapValidator(); + + this.bv = $('#ismnForm').data('bootstrapValidator'); + this.$ismn = this.bv.getFieldElements('ismn'); + }); + + afterEach(function() { + $('#ismnForm').bootstrapValidator('destroy').parent().remove(); + }); + + it('valid start with M', function() { + this.$ismn.val('M230671187'); + this.bv.validate(); + expect(this.bv.isValidField('ismn')).toBeTruthy(); + }); + + it('valid start with 979', function() { + this.$ismn.val('9790060115615'); + this.bv.validate(); + expect(this.bv.isValidField('ismn')).toBeTruthy(); + }); + + it('valid contains spaces', function() { + this.$ismn.val('979 0 3452 4680 5'); + this.bv.validate(); + expect(this.bv.isValidField('ismn')).toBeTruthy(); + }); + + it('valid contains dashes', function() { + this.$ismn.val('979-0-0601-1561-5'); + this.bv.validate(); + expect(this.bv.isValidField('ismn')).toBeTruthy(); + }); + + it('invalid format', function() { + this.$ismn.val('N123456789'); + this.bv.validate(); + expect(this.bv.isValidField('ismn')).toEqual(false); + }); + + it('invalid check digit', function() { + this.$ismn.val('9790060115614'); + this.bv.validate(); + expect(this.bv.isValidField('ismn')).toEqual(false); + }); +}); + +describe('issn', function() { + beforeEach(function() { + var html = [ + '
      ', + '
      ', + '
      ', + '', + '
      ', + '
      ', + '
      ' + ].join('\n'); + + $(html).appendTo('body'); + $('#issnForm').bootstrapValidator(); + + this.bv = $('#issnForm').data('bootstrapValidator'); + this.$issn = this.bv.getFieldElements('issn'); + }); + + afterEach(function() { + $('#issnForm').bootstrapValidator('destroy').parent().remove(); + }); + + it('valid', function() { + var samples = ['0378-5955', '0024-9319', '0032-1478']; + + for (var i in samples) { + this.$issn.val(samples[i]); + this.bv.validate(); + expect(this.bv.isValidField('issn')).toBeTruthy(); + } + }); + + it('not contains hyphen', function() { + this.$issn.val('03785955'); + this.bv.validate(); + expect(this.bv.isValidField('issn')).toEqual(false); + }); + + it('contains only digits, X', function() { + this.$issn.val('1234-566A'); + this.bv.validate(); + expect(this.bv.isValidField('issn')).toEqual(false); + }); + + it('invalid check sum', function() { + this.$issn.val('0032-147X'); + this.bv.validate(); + expect(this.bv.isValidField('issn')).toEqual(false); + }); +}); + +function lessThanCompare() { + var compareTo = $('#lessThanForm').find('[name="maxAge"]').val(); + $('#msg').html('lessThanCompare() called; compare to ' + compareTo); + return compareTo; +}; + +TestSuite = $.extend({}, TestSuite, { + lessThan: { + compareTo: function(value, validator, $field) { + var compareTo = $('#lessThanForm').find('[name="maxAge"]').val(); + $('#msg').html('TestSuite.lessThan.compareTo() called; compare to ' + compareTo); + return compareTo; + } + } +}); + +describe('lessThan', function() { + beforeEach(function() { + $([ + '
      ', + '
      ', + '
      ', + '', + '
      ', + '
      ', + '', + '
      ', + '
      ' + ].join('\n')).appendTo('body'); + + $('#lessThanForm').bootstrapValidator(); + + this.bv = $('#lessThanForm').data('bootstrapValidator'); + this.$maxAge = this.bv.getFieldElements('maxAge'); + this.$age = this.bv.getFieldElements('age'); + }); + + afterEach(function() { + $('#lessThanForm').bootstrapValidator('destroy').remove(); + }); + + it('not a number', function() { + this.$age.val('20abc'); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + }); + + it('value with comma separator', function() { + this.$age.val('120,2234'); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + + this.bv.resetForm(); + this.$age.val('30,2234'); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + }); + + it('compare to value', function() { + this.$age.val(120); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + + this.bv.resetForm(); + this.$age.val(30); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + }); + + it('compare to other field', function() { + this.bv.updateOption('age', 'lessThan', 'value', 'maxAge'); + + this.$maxAge.val(40); + this.$age.val(20); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + + this.bv.resetForm(); + this.$maxAge.val(20); + this.$age.val(30); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + expect(this.bv.getMessages('age', 'lessThan')[0]).toEqual($.fn.bootstrapValidator.helpers.format($.fn.bootstrapValidator.i18n.lessThan['default'], this.$maxAge.val())); + }); + + // #1048 + it('compare to other field that value has comma', function() { + this.bv.updateOption('age', 'lessThan', 'value', 'maxAge'); + this.$maxAge.val('30,5'); + this.$age.val(20); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + + this.bv.resetForm(); + this.$maxAge.val('20,5'); + this.$age.val(30); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + expect(this.bv.getMessages('age', 'lessThan')[0]).toEqual($.fn.bootstrapValidator.helpers.format($.fn.bootstrapValidator.i18n.lessThan['default'], this.$maxAge.val())); + }); + + it('compare to return value of a function', function() { + this.bv.updateOption('age', 'lessThan', 'value', 'lessThanCompare'); + + this.$maxAge.val(50); + this.$age.val(60); + this.bv.validate(); + expect($('#msg').html()).toEqual('lessThanCompare() called; compare to 50'); + expect(this.bv.isValid()).toEqual(false); + expect(this.bv.getMessages('age', 'lessThan')[0]).toEqual($.fn.bootstrapValidator.helpers.format($.fn.bootstrapValidator.i18n.lessThan['default'], this.$maxAge.val())); + + this.bv.resetForm(); + this.$maxAge.val(60); + this.$age.val(30); + this.bv.validate(); + expect($('#msg').html()).toEqual('lessThanCompare() called; compare to 60'); + expect(this.bv.isValid()).toBeTruthy(); + }); + + it('compare to return value of a namespace function', function() { + this.bv.updateOption('age', 'lessThan', 'value', 'TestSuite.lessThan.compareTo'); + + this.$maxAge.val(50); + this.$age.val(60); + this.bv.validate(); + expect($('#msg').html()).toEqual('TestSuite.lessThan.compareTo() called; compare to 50'); + expect(this.bv.isValid()).toEqual(false); + expect(this.bv.getMessages('age', 'lessThan')[0]).toEqual($.fn.bootstrapValidator.helpers.format($.fn.bootstrapValidator.i18n.lessThan['default'], this.$maxAge.val())); + + this.bv.resetForm(); + this.$maxAge.val(60); + this.$age.val(30); + this.bv.validate(); + expect($('#msg').html()).toEqual('TestSuite.lessThan.compareTo() called; compare to 60'); + expect(this.bv.isValid()).toBeTruthy(); + }); +}); + +describe('meid', function() { + beforeEach(function() { + $([ + '
      ', + '
      ', + '', + '
      ', + '
      ' + ].join('\n')).appendTo('body'); + + $('#meidForm').bootstrapValidator(); + + this.bv = $('#meidForm').data('bootstrapValidator'); + this.$meid = this.bv.getFieldElements('meid'); + }); + + afterEach(function() { + $('#meidForm').bootstrapValidator('destroy').remove(); + }); + + it('Valid MEID (14 hex, check digit)', function() { + this.bv.resetForm(); + this.$meid.val('A00000049259B16'); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + }); + + it('Valid MEID (14 hex, dashes, check digit)', function() { + this.bv.resetForm(); + this.$meid.val('A0-000004-9259B1-6'); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + }); + + it('Valid MEID (14 hex, spaces, check digit)', function() { + this.bv.resetForm(); + this.$meid.val('A0 000004 9259B1 6'); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + }); + + it('Valid MEID (18 dec, check digit)', function() { + this.bv.resetForm(); + this.$meid.val('2936087365007037100'); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + }); + + it('Valid MEID (18 dec, dashes, check digit)', function() { + this.bv.resetForm(); + this.$meid.val('29360-87365-0070-3710-0'); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + }); + + it('Valid MEID (18 dec, spaces, check digit)', function() { + this.bv.resetForm(); + this.$meid.val('29360 87365 0070 3710 0'); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + }); + + it('Valid MEID (14 hex)', function() { + this.bv.resetForm(); + this.$meid.val('AF0123450ABCDE'); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + }); + + it('Valid MEID (14 hex, dashes)', function() { + this.bv.resetForm(); + this.$meid.val('AF-012345-0ABCDE'); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + }); + + it('Valid MEID (14 hex, spaces)', function() { + this.bv.resetForm(); + this.$meid.val('AF 012345 0ABCDE'); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + }); + + it('Valid MEID (18 dec)', function() { + this.bv.resetForm(); + this.$meid.val('293608736500703710'); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + }); + + it('Valid MEID (18 dec, dashes)', function() { + this.bv.resetForm(); + this.$meid.val('29360-87365-0070-3710'); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + }); + + it('Valid MEID (18 dec, spaces)', function() { + this.bv.resetForm(); + this.$meid.val('29360 87365 0070 3710'); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + }); + + it('Invalid MEID (14 hex, bad check digit)', function() { + this.bv.resetForm(); + this.$meid.val('A00000049259B15'); + this.bv.validate(); + expect(this.bv.isValid()).toBeFalsy(); + }); + + it('Invalid MEID (13 hex)', function() { + this.bv.resetForm(); + this.$meid.val('A00000049259B'); + this.bv.validate(); + expect(this.bv.isValid()).toBeFalsy(); + }); + + it('Invalid MEID (18 dec, bad check digit)', function() { + this.bv.resetForm(); + this.$meid.val('2936087365007037101'); + this.bv.validate(); + expect(this.bv.isValid()).toBeFalsy(); + }); + + it('Invalid MEID (17 dec)', function() { + this.bv.resetForm(); + this.$meid.val('29360873650070371'); + this.bv.validate(); + expect(this.bv.isValid()).toBeFalsy(); + }); +}); + +describe('phone', function() { + beforeEach(function() { + $([ + '
      ', + '
      ', + '', + '
      ', + '
      ', + '', + '
      ', + '
      ', + ].join('\n')).appendTo('body'); + + $('#phoneForm').bootstrapValidator(); + + /** + * @type {BootstrapValidator} + */ + this.bv = $('#phoneForm').data('bootstrapValidator'); + this.$country = this.bv.getFieldElements('country'); + this.$phone = this.bv.getFieldElements('phone'); + }); + + afterEach(function() { + $('#phoneForm').bootstrapValidator('destroy').remove(); + }); + + it('dynamic country', function() { + this.$phone.attr('data-bv-phone-country', 'country'); + this.bv.destroy(); + this.bv = $('#phoneForm').bootstrapValidator().data('bootstrapValidator'); + + this.$country.val('BR'); + this.$phone.val('16920894635'); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + + this.bv.resetForm(); + this.$country.val('FR'); + this.$phone.val('0644444444'); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + + this.bv.resetForm(); + this.$country.val('GB'); + this.$phone.val('012345678900'); + this.bv.validate(); + expect(this.bv.isValid()).toBeFalsy(); + }); + + it('Brazil phone number', function() { + this.bv.updateOption('phone', 'phone', 'country', 'BR'); + + // Valid samples + var validSamples = [ + '0800.000.00.00', '0800-000-00-00', '0800 000 00 00', '0800-00-00-00', '0800.00.00.00', '0800 00 00 00', + '0800-000-0000', '0800 000 0000', '0800.000.0000', '08000000000', + '1692089-4635', '16920894635', '16992089-4635', '16 99202-4635', '(16)99202-4635', '(16)92089-4635', + '(16) 92089-4635', '(15) 4343-4343', '+55 15 3702-7523', '(+55) 15 3702-7523', '(+55)1537027523', + '(+55)(15)3702-7523', '(+55) 15 3702-7523', '(+55) 15 99202-7523', '99202-4635', '(16) 9208-4635' + ]; + for (var i in validSamples) { + this.bv.resetForm(); + this.$phone.val(validSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + } + }); + + it('China phone number', function() { + this.bv.updateOption('phone', 'phone', 'country', 'CN'); + + // Valid samples + var validSamples = [ + '18911111111', '189 1111 1111', '189-1111-1111', '0086-18911111111', '+86-18911111111', + '86-18911111111', '0086 18911111111', '+86 18911111111', '86 18911111111', '0086 189-1111-1111', + '+86 189-1111-1111', '86 189-1111-1111', '02011111111', '020-11111111', '020 11111111', + '020 1111 1111', '020-1111-1111', '0086 020 82803159', '0086-020-82803159', '0086-020-82803159', + '+86 20 61302222-8866', '+86 20 6130-2222-8866', '+86 10 59081185' + ]; + for (var i in validSamples) { + this.bv.resetForm(); + this.$phone.val(validSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + } + }); + + it('Czech Republic phone number', function() { + this.bv.updateOption('phone', 'phone', 'country', 'CZ'); + + // Valid samples + var validSamples = [ + '00420123456789', '00420 123456789', '00420 123 456 789', '00 420 123 456 789', + '+420123456789', '+420 123456789', '+420 123 456 789', '123456789', '123 456 789' + ]; + for (var i in validSamples) { + this.bv.resetForm(); + this.$phone.val(validSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + } + + // Invalid samples + var invalidSamples = [ + '420123456789', '420 123456789', '420 123 456 789', '00421123456789', '00421 123456789', + '00421 123 456 789', '00 421 123 456 789', '+421123456789', '+421 123456789', + '+421 123 456 789' + ]; + for (i in invalidSamples) { + this.bv.resetForm(); + this.$phone.val(invalidSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + } + }); + + it('France phone number', function() { + this.bv.updateOption('phone', 'phone', 'country', 'FR'); + + // Valid samples + var validSamples = [ + // National formats + '0644444444', '06 44 44 44 44', '06-44-44-44-44', '06.44.44.44.44', + // International formats + '+33644444444', '+336.44.44.44.44', '+33 6.44.44.44.44', '0033644444444', '00336.44.44.44.44', + '0033 6.44.44.44.44', + // Some times + '+33(0)644444444', '+33 (0) 644444444' + ]; + for (var i in validSamples) { + this.bv.resetForm(); + this.$phone.val(validSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + } + + // Invalid samples + var invalidSamples = [ + // The separator between pairs of digits is not the same + '06 44.44-44.44', '06 44 44-44.44', '06 44 44-4444', '06 44 44-4444', + // Too many digits + '06444444444444', + // Missing leading 0 + '6644444444', + // Too much non-numeric characters + '06 44.44-44.44', '+33 (0) 644444444', + // Bad parenthesis + '(0)644444444', + // Bad separator after the international prefix + '+33-(0)-644444444', '+33 (0)-644444444', '+33-(0) 644444444', + // Trailing separator + '06.44.44.44.44.' + ]; + for (i in invalidSamples) { + this.bv.resetForm(); + this.$phone.val(invalidSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + } + }); + + it('Germany phone number', function() { + this.bv.updateOption('phone', 'phone', 'country', 'DE'); + + // Valid samples + var validSamples = ['+49(89)123456', '089-1234567', '0891234567', '0049-89-123456', '089 123456-78']; + for (var i in validSamples) { + this.bv.resetForm(); + this.$phone.val(validSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + } + }); + + it('United Kingdom phone number', function() { + this.bv.updateOption('phone', 'phone', 'country', 'GB'); + + // Valid samples + var validSamples = [ + // National formats + '01611234567', '0161 123 4567', '(0161) 123 4567', '0161-123-4567', + // International formats + '+44 161 123 4567', '+441611234567', '+44(0)161234567', '00 44 161 1234567', '(011) 44 161 234567', '0161-158-5587', + // Extensions + '0161 123 4567 ext. 123', '01611234567x123', '+44161234567x123', '+44 (0) 161 1234567 ext 123' + ]; + for (var i in validSamples) { + this.bv.resetForm(); + this.$phone.val(validSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + } + + // Invalid samples + var invalidSamples = [ + '012345678900', // Too many digits + '1611234567', // Missing trunk + '012345678', // Not enough digits + '123 4567', // Missing area code + '061 123 4567' // Invalid area code + ]; + for (i in invalidSamples) { + this.bv.resetForm(); + this.$phone.val(invalidSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + } + }); + + it('Morocco phone number', function() { + this.bv.updateOption('phone', 'phone', 'country', 'MA'); + + // Valid samples + var validSamples = [ + // National formats + '0644444444', '0610245896', '0630548564', '06 44 44 44 44', '06-44-44-44-44', '06.44.44.44.44', '06 44.44-44.44', + '0528254856', '0535484541', '05 28 44 44 44', '05-28-44.44.44', '05.28.44.44.44', '05 28.44-44.44', + // International formats + '+212644444444', '+2126.44.44.44.44', '+212 6.44.44.44.44', '00212644444444', '002126.44.44.44.44', '00212 6.44.44.44.44', + // Some times + '+212(0)644444444', '+212 (0) 644444444' + ]; + for (var i in validSamples) { + this.bv.resetForm(); + this.$phone.val(validSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + } + + // Invalid samples + var invalidSamples = [ + '0625468961', '0512548632', '0542564896', // Not a valid phone numbers + '06444444444444', // Too many digits + '6644444444', // Missing leading 0 + '06 44.44-44.44', '+212 (0) 644444444', // Too much non-numeric characters + '(0)644444444' // Bad parenthesis + ]; + for (i in invalidSamples) { + this.bv.resetForm(); + this.$phone.val(invalidSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + } + }); + + it('Pakistan phone number', function() { + this.bv.updateOption('phone', 'phone', 'country', 'PK'); + + // Valid samples + var validSamples = ['03336527366']; + for (var i in validSamples) { + this.bv.resetForm(); + this.$phone.val(validSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + } + }); + + it('Romania phone number', function() { + this.bv.updateOption('phone', 'phone', 'country', 'RO'); + + // Valid samples + var validSamples = [ + '+40213-564-864', '+40213.564.864', '+40213 564 864', '0213-564-864', + '0213564864', '0313564864', + '0720512346', '0730512346', '0740512346', '0750512346', '+40750512346', '+40750.512.346', + '0760512346', '0770512346', '0780512346' + ]; + for (var i in validSamples) { + this.bv.resetForm(); + this.$phone.val(validSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + } + + // Invalid samples + var invalidSamples = [ + '0213/564/864', // Invalid separator + '0413564864', // Invalid land line number (The valid one should be +402, +403 or inside country 02 - 03) + '0790512346' // Invalid mobile phone number (The valid one is 072xxxxxxx - 078xxxxxxx) + ]; + for (i in invalidSamples) { + this.bv.resetForm(); + this.$phone.val(invalidSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + } + }); + + it('Russia phone number', function() { + this.bv.updateOption('phone', 'phone', 'country', 'RU'); + + // Valid samples + var validSamples = ['+7(911)976-91-04']; + for (var i in validSamples) { + this.bv.resetForm(); + this.$phone.val(validSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + } + }); + + it('Slovakia phone number', function() { + this.bv.updateOption('phone', 'phone', 'country', 'SK'); + + // Valid samples + var validSamples = [ + '00420123456789', '00420 123456789', '00420 123 456 789', '00 420 123 456 789', + '+420123456789', '+420 123456789', '+420 123 456 789', '123456789', '123 456 789' + ]; + for (var i in validSamples) { + this.bv.resetForm(); + this.$phone.val(validSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + } + + // Invalid samples + var invalidSamples = [ + '420123456789', '420 123456789', '420 123 456 789', '00421123456789', '00421 123456789', + '00421 123 456 789', '00 421 123 456 789', '+421123456789', '+421 123456789', + '+421 123 456 789' + ]; + for (i in invalidSamples) { + this.bv.resetForm(); + this.$phone.val(invalidSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + } + }); +}); + +describe('stringLength', function() { + beforeEach(function() { + $([ + '
      ', + '
      ', + '', + '
      ', + '
      ', + '', + '
      ', + '
      ', + '', + '
      ', + '
      ', + '', + '
      ', + '
      ', + '', + '
      ', + '
      ', + '', + '
      ', + '
      ', + '', + '
      ', + '
      ', + '', + '
      ', + '
      ', + '', + '
      ', + '
      ', + '', + '
      ', + '
      ', + '', + '
      ', + '
      ', + '', + '
      ', + '
      ' + ].join('\n')).appendTo('body'); + + $('#stringLengthForm').bootstrapValidator(); + + this.bv = $('#stringLengthForm').data('bootstrapValidator'); + this.$textCharMaxLength = this.bv.getFieldElements('textCharMaxLength'); + this.$textareaCharMaxLength = this.bv.getFieldElements('textareaCharMaxLength'); + this.$textUTF8BytesMaxLength = this.bv.getFieldElements('textUTF8BytesMaxLength'); + this.$textareaUTF8BytesMaxLength = this.bv.getFieldElements('textareaUTF8BytesMaxLength'); + this.$textCharMinLength = this.bv.getFieldElements('textCharMinLength'); + this.$textareaCharMinLength = this.bv.getFieldElements('textareaCharMinLength'); + this.$textUTF8BytesMinLength = this.bv.getFieldElements('textUTF8BytesMinLength'); + this.$textareaUTF8BytesMinLength = this.bv.getFieldElements('textareaUTF8BytesMinLength'); + this.$textCharMinMaxLength = this.bv.getFieldElements('textCharMinMaxLength'); + this.$textareaCharMinMaxLength = this.bv.getFieldElements('textareaCharMinMaxLength'); + this.$textUTF8BytesMinMaxLength = this.bv.getFieldElements('textUTF8BytesMinMaxLength'); + this.$textareaUTF8BytesMinMaxLength = this.bv.getFieldElements('textareaUTF8BytesMinMaxLength'); + }); + + afterEach(function() { + $('#stringLengthForm').bootstrapValidator('destroy').remove(); + }); + + it('Valid max lengths', function() { + this.$textCharMaxLength.val('123456789♥'); + this.$textareaCharMaxLength.val('123456789♥'); + this.$textUTF8BytesMaxLength.val('1234567♥'); + this.$textareaUTF8BytesMaxLength.val('1234567♥'); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + }); + + it('Valid min lengths', function() { + this.$textCharMinLength.val('1234♥'); + this.$textareaCharMinLength.val('1234♥'); + this.$textUTF8BytesMinLength.val('12♥'); + this.$textareaUTF8BytesMinLength.val('12♥'); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + }); + + it('Valid min and max lengths', function() { + this.$textCharMinMaxLength.val('1234♥'); + this.$textareaCharMinMaxLength.val('1234♥'); + this.$textUTF8BytesMinMaxLength.val('12♥'); + this.$textareaUTF8BytesMinMaxLength.val('12♥'); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + + this.bv.resetForm(); + this.$textCharMinMaxLength.val('123456789♥'); + this.$textareaCharMinMaxLength.val('123456789♥'); + this.$textUTF8BytesMinMaxLength.val('1234567♥'); + this.$textareaUTF8BytesMinMaxLength.val('1234567♥'); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + }); + + it('Invalid max lengths', function() { + this.$textCharMaxLength.val('1234567890♥'); // 11 chars when max is 10 + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + + this.bv.resetForm(); + this.$textareaCharMaxLength.val('1234567890♥'); // 11 chars when max is 10 + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + + this.bv.resetForm(); + this.$textUTF8BytesMaxLength.val('12345678♥'); // 11 UTF-8 bytes when max is 10 + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + + this.bv.resetForm(); + this.$textareaUTF8BytesMaxLength.val('12345678♥'); // 11 UTF-8 bytes when max is 10 + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + }); + + it('Invalid min lengths', function() { + this.$textCharMinLength.val('123♥'); // 4 chars when min is 5 + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + + this.bv.resetForm(); + this.$textareaCharMinLength.val('123♥'); // 4 chars when min is 5 + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + + this.bv.resetForm(); + this.$textUTF8BytesMinLength.val('1♥'); // 4 UTF-8 bytes when min is 5 + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + + this.bv.resetForm(); + this.$textareaUTF8BytesMinLength.val('1♥'); // 4 UTF-8 bytes when min is 5 + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + }); + + it('Invalid min and max lengths', function() { + this.$textCharMinMaxLength.val('123♥'); // 4 chars when min is 5 and max is 10 + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + + this.bv.resetForm(); + this.$textareaCharMinMaxLength.val('123♥'); // 4 chars when min is 5 and max is 10 + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + + this.bv.resetForm(); + this.$textUTF8BytesMinMaxLength.val('1♥'); // 4 UTF-8 bytes when min is 5 and max is 10 + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + + this.bv.resetForm(); + this.$textareaUTF8BytesMinMaxLength.val('1♥'); // 4 UTF-8 bytes when min is 5 and max is 10 + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + + this.bv.resetForm(); + this.$textCharMinMaxLength.val('1234567890♥'); // 11 chars when min is 5 and max is 10 + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + + this.bv.resetForm(); + this.$textareaCharMinMaxLength.val('1234567890♥'); // 11 chars when min is 5 and max is 10 + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + + this.bv.resetForm(); + this.$textUTF8BytesMinMaxLength.val('12345678♥'); // 11 UTF-8 bytes when min is 5 and max is 10 + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + + this.bv.resetForm(); + this.$textareaUTF8BytesMinMaxLength.val('12345678♥'); // 11 UTF-8 bytes when min is 5 and max is 10 + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + }); + + it('trim option', function() { + this.bv.updateOption('textCharMaxLength', 'stringLength', 'trim', false); + this.$textCharMaxLength.val(''); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(true); + + this.bv.resetForm(); + this.$textCharMaxLength.val(' '); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + + this.bv.resetForm(); + this.$textCharMaxLength.val('1234567890 '); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + + this.bv.updateOption('textCharMaxLength', 'stringLength', 'trim', true); + this.bv.resetForm(); + this.$textCharMaxLength.val(' '); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(true); + + this.bv.resetForm(); + this.$textCharMaxLength.val(' '); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(true); + + this.bv.resetForm(); + this.$textCharMaxLength.val(' 0123456789 '); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(true); + + this.bv.resetForm(); + this.$textCharMaxLength.val(' 01234567890 '); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + }); +}); + +describe('uri', function() { + beforeEach(function() { + $([ + '
      ', + '
      ', + '
      ', + '', + '
      ', + '
      ' + ].join('\n')).appendTo('body'); + + $('#uriForm').bootstrapValidator(); + + this.bv = $('#uriForm').data('bootstrapValidator'); + this.$uri = this.bv.getFieldElements('uri'); + }); + + afterEach(function() { + $('#uriForm').bootstrapValidator('destroy').remove(); + }); + + var validGlobalURIs = [ + 'http://foo.com/blah_blah', + 'http://foo.com/blah_blah', + 'http://foo.com/blah_blah/', + 'http://foo.com/blah_blah_(wikipedia)', + 'http://foo.com/blah_blah_(wikipedia)_(again)', + 'http://www.example.com/wpstyle/?p=364', + 'https://www.example.com/foo/?bar=baz&inga=42&quux', + 'http://✪df.ws/123', + 'http://userid:password@example.com:8080', + 'http://userid:password@example.com:8080/', + 'http://userid@example.com', + 'http://userid@example.com/', + 'http://userid@example.com:8080', + 'http://userid@example.com:8080/', + 'http://userid:password@example.com', + 'http://userid:password@example.com/', + 'http://142.42.1.1/', + 'http://142.42.1.1:8080/', + 'http://➡.ws/䨹', + 'http://⌘.ws', + 'http://⌘.ws/', + 'http://foo.com/blah_(wikipedia)#cite-1', + 'http://foo.com/blah_(wikipedia)_blah#cite-1', + 'http://foo.com/unicode_(✪)_in_parens', + 'http://foo.com/(something)?after=parens', + 'http://☺.damowmow.com/', + 'http://code.google.com/events/#&product=browser', + 'http://j.mp', + 'ftp://foo.bar/baz', + 'http://foo.bar/?q=Test%20URL-encoded%20stuff', + 'http://مثال.إختبار', + 'http://例子.测试', + 'http://उदाहरण.परीक्षा', + "http://-.~_!$&'()*+,;=:%40:80%2f::::::@example.com", + 'http://1337.net', + 'http://a.b-c.de', + 'http://223.255.255.254' + ]; + + var invalidGlobalURIs = [ + 'http://', + 'http://.', + 'http://..', + 'http://../', + 'http://?', + 'http://??', + 'http://??/', + 'http://#', + 'http://##', + 'http://##/', + 'http://foo.bar?q=Spaces should be encoded', + '//', + '//a', + '///a', + '///', + 'http:///a', + 'foo.com', + 'rdar://1234', + 'h://test', + 'http:// shouldfail.com', + ':// should fail', + 'http://foo.bar/foo(bar)baz quux', + 'ftps://foo.bar/', + 'http://-error-.invalid/', + 'http://a.b--c.de/', + 'http://-a.b.co', + 'http://a.b-.co', + 'http://.www.foo.bar/', + 'http://www.foo.bar./', + 'http://.www.foo.bar./' + ]; + + var localURIs = [ + 'http://intranetsite', + 'http://intranetsite/test', + 'http://intranetsite:80', + 'http://intranetsite:80/test', + 'http://user:pass@intranetsite', + 'http://user:pass@intranetsite/test', + 'http://user:pass@intranetsite:80', + 'http://user:pass@intranetsite:80/test', + 'http://10.1.1.0', + 'http://10.1.1.255', + 'http://10.1.1.1', + 'http://10.1.1.254', + 'http://127.0.0.1', + 'http://192.168.0.1', + 'http://0.0.0.0', + 'http://224.1.1.1', + 'http://1.1.1.1.1', + 'http://123.123.123', + 'http://3628126748' + ]; + + it('Valid URIs (allowLocal=false)', function() { + var me = this; + $.each(validGlobalURIs, function(index, uri) { + me.bv.resetForm(); + me.$uri.val(uri); + me.bv.validate(); + expect(me.bv.isValid()).toBeTruthy(); + }); + }); + + it('Invalid URIs (allowLocal=false)', function() { + var me = this; + $.each(invalidGlobalURIs.concat(localURIs), function(index, uri) { + me.bv.resetForm(); + me.$uri.val(uri); + me.bv.validate(); + expect(me.bv.isValid()).toEqual(false); + }); + }); + + it('Valid URIs (allowLocal=true)', function() { + var me = this; + me.bv.updateOption('uri', 'uri', 'allowLocal', true); + $.each(validGlobalURIs.concat(localURIs), function(index, uri) { + me.bv.resetForm(); + me.$uri.val(uri); + me.bv.validate(); + expect(me.bv.isValid()).toBeTruthy(); + }); + }); + + it('Invalid URIs (allowLocal=true)', function() { + var me = this; + me.bv.updateOption('uri', 'uri', 'allowLocal', true); + $.each(invalidGlobalURIs, function(index, uri) { + me.bv.resetForm(); + me.$uri.val(uri); + me.bv.validate(); + expect(me.bv.isValid()).toEqual(false); + }); + }); +}); + +describe('vat', function() { + beforeEach(function() { + $([ + '
      ', + '
      ', + '', + '
      ', + '
      ', + '', + '
      ', + '
      ', + ].join('\n')).appendTo('body'); + + $('#vatForm').bootstrapValidator(); + + /** + * @type {BootstrapValidator} + */ + this.bv = $('#vatForm').data('bootstrapValidator'); + this.$country = this.bv.getFieldElements('country'); + this.$vat = this.bv.getFieldElements('vat'); + }); + + afterEach(function() { + $('#vatForm').bootstrapValidator('destroy').remove(); + }); + + it('dynamic country', function() { + this.$vat.attr('data-bv-vat-country', 'country'); + this.bv.destroy(); + this.bv = $('#vatForm').bootstrapValidator().data('bootstrapValidator'); + + this.$country.val('AT'); + this.$vat.val('ATU13585627'); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + + this.bv.resetForm(); + this.$country.val('BG'); + this.$vat.val('BE0428759497'); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + + this.bv.resetForm(); + this.$country.val('BE'); + this.$vat.val('BE431150351'); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + }); + + it('Austrian VAT number', function() { + this.bv.updateOption('vat', 'vat', 'country', 'AT'); + + // Valid samples + var validSamples = ['ATU13585627', 'U13585627']; + for (var i in validSamples) { + this.bv.resetForm(); + this.$vat.val(validSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + } + + // Invalid samples + var invalidSamples = ['ATU13585626', 'U13585626']; + for (i in invalidSamples) { + this.bv.resetForm(); + this.$vat.val(invalidSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + } + }); + + it('Belgian VAT number', function() { + this.bv.updateOption('vat', 'vat', 'country', 'BE'); + + // Valid samples + var validSamples = ['BE0428759497', '0428759497']; + for (var i in validSamples) { + this.bv.resetForm(); + this.$vat.val(validSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + } + + // Invalid samples + var invalidSamples = ['BE431150351', '431150351']; + for (i in invalidSamples) { + this.bv.resetForm(); + this.$vat.val(invalidSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + } + }); + + it('Bulgarian VAT number', function() { + this.bv.updateOption('vat', 'vat', 'country', 'BG'); + + // Valid samples + var validSamples = ['BG175074752', 'BG7523169263', 'BG8032056031', 'BG7542011030', 'BG7111042925', '175074752', '7523169263', '8032056031']; + for (var i in validSamples) { + this.bv.resetForm(); + this.$vat.val(validSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + } + + // Invalid samples + var invalidSamples = ['BG175074753', 'BG7552A10004', 'BG7111042922', '175074753', '7552A10004']; + for (i in invalidSamples) { + this.bv.resetForm(); + this.$vat.val(invalidSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + } + }); + + it('Cypriot VAT number', function() { + this.bv.updateOption('vat', 'vat', 'country', 'CY'); + + // Valid samples + var validSamples = ['CY10259033P', '10259033P']; + for (var i in validSamples) { + this.bv.resetForm(); + this.$vat.val(validSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + } + + // Invalid samples + var invalidSamples = ['CY10259033Z', '10259033Z']; + for (i in invalidSamples) { + this.bv.resetForm(); + this.$vat.val(invalidSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + } + }); + + it('Czech Republic VAT number', function() { + this.bv.updateOption('vat', 'vat', 'country', 'CZ'); + + // Valid samples + var validSamples = ['CZ25123891', 'CZ7103192745', 'CZ991231123', 'CZ640903926', '25123891', '7103192745']; + for (var i in validSamples) { + this.bv.resetForm(); + this.$vat.val(validSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + } + + // Invalid samples + var invalidSamples = ['CZ25123890', 'CZ1103492745', 'CZ590312123', '25123890', '1103492745']; + for (i in invalidSamples) { + this.bv.resetForm(); + this.$vat.val(invalidSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + } + }); + + it('German VAT number', function() { + this.bv.updateOption('vat', 'vat', 'country', 'DE'); + + // Valid samples + var validSamples = ['DE136695976', '136695976']; + for (var i in validSamples) { + this.bv.resetForm(); + this.$vat.val(validSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + } + + // Invalid samples + var invalidSamples = ['DE136695978', '136695978']; + for (i in invalidSamples) { + this.bv.resetForm(); + this.$vat.val(invalidSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + } + }); + + it('Danish VAT number', function() { + this.bv.updateOption('vat', 'vat', 'country', 'DK'); + + // Valid samples + var validSamples = ['DK13585628', '13585628']; + for (var i in validSamples) { + this.bv.resetForm(); + this.$vat.val(validSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + } + + // Invalid samples + var invalidSamples = ['DK13585627', '13585627']; + for (i in invalidSamples) { + this.bv.resetForm(); + this.$vat.val(invalidSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + } + }); + + it('Estonian VAT number', function() { + this.bv.updateOption('vat', 'vat', 'country', 'EE'); + + // Valid samples + var validSamples = ['EE100931558', 'EE100594102', '100931558', '100594102']; + for (var i in validSamples) { + this.bv.resetForm(); + this.$vat.val(validSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + } + + // Invalid samples + var invalidSamples = ['EE100594103', '100594103']; + for (i in invalidSamples) { + this.bv.resetForm(); + this.$vat.val(invalidSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + } + }); + + it('Spanish VAT number (NIF)', function() { + this.bv.updateOption('vat', 'vat', 'country', 'ES'); + + // Valid samples + var validSamples = ['ES54362315K', 'ESX2482300W', 'ESX5253868R', 'ESM1234567L', 'ESJ99216582', 'ESB58378431', 'ESB64717838', '54362315K', 'X2482300W', 'X5253868R', 'M1234567L', 'J99216582']; + for (var i in validSamples) { + this.bv.resetForm(); + this.$vat.val(validSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + } + + // Invalid samples + var invalidSamples = ['ES54362315Z', 'ESX2482300A', 'ESJ99216583', '54362315Z', 'X2482300A']; + for (i in invalidSamples) { + this.bv.resetForm(); + this.$vat.val(invalidSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + } + }); + + it('Finnish VAT number', function() { + this.bv.updateOption('vat', 'vat', 'country', 'FI'); + + // Valid samples + var validSamples = ['FI20774740', '20774740']; + for (var i in validSamples) { + this.bv.resetForm(); + this.$vat.val(validSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + } + + // Invalid samples + var invalidSamples = ['FI20774741', '20774741']; + for (i in invalidSamples) { + this.bv.resetForm(); + this.$vat.val(invalidSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + } + }); + + it('French VAT number (TVA)', function() { + this.bv.updateOption('vat', 'vat', 'country', 'FR'); + + // Valid samples + var validSamples = ['FR40303265045', 'FR23334175221', 'FRK7399859412', 'FR4Z123456782', '40303265045', '23334175221', 'K7399859412']; + for (var i in validSamples) { + this.bv.resetForm(); + this.$vat.val(validSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + } + + // Invalid samples + var invalidSamples = ['FR84323140391', '84323140391']; + for (i in invalidSamples) { + this.bv.resetForm(); + this.$vat.val(invalidSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + } + }); + + it('United Kingdom VAT number', function() { + this.bv.updateOption('vat', 'vat', 'country', 'GB'); + + // Valid samples + var validSamples = ['GB980780684', '980780684']; + for (var i in validSamples) { + this.bv.resetForm(); + this.$vat.val(validSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + } + + // Invalid samples + var invalidSamples = ['GB802311781', '802311781']; + for (i in invalidSamples) { + this.bv.resetForm(); + this.$vat.val(invalidSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + } + }); + + it('Greek VAT number', function() { + this.bv.updateOption('vat', 'vat', 'country', 'GR'); + + // Valid samples + var validSamples = ['GR023456780', 'EL094259216', '023456780', '094259216']; + for (var i in validSamples) { + this.bv.resetForm(); + this.$vat.val(validSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + } + + // Invalid samples + var invalidSamples = ['GR123456781', '123456781']; + for (i in invalidSamples) { + this.bv.resetForm(); + this.$vat.val(invalidSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + } + }); + + it('Hungarian VAT number', function() { + this.bv.updateOption('vat', 'vat', 'country', 'HU'); + + // Valid samples + var validSamples = ['HU12892312', '12892312']; + for (var i in validSamples) { + this.bv.resetForm(); + this.$vat.val(validSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + } + + // Invalid samples + var invalidSamples = ['HU12892313', '12892313']; + for (i in invalidSamples) { + this.bv.resetForm(); + this.$vat.val(invalidSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + } + }); + + it('Croatian VAT number', function() { + this.bv.updateOption('vat', 'vat', 'country', 'HR'); + + // Valid samples + var validSamples = ['HR33392005961', '33392005961']; + for (var i in validSamples) { + this.bv.resetForm(); + this.$vat.val(validSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + } + + // Invalid samples + var invalidSamples = ['HR33392005962', '33392005962']; + for (i in invalidSamples) { + this.bv.resetForm(); + this.$vat.val(invalidSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + } + }); + + it('Irish VAT number', function() { + this.bv.updateOption('vat', 'vat', 'country', 'IE'); + + // Valid samples + var validSamples = ['IE6433435F', 'IE6433435OA', 'IE8D79739I', '6433435F', '6433435OA', '8D79739I']; + for (var i in validSamples) { + this.bv.resetForm(); + this.$vat.val(validSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + } + + // Invalid samples + var invalidSamples = ['IE8D79738J', '8D79738J']; + for (i in invalidSamples) { + this.bv.resetForm(); + this.$vat.val(invalidSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + } + }); + + it('Iceland VAT (VSK) number', function() { + this.bv.updateOption('vat', 'vat', 'country', 'IS'); + + // Valid samples + var validSamples = ['IS11111', 'IS111111', '11111', '111111']; + for (var i in validSamples) { + this.bv.resetForm(); + this.$vat.val(validSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + } + + // Invalid samples + var invalidSamples = ['IS1234567', 'IS123456ABC', '1234567', '123456ABC']; + for (i in invalidSamples) { + this.bv.resetForm(); + this.$vat.val(invalidSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + } + }); + + it('Italian VAT number', function() { + this.bv.updateOption('vat', 'vat', 'country', 'IT'); + + // Valid samples + var validSamples = ['IT00743110157', '00743110157']; + for (var i in validSamples) { + this.bv.resetForm(); + this.$vat.val(validSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + } + + // Invalid samples + var invalidSamples = ['IT00743110158', '00743110158']; + for (i in invalidSamples) { + this.bv.resetForm(); + this.$vat.val(invalidSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + } + }); + + it('Lithuanian VAT number', function() { + this.bv.updateOption('vat', 'vat', 'country', 'LT'); + + // Valid samples + var validSamples = ['LT119511515', 'LT100001919017', 'LT100004801610', '119511515', '100001919017', '100004801610']; + for (var i in validSamples) { + this.bv.resetForm(); + this.$vat.val(validSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + } + + // Invalid samples + var invalidSamples = ['LT100001919018', '100001919018']; + for (i in invalidSamples) { + this.bv.resetForm(); + this.$vat.val(invalidSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + } + }); + + it('Luxembourg VAT number', function() { + this.bv.updateOption('vat', 'vat', 'country', 'LU'); + + // Valid samples + var validSamples = ['LU15027442', '15027442']; + for (var i in validSamples) { + this.bv.resetForm(); + this.$vat.val(validSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + } + + // Invalid samples + var invalidSamples = ['LU15027443', '15027443']; + for (i in invalidSamples) { + this.bv.resetForm(); + this.$vat.val(invalidSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + } + }); + + it('Latvian VAT number', function() { + this.bv.updateOption('vat', 'vat', 'country', 'LV'); + + // Valid samples + var validSamples = ['LV40003521600', 'LV16117519997', '40003521600', '16117519997']; + for (var i in validSamples) { + this.bv.resetForm(); + this.$vat.val(validSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + } + + // Invalid samples + var invalidSamples = ['LV40003521601', 'LV16137519997', '40003521601', '16137519997']; + for (i in invalidSamples) { + this.bv.resetForm(); + this.$vat.val(invalidSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + } + }); + + it('Maltese VAT number', function() { + this.bv.updateOption('vat', 'vat', 'country', 'MT'); + + // Valid samples + var validSamples = ['MT11679112', '11679112']; + for (var i in validSamples) { + this.bv.resetForm(); + this.$vat.val(validSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + } + + // Invalid samples + var invalidSamples = ['MT11679113', '11679113']; + for (i in invalidSamples) { + this.bv.resetForm(); + this.$vat.val(invalidSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + } + }); + + it('Dutch VAT number', function() { + this.bv.updateOption('vat', 'vat', 'country', 'NL'); + + // Valid samples + var validSamples = ['NL004495445B01', '004495445B01']; + for (var i in validSamples) { + this.bv.resetForm(); + this.$vat.val(validSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + } + + // Invalid samples + var invalidSamples = ['NL123456789B90', '123456789B90']; + for (i in invalidSamples) { + this.bv.resetForm(); + this.$vat.val(invalidSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + } + }); + + it('Polish VAT number', function() { + this.bv.updateOption('vat', 'vat', 'country', 'PL'); + + // Valid samples + var validSamples = ['PL8567346215', '8567346215']; + for (var i in validSamples) { + this.bv.resetForm(); + this.$vat.val(validSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + } + + // Invalid samples + var invalidSamples = ['PL8567346216', '8567346216']; + for (i in invalidSamples) { + this.bv.resetForm(); + this.$vat.val(invalidSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + } + }); + + it('Portuguese VAT number', function() { + this.bv.updateOption('vat', 'vat', 'country', 'PT'); + + // Valid samples + var validSamples = ['PT501964843', '501964843']; + for (var i in validSamples) { + this.bv.resetForm(); + this.$vat.val(validSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + } + + // Invalid samples + var invalidSamples = ['PT501964842', '501964842']; + for (i in invalidSamples) { + this.bv.resetForm(); + this.$vat.val(invalidSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + } + }); + + it('Romanian VAT number', function() { + this.bv.updateOption('vat', 'vat', 'country', 'RO'); + + // Valid samples + var validSamples = ['RO18547290', '18547290']; + for (var i in validSamples) { + this.bv.resetForm(); + this.$vat.val(validSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + } + + // Invalid samples + var invalidSamples = ['RO18547291', '18547291']; + for (i in invalidSamples) { + this.bv.resetForm(); + this.$vat.val(invalidSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + } + }); + + it('Russian VAT number', function() { + this.bv.updateOption('vat', 'vat', 'country', 'RU'); + + // Valid samples + var validSamples = ['RU7805145876', 'RU781300557475', '7805145876', '781300557475']; + for (var i in validSamples) { + this.bv.resetForm(); + this.$vat.val(validSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + } + + // Invalid samples + var invalidSamples = ['RU7805145877', 'RU781300557474', '7805145877', '781300557474']; + for (i in invalidSamples) { + this.bv.resetForm(); + this.$vat.val(invalidSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + } + }); + + it('Swedish VAT number', function() { + this.bv.updateOption('vat', 'vat', 'country', 'SE'); + + // Valid samples + var validSamples = ['SE123456789701', '123456789701']; + for (var i in validSamples) { + this.bv.resetForm(); + this.$vat.val(validSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + } + + // Invalid samples + var invalidSamples = ['SE123456789101', '123456789101']; + for (i in invalidSamples) { + this.bv.resetForm(); + this.$vat.val(invalidSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + } + }); + + it('Slovenian VAT number', function() { + this.bv.updateOption('vat', 'vat', 'country', 'SI'); + + // Valid samples + var validSamples = ['SI50223054', '50223054']; + for (var i in validSamples) { + this.bv.resetForm(); + this.$vat.val(validSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + } + + // Invalid samples + var invalidSamples = ['SI50223055', '50223055']; + for (i in invalidSamples) { + this.bv.resetForm(); + this.$vat.val(invalidSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + } + }); + + it('Slovak VAT number', function() { + this.bv.updateOption('vat', 'vat', 'country', 'SK'); + + // Valid samples + var validSamples = ['SK2022749619', '2022749619']; + for (var i in validSamples) { + this.bv.resetForm(); + this.$vat.val(validSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + } + + // Invalid samples + var invalidSamples = ['SK2022749618', '2022749618']; + for (i in invalidSamples) { + this.bv.resetForm(); + this.$vat.val(invalidSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + } + }); + + it('South African VAT number', function() { + this.bv.updateOption('vat', 'vat', 'country', 'ZA'); + + // Valid samples + var validSamples = ['ZA4012345678', '4012345678']; + for (var i in validSamples) { + this.bv.resetForm(); + this.$vat.val(validSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + } + + // Invalid samples + var invalidSamples = ['ZA40123456789', 'ZA0123456789', '40123456789', '0123456789']; + for (i in invalidSamples) { + this.bv.resetForm(); + this.$vat.val(invalidSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + } + }); + + it('Venezuelan VAT number (RIF)', function() { + this.bv.updateOption('vat', 'vat', 'country', 'VE'); + + // Valid samples + var validSamples = ['VEJ309272292', 'VEV242818101', 'VEJ000126518', 'VEJ000458324', 'J309272292', 'V242818101', 'J000126518', 'J000458324']; + for (var i in validSamples) { + this.bv.resetForm(); + this.$vat.val(validSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + } + + // Invalid samples + var invalidSamples = ['VEJ309272293', 'VEV242818100', 'J000126519', 'J000458323']; + for (i in invalidSamples) { + this.bv.resetForm(); + this.$vat.val(invalidSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + } + }); +}); + +function getCountryCode(value, validator, $field) { + $('#msg').html('getCountryCode() called'); + return validator.getFieldElements('country').val(); +}; + +TestSuite = $.extend({}, TestSuite, { + ZipCode: { + getCountryCode: function(value, validator, $field) { + $('#msg').html('TestSuite.ZipCode.getCountryCode() called'); + return validator.getFieldElements('country').val(); + } + } +}); + +describe('zipCode', function() { + beforeEach(function() { + $([ + '
      ', + '
      ', + '
      ', + '', + '
      ', + '', + '
      ', + '
      ', + '
      ', + '', + '
      ', + '', + '
      ', + '
      ', + '
      ' + ].join('\n')).appendTo('body'); + + $('#zipCodeForm').bootstrapValidator(); + + /** + * @type {BootstrapValidator} + */ + this.bv = $('#zipCodeForm').data('bootstrapValidator'); + + this.$country = this.bv.getFieldElements('country'); + this.$zipCode = this.bv.getFieldElements('zc'); + }); + + afterEach(function() { + $('#zipCodeForm').bootstrapValidator('destroy').remove(); + }); + + it('country code updateOption()', function() { + // Check IT postal code + this.bv.updateOption('zc', 'zipCode', 'country', 'IT'); + this.$zipCode.val('1234'); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + + this.bv.resetForm(); + this.$zipCode.val('IT-12345'); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + + // Check United Kingdom postal code + this.bv.updateOption('zc', 'zipCode', 'country', 'GB'); + var validUkSamples = ['EC1A 1BB', 'W1A 1HQ', 'M1 1AA', 'B33 8TH', 'CR2 6XH', 'DN55 1PT', 'AI-2640', 'ASCN 1ZZ', 'GIR 0AA']; + + for (var i in validUkSamples) { + this.bv.resetForm(); + this.$zipCode.val(validUkSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + } + }); + + it('country code other field declarative', function() { + this.$zipCode.attr('data-bv-zipcode-country', 'country'); + + // Need to destroy the plugin instance ... + $('#zipCodeForm').bootstrapValidator('destroy'); + + // ... and re-create it + this.bv = $('#zipCodeForm').bootstrapValidator().data('bootstrapValidator'); + this.$country.val('IT'); + + this.bv.resetForm(); + this.$zipCode.val('1234'); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + + this.bv.resetForm(); + this.$zipCode.val('I-12345'); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + }); + + it('country code callback declarative function', function() { + this.$zipCode.attr('data-bv-zipcode-country', 'getCountryCode'); + $('#zipCodeForm').bootstrapValidator('destroy'); + this.bv = $('#zipCodeForm').bootstrapValidator().data('bootstrapValidator'); + this.$country.val('NL'); + this.$zipCode.val('0123'); + this.bv.validate(); + expect($('#msg').html()).toEqual('getCountryCode() called'); + expect(this.bv.isValid()).toEqual(false); + }); + + it('country code callback declarative function()', function() { + this.$zipCode.attr('data-bv-zipcode-country', 'getCountryCode()'); + $('#zipCodeForm').bootstrapValidator('destroy'); + this.bv = $('#zipCodeForm').bootstrapValidator().data('bootstrapValidator'); + this.$country.val('NL'); + this.$zipCode.val('1234 ab'); + this.bv.validate(); + expect($('#msg').html()).toEqual('getCountryCode() called'); + expect(this.bv.isValid()).toBeTruthy(); + }); + + it('country code callback declarative A.B.C', function() { + this.$zipCode.attr('data-bv-zipcode-country', 'TestSuite.ZipCode.getCountryCode'); + $('#zipCodeForm').bootstrapValidator('destroy'); + this.bv = $('#zipCodeForm').bootstrapValidator().data('bootstrapValidator'); + this.$country.val('DK'); + this.$zipCode.val('DK 123'); + this.bv.validate(); + expect($('#msg').html()).toEqual('TestSuite.ZipCode.getCountryCode() called'); + expect(this.bv.isValid()).toEqual(false); + }); + + it('country code callback declarative A.B.C()', function() { + this.$zipCode.attr('data-bv-zipcode-country', 'TestSuite.ZipCode.getCountryCode()'); + $('#zipCodeForm').bootstrapValidator('destroy'); + this.bv = $('#zipCodeForm').bootstrapValidator().data('bootstrapValidator'); + this.$country.val('DK'); + this.$zipCode.val('DK-1234'); + this.bv.validate(); + expect($('#msg').html()).toEqual('TestSuite.ZipCode.getCountryCode() called'); + expect(this.bv.isValid()).toBeTruthy(); + }); + + it('country code callback programmatically', function() { + this.$zipCode.removeAttr('data-bv-zipcode-country'); + $('#zipCodeForm').bootstrapValidator('destroy'); + this.bv = $('#zipCodeForm') + .bootstrapValidator({ + fields: { + zc: { + validators: { + zipCode: { + country: function(value, validator, $field) { + return getCountryCode(value, validator, $field); + } + } + } + } + } + }) + .data('bootstrapValidator'); + this.$country.val('SE'); + + this.bv.resetForm(); + this.$zipCode.val('S-567 8'); + this.bv.validate(); + expect($('#msg').html()).toEqual('getCountryCode() called'); + expect(this.bv.isValid()).toEqual(false); + + this.bv.resetForm(); + this.$zipCode.val('S-12345'); + this.bv.validate(); + expect($('#msg').html()).toEqual('getCountryCode() called'); + expect(this.bv.isValid()).toBeTruthy(); + }); + + it('not supported country code', function() { + this.$zipCode.attr('data-bv-zipcode-country', 'NOT_SUPPORTED'); + + $('#zipCodeForm').bootstrapValidator('destroy'); + + this.bv = $('#zipCodeForm').bootstrapValidator().data('bootstrapValidator'); + + this.bv.resetForm(); + this.$zipCode.val('1234'); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + expect(this.bv.getMessages(this.$zipCode, 'zipCode')[0]).toEqual($.fn.bootstrapValidator.helpers.format($.fn.bootstrapValidator.i18n.zipCode.countryNotSupported, 'NOT_SUPPORTED')); + }); + + it('US zipcode', function() { + this.$zipCode.val('12345'); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + + this.bv.resetForm(); + this.$zipCode.val('123'); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + }); + + it('Czech Republic postal code', function() { + this.bv.updateOption('zc', 'zipCode', 'country', 'CZ'); + + // Valid samples + var validSamples = ['12345', '123 45']; + for (var i in validSamples) { + this.bv.resetForm(); + this.$zipCode.val(validSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + } + + // Invalid samples + var invalidSamples = ['12 345', '123456', '1 2345', '1234 5', '12 3 45']; + for (i in invalidSamples) { + this.bv.resetForm(); + this.$zipCode.val(invalidSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + } + }); + + it('Slovakia postal code', function() { + this.bv.updateOption('zc', 'zipCode', 'country', 'SK'); + + // Valid samples + var validSamples = ['12345', '123 45']; + for (var i in validSamples) { + this.bv.resetForm(); + this.$zipCode.val(validSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + } + + // Invalid samples + var invalidSamples = ['12 345', '123456', '1 2345', '1234 5', '12 3 45']; + for (i in invalidSamples) { + this.bv.resetForm(); + this.$zipCode.val(invalidSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + } + }); + + it('France postal code', function() { + this.bv.updateOption('zc', 'zipCode', 'country', 'FR'); + + // Valid samples + var validSamples = ['12340', '01230', '75116']; + for (var i in validSamples) { + this.bv.resetForm(); + this.$zipCode.val(validSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + } + + // Invalid samples + var invalidSamples = ['123 45', '12 345', '123456', '1 2345', '1234 5', '12 3 45', '1234A']; + for (i in invalidSamples) { + this.bv.resetForm(); + this.$zipCode.val(invalidSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + } + }); + + it('Eircode (Ireland postal code)', function() { + this.bv.updateOption('zc', 'zipCode', 'country', 'IE'); + + // Valid samples + var validSamples = ['A65 F4E2', 'D6W FNT4', 'T37 F8HK']; + for (var i in validSamples) { + this.bv.resetForm(); + this.$zipCode.val(validSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + } + + // Invalid samples + var invalidSamples = ['a65 f4e2', 'D6W FNTO', 'T37F8HK']; + for (i in invalidSamples) { + this.bv.resetForm(); + this.$zipCode.val(invalidSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + } + }); + + it('Portugal postal code', function() { + this.bv.updateOption('zc', 'zipCode', 'country', 'PT'); + + // Valid samples + var validSamples = ['2435-459', '1000-000', '1234-456']; + for (var i in validSamples) { + this.bv.resetForm(); + this.$zipCode.val(validSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + } + + // Invalid samples + var invalidSamples = ['0123-456', '1234456', '1234-ABC', '1234 456']; + for (i in invalidSamples) { + this.bv.resetForm(); + this.$zipCode.val(invalidSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + } + }); + + it('Austria postal code', function() { + this.bv.updateOption('zc', 'zipCode', 'country', 'AT'); + + // Valid samples + var validSamples = ['6020', '1010', '4853']; + for (var i in validSamples) { + this.bv.resetForm(); + this.$zipCode.val(validSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + } + + // Invalid samples + var invalidSamples = ['0020', '12345', '102', '12AB', 'AT 6020 XY']; + for (i in invalidSamples) { + this.bv.resetForm(); + this.$zipCode.val(invalidSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + } + }); + + it('Germany postal code', function() { + this.bv.updateOption('zc', 'zipCode', 'country', 'DE'); + + // Valid samples + var validSamples = ['52238', '01001', '09107']; + for (var i in validSamples) { + this.bv.resetForm(); + this.$zipCode.val(validSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + } + + // Invalid samples + var invalidSamples = ['01000', '99999', '102', 'ABCDE', 'DE 52240 XY']; + for (i in invalidSamples) { + this.bv.resetForm(); + this.$zipCode.val(invalidSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + } + }); + + it('Switzerland postal code', function() { + this.bv.updateOption('zc', 'zipCode', 'country', 'CH'); + + // Valid samples + var validSamples = [ '8280', '8090', '8238', '9490']; + for (var i in validSamples) { + this.bv.resetForm(); + this.$zipCode.val(validSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + } + + // Invalid samples + var invalidSamples = ['0123', '99999', '102', 'ABCD', 'CH-5224 XY']; + for (i in invalidSamples) { + this.bv.resetForm(); + this.$zipCode.val(invalidSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + } + }); +}); diff --git a/test/spec/api.js b/test/spec/api.js new file mode 100644 index 000000000..0a8efd2e3 --- /dev/null +++ b/test/spec/api.js @@ -0,0 +1,87 @@ +describe('api', function() { + // Override the options + $.extend($.fn.bootstrapValidator.DEFAULT_OPTIONS, { + feedbackIcons: { + valid: 'glyphicon glyphicon-ok', + invalid: 'glyphicon glyphicon-remove', + validating: 'glyphicon glyphicon-refresh' + } + }); + + beforeEach(function() { + $([ + '
      ', + '
      ', + '', + '
      ', + '
      ', + '', + '
      ', + '
      ', + '', + '
      ', + '
      ' + ].join('\n')).appendTo('body'); + + $('#apiForm').bootstrapValidator(); + + this.bv = $('#apiForm').data('bootstrapValidator'); + this.$email = this.bv.getFieldElements('email'); + this.$note = $('#apiForm').find('input[name="note"]'); + }); + + afterEach(function() { + $('#apiForm').bootstrapValidator('destroy').remove(); + }); + + it('revalidateField()', function() { + this.$email.val('email@domain.com'); + this.bv.validate(); + expect(this.bv.isValidField('email')).toBeTruthy(); + + this.$email.val('invalid#email.address'); + this.bv.revalidateField('email'); + expect(this.bv.isValidField(this.$email)).toEqual(false); + }); + + it('destroy()', function() { + this.bv.destroy(); + expect($('#apiForm').data('bootstrapValidator')).toBeUndefined(); + expect($('#apiForm').find('i[data-bv-icon-for]').length).toEqual(0); + expect($('#apiForm').find('.help-block[data-bv-for]').length).toEqual(0); + expect($('#apiForm').find('.has-feedback').length).toEqual(0); + expect($('#apiForm').find('.has-success').length).toEqual(0); + expect($('#apiForm').find('.has-error').length).toEqual(0); + expect($('#apiForm').find('[data-bv-field]').length).toEqual(0); + }); + + it('getOptions()', function() { + // Form options + expect(this.bv.getOptions().feedbackIcons.valid).toEqual('glyphicon glyphicon-ok'); + + // Field options + expect(this.bv.getOptions('username', 'stringlength')).toBeNull(); + expect(this.bv.getOptions('username', 'stringlength', 'min')).toBeNull(); + + expect(this.bv.getOptions('username', 'stringLength')).toBeDefined(); + expect(this.bv.getOptions('username', 'stringLength', 'min')).toEqual('8'); + expect(this.bv.getOptions('username', 'stringlength', 'max')).toBeNull(); + }); + + // #1014 + it('isValidField()', function() { + this.$email.val('email@domain.com'); + this.bv.validate(); + expect(this.bv.isValidField(this.$note)).toBeTruthy(); + expect(this.bv.isValidField(this.$email)).toBeTruthy(); + }); + + // #1014 + it('validateField()', function() { + this.$email.val('email@domain.com'); + this.bv.validateField(this.$email); + this.bv.validateField(this.$note); + expect(this.bv.isValidField(this.$email)).toBeTruthy(); + expect(this.bv.isValidField(this.$note)).toBeTruthy(); + }); +}); diff --git a/test/spec/autoFocus.js b/test/spec/autoFocus.js new file mode 100644 index 000000000..84a502889 --- /dev/null +++ b/test/spec/autoFocus.js @@ -0,0 +1,90 @@ +describe('autoFocus', function() { + beforeEach(function() { + $([ + '
      ', + '
      ', + '', + '
      ', + '
      ', + '', + '
      ', + '
      ', + '', + '
      ', + '
      ' + ].join('')).appendTo('body'); + + this.bv = $('#autoFocusForm') + .bootstrapValidator() + .submit(function(e) { + e.preventDefault(); + }) + .data('bootstrapValidator'); + this.$username = this.bv.getFieldElements('username'); + this.$email = this.bv.getFieldElements('email'); + }); + + afterEach(function() { + $('#autoFocusForm').bootstrapValidator('destroy').remove(); + }); + + it('default option (autoFocus=true)', function() { + $('#submitButton').click(); + expect(this.$username.is(':focus')).toBeTruthy(); + expect($(document.activeElement).attr('name')).toEqual('username'); + + this.bv.resetForm(); + this.$username.val('user_name'); + this.$email.val(''); + $('#submitButton').click(); + expect(this.$email.is(':focus')).toBeTruthy(); + expect($(document.activeElement).attr('name')).toEqual('email'); + }); + + it('set autoFocus=false for form', function() { + $('#autoFocusForm') + .bootstrapValidator('destroy') + .bootstrapValidator({ + autoFocus: false + }); + this.$username.val(''); + this.$email.val('invalid#email'); + $('#submitButton').click(); + + expect(this.$username.is(':focus')).toBeFalsy(); + expect(this.$email.is(':focus')).toBeFalsy(); + }); + + it('set autoFocus=false for all fields', function() { + this.bv + .addField('username', { + autoFocus: false + }) + .addField('email', { + autoFocus: false + }); + this.$username.val('user_name'); + this.$email.val('invalid#email'); + $('#submitButton').click(); + + expect(this.$username.is(':focus')).toBeFalsy(); + expect(this.$email.is(':focus')).toBeFalsy(); + }); + + it('set different autoFocus value for fields', function() { + this.bv + .addField('username', { + autoFocus: false + }) + .addField('email', { + autoFocus: true + }); + this.$username.val(''); + this.$email.val('invalid_email'); + $('#submitButton').click(); + + expect(this.$username.is(':focus')).toBeFalsy(); + expect(this.$email.is(':focus')).toBeTruthy(); + expect($(document.activeElement).attr('name')).toEqual('email'); + }); +}); diff --git a/test/spec/container.js b/test/spec/container.js new file mode 100644 index 000000000..b67c93681 --- /dev/null +++ b/test/spec/container.js @@ -0,0 +1,274 @@ +describe('container form option', function() { + beforeEach(function() { + $([ + '
      ', + '
      ', + '', + '
      ', + '', + '
      ', + '
      ', + '', + '
      ', + '
      ', + '
      ', + '
      ' + ].join('')).appendTo('body'); + }); + + afterEach(function() { + $('#containerForm').bootstrapValidator('destroy').remove(); + }); + + it('form container declarative', function() { + $('#containerForm') + .attr('data-bv-container', '#errors') + .bootstrapValidator(); + + this.bv = $('#containerForm').data('bootstrapValidator'); + this.$firstName = this.bv.getFieldElements('firstName'); + this.$lastName = this.bv.getFieldElements('lastName'); + + expect($('#errors').find('.help-block').length).toBeGreaterThan(0); + + this.$firstName.val('First'); + this.$lastName.val(''); + this.bv.validate(); + expect($('#errors').find('.help-block:visible[data-bv-for="firstName"]').length).toEqual(0); + expect($('#errors').find('.help-block:visible[data-bv-for="lastName"]').length).toBeGreaterThan(0); + }); + + it('form container programmatically', function() { + $('#containerForm').bootstrapValidator({ + container: '#errors' + }); + + this.bv = $('#containerForm').data('bootstrapValidator'); + this.$firstName = this.bv.getFieldElements('firstName'); + this.$lastName = this.bv.getFieldElements('lastName'); + + expect($('#errors').find('.help-block').length).toBeGreaterThan(0); + + this.$firstName.val(''); + this.$lastName.val('Last'); + this.bv.validate(); + expect($('#errors').find('.help-block:visible[data-bv-for="firstName"]').length).toBeGreaterThan(0); + expect($('#errors').find('.help-block:visible[data-bv-for="lastName"]').length).toEqual(0); + + this.bv.resetForm(); + this.$firstName.val('First'); + this.$lastName.val('Last'); + this.bv.validate(); + expect($('#errors').find('.help-block:visible').length).toEqual(0); + }); +}); + +describe('container field option', function() { + beforeEach(function() { + $([ + '
      ', + '
      ', + '', + '
      ', + '', + '', + '
      ', + '
      ', + '', + '', + '
      ', + '
      ', + '
      ' + ].join('')).appendTo('body'); + + $('#containerForm').bootstrapValidator({ + feedbackIcons: { + valid: 'glyphicon glyphicon-ok', + invalid: 'glyphicon glyphicon-remove', + validating: 'glyphicon glyphicon-refresh' + }, + fields: { + lastName: { + container: '.lastNameMessage' + } + } + }); + + this.bv = $('#containerForm').data('bootstrapValidator'); + this.$firstName = this.bv.getFieldElements('firstName'); + this.$lastName = this.bv.getFieldElements('lastName'); + }); + + afterEach(function() { + $('#containerForm').bootstrapValidator('destroy').remove(); + }); + + it('field container declarative', function() { + expect($.trim($('#firstNameMessage').text())).toEqual('The first name is required'); + expect($.trim($('.lastNameMessage').text())).toEqual('The last name is required'); + }); + + it('field container programmatically', function() { + this.$firstName.val('First'); + this.$lastName.val(''); + this.bv.validate(); + expect($('#firstNameMessage').find('.help-block:visible').length).toEqual(0); + expect($('.lastNameMessage').find('.help-block:visible').length).toBeGreaterThan(0); + + this.bv.resetForm(); + this.$firstName.val(''); + this.$lastName.val('Last'); + this.bv.validate(); + expect($('#firstNameMessage').find('.help-block:visible').length).toBeGreaterThan(0); + expect($('.lastNameMessage').find('.help-block:visible').length).toEqual(0); + }); +}); + +describe('container tooltip/popover', function() { + beforeEach(function() { + $([ + '
      ', + '
      ', + '', + '
      ', + '', + '
      ', + '
      ', + '', + '
      ', + '
      ', + '
      ', + '
      ' + ].join('')).appendTo('body'); + }); + + afterEach(function() { + $('#containerForm').bootstrapValidator('destroy').remove(); + }); + + it('container declarative', function() { + $('#containerForm') + .attr('data-bv-container', 'tooltip') + .find('[name="lastName"]') + .attr('data-bv-container', 'popover') + .end() + .bootstrapValidator(); + + this.bv = $('#containerForm').data('bootstrapValidator'); + this.$firstName = this.bv.getFieldElements('firstName'); + this.$lastName = this.bv.getFieldElements('lastName'); + + this.bv.validate(); + expect(this.$firstName.parent().find('i').data('bs.tooltip')).toBeDefined(); + expect(this.$firstName.parent().find('i').data('bs.tooltip').type).toEqual('tooltip'); + expect(this.$lastName.parent().find('i').data('bs.popover')).toBeDefined(); + expect(this.$lastName.parent().find('i').data('bs.popover').type).toEqual('popover'); + + this.bv.resetForm(); + this.$firstName.val('First'); + this.$lastName.val('Last'); + this.bv.validate(); + expect(this.$firstName.parent().find('i').data('bs.tooltip')).toBeUndefined(); + expect(this.$lastName.parent().find('i').data('bs.popover')).toBeUndefined(); + }); + + it('container programmatically', function() { + $('#containerForm').bootstrapValidator({ + container: 'tooltip', + fields: { + lastName: { + container: 'popover' + } + } + }); + + this.bv = $('#containerForm').data('bootstrapValidator'); + this.$firstName = this.bv.getFieldElements('firstName'); + this.$lastName = this.bv.getFieldElements('lastName'); + + this.bv.validate(); + expect(this.$firstName.parent().find('i').data('bs.tooltip')).toBeDefined(); + expect(this.$firstName.parent().find('i').data('bs.tooltip').type).toEqual('tooltip'); + expect(this.$lastName.parent().find('i').data('bs.popover')).toBeDefined(); + expect(this.$lastName.parent().find('i').data('bs.popover').type).toEqual('popover'); + + this.bv.resetForm(); + this.$firstName.val('First'); + this.$lastName.val('Last'); + this.bv.validate(); + expect(this.$firstName.parent().find('i').data('bs.tooltip')).toBeUndefined(); + expect(this.$lastName.parent().find('i').data('bs.popover')).toBeUndefined(); + }); + + // #991: Validate once when setting trigger: blur, container: tooltip + it('trigger: blur, container: tooltip', function() { + $('#containerForm').bootstrapValidator({ + container: 'tooltip', + trigger: 'blur', + fields: { + firstName: { + validators: { + stringLength: { + min: 5, + message: 'The first name must be more than 5 characters' + }, + notEmpty: { + message: 'The first name is required' + }, + regexp: { + regexp: /^[a-z]+$/i, + message: 'The first name must consist of a-z, A-Z characters only' + } + } + }, + lastName: { + validators: { + stringLength: { + min: 5, + message: 'The last name must be more than 5 characters' + }, + notEmpty: { + message: 'The last name is required' + }, + regexp: { + regexp: /^[a-z]+$/i, + message: 'The last name must consist of a-z, A-Z characters only' + } + } + } + } + }); + + this.bv = $('#containerForm').data('bootstrapValidator'); + this.$firstName = this.bv.getFieldElements('firstName'); + this.$lastName = this.bv.getFieldElements('lastName'); + + this.$firstName.val('').trigger('blur'); + this.bv.validate(); + expect(this.$firstName.parent().find('i').data('bs.tooltip')).toBeDefined(); + expect(this.$firstName.parent().find('i').data('bs.tooltip').type).toEqual('tooltip'); + expect(this.$firstName.parent().find('i').data('bs.tooltip').getTitle()).toEqual('The first name is required'); + + this.bv.resetForm(); + this.$firstName.val('@not#valid'); + this.$lastName.val('').focus(); + this.bv.validate(); + expect(this.$firstName.parent().find('i').data('bs.tooltip')).toBeDefined(); + expect(this.$firstName.parent().find('i').data('bs.tooltip').type).toEqual('tooltip'); + expect(this.$firstName.parent().find('i').data('bs.tooltip').getTitle()).toEqual('The first name must consist of a-z, A-Z characters only'); + + this.bv.resetForm(); + this.$firstName.val('Phuo'); + this.$lastName.val('').focus(); + this.bv.validate(); + expect(this.$firstName.parent().find('i').data('bs.tooltip')).toBeDefined(); + expect(this.$firstName.parent().find('i').data('bs.tooltip').type).toEqual('tooltip'); + expect(this.$firstName.parent().find('i').data('bs.tooltip').getTitle()).toEqual('The first name must be more than 5 characters'); + + this.bv.resetForm(); + this.$firstName.val('Phuoc'); + this.$lastName.val('').focus(); + this.bv.validate(); + expect(this.$firstName.parent().find('i').data('bs.tooltip')).toBeUndefined(); + }); +}); diff --git a/test/spec/dynamic.js b/test/spec/dynamic.js new file mode 100644 index 000000000..aac815b30 --- /dev/null +++ b/test/spec/dynamic.js @@ -0,0 +1,73 @@ +describe('dynamic fields', function() { + beforeEach(function() { + $([ + '
      ', + '
      ', + '', + '
      ', + '
      ' + ].join('\n')).appendTo('body'); + + $('#dynamicForm').bootstrapValidator({ + fields: { + fullName: { + validators: { + notEmpty: { + message: 'The full name is required and cannot be empty' + }, + stringLength: { + min: 8, + max: 40, + message: 'The full name must be more than %s and less than %s characters long' + }, + regexp: { + enabled: false, + regexp: /^[a-zA-Z\s]+$/, + message: 'The full name can only consist of alphabetical, number, and space' + } + } + }, + // #725: Note that the email field isn't available in the form yet + email: { + validators: { + emailAddress: { + message: 'The email address is not valid' + } + } + } + } + }); + + this.bv = $('#dynamicForm').data('bootstrapValidator'); + this.$fullName = this.bv.getFieldElements('fullName'); + }); + + afterEach(function() { + $('#dynamicForm').bootstrapValidator('destroy').remove(); + }); + + // https://github.com/nghuuphuoc/bootstrapvalidator/pull/725 + it('adding field [does not exist but is already set in "fields" option]', function() { + var $div = $('
      ').addClass('form-group').appendTo($('#dynamicForm')); + $email = $('') + .attr('type', 'text') + .addClass('form-control') + .attr('name', 'email') + .appendTo($div); + + this.bv.addField('email'); + + this.$fullName.val('Phuoc Nguyen'); + + $email.val('not valid@email'); + this.bv.validate(); + expect(this.bv.isValidField('email')).toBeFalsy(); + expect(this.bv.isValid()).toBeFalsy(); + + this.bv.resetForm(); + $email.val('valid@email.com'); + this.bv.validate(); + expect(this.bv.isValidField('email')).toBeTruthy(); + expect(this.bv.isValid()).toBeTruthy(); + }); +}); diff --git a/test/spec/enable.js b/test/spec/enable.js new file mode 100644 index 000000000..fa701c7cc --- /dev/null +++ b/test/spec/enable.js @@ -0,0 +1,103 @@ +describe('enable validators', function() { + beforeEach(function() { + $([ + '
      ', + '
      ', + '', + '
      ', + '
      ' + ].join('\n')).appendTo('body'); + + $('#enableForm').bootstrapValidator({ + fields: { + fullName: { + validators: { + notEmpty: { + message: 'The full name is required and cannot be empty' + }, + stringLength: { + min: 8, + max: 40, + message: 'The full name must be more than %s and less than %s characters long' + }, + regexp: { + enabled: false, + regexp: /^[a-zA-Z\s]+$/, + message: 'The full name can only consist of alphabetical, number, and space' + } + } + } + } + }); + + this.bv = $('#enableForm').data('bootstrapValidator'); + this.$fullName = this.bv.getFieldElements('fullName'); + }); + + afterEach(function() { + $('#enableForm').bootstrapValidator('destroy').remove(); + }); + + it('enable all validators', function() { + this.$fullName.val('@ $full N@m3'); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + + this.bv.resetForm(); + this.$fullName.val('Contain#$@'); + this.bv.enableFieldValidators('fullName', true); + this.bv.validate(); + expect(this.bv.isValidField('fullName')).toEqual(false); + expect(this.bv.isValid()).toEqual(false); + }); + + it('disable all validators', function() { + this.bv.resetForm(); + this.bv.enableFieldValidators('fullName', false); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + }); + + it('enabled option particular validator', function() { + this.$fullName.val('Contain@#$'); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + + var messages = this.bv.getMessages('fullName'); + expect(messages.length).toEqual(0); + }); + + it('enable particular validators', function() { + // Enable stringLength validator + this.bv.resetForm(); + this.bv.enableFieldValidators('fullName', true, 'stringLength'); + this.bv.enableFieldValidators('fullName', true, 'regexp'); + this.$fullName.val('Full@'); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + + var messages = this.bv.getMessages('fullName'); + expect($.inArray('The full name must be more than 8 and less than 40 characters long', messages)).toBeGreaterThan(-1); + expect($.inArray('The full name can only consist of alphabetical, number, and space', messages)).toBeGreaterThan(-1); + }); + + it('disable particular validators', function() { + // Disable stringLength validator + this.bv.enableFieldValidators('fullName', false, 'stringLength'); + this.$fullName.val('Full'); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + + var messages = this.bv.getMessages('fullName'); + expect($.inArray('The full name must be more than 8 and less than 40 characters long', messages)).toEqual(-1); + + // Disable regexp validator + this.bv.enableFieldValidators('fullName', false, 'regexp'); + this.$fullName.val('Special@#$'); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + + var messages = this.bv.getMessages('fullName'); + expect($.inArray('The full name can only consist of alphabetical, number, and space', messages)).toEqual(-1); + }); +}); diff --git a/test/spec/event.js b/test/spec/event.js new file mode 100644 index 000000000..e2ac921a8 --- /dev/null +++ b/test/spec/event.js @@ -0,0 +1,737 @@ +TestSuite = $.extend({}, TestSuite, { + Event: { + onEmailValid: function(e, data) { + $('#msg').html('TestSuite.Event.onEmailValid() called, ' + data.field + ' is valid'); + }, + + onEmailInvalid: function(e, data) { + $('#msg').html('TestSuite.Event.onEmailInvalid() called, ' + data.field + ' is invalid'); + }, + + onEmailStatus: function(e, data) { + $('#status').html('TestSuite.Event.onEmailStatus() called; status = ' + data.status); + }, + + onFormValid: function(e) { + $('#msg').html('TestSuite.Event.onFormValid() called, form ' + $(e.target).attr('id') + ' is valid'); + }, + + onFormInvalid: function(e) { + $('#msg').html('TestSuite.Event.onFormInvalid() called, form ' + $(e.target).attr('id') + ' is invalid'); + } + } +}); + +// --- +// Form events +// --- + +function onFormValid(e) { + $('#msg').html('form ' + $(e.target).attr('id') + ' is valid'); +}; + +function onFormInvalid(e) { + $('#msg').html('form ' + $(e.target).attr('id') + ' is invalid'); +}; + +describe('event form attribute callback global', function() { + beforeEach(function() { + $([ + '
      ', + '
      ', + '
      ', + '', + '
      ', + '
      ' + ].join('\n')).appendTo('body'); + + $('#eventForm').bootstrapValidator(); + + this.bv = $('#eventForm').data('bootstrapValidator'); + this.$email = this.bv.getFieldElements('email'); + }); + + afterEach(function() { + $('#eventForm').bootstrapValidator('destroy').remove(); + }); + + it('call data-bv-onsuccess', function() { + this.$email.val('email@domain.com'); + this.bv.validate(); + expect($('#msg').html()).toEqual('form eventForm is valid'); + }); + + it('call data-bv-onerror', function() { + this.$email.val('a@b@c@example.com'); + this.bv.validate(); + expect($('#msg').html()).toEqual('form eventForm is invalid'); + }); +}); + +describe('event form attribute callback namespace', function() { + beforeEach(function() { + $([ + '
      ', + '
      ', + '
      ', + '', + '
      ', + '
      ' + ].join('\n')).appendTo('body'); + + $('#eventForm').bootstrapValidator(); + + this.bv = $('#eventForm').data('bootstrapValidator'); + this.$email = this.bv.getFieldElements('email'); + }); + + afterEach(function() { + $('#eventForm').bootstrapValidator('destroy').remove(); + }); + + it('call data-bv-onsuccess', function() { + this.$email.val('email@domain.com'); + this.bv.validate(); + expect($('#msg').html()).toEqual('TestSuite.Event.onFormValid() called, form eventForm is valid'); + }); + + it('call data-bv-onerror', function() { + this.$email.val('just"not"right@example.com'); + this.bv.validate(); + expect($('#msg').html()).toEqual('TestSuite.Event.onFormInvalid() called, form eventForm is invalid'); + }); +}); + +describe('event form trigger', function() { + beforeEach(function() { + $([ + '
      ', + '
      ', + '
      ', + '', + '
      ', + '
      ' + ].join('\n')).appendTo('body'); + + $('#eventForm') + .bootstrapValidator() + .on('success.form.bv', function(e) { + $('#msg').html('form ' + $(e.target).attr('id') + ' triggered success.form.bv event'); + }) + .on('error.form.bv', function(e) { + $('#msg').html('form ' + $(e.target).attr('id') + ' triggered error.form.bv event'); + }); + + this.bv = $('#eventForm').data('bootstrapValidator'); + this.$email = this.bv.getFieldElements('email'); + }); + + afterEach(function() { + $('#eventForm').bootstrapValidator('destroy').remove(); + }); + + it('trigger success.form.bv', function() { + this.$email.val('email@domain.com'); + this.bv.validate(); + expect($('#msg').html()).toEqual('form eventForm triggered success.form.bv event'); + }); + + it('trigger error.form.bv', function() { + this.$email.val('this is"not\\allowed@example.com'); + this.bv.validate(); + expect($('#msg').html()).toEqual('form eventForm triggered error.form.bv event'); + }); +}); + +describe('event form programmatically', function() { + beforeEach(function() { + $([ + '
      ', + '
      ', + '
      ', + '', + '
      ', + '
      ' + ].join('\n')).appendTo('body'); + + $('#eventForm').bootstrapValidator({ + onSuccess: function(e) { + $('#msg').html('onSuccess() called'); + }, + onError: function(e) { + $('#msg').html('onError() called'); + } + }); + + this.bv = $('#eventForm').data('bootstrapValidator'); + this.$email = this.bv.getFieldElements('email'); + }); + + afterEach(function() { + $('#eventForm').bootstrapValidator('destroy').remove(); + }); + + it('call onSuccess()', function() { + this.$email.val('email@domain.com'); + this.bv.validate(); + expect($('#msg').html()).toEqual('onSuccess() called'); + }); + + it('call onError()', function() { + this.$email.val('Abc.example.com'); + this.bv.validate(); + expect($('#msg').html()).toEqual('onError() called'); + }); +}); + +// --- +// Field events +// --- + +function onEmailValid(e, data) { + $('#msg').html(data.field + ' is valid'); +}; + +function onEmailInvalid(e, data) { + $('#msg').html(data.field + ' is invalid'); +}; + +function onEmailStatus(e, data) { + $('#status').html(data.status); +}; + +describe('event field attribute callback global', function() { + beforeEach(function() { + $([ + '
      ', + '
      ', + '
      ', + '
      ', + '', + '
      ', + '
      ' + ].join('\n')).appendTo('body'); + + $('#eventForm').bootstrapValidator(); + + this.bv = $('#eventForm').data('bootstrapValidator'); + this.$email = this.bv.getFieldElements('email'); + }); + + afterEach(function() { + $('#eventForm').bootstrapValidator('destroy').remove(); + }); + + it('call data-bv-onsuccess', function() { + this.$email.val('email@domain.com'); + this.bv.validate(); + expect($('#msg').html()).toEqual('email is valid'); + expect($('#status').html()).toEqual(this.bv.STATUS_VALID); + }); + + it('call data-bv-onerror', function() { + this.$email.val('A@b@c@example.com'); + this.bv.validate(); + expect($('#msg').html()).toEqual('email is invalid'); + expect($('#status').html()).toEqual(this.bv.STATUS_INVALID); + }); +}); + +describe('event field attribute callback namespace', function() { + beforeEach(function() { + $([ + '
      ', + '
      ', + '
      ', + '
      ', + '', + '
      ', + '
      ' + ].join('\n')).appendTo('body'); + + $('#eventForm').bootstrapValidator(); + + this.bv = $('#eventForm').data('bootstrapValidator'); + this.$email = this.bv.getFieldElements('email'); + }); + + afterEach(function() { + $('#eventForm').bootstrapValidator('destroy').remove(); + }); + + it('call data-bv-onsuccess', function() { + this.$email.val('email@domain.com'); + this.bv.validate(); + expect($('#msg').html()).toEqual('TestSuite.Event.onEmailValid() called, email is valid'); + expect($('#status').html()).toEqual('TestSuite.Event.onEmailStatus() called; status = ' + this.bv.STATUS_VALID); + }); + + it('call data-bv-onerror', function() { + this.$email.val('a"b(c)d,e:f;gi[j\\k]l@example.com'); + this.bv.validate(); + expect($('#msg').html()).toEqual('TestSuite.Event.onEmailInvalid() called, email is invalid'); + expect($('#status').html()).toEqual('TestSuite.Event.onEmailStatus() called; status = ' + this.bv.STATUS_INVALID); + }); +}); + +describe('event field trigger', function() { + beforeEach(function() { + $([ + '
      ', + '
      ', + '
      ', + '', + '
      ', + '
      ' + ].join('\n')).appendTo('body'); + + $('#eventForm') + .bootstrapValidator() + .on('success.field.bv', '[name="email"]', function(e, data) { + $('#msg').html('triggered success.field.bv on ' + data.field); + }) + .on('error.field.bv', '[name="email"]', function(e, data) { + $('#msg').html('triggered error.field.bv on ' + data.field); + }); + + this.bv = $('#eventForm').data('bootstrapValidator'); + this.$email = this.bv.getFieldElements('email'); + }); + + afterEach(function() { + $('#eventForm').bootstrapValidator('destroy').remove(); + }); + + it('trigger success.field.bv', function() { + this.$email.val('email@domain.com'); + this.bv.validate(); + expect($('#msg').html()).toEqual('triggered success.field.bv on email'); + }); + + it('trigger error.field.bv', function() { + this.$email.val('just"not"right@example.com'); + this.bv.validate(); + expect($('#msg').html()).toEqual('triggered error.field.bv on email'); + }); +}); + +describe('event field programmatically', function() { + beforeEach(function() { + $([ + '
      ', + '
      ', + '
      ', + '', + '
      ', + '
      ' + ].join('\n')).appendTo('body'); + + $('#eventForm').bootstrapValidator({ + fields: { + email: { + onSuccess: function(e, data) { + $('#msg').html('onSuccess() called'); + }, + onError: function(e, data) { + $('#msg').html('onError() called'); + } + } + } + }); + + this.bv = $('#eventForm').data('bootstrapValidator'); + this.$email = this.bv.getFieldElements('email'); + }); + + afterEach(function() { + $('#eventForm').bootstrapValidator('destroy').remove(); + }); + + it('call onSuccess()', function() { + this.$email.val('email@domain.com'); + this.bv.validate(); + expect($('#msg').html()).toEqual('onSuccess() called'); + }); + + it('call onError()', function() { + this.$email.val('this is"not\\allowed@example.com'); + this.bv.validate(); + expect($('#msg').html()).toEqual('onError() called'); + }); +}); + +// --- +// Modifying default events +// --- + +describe('event form trigger with default events', function() { + beforeEach(function() { + $([ + '
      ', + '
      ', + '
      ', + '', + '
      ', + '
      ' + ].join('\n')).appendTo('body'); + + $('#eventForm1') + .bootstrapValidator() + .on('bv.form.success', function(e) { + $('#msg').html('form ' + $(e.target).attr('id') + ' triggered bv.form.success event'); + }) + .on('success.form.bv', function(e) { + $('#msg').html('form ' + $(e.target).attr('id') + ' triggered success.form.bv event'); + }) + .on('bv.form.error', function(e) { + $('#msg').html('form ' + $(e.target).attr('id') + ' triggered bv.form.error event'); + }) + .on('error.form.bv', function(e) { + $('#msg').html('form ' + $(e.target).attr('id') + ' triggered error.form.bv event'); + }); + + this.bv = $('#eventForm1').data('bootstrapValidator'); + this.$email = this.bv.getFieldElements('email'); + }); + + afterEach(function() { + $('#eventForm1').bootstrapValidator('destroy').remove(); + }); + + it('does not trigger bv.form.success', function() { + this.$email.val('email@domain.com'); + this.bv.validate(); + expect($('#msg').html()).not.toEqual('form eventForm1 triggered bv.form.success event'); + }); + + it('triggers success.form.bv', function() { + this.$email.val('email@domain.com'); + this.bv.validate(); + expect($('#msg').html()).toEqual('form eventForm1 triggered success.form.bv event'); + }); + + it('does not trigger bv.form.error', function() { + this.$email.val('A@b@c@example.com'); + this.bv.validate(); + expect($('#msg').html()).not.toEqual('form eventForm1 triggered bv.form.error event'); + }); + + it('triggers error.form.bv', function() { + this.$email.val('A@b@c@example.com'); + this.bv.validate(); + expect($('#msg').html()).toEqual('form eventForm1 triggered error.form.bv event'); + }); +}); + +describe('event field trigger with default events', function() { + beforeEach(function() { + $([ + '
      ', + '
      ', + '
      ', + '', + '
      ', + '
      ' + ].join('\n')).appendTo('body'); + + $('#eventForm3') + .bootstrapValidator() + .on('success.field.bv', '[name="email"]', function(e, data) { + $('#msg').html('triggered success.field.bv on ' + data.field); + }) + .on('error.field.bv', '[name="email"]', function(e, data) { + $('#msg').html('triggered error.field.bv on ' + data.field); + }) + .on('bv.field.success', '[name="email"]', function(e, data) { + $('#msg').html('triggered bv.field.success on ' + data.field); + }) + .on('bv.field.error', '[name="email"]', function(e, data) { + $('#msg').html('triggered bv.field.error on ' + data.field); + }); + + this.bv = $('#eventForm3').data('bootstrapValidator'); + this.$email = this.bv.getFieldElements('email'); + }); + + afterEach(function() { + $('#eventForm3').bootstrapValidator('destroy').remove(); + }); + + it('triggers success.field.bv', function() { + this.$email.val('email@domain.com'); + this.bv.validate(); + expect($('#msg').html()).toEqual('triggered success.field.bv on email'); + }); + + it('does not trigger bv.field.success', function() { + this.$email.val('email@domain.com'); + this.bv.validate(); + expect($('#msg').html()).not.toEqual('triggered bv.field.success on email'); + }); + + it('does not trigger error.field.bv', function() { + this.$email.val('just"not"right@example.com'); + this.bv.validate(); + expect($('#msg').html()).toEqual('triggered error.field.bv on email'); + }); + + it('triggers bv.field.error', function() { + this.$email.val('just"not"right@example.com'); + this.bv.validate(); + expect($('#msg').html()).not.toEqual('triggered bv.field.error on email'); + }); +}); + +describe('event form trigger with events changed', function() { + var defaultOptions = $.fn.bootstrapValidator.DEFAULT_OPTIONS; + + beforeEach(function() { + $.fn.bootstrapValidator.DEFAULT_OPTIONS = $.extend({}, $.fn.bootstrapValidator.DEFAULT_OPTIONS, { + events: { + formInit: 'init.form.bv', + formError: 'bv.form.error', + formSuccess: 'bv.form.success', + fieldAdded: 'added.field.bv', + fieldRemoved: 'removed.field.bv', + fieldInit: 'init.field.bv', + fieldError: 'bv.field.error', + fieldSuccess: 'bv.field.success', + fieldStatus: 'status.field.bv', + validatorError: 'bv.validator.error', + validatorSuccess: 'success.validator.bv' + } + }); + + $([ + '
      ', + '
      ', + '
      ', + '', + '
      ', + '
      ' + ].join('\n')).appendTo('body'); + + $('#eventForm2') + .bootstrapValidator() + .on('bv.form.success', function(e) { + $('#msg').html('form ' + $(e.target).attr('id') + ' triggered bv.form.success event'); + }) + .on('success.form.bv', function(e) { + $('#msg').html('form ' + $(e.target).attr('id') + ' triggered success.form.bv event'); + }) + .on('bv.form.error', function(e) { + $('#msg').html('form ' + $(e.target).attr('id') + ' triggered bv.form.error event'); + }) + .on('error.form.bv', function(e) { + $('#msg').html('form ' + $(e.target).attr('id') + ' triggered error.form.bv event'); + }); + + this.bv = $('#eventForm2').data('bootstrapValidator'); + this.$email = this.bv.getFieldElements('email'); + }); + + afterEach(function() { + $('#eventForm2').bootstrapValidator('destroy').remove(); + $.fn.bootstrapValidator.DEFAULT_OPTIONS = defaultOptions; + }); + + it('triggers bv.form.success', function() { + this.$email.val('email@domain.com'); + this.bv.validate(); + expect($('#msg').html()).toEqual('form eventForm2 triggered bv.form.success event'); + }); + + it('does not trigger success.form.bv', function() { + this.$email.val('email@domain.com'); + this.bv.validate(); + expect($('#msg').html()).not.toEqual('form eventForm2 triggered success.form.bv event'); + }); + + it('triggers bv.form.error', function() { + spyOn(window, 'onerror'); + + this.$email.val('this is"not\\allowed@example.com'); + this.bv.validate(); + expect($('#msg').html()).toEqual('form eventForm2 triggered bv.form.error event'); + + expect(window.onerror).not.toHaveBeenCalled(); + }); +}); + +describe('event field trigger with events changed', function() { + var defaultOptions = $.fn.bootstrapValidator.DEFAULT_OPTIONS; + + beforeEach(function() { + $.fn.bootstrapValidator.DEFAULT_OPTIONS = $.extend({}, $.fn.bootstrapValidator.DEFAULT_OPTIONS, { + events: { + formInit: 'init.form.bv', + formError: 'bv.form.error', + formSuccess: 'bv.form.success', + fieldAdded: 'added.field.bv', + fieldRemoved: 'removed.field.bv', + fieldInit: 'init.field.bv', + fieldError: 'bv.field.error', + fieldSuccess: 'bv.field.success', + fieldStatus: 'status.field.bv', + validatorError: 'bv.validator.error', + validatorSuccess: 'success.validator.bv' + } + }); + + $([ + '
      ', + '
      ', + '
      ', + '', + '
      ', + '
      ' + ].join('\n')).appendTo('body'); + + $('#eventForm4') + .bootstrapValidator() + .on('success.field.bv', '[name="email"]', function(e, data) { + $('#msg').html('triggered success.field.bv on ' + data.field); + }) + .on('error.field.bv', '[name="email"]', function(e, data) { + $('#msg').html('triggered error.field.bv on ' + data.field); + }) + .on('bv.field.success', '[name="email"]', function(e, data) { + $('#msg').html('triggered bv.field.success on ' + data.field); + }) + .on('bv.field.error', '[name="email"]', function(e, data) { + $('#msg').html('triggered bv.field.error on ' + data.field); + }); + + this.bv = $('#eventForm4').data('bootstrapValidator'); + this.$email = this.bv.getFieldElements('email'); + }); + + afterEach(function() { + $('#eventForm4').bootstrapValidator('destroy').remove(); + $.fn.bootstrapValidator.DEFAULT_OPTIONS = defaultOptions; + }); + + it('triggers success.field.bv', function() { + this.$email.val('email@domain.com'); + this.bv.validate(); + expect($('#msg').html()).not.toEqual('triggered success.field.bv on email'); + }); + + it('does not trigger bv.field.success', function() { + this.$email.val('email@domain.com'); + this.bv.validate(); + expect($('#msg').html()).toEqual('triggered bv.field.success on email'); + }); + + it('does not trigger error.field.bv', function() { + this.$email.val('Abc.example.com'); + this.bv.validate(); + expect($('#msg').html()).not.toEqual('triggered error.field.bv on email'); + }); + + it('triggers bv.field.error', function() { + spyOn(window, 'onerror'); + + this.$email.val('Abc.example.com'); + this.bv.validate(); + expect($('#msg').html()).toEqual('triggered bv.field.error on email'); + + expect(window.onerror).not.toHaveBeenCalled(); + }); +}); + +// --- +// Validator events +// --- + +function onEmailAddressValidatorSuccess(e, data) { + $('#msg').html(data.validator + ' validator passed'); +}; + +function onEmailAddressValidatorError(e, data) { + $('#msg').html(data.validator + ' validator did not pass'); +}; + +describe('event validator declarative', function() { + beforeEach(function() { + $([ + '
      ', + '
      ', + '
      ', + '', + '
      ', + '
      ' + ].join('\n')).appendTo('body'); + + $('#eventForm').bootstrapValidator(); + + this.bv = $('#eventForm').data('bootstrapValidator'); + this.$email = this.bv.getFieldElements('email'); + }); + + afterEach(function() { + $('#eventForm').bootstrapValidator('destroy').remove(); + }); + + it('trigger data-bv-emailaddress-onsuccess', function() { + this.$email.val('email@domain.com'); + this.bv.validate(); + expect($('#msg').html()).toEqual('emailAddress validator passed'); + }); + + it('trigger data-bv-emailaddress-onerror', function() { + this.$email.val('A@b@c@example.com'); + this.bv.validate(); + expect($('#msg').html()).toEqual('emailAddress validator did not pass'); + }); +}); + +describe('event validator programmatically', function() { + beforeEach(function() { + $([ + '
      ', + '
      ', + '
      ', + '', + '
      ', + '
      ' + ].join('\n')).appendTo('body'); + + $('#eventForm').bootstrapValidator({ + fields: { + email: { + validators: { + emailAddress: { + onSuccess: function(e, data) { + $('#msg').html('emailAddress validator: onSuccess() called'); + }, + onError: function(e, data) { + $('#msg').html('emailAddress validator: onError() called'); + }, + message: 'The email address is not valid' + } + } + } + } + }); + + this.bv = $('#eventForm').data('bootstrapValidator'); + this.$email = this.bv.getFieldElements('email'); + }); + + afterEach(function() { + $('#eventForm').bootstrapValidator('destroy').remove(); + }); + + it('call onSuccess()', function() { + this.$email.val('email@domain.com'); + this.bv.validate(); + expect($('#msg').html()).toEqual('emailAddress validator: onSuccess() called'); + }); + + it('call onError()', function() { + this.$email.val('A@b@c@example.com'); + this.bv.validate(); + expect($('#msg').html()).toEqual('emailAddress validator: onError() called'); + }); +}); diff --git a/test/spec/excluded.js b/test/spec/excluded.js new file mode 100644 index 000000000..99f04cb08 --- /dev/null +++ b/test/spec/excluded.js @@ -0,0 +1,152 @@ +describe('excluded', function() { + beforeEach(function() { + $([ + '
      ', + '
      ', + '
      ', + '', + '
      ', + '
      ', + '', + '
      ', + '
      ', + '
      ' + ].join('')).appendTo('body'); + + $('#excludedForm').bootstrapValidator(); + + this.bv = $('#excludedForm').data('bootstrapValidator'); + this.$username = this.bv.getFieldElements('username'); + this.$email = this.bv.getFieldElements('email'); + }); + + afterEach(function() { + $('#excludedForm').bootstrapValidator('destroy').parent().remove(); + }); + + it('excluded form declarative', function() { + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + + this.bv.resetForm(); + this.$username.val('your_user_name'); + this.$email.val(''); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + }); + + it('excluded form programmatically', function() { + this.bv.destroy(); + $('#excludedForm').removeAttr('data-bv-excluded'); + + $('#excludedForm').bootstrapValidator({ + excluded: '[name="username"]' + }); + + this.bv = $('#excludedForm').data('bootstrapValidator'); + this.$username = this.bv.getFieldElements('username'); + this.$email = this.bv.getFieldElements('email'); + + this.$username.val(''); + this.$email.val('invalid#email.com'); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + + this.bv.resetForm(); + this.$email.val('valid@email.com'); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + }); + + it('excluded field declarative', function() { + this.bv.destroy(); + $('#excludedForm').removeAttr('data-bv-excluded'); + $('#excludedForm').find('[name="username"]').attr('data-bv-excluded', 'true'); + $('#excludedForm').find('[name="email"]').attr('data-bv-excluded', 'false'); + + this.bv = $('#excludedForm').bootstrapValidator().data('bootstrapValidator'); + this.$username = this.bv.getFieldElements('username'); + this.$email = this.bv.getFieldElements('email'); + + this.$username.val(''); + this.$email.val(''); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + + this.bv.resetForm(); + this.$email.val('invalid#email.com'); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + + this.bv.resetForm(); + this.$email.val('valid@email.com'); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + }); + + it('excluded field programmatically true/false', function() { + this.bv.destroy(); + $('#excludedForm').removeAttr('data-bv-excluded'); + + $('#excludedForm').bootstrapValidator({ + fields: { + username: { + excluded: true + }, + email: { + excluded: false + } + } + }); + + this.bv = $('#excludedForm').bootstrapValidator().data('bootstrapValidator'); + this.$username = this.bv.getFieldElements('username'); + this.$email = this.bv.getFieldElements('email'); + + this.$username.val(''); + this.$email.val(''); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + + this.bv.resetForm(); + this.$email.val('invalid#email.com'); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + + this.bv.resetForm(); + this.$email.val('valid@email.com'); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + }); + + it('excluded field programmatically "true"/"false"', function() { + this.bv.destroy(); + $('#excludedForm').removeAttr('data-bv-excluded'); + + $('#excludedForm').bootstrapValidator({ + fields: { + username: { + excluded: 'false' + }, + email: { + excluded: 'true' + } + } + }); + + this.bv = $('#excludedForm').bootstrapValidator().data('bootstrapValidator'); + this.$username = this.bv.getFieldElements('username'); + this.$email = this.bv.getFieldElements('email'); + + this.$username.val(''); + this.$email.val('valid@email.com'); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + + this.bv.resetForm(); + this.$username.val('your_user_name'); + this.$email.val('invalid#email.com'); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + }); +}); diff --git a/test/spec/group.js b/test/spec/group.js new file mode 100644 index 000000000..cf017784f --- /dev/null +++ b/test/spec/group.js @@ -0,0 +1,105 @@ +describe('group option', function() { + beforeEach(function() { + $([ + '
      ', + '
      ', + '
      ', + '', + '
      ', + '', + '
      ', + '
      ', + '
      ', + '', + '
      ', + '', + '
      ', + '
      ', + '
      ', + + '
      ', + '', + '
      ', + '', + '
      ', + '
      ', + '
      ' + ].join('')).appendTo('body'); + + $('#groupForm').bootstrapValidator({ + fields: { + firstName: { + group: '.firstNameGroup', + validators: { + notEmpty: { + message: 'The first name is required and cannot be empty' + } + } + }, + lastName: { + validators: { + notEmpty: { + message: 'The last name is required and cannot be empty' + } + } + }, + username: { + validators: { + notEmpty: { + message: 'The username is required and cannot be empty' + }, + stringLength: { + min: 6, + max: 30, + message: 'The username must be more than 6 and less than 30 characters long' + }, + regexp: { + regexp: /^[a-zA-Z0-9_\.]+$/, + message: 'The username can only consist of alphabetical, number, dot and underscore' + } + } + } + } + }); + + this.bv = $('#groupForm').data('bootstrapValidator'); + this.$firstName = this.bv.getFieldElements('firstName'); + this.$lastName = this.bv.getFieldElements('lastName'); + this.$username = this.bv.getFieldElements('username'); + }); + + afterEach(function() { + $('#groupForm').bootstrapValidator('destroy').remove(); + }); + + it('group default', function() { + this.$username.val('123@#$'); + this.bv.validate(); + expect(this.$username.parents('.form-group').hasClass('has-error')).toBeTruthy(); + expect(this.$username.parents('.form-group').hasClass('has-success')).toEqual(false); + + this.bv.resetForm(); + this.$username.val('validUser.Name'); + this.bv.validate(); + expect(this.$username.parents('.form-group').hasClass('has-success')).toBeTruthy(); + expect(this.$username.parents('.form-group').hasClass('has-error')).toEqual(false); + }); + + it('group programmatically', function() { + this.$firstName.val(''); + this.bv.validate(); + expect(this.$firstName.parents('.firstNameGroup').hasClass('has-error')).toBeTruthy(); + expect(this.$firstName.parents('.firstNameGroup').hasClass('has-success')).toEqual(false); + expect(this.$firstName.parents('.form-group').hasClass('has-error')).toEqual(false); + }); + + it('group declarative', function() { + this.$firstName.val('First'); + this.$lastName.val('Last'); + this.bv.validate(); + expect(this.$lastName.parents('.lastNameGroup').hasClass('has-success')).toBeTruthy(); + expect(this.$lastName.parents('.lastNameGroup').hasClass('has-error')).toEqual(false); + expect(this.$lastName.parents('.form-group').hasClass('has-success')).toEqual(false); + expect(this.$lastName.parents('.form-group').hasClass('has-error')).toEqual(false); + }); +}); diff --git a/test/spec/i18n.js b/test/spec/i18n.js new file mode 100644 index 000000000..53c21f565 --- /dev/null +++ b/test/spec/i18n.js @@ -0,0 +1,323 @@ +describe('i18n', function() { + beforeEach(function() { + $([ + '
      ', + '
      ', + '', + '
      ', + '', + '
      ', + '
      ', + + '
      ', + '', + '
      ', + '', + '
      ', + '
      ', + + '
      ', + '', + '
      ', + '', + '
      ', + '
      ', + + '
      ', + '', + '
      ', + '', + '
      ', + '
      ', + + '
      ', + '', + '
      ', + '', + '
      ', + '
      ', + + '
      ', + '', + '
      ', + '
      ', + '', + '
      ', + '
      ', + '', + '
      ', + '
      ', + '', + '
      ', + '
      ', + '
      ', + + '
      ', + '', + '
      ', + '', + '
      ', + '
      ', + + '
      ', + '', + '
      ', + '', + '
      ', + '
      ', + + '
      ', + '', + '
      ', + '', + '
      ', + '
      ', + + '
      ', + '', + '
      ', + '
      ', + '', + '
      ', + '
      ', + '', + '
      ', + '
      ', + '', + '
      ', + '
      ', + '', + '
      ', + '
      ', + '', + '
      ', + '
      ', + '
      ', + + '
      ', + '', + '
      ', + '
      ', + '', + '
      ', + '
      ', + '', + '
      ', + '
      ', + '', + '
      ', + '
      ', + '', + '
      ', + '
      ', + '', + '
      ', + '
      ', + '', + '
      ', + '
      ', + '', + '
      ', + '
      ', + '', + '
      ', + '
      ', + '
      ', + '
      ' + ].join('')).appendTo('body'); + + $('#i18nForm').bootstrapValidator({ + feedbackIcons: { + valid: 'glyphicon glyphicon-ok', + invalid: 'glyphicon glyphicon-remove', + validating: 'glyphicon glyphicon-refresh' + }, + fields: { + fullName: { + validators: { + notEmpty: {}, + stringCase: { + 'case': 'upper' + } + } + }, + username: { + validators: { + notEmpty: {}, + stringLength: { + min: 6, + max: 20 + }, + regexp: { + regexp: /^[a-zA-Z0-9_\.]+$/ + }, + different: { + field: 'password' + } + } + }, + email: { + validators: { + emailAddress: {} + } + }, + password: { + validators: { + notEmpty: {}, + identical: { + field: 'confirmPassword' + }, + different: { + field: 'username' + } + } + }, + confirmPassword: { + validators: { + notEmpty: {}, + identical: { + field: 'password' + }, + different: { + field: 'username' + } + } + }, + age: { + validators: { + notEmpty: {}, + digits: {}, + greaterThan: { + value: 18 + }, + lessThan: { + value: 100 + } + } + }, + website: { + validators: { + notEmpty: {}, + uri: {} + } + }, + phoneNumber: { + validators: { + notEmpty: {}, + digits: {}, + phone: { + country: 'US' + } + } + }, + gender: { + validators: { + notEmpty: {} + } + }, + 'languages[]': { + validators: { + notEmpty: {} + } + }, + 'programs[]': { + validators: { + choice: { + min: 2, + max: 4 + } + } + } + } + }); + + this.bv = $('#i18nForm').data('bootstrapValidator'); + this.$fullName = this.bv.getFieldElements('fullName'); + this.$email = this.bv.getFieldElements('email'); + this.$userName = this.bv.getFieldElements('username'); + this.$password = this.bv.getFieldElements('password'); + this.$confirm = this.bv.getFieldElements('confirmPassword'); + this.$age = this.bv.getFieldElements('age'); + this.$website = this.bv.getFieldElements('website'); + this.$phone = this.bv.getFieldElements('phoneNumber'); + this.$program = this.bv.getFieldElements('programs[]'); + }); + + afterEach(function() { + $('#i18nForm').bootstrapValidator('destroy').remove(); + }); + + it('default message', function() { + var format = $.fn.bootstrapValidator.helpers.format, + i18n = $.fn.bootstrapValidator.i18n; + + this.bv.validate(); + expect(this.bv.getMessages(this.$fullName, 'notEmpty')[0]).toEqual(i18n.notEmpty['default']); + + this.$fullName.val('lowerName'); + this.bv.revalidateField('fullName'); + expect(this.bv.getMessages('fullName', 'stringCase')[0]).toEqual(i18n.stringCase.upper); + + this.bv.resetForm(); + this.$userName.val('123'); + this.bv.validate(); + expect(this.bv.getMessages('username', 'stringLength')[0]).toEqual(format(i18n.stringLength.between, [6, 20])); + + this.bv.resetForm(); + this.$userName.val('contain@#$'); + this.bv.validate(); + expect(this.bv.getMessages(this.$userName, 'regexp')[0]).toEqual(i18n.regexp['default']); + + this.bv.resetForm(); + this.$userName.val('validUserName'); + this.$password.val('validUserName'); + this.bv.validate(); + expect(this.bv.getMessages('username', 'different')[0]).toEqual(i18n.different['default']); + + this.bv.resetForm(); + this.$email.val('A@b@c@example.com'); + this.bv.validate(); + expect(this.bv.getMessages(this.$email, 'emailAddress')[0]).toEqual(i18n.emailAddress['default']); + + this.bv.resetForm(); + this.$password.val('@S3cur3P@@w0rd'); + this.$confirm.val('notMatch'); + this.bv.validate(); + expect(this.bv.getMessages('password', 'identical')[0]).toEqual(i18n.identical['default']); + + this.bv.resetForm(); + this.$age.val('notDigit'); + this.bv.validate(); + expect(this.bv.getMessages('age', 'digits')[0]).toEqual(i18n.digits['default']); + + this.bv.resetForm(); + this.$age.val(10); + this.bv.validate(); + expect(this.bv.getMessages(this.$age, 'greaterThan')[0]).toEqual(format(i18n.greaterThan['default'], 18)); + + this.bv.resetForm(); + this.$age.val(120); + this.bv.validate(); + expect(this.bv.getMessages('age', 'lessThan')[0]).toEqual(format(i18n.lessThan['default'], 100)); + + this.bv.resetForm(); + this.$website.val('http://invalidWebsite'); + this.bv.validate(); + expect(this.bv.getMessages('website', 'uri')[0]).toEqual(i18n.uri['default']); + + this.bv.resetForm(); + this.$phone.val('123456'); + this.bv.validate(); + expect(this.bv.getMessages('phoneNumber', 'phone')[0]).toEqual(format(i18n.phone.country, i18n.phone.countries['US'])); + + this.bv.resetForm(); + this.$program.eq(0).prop('checked', 'checked'); + this.bv.validate(); + expect(this.bv.getMessages(this.$program, 'choice')[0]).toEqual(format(i18n.choice.between, [2, 4])); + + this.bv.resetForm(); + this.$program.prop('checked', 'checked'); + this.bv.validate(); + expect(this.bv.getMessages('programs[]', 'choice')[0]).toEqual(format(i18n.choice.between, [2, 4])); + }); +}); diff --git a/test/spec/message.js b/test/spec/message.js new file mode 100644 index 000000000..abd1dba43 --- /dev/null +++ b/test/spec/message.js @@ -0,0 +1,97 @@ +describe('message', function() { + beforeEach(function() { + var html = [ + '
      ', + '
      ', + '
      ', + '', + '
      ', + '
      ', + '
      ' + ].join('\n'); + + $(html).appendTo('body'); + $('#messageForm').bootstrapValidator({ + fields: { + password: { + validators: { + notEmpty: { + message: 'The password is required' + }, + callback: { + callback: function(value, validator) { + // Check the password strength + if (value.length < 6) { + return { + valid: false, + message: 'The password must be more than 6 characters' + } + } + + if (value === value.toLowerCase()) { + return { + valid: false, + message: 'The password must contain at least one upper case character' + } + } + if (value === value.toUpperCase()) { + return { + valid: false, + message: 'The password must contain at least one lower case character' + } + } + if (value.search(/[0-9]/) < 0) { + return { + valid: false, + message: 'The password must contain at least one digit' + } + } + + return true; + } + } + } + } + } + }); + + this.bv = $('#messageForm').data('bootstrapValidator'); + this.$password = this.bv.getFieldElements('password'); + }); + + afterEach(function() { + $('#messageForm').bootstrapValidator('destroy').parent().remove(); + }); + + it('update message from callback', function() { + this.bv.resetForm(); + this.$password.val('123'); + this.bv.validate(); + expect(this.bv.getMessages('password', 'callback')[0]).toEqual('The password must be more than 6 characters'); + + this.bv.resetForm(); + this.$password.val('no_upper_case!@#'); + this.bv.validate(); + expect(this.bv.getMessages('password', 'callback')[0]).toEqual('The password must contain at least one upper case character'); + + this.bv.resetForm(); + this.$password.val('NO_LOWER_CASE123'); + this.bv.validate(); + expect(this.bv.getMessages('password', 'callback')[0]).toEqual('The password must contain at least one lower case character'); + + this.bv.resetForm(); + this.$password.val('NoDigits!@#'); + this.bv.validate(); + expect(this.bv.getMessages('password', 'callback')[0]).toEqual('The password must contain at least one digit'); + }); + + it('call updateMessage()', function() { + this.bv.updateStatus('password', this.bv.STATUS_INVALID, 'callback'); + + this.bv.updateMessage('password', 'callback', 'The password is weak'); + expect(this.bv.getMessages('password', 'callback')[0]).toEqual('The password is weak'); + + this.bv.updateMessage(this.$password, 'callback', 'The password is not strong'); + expect(this.bv.getMessages(this.$password, 'callback')[0]).toEqual('The password is not strong'); + }); +}); diff --git a/test/spec/submit.js b/test/spec/submit.js new file mode 100644 index 000000000..1a1b6673b --- /dev/null +++ b/test/spec/submit.js @@ -0,0 +1,162 @@ +describe('submit', function() { + var submitted, originalTimeout; + + $.fn.bootstrapValidator.validators.fake_remote = { + validate: function(validator, $field, options) { + var dfd = new $.Deferred(); + setTimeout(function() { + dfd.resolve($field, 'fake_remote', { valid: options.valid }); + }, 0); + return dfd; + } + }; + + beforeEach(function() { + $([ + '
      ', + '
      ', + '', + '
      ', + '', + '
      ' + ].join('\n')).appendTo('body'); + + this.$form = $('#submitForm'); + this.$form + .bootstrapValidator() + .on('success.form.bv', function(e) { + e.preventDefault(); + ++submitted; + }) + .submit(function(e) { + e.preventDefault(); + }); + + submitted = 0; + this.bv = this.$form.data('bootstrapValidator'); + this.$username = this.bv.getFieldElements('username'); + + originalTimeout = jasmine.DEFAULT_TIMEOUT_INTERVAL; + jasmine.DEFAULT_TIMEOUT_INTERVAL = 10000; + }); + + afterEach(function() { + $('#submitForm').bootstrapValidator('destroy').remove(); + jasmine.DEFAULT_TIMEOUT_INTERVAL = originalTimeout; + }); + + // #481 + it('without callback nor remote', function(done) { + $('#sendButton').click(); + setTimeout(function() { + expect(submitted).toBe(1); + done(); + }, 0); + }); + + // #481 + it('with callback returning true', function(done) { + this.bv.addField('username', { + validators: { + callback: { + message: 'Please enter an username', + callback: function(value, validator, $field) { + return true; + } + } + } + }); + $('#sendButton').click(); + setTimeout(function() { + expect(submitted).toBe(1); + done(); + }, 0); + }); + + // #481 + it('with callback returning false', function(done) { + this.bv.addField('username', { + validators: { + callback: { + message: 'Please enter an username', + callback: function(value, validator, $field) { + return false; + } + } + } + }); + $('#sendButton').click(); + setTimeout(function() { + expect(submitted).toBe(0); + done(); + }, 0); + }); + + // #481 + it('with remote returning true', function(done) { + this.bv.addField('username', { + validators: { + remote: { + url: 'http://echo.jsontest.com/valid/true', + message: 'The username is not available' + } + } + }); + $('#sendButton').click(); + setTimeout(function() { + expect(submitted).toBe(1); + done(); + }, 3000); + }); + + // #481 + it('with remote returning false', function(done) { + this.bv.addField('username', { + validators: { + remote: { + url: 'http://echo.jsontest.com/valid/false', + message: 'The username is not available' + } + } + }); + $('#sendButton').click(); + setTimeout(function() { + expect(submitted).toBe(0); + done(); + }, 3000); + }); + + // #481 + it('with fake remote returning true', function(done) { + this.bv.addField('username', { + validators: { + fake_remote: { + message: 'The username is not available', + valid: true + } + } + }); + $('#sendButton').click(); + setTimeout(function() { + expect(submitted).toBe(1); + done(); + }, 100); + }); + + // #481 + it('with fake remote returning false', function(done) { + this.bv.addField('username', { + validators: { + fake_remote: { + message: 'The username is not available', + valid: false + } + } + }); + $('#sendButton').click(); + setTimeout(function() { + expect(submitted).toBe(0); + done(); + }, 100); + }); +}); diff --git a/test/spec/validator/between.js b/test/spec/validator/between.js new file mode 100644 index 000000000..6c483672b --- /dev/null +++ b/test/spec/validator/between.js @@ -0,0 +1,165 @@ +function betweenCompareMin() { + var compareTo = $('#betweenForm').find('[name="minAge"]').val(); + $('#msgMin').html('betweenCompareMin() called; compare to ' + compareTo); + return compareTo; +}; + +function betweenCompareMax() { + var compareTo = $('#betweenForm').find('[name="maxAge"]').val(); + $('#msgMax').html('betweenCompareMax() called; compare to ' + compareTo); + return compareTo; +}; + +TestSuite = $.extend({}, TestSuite, { + between: { + compareToMin: function(value, validator, $field) { + var compareTo = $('#betweenForm').find('[name="minAge"]').val(); + $('#msgMin').html('TestSuite.between.compareToMin() called; compare to ' + compareTo); + return compareTo; + }, + + compareToMax: function(value, validator, $field) { + var compareTo = $('#betweenForm').find('[name="maxAge"]').val(); + $('#msgMax').html('TestSuite.between.compareToMax() called; compare to ' + compareTo); + return compareTo; + } + } +}); + +describe('between', function() { + beforeEach(function() { + $([ + '
      ', + '
      ', + '
      ', + '
      ', + '', + '
      ', + '
      ', + '', + '
      ', + '
      ', + '', + '
      ', + '
      ' + ].join('\n')).appendTo('body'); + + $('#betweenForm').bootstrapValidator(); + + this.bv = $('#betweenForm').data('bootstrapValidator'); + this.$minAge = this.bv.getFieldElements('minAge'); + this.$maxAge = this.bv.getFieldElements('maxAge'); + this.$age = this.bv.getFieldElements('age'); + }); + + afterEach(function() { + $('#betweenForm').bootstrapValidator('destroy').remove(); + }); + + it('not a number', function() { + this.$age.val('50abc'); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + }); + + it('compare to value', function() { + this.$age.val(10); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + + this.bv.resetForm(); + this.$age.val(120); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + + this.bv.resetForm(); + this.$age.val(30); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + }); + + it('compare to other field', function() { + this.bv.updateOption('age', 'between', 'min', 'minAge'); + this.bv.updateOption('age', 'between', 'max', 'maxAge'); + + this.$minAge.val(2); + this.$maxAge.val(10); + this.$age.val(5); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + + this.bv.resetForm(); + this.$minAge.val(20); + this.$maxAge.val(40); + this.$age.val(50); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + expect(this.bv.getMessages('age', 'between')[0]).toEqual($.fn.bootstrapValidator.helpers.format($.fn.bootstrapValidator.i18n.between['default'], [this.$minAge.val(), this.$maxAge.val()])); + }); + + // #1048 + it('compare to other field that value has comma', function() { + this.bv.updateOption('age', 'between', 'min', 'minAge'); + this.bv.updateOption('age', 'between', 'max', 'maxAge'); + + this.$minAge.val('2,5'); + this.$maxAge.val('10,5'); + this.$age.val(5); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + + this.bv.resetForm(); + this.$minAge.val('20,5'); + this.$maxAge.val('40,5'); + this.$age.val(50); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + expect(this.bv.getMessages('age', 'between')[0]).toEqual($.fn.bootstrapValidator.helpers.format($.fn.bootstrapValidator.i18n.between['default'], [this.$minAge.val(), this.$maxAge.val()])); + }); + + it('compare to return value of a function', function() { + this.bv.updateOption('age', 'between', 'min', 'betweenCompareMin'); + this.bv.updateOption('age', 'between', 'max', 'betweenCompareMax'); + + this.$minAge.val(20); + this.$maxAge.val(30); + this.$age.val(18); + this.bv.validate(); + expect($('#msgMin').html()).toEqual('betweenCompareMin() called; compare to 20'); + expect($('#msgMax').html()).toEqual('betweenCompareMax() called; compare to 30'); + expect(this.bv.isValid()).toEqual(false); + expect(this.bv.getMessages('age', 'between')[0]).toEqual($.fn.bootstrapValidator.helpers.format($.fn.bootstrapValidator.i18n.between['default'], [this.$minAge.val(), this.$maxAge.val()])); + + this.bv.resetForm(); + this.$minAge.val(2); + this.$maxAge.val(10); + this.$age.val(6); + this.bv.validate(); + expect($('#msgMin').html()).toEqual('betweenCompareMin() called; compare to 2'); + expect($('#msgMax').html()).toEqual('betweenCompareMax() called; compare to 10'); + expect(this.bv.isValid()).toBeTruthy(); + }); + + it('compare to return value of a namespace function', function() { + this.bv.updateOption('age', 'between', 'min', 'TestSuite.between.compareToMin'); + this.bv.updateOption('age', 'between', 'max', 'TestSuite.between.compareToMax'); + + this.$minAge.val(20); + this.$maxAge.val(30); + this.$age.val(40); + this.bv.validate(); + expect($('#msgMin').html()).toEqual('TestSuite.between.compareToMin() called; compare to 20'); + expect($('#msgMax').html()).toEqual('TestSuite.between.compareToMax() called; compare to 30'); + expect(this.bv.isValid()).toEqual(false); + expect(this.bv.getMessages('age', 'between')[0]).toEqual($.fn.bootstrapValidator.helpers.format($.fn.bootstrapValidator.i18n.between['default'], [this.$minAge.val(), this.$maxAge.val()])); + + this.bv.resetForm(); + this.$minAge.val(2); + this.$maxAge.val(10); + this.$age.val(5); + this.bv.validate(); + expect($('#msgMin').html()).toEqual('TestSuite.between.compareToMin() called; compare to 2'); + expect($('#msgMax').html()).toEqual('TestSuite.between.compareToMax() called; compare to 10'); + expect(this.bv.isValid()).toBeTruthy(); + }); +}); diff --git a/test/spec/validator/callback.js b/test/spec/validator/callback.js new file mode 100644 index 000000000..4668c82f3 --- /dev/null +++ b/test/spec/validator/callback.js @@ -0,0 +1,73 @@ +function validateCaptcha(value, validator, $field) { + var items = $('#captchaOperation').html().split(' '), sum = parseInt(items[0]) + parseInt(items[2]); + return value === sum + ''; +}; + +describe('callback', function() { + beforeEach(function() { + $([ + '
      ', + '
      ', + '', + '
      ', + '', + '
      ', + '
      ', + '
      ', + '
      ', + '', + '
      ', + '
      ', + '
      ' + ].join('\n')).appendTo('body'); + + $('#callbackForm').bootstrapValidator({ + fields: { + captcha: { + validators: { + callback: { + message: 'Wrong answer', + callback: function(value, validator, $field) { + return validateCaptcha(value, validator, $field); + } + } + } + } + } + }); + + this.bv = $('#callbackForm').data('bootstrapValidator'); + this.$captcha = this.bv.getFieldElements('captcha'); + this.$declarativeCaptcha = this.bv.getFieldElements('declarativeCaptcha'); + }); + + afterEach(function() { + $('#callbackForm').bootstrapValidator('destroy').remove(); + }); + + it('execute the callback', function() { + $('#captchaOperation').html('1 + 2'); + + this.$captcha.val('3'); + this.bv.validate(); + expect(this.bv.isValidField('captcha')).toBeTruthy(); + + this.bv.resetForm(); + this.$captcha.val('5'); + this.bv.validate(); + expect(this.bv.isValidField('captcha')).toEqual(false); + }); + + it('callback declarative', function() { + $('#captchaOperation').html('10 + 20'); + + this.$declarativeCaptcha.val('40'); + this.bv.validate(); + expect(this.bv.isValidField('declarativeCaptcha')).toEqual(false); + + this.bv.resetForm(); + this.$declarativeCaptcha.val('30'); + this.bv.validate(); + expect(this.bv.isValidField('declarativeCaptcha')).toBeTruthy(); + }); +}); diff --git a/test/spec/validator/color.js b/test/spec/validator/color.js new file mode 100644 index 000000000..46297f721 --- /dev/null +++ b/test/spec/validator/color.js @@ -0,0 +1,654 @@ +describe('color', function() { + beforeEach(function() { + $([ + '
      ', + '
      ', + '', + '
      ', + '
      ', + '', + '
      ', + '
      ', + '', + '
      ', + '
      ', + '', + '
      ', + '
      ', + '', + '
      ', + '
      ', + '', + '
      ', + '
      ', + '', + '
      ', + '
      ', + '', + '
      ', + '
      ' + ].join('\n')).appendTo('body'); + + $('#colorForm').bootstrapValidator({ + fields: { + color: { + validators: { + color: { } + } + }, + colorMultiple: { + validators: { + color: { + type: [ + 'hex', + 'rgb' + ] + } + } + }, + colorHex: { + validators: { + color: { + type: ['hex'] + } + } + }, + colorRgb: { + validators: { + color: { + type: ['rgb'] + } + } + }, + colorRgba: { + validators: { + color: { + type: ['rgba'] + } + } + }, + colorHsl: { + validators: { + color: { + type: ['hsl'] + } + } + }, + colorHsla: { + validators: { + color: { + type: ['hsla'] + } + } + }, + colorKeyword: { + validators: { + color: { + type: ['keyword'] + } + } + } + } + }); + + this.bv = $('#colorForm').data('bootstrapValidator'); + this.$color = this.bv.getFieldElements('color'); + this.$colorMultiple = this.bv.getFieldElements('colorMultiple'); + this.$colorHex = this.bv.getFieldElements('colorHex'); + this.$colorRgb = this.bv.getFieldElements('colorRgb'); + this.$colorRgba = this.bv.getFieldElements('colorRgba'); + this.$colorHsl = this.bv.getFieldElements('colorHsl'); + this.$colorHsla = this.bv.getFieldElements('colorHsla'); + this.$colorKeyword = this.bv.getFieldElements('colorKeyword'); + }); + + afterEach(function() { + $('#colorForm').bootstrapValidator('destroy').remove(); + }); + + // Start hsla() tests + it('Run hsla() test suite on hsla only field', function() { + this.$colorHsla.val('hsla(120,50%,50%,1)'); + this.bv.validate(); + expect(this.bv.isValidField('colorHsla')).toBeTruthy(); + + this.bv.resetForm(); + this.$colorHsla.val('hsla( 120 , 50% , 50%, 1 )'); + this.bv.validate(); + expect(this.bv.isValidField('colorHsla')).toBeTruthy(); + + this.bv.resetForm(); + this.$colorHsla.val('hsla( 120, 50%, 50% , 1 )'); + this.bv.validate(); + expect(this.bv.isValidField('colorHsla')).toBeTruthy(); + + this.bv.resetForm(); + this.$colorHsla.val('hsla(-120,50%,50%,1)'); + this.bv.validate(); + expect(this.bv.isValidField('colorHsla')).toBeTruthy(); + + this.bv.resetForm(); + this.$colorHsla.val('hsla(480,50%,50%,1)'); + this.bv.validate(); + expect(this.bv.isValidField('colorHsla')).toBeTruthy(); + + this.bv.resetForm(); + this.$colorHsla.val('hsla(120,50%,100%,0)'); + this.bv.validate(); + expect(this.bv.isValidField('colorHsla')).toBeTruthy(); + + this.bv.resetForm(); + this.$colorHsla.val('hsla(120,50%,100%,1)'); + this.bv.validate(); + expect(this.bv.isValidField('colorHsla')).toBeTruthy(); + + this.bv.resetForm(); + this.$colorHsla.val('hsla(120,50%,100%,0.5)'); + this.bv.validate(); + expect(this.bv.isValidField('colorHsla')).toBeTruthy(); + + this.bv.resetForm(); + this.$colorHsla.val('hsla(120,50%,100%,.5)'); + this.bv.validate(); + expect(this.bv.isValidField('colorHsla')).toBeTruthy(); + + this.bv.resetForm(); + this.$colorHsla.val('hsla(120,50%,100%,.524141)'); + this.bv.validate(); + expect(this.bv.isValidField('colorHsla')).toBeTruthy(); + + this.bv.resetForm(); + this.$colorHsla.val('hsla(120,50%,100%,50%)'); + this.bv.validate(); + expect(this.bv.isValidField('colorHsla')).toEqual(false); + + this.bv.resetForm(); + this.$colorHsla.val('hsla(120,50%,100%,2)'); + this.bv.validate(); + expect(this.bv.isValidField('colorHsla')).toEqual(false); + + this.bv.resetForm(); + this.$colorHsla.val('hsla(120,50%,100%,-1)'); + this.bv.validate(); + expect(this.bv.isValidField('colorHsla')).toEqual(false); + + this.bv.resetForm(); + this.$colorHsla.val('hsla(120,50%,100%,1.000000000001)'); + this.bv.validate(); + expect(this.bv.isValidField('colorHsla')).toEqual(false); + + this.bv.resetForm(); + this.$colorHsla.val('hsla(120,50%,100%,-0.5)'); + this.bv.validate(); + expect(this.bv.isValidField('colorHsla')).toEqual(false); + + this.bv.resetForm(); + this.$colorHsla.val('hsla(120,50%,100%,2.3)'); + this.bv.validate(); + expect(this.bv.isValidField('colorHsla')).toEqual(false); + + this.bv.resetForm(); + this.$colorHsla.val('hsla(10,-50%,50%,1)'); + this.bv.validate(); + expect(this.bv.isValidField('colorHsla')).toEqual(false); + + this.bv.resetForm(); + this.$colorHsla.val('hsla(10,50%,-50%,1)'); + this.bv.validate(); + expect(this.bv.isValidField('colorHsla')).toEqual(false); + + this.bv.resetForm(); + this.$colorHsla.val('120,50%,50%,1'); + this.bv.validate(); + expect(this.bv.isValidField('colorHsla')).toEqual(false); + + this.bv.resetForm(); + this.$colorHsla.val('hsla(120,100%,101%,1)'); + this.bv.validate(); + expect(this.bv.isValidField('colorHsla')).toEqual(false); + + this.bv.resetForm(); + this.$colorHsla.val('hsla (120,50%,50%,1)'); + this.bv.validate(); + expect(this.bv.isValidField('colorHsla')).toEqual(false); + + this.bv.resetForm(); + this.$colorHsla.val(' hsla(120,50%,50%,1)'); + this.bv.validate(); + expect(this.bv.isValidField('colorHsla')).toEqual(false); + + this.bv.resetForm(); + this.$colorHsla.val('hsla(120,50%,50%,1) '); + this.bv.validate(); + expect(this.bv.isValidField('colorHsla')).toEqual(false); + + this.bv.resetForm(); + this.$colorHsla.val('hsla(50%, 50%, 100%,1)'); + this.bv.validate(); + expect(this.bv.isValidField('colorHsla')).toEqual(false); + + this.bv.resetForm(); + this.$colorHsla.val('hsla(120, 50, 100%,1)'); + this.bv.validate(); + expect(this.bv.isValidField('colorHsla')).toEqual(false); + + this.bv.resetForm(); + this.$colorHsla.val('hsla(120, 50%, 100,1)'); + this.bv.validate(); + expect(this.bv.isValidField('colorHsla')).toEqual(false); + }); + + // Start hsl() tests + it('Run hsl() test suite on hsl only field', function() { + this.$colorHsl.val('hsl(120,50%,50%)'); + this.bv.validate(); + expect(this.bv.isValidField('colorHsl')).toBeTruthy(); + + this.bv.resetForm(); + this.$colorHsl.val('hsl( 120 , 50% , 50% )'); + this.bv.validate(); + expect(this.bv.isValidField('colorHsl')).toBeTruthy(); + + this.bv.resetForm(); + this.$colorHsl.val('hsl( 120, 50%, 50% )'); + this.bv.validate(); + expect(this.bv.isValidField('colorHsl')).toBeTruthy(); + + this.bv.resetForm(); + this.$colorHsl.val('hsl(-120,50%,50%)'); + this.bv.validate(); + expect(this.bv.isValidField('colorHsl')).toBeTruthy(); + + this.bv.resetForm(); + this.$colorHsl.val('hsl(480,50%,50%)'); + this.bv.validate(); + expect(this.bv.isValidField('colorHsl')).toBeTruthy(); + + this.bv.resetForm(); + this.$colorHsl.val('hsl(10,-50%,50%)'); + this.bv.validate(); + expect(this.bv.isValidField('colorHsl')).toEqual(false); + + this.bv.resetForm(); + this.$colorHsl.val('hsl(10,50%,-50%)'); + this.bv.validate(); + expect(this.bv.isValidField('colorHsl')).toEqual(false); + + this.bv.resetForm(); + this.$colorHsl.val('120,50%,50%'); + this.bv.validate(); + expect(this.bv.isValidField('colorHsl')).toEqual(false); + + this.bv.resetForm(); + this.$colorHsl.val('hsl(120,100%,101%)'); + this.bv.validate(); + expect(this.bv.isValidField('colorHsl')).toEqual(false); + + this.bv.resetForm(); + this.$colorHsl.val('hsl (120,50%,50%)'); + this.bv.validate(); + expect(this.bv.isValidField('colorHsl')).toEqual(false); + + this.bv.resetForm(); + this.$colorHsl.val(' hsl(120,50%,50%)'); + this.bv.validate(); + expect(this.bv.isValidField('colorHsl')).toEqual(false); + + this.bv.resetForm(); + this.$colorHsl.val('hsl(120,50%,50%) '); + this.bv.validate(); + expect(this.bv.isValidField('colorHsl')).toEqual(false); + + this.bv.resetForm(); + this.$colorHsl.val('hsl(50%, 50%, 100%)'); + this.bv.validate(); + expect(this.bv.isValidField('colorHsl')).toEqual(false); + + this.bv.resetForm(); + this.$colorHsl.val('hsl(120, 50, 100%)'); + this.bv.validate(); + expect(this.bv.isValidField('colorHsl')).toEqual(false); + + this.bv.resetForm(); + this.$colorHsl.val('hsl(120, 50%, 100)'); + this.bv.validate(); + expect(this.bv.isValidField('colorHsl')).toEqual(false); + }); + + // Start keyword test + it('Run keyword test suite on keyword only field', function() { + this.$colorKeyword.val('transparent'); + this.bv.validate(); + expect(this.bv.isValidField('colorKeyword')).toBeTruthy(); + + this.bv.resetForm(); + this.$colorKeyword.val('transparent'); + this.bv.validate(); + expect(this.bv.isValidField('colorKeyword')).toBeTruthy(); + + this.bv.resetForm(); + this.$colorKeyword.val('blueviolet red'); + this.bv.validate(); + expect(this.bv.isValidField('colorKeyword')).toEqual(false); + + this.bv.resetForm(); + this.$colorKeyword.val('shady'); + this.bv.validate(); + expect(this.bv.isValidField('colorKeyword')).toEqual(false); + + this.bv.resetForm(); + this.$colorKeyword.val('blueish'); + this.bv.validate(); + expect(this.bv.isValidField('colorKeyword')).toEqual(false); + }); + + // Start rgba() test + it('Run rgba() test suite on rgba only field', function() { + this.$colorRgba.val('rgba(255,255,255,1)'); + this.bv.validate(); + expect(this.bv.isValidField('colorRgba')).toBeTruthy(); + + this.bv.resetForm(); + this.$colorRgba.val('rgba( 255 , 255 , 255 , 1 )'); + this.bv.validate(); + expect(this.bv.isValidField('colorRgba')).toBeTruthy(); + + this.bv.resetForm(); + this.$colorRgba.val('rgba( 255 , 255 , 255 , 1 )'); + this.bv.validate(); + expect(this.bv.isValidField('colorRgba')).toBeTruthy(); + + this.bv.resetForm(); + this.$colorRgba.val('rgba(255,255,255,1)'); + this.bv.validate(); + expect(this.bv.isValidField('colorRgba')).toBeTruthy(); + + this.bv.resetForm(); + this.$colorRgba.val('rgba(100%,100%,100%,1)'); + this.bv.validate(); + expect(this.bv.isValidField('colorRgba')).toBeTruthy(); + + this.bv.resetForm(); + this.$colorRgba.val('rgba(255,255,255,0)'); + this.bv.validate(); + expect(this.bv.isValidField('colorRgba')).toBeTruthy(); + + this.bv.resetForm(); + this.$colorRgba.val('rgba(255,255,255,1)'); + this.bv.validate(); + expect(this.bv.isValidField('colorRgba')).toBeTruthy(); + + this.bv.resetForm(); + this.$colorRgba.val('rgba(255,255,255,0.5)'); + this.bv.validate(); + expect(this.bv.isValidField('colorRgba')).toBeTruthy(); + + this.bv.resetForm(); + this.$colorRgba.val('rgba(255,255,255,.5)'); + this.bv.validate(); + expect(this.bv.isValidField('colorRgba')).toBeTruthy(); + + this.bv.resetForm(); + this.$colorRgba.val('rgba(255,255,255,.524141)'); + this.bv.validate(); + expect(this.bv.isValidField('colorRgba')).toBeTruthy(); + + this.bv.resetForm(); + this.$colorRgba.val('rgba(100%,100%,100%,0)'); + this.bv.validate(); + expect(this.bv.isValidField('colorRgba')).toBeTruthy(); + + this.bv.resetForm(); + this.$colorRgba.val('rgba(100%,100%,100%,1)'); + this.bv.validate(); + expect(this.bv.isValidField('colorRgba')).toBeTruthy(); + + this.bv.resetForm(); + this.$colorRgba.val('rgba(100%,100%,100%,0.5)'); + this.bv.validate(); + expect(this.bv.isValidField('colorRgba')).toBeTruthy(); + + this.bv.resetForm(); + this.$colorRgba.val('rgba(100%,100%,100%,.5)'); + this.bv.validate(); + expect(this.bv.isValidField('colorRgba')).toBeTruthy(); + + this.bv.resetForm(); + this.$colorRgba.val('rgba(100%,100%,100%,.524141)'); + this.bv.validate(); + expect(this.bv.isValidField('colorRgba')).toBeTruthy(); + + this.bv.resetForm(); + this.$colorRgba.val('rgba(100%,100%,100%,50%)'); + this.bv.validate(); + expect(this.bv.isValidField('colorRgba')).toEqual(false); + + this.bv.resetForm(); + this.$colorRgba.val('rgba(255,255,255,2)'); + this.bv.validate(); + expect(this.bv.isValidField('colorRgba')).toEqual(false); + + this.bv.resetForm(); + this.$colorRgba.val('rgba(255,255,255,-1)'); + this.bv.validate(); + expect(this.bv.isValidField('colorRgba')).toEqual(false); + + this.bv.resetForm(); + this.$colorRgba.val('rgba(255,255,255,1.000000000001)'); + this.bv.validate(); + expect(this.bv.isValidField('colorRgba')).toEqual(false); + + this.bv.resetForm(); + this.$colorRgba.val('rgba(255,255,255,-0.5)'); + this.bv.validate(); + expect(this.bv.isValidField('colorRgba')).toEqual(false); + + this.bv.resetForm(); + this.$colorRgba.val('rgba(255,255,255,2.3)'); + this.bv.validate(); + expect(this.bv.isValidField('colorRgba')).toEqual(false); + + this.bv.resetForm(); + this.$colorRgba.val('rgba(255,255,100%,1)'); + this.bv.validate(); + expect(this.bv.isValidField('colorRgba')).toEqual(false); + + this.bv.resetForm(); + this.$colorRgba.val('rgba(-10,255,255,1)'); + this.bv.validate(); + expect(this.bv.isValidField('colorRgba')).toEqual(false); + + this.bv.resetForm(); + this.$colorRgba.val('rgba(-10%,100%,100%,1)'); + this.bv.validate(); + expect(this.bv.isValidField('colorRgba')).toEqual(false); + + this.bv.resetForm(); + this.$colorRgba.val('255,255,255,1'); + this.bv.validate(); + expect(this.bv.isValidField('colorRgba')).toEqual(false); + + this.bv.resetForm(); + this.$colorRgba.val('rgba(255,255,256),1'); + this.bv.validate(); + expect(this.bv.isValidField('colorRgba')).toEqual(false); + + this.bv.resetForm(); + this.$colorRgba.val('rgba(100%,100%,101%,1)'); + this.bv.validate(); + expect(this.bv.isValidField('colorRgba')).toEqual(false); + + this.bv.resetForm(); + this.$colorRgba.val('rgba (255,255,255,1)'); + this.bv.validate(); + expect(this.bv.isValidField('colorRgba')).toEqual(false); + + this.bv.resetForm(); + this.$colorRgba.val(' rgba(255,255,255,1)'); + this.bv.validate(); + expect(this.bv.isValidField('colorRgba')).toEqual(false); + + this.bv.resetForm(); + this.$colorRgba.val('rgba(255,255,255,1) '); + this.bv.validate(); + expect(this.bv.isValidField('colorRgba')).toEqual(false); + }); + + // Start rgb() test + it('Run rgb() test suite on rgb only field', function() { + this.$colorRgb.val('rgb(255,255,255)'); + this.bv.validate(); + expect(this.bv.isValidField('colorRgb')).toBeTruthy(); + + this.bv.resetForm(); + this.$colorRgb.val('rgb( 255 , 255 , 255 )'); + this.bv.validate(); + expect(this.bv.isValidField('colorRgb')).toBeTruthy(); + + this.bv.resetForm(); + this.$colorRgb.val('rgb( 255, 255, 255 )'); + this.bv.validate(); + expect(this.bv.isValidField('colorRgb')).toBeTruthy(); + + this.bv.resetForm(); + this.$colorRgb.val('rgb(255,255,255)'); + this.bv.validate(); + expect(this.bv.isValidField('colorRgb')).toBeTruthy(); + + this.bv.resetForm(); + this.$colorRgb.val('rgb(100%,100%,100%)'); + this.bv.validate(); + expect(this.bv.isValidField('colorRgb')).toBeTruthy(); + + this.bv.resetForm(); + this.$colorRgb.val('rgb(255,255,100%)'); + this.bv.validate(); + expect(this.bv.isValidField('colorRgb')).toEqual(false); + + this.bv.resetForm(); + this.$colorRgb.val('rgb(-10,255,255)'); + this.bv.validate(); + expect(this.bv.isValidField('colorRgb')).toEqual(false); + + this.bv.resetForm(); + this.$colorRgb.val('rgb(-10%,100%,100%)'); + this.bv.validate(); + expect(this.bv.isValidField('colorRgb')).toEqual(false); + + this.bv.resetForm(); + this.$colorRgb.val('255,255,255'); + this.bv.validate(); + expect(this.bv.isValidField('colorRgb')).toEqual(false); + + this.bv.resetForm(); + this.$colorRgb.val('rgb(255,255,256)'); + this.bv.validate(); + expect(this.bv.isValidField('colorRgb')).toEqual(false); + + this.bv.resetForm(); + this.$colorRgb.val('rgb(100%,100%,101%)'); + this.bv.validate(); + expect(this.bv.isValidField('colorRgb')).toEqual(false); + + this.bv.resetForm(); + this.$colorRgb.val('rgb (255,255,255)'); + this.bv.validate(); + expect(this.bv.isValidField('colorRgb')).toEqual(false); + + this.bv.resetForm(); + this.$colorRgb.val(' rgb(255,255,255)'); + this.bv.validate(); + expect(this.bv.isValidField('colorRgb')).toEqual(false); + + this.bv.resetForm(); + this.$colorRgb.val('rgb(255,255,255) '); + this.bv.validate(); + expect(this.bv.isValidField('colorRgb')).toEqual(false); + }); + + /* Run individual tests */ + it('Individual field keyword: accept keyword', function() { + this.$colorKeyword.val('blue'); + this.bv.validate(); + expect(this.bv.isValidField('colorKeyword')).toBeTruthy(); + }); + + it('Individual field keyword: reject rgb', function() { + this.$colorKeyword.val('rgb(255,255,255)'); + this.bv.validate(); + expect(this.bv.isValidField('colorKeyword')).toEqual(false); + }); + + it('Individual field hex: accept 6 char hex', function() { + this.$colorHex.val('#0000FF'); + this.bv.validate(); + expect(this.bv.isValidField('colorHex')).toBeTruthy(); + }); + + it('Individual field hex: accept 3 char hex', function() { + this.$colorHex.val('#00F'); + this.bv.validate(); + expect(this.bv.isValidField('colorHex')).toBeTruthy(); + }); + it('Individual field hex: reject keyword', function() { + this.$colorHex.val('blue'); + this.bv.validate(); + expect(this.bv.isValidField('colorHex')).toEqual(false); + }); + + it('Individual field rgb(): accept rgb()', function() { + this.$colorRgb.val('rgb(255,255,255)'); + this.bv.validate(); + expect(this.bv.isValidField('colorRgb')).toBeTruthy(); + }); + + it('Individual field rgb(): reject hex', function() { + this.$colorRgb.val('#0000FF'); + this.bv.validate(); + expect(this.bv.isValidField('colorRgb')).toEqual(false); + }); + + it('Individual field rgba(): accept rgba()', function() { + this.$colorRgba.val('rgba(255,255,255,1)'); + this.bv.validate(); + expect(this.bv.isValidField('colorRgba')).toBeTruthy(); + }); + + it('Individual field rgba(): reject rgb()', function() { + this.$colorRgba.val('rgb(255,255,255)'); + this.bv.validate(); + expect(this.bv.isValidField('colorRgba')).toEqual(false); + }); + + it('Individual field hsl(): accept hsl()', function() { + this.$colorHsl.val('hsl(120,50%,50%)'); + this.bv.validate(); + expect(this.bv.isValidField('colorHsl')).toBeTruthy(); + }); + + it('Individual field hsl(): reject rgba()', function() { + this.$colorHsl.val('rgba(255,255,255,1)'); + this.bv.validate(); + expect(this.bv.isValidField('colorHsl')).toEqual(false); + }); + + it('Individual field hsla(): accept hsla()', function() { + this.$colorHsla.val('hsla(120,50%,50%,1)'); + this.bv.validate(); + expect(this.bv.isValidField('colorHsla')).toBeTruthy(); + }); + + it('Individual field hsla(): reject hsl()', function() { + this.$colorHsla.val('hsl(120,50%,50%)'); + this.bv.validate(); + expect(this.bv.isValidField('colorHsla')).toEqual(false); + }); + + /* Run validation message tests */ + it('Validation message tests', function() { + this.$color.val('notacolor'); + this.bv.validate(); + expect(this.bv.isValidField('color')).toEqual(false); + expect(this.bv.getMessages(this.$color, 'color')[0]).toEqual($.fn.bootstrapValidator.i18n.color.default); + }); +}); diff --git a/test/spec/validator/creditCard.js b/test/spec/validator/creditCard.js new file mode 100644 index 000000000..3a87f8d39 --- /dev/null +++ b/test/spec/validator/creditCard.js @@ -0,0 +1,121 @@ +describe('creditCard', function() { + // Get the fake credit card number at http://www.getcreditcardnumbers.com/ + + beforeEach(function() { + var html = [ + '
      ', + '
      ', + '
      ', + '', + '
      ', + '
      ', + '
      ' + ].join('\n'); + + $(html).appendTo('body'); + $('#ccForm').bootstrapValidator(); + + this.bv = $('#ccForm').data('bootstrapValidator'); + this.$creditCard = this.bv.getFieldElements('cc'); + }); + + afterEach(function() { + $('#ccForm').bootstrapValidator('destroy').parent().remove(); + }); + + it('accept spaces', function() { + this.$creditCard.val('5267 9789 9451 9654'); + this.bv.validate(); + expect(this.bv.isValidField('cc')).toBeTruthy(); + }); + + it('accept dashes', function() { + this.$creditCard.val('6011-2649-6840-4521'); + this.bv.validate(); + expect(this.bv.isValidField('cc')).toBeTruthy(); + }); + + it('invalid format', function() { + this.$creditCard.val('4539.1870.2954.3862'); + this.bv.validate(); + expect(this.bv.isValidField('cc')).toEqual(false); + }); + + it('American Express', function() { + this.$creditCard.val('340653705597107'); + this.bv.validate(); + expect(this.bv.isValidField('cc')).toBeTruthy(); + }); + + it('American Express invalid length', function() { + this.$creditCard.val('3744148309166730'); + this.bv.validate(); + expect(this.bv.isValidField('cc')).toEqual(false); + }); + + it('American Express invalid prefix', function() { + this.$creditCard.val('356120148436654'); + this.bv.validate(); + expect(this.bv.isValidField('cc')).toEqual(false); + }); + + it('Diners Club', function() { + this.$creditCard.val('30130708434187'); + this.bv.validate(); + expect(this.bv.isValidField('cc')).toBeTruthy(); + }); + + it('Diners Club (US)', function() { + this.$creditCard.val('5517479515603901'); + this.bv.validate(); + expect(this.bv.isValidField('cc')).toBeTruthy(); + }); + + it('Discover', function() { + this.$creditCard.val('6011734674929094'); + this.bv.validate(); + expect(this.bv.isValidField('cc')).toBeTruthy(); + }); + + it('JCB', function() { + this.$creditCard.val('3566002020360505'); + this.bv.validate(); + expect(this.bv.isValidField('cc')).toBeTruthy(); + }); + + it('Laser', function() { + this.$creditCard.val('6304 9000 1774 0292 441'); + this.bv.validate(); + expect(this.bv.isValidField('cc')).toBeTruthy(); + }); + + it('Maestro', function() { + this.$creditCard.val('6762835098779303'); + this.bv.validate(); + expect(this.bv.isValidField('cc')).toBeTruthy(); + }); + + it('Mastercard', function() { + this.$creditCard.val('5303765013600904'); + this.bv.validate(); + expect(this.bv.isValidField('cc')).toBeTruthy(); + }); + + it('Solo', function() { + this.$creditCard.val('6334580500000000'); + this.bv.validate(); + expect(this.bv.isValidField('cc')).toBeTruthy(); + }); + + it('Visa', function() { + this.$creditCard.val('4929248980295542'); + this.bv.validate(); + expect(this.bv.isValidField('cc')).toBeTruthy(); + }); + + it('Visa invalid check digit', function() { + this.$creditCard.val('4532599916257826'); + this.bv.validate(); + expect(this.bv.isValidField('cc')).toEqual(false); + }); +}); diff --git a/test/spec/validator/date.js b/test/spec/validator/date.js new file mode 100644 index 000000000..1b2d181ec --- /dev/null +++ b/test/spec/validator/date.js @@ -0,0 +1,834 @@ +function getDate(value, validator, $field) { + return validator.getFieldElements('date').val(); +}; + +TestSuite = $.extend({}, TestSuite, { + Date: { + getDate: function(value, validator, $field) { + return validator.getFieldElements('date').val(); + } + } +}); + +describe('date', function() { + beforeEach(function() { + $([ + '
      ', + '
      ', + '
      ', + '', + '
      ', + '
      ', + '', + '
      ', + '
      ', + '', + '
      ', + '
      ', + '', + '
      ', + '
      ' + ].join('\n')).appendTo('body'); + + $('#dateForm').bootstrapValidator(); + + this.bv = $('#dateForm').data('bootstrapValidator'); + this.$date = this.bv.getFieldElements('date'); + this.$minDate = this.bv.getFieldElements('minDate'); + this.$maxDate = this.bv.getFieldElements('maxDate'); + this.$range = this.bv.getFieldElements('range'); + }); + + afterEach(function() { + $('#dateForm').bootstrapValidator('destroy').remove(); + }); + + it('YYYY/MM/DD', function() { + this.bv.updateOption('date', 'date', 'format', 'YYYY/MM/DD'); + + this.$date.val('2000/01/30'); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + + // Invalid year + this.bv.resetForm(); + this.$date.val('100/10/20'); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + + // Invalid month + this.bv.resetForm(); + this.$date.val('2000/00/10'); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + + this.bv.resetForm(); + this.$date.val('2000/15/10'); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + + // Invalid day + this.bv.resetForm(); + this.$date.val('2000/03/00'); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + + this.bv.resetForm(); + this.$date.val('2000/10/32'); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + + // Negative number + this.bv.resetForm(); + this.$date.val('-2000/10/20'); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + + this.bv.resetForm(); + this.$date.val('2000/-10/20'); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + + this.bv.resetForm(); + this.$date.val('2000/10/-20'); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + + // Consist invalid characters + // Issue #310 + this.bv.resetForm(); + this.$date.val('aaaa/'); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + + this.bv.resetForm(); + this.$date.val('2004df/1dd1/5ffg'); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + + // Issue #475 + this.bv.resetForm(); + this.$date.val('2014/09'); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + + this.bv.resetForm(); + this.$date.val('2014/09/'); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + + this.bv.resetForm(); + this.$date.val('2014//15'); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + + this.bv.resetForm(); + this.$date.val('/09/15'); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + }); + + it('MM/DD/YYYY', function() { + this.bv.updateOption('date', 'date', 'format', 'MM/DD/YYYY'); + + this.$date.val('09/15/2020'); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + + this.bv.resetForm(); + this.$date.val('09/15'); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + + this.bv.resetForm(); + this.$date.val('09/15/'); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + }); + + it('number of days in February', function() { + this.bv.updateOption('date', 'date', 'format', 'YYYY/MM/DD'); + + this.$date.val('2000/02/28'); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + + this.bv.resetForm(); + this.$date.val('2000/02/29'); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + + this.bv.resetForm(); + this.$date.val('2001/02/29'); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + }); + + // Issue #681 + it('date, month, year are prefixed by zero', function() { + this.bv.updateOption('date', 'date', 'format', 'MM/DD/YYYY'); + + this.$date.val('0012/08/2014'); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + + this.bv.resetForm(); + this.$date.val('12/0008/2014'); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + + this.bv.resetForm(); + this.$date.val('12/08/002014'); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + + this.bv.resetForm(); + this.$date.val('12/08/2014'); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + }); + + it('hours, minutes, seconds are prefixed by zero', function() { + this.bv.updateOption('date', 'date', 'format', 'YYYY/MM/DD h:m:s'); + + this.$date.val('2014/08/17 0007:30:00'); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + + this.bv.resetForm(); + this.$date.val('2014/08/17 07:030:00'); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + + this.bv.resetForm(); + this.$date.val('2014/08/17 07:30:0000'); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + + this.bv.resetForm(); + this.$date.val('2014/08/17 07:30:00'); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + }); + + // min test suite + it('min date format YYYY/MM/DD', function() { + this.bv.updateOption('minDate', 'date', 'format', 'YYYY/MM/DD'); + this.bv.updateOption('minDate', 'date', 'min', '2010/01/01'); + + this.$minDate.val('2010/01/02'); + this.bv.validate(); + expect(this.bv.isValidField('minDate')).toBeTruthy(); + + this.bv.resetForm(); + this.$minDate.val('2010/01/002'); // day prefexid by 0 not allowed + this.bv.validate(); + expect(this.bv.isValidField('minDate')).toEqual(false); + + this.bv.resetForm(); + this.$minDate.val('2014/08/17'); + this.bv.validate(); + expect(this.bv.isValidField('minDate')).toBeTruthy(); + + this.bv.resetForm(); + this.$minDate.val('2009/12/31'); + this.bv.validate(); + expect(this.bv.isValidField('minDate')).toEqual(false); + + this.bv.resetForm(); + this.$minDate.val('2000/01/01'); + this.bv.validate(); + expect(this.bv.isValidField('minDate')).toEqual(false); + }); + + it('min date format YYYY-MM-DD', function() { + this.bv.updateOption('minDate', 'date', 'format', 'YYYY-MM-DD'); + this.bv.updateOption('minDate', 'date', 'min', '2010-01-01'); + + this.$minDate.val('2010-01-02'); + this.bv.validate(); + expect(this.bv.isValidField('minDate')).toBeTruthy(); + + this.bv.resetForm(); + this.$minDate.val('2010-001-02'); // month prefexid by 0 not allowed + this.bv.validate(); + expect(this.bv.isValidField('minDate')).toEqual(false); + + this.bv.resetForm(); + this.$minDate.val('2014-08-17'); + this.bv.validate(); + expect(this.bv.isValidField('minDate')).toBeTruthy(); + + this.bv.resetForm(); + this.$minDate.val('2009-12-31'); + this.bv.validate(); + expect(this.bv.isValidField('minDate')).toEqual(false); + + this.bv.resetForm(); + this.$minDate.val('2000-01-01'); + this.bv.validate(); + expect(this.bv.isValidField('minDate')).toEqual(false); + }); + + it('min date format DD/MM/YYYY', function() { + this.bv.updateOption('minDate', 'date', 'format', 'DD/MM/YYYY'); + this.bv.updateOption('minDate', 'date', 'min', '01/01/2010'); + + this.$minDate.val('02/01/2010'); + this.bv.validate(); + expect(this.bv.isValidField('minDate')).toBeTruthy(); + + this.bv.resetForm(); + this.$minDate.val('17/08/2014'); + this.bv.validate(); + expect(this.bv.isValidField('minDate')).toBeTruthy(); + + this.bv.resetForm(); + this.$minDate.val('02/01/02010'); // year prefixed by 0 not allowed + this.bv.validate(); + expect(this.bv.isValidField('minDate')).toEqual(false); + + this.bv.resetForm(); + this.$minDate.val('31/12/2009'); + this.bv.validate(); + expect(this.bv.isValidField('minDate')).toEqual(false); + + this.bv.resetForm(); + this.$minDate.val('01/01/2000'); + this.bv.validate(); + expect(this.bv.isValidField('minDate')).toEqual(false); + }); + + it('min date format YYYY-MM-DD h:m:s', function() { + this.bv.updateOption('minDate', 'date', 'format', 'YYYY-MM-DD h:m:s'); + this.bv.updateOption('minDate', 'date', 'min', '2010-01-01 01:00:00'); + + this.bv.resetForm(); + this.$minDate.val('2010-01-01 01:00:01'); + this.bv.validate(); + expect(this.bv.isValidField('minDate')).toBeTruthy(); + + this.$minDate.val('2010-01-02 01:00:01'); + this.bv.validate(); + expect(this.bv.isValidField('minDate')).toBeTruthy(); + + this.bv.resetForm(); + this.$minDate.val('2014-08-17 12:00:00'); + this.bv.validate(); + expect(this.bv.isValidField('minDate')).toBeTruthy(); + + this.bv.resetForm(); + this.$minDate.val('2009-12-31 00:00:00'); + this.bv.validate(); + expect(this.bv.isValidField('minDate')).toEqual(false); + + this.bv.resetForm(); + this.$minDate.val('2009-12-31 010:00:00'); // hours prefixed by 0 not allowed + this.bv.validate(); + expect(this.bv.isValidField('minDate')).toEqual(false); + + this.bv.resetForm(); + this.$minDate.val('2009-12-31 10:001:00'); // minutes prefixed by 0 not allowed + this.bv.validate(); + expect(this.bv.isValidField('minDate')).toEqual(false); + + this.bv.resetForm(); + this.$minDate.val('2009-12-31 10:01:012'); // seconds prefixed by 0 not allowed + this.bv.validate(); + expect(this.bv.isValidField('minDate')).toEqual(false); + + this.bv.resetForm(); + this.$minDate.val('2009-12-31 00:00:00'); + this.bv.validate(); + expect(this.bv.isValidField('minDate')).toEqual(false); + + this.bv.resetForm(); + this.$minDate.val('2000-01-01 23:00:12'); + this.bv.validate(); + expect(this.bv.isValidField('minDate')).toEqual(false); + }); + + // max test suite + it('max date format YYYY/MM/DD', function() { + this.bv.updateOption('maxDate', 'date', 'format', 'YYYY/MM/DD'); + this.bv.updateOption('maxDate', 'date', 'max', '2014/09/10'); + + this.$maxDate.val('2014/09/09'); + this.bv.validate(); + expect(this.bv.isValidField('maxDate')).toBeTruthy(); + + this.bv.resetForm(); + this.$maxDate.val('2014/08/17'); + this.bv.validate(); + expect(this.bv.isValidField('maxDate')).toBeTruthy(); + + this.bv.resetForm(); + this.$maxDate.val('02014/012/031'); // year, month or day prefixed by 0 not allowed + this.bv.validate(); + expect(this.bv.isValidField('maxDate')).toEqual(false); + + this.bv.resetForm(); + this.$maxDate.val('2014/12/31'); + this.bv.validate(); + expect(this.bv.isValidField('maxDate')).toEqual(false); + + this.bv.resetForm(); + this.$maxDate.val('2015/01/01'); + this.bv.validate(); + expect(this.bv.isValidField('maxDate')).toEqual(false); + }); + + it('max date format YYYY-MM-DD', function() { + this.bv.updateOption('maxDate', 'date', 'format', 'YYYY-MM-DD'); + this.bv.updateOption('maxDate', 'date', 'max', '2014-09-10'); + + this.$maxDate.val('2014-09-09'); + this.bv.validate(); + expect(this.bv.isValidField('maxDate')).toBeTruthy(); + + this.bv.resetForm(); + this.$maxDate.val('2014-08-17'); + this.bv.validate(); + expect(this.bv.isValidField('maxDate')).toBeTruthy(); + + this.bv.resetForm(); + this.$maxDate.val('02014-012-031'); // year, month or day prefixed by 0 not allowed + this.bv.validate(); + expect(this.bv.isValidField('maxDate')).toEqual(false); + + this.bv.resetForm(); + this.$maxDate.val('2014-12-31'); + this.bv.validate(); + expect(this.bv.isValidField('maxDate')).toEqual(false); + + this.bv.resetForm(); + this.$maxDate.val('2015-01-01'); + this.bv.validate(); + expect(this.bv.isValidField('maxDate')).toEqual(false); + }); + + it('max date format DD/MM/YYYY', function() { + this.bv.updateOption('maxDate', 'date', 'format', 'DD/MM/YYYY'); + this.bv.updateOption('maxDate', 'date', 'max', '10/09/2014'); + + this.$maxDate.val('09/09/2014'); + this.bv.validate(); + expect(this.bv.isValidField('maxDate')).toBeTruthy(); + + this.bv.resetForm(); + this.$maxDate.val('17/08/2014'); + this.bv.validate(); + expect(this.bv.isValidField('maxDate')).toBeTruthy(); + + this.bv.resetForm(); + this.$maxDate.val('031/012/02014'); // year, month or day prefixed by 0 not allowed + this.bv.validate(); + expect(this.bv.isValidField('maxDate')).toEqual(false); + + this.bv.resetForm(); + this.$maxDate.val('31/12/2014'); + this.bv.validate(); + expect(this.bv.isValidField('maxDate')).toEqual(false); + + this.bv.resetForm(); + this.$maxDate.val('01/01/2015'); + this.bv.validate(); + expect(this.bv.isValidField('maxDate')).toEqual(false); + }); + + it('max date format YYYY-MM-DD h:m:s', function() { + this.bv.updateOption('maxDate', 'date', 'format', 'YYYY-MM-DD h:m:s'); + this.bv.updateOption('maxDate', 'date', 'max', '2014-09-10 01:00:00'); + + this.$maxDate.val('2014-09-09 01:00:01'); + this.bv.validate(); + expect(this.bv.isValidField('maxDate')).toBeTruthy(); + + this.bv.resetForm(); + this.$maxDate.val('2014-08-17 12:00:00'); + this.bv.validate(); + expect(this.bv.isValidField('maxDate')).toBeTruthy(); + + this.bv.resetForm(); + this.$maxDate.val('2014-09-09 001:001:001'); // hours, minutes or seconds prefixed by 0 not allowed + this.bv.validate(); + expect(this.bv.isValidField('maxDate')).toEqual(false); + + this.bv.resetForm(); + this.$maxDate.val('2014-12-31 00:00:00'); + this.bv.validate(); + expect(this.bv.isValidField('maxDate')).toEqual(false); + + this.bv.resetForm(); + this.$maxDate.val('2015-01-01 23:00:12'); + this.bv.validate(); + expect(this.bv.isValidField('maxDate')).toEqual(false); + }); + + // range test suite + it('range format YYYY/MM/DD', function() { + this.bv.updateOption('range', 'date', 'format', 'YYYY/MM/DD'); + this.bv.updateOption('range', 'date', 'min', '2010/09/10'); + this.bv.updateOption('range', 'date', 'max', '2014/09/10'); + + this.$range.val('2011/01/01'); + this.bv.validate(); + expect(this.bv.isValidField('range')).toBeTruthy(); + + this.bv.resetForm(); + this.$range.val('2014/09/09'); + this.bv.validate(); + expect(this.bv.isValidField('range')).toBeTruthy(); + + this.bv.resetForm(); + this.$range.val('02014/001/031'); // year, month or day prefixed by 0 not allowed + this.bv.validate(); + expect(this.bv.isValidField('range')).toEqual(false); + + this.bv.resetForm(); + this.$range.val('2010/09/09'); + this.bv.validate(); + expect(this.bv.isValidField('range')).toEqual(false); + + this.bv.resetForm(); + this.$range.val('2014/09/11'); + this.bv.validate(); + expect(this.bv.isValidField('range')).toEqual(false); + }); + + it('range format YYYY-MM-DD', function() { + this.bv.updateOption('range', 'date', 'format', 'YYYY-MM-DD'); + this.bv.updateOption('range', 'date', 'min', '2010-09-10'); + this.bv.updateOption('range', 'date', 'max', '2014-09-10'); + + this.$range.val('2012-01-12'); + this.bv.validate(); + expect(this.bv.isValidField('range')).toBeTruthy(); + + this.bv.resetForm(); + this.$range.val('2014-09-09'); + this.bv.validate(); + expect(this.bv.isValidField('range')).toBeTruthy(); + + this.bv.resetForm(); + this.$range.val('02014-003-031'); // year, month or day prefixed by 0 not allowed + this.bv.validate(); + expect(this.bv.isValidField('range')).toEqual(false); + + this.bv.resetForm(); + this.$range.val('2009-12-31'); + this.bv.validate(); + expect(this.bv.isValidField('range')).toEqual(false); + + this.bv.resetForm(); + this.$range.val('2015-01-01'); + this.bv.validate(); + expect(this.bv.isValidField('range')).toEqual(false); + }); + + it('range format DD/MM/YYYY', function() { + this.bv.updateOption('range', 'date', 'format', 'DD/MM/YYYY'); + this.bv.updateOption('range', 'date', 'min', '10/09/2010'); + this.bv.updateOption('range', 'date', 'max', '10/09/2014'); + + this.$range.val('11/11/2011'); + this.bv.validate(); + expect(this.bv.isValidField('range')).toBeTruthy(); + + this.bv.resetForm(); + this.$range.val('17/08/2014'); + this.bv.validate(); + expect(this.bv.isValidField('range')).toBeTruthy(); + + this.bv.resetForm(); + this.$range.val('031/012/02013'); // year, month or day prefixed by 0 not allowed + this.bv.validate(); + expect(this.bv.isValidField('range')).toEqual(false); + + this.bv.resetForm(); + this.$range.val('31/01/2010'); + this.bv.validate(); + expect(this.bv.isValidField('range')).toEqual(false); + + this.bv.resetForm(); + this.$range.val('25/03/2015'); + this.bv.validate(); + expect(this.bv.isValidField('range')).toEqual(false); + }); + + it('range format YYYY-MM-DD h:m:s', function() { + this.bv.updateOption('range', 'date', 'format', 'YYYY-MM-DD h:m:s'); + this.bv.updateOption('range', 'date', 'min', '2010-05-15 22:00:00'); + this.bv.updateOption('range', 'date', 'max', '2015-05-15 22:00:00'); + + this.$range.val('2012-07-17 01:00:01'); + this.bv.validate(); + expect(this.bv.isValidField('range')).toBeTruthy(); + + this.bv.resetForm(); + this.$range.val('2013-08-17 12:00:00'); + this.bv.validate(); + expect(this.bv.isValidField('range')).toBeTruthy(); + + this.bv.resetForm(); + this.$range.val('2011-06-19 001:001:001'); // hours, minutes or seconds prefixed by 0 not allowed + this.bv.validate(); + expect(this.bv.isValidField('range')).toEqual(false); + + this.bv.resetForm(); + this.$range.val('2008-11-27 23:15:00'); + this.bv.validate(); + expect(this.bv.isValidField('range')).toEqual(false); + + this.bv.resetForm(); + this.$range.val('2015-05-15 22:00:01'); + this.bv.validate(); + expect(this.bv.isValidField('range')).toEqual(false); + }); + + // dynamic min option + it('dynamic min: name of field', function() { + this.$minDate.attr('data-bv-date-min', 'date'); + this.bv.destroy(); + this.bv = $('#dateForm').bootstrapValidator().data('bootstrapValidator'); + this.bv.updateOption('minDate', 'date', 'format', 'YYYY/MM/DD'); + + this.$date.val('2014/09/08'); + this.$minDate.val('2014/09/09'); + this.bv.validate(); + expect(this.bv.isValidField('minDate')).toBeTruthy(); + + this.bv.resetForm(); + this.$date.val('2014/09/08'); + this.$minDate.val('2014/08/17'); + this.bv.validate(); + expect(this.bv.isValidField('minDate')).toBeFalsy(); + }); + + it('dynamic min: callback declarative function', function() { + this.$minDate.attr('data-bv-date-min', 'getDate'); + this.bv.destroy(); + this.bv = $('#dateForm').bootstrapValidator().data('bootstrapValidator'); + this.bv.updateOption('minDate', 'date', 'format', 'YYYY/MM/DD'); + + this.$date.val('2014/09/08'); + this.$minDate.val('2014/09/09'); + this.bv.validate(); + expect(this.bv.isValidField('minDate')).toBeTruthy(); + + this.bv.resetForm(); + this.$date.val('2014/10/01'); + this.$minDate.val('2014/08/17'); + this.bv.validate(); + expect(this.bv.isValidField('minDate')).toBeFalsy(); + }); + + it('dynamic min: callback declarative function()', function() { + this.$minDate.attr('data-bv-date-min', 'getDate()'); + this.bv.destroy(); + this.bv = $('#dateForm').bootstrapValidator().data('bootstrapValidator'); + this.bv.updateOption('minDate', 'date', 'format', 'YYYY/MM/DD'); + + this.$date.val('2014/09/08'); + this.$minDate.val('2014/09/09'); + this.bv.validate(); + expect(this.bv.isValidField('minDate')).toBeTruthy(); + + this.bv.resetForm(); + this.$date.val('2014/10/01'); + this.$minDate.val('2014/08/17'); + this.bv.validate(); + expect(this.bv.isValidField('minDate')).toBeFalsy(); + }); + + it('dynamic min: callback declarative A.B.C', function() { + this.$minDate.attr('data-bv-date-min', 'TestSuite.Date.getDate'); + this.bv.destroy(); + this.bv = $('#dateForm').bootstrapValidator().data('bootstrapValidator'); + this.bv.updateOption('minDate', 'date', 'format', 'YYYY/MM/DD'); + + this.$date.val('2014/09/08'); + this.$minDate.val('2014/09/09'); + this.bv.validate(); + expect(this.bv.isValidField('minDate')).toBeTruthy(); + + this.bv.resetForm(); + this.$date.val('2014/10/01'); + this.$minDate.val('2014/08/17'); + this.bv.validate(); + expect(this.bv.isValidField('minDate')).toBeFalsy(); + }); + + it('dynamic min: callback declarative A.B.C()', function() { + this.$minDate.attr('data-bv-date-min', 'TestSuite.Date.getDate()'); + this.bv.destroy(); + this.bv = $('#dateForm').bootstrapValidator().data('bootstrapValidator'); + this.bv.updateOption('minDate', 'date', 'format', 'YYYY/MM/DD'); + + this.$date.val('2014/09/08'); + this.$minDate.val('2014/09/09'); + this.bv.validate(); + expect(this.bv.isValidField('minDate')).toBeTruthy(); + + this.bv.resetForm(); + this.$date.val('2014/10/01'); + this.$minDate.val('2014/08/17'); + this.bv.validate(); + expect(this.bv.isValidField('minDate')).toBeFalsy(); + }); + + it('dynamic min: callback programmatically', function() { + this.$minDate.removeAttr('data-bv-date-min'); + this.bv.destroy(); + this.bv = $('#dateForm') + .bootstrapValidator({ + fields: { + minDate: { + validators: { + date: { + min: function(value, validator, $field) { + return getDate(value, validator, $field); + } + } + } + } + } + }) + .data('bootstrapValidator'); + this.bv.updateOption('minDate', 'date', 'format', 'YYYY/MM/DD'); + + this.$date.val('2014/09/08'); + this.$minDate.val('2014/09/09'); + this.bv.validate(); + expect(this.bv.isValidField('minDate')).toBeTruthy(); + + this.bv.resetForm(); + this.$date.val('2014/10/01'); + this.$minDate.val('2014/08/17'); + this.bv.validate(); + expect(this.bv.isValidField('minDate')).toBeFalsy(); + }); + + // dynamic max option + it('dynamic max: name of field', function() { + this.$maxDate.attr('data-bv-date-max', 'date'); + this.bv.destroy(); + this.bv = $('#dateForm').bootstrapValidator().data('bootstrapValidator'); + this.bv.updateOption('maxDate', 'date', 'format', 'YYYY/MM/DD'); + + this.$date.val('2015/01/01'); + this.$maxDate.val('2014/09/09'); + this.bv.validate(); + expect(this.bv.isValidField('maxDate')).toBeTruthy(); + + this.bv.resetForm(); + this.$date.val('2014/01/01'); + this.$maxDate.val('2014/08/17'); + this.bv.validate(); + expect(this.bv.isValidField('maxDate')).toBeFalsy(); + }); + + it('dynamic max: callback declarative function', function() { + this.$maxDate.attr('data-bv-date-max', 'getDate'); + this.bv.destroy(); + this.bv = $('#dateForm').bootstrapValidator().data('bootstrapValidator'); + this.bv.updateOption('maxDate', 'date', 'format', 'YYYY/MM/DD'); + + this.$date.val('2015/01/01'); + this.$maxDate.val('2014/09/09'); + this.bv.validate(); + expect(this.bv.isValidField('maxDate')).toBeTruthy(); + + this.bv.resetForm(); + this.$date.val('2014/01/01'); + this.$maxDate.val('2014/08/17'); + this.bv.validate(); + expect(this.bv.isValidField('maxDate')).toBeFalsy(); + }); + + it('dynamic max: callback declarative function()', function() { + this.$maxDate.attr('data-bv-date-max', 'getDate()'); + this.bv.destroy(); + this.bv = $('#dateForm').bootstrapValidator().data('bootstrapValidator'); + this.bv.updateOption('maxDate', 'date', 'format', 'YYYY/MM/DD'); + + this.$date.val('2015/01/01'); + this.$maxDate.val('2014/09/09'); + this.bv.validate(); + expect(this.bv.isValidField('maxDate')).toBeTruthy(); + + this.bv.resetForm(); + this.$date.val('2014/01/01'); + this.$maxDate.val('2014/08/17'); + this.bv.validate(); + expect(this.bv.isValidField('maxDate')).toBeFalsy(); + }); + + it('dynamic max: callback declarative A.B.C', function() { + this.$maxDate.attr('data-bv-date-max', 'TestSuite.Date.getDate'); + this.bv.destroy(); + this.bv = $('#dateForm').bootstrapValidator().data('bootstrapValidator'); + this.bv.updateOption('maxDate', 'date', 'format', 'YYYY/MM/DD'); + + this.$date.val('2015/01/01'); + this.$maxDate.val('2014/09/09'); + this.bv.validate(); + expect(this.bv.isValidField('maxDate')).toBeTruthy(); + + this.bv.resetForm(); + this.$date.val('2014/01/01'); + this.$maxDate.val('2014/08/17'); + this.bv.validate(); + expect(this.bv.isValidField('maxDate')).toBeFalsy(); + }); + + it('dynamic max: callback declarative A.B.C()', function() { + this.$maxDate.attr('data-bv-date-max', 'TestSuite.Date.getDate()'); + this.bv.destroy(); + this.bv = $('#dateForm').bootstrapValidator().data('bootstrapValidator'); + this.bv.updateOption('maxDate', 'date', 'format', 'YYYY/MM/DD'); + + this.$date.val('2015/01/01'); + this.$maxDate.val('2014/09/09'); + this.bv.validate(); + expect(this.bv.isValidField('maxDate')).toBeTruthy(); + + this.bv.resetForm(); + this.$date.val('2014/01/01'); + this.$maxDate.val('2014/08/17'); + this.bv.validate(); + expect(this.bv.isValidField('maxDate')).toBeFalsy(); + }); + + it('dynamic max: callback programmatically', function() { + this.$maxDate.removeAttr('data-bv-date-max'); + this.bv.destroy(); + this.bv = $('#dateForm') + .bootstrapValidator({ + fields: { + maxDate: { + validators: { + date: { + max: function(value, validator, $field) { + return getDate(value, validator, $field); + } + } + } + } + } + }) + .data('bootstrapValidator'); + this.bv.updateOption('maxDate', 'date', 'format', 'YYYY/MM/DD'); + + this.$date.val('2015/01/01'); + this.$maxDate.val('2014/09/09'); + this.bv.validate(); + expect(this.bv.isValidField('maxDate')).toBeTruthy(); + + this.bv.resetForm(); + this.$date.val('2014/01/01'); + this.$maxDate.val('2014/08/17'); + this.bv.validate(); + expect(this.bv.isValidField('maxDate')).toBeFalsy(); + }); +}); diff --git a/test/spec/validator/ean.js b/test/spec/validator/ean.js new file mode 100644 index 000000000..4f9150d15 --- /dev/null +++ b/test/spec/validator/ean.js @@ -0,0 +1,51 @@ +describe('ean', function() { + beforeEach(function() { + var html = [ + '
      ', + '
      ', + '
      ', + '', + '
      ', + '
      ', + '
      ' + ].join('\n'); + + $(html).appendTo('body'); + $('#eanForm').bootstrapValidator(); + + this.bv = $('#eanForm').data('bootstrapValidator'); + this.$ean = this.bv.getFieldElements('ean'); + }); + + afterEach(function() { + $('#eanForm').bootstrapValidator('destroy').parent().remove(); + }); + + it('valid', function() { + var samples = ['73513537', '9780471117094', '4006381333931']; + + for (var i in samples) { + this.$ean.val(samples[i]); + this.bv.validate(); + expect(this.bv.isValidField('ean')).toBeTruthy(); + } + }); + + it('contains only digits', function() { + this.$ean.val('123abcDEF!@#'); + this.bv.validate(); + expect(this.bv.isValidField('ean')).toEqual(false); + }); + + it('invalid length', function() { + this.$ean.val('1234567'); + this.bv.validate(); + expect(this.bv.isValidField('ean')).toEqual(false); + }); + + it('invalid check digit', function() { + this.$ean.val('73513536'); + this.bv.validate(); + expect(this.bv.isValidField('ean')).toEqual(false); + }); +}); diff --git a/test/spec/validator/emailAddress.js b/test/spec/validator/emailAddress.js new file mode 100644 index 000000000..0ee354d95 --- /dev/null +++ b/test/spec/validator/emailAddress.js @@ -0,0 +1,175 @@ +describe('emailAddress', function() { + beforeEach(function() { + $([ + '
      ', + '
      ', + '
      ', + '', + '
      ', + '
      ' + ].join('\n')).appendTo('body'); + + $('#emailAddressForm').bootstrapValidator(); + + this.bv = $('#emailAddressForm').data('bootstrapValidator'); + this.$emailAddressOrAddresses = this.bv.getFieldElements('email-address-or-addresses'); + }); + + afterEach(function() { + $('#emailAddressForm').bootstrapValidator('destroy').remove(); + }); + + var validEmailAddresses = [ + 'admin@mailserver1', + 'niceandsimple@example.com', + 'very.common@example.com', + 'a.little.lengthy.but.fine@dept.example.com', + 'disposable.style.email.with+symbol@example.com', + 'other.email-with-dash@example.com', + '"much.more unusual"@example.com', + '"very.unusual.@.unusual.com"@example.com', + '"very.(),:;<>[]\".VERY.\"very@\\ \"very\".unusual"@strange.example.com', + '" "@example.org', + 'üñîçøðé@example.com' + ]; + + var invalidEmailAddresses = [ + // "!#$%&'*+-/=?^_`{}|~@example.org", // This is actually passing validation; see https://github.com/nghuuphuoc/bootstrapvalidator/issues/673 + 'üñîçøðé@üñîçøðé.com', + 'Abc.example.com', + 'A@b@c@example.com', + 'a"b(c)d,e:f;gi[j\k]l@example.com', + 'just"not"right@example.com', + 'this is"not\allowed@example.com', + 'this\ still\"not\\allowed@example.com' + ]; + + var validMultipleEmailAddressesForDefaultSeparators = [ + 'niceandsimple@example.com,very.common@example.com', + 'niceandsimple@example.com;very.common@example.com', + 'niceandsimple@example.com;very.common@example.com,a.little.lengthy.but.fine@dept.example.com' + ]; + + var invalidMultipleEmailAddressesForDefaultSeparators = [ + 'niceandsimple@example.com+very.common@example.com', + 'niceandsimple@example.com|very.common@example.com' + ]; + + var validMultipleEmailAddressesForCommaOrDollarSignSeparators = [ + 'niceandsimple@example.com,very.common@example.com', + 'niceandsimple@example.com$very.common@example.com', + 'niceandsimple@example.com,very.common@example.com$a.little.lengthy.but.fine@dept.example.com' + ]; + + var invalidMultipleEmailAddressesForCommaOrDollarSignSeparators = [ + 'niceandsimple@example.com;very.common@example.com', + 'niceandsimple@example.com;very.common@example.com,a.little.lengthy.but.fine@dept.example.com' + ]; + + it('Valid email addresses (multiple=false)', function() { + var that = this; + $.each(validEmailAddresses, function(index, emailAddress) { + that.bv.resetForm(); + that.$emailAddressOrAddresses.val(emailAddress); + that.bv.validate(); + expect(that.bv.isValid()).toBeTruthy(); + }); + }); + + it('Invalid email addresses (multiple=false)', function() { + var that = this; + + var addresses = invalidEmailAddresses + .concat(validMultipleEmailAddressesForDefaultSeparators) + .concat(invalidMultipleEmailAddressesForDefaultSeparators) + .concat(validMultipleEmailAddressesForCommaOrDollarSignSeparators) + .concat(invalidMultipleEmailAddressesForCommaOrDollarSignSeparators); + + $.each(addresses, function(index, emailAddress) { + that.bv.resetForm(); + that.$emailAddressOrAddresses.val(emailAddress); + that.bv.validate(); + expect(that.bv.isValid()).toEqual(false); + }); + }); + + it('Invalid email addresses (multiple=false,separator=/[,\$]/)', function() { + var that = this; + that.bv.updateOption('email-address-or-addresses', 'emailAddress', 'separator', /[,;]/); + + var addresses = invalidEmailAddresses + .concat(validMultipleEmailAddressesForDefaultSeparators) + .concat(invalidMultipleEmailAddressesForDefaultSeparators) + .concat(validMultipleEmailAddressesForCommaOrDollarSignSeparators) + .concat(invalidMultipleEmailAddressesForCommaOrDollarSignSeparators); + + $.each(addresses, function(index, emailAddress) { + that.bv.resetForm(); + that.$emailAddressOrAddresses.val(emailAddress); + that.bv.validate(); + expect(that.bv.isValid()).toEqual(false); + }); + }); + + it('Valid email addresses (multiple=true)', function() { + var that = this; + that.bv.updateOption('email-address-or-addresses', 'emailAddress', 'multiple', true); + + var addresses = validEmailAddresses + .concat(validMultipleEmailAddressesForDefaultSeparators); + + $.each(addresses, function(index, emailAddress) { + that.bv.resetForm(); + that.$emailAddressOrAddresses.val(emailAddress); + that.bv.validate(); + expect(that.bv.isValid()).toBeTruthy(); + }); + }); + + it('Invalid email addresses (multiple=true)', function() { + var that = this; + that.bv.updateOption('email-address-or-addresses', 'emailAddress', 'multiple', true); + + var addresses = invalidEmailAddresses + .concat(invalidMultipleEmailAddressesForDefaultSeparators); + + $.each(addresses, function(index, emailAddress) { + that.bv.resetForm(); + that.$emailAddressOrAddresses.val(emailAddress); + that.bv.validate(); + expect(that.bv.isValid()).toEqual(false); + }); + }); + + it('Valid email addresses (multiple=true,separator=/[,\$]/)', function() { + var that = this; + that.bv.updateOption('email-address-or-addresses', 'emailAddress', 'multiple', true); + that.bv.updateOption('email-address-or-addresses', 'emailAddress', 'separator', /[,\$]/); + + var addresses = validEmailAddresses + .concat(validMultipleEmailAddressesForCommaOrDollarSignSeparators); + + $.each(addresses, function(index, emailAddress) { + that.bv.resetForm(); + that.$emailAddressOrAddresses.val(emailAddress); + that.bv.validate(); + expect(that.bv.isValid()).toBeTruthy(); + }); + }); + + it('Invalid email addresses (multiple=true,separator=/[,\$]/)', function() { + var that = this; + that.bv.updateOption('email-address-or-addresses', 'emailAddress', 'multiple', true); + that.bv.updateOption('email-address-or-addresses', 'emailAddress', 'separator', /[,\$]/); + + var addresses = invalidEmailAddresses + .concat(invalidMultipleEmailAddressesForCommaOrDollarSignSeparators); + + $.each(addresses, function(index, emailAddress) { + that.bv.resetForm(); + that.$emailAddressOrAddresses.val(emailAddress); + that.bv.validate(); + expect(that.bv.isValid()).toEqual(false); + }); + }); +}); diff --git a/test/spec/validator/greaterThan.js b/test/spec/validator/greaterThan.js new file mode 100644 index 000000000..6a38eef9b --- /dev/null +++ b/test/spec/validator/greaterThan.js @@ -0,0 +1,137 @@ +function greaterThanCompare() { + var compareTo = $('#greaterThanForm').find('[name="minAge"]').val(); + $('#msg').html('greaterThanCompare() called; compare to ' + compareTo); + return compareTo; +}; + +TestSuite = $.extend({}, TestSuite, { + greaterThan: { + compareTo: function(value, validator, $field) { + var compareTo = $('#greaterThanForm').find('[name="minAge"]').val(); + $('#msg').html('TestSuite.greaterThan.compareTo() called; compare to ' + compareTo); + return compareTo; + } + } +}); + +describe('greaterThan', function() { + beforeEach(function() { + $([ + '
      ', + '
      ', + '
      ', + '', + '
      ', + '
      ', + '', + '
      ', + '
      ' + ].join('\n')).appendTo('body'); + + $('#greaterThanForm').bootstrapValidator(); + + this.bv = $('#greaterThanForm').data('bootstrapValidator'); + this.$minAge = this.bv.getFieldElements('minAge'); + this.$age = this.bv.getFieldElements('age'); + }); + + afterEach(function() { + $('#greaterThanForm').bootstrapValidator('destroy').remove(); + }); + + it('not a number', function() { + this.$age.val('20abc'); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + }); + + it('compare to value', function() { + this.$age.val(10); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + + this.bv.resetForm(); + this.$age.val(20); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + }); + + it('value with comma separator', function() { + this.$age.val('10,4'); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + + this.bv.resetForm(); + this.$age.val('18,678'); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + }); + + it('compare to other field', function() { + this.bv.updateOption('age', 'greaterThan', 'value', 'minAge'); + + this.$minAge.val(10); + this.$age.val(20); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + + this.bv.resetForm(); + this.$minAge.val(20); + this.$age.val(10); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + expect(this.bv.getMessages('age', 'greaterThan')[0]).toEqual($.fn.bootstrapValidator.helpers.format($.fn.bootstrapValidator.i18n.greaterThan['default'], this.$minAge.val())); + }); + + // #1048 + it('compare to other field that value has comma', function() { + this.bv.updateOption('age', 'greaterThan', 'value', 'minAge'); + this.$minAge.val('10,5'); + this.$age.val(20); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + + this.bv.resetForm(); + this.$minAge.val('20,5'); + this.$age.val(10); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + expect(this.bv.getMessages('age', 'greaterThan')[0]).toEqual($.fn.bootstrapValidator.helpers.format($.fn.bootstrapValidator.i18n.greaterThan['default'], this.$minAge.val())); + }); + + it('compare to return value of a function', function() { + this.bv.updateOption('age', 'greaterThan', 'value', 'greaterThanCompare'); + + this.$minAge.val(20); + this.$age.val(18); + this.bv.validate(); + expect($('#msg').html()).toEqual('greaterThanCompare() called; compare to 20'); + expect(this.bv.isValid()).toEqual(false); + expect(this.bv.getMessages('age', 'greaterThan')[0]).toEqual($.fn.bootstrapValidator.helpers.format($.fn.bootstrapValidator.i18n.greaterThan['default'], this.$minAge.val())); + + this.bv.resetForm(); + this.$minAge.val(18); + this.$age.val(20); + this.bv.validate(); + expect($('#msg').html()).toEqual('greaterThanCompare() called; compare to 18'); + expect(this.bv.isValid()).toBeTruthy(); + }); + + it('compare to return value of a namespace function', function() { + this.bv.updateOption('age', 'greaterThan', 'value', 'TestSuite.greaterThan.compareTo'); + + this.$minAge.val(20); + this.$age.val(18); + this.bv.validate(); + expect($('#msg').html()).toEqual('TestSuite.greaterThan.compareTo() called; compare to 20'); + expect(this.bv.isValid()).toEqual(false); + expect(this.bv.getMessages('age', 'greaterThan')[0]).toEqual($.fn.bootstrapValidator.helpers.format($.fn.bootstrapValidator.i18n.greaterThan['default'], this.$minAge.val())); + + this.bv.resetForm(); + this.$minAge.val(18); + this.$age.val(20); + this.bv.validate(); + expect($('#msg').html()).toEqual('TestSuite.greaterThan.compareTo() called; compare to 18'); + expect(this.bv.isValid()).toBeTruthy(); + }); +}); diff --git a/test/spec/validator/iban.js b/test/spec/validator/iban.js new file mode 100644 index 000000000..ec292aa3f --- /dev/null +++ b/test/spec/validator/iban.js @@ -0,0 +1,597 @@ +describe('iban', function() { + beforeEach(function() { + $([ + '
      ', + '
      ', + '', + '
      ', + '
      ', + '', + '
      ', + '
      ' + ].join('\n')).appendTo('body'); + + $('#ibanForm').bootstrapValidator(); + + this.bv = $('#ibanForm').data('bootstrapValidator'); + this.$country = this.bv.getFieldElements('country'); + this.$iban = this.bv.getFieldElements('iban'); + }); + + afterEach(function() { + $('#ibanForm').bootstrapValidator('destroy').remove(); + }); + + it('not supported country', function() { + this.$iban.val('US123456789'); + this.bv.validate(); + expect(this.bv.isValidField('iban')).toEqual(false); + }); + + it('dynamic country', function() { + this.$iban.attr('data-bv-iban-country', 'country'); + this.bv.destroy(); + this.bv = $('#ibanForm').bootstrapValidator().data('bootstrapValidator'); + + this.$country.val('AT'); + this.$iban.val('AT611904300234573201'); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + + this.bv.resetForm(); + this.$country.val('BG'); + this.$iban.val('HR1210010051863000160'); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + }); + + it('Albania', function() { + this.$iban.val('AL47212110090000000235698741'); + this.bv.validate(); + expect(this.bv.isValidField('iban')).toBeTruthy(); + }); + + it('Algeria', function() { + this.$iban.val('DZ4000400174401001050486'); + this.bv.validate(); + expect(this.bv.isValidField('iban')).toBeTruthy(); + }); + + it('Andorra', function() { + this.$iban.val('AD1200012030200359100100'); + this.bv.validate(); + expect(this.bv.isValidField('iban')).toBeTruthy(); + }); + + it('Angola', function() { + this.$iban.val('AO06000600000100037131174'); + this.bv.validate(); + expect(this.bv.isValidField('iban')).toBeTruthy(); + }); + + it('Austria', function() { + this.$iban.val('AT611904300234573201'); + this.bv.validate(); + expect(this.bv.isValidField('iban')).toBeTruthy(); + }); + + it('Azerbaijan', function() { + this.$iban.val('AZ21NABZ00000000137010001944'); + this.bv.validate(); + expect(this.bv.isValidField('iban')).toBeTruthy(); + }); + + it('Bahrain', function() { + this.$iban.val('BH29BMAG1299123456BH00'); + this.bv.validate(); + expect(this.bv.isValidField('iban')).toBeTruthy(); + }); + + it('Belgium', function() { + this.$iban.val('BE68539007547034'); + this.bv.validate(); + expect(this.bv.isValidField('iban')).toBeTruthy(); + }); + + it('Benin', function() { + this.$iban.val('BJ11B00610100400271101192591'); + this.bv.validate(); + expect(this.bv.isValidField('iban')).toBeTruthy(); + }); + + it('Brazil', function() { + this.$iban.val('BR9700360305000010009795493P1'); + this.bv.validate(); + expect(this.bv.isValidField('iban')).toBeTruthy(); + }); + + it('Bulgaria', function() { + this.$iban.val('BG80BNBG96611020345678'); + this.bv.validate(); + expect(this.bv.isValidField('iban')).toBeTruthy(); + }); + + it('Burkina Faso', function() { + this.$iban.val('BF1030134020015400945000643'); + this.bv.validate(); + expect(this.bv.isValidField('iban')).toBeTruthy(); + }); + it('Burundi', function() { + this.$iban.val('BI43201011067444'); + this.bv.validate(); + expect(this.bv.isValidField('iban')).toBeTruthy(); + }); + + it('Cameroon', function() { + this.$iban.val('CM2110003001000500000605306'); + this.bv.validate(); + expect(this.bv.isValidField('iban')).toBeTruthy(); + }); + + it('Cape Verde', function() { + this.$iban.val('CV64000300004547069110176'); + this.bv.validate(); + expect(this.bv.isValidField('iban')).toBeTruthy(); + }); + + it('Costa Rica', function() { + this.$iban.val('CR0515202001026284066'); + this.bv.validate(); + expect(this.bv.isValidField('iban')).toBeTruthy(); + }); + + it('Croatia', function() { + this.$iban.val('HR1210010051863000160'); + this.bv.validate(); + expect(this.bv.isValidField('iban')).toBeTruthy(); + }); + it('Cyprus', function() { + this.$iban.val('CY17002001280000001200527600'); + this.bv.validate(); + expect(this.bv.isValidField('iban')).toBeTruthy(); + }); + + it('Czech Republic', function() { + this.$iban.val('CZ6508000000192000145399'); + this.bv.validate(); + expect(this.bv.isValidField('iban')).toBeTruthy(); + }); + + it('Denmark', function() { + this.$iban.val('DK5000400440116243'); + this.bv.validate(); + expect(this.bv.isValidField('iban')).toBeTruthy(); + }); + + it('Dominican Republic', function() { + this.$iban.val('DO28BAGR00000001212453611324'); + this.bv.validate(); + expect(this.bv.isValidField('iban')).toBeTruthy(); + }); + + it('Estonia', function() { + this.$iban.val('EE382200221020145685'); + this.bv.validate(); + expect(this.bv.isValidField('iban')).toBeTruthy(); + }); + it('Faroe Islands', function() { + this.$iban.val('FO1464600009692713'); + this.bv.validate(); + expect(this.bv.isValidField('iban')).toBeTruthy(); + }); + + it('Finland', function() { + this.$iban.val('FI2112345600000785'); + this.bv.validate(); + expect(this.bv.isValidField('iban')).toBeTruthy(); + }); + + it('France', function() { + this.$iban.val('FR1420041010050500013M02606'); + this.bv.validate(); + expect(this.bv.isValidField('iban')).toBeTruthy(); + }); + + it('Guatemala', function() { + this.$iban.val('GT82TRAJ01020000001210029690'); + this.bv.validate(); + expect(this.bv.isValidField('iban')).toBeTruthy(); + }); + + it('Georgia', function() { + this.$iban.val('GE29NB0000000101904917'); + this.bv.validate(); + expect(this.bv.isValidField('iban')).toBeTruthy(); + }); + + it('Germany', function() { + this.$iban.val('DE89370400440532013000'); + this.bv.validate(); + expect(this.bv.isValidField('iban')).toBeTruthy(); + }); + + it('Gibraltar', function() { + this.$iban.val('GI75NWBK000000007099453'); + this.bv.validate(); + expect(this.bv.isValidField('iban')).toBeTruthy(); + }); + + it('Greece', function() { + this.$iban.val('GR1601101250000000012300695'); + this.bv.validate(); + expect(this.bv.isValidField('iban')).toBeTruthy(); + }); + + it('Greenland', function() { + this.$iban.val('GL8964710001000206'); + this.bv.validate(); + expect(this.bv.isValidField('iban')).toBeTruthy(); + }); + + it('Hungary', function() { + this.$iban.val('HU42117730161111101800000000'); + this.bv.validate(); + expect(this.bv.isValidField('iban')).toBeTruthy(); + }); + + it('Iceland', function() { + this.$iban.val('IS140159260076545510730339'); + this.bv.validate(); + expect(this.bv.isValidField('iban')).toBeTruthy(); + }); + + it('Iran', function() { + this.$iban.val('IR580540105180021273113007'); + this.bv.validate(); + expect(this.bv.isValidField('iban')).toBeTruthy(); + }); + + it('Ireland', function() { + this.$iban.val('IE29AIBK93115212345678'); + this.bv.validate(); + expect(this.bv.isValidField('iban')).toBeTruthy(); + }); + + it('Israel', function() { + this.$iban.val('IL620108000000099999999'); + this.bv.validate(); + expect(this.bv.isValidField('iban')).toBeTruthy(); + }); + + it('Italy', function() { + this.$iban.val('IT60X0542811101000000123456'); + this.bv.validate(); + expect(this.bv.isValidField('iban')).toBeTruthy(); + }); + + it('Ivory Coast', function() { + this.$iban.val('CI05A00060174100178530011852'); + this.bv.validate(); + expect(this.bv.isValidField('iban')).toBeTruthy(); + }); + + it('Jordan', function() { + this.$iban.val('JO94CBJO0010000000000131000302'); + this.bv.validate(); + expect(this.bv.isValidField('iban')).toBeTruthy(); + }); + + it('Kazakhstan', function() { + this.$iban.val('KZ176010251000042993'); + this.bv.validate(); + expect(this.bv.isValidField('iban')).toBeTruthy(); + }); + + it('Kuwait', function() { + this.$iban.val('KW74NBOK0000000000001000372151'); + this.bv.validate(); + expect(this.bv.isValidField('iban')).toBeTruthy(); + }); + + it('Latvia', function() { + this.$iban.val('LV80BANK0000435195001'); + this.bv.validate(); + expect(this.bv.isValidField('iban')).toBeTruthy(); + }); + + it('Lebanon', function() { + this.$iban.val('LB30099900000001001925579115'); + this.bv.validate(); + expect(this.bv.isValidField('iban')).toBeTruthy(); + }); + + it('Liechtenstein', function() { + this.$iban.val('LI21088100002324013AA'); + this.bv.validate(); + expect(this.bv.isValidField('iban')).toBeTruthy(); + }); + + it('Lithuania', function() { + this.$iban.val('LT121000011101001000'); + this.bv.validate(); + expect(this.bv.isValidField('iban')).toBeTruthy(); + }); + + it('Luxembourg', function() { + this.$iban.val('LU280019400644750000'); + this.bv.validate(); + expect(this.bv.isValidField('iban')).toBeTruthy(); + }); + + it('Macedonia', function() { + this.$iban.val('MK07300000000042425'); + this.bv.validate(); + expect(this.bv.isValidField('iban')).toBeTruthy(); + }); + + it('Madagascar', function() { + this.$iban.val('MG4600005030010101914016056'); + this.bv.validate(); + expect(this.bv.isValidField('iban')).toBeTruthy(); + }); + + it('Malta', function() { + this.$iban.val('MT84MALT011000012345MTLCAST001S'); + this.bv.validate(); + expect(this.bv.isValidField('iban')).toBeTruthy(); + }); + + it('Mauritania', function() { + this.$iban.val('MR1300012000010000002037372'); + this.bv.validate(); + expect(this.bv.isValidField('iban')).toBeTruthy(); + }); + + it('Mauritius', function() { + this.$iban.val('MU17BOMM0101101030300200000MUR'); + this.bv.validate(); + expect(this.bv.isValidField('iban')).toBeTruthy(); + }); + + it('Mali', function() { + this.$iban.val('ML03D00890170001002120000447'); + this.bv.validate(); + expect(this.bv.isValidField('iban')).toBeTruthy(); + }); + + it('Moldova', function() { + this.$iban.val('MD24AG000225100013104168'); + this.bv.validate(); + expect(this.bv.isValidField('iban')).toBeTruthy(); + }); + + it('Monaco', function() { + this.$iban.val('MC5813488000010051108001292'); + this.bv.validate(); + expect(this.bv.isValidField('iban')).toBeTruthy(); + }); + + it('Montenegro', function() { + this.$iban.val('ME25505000012345678951'); + this.bv.validate(); + expect(this.bv.isValidField('iban')).toBeTruthy(); + }); + + it('Mozambique', function() { + this.$iban.val('MZ59000100000011834194157'); + this.bv.validate(); + expect(this.bv.isValidField('iban')).toBeTruthy(); + }); + + it('Netherlands', function() { + this.$iban.val('NL91ABNA0417164300'); + this.bv.validate(); + expect(this.bv.isValidField('iban')).toBeTruthy(); + }); + + it('Norway', function() { + this.$iban.val('NO9386011117947'); + this.bv.validate(); + expect(this.bv.isValidField('iban')).toBeTruthy(); + }); + + it('Pakistan', function() { + this.$iban.val('PK24SCBL0000001171495101'); + this.bv.validate(); + expect(this.bv.isValidField('iban')).toBeTruthy(); + }); + + it('Palestine', function() { + this.$iban.val('PS92PALS000000000400123456702'); + this.bv.validate(); + expect(this.bv.isValidField('iban')).toBeTruthy(); + }); + + it('Poland', function() { + this.$iban.val('PL27114020040000300201355387'); + this.bv.validate(); + expect(this.bv.isValidField('iban')).toBeTruthy(); + }); + + it('Portugal', function() { + this.$iban.val('PT50000201231234567890154'); + this.bv.validate(); + expect(this.bv.isValidField('iban')).toBeTruthy(); + }); + + it('Qatar', function() { + this.$iban.val('QA58DOHB00001234567890ABCDEFG'); + this.bv.validate(); + expect(this.bv.isValidField('iban')).toBeTruthy(); + }); + + it('Romania', function() { + this.$iban.val('RO49AAAA1B31007593840000'); + this.bv.validate(); + expect(this.bv.isValidField('iban')).toBeTruthy(); + }); + + it('San Marino', function() { + this.$iban.val('SM86U0322509800000000270100'); + this.bv.validate(); + expect(this.bv.isValidField('iban')).toBeTruthy(); + }); + + it('Saudi Arabia', function() { + this.$iban.val('SA0380000000608010167519'); + this.bv.validate(); + expect(this.bv.isValidField('iban')).toBeTruthy(); + }); + + it('Senegal', function() { + this.$iban.val('SN12K00100152000025690007542'); + this.bv.validate(); + expect(this.bv.isValidField('iban')).toBeTruthy(); + }); + + it('Serbia', function() { + this.$iban.val('RS35260005601001611379'); + this.bv.validate(); + expect(this.bv.isValidField('iban')).toBeTruthy(); + }); + + it('Slovakia', function() { + this.$iban.val('SK3112000000198742637541'); + this.bv.validate(); + expect(this.bv.isValidField('iban')).toBeTruthy(); + }); + + it('Slovenia', function() { + this.$iban.val('SI56191000000123438'); + this.bv.validate(); + expect(this.bv.isValidField('iban')).toBeTruthy(); + }); + + it('Spain', function() { + this.$iban.val('ES9121000418450200051332'); + this.bv.validate(); + expect(this.bv.isValidField('iban')).toBeTruthy(); + }); + + it('Sweden', function() { + this.$iban.val('SE3550000000054910000003'); + this.bv.validate(); + expect(this.bv.isValidField('iban')).toBeTruthy(); + }); + + it('Switzerland', function() { + this.$iban.val('CH9300762011623852957'); + this.bv.validate(); + expect(this.bv.isValidField('iban')).toBeTruthy(); + }); + + it('Tunisia', function() { + this.$iban.val('TN5914207207100707129648'); + this.bv.validate(); + expect(this.bv.isValidField('iban')).toBeTruthy(); + }); + + it('Turkey', function() { + this.$iban.val('TR330006100519786457841326'); + this.bv.validate(); + expect(this.bv.isValidField('iban')).toBeTruthy(); + }); + + it('United Arab Emirates', function() { + this.$iban.val('AE260211000000230064016'); + this.bv.validate(); + expect(this.bv.isValidField('iban')).toBeTruthy(); + }); + + it('United Kingdom', function() { + this.$iban.val('GB29NWBK60161331926819'); + this.bv.validate(); + expect(this.bv.isValidField('iban')).toBeTruthy(); + }); + + it('Virgin Islands, British', function() { + this.$iban.val('VG96VPVG0000012345678901'); + this.bv.validate(); + expect(this.bv.isValidField('iban')).toBeTruthy(); + }); + + it('invalid checksum', function() { + this.$iban.val('TR330006100519786457841325'); + this.bv.validate(); + expect(this.bv.isValidField('iban')).toEqual(false); + }); +}); diff --git a/test/spec/validator/id.js b/test/spec/validator/id.js new file mode 100644 index 000000000..1ae6dbd86 --- /dev/null +++ b/test/spec/validator/id.js @@ -0,0 +1,499 @@ +describe('id', function() { + beforeEach(function() { + $([ + '
      ', + '
      ', + '', + '
      ', + '
      ', + '', + '
      ', + '
      ' + ].join('\n')).appendTo('body'); + + $('#idForm').bootstrapValidator(); + + /** + * @type {BootstrapValidator} + */ + this.bv = $('#idForm').data('bootstrapValidator'); + this.$country = this.bv.getFieldElements('country'); + this.$id = this.bv.getFieldElements('id'); + }); + + afterEach(function() { + $('#idForm').bootstrapValidator('destroy').remove(); + }); + + it('dynamic country', function() { + this.$id.attr('data-bv-id-country', 'country'); + this.bv.destroy(); + this.bv = $('#idForm').bootstrapValidator().data('bootstrapValidator'); + + this.$country.val('BG'); + this.$id.val('7552010005'); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + + this.bv.resetForm(); + this.$country.val('BR'); + this.$id.val('231.002.999-00'); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + }); + + it('Bulgarian national identification number (EGN)', function() { + this.bv.updateOption('id', 'id', 'country', 'BG'); + + // Valid samples + var validSamples = ['7523169263', '8032056031', '803205 603 1', '8001010008', '7501020018', '7552010005', '7542011030']; + for (var i in validSamples) { + this.bv.resetForm(); + this.$id.val(validSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + } + + // Invalid samples + var invalidSamples = ['8019010008']; + for (i in invalidSamples) { + this.bv.resetForm(); + this.$id.val(invalidSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + } + }); + + it('Brazilian national identification number (CPF)', function() { + this.bv.updateOption('id', 'id', 'country', 'BR'); + + // Valid samples + var validSamples = ['39053344705', '390.533.447-05', '111.444.777-35']; + for (var i in validSamples) { + this.bv.resetForm(); + this.$id.val(validSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + } + + // Invalid samples + var invalidSamples = ['231.002.999-00']; + for (i in invalidSamples) { + this.bv.resetForm(); + this.$id.val(invalidSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + } + }); + + it('Swiss Social Security Number (AHV-Nr/No AVS)', function() { + this.bv.updateOption('id', 'id', 'country', 'CH'); + + // Valid samples + var validSamples = ['756.1234.5678.95', '7561234567895']; + for (var i in validSamples) { + this.bv.resetForm(); + this.$id.val(validSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + } + }); + + it('Chilean national identification number (RUN/RUT)', function() { + this.bv.updateOption('id', 'id', 'country', 'CL'); + + // Valid samples + var validSamples = ['76086428-5', '22060449-7', '12531909-2','12937893-K','12937893-k']; + for (var i in validSamples) { + this.bv.resetForm(); + this.$id.val(validSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + } + }); + + // #793 + it('Chinese citizen identification number', function() { + this.bv.updateOption('id', 'id', 'country', 'CN'); + + // Valid samples + var validSamples = ['450202201409072332', '22011219930407001X', '110108601017023']; + for (var i in validSamples) { + this.bv.resetForm(); + this.$id.val(validSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + } + + // Invalid samples + var invalidSamples = ['999999199304070016', '220112190002290016', '220112199304070019', '999999601017023', '110108999999023']; + for (i in invalidSamples) { + this.bv.resetForm(); + this.$id.val(invalidSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + } + }); + + it('Czech national identification number (RC)', function() { + this.bv.updateOption('id', 'id', 'country', 'CZ'); + + // Valid samples + var validSamples = ['7103192745', '991231123']; + for (var i in validSamples) { + this.bv.resetForm(); + this.$id.val(validSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + } + + // Invalid samples + var invalidSamples = ['1103492745', '590312123']; + for (i in invalidSamples) { + this.bv.resetForm(); + this.$id.val(invalidSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + } + }); + + it('Danish Personal Identification number (CPR)', function() { + this.bv.updateOption('id', 'id', 'country', 'DK'); + + // Valid samples + var validSamples = ['2110625629', '211062-5629']; + for (var i in validSamples) { + this.bv.resetForm(); + this.$id.val(validSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + } + + // Invalid samples + var invalidSamples = ['511062-5629']; + for (i in invalidSamples) { + this.bv.resetForm(); + this.$id.val(invalidSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + } + }); + + it('Estonian Personal Identification Code (isikukood)', function() { + this.bv.updateOption('id', 'id', 'country', 'EE'); + + // Valid samples + var validSamples = ['37605030299']; + for (var i in validSamples) { + this.bv.resetForm(); + this.$id.val(validSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + } + }); + + it('Spanish personal identity code (DNI/NIE)', function() { + this.bv.updateOption('id', 'id', 'country', 'ES'); + + // Valid samples + var validSamples = ['54362315K', '54362315-K', 'X2482300W', 'X-2482300W', 'X-2482300-W']; + for (var i in validSamples) { + this.bv.resetForm(); + this.$id.val(validSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + } + + // Invalid samples + var invalidSamples = ['54362315Z', 'X-2482300A']; + for (i in invalidSamples) { + this.bv.resetForm(); + this.$id.val(invalidSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + } + }); + + it('Finnish Personal Identity Code (HETU)', function() { + this.bv.updateOption('id', 'id', 'country', 'FI'); + + // Valid samples + var validSamples = ['311280-888Y', '131052-308T']; + for (var i in validSamples) { + this.bv.resetForm(); + this.$id.val(validSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + } + + // Invalid samples + var invalidSamples = ['131052-308U', '310252-308Y']; + for (i in invalidSamples) { + this.bv.resetForm(); + this.$id.val(invalidSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + } + }); + + it('Croatian personal identification number (OIB)', function() { + this.bv.updateOption('id', 'id', 'country', 'HR'); + + // Valid samples + var validSamples = ['33392005961']; + for (var i in validSamples) { + this.bv.resetForm(); + this.$id.val(validSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + } + + // Invalid samples + var invalidSamples = ['33392005962']; + for (i in invalidSamples) { + this.bv.resetForm(); + this.$id.val(invalidSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + } + }); + + it('Irish Personal Public Service Number (PPS)', function() { + this.bv.updateOption('id', 'id', 'country', 'IE'); + + // Valid samples + var validSamples = ['6433435F', '6433435FT', '6433435FW', '6433435OA', '6433435IH', '1234567TW', '1234567FA']; + for (var i in validSamples) { + this.bv.resetForm(); + this.$id.val(validSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + } + + // Invalid samples + var invalidSamples = ['6433435E', '6433435VH']; + for (i in invalidSamples) { + this.bv.resetForm(); + this.$id.val(invalidSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + } + }); + + it('Iceland national identification number (Kennitala)', function() { + this.bv.updateOption('id', 'id', 'country', 'IS'); + + // Valid samples + var validSamples = ['120174-3399', '1201743399', '0902862349']; + for (var i in validSamples) { + this.bv.resetForm(); + this.$id.val(validSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + } + }); + + it('Lithuanian Personal Code (Asmens kodas)', function() { + this.bv.updateOption('id', 'id', 'country', 'LT'); + + // Valid samples + var validSamples = ['38703181745']; + for (var i in validSamples) { + this.bv.resetForm(); + this.$id.val(validSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + } + + // Invalid samples + var invalidSamples = ['38703181746', '78703181745', '38703421745']; + for (i in invalidSamples) { + this.bv.resetForm(); + this.$id.val(invalidSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + } + }); + + it('Latvian Personal Code (Personas kods)', function() { + this.bv.updateOption('id', 'id', 'country', 'LV'); + + // Valid samples + var validSamples = ['161175-19997', '16117519997']; + for (var i in validSamples) { + this.bv.resetForm(); + this.$id.val(validSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + } + + // Invalid samples + var invalidSamples = ['161375-19997']; + for (i in invalidSamples) { + this.bv.resetForm(); + this.$id.val(invalidSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + } + }); + + it('Dutch national identification number (BSN)', function() { + this.bv.updateOption('id', 'id', 'country', 'NL'); + + // Valid samples + var validSamples = ['111222333', '941331490', '9413.31.490']; + for (var i in validSamples) { + this.bv.resetForm(); + this.$id.val(validSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + } + + // Invalid samples + var invalidSamples = ['111252333']; + for (i in invalidSamples) { + this.bv.resetForm(); + this.$id.val(invalidSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + } + }); + + it('Romanian numerical personal code (CNP)', function() { + this.bv.updateOption('id', 'id', 'country', 'RO'); + + // Valid samples + var validSamples = ['1630615123457', '1800101221144']; + for (var i in validSamples) { + this.bv.resetForm(); + this.$id.val(validSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + } + + // Invalid samples + var invalidSamples = ['8800101221144', '1632215123457', '1630615123458']; + for (i in invalidSamples) { + this.bv.resetForm(); + this.$id.val(invalidSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + } + }); + + it('Swedish personal identity number (personnummer)', function() { + this.bv.updateOption('id', 'id', 'country', 'SE'); + + // Valid samples + var validSamples = ['8112289874', '811228-9874', '811228+9874']; + for (var i in validSamples) { + this.bv.resetForm(); + this.$id.val(validSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + } + + // Invalid samples + var invalidSamples = ['811228-9873']; + for (i in invalidSamples) { + this.bv.resetForm(); + this.$id.val(invalidSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + } + }); + + it('Slovak national identifier number (RC)', function() { + this.bv.updateOption('id', 'id', 'country', 'SK'); + + // Valid samples + var validSamples = ['7103192745', '991231123']; + for (var i in validSamples) { + this.bv.resetForm(); + this.$id.val(validSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + } + + // Invalid samples + var invalidSamples = ['7103192746', '1103492745']; + for (i in invalidSamples) { + this.bv.resetForm(); + this.$id.val(invalidSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + } + }); + + it('South African ID', function() { + this.bv.updateOption('id', 'id', 'country', 'ZA'); + + // Valid samples + var validSamples = ['8001015009087']; + for (var i in validSamples) { + this.bv.resetForm(); + this.$id.val(validSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + } + + // Invalid samples + var invalidSamples = ['8001015009287', '8001015009086']; + for (i in invalidSamples) { + this.bv.resetForm(); + this.$id.val(invalidSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + } + }); + + it('Thailand citizen number', function() { + this.bv.updateOption('id', 'id', 'country', 'TH'); + + // Valid samples + var validSamples = ['7145620509547', '3688699975685', '2368719339716']; + for (var i in validSamples) { + this.bv.resetForm(); + this.$id.val(validSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + } + + // Invalid samples + var invalidSamples = ['1100800092310']; + for (i in invalidSamples) { + this.bv.resetForm(); + this.$id.val(invalidSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + } + }); +}); diff --git a/test/spec/validator/imo.js b/test/spec/validator/imo.js new file mode 100644 index 000000000..6a8e5c2af --- /dev/null +++ b/test/spec/validator/imo.js @@ -0,0 +1,48 @@ +describe('imo', function() { + beforeEach(function() { + $([ + '
      ', + '
      ', + '', + '
      ', + '
      ' + ].join('\n')).appendTo('body'); + + $('#imoForm').bootstrapValidator(); + + this.bv = $('#imoForm').data('bootstrapValidator'); + this.$imo = this.bv.getFieldElements('imo'); + }); + + afterEach(function() { + $('#imoForm').bootstrapValidator('destroy').remove(); + }); + + it('Valid IMO (upper)', function() { + this.bv.resetForm(); + this.$imo.val('IMO 9074729'); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + }); + + it('Valid IMO (lower)', function() { + this.bv.resetForm(); + this.$imo.val('imo 9074729'); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + }); + + it('Invalid IMO (bad format)', function() { + this.bv.resetForm(); + this.$imo.val('9074729'); + this.bv.validate(); + expect(this.bv.isValid()).toBeFalsy(); + }); + + it('Invalid IMO (bad check digit)', function() { + this.bv.resetForm(); + this.$imo.val('IMO 9074728'); + this.bv.validate(); + expect(this.bv.isValid()).toBeFalsy(); + }); +}); diff --git a/test/spec/validator/ip.js b/test/spec/validator/ip.js new file mode 100644 index 000000000..2905e112f --- /dev/null +++ b/test/spec/validator/ip.js @@ -0,0 +1,154 @@ +describe('ip', function() { + beforeEach(function() { + $([ + '
      ', + '
      ', + '', + '
      ', + '
      ', + '', + '
      ', + '
      ', + '', + '
      ', + '
      ' + ].join('\n')).appendTo('body'); + + $('#ipForm').bootstrapValidator(); + + this.bv = $('#ipForm').data('bootstrapValidator'); + this.$ipv4 = this.bv.getFieldElements('ipv4'); + this.$ipv6 = this.bv.getFieldElements('ipv6'); + this.$both = this.bv.getFieldElements('both'); + }); + + afterEach(function() { + $('#ipForm').bootstrapValidator('destroy').remove(); + }); + + it('Valid ipv4', function() { + this.$ipv4.val('0.0.0.0'); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + + this.bv.resetForm(); + this.$ipv4.val('192.168.1.1'); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + + this.bv.resetForm(); + this.$ipv4.val('255.255.255.255'); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + }); + + it('Invalid ipv4', function() { + this.$ipv4.val('10.168.0001.100'); // extra 0 not allowed + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + + this.bv.resetForm(); + this.$ipv4.val('0.0.0.256'); // 256 not allowed, max is 255 + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + + this.bv.resetForm(); + this.$ipv4.val('256.255.255.255'); // max is 255.255.255.255 + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + + this.bv.resetForm(); + this.$ipv4.val('192.168. 224.0'); // internal space + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + + this.bv.resetForm(); + this.$ipv4.val('192.168.224.0 1'); // junk after valid address + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + }); + + it('Valid ipv6', function() { + this.$ipv6.val('0000:0000:0000:0000:0000:0000:0000:0000'); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + + this.bv.resetForm(); + this.$ipv6.val('fe00::1'); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + + this.bv.resetForm(); + this.$ipv6.val('fe80::217:f2ff:fe07:ed62'); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + + this.bv.resetForm(); + this.$ipv6.val('ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff'); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + }); + + it('Invalid ipv6', function() { + this.$ipv6.val('02001:0000:1234:0000:0000:C1C0:ABCD:0876'); // extra 0 not allowed + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + + this.bv.resetForm(); + this.$ipv6.val('2001:0000:1234:0000:00001:C1C0:ABCD:0876'); // extra 0 not allowed + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + + this.bv.resetForm(); + this.$ipv6.val('2001:0000:1234: 0000:0000:C1C0:ABCD:0876'); // internal space + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + + this.bv.resetForm(); + this.$ipv6.val('2001:0000:1234:0000:0000:C1C0:ABCD:0876 0'); // junk after valid address + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + + this.bv.resetForm(); + this.$ipv6.val('3ffe:0b00:0000:0001:0000:0000:000a'); // seven segment + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + + this.bv.resetForm(); + this.$ipv6.val('FF02:0000:0000:0000:0000:0000:0000:0000:0001'); // nine segment + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + + this.bv.resetForm(); + this.$ipv6.val('::1111:2222:3333:4444:5555:6666::'); // double "::" + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + + this.bv.resetForm(); + this.$ipv6.val('3ffe:b00::1::a'); // double "::" + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + }); + + it('Both', function() { + this.$both.val('255.255.255.255'); // valid + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + + this.bv.resetForm(); + this.$both.val('256.0.0.0'); // 256 not allowed, max is 255 + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + + this.bv.resetForm(); + this.$both.val('2001:0db8:0000:85a3:0000:0000:ac1f:8001'); // valid + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + + this.bv.resetForm(); + this.$both.val('2001:0000:1234:0000:0000:C1C0:ABCD:0876 0'); // junk after valid address + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + }); + +}); \ No newline at end of file diff --git a/test/spec/validator/isbn.js b/test/spec/validator/isbn.js new file mode 100644 index 000000000..5f3d204e8 --- /dev/null +++ b/test/spec/validator/isbn.js @@ -0,0 +1,70 @@ +describe('isbn', function() { + beforeEach(function() { + var html = [ + '
      ', + '
      ', + '
      ', + '', + '
      ', + '
      ', + '
      ' + ].join('\n'); + + $(html).appendTo('body'); + $('#isbnForm').bootstrapValidator(); + + this.bv = $('#isbnForm').data('bootstrapValidator'); + this.$isbn = this.bv.getFieldElements('isbn'); + }); + + afterEach(function() { + $('#isbnForm').bootstrapValidator('destroy').parent().remove(); + }); + + it('isbn10 hyphen', function() { + var samples = ['99921-58-10-7', '9971-5-0210-0', '960-425-059-0', '80-902734-1-6']; + + for (var i in samples) { + this.$isbn.val(samples[i]); + this.bv.validate(); + expect(this.bv.isValidField('isbn')).toBeTruthy(); + } + }); + + it('isbn10 space', function() { + var samples = ['85 359 0277 5', '1 84356 028 3', '0 684 84328 5', '0 85131 041 9', '0 943396 04 2']; + + for (var i in samples) { + this.$isbn.val(samples[i]); + this.bv.validate(); + expect(this.bv.isValidField('isbn')).toBeTruthy(); + } + }); + + it('isbn10 hyphen with X', function() { + var samples = ['0-8044-2957-X', '0-9752298-0-X']; + for (var i in samples) { + this.$isbn.val(samples[i]); + this.bv.validate(); + expect(this.bv.isValidField('isbn')).toBeTruthy(); + } + }); + + it('isbn10 invalid check digit', function() { + this.$isbn.val('99921-58-10-6'); + this.bv.validate(); + expect(this.bv.isValidField('isbn')).toEqual(false); + }); + + it('isbn13', function() { + this.$isbn.val('978-0-306-40615-7'); + this.bv.validate(); + expect(this.bv.isValidField('isbn')).toBeTruthy(); + }); + + it('isbn13 invalid check digit', function() { + this.$isbn.val('978-0-306-40615-6'); + this.bv.validate(); + expect(this.bv.isValidField('isbn')).toEqual(false); + }); +}); diff --git a/test/spec/validator/isin.js b/test/spec/validator/isin.js new file mode 100644 index 000000000..9618448c9 --- /dev/null +++ b/test/spec/validator/isin.js @@ -0,0 +1,57 @@ +describe('isin', function() { + beforeEach(function() { + var html = [ + '
      ', + '
      ', + '
      ', + '', + '
      ', + '
      ', + '
      ' + ].join('\n'); + + $(html).appendTo('body'); + $('#isinForm').bootstrapValidator(); + + this.bv = $('#isinForm').data('bootstrapValidator'); + this.$isin = this.bv.getFieldElements('isin'); + }); + + afterEach(function() { + $('#isinForm').bootstrapValidator('destroy').parent().remove(); + }); + + it('valid', function() { + var samples = ['US0378331005', 'AU0000XVGZA3', 'GB0002634946']; + + for (var i in samples) { + this.$isin.val(samples[i]); + this.bv.validate(); + expect(this.bv.isValidField('isin')).toBeTruthy(); + } + }); + + it('invalid country code', function() { + this.$isin.val('AA0000XVGZA3'); + this.bv.validate(); + expect(this.bv.isValidField('isin')).toEqual(false); + }); + + it('contains only digits and alphabet', function() { + this.$isin.val('US12345ABC@#$'); + this.bv.validate(); + expect(this.bv.isValidField('isin')).toEqual(false); + }); + + it('invalid length', function() { + this.$isin.val('US1234567'); + this.bv.validate(); + expect(this.bv.isValidField('isin')).toEqual(false); + }); + + it('invalid check digit', function() { + this.$isin.val('US0378331004'); + this.bv.validate(); + expect(this.bv.isValidField('isin')).toEqual(false); + }); +}); diff --git a/test/spec/validator/ismn.js b/test/spec/validator/ismn.js new file mode 100644 index 000000000..134fc412e --- /dev/null +++ b/test/spec/validator/ismn.js @@ -0,0 +1,59 @@ +describe('ismn', function() { + beforeEach(function() { + var html = [ + '
      ', + '
      ', + '
      ', + '', + '
      ', + '
      ', + '
      ' + ].join('\n'); + + $(html).appendTo('body'); + $('#ismnForm').bootstrapValidator(); + + this.bv = $('#ismnForm').data('bootstrapValidator'); + this.$ismn = this.bv.getFieldElements('ismn'); + }); + + afterEach(function() { + $('#ismnForm').bootstrapValidator('destroy').parent().remove(); + }); + + it('valid start with M', function() { + this.$ismn.val('M230671187'); + this.bv.validate(); + expect(this.bv.isValidField('ismn')).toBeTruthy(); + }); + + it('valid start with 979', function() { + this.$ismn.val('9790060115615'); + this.bv.validate(); + expect(this.bv.isValidField('ismn')).toBeTruthy(); + }); + + it('valid contains spaces', function() { + this.$ismn.val('979 0 3452 4680 5'); + this.bv.validate(); + expect(this.bv.isValidField('ismn')).toBeTruthy(); + }); + + it('valid contains dashes', function() { + this.$ismn.val('979-0-0601-1561-5'); + this.bv.validate(); + expect(this.bv.isValidField('ismn')).toBeTruthy(); + }); + + it('invalid format', function() { + this.$ismn.val('N123456789'); + this.bv.validate(); + expect(this.bv.isValidField('ismn')).toEqual(false); + }); + + it('invalid check digit', function() { + this.$ismn.val('9790060115614'); + this.bv.validate(); + expect(this.bv.isValidField('ismn')).toEqual(false); + }); +}); diff --git a/test/spec/validator/issn.js b/test/spec/validator/issn.js new file mode 100644 index 000000000..b009b698c --- /dev/null +++ b/test/spec/validator/issn.js @@ -0,0 +1,51 @@ +describe('issn', function() { + beforeEach(function() { + var html = [ + '
      ', + '
      ', + '
      ', + '', + '
      ', + '
      ', + '
      ' + ].join('\n'); + + $(html).appendTo('body'); + $('#issnForm').bootstrapValidator(); + + this.bv = $('#issnForm').data('bootstrapValidator'); + this.$issn = this.bv.getFieldElements('issn'); + }); + + afterEach(function() { + $('#issnForm').bootstrapValidator('destroy').parent().remove(); + }); + + it('valid', function() { + var samples = ['0378-5955', '0024-9319', '0032-1478']; + + for (var i in samples) { + this.$issn.val(samples[i]); + this.bv.validate(); + expect(this.bv.isValidField('issn')).toBeTruthy(); + } + }); + + it('not contains hyphen', function() { + this.$issn.val('03785955'); + this.bv.validate(); + expect(this.bv.isValidField('issn')).toEqual(false); + }); + + it('contains only digits, X', function() { + this.$issn.val('1234-566A'); + this.bv.validate(); + expect(this.bv.isValidField('issn')).toEqual(false); + }); + + it('invalid check sum', function() { + this.$issn.val('0032-147X'); + this.bv.validate(); + expect(this.bv.isValidField('issn')).toEqual(false); + }); +}); diff --git a/test/spec/validator/lessThan.js b/test/spec/validator/lessThan.js new file mode 100644 index 000000000..623346c44 --- /dev/null +++ b/test/spec/validator/lessThan.js @@ -0,0 +1,137 @@ +function lessThanCompare() { + var compareTo = $('#lessThanForm').find('[name="maxAge"]').val(); + $('#msg').html('lessThanCompare() called; compare to ' + compareTo); + return compareTo; +}; + +TestSuite = $.extend({}, TestSuite, { + lessThan: { + compareTo: function(value, validator, $field) { + var compareTo = $('#lessThanForm').find('[name="maxAge"]').val(); + $('#msg').html('TestSuite.lessThan.compareTo() called; compare to ' + compareTo); + return compareTo; + } + } +}); + +describe('lessThan', function() { + beforeEach(function() { + $([ + '
      ', + '
      ', + '
      ', + '', + '
      ', + '
      ', + '', + '
      ', + '
      ' + ].join('\n')).appendTo('body'); + + $('#lessThanForm').bootstrapValidator(); + + this.bv = $('#lessThanForm').data('bootstrapValidator'); + this.$maxAge = this.bv.getFieldElements('maxAge'); + this.$age = this.bv.getFieldElements('age'); + }); + + afterEach(function() { + $('#lessThanForm').bootstrapValidator('destroy').remove(); + }); + + it('not a number', function() { + this.$age.val('20abc'); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + }); + + it('value with comma separator', function() { + this.$age.val('120,2234'); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + + this.bv.resetForm(); + this.$age.val('30,2234'); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + }); + + it('compare to value', function() { + this.$age.val(120); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + + this.bv.resetForm(); + this.$age.val(30); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + }); + + it('compare to other field', function() { + this.bv.updateOption('age', 'lessThan', 'value', 'maxAge'); + + this.$maxAge.val(40); + this.$age.val(20); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + + this.bv.resetForm(); + this.$maxAge.val(20); + this.$age.val(30); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + expect(this.bv.getMessages('age', 'lessThan')[0]).toEqual($.fn.bootstrapValidator.helpers.format($.fn.bootstrapValidator.i18n.lessThan['default'], this.$maxAge.val())); + }); + + // #1048 + it('compare to other field that value has comma', function() { + this.bv.updateOption('age', 'lessThan', 'value', 'maxAge'); + this.$maxAge.val('30,5'); + this.$age.val(20); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + + this.bv.resetForm(); + this.$maxAge.val('20,5'); + this.$age.val(30); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + expect(this.bv.getMessages('age', 'lessThan')[0]).toEqual($.fn.bootstrapValidator.helpers.format($.fn.bootstrapValidator.i18n.lessThan['default'], this.$maxAge.val())); + }); + + it('compare to return value of a function', function() { + this.bv.updateOption('age', 'lessThan', 'value', 'lessThanCompare'); + + this.$maxAge.val(50); + this.$age.val(60); + this.bv.validate(); + expect($('#msg').html()).toEqual('lessThanCompare() called; compare to 50'); + expect(this.bv.isValid()).toEqual(false); + expect(this.bv.getMessages('age', 'lessThan')[0]).toEqual($.fn.bootstrapValidator.helpers.format($.fn.bootstrapValidator.i18n.lessThan['default'], this.$maxAge.val())); + + this.bv.resetForm(); + this.$maxAge.val(60); + this.$age.val(30); + this.bv.validate(); + expect($('#msg').html()).toEqual('lessThanCompare() called; compare to 60'); + expect(this.bv.isValid()).toBeTruthy(); + }); + + it('compare to return value of a namespace function', function() { + this.bv.updateOption('age', 'lessThan', 'value', 'TestSuite.lessThan.compareTo'); + + this.$maxAge.val(50); + this.$age.val(60); + this.bv.validate(); + expect($('#msg').html()).toEqual('TestSuite.lessThan.compareTo() called; compare to 50'); + expect(this.bv.isValid()).toEqual(false); + expect(this.bv.getMessages('age', 'lessThan')[0]).toEqual($.fn.bootstrapValidator.helpers.format($.fn.bootstrapValidator.i18n.lessThan['default'], this.$maxAge.val())); + + this.bv.resetForm(); + this.$maxAge.val(60); + this.$age.val(30); + this.bv.validate(); + expect($('#msg').html()).toEqual('TestSuite.lessThan.compareTo() called; compare to 60'); + expect(this.bv.isValid()).toBeTruthy(); + }); +}); diff --git a/test/spec/validator/meid.js b/test/spec/validator/meid.js new file mode 100644 index 000000000..9ef1b6485 --- /dev/null +++ b/test/spec/validator/meid.js @@ -0,0 +1,132 @@ +describe('meid', function() { + beforeEach(function() { + $([ + '
      ', + '
      ', + '', + '
      ', + '
      ' + ].join('\n')).appendTo('body'); + + $('#meidForm').bootstrapValidator(); + + this.bv = $('#meidForm').data('bootstrapValidator'); + this.$meid = this.bv.getFieldElements('meid'); + }); + + afterEach(function() { + $('#meidForm').bootstrapValidator('destroy').remove(); + }); + + it('Valid MEID (14 hex, check digit)', function() { + this.bv.resetForm(); + this.$meid.val('A00000049259B16'); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + }); + + it('Valid MEID (14 hex, dashes, check digit)', function() { + this.bv.resetForm(); + this.$meid.val('A0-000004-9259B1-6'); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + }); + + it('Valid MEID (14 hex, spaces, check digit)', function() { + this.bv.resetForm(); + this.$meid.val('A0 000004 9259B1 6'); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + }); + + it('Valid MEID (18 dec, check digit)', function() { + this.bv.resetForm(); + this.$meid.val('2936087365007037100'); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + }); + + it('Valid MEID (18 dec, dashes, check digit)', function() { + this.bv.resetForm(); + this.$meid.val('29360-87365-0070-3710-0'); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + }); + + it('Valid MEID (18 dec, spaces, check digit)', function() { + this.bv.resetForm(); + this.$meid.val('29360 87365 0070 3710 0'); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + }); + + it('Valid MEID (14 hex)', function() { + this.bv.resetForm(); + this.$meid.val('AF0123450ABCDE'); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + }); + + it('Valid MEID (14 hex, dashes)', function() { + this.bv.resetForm(); + this.$meid.val('AF-012345-0ABCDE'); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + }); + + it('Valid MEID (14 hex, spaces)', function() { + this.bv.resetForm(); + this.$meid.val('AF 012345 0ABCDE'); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + }); + + it('Valid MEID (18 dec)', function() { + this.bv.resetForm(); + this.$meid.val('293608736500703710'); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + }); + + it('Valid MEID (18 dec, dashes)', function() { + this.bv.resetForm(); + this.$meid.val('29360-87365-0070-3710'); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + }); + + it('Valid MEID (18 dec, spaces)', function() { + this.bv.resetForm(); + this.$meid.val('29360 87365 0070 3710'); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + }); + + it('Invalid MEID (14 hex, bad check digit)', function() { + this.bv.resetForm(); + this.$meid.val('A00000049259B15'); + this.bv.validate(); + expect(this.bv.isValid()).toBeFalsy(); + }); + + it('Invalid MEID (13 hex)', function() { + this.bv.resetForm(); + this.$meid.val('A00000049259B'); + this.bv.validate(); + expect(this.bv.isValid()).toBeFalsy(); + }); + + it('Invalid MEID (18 dec, bad check digit)', function() { + this.bv.resetForm(); + this.$meid.val('2936087365007037101'); + this.bv.validate(); + expect(this.bv.isValid()).toBeFalsy(); + }); + + it('Invalid MEID (17 dec)', function() { + this.bv.resetForm(); + this.$meid.val('29360873650070371'); + this.bv.validate(); + expect(this.bv.isValid()).toBeFalsy(); + }); +}); diff --git a/test/spec/validator/phone.js b/test/spec/validator/phone.js new file mode 100644 index 000000000..ca4f85cf2 --- /dev/null +++ b/test/spec/validator/phone.js @@ -0,0 +1,349 @@ +describe('phone', function() { + beforeEach(function() { + $([ + '
      ', + '
      ', + '', + '
      ', + '
      ', + '', + '
      ', + '
      ', + ].join('\n')).appendTo('body'); + + $('#phoneForm').bootstrapValidator(); + + /** + * @type {BootstrapValidator} + */ + this.bv = $('#phoneForm').data('bootstrapValidator'); + this.$country = this.bv.getFieldElements('country'); + this.$phone = this.bv.getFieldElements('phone'); + }); + + afterEach(function() { + $('#phoneForm').bootstrapValidator('destroy').remove(); + }); + + it('dynamic country', function() { + this.$phone.attr('data-bv-phone-country', 'country'); + this.bv.destroy(); + this.bv = $('#phoneForm').bootstrapValidator().data('bootstrapValidator'); + + this.$country.val('BR'); + this.$phone.val('16920894635'); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + + this.bv.resetForm(); + this.$country.val('FR'); + this.$phone.val('0644444444'); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + + this.bv.resetForm(); + this.$country.val('GB'); + this.$phone.val('012345678900'); + this.bv.validate(); + expect(this.bv.isValid()).toBeFalsy(); + }); + + it('Brazil phone number', function() { + this.bv.updateOption('phone', 'phone', 'country', 'BR'); + + // Valid samples + var validSamples = [ + '0800.000.00.00', '0800-000-00-00', '0800 000 00 00', '0800-00-00-00', '0800.00.00.00', '0800 00 00 00', + '0800-000-0000', '0800 000 0000', '0800.000.0000', '08000000000', + '1692089-4635', '16920894635', '16992089-4635', '16 99202-4635', '(16)99202-4635', '(16)92089-4635', + '(16) 92089-4635', '(15) 4343-4343', '+55 15 3702-7523', '(+55) 15 3702-7523', '(+55)1537027523', + '(+55)(15)3702-7523', '(+55) 15 3702-7523', '(+55) 15 99202-7523', '99202-4635', '(16) 9208-4635' + ]; + for (var i in validSamples) { + this.bv.resetForm(); + this.$phone.val(validSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + } + }); + + it('China phone number', function() { + this.bv.updateOption('phone', 'phone', 'country', 'CN'); + + // Valid samples + var validSamples = [ + '18911111111', '189 1111 1111', '189-1111-1111', '0086-18911111111', '+86-18911111111', + '86-18911111111', '0086 18911111111', '+86 18911111111', '86 18911111111', '0086 189-1111-1111', + '+86 189-1111-1111', '86 189-1111-1111', '02011111111', '020-11111111', '020 11111111', + '020 1111 1111', '020-1111-1111', '0086 020 82803159', '0086-020-82803159', '0086-020-82803159', + '+86 20 61302222-8866', '+86 20 6130-2222-8866', '+86 10 59081185' + ]; + for (var i in validSamples) { + this.bv.resetForm(); + this.$phone.val(validSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + } + }); + + it('Czech Republic phone number', function() { + this.bv.updateOption('phone', 'phone', 'country', 'CZ'); + + // Valid samples + var validSamples = [ + '00420123456789', '00420 123456789', '00420 123 456 789', '00 420 123 456 789', + '+420123456789', '+420 123456789', '+420 123 456 789', '123456789', '123 456 789' + ]; + for (var i in validSamples) { + this.bv.resetForm(); + this.$phone.val(validSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + } + + // Invalid samples + var invalidSamples = [ + '420123456789', '420 123456789', '420 123 456 789', '00421123456789', '00421 123456789', + '00421 123 456 789', '00 421 123 456 789', '+421123456789', '+421 123456789', + '+421 123 456 789' + ]; + for (i in invalidSamples) { + this.bv.resetForm(); + this.$phone.val(invalidSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + } + }); + + it('France phone number', function() { + this.bv.updateOption('phone', 'phone', 'country', 'FR'); + + // Valid samples + var validSamples = [ + // National formats + '0644444444', '06 44 44 44 44', '06-44-44-44-44', '06.44.44.44.44', + // International formats + '+33644444444', '+336.44.44.44.44', '+33 6.44.44.44.44', '0033644444444', '00336.44.44.44.44', + '0033 6.44.44.44.44', + // Some times + '+33(0)644444444', '+33 (0) 644444444' + ]; + for (var i in validSamples) { + this.bv.resetForm(); + this.$phone.val(validSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + } + + // Invalid samples + var invalidSamples = [ + // The separator between pairs of digits is not the same + '06 44.44-44.44', '06 44 44-44.44', '06 44 44-4444', '06 44 44-4444', + // Too many digits + '06444444444444', + // Missing leading 0 + '6644444444', + // Too much non-numeric characters + '06 44.44-44.44', '+33 (0) 644444444', + // Bad parenthesis + '(0)644444444', + // Bad separator after the international prefix + '+33-(0)-644444444', '+33 (0)-644444444', '+33-(0) 644444444', + // Trailing separator + '06.44.44.44.44.' + ]; + for (i in invalidSamples) { + this.bv.resetForm(); + this.$phone.val(invalidSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + } + }); + + it('Germany phone number', function() { + this.bv.updateOption('phone', 'phone', 'country', 'DE'); + + // Valid samples + var validSamples = ['+49(89)123456', '089-1234567', '0891234567', '0049-89-123456', '089 123456-78']; + for (var i in validSamples) { + this.bv.resetForm(); + this.$phone.val(validSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + } + }); + + it('United Kingdom phone number', function() { + this.bv.updateOption('phone', 'phone', 'country', 'GB'); + + // Valid samples + var validSamples = [ + // National formats + '01611234567', '0161 123 4567', '(0161) 123 4567', '0161-123-4567', + // International formats + '+44 161 123 4567', '+441611234567', '+44(0)161234567', '00 44 161 1234567', '(011) 44 161 234567', '0161-158-5587', + // Extensions + '0161 123 4567 ext. 123', '01611234567x123', '+44161234567x123', '+44 (0) 161 1234567 ext 123' + ]; + for (var i in validSamples) { + this.bv.resetForm(); + this.$phone.val(validSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + } + + // Invalid samples + var invalidSamples = [ + '012345678900', // Too many digits + '1611234567', // Missing trunk + '012345678', // Not enough digits + '123 4567', // Missing area code + '061 123 4567' // Invalid area code + ]; + for (i in invalidSamples) { + this.bv.resetForm(); + this.$phone.val(invalidSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + } + }); + + it('Morocco phone number', function() { + this.bv.updateOption('phone', 'phone', 'country', 'MA'); + + // Valid samples + var validSamples = [ + // National formats + '0644444444', '0610245896', '0630548564', '06 44 44 44 44', '06-44-44-44-44', '06.44.44.44.44', '06 44.44-44.44', + '0528254856', '0535484541', '05 28 44 44 44', '05-28-44.44.44', '05.28.44.44.44', '05 28.44-44.44', + // International formats + '+212644444444', '+2126.44.44.44.44', '+212 6.44.44.44.44', '00212644444444', '002126.44.44.44.44', '00212 6.44.44.44.44', + // Some times + '+212(0)644444444', '+212 (0) 644444444' + ]; + for (var i in validSamples) { + this.bv.resetForm(); + this.$phone.val(validSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + } + + // Invalid samples + var invalidSamples = [ + '0625468961', '0512548632', '0542564896', // Not a valid phone numbers + '06444444444444', // Too many digits + '6644444444', // Missing leading 0 + '06 44.44-44.44', '+212 (0) 644444444', // Too much non-numeric characters + '(0)644444444' // Bad parenthesis + ]; + for (i in invalidSamples) { + this.bv.resetForm(); + this.$phone.val(invalidSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + } + }); + + it('Pakistan phone number', function() { + this.bv.updateOption('phone', 'phone', 'country', 'PK'); + + // Valid samples + var validSamples = ['03336527366']; + for (var i in validSamples) { + this.bv.resetForm(); + this.$phone.val(validSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + } + }); + + it('Romania phone number', function() { + this.bv.updateOption('phone', 'phone', 'country', 'RO'); + + // Valid samples + var validSamples = [ + '+40213-564-864', '+40213.564.864', '+40213 564 864', '0213-564-864', + '0213564864', '0313564864', + '0720512346', '0730512346', '0740512346', '0750512346', '+40750512346', '+40750.512.346', + '0760512346', '0770512346', '0780512346' + ]; + for (var i in validSamples) { + this.bv.resetForm(); + this.$phone.val(validSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + } + + // Invalid samples + var invalidSamples = [ + '0213/564/864', // Invalid separator + '0413564864', // Invalid land line number (The valid one should be +402, +403 or inside country 02 - 03) + '0790512346' // Invalid mobile phone number (The valid one is 072xxxxxxx - 078xxxxxxx) + ]; + for (i in invalidSamples) { + this.bv.resetForm(); + this.$phone.val(invalidSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + } + }); + + it('Russia phone number', function() { + this.bv.updateOption('phone', 'phone', 'country', 'RU'); + + // Valid samples + var validSamples = ['+7(911)976-91-04']; + for (var i in validSamples) { + this.bv.resetForm(); + this.$phone.val(validSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + } + }); + + it('Slovakia phone number', function() { + this.bv.updateOption('phone', 'phone', 'country', 'SK'); + + // Valid samples + var validSamples = [ + '00420123456789', '00420 123456789', '00420 123 456 789', '00 420 123 456 789', + '+420123456789', '+420 123456789', '+420 123 456 789', '123456789', '123 456 789' + ]; + for (var i in validSamples) { + this.bv.resetForm(); + this.$phone.val(validSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + } + + // Invalid samples + var invalidSamples = [ + '420123456789', '420 123456789', '420 123 456 789', '00421123456789', '00421 123456789', + '00421 123 456 789', '00 421 123 456 789', '+421123456789', '+421 123456789', + '+421 123 456 789' + ]; + for (i in invalidSamples) { + this.bv.resetForm(); + this.$phone.val(invalidSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + } + }); +}); diff --git a/test/spec/validator/stringLength.js b/test/spec/validator/stringLength.js new file mode 100644 index 000000000..ad8e779b4 --- /dev/null +++ b/test/spec/validator/stringLength.js @@ -0,0 +1,220 @@ +describe('stringLength', function() { + beforeEach(function() { + $([ + '
      ', + '
      ', + '', + '
      ', + '
      ', + '', + '
      ', + '
      ', + '', + '
      ', + '
      ', + '', + '
      ', + '
      ', + '', + '
      ', + '
      ', + '', + '
      ', + '
      ', + '', + '
      ', + '
      ', + '', + '
      ', + '
      ', + '', + '
      ', + '
      ', + '', + '
      ', + '
      ', + '', + '
      ', + '
      ', + '', + '
      ', + '
      ' + ].join('\n')).appendTo('body'); + + $('#stringLengthForm').bootstrapValidator(); + + this.bv = $('#stringLengthForm').data('bootstrapValidator'); + this.$textCharMaxLength = this.bv.getFieldElements('textCharMaxLength'); + this.$textareaCharMaxLength = this.bv.getFieldElements('textareaCharMaxLength'); + this.$textUTF8BytesMaxLength = this.bv.getFieldElements('textUTF8BytesMaxLength'); + this.$textareaUTF8BytesMaxLength = this.bv.getFieldElements('textareaUTF8BytesMaxLength'); + this.$textCharMinLength = this.bv.getFieldElements('textCharMinLength'); + this.$textareaCharMinLength = this.bv.getFieldElements('textareaCharMinLength'); + this.$textUTF8BytesMinLength = this.bv.getFieldElements('textUTF8BytesMinLength'); + this.$textareaUTF8BytesMinLength = this.bv.getFieldElements('textareaUTF8BytesMinLength'); + this.$textCharMinMaxLength = this.bv.getFieldElements('textCharMinMaxLength'); + this.$textareaCharMinMaxLength = this.bv.getFieldElements('textareaCharMinMaxLength'); + this.$textUTF8BytesMinMaxLength = this.bv.getFieldElements('textUTF8BytesMinMaxLength'); + this.$textareaUTF8BytesMinMaxLength = this.bv.getFieldElements('textareaUTF8BytesMinMaxLength'); + }); + + afterEach(function() { + $('#stringLengthForm').bootstrapValidator('destroy').remove(); + }); + + it('Valid max lengths', function() { + this.$textCharMaxLength.val('123456789♥'); + this.$textareaCharMaxLength.val('123456789♥'); + this.$textUTF8BytesMaxLength.val('1234567♥'); + this.$textareaUTF8BytesMaxLength.val('1234567♥'); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + }); + + it('Valid min lengths', function() { + this.$textCharMinLength.val('1234♥'); + this.$textareaCharMinLength.val('1234♥'); + this.$textUTF8BytesMinLength.val('12♥'); + this.$textareaUTF8BytesMinLength.val('12♥'); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + }); + + it('Valid min and max lengths', function() { + this.$textCharMinMaxLength.val('1234♥'); + this.$textareaCharMinMaxLength.val('1234♥'); + this.$textUTF8BytesMinMaxLength.val('12♥'); + this.$textareaUTF8BytesMinMaxLength.val('12♥'); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + + this.bv.resetForm(); + this.$textCharMinMaxLength.val('123456789♥'); + this.$textareaCharMinMaxLength.val('123456789♥'); + this.$textUTF8BytesMinMaxLength.val('1234567♥'); + this.$textareaUTF8BytesMinMaxLength.val('1234567♥'); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + }); + + it('Invalid max lengths', function() { + this.$textCharMaxLength.val('1234567890♥'); // 11 chars when max is 10 + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + + this.bv.resetForm(); + this.$textareaCharMaxLength.val('1234567890♥'); // 11 chars when max is 10 + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + + this.bv.resetForm(); + this.$textUTF8BytesMaxLength.val('12345678♥'); // 11 UTF-8 bytes when max is 10 + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + + this.bv.resetForm(); + this.$textareaUTF8BytesMaxLength.val('12345678♥'); // 11 UTF-8 bytes when max is 10 + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + }); + + it('Invalid min lengths', function() { + this.$textCharMinLength.val('123♥'); // 4 chars when min is 5 + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + + this.bv.resetForm(); + this.$textareaCharMinLength.val('123♥'); // 4 chars when min is 5 + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + + this.bv.resetForm(); + this.$textUTF8BytesMinLength.val('1♥'); // 4 UTF-8 bytes when min is 5 + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + + this.bv.resetForm(); + this.$textareaUTF8BytesMinLength.val('1♥'); // 4 UTF-8 bytes when min is 5 + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + }); + + it('Invalid min and max lengths', function() { + this.$textCharMinMaxLength.val('123♥'); // 4 chars when min is 5 and max is 10 + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + + this.bv.resetForm(); + this.$textareaCharMinMaxLength.val('123♥'); // 4 chars when min is 5 and max is 10 + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + + this.bv.resetForm(); + this.$textUTF8BytesMinMaxLength.val('1♥'); // 4 UTF-8 bytes when min is 5 and max is 10 + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + + this.bv.resetForm(); + this.$textareaUTF8BytesMinMaxLength.val('1♥'); // 4 UTF-8 bytes when min is 5 and max is 10 + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + + this.bv.resetForm(); + this.$textCharMinMaxLength.val('1234567890♥'); // 11 chars when min is 5 and max is 10 + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + + this.bv.resetForm(); + this.$textareaCharMinMaxLength.val('1234567890♥'); // 11 chars when min is 5 and max is 10 + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + + this.bv.resetForm(); + this.$textUTF8BytesMinMaxLength.val('12345678♥'); // 11 UTF-8 bytes when min is 5 and max is 10 + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + + this.bv.resetForm(); + this.$textareaUTF8BytesMinMaxLength.val('12345678♥'); // 11 UTF-8 bytes when min is 5 and max is 10 + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + }); + + it('trim option', function() { + this.bv.updateOption('textCharMaxLength', 'stringLength', 'trim', false); + this.$textCharMaxLength.val(''); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(true); + + this.bv.resetForm(); + this.$textCharMaxLength.val(' '); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + + this.bv.resetForm(); + this.$textCharMaxLength.val('1234567890 '); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + + this.bv.updateOption('textCharMaxLength', 'stringLength', 'trim', true); + this.bv.resetForm(); + this.$textCharMaxLength.val(' '); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(true); + + this.bv.resetForm(); + this.$textCharMaxLength.val(' '); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(true); + + this.bv.resetForm(); + this.$textCharMaxLength.val(' 0123456789 '); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(true); + + this.bv.resetForm(); + this.$textCharMaxLength.val(' 01234567890 '); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + }); +}); diff --git a/test/spec/validator/uri.js b/test/spec/validator/uri.js new file mode 100644 index 000000000..4ef5821ad --- /dev/null +++ b/test/spec/validator/uri.js @@ -0,0 +1,158 @@ +describe('uri', function() { + beforeEach(function() { + $([ + '
      ', + '
      ', + '
      ', + '', + '
      ', + '
      ' + ].join('\n')).appendTo('body'); + + $('#uriForm').bootstrapValidator(); + + this.bv = $('#uriForm').data('bootstrapValidator'); + this.$uri = this.bv.getFieldElements('uri'); + }); + + afterEach(function() { + $('#uriForm').bootstrapValidator('destroy').remove(); + }); + + var validGlobalURIs = [ + 'http://foo.com/blah_blah', + 'http://foo.com/blah_blah', + 'http://foo.com/blah_blah/', + 'http://foo.com/blah_blah_(wikipedia)', + 'http://foo.com/blah_blah_(wikipedia)_(again)', + 'http://www.example.com/wpstyle/?p=364', + 'https://www.example.com/foo/?bar=baz&inga=42&quux', + 'http://✪df.ws/123', + 'http://userid:password@example.com:8080', + 'http://userid:password@example.com:8080/', + 'http://userid@example.com', + 'http://userid@example.com/', + 'http://userid@example.com:8080', + 'http://userid@example.com:8080/', + 'http://userid:password@example.com', + 'http://userid:password@example.com/', + 'http://142.42.1.1/', + 'http://142.42.1.1:8080/', + 'http://➡.ws/䨹', + 'http://⌘.ws', + 'http://⌘.ws/', + 'http://foo.com/blah_(wikipedia)#cite-1', + 'http://foo.com/blah_(wikipedia)_blah#cite-1', + 'http://foo.com/unicode_(✪)_in_parens', + 'http://foo.com/(something)?after=parens', + 'http://☺.damowmow.com/', + 'http://code.google.com/events/#&product=browser', + 'http://j.mp', + 'ftp://foo.bar/baz', + 'http://foo.bar/?q=Test%20URL-encoded%20stuff', + 'http://مثال.إختبار', + 'http://例子.测试', + 'http://उदाहरण.परीक्षा', + "http://-.~_!$&'()*+,;=:%40:80%2f::::::@example.com", + 'http://1337.net', + 'http://a.b-c.de', + 'http://223.255.255.254' + ]; + + var invalidGlobalURIs = [ + 'http://', + 'http://.', + 'http://..', + 'http://../', + 'http://?', + 'http://??', + 'http://??/', + 'http://#', + 'http://##', + 'http://##/', + 'http://foo.bar?q=Spaces should be encoded', + '//', + '//a', + '///a', + '///', + 'http:///a', + 'foo.com', + 'rdar://1234', + 'h://test', + 'http:// shouldfail.com', + ':// should fail', + 'http://foo.bar/foo(bar)baz quux', + 'ftps://foo.bar/', + 'http://-error-.invalid/', + 'http://a.b--c.de/', + 'http://-a.b.co', + 'http://a.b-.co', + 'http://.www.foo.bar/', + 'http://www.foo.bar./', + 'http://.www.foo.bar./' + ]; + + var localURIs = [ + 'http://intranetsite', + 'http://intranetsite/test', + 'http://intranetsite:80', + 'http://intranetsite:80/test', + 'http://user:pass@intranetsite', + 'http://user:pass@intranetsite/test', + 'http://user:pass@intranetsite:80', + 'http://user:pass@intranetsite:80/test', + 'http://10.1.1.0', + 'http://10.1.1.255', + 'http://10.1.1.1', + 'http://10.1.1.254', + 'http://127.0.0.1', + 'http://192.168.0.1', + 'http://0.0.0.0', + 'http://224.1.1.1', + 'http://1.1.1.1.1', + 'http://123.123.123', + 'http://3628126748' + ]; + + it('Valid URIs (allowLocal=false)', function() { + var me = this; + $.each(validGlobalURIs, function(index, uri) { + me.bv.resetForm(); + me.$uri.val(uri); + me.bv.validate(); + expect(me.bv.isValid()).toBeTruthy(); + }); + }); + + it('Invalid URIs (allowLocal=false)', function() { + var me = this; + $.each(invalidGlobalURIs.concat(localURIs), function(index, uri) { + me.bv.resetForm(); + me.$uri.val(uri); + me.bv.validate(); + expect(me.bv.isValid()).toEqual(false); + }); + }); + + it('Valid URIs (allowLocal=true)', function() { + var me = this; + me.bv.updateOption('uri', 'uri', 'allowLocal', true); + $.each(validGlobalURIs.concat(localURIs), function(index, uri) { + me.bv.resetForm(); + me.$uri.val(uri); + me.bv.validate(); + expect(me.bv.isValid()).toBeTruthy(); + }); + }); + + it('Invalid URIs (allowLocal=true)', function() { + var me = this; + me.bv.updateOption('uri', 'uri', 'allowLocal', true); + $.each(invalidGlobalURIs, function(index, uri) { + me.bv.resetForm(); + me.$uri.val(uri); + me.bv.validate(); + expect(me.bv.isValid()).toEqual(false); + }); + }); +}); diff --git a/test/spec/validator/vat.js b/test/spec/validator/vat.js new file mode 100644 index 000000000..bd385007e --- /dev/null +++ b/test/spec/validator/vat.js @@ -0,0 +1,790 @@ +describe('vat', function() { + beforeEach(function() { + $([ + '
      ', + '
      ', + '', + '
      ', + '
      ', + '', + '
      ', + '
      ', + ].join('\n')).appendTo('body'); + + $('#vatForm').bootstrapValidator(); + + /** + * @type {BootstrapValidator} + */ + this.bv = $('#vatForm').data('bootstrapValidator'); + this.$country = this.bv.getFieldElements('country'); + this.$vat = this.bv.getFieldElements('vat'); + }); + + afterEach(function() { + $('#vatForm').bootstrapValidator('destroy').remove(); + }); + + it('dynamic country', function() { + this.$vat.attr('data-bv-vat-country', 'country'); + this.bv.destroy(); + this.bv = $('#vatForm').bootstrapValidator().data('bootstrapValidator'); + + this.$country.val('AT'); + this.$vat.val('ATU13585627'); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + + this.bv.resetForm(); + this.$country.val('BG'); + this.$vat.val('BE0428759497'); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + + this.bv.resetForm(); + this.$country.val('BE'); + this.$vat.val('BE431150351'); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + }); + + it('Austrian VAT number', function() { + this.bv.updateOption('vat', 'vat', 'country', 'AT'); + + // Valid samples + var validSamples = ['ATU13585627', 'U13585627']; + for (var i in validSamples) { + this.bv.resetForm(); + this.$vat.val(validSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + } + + // Invalid samples + var invalidSamples = ['ATU13585626', 'U13585626']; + for (i in invalidSamples) { + this.bv.resetForm(); + this.$vat.val(invalidSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + } + }); + + it('Belgian VAT number', function() { + this.bv.updateOption('vat', 'vat', 'country', 'BE'); + + // Valid samples + var validSamples = ['BE0428759497', '0428759497']; + for (var i in validSamples) { + this.bv.resetForm(); + this.$vat.val(validSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + } + + // Invalid samples + var invalidSamples = ['BE431150351', '431150351']; + for (i in invalidSamples) { + this.bv.resetForm(); + this.$vat.val(invalidSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + } + }); + + it('Bulgarian VAT number', function() { + this.bv.updateOption('vat', 'vat', 'country', 'BG'); + + // Valid samples + var validSamples = ['BG175074752', 'BG7523169263', 'BG8032056031', 'BG7542011030', 'BG7111042925', '175074752', '7523169263', '8032056031']; + for (var i in validSamples) { + this.bv.resetForm(); + this.$vat.val(validSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + } + + // Invalid samples + var invalidSamples = ['BG175074753', 'BG7552A10004', 'BG7111042922', '175074753', '7552A10004']; + for (i in invalidSamples) { + this.bv.resetForm(); + this.$vat.val(invalidSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + } + }); + + it('Cypriot VAT number', function() { + this.bv.updateOption('vat', 'vat', 'country', 'CY'); + + // Valid samples + var validSamples = ['CY10259033P', '10259033P']; + for (var i in validSamples) { + this.bv.resetForm(); + this.$vat.val(validSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + } + + // Invalid samples + var invalidSamples = ['CY10259033Z', '10259033Z']; + for (i in invalidSamples) { + this.bv.resetForm(); + this.$vat.val(invalidSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + } + }); + + it('Czech Republic VAT number', function() { + this.bv.updateOption('vat', 'vat', 'country', 'CZ'); + + // Valid samples + var validSamples = ['CZ25123891', 'CZ7103192745', 'CZ991231123', 'CZ640903926', '25123891', '7103192745']; + for (var i in validSamples) { + this.bv.resetForm(); + this.$vat.val(validSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + } + + // Invalid samples + var invalidSamples = ['CZ25123890', 'CZ1103492745', 'CZ590312123', '25123890', '1103492745']; + for (i in invalidSamples) { + this.bv.resetForm(); + this.$vat.val(invalidSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + } + }); + + it('German VAT number', function() { + this.bv.updateOption('vat', 'vat', 'country', 'DE'); + + // Valid samples + var validSamples = ['DE136695976', '136695976']; + for (var i in validSamples) { + this.bv.resetForm(); + this.$vat.val(validSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + } + + // Invalid samples + var invalidSamples = ['DE136695978', '136695978']; + for (i in invalidSamples) { + this.bv.resetForm(); + this.$vat.val(invalidSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + } + }); + + it('Danish VAT number', function() { + this.bv.updateOption('vat', 'vat', 'country', 'DK'); + + // Valid samples + var validSamples = ['DK13585628', '13585628']; + for (var i in validSamples) { + this.bv.resetForm(); + this.$vat.val(validSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + } + + // Invalid samples + var invalidSamples = ['DK13585627', '13585627']; + for (i in invalidSamples) { + this.bv.resetForm(); + this.$vat.val(invalidSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + } + }); + + it('Estonian VAT number', function() { + this.bv.updateOption('vat', 'vat', 'country', 'EE'); + + // Valid samples + var validSamples = ['EE100931558', 'EE100594102', '100931558', '100594102']; + for (var i in validSamples) { + this.bv.resetForm(); + this.$vat.val(validSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + } + + // Invalid samples + var invalidSamples = ['EE100594103', '100594103']; + for (i in invalidSamples) { + this.bv.resetForm(); + this.$vat.val(invalidSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + } + }); + + it('Spanish VAT number (NIF)', function() { + this.bv.updateOption('vat', 'vat', 'country', 'ES'); + + // Valid samples + var validSamples = ['ES54362315K', 'ESX2482300W', 'ESX5253868R', 'ESM1234567L', 'ESJ99216582', 'ESB58378431', 'ESB64717838', '54362315K', 'X2482300W', 'X5253868R', 'M1234567L', 'J99216582']; + for (var i in validSamples) { + this.bv.resetForm(); + this.$vat.val(validSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + } + + // Invalid samples + var invalidSamples = ['ES54362315Z', 'ESX2482300A', 'ESJ99216583', '54362315Z', 'X2482300A']; + for (i in invalidSamples) { + this.bv.resetForm(); + this.$vat.val(invalidSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + } + }); + + it('Finnish VAT number', function() { + this.bv.updateOption('vat', 'vat', 'country', 'FI'); + + // Valid samples + var validSamples = ['FI20774740', '20774740']; + for (var i in validSamples) { + this.bv.resetForm(); + this.$vat.val(validSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + } + + // Invalid samples + var invalidSamples = ['FI20774741', '20774741']; + for (i in invalidSamples) { + this.bv.resetForm(); + this.$vat.val(invalidSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + } + }); + + it('French VAT number (TVA)', function() { + this.bv.updateOption('vat', 'vat', 'country', 'FR'); + + // Valid samples + var validSamples = ['FR40303265045', 'FR23334175221', 'FRK7399859412', 'FR4Z123456782', '40303265045', '23334175221', 'K7399859412']; + for (var i in validSamples) { + this.bv.resetForm(); + this.$vat.val(validSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + } + + // Invalid samples + var invalidSamples = ['FR84323140391', '84323140391']; + for (i in invalidSamples) { + this.bv.resetForm(); + this.$vat.val(invalidSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + } + }); + + it('United Kingdom VAT number', function() { + this.bv.updateOption('vat', 'vat', 'country', 'GB'); + + // Valid samples + var validSamples = ['GB980780684', '980780684']; + for (var i in validSamples) { + this.bv.resetForm(); + this.$vat.val(validSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + } + + // Invalid samples + var invalidSamples = ['GB802311781', '802311781']; + for (i in invalidSamples) { + this.bv.resetForm(); + this.$vat.val(invalidSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + } + }); + + it('Greek VAT number', function() { + this.bv.updateOption('vat', 'vat', 'country', 'GR'); + + // Valid samples + var validSamples = ['GR023456780', 'EL094259216', '023456780', '094259216']; + for (var i in validSamples) { + this.bv.resetForm(); + this.$vat.val(validSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + } + + // Invalid samples + var invalidSamples = ['GR123456781', '123456781']; + for (i in invalidSamples) { + this.bv.resetForm(); + this.$vat.val(invalidSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + } + }); + + it('Hungarian VAT number', function() { + this.bv.updateOption('vat', 'vat', 'country', 'HU'); + + // Valid samples + var validSamples = ['HU12892312', '12892312']; + for (var i in validSamples) { + this.bv.resetForm(); + this.$vat.val(validSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + } + + // Invalid samples + var invalidSamples = ['HU12892313', '12892313']; + for (i in invalidSamples) { + this.bv.resetForm(); + this.$vat.val(invalidSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + } + }); + + it('Croatian VAT number', function() { + this.bv.updateOption('vat', 'vat', 'country', 'HR'); + + // Valid samples + var validSamples = ['HR33392005961', '33392005961']; + for (var i in validSamples) { + this.bv.resetForm(); + this.$vat.val(validSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + } + + // Invalid samples + var invalidSamples = ['HR33392005962', '33392005962']; + for (i in invalidSamples) { + this.bv.resetForm(); + this.$vat.val(invalidSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + } + }); + + it('Irish VAT number', function() { + this.bv.updateOption('vat', 'vat', 'country', 'IE'); + + // Valid samples + var validSamples = ['IE6433435F', 'IE6433435OA', 'IE8D79739I', '6433435F', '6433435OA', '8D79739I']; + for (var i in validSamples) { + this.bv.resetForm(); + this.$vat.val(validSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + } + + // Invalid samples + var invalidSamples = ['IE8D79738J', '8D79738J']; + for (i in invalidSamples) { + this.bv.resetForm(); + this.$vat.val(invalidSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + } + }); + + it('Iceland VAT (VSK) number', function() { + this.bv.updateOption('vat', 'vat', 'country', 'IS'); + + // Valid samples + var validSamples = ['IS11111', 'IS111111', '11111', '111111']; + for (var i in validSamples) { + this.bv.resetForm(); + this.$vat.val(validSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + } + + // Invalid samples + var invalidSamples = ['IS1234567', 'IS123456ABC', '1234567', '123456ABC']; + for (i in invalidSamples) { + this.bv.resetForm(); + this.$vat.val(invalidSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + } + }); + + it('Italian VAT number', function() { + this.bv.updateOption('vat', 'vat', 'country', 'IT'); + + // Valid samples + var validSamples = ['IT00743110157', '00743110157']; + for (var i in validSamples) { + this.bv.resetForm(); + this.$vat.val(validSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + } + + // Invalid samples + var invalidSamples = ['IT00743110158', '00743110158']; + for (i in invalidSamples) { + this.bv.resetForm(); + this.$vat.val(invalidSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + } + }); + + it('Lithuanian VAT number', function() { + this.bv.updateOption('vat', 'vat', 'country', 'LT'); + + // Valid samples + var validSamples = ['LT119511515', 'LT100001919017', 'LT100004801610', '119511515', '100001919017', '100004801610']; + for (var i in validSamples) { + this.bv.resetForm(); + this.$vat.val(validSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + } + + // Invalid samples + var invalidSamples = ['LT100001919018', '100001919018']; + for (i in invalidSamples) { + this.bv.resetForm(); + this.$vat.val(invalidSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + } + }); + + it('Luxembourg VAT number', function() { + this.bv.updateOption('vat', 'vat', 'country', 'LU'); + + // Valid samples + var validSamples = ['LU15027442', '15027442']; + for (var i in validSamples) { + this.bv.resetForm(); + this.$vat.val(validSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + } + + // Invalid samples + var invalidSamples = ['LU15027443', '15027443']; + for (i in invalidSamples) { + this.bv.resetForm(); + this.$vat.val(invalidSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + } + }); + + it('Latvian VAT number', function() { + this.bv.updateOption('vat', 'vat', 'country', 'LV'); + + // Valid samples + var validSamples = ['LV40003521600', 'LV16117519997', '40003521600', '16117519997']; + for (var i in validSamples) { + this.bv.resetForm(); + this.$vat.val(validSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + } + + // Invalid samples + var invalidSamples = ['LV40003521601', 'LV16137519997', '40003521601', '16137519997']; + for (i in invalidSamples) { + this.bv.resetForm(); + this.$vat.val(invalidSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + } + }); + + it('Maltese VAT number', function() { + this.bv.updateOption('vat', 'vat', 'country', 'MT'); + + // Valid samples + var validSamples = ['MT11679112', '11679112']; + for (var i in validSamples) { + this.bv.resetForm(); + this.$vat.val(validSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + } + + // Invalid samples + var invalidSamples = ['MT11679113', '11679113']; + for (i in invalidSamples) { + this.bv.resetForm(); + this.$vat.val(invalidSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + } + }); + + it('Dutch VAT number', function() { + this.bv.updateOption('vat', 'vat', 'country', 'NL'); + + // Valid samples + var validSamples = ['NL004495445B01', '004495445B01']; + for (var i in validSamples) { + this.bv.resetForm(); + this.$vat.val(validSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + } + + // Invalid samples + var invalidSamples = ['NL123456789B90', '123456789B90']; + for (i in invalidSamples) { + this.bv.resetForm(); + this.$vat.val(invalidSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + } + }); + + it('Polish VAT number', function() { + this.bv.updateOption('vat', 'vat', 'country', 'PL'); + + // Valid samples + var validSamples = ['PL8567346215', '8567346215']; + for (var i in validSamples) { + this.bv.resetForm(); + this.$vat.val(validSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + } + + // Invalid samples + var invalidSamples = ['PL8567346216', '8567346216']; + for (i in invalidSamples) { + this.bv.resetForm(); + this.$vat.val(invalidSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + } + }); + + it('Portuguese VAT number', function() { + this.bv.updateOption('vat', 'vat', 'country', 'PT'); + + // Valid samples + var validSamples = ['PT501964843', '501964843']; + for (var i in validSamples) { + this.bv.resetForm(); + this.$vat.val(validSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + } + + // Invalid samples + var invalidSamples = ['PT501964842', '501964842']; + for (i in invalidSamples) { + this.bv.resetForm(); + this.$vat.val(invalidSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + } + }); + + it('Romanian VAT number', function() { + this.bv.updateOption('vat', 'vat', 'country', 'RO'); + + // Valid samples + var validSamples = ['RO18547290', '18547290']; + for (var i in validSamples) { + this.bv.resetForm(); + this.$vat.val(validSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + } + + // Invalid samples + var invalidSamples = ['RO18547291', '18547291']; + for (i in invalidSamples) { + this.bv.resetForm(); + this.$vat.val(invalidSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + } + }); + + it('Russian VAT number', function() { + this.bv.updateOption('vat', 'vat', 'country', 'RU'); + + // Valid samples + var validSamples = ['RU7805145876', 'RU781300557475', '7805145876', '781300557475']; + for (var i in validSamples) { + this.bv.resetForm(); + this.$vat.val(validSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + } + + // Invalid samples + var invalidSamples = ['RU7805145877', 'RU781300557474', '7805145877', '781300557474']; + for (i in invalidSamples) { + this.bv.resetForm(); + this.$vat.val(invalidSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + } + }); + + it('Swedish VAT number', function() { + this.bv.updateOption('vat', 'vat', 'country', 'SE'); + + // Valid samples + var validSamples = ['SE123456789701', '123456789701']; + for (var i in validSamples) { + this.bv.resetForm(); + this.$vat.val(validSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + } + + // Invalid samples + var invalidSamples = ['SE123456789101', '123456789101']; + for (i in invalidSamples) { + this.bv.resetForm(); + this.$vat.val(invalidSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + } + }); + + it('Slovenian VAT number', function() { + this.bv.updateOption('vat', 'vat', 'country', 'SI'); + + // Valid samples + var validSamples = ['SI50223054', '50223054']; + for (var i in validSamples) { + this.bv.resetForm(); + this.$vat.val(validSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + } + + // Invalid samples + var invalidSamples = ['SI50223055', '50223055']; + for (i in invalidSamples) { + this.bv.resetForm(); + this.$vat.val(invalidSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + } + }); + + it('Slovak VAT number', function() { + this.bv.updateOption('vat', 'vat', 'country', 'SK'); + + // Valid samples + var validSamples = ['SK2022749619', '2022749619']; + for (var i in validSamples) { + this.bv.resetForm(); + this.$vat.val(validSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + } + + // Invalid samples + var invalidSamples = ['SK2022749618', '2022749618']; + for (i in invalidSamples) { + this.bv.resetForm(); + this.$vat.val(invalidSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + } + }); + + it('South African VAT number', function() { + this.bv.updateOption('vat', 'vat', 'country', 'ZA'); + + // Valid samples + var validSamples = ['ZA4012345678', '4012345678']; + for (var i in validSamples) { + this.bv.resetForm(); + this.$vat.val(validSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + } + + // Invalid samples + var invalidSamples = ['ZA40123456789', 'ZA0123456789', '40123456789', '0123456789']; + for (i in invalidSamples) { + this.bv.resetForm(); + this.$vat.val(invalidSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + } + }); + + it('Venezuelan VAT number (RIF)', function() { + this.bv.updateOption('vat', 'vat', 'country', 'VE'); + + // Valid samples + var validSamples = ['VEJ309272292', 'VEV242818101', 'VEJ000126518', 'VEJ000458324', 'J309272292', 'V242818101', 'J000126518', 'J000458324']; + for (var i in validSamples) { + this.bv.resetForm(); + this.$vat.val(validSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + } + + // Invalid samples + var invalidSamples = ['VEJ309272293', 'VEV242818100', 'J000126519', 'J000458323']; + for (i in invalidSamples) { + this.bv.resetForm(); + this.$vat.val(invalidSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + } + }); +}); diff --git a/test/spec/validator/zipCode.js b/test/spec/validator/zipCode.js new file mode 100644 index 000000000..dbc58b80b --- /dev/null +++ b/test/spec/validator/zipCode.js @@ -0,0 +1,386 @@ +function getCountryCode(value, validator, $field) { + $('#msg').html('getCountryCode() called'); + return validator.getFieldElements('country').val(); +}; + +TestSuite = $.extend({}, TestSuite, { + ZipCode: { + getCountryCode: function(value, validator, $field) { + $('#msg').html('TestSuite.ZipCode.getCountryCode() called'); + return validator.getFieldElements('country').val(); + } + } +}); + +describe('zipCode', function() { + beforeEach(function() { + $([ + '
      ', + '
      ', + '
      ', + '', + '
      ', + '', + '
      ', + '
      ', + '
      ', + '', + '
      ', + '', + '
      ', + '
      ', + '
      ' + ].join('\n')).appendTo('body'); + + $('#zipCodeForm').bootstrapValidator(); + + /** + * @type {BootstrapValidator} + */ + this.bv = $('#zipCodeForm').data('bootstrapValidator'); + + this.$country = this.bv.getFieldElements('country'); + this.$zipCode = this.bv.getFieldElements('zc'); + }); + + afterEach(function() { + $('#zipCodeForm').bootstrapValidator('destroy').remove(); + }); + + it('country code updateOption()', function() { + // Check IT postal code + this.bv.updateOption('zc', 'zipCode', 'country', 'IT'); + this.$zipCode.val('1234'); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + + this.bv.resetForm(); + this.$zipCode.val('IT-12345'); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + + // Check United Kingdom postal code + this.bv.updateOption('zc', 'zipCode', 'country', 'GB'); + var validUkSamples = ['EC1A 1BB', 'W1A 1HQ', 'M1 1AA', 'B33 8TH', 'CR2 6XH', 'DN55 1PT', 'AI-2640', 'ASCN 1ZZ', 'GIR 0AA']; + + for (var i in validUkSamples) { + this.bv.resetForm(); + this.$zipCode.val(validUkSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + } + }); + + it('country code other field declarative', function() { + this.$zipCode.attr('data-bv-zipcode-country', 'country'); + + // Need to destroy the plugin instance ... + $('#zipCodeForm').bootstrapValidator('destroy'); + + // ... and re-create it + this.bv = $('#zipCodeForm').bootstrapValidator().data('bootstrapValidator'); + this.$country.val('IT'); + + this.bv.resetForm(); + this.$zipCode.val('1234'); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + + this.bv.resetForm(); + this.$zipCode.val('I-12345'); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + }); + + it('country code callback declarative function', function() { + this.$zipCode.attr('data-bv-zipcode-country', 'getCountryCode'); + $('#zipCodeForm').bootstrapValidator('destroy'); + this.bv = $('#zipCodeForm').bootstrapValidator().data('bootstrapValidator'); + this.$country.val('NL'); + this.$zipCode.val('0123'); + this.bv.validate(); + expect($('#msg').html()).toEqual('getCountryCode() called'); + expect(this.bv.isValid()).toEqual(false); + }); + + it('country code callback declarative function()', function() { + this.$zipCode.attr('data-bv-zipcode-country', 'getCountryCode()'); + $('#zipCodeForm').bootstrapValidator('destroy'); + this.bv = $('#zipCodeForm').bootstrapValidator().data('bootstrapValidator'); + this.$country.val('NL'); + this.$zipCode.val('1234 ab'); + this.bv.validate(); + expect($('#msg').html()).toEqual('getCountryCode() called'); + expect(this.bv.isValid()).toBeTruthy(); + }); + + it('country code callback declarative A.B.C', function() { + this.$zipCode.attr('data-bv-zipcode-country', 'TestSuite.ZipCode.getCountryCode'); + $('#zipCodeForm').bootstrapValidator('destroy'); + this.bv = $('#zipCodeForm').bootstrapValidator().data('bootstrapValidator'); + this.$country.val('DK'); + this.$zipCode.val('DK 123'); + this.bv.validate(); + expect($('#msg').html()).toEqual('TestSuite.ZipCode.getCountryCode() called'); + expect(this.bv.isValid()).toEqual(false); + }); + + it('country code callback declarative A.B.C()', function() { + this.$zipCode.attr('data-bv-zipcode-country', 'TestSuite.ZipCode.getCountryCode()'); + $('#zipCodeForm').bootstrapValidator('destroy'); + this.bv = $('#zipCodeForm').bootstrapValidator().data('bootstrapValidator'); + this.$country.val('DK'); + this.$zipCode.val('DK-1234'); + this.bv.validate(); + expect($('#msg').html()).toEqual('TestSuite.ZipCode.getCountryCode() called'); + expect(this.bv.isValid()).toBeTruthy(); + }); + + it('country code callback programmatically', function() { + this.$zipCode.removeAttr('data-bv-zipcode-country'); + $('#zipCodeForm').bootstrapValidator('destroy'); + this.bv = $('#zipCodeForm') + .bootstrapValidator({ + fields: { + zc: { + validators: { + zipCode: { + country: function(value, validator, $field) { + return getCountryCode(value, validator, $field); + } + } + } + } + } + }) + .data('bootstrapValidator'); + this.$country.val('SE'); + + this.bv.resetForm(); + this.$zipCode.val('S-567 8'); + this.bv.validate(); + expect($('#msg').html()).toEqual('getCountryCode() called'); + expect(this.bv.isValid()).toEqual(false); + + this.bv.resetForm(); + this.$zipCode.val('S-12345'); + this.bv.validate(); + expect($('#msg').html()).toEqual('getCountryCode() called'); + expect(this.bv.isValid()).toBeTruthy(); + }); + + it('not supported country code', function() { + this.$zipCode.attr('data-bv-zipcode-country', 'NOT_SUPPORTED'); + + $('#zipCodeForm').bootstrapValidator('destroy'); + + this.bv = $('#zipCodeForm').bootstrapValidator().data('bootstrapValidator'); + + this.bv.resetForm(); + this.$zipCode.val('1234'); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + expect(this.bv.getMessages(this.$zipCode, 'zipCode')[0]).toEqual($.fn.bootstrapValidator.helpers.format($.fn.bootstrapValidator.i18n.zipCode.countryNotSupported, 'NOT_SUPPORTED')); + }); + + it('US zipcode', function() { + this.$zipCode.val('12345'); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + + this.bv.resetForm(); + this.$zipCode.val('123'); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + }); + + it('Czech Republic postal code', function() { + this.bv.updateOption('zc', 'zipCode', 'country', 'CZ'); + + // Valid samples + var validSamples = ['12345', '123 45']; + for (var i in validSamples) { + this.bv.resetForm(); + this.$zipCode.val(validSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + } + + // Invalid samples + var invalidSamples = ['12 345', '123456', '1 2345', '1234 5', '12 3 45']; + for (i in invalidSamples) { + this.bv.resetForm(); + this.$zipCode.val(invalidSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + } + }); + + it('Slovakia postal code', function() { + this.bv.updateOption('zc', 'zipCode', 'country', 'SK'); + + // Valid samples + var validSamples = ['12345', '123 45']; + for (var i in validSamples) { + this.bv.resetForm(); + this.$zipCode.val(validSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + } + + // Invalid samples + var invalidSamples = ['12 345', '123456', '1 2345', '1234 5', '12 3 45']; + for (i in invalidSamples) { + this.bv.resetForm(); + this.$zipCode.val(invalidSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + } + }); + + it('France postal code', function() { + this.bv.updateOption('zc', 'zipCode', 'country', 'FR'); + + // Valid samples + var validSamples = ['12340', '01230', '75116']; + for (var i in validSamples) { + this.bv.resetForm(); + this.$zipCode.val(validSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + } + + // Invalid samples + var invalidSamples = ['123 45', '12 345', '123456', '1 2345', '1234 5', '12 3 45', '1234A']; + for (i in invalidSamples) { + this.bv.resetForm(); + this.$zipCode.val(invalidSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + } + }); + + it('Eircode (Ireland postal code)', function() { + this.bv.updateOption('zc', 'zipCode', 'country', 'IE'); + + // Valid samples + var validSamples = ['A65 F4E2', 'D6W FNT4', 'T37 F8HK']; + for (var i in validSamples) { + this.bv.resetForm(); + this.$zipCode.val(validSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + } + + // Invalid samples + var invalidSamples = ['a65 f4e2', 'D6W FNTO', 'T37F8HK']; + for (i in invalidSamples) { + this.bv.resetForm(); + this.$zipCode.val(invalidSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + } + }); + + it('Portugal postal code', function() { + this.bv.updateOption('zc', 'zipCode', 'country', 'PT'); + + // Valid samples + var validSamples = ['2435-459', '1000-000', '1234-456']; + for (var i in validSamples) { + this.bv.resetForm(); + this.$zipCode.val(validSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + } + + // Invalid samples + var invalidSamples = ['0123-456', '1234456', '1234-ABC', '1234 456']; + for (i in invalidSamples) { + this.bv.resetForm(); + this.$zipCode.val(invalidSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + } + }); + + it('Austria postal code', function() { + this.bv.updateOption('zc', 'zipCode', 'country', 'AT'); + + // Valid samples + var validSamples = ['6020', '1010', '4853']; + for (var i in validSamples) { + this.bv.resetForm(); + this.$zipCode.val(validSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + } + + // Invalid samples + var invalidSamples = ['0020', '12345', '102', '12AB', 'AT 6020 XY']; + for (i in invalidSamples) { + this.bv.resetForm(); + this.$zipCode.val(invalidSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + } + }); + + it('Germany postal code', function() { + this.bv.updateOption('zc', 'zipCode', 'country', 'DE'); + + // Valid samples + var validSamples = ['52238', '01001', '09107']; + for (var i in validSamples) { + this.bv.resetForm(); + this.$zipCode.val(validSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + } + + // Invalid samples + var invalidSamples = ['01000', '99999', '102', 'ABCDE', 'DE 52240 XY']; + for (i in invalidSamples) { + this.bv.resetForm(); + this.$zipCode.val(invalidSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + } + }); + + it('Switzerland postal code', function() { + this.bv.updateOption('zc', 'zipCode', 'country', 'CH'); + + // Valid samples + var validSamples = [ '8280', '8090', '8238', '9490']; + for (var i in validSamples) { + this.bv.resetForm(); + this.$zipCode.val(validSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toBeTruthy(); + } + + // Invalid samples + var invalidSamples = ['0123', '99999', '102', 'ABCD', 'CH-5224 XY']; + for (i in invalidSamples) { + this.bv.resetForm(); + this.$zipCode.val(invalidSamples[i]); + this.bv.validate(); + expect(this.bv.isValid()).toEqual(false); + } + }); +}); diff --git a/test/spec/verbose.js b/test/spec/verbose.js new file mode 100644 index 000000000..1be73d9ab --- /dev/null +++ b/test/spec/verbose.js @@ -0,0 +1,194 @@ +describe('verbose option', function() { + beforeEach(function() { + $([ + '
      ', + '
      ', + '', + '
      ', + '
      ' + ].join('\n')).appendTo('body'); + + // The order of validators are alphabetical: + // - notEmpty + // - regexp + // - stringLength + }); + + afterEach(function() { + $('#verboseForm').bootstrapValidator('destroy').remove(); + }); + + it('set data-bv-verbose="false" for form', function() { + var bv = $('#verboseForm') + .attr('data-bv-verbose', 'false') + .bootstrapValidator('destroy') + .bootstrapValidator() + .data('bootstrapValidator'), + $fullName = bv.getFieldElements('fullName'), + messages; + + $fullName.val(''); + bv.validate(); + messages = bv.getMessages('fullName'); + expect(messages.length).toEqual(1); + expect(messages[0]).toEqual($fullName.attr('data-bv-notempty-message')); + + bv.resetForm(); + $fullName.val('Spe@#$'); + bv.validate(); + messages = bv.getMessages('fullName'); + expect(messages.length).toEqual(1); + expect(messages[0]).toEqual($fullName.attr('data-bv-regexp-message')); + + bv.resetForm(); + $fullName.val('Full'); + bv.validate(); + messages = bv.getMessages('fullName'); + expect(messages.length).toEqual(1); + expect(messages[0]).toEqual($fullName.attr('data-bv-stringlength-message')); + }); + + it('set data-bv-verbose="false" for field', function() { + var bv = $('#verboseForm') + .attr('data-bv-verbose', 'true') + .find('[name="fullName"]') + .attr('data-bv-verbose', 'false') + .end() + .bootstrapValidator('destroy') + .bootstrapValidator() + .data('bootstrapValidator'), + $fullName = bv.getFieldElements('fullName'), + messages; + + $fullName.val(''); + bv.validate(); + messages = bv.getMessages('fullName'); + expect(messages.length).toEqual(1); + expect(messages[0]).toEqual($fullName.attr('data-bv-notempty-message')); + + bv.resetForm(); + $fullName.val('Spe@#$'); + bv.validate(); + messages = bv.getMessages('fullName'); + expect(messages.length).toEqual(1); + expect(messages[0]).toEqual($fullName.attr('data-bv-regexp-message')); + + bv.resetForm(); + $fullName.val('Full'); + bv.validate(); + messages = bv.getMessages('fullName'); + expect(messages.length).toEqual(1); + expect(messages[0]).toEqual($fullName.attr('data-bv-stringlength-message')); + }); + + it('set verbose: "false" for form', function() { + var bv = $('#verboseForm') + .bootstrapValidator('destroy') + .bootstrapValidator({ verbose: false }) + .data('bootstrapValidator'), + $fullName = bv.getFieldElements('fullName'), + messages; + + $fullName.val(''); + bv.validate(); + messages = bv.getMessages('fullName'); + expect(messages.length).toEqual(1); + expect(messages[0]).toEqual($fullName.attr('data-bv-notempty-message')); + + bv.resetForm(); + $fullName.val('Spe@#$'); + bv.validate(); + messages = bv.getMessages('fullName'); + expect(messages.length).toEqual(1); + expect(messages[0]).toEqual($fullName.attr('data-bv-regexp-message')); + + bv.resetForm(); + $fullName.val('Full'); + bv.validate(); + messages = bv.getMessages('fullName'); + expect(messages.length).toEqual(1); + expect(messages[0]).toEqual($fullName.attr('data-bv-stringlength-message')); + }); + + // #1057 + it('set verbose: "false" for field', function() { + var bv = $('#verboseForm') + .attr('data-bv-verbose', 'true') + .bootstrapValidator('destroy') + .bootstrapValidator({ + verbose: true, + fields: { + fullName: { + verbose: false + } + } + }) + .data('bootstrapValidator'), + $fullName = bv.getFieldElements('fullName'), + messages; + + $fullName.val(''); + bv.validate(); + messages = bv.getMessages('fullName'); + expect(messages.length).toEqual(1); + expect(messages[0]).toEqual($fullName.attr('data-bv-notempty-message')); + + bv.resetForm(); + $fullName.val('Spe@#$'); + bv.validate(); + messages = bv.getMessages('fullName'); + expect(messages.length).toEqual(1); + expect(messages[0]).toEqual($fullName.attr('data-bv-regexp-message')); + + bv.resetForm(); + $fullName.val('Full'); + bv.validate(); + messages = bv.getMessages('fullName'); + expect(messages.length).toEqual(1); + expect(messages[0]).toEqual($fullName.attr('data-bv-stringlength-message')); + }); + + // #1055 + it('trigger "error.field.bv" event', function() { + var validators = [], // Array of not passed validators + bv = $('#verboseForm') + .attr('data-bv-verbose', 'true') + .bootstrapValidator('destroy') + .bootstrapValidator({ + verbose: true, + fields: { + fullName: { + verbose: false + } + } + }) + .on('error.field.bv', function(e, data) { + validators.push(data.validator); + }) + .data('bootstrapValidator'), + $fullName = bv.getFieldElements('fullName'); + + $fullName.val(''); + bv.validate(); + expect(validators.length).toEqual(1); + expect(validators[0]).toEqual('notEmpty'); + + validators = []; + bv.resetForm(); + $fullName.val('Spe@#$'); + bv.validate(); + expect(validators.length).toEqual(1); + expect(validators[0]).toEqual('regexp'); + + validators = []; + bv.resetForm(); + $fullName.val('Full'); + bv.validate(); + expect(validators.length).toEqual(1); + expect(validators[0]).toEqual('stringLength'); + }); +}); diff --git a/vendor/bootstrap/css/bootstrap-theme.css b/vendor/bootstrap/css/bootstrap-theme.css old mode 100644 new mode 100755 index ad1173569..b82bd721f --- a/vendor/bootstrap/css/bootstrap-theme.css +++ b/vendor/bootstrap/css/bootstrap-theme.css @@ -1,14 +1,19 @@ +/*! + * Bootstrap v3.3.0 (http://getbootstrap.com) + * Copyright 2011-2014 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */ + .btn-default, .btn-primary, .btn-success, .btn-info, .btn-warning, .btn-danger { - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.2); - -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075); - box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075); + text-shadow: 0 -1px 0 rgba(0, 0, 0, .2); + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 1px rgba(0, 0, 0, .075); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 1px rgba(0, 0, 0, .075); } - .btn-default:active, .btn-primary:active, .btn-success:active, @@ -21,364 +26,432 @@ .btn-info.active, .btn-warning.active, .btn-danger.active { - -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); - box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); +} +.btn-default .badge, +.btn-primary .badge, +.btn-success .badge, +.btn-info .badge, +.btn-warning .badge, +.btn-danger .badge { + text-shadow: none; } - .btn:active, .btn.active { background-image: none; } - .btn-default { text-shadow: 0 1px 0 #fff; - background-image: -webkit-gradient(linear, left 0%, left 100%, from(#ffffff), to(#e6e6e6)); - background-image: -webkit-linear-gradient(top, #ffffff, 0%, #e6e6e6, 100%); - background-image: -moz-linear-gradient(top, #ffffff 0%, #e6e6e6 100%); - background-image: linear-gradient(to bottom, #ffffff 0%, #e6e6e6 100%); + background-image: -webkit-linear-gradient(top, #fff 0%, #e0e0e0 100%); + background-image: -o-linear-gradient(top, #fff 0%, #e0e0e0 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#fff), to(#e0e0e0)); + background-image: linear-gradient(to bottom, #fff 0%, #e0e0e0 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); background-repeat: repeat-x; - border-color: #e0e0e0; + border-color: #dbdbdb; border-color: #ccc; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe6e6e6', GradientType=0); } - +.btn-default:hover, +.btn-default:focus { + background-color: #e0e0e0; + background-position: 0 -15px; +} .btn-default:active, .btn-default.active { - background-color: #e6e6e6; - border-color: #e0e0e0; + background-color: #e0e0e0; + border-color: #dbdbdb; +} +.btn-default:disabled, +.btn-default[disabled] { + background-color: #e0e0e0; + background-image: none; } - .btn-primary { - background-image: -webkit-gradient(linear, left 0%, left 100%, from(#428bca), to(#3071a9)); - background-image: -webkit-linear-gradient(top, #428bca, 0%, #3071a9, 100%); - background-image: -moz-linear-gradient(top, #428bca 0%, #3071a9 100%); - background-image: linear-gradient(to bottom, #428bca 0%, #3071a9 100%); + background-image: -webkit-linear-gradient(top, #428bca 0%, #2d6ca2 100%); + background-image: -o-linear-gradient(top, #428bca 0%, #2d6ca2 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#428bca), to(#2d6ca2)); + background-image: linear-gradient(to bottom, #428bca 0%, #2d6ca2 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff2d6ca2', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); background-repeat: repeat-x; - border-color: #2d6ca2; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff3071a9', GradientType=0); + border-color: #2b669a; +} +.btn-primary:hover, +.btn-primary:focus { + background-color: #2d6ca2; + background-position: 0 -15px; } - .btn-primary:active, .btn-primary.active { - background-color: #3071a9; - border-color: #2d6ca2; + background-color: #2d6ca2; + border-color: #2b669a; +} +.btn-primary:disabled, +.btn-primary[disabled] { + background-color: #2d6ca2; + background-image: none; } - .btn-success { - background-image: -webkit-gradient(linear, left 0%, left 100%, from(#5cb85c), to(#449d44)); - background-image: -webkit-linear-gradient(top, #5cb85c, 0%, #449d44, 100%); - background-image: -moz-linear-gradient(top, #5cb85c 0%, #449d44 100%); - background-image: linear-gradient(to bottom, #5cb85c 0%, #449d44 100%); + background-image: -webkit-linear-gradient(top, #5cb85c 0%, #419641 100%); + background-image: -o-linear-gradient(top, #5cb85c 0%, #419641 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#5cb85c), to(#419641)); + background-image: linear-gradient(to bottom, #5cb85c 0%, #419641 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); background-repeat: repeat-x; - border-color: #419641; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0); + border-color: #3e8f3e; +} +.btn-success:hover, +.btn-success:focus { + background-color: #419641; + background-position: 0 -15px; } - .btn-success:active, .btn-success.active { - background-color: #449d44; - border-color: #419641; + background-color: #419641; + border-color: #3e8f3e; +} +.btn-success:disabled, +.btn-success[disabled] { + background-color: #419641; + background-image: none; +} +.btn-info { + background-image: -webkit-linear-gradient(top, #5bc0de 0%, #2aabd2 100%); + background-image: -o-linear-gradient(top, #5bc0de 0%, #2aabd2 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#5bc0de), to(#2aabd2)); + background-image: linear-gradient(to bottom, #5bc0de 0%, #2aabd2 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); + background-repeat: repeat-x; + border-color: #28a4c9; +} +.btn-info:hover, +.btn-info:focus { + background-color: #2aabd2; + background-position: 0 -15px; +} +.btn-info:active, +.btn-info.active { + background-color: #2aabd2; + border-color: #28a4c9; +} +.btn-info:disabled, +.btn-info[disabled] { + background-color: #2aabd2; + background-image: none; } - .btn-warning { - background-image: -webkit-gradient(linear, left 0%, left 100%, from(#f0ad4e), to(#ec971f)); - background-image: -webkit-linear-gradient(top, #f0ad4e, 0%, #ec971f, 100%); - background-image: -moz-linear-gradient(top, #f0ad4e 0%, #ec971f 100%); - background-image: linear-gradient(to bottom, #f0ad4e 0%, #ec971f 100%); + background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #eb9316 100%); + background-image: -o-linear-gradient(top, #f0ad4e 0%, #eb9316 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#f0ad4e), to(#eb9316)); + background-image: linear-gradient(to bottom, #f0ad4e 0%, #eb9316 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); background-repeat: repeat-x; - border-color: #eb9316; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0); + border-color: #e38d13; +} +.btn-warning:hover, +.btn-warning:focus { + background-color: #eb9316; + background-position: 0 -15px; } - .btn-warning:active, .btn-warning.active { - background-color: #ec971f; - border-color: #eb9316; + background-color: #eb9316; + border-color: #e38d13; +} +.btn-warning:disabled, +.btn-warning[disabled] { + background-color: #eb9316; + background-image: none; } - .btn-danger { - background-image: -webkit-gradient(linear, left 0%, left 100%, from(#d9534f), to(#c9302c)); - background-image: -webkit-linear-gradient(top, #d9534f, 0%, #c9302c, 100%); - background-image: -moz-linear-gradient(top, #d9534f 0%, #c9302c 100%); - background-image: linear-gradient(to bottom, #d9534f 0%, #c9302c 100%); + background-image: -webkit-linear-gradient(top, #d9534f 0%, #c12e2a 100%); + background-image: -o-linear-gradient(top, #d9534f 0%, #c12e2a 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#d9534f), to(#c12e2a)); + background-image: linear-gradient(to bottom, #d9534f 0%, #c12e2a 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); background-repeat: repeat-x; - border-color: #c12e2a; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0); + border-color: #b92c28; +} +.btn-danger:hover, +.btn-danger:focus { + background-color: #c12e2a; + background-position: 0 -15px; } - .btn-danger:active, .btn-danger.active { - background-color: #c9302c; - border-color: #c12e2a; -} - -.btn-info { - background-image: -webkit-gradient(linear, left 0%, left 100%, from(#5bc0de), to(#31b0d5)); - background-image: -webkit-linear-gradient(top, #5bc0de, 0%, #31b0d5, 100%); - background-image: -moz-linear-gradient(top, #5bc0de 0%, #31b0d5 100%); - background-image: linear-gradient(to bottom, #5bc0de 0%, #31b0d5 100%); - background-repeat: repeat-x; - border-color: #2aabd2; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0); + background-color: #c12e2a; + border-color: #b92c28; } - -.btn-info:active, -.btn-info.active { - background-color: #31b0d5; - border-color: #2aabd2; +.btn-danger:disabled, +.btn-danger[disabled] { + background-color: #c12e2a; + background-image: none; } - .thumbnail, .img-thumbnail { - -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075); - box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075); + -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .075); + box-shadow: 0 1px 2px rgba(0, 0, 0, .075); } - .dropdown-menu > li > a:hover, -.dropdown-menu > li > a:focus, +.dropdown-menu > li > a:focus { + background-color: #e8e8e8; + background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); + background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#f5f5f5), to(#e8e8e8)); + background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0); + background-repeat: repeat-x; +} .dropdown-menu > .active > a, .dropdown-menu > .active > a:hover, .dropdown-menu > .active > a:focus { background-color: #357ebd; - background-image: -webkit-gradient(linear, left 0%, left 100%, from(#428bca), to(#357ebd)); - background-image: -webkit-linear-gradient(top, #428bca, 0%, #357ebd, 100%); - background-image: -moz-linear-gradient(top, #428bca 0%, #357ebd 100%); - background-image: linear-gradient(to bottom, #428bca 0%, #357ebd 100%); - background-repeat: repeat-x; + background-image: -webkit-linear-gradient(top, #428bca 0%, #357ebd 100%); + background-image: -o-linear-gradient(top, #428bca 0%, #357ebd 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#428bca), to(#357ebd)); + background-image: linear-gradient(to bottom, #428bca 0%, #357ebd 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff357ebd', GradientType=0); + background-repeat: repeat-x; } - -.navbar { - background-image: -webkit-gradient(linear, left 0%, left 100%, from(#ffffff), to(#f8f8f8)); - background-image: -webkit-linear-gradient(top, #ffffff, 0%, #f8f8f8, 100%); - background-image: -moz-linear-gradient(top, #ffffff 0%, #f8f8f8 100%); - background-image: linear-gradient(to bottom, #ffffff 0%, #f8f8f8 100%); +.navbar-default { + background-image: -webkit-linear-gradient(top, #fff 0%, #f8f8f8 100%); + background-image: -o-linear-gradient(top, #fff 0%, #f8f8f8 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#fff), to(#f8f8f8)); + background-image: linear-gradient(to bottom, #fff 0%, #f8f8f8 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); background-repeat: repeat-x; border-radius: 4px; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0); - -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 5px rgba(0, 0, 0, 0.075); - box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 5px rgba(0, 0, 0, 0.075); -} - -.navbar .navbar-nav > .active > a { - background-color: #f8f8f8; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 5px rgba(0, 0, 0, .075); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 5px rgba(0, 0, 0, .075); +} +.navbar-default .navbar-nav > .open > a, +.navbar-default .navbar-nav > .active > a { + background-image: -webkit-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%); + background-image: -o-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#dbdbdb), to(#e2e2e2)); + background-image: linear-gradient(to bottom, #dbdbdb 0%, #e2e2e2 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdbdbdb', endColorstr='#ffe2e2e2', GradientType=0); + background-repeat: repeat-x; + -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, .075); + box-shadow: inset 0 3px 9px rgba(0, 0, 0, .075); } - .navbar-brand, .navbar-nav > li > a { - text-shadow: 0 1px 0 rgba(255, 255, 255, 0.25); + text-shadow: 0 1px 0 rgba(255, 255, 255, .25); } - .navbar-inverse { - background-image: -webkit-gradient(linear, left 0%, left 100%, from(#3c3c3c), to(#222222)); - background-image: -webkit-linear-gradient(top, #3c3c3c, 0%, #222222, 100%); - background-image: -moz-linear-gradient(top, #3c3c3c 0%, #222222 100%); - background-image: linear-gradient(to bottom, #3c3c3c 0%, #222222 100%); - background-repeat: repeat-x; + background-image: -webkit-linear-gradient(top, #3c3c3c 0%, #222 100%); + background-image: -o-linear-gradient(top, #3c3c3c 0%, #222 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#3c3c3c), to(#222)); + background-image: linear-gradient(to bottom, #3c3c3c 0%, #222 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); + background-repeat: repeat-x; } - +.navbar-inverse .navbar-nav > .open > a, .navbar-inverse .navbar-nav > .active > a { - background-color: #222222; + background-image: -webkit-linear-gradient(top, #080808 0%, #0f0f0f 100%); + background-image: -o-linear-gradient(top, #080808 0%, #0f0f0f 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#080808), to(#0f0f0f)); + background-image: linear-gradient(to bottom, #080808 0%, #0f0f0f 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff080808', endColorstr='#ff0f0f0f', GradientType=0); + background-repeat: repeat-x; + -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, .25); + box-shadow: inset 0 3px 9px rgba(0, 0, 0, .25); } - .navbar-inverse .navbar-brand, .navbar-inverse .navbar-nav > li > a { - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + text-shadow: 0 -1px 0 rgba(0, 0, 0, .25); } - .navbar-static-top, .navbar-fixed-top, .navbar-fixed-bottom { border-radius: 0; } - .alert { - text-shadow: 0 1px 0 rgba(255, 255, 255, 0.2); - -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05); - box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05); + text-shadow: 0 1px 0 rgba(255, 255, 255, .2); + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .25), 0 1px 2px rgba(0, 0, 0, .05); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, .25), 0 1px 2px rgba(0, 0, 0, .05); } - .alert-success { - background-image: -webkit-gradient(linear, left 0%, left 100%, from(#dff0d8), to(#c8e5bc)); - background-image: -webkit-linear-gradient(top, #dff0d8, 0%, #c8e5bc, 100%); - background-image: -moz-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%); - background-image: linear-gradient(to bottom, #dff0d8 0%, #c8e5bc 100%); + background-image: -webkit-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%); + background-image: -o-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#dff0d8), to(#c8e5bc)); + background-image: linear-gradient(to bottom, #dff0d8 0%, #c8e5bc 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0); background-repeat: repeat-x; border-color: #b2dba1; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0); } - .alert-info { - background-image: -webkit-gradient(linear, left 0%, left 100%, from(#d9edf7), to(#b9def0)); - background-image: -webkit-linear-gradient(top, #d9edf7, 0%, #b9def0, 100%); - background-image: -moz-linear-gradient(top, #d9edf7 0%, #b9def0 100%); - background-image: linear-gradient(to bottom, #d9edf7 0%, #b9def0 100%); + background-image: -webkit-linear-gradient(top, #d9edf7 0%, #b9def0 100%); + background-image: -o-linear-gradient(top, #d9edf7 0%, #b9def0 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#d9edf7), to(#b9def0)); + background-image: linear-gradient(to bottom, #d9edf7 0%, #b9def0 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0); background-repeat: repeat-x; border-color: #9acfea; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0); } - .alert-warning { - background-image: -webkit-gradient(linear, left 0%, left 100%, from(#fcf8e3), to(#f8efc0)); - background-image: -webkit-linear-gradient(top, #fcf8e3, 0%, #f8efc0, 100%); - background-image: -moz-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%); - background-image: linear-gradient(to bottom, #fcf8e3 0%, #f8efc0 100%); + background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%); + background-image: -o-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#fcf8e3), to(#f8efc0)); + background-image: linear-gradient(to bottom, #fcf8e3 0%, #f8efc0 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0); background-repeat: repeat-x; border-color: #f5e79e; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0); } - .alert-danger { - background-image: -webkit-gradient(linear, left 0%, left 100%, from(#f2dede), to(#e7c3c3)); - background-image: -webkit-linear-gradient(top, #f2dede, 0%, #e7c3c3, 100%); - background-image: -moz-linear-gradient(top, #f2dede 0%, #e7c3c3 100%); - background-image: linear-gradient(to bottom, #f2dede 0%, #e7c3c3 100%); + background-image: -webkit-linear-gradient(top, #f2dede 0%, #e7c3c3 100%); + background-image: -o-linear-gradient(top, #f2dede 0%, #e7c3c3 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#f2dede), to(#e7c3c3)); + background-image: linear-gradient(to bottom, #f2dede 0%, #e7c3c3 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0); background-repeat: repeat-x; border-color: #dca7a7; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0); } - .progress { - background-image: -webkit-gradient(linear, left 0%, left 100%, from(#ebebeb), to(#f5f5f5)); - background-image: -webkit-linear-gradient(top, #ebebeb, 0%, #f5f5f5, 100%); - background-image: -moz-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%); - background-image: linear-gradient(to bottom, #ebebeb 0%, #f5f5f5 100%); - background-repeat: repeat-x; + background-image: -webkit-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%); + background-image: -o-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#ebebeb), to(#f5f5f5)); + background-image: linear-gradient(to bottom, #ebebeb 0%, #f5f5f5 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0); + background-repeat: repeat-x; } - .progress-bar { - background-image: -webkit-gradient(linear, left 0%, left 100%, from(#428bca), to(#3071a9)); - background-image: -webkit-linear-gradient(top, #428bca, 0%, #3071a9, 100%); - background-image: -moz-linear-gradient(top, #428bca 0%, #3071a9 100%); - background-image: linear-gradient(to bottom, #428bca 0%, #3071a9 100%); - background-repeat: repeat-x; + background-image: -webkit-linear-gradient(top, #428bca 0%, #3071a9 100%); + background-image: -o-linear-gradient(top, #428bca 0%, #3071a9 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#428bca), to(#3071a9)); + background-image: linear-gradient(to bottom, #428bca 0%, #3071a9 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff3071a9', GradientType=0); + background-repeat: repeat-x; } - .progress-bar-success { - background-image: -webkit-gradient(linear, left 0%, left 100%, from(#5cb85c), to(#449d44)); - background-image: -webkit-linear-gradient(top, #5cb85c, 0%, #449d44, 100%); - background-image: -moz-linear-gradient(top, #5cb85c 0%, #449d44 100%); - background-image: linear-gradient(to bottom, #5cb85c 0%, #449d44 100%); - background-repeat: repeat-x; + background-image: -webkit-linear-gradient(top, #5cb85c 0%, #449d44 100%); + background-image: -o-linear-gradient(top, #5cb85c 0%, #449d44 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#5cb85c), to(#449d44)); + background-image: linear-gradient(to bottom, #5cb85c 0%, #449d44 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0); + background-repeat: repeat-x; } - .progress-bar-info { - background-image: -webkit-gradient(linear, left 0%, left 100%, from(#5bc0de), to(#31b0d5)); - background-image: -webkit-linear-gradient(top, #5bc0de, 0%, #31b0d5, 100%); - background-image: -moz-linear-gradient(top, #5bc0de 0%, #31b0d5 100%); - background-image: linear-gradient(to bottom, #5bc0de 0%, #31b0d5 100%); - background-repeat: repeat-x; + background-image: -webkit-linear-gradient(top, #5bc0de 0%, #31b0d5 100%); + background-image: -o-linear-gradient(top, #5bc0de 0%, #31b0d5 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#5bc0de), to(#31b0d5)); + background-image: linear-gradient(to bottom, #5bc0de 0%, #31b0d5 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0); + background-repeat: repeat-x; } - .progress-bar-warning { - background-image: -webkit-gradient(linear, left 0%, left 100%, from(#f0ad4e), to(#ec971f)); - background-image: -webkit-linear-gradient(top, #f0ad4e, 0%, #ec971f, 100%); - background-image: -moz-linear-gradient(top, #f0ad4e 0%, #ec971f 100%); - background-image: linear-gradient(to bottom, #f0ad4e 0%, #ec971f 100%); - background-repeat: repeat-x; + background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #ec971f 100%); + background-image: -o-linear-gradient(top, #f0ad4e 0%, #ec971f 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#f0ad4e), to(#ec971f)); + background-image: linear-gradient(to bottom, #f0ad4e 0%, #ec971f 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0); + background-repeat: repeat-x; } - .progress-bar-danger { - background-image: -webkit-gradient(linear, left 0%, left 100%, from(#d9534f), to(#c9302c)); - background-image: -webkit-linear-gradient(top, #d9534f, 0%, #c9302c, 100%); - background-image: -moz-linear-gradient(top, #d9534f 0%, #c9302c 100%); - background-image: linear-gradient(to bottom, #d9534f 0%, #c9302c 100%); - background-repeat: repeat-x; + background-image: -webkit-linear-gradient(top, #d9534f 0%, #c9302c 100%); + background-image: -o-linear-gradient(top, #d9534f 0%, #c9302c 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#d9534f), to(#c9302c)); + background-image: linear-gradient(to bottom, #d9534f 0%, #c9302c 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0); + background-repeat: repeat-x; +} +.progress-bar-striped { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); } - .list-group { border-radius: 4px; - -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075); - box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075); + -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .075); + box-shadow: 0 1px 2px rgba(0, 0, 0, .075); } - .list-group-item.active, .list-group-item.active:hover, .list-group-item.active:focus { text-shadow: 0 -1px 0 #3071a9; - background-image: -webkit-gradient(linear, left 0%, left 100%, from(#428bca), to(#3278b3)); - background-image: -webkit-linear-gradient(top, #428bca, 0%, #3278b3, 100%); - background-image: -moz-linear-gradient(top, #428bca 0%, #3278b3 100%); - background-image: linear-gradient(to bottom, #428bca 0%, #3278b3 100%); + background-image: -webkit-linear-gradient(top, #428bca 0%, #3278b3 100%); + background-image: -o-linear-gradient(top, #428bca 0%, #3278b3 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#428bca), to(#3278b3)); + background-image: linear-gradient(to bottom, #428bca 0%, #3278b3 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff3278b3', GradientType=0); background-repeat: repeat-x; border-color: #3278b3; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff3278b3', GradientType=0); } - +.list-group-item.active .badge, +.list-group-item.active:hover .badge, +.list-group-item.active:focus .badge { + text-shadow: none; +} .panel { - -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); - box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); + -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .05); + box-shadow: 0 1px 2px rgba(0, 0, 0, .05); } - .panel-default > .panel-heading { - background-image: -webkit-gradient(linear, left 0%, left 100%, from(#f5f5f5), to(#e8e8e8)); - background-image: -webkit-linear-gradient(top, #f5f5f5, 0%, #e8e8e8, 100%); - background-image: -moz-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); - background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%); - background-repeat: repeat-x; + background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); + background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#f5f5f5), to(#e8e8e8)); + background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0); + background-repeat: repeat-x; } - .panel-primary > .panel-heading { - background-image: -webkit-gradient(linear, left 0%, left 100%, from(#428bca), to(#357ebd)); - background-image: -webkit-linear-gradient(top, #428bca, 0%, #357ebd, 100%); - background-image: -moz-linear-gradient(top, #428bca 0%, #357ebd 100%); - background-image: linear-gradient(to bottom, #428bca 0%, #357ebd 100%); - background-repeat: repeat-x; + background-image: -webkit-linear-gradient(top, #428bca 0%, #357ebd 100%); + background-image: -o-linear-gradient(top, #428bca 0%, #357ebd 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#428bca), to(#357ebd)); + background-image: linear-gradient(to bottom, #428bca 0%, #357ebd 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff357ebd', GradientType=0); + background-repeat: repeat-x; } - .panel-success > .panel-heading { - background-image: -webkit-gradient(linear, left 0%, left 100%, from(#dff0d8), to(#d0e9c6)); - background-image: -webkit-linear-gradient(top, #dff0d8, 0%, #d0e9c6, 100%); - background-image: -moz-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%); - background-image: linear-gradient(to bottom, #dff0d8 0%, #d0e9c6 100%); - background-repeat: repeat-x; + background-image: -webkit-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%); + background-image: -o-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#dff0d8), to(#d0e9c6)); + background-image: linear-gradient(to bottom, #dff0d8 0%, #d0e9c6 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0); + background-repeat: repeat-x; } - .panel-info > .panel-heading { - background-image: -webkit-gradient(linear, left 0%, left 100%, from(#d9edf7), to(#c4e3f3)); - background-image: -webkit-linear-gradient(top, #d9edf7, 0%, #c4e3f3, 100%); - background-image: -moz-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%); - background-image: linear-gradient(to bottom, #d9edf7 0%, #c4e3f3 100%); - background-repeat: repeat-x; + background-image: -webkit-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%); + background-image: -o-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#d9edf7), to(#c4e3f3)); + background-image: linear-gradient(to bottom, #d9edf7 0%, #c4e3f3 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0); + background-repeat: repeat-x; } - .panel-warning > .panel-heading { - background-image: -webkit-gradient(linear, left 0%, left 100%, from(#fcf8e3), to(#faf2cc)); - background-image: -webkit-linear-gradient(top, #fcf8e3, 0%, #faf2cc, 100%); - background-image: -moz-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%); - background-image: linear-gradient(to bottom, #fcf8e3 0%, #faf2cc 100%); - background-repeat: repeat-x; + background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%); + background-image: -o-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#fcf8e3), to(#faf2cc)); + background-image: linear-gradient(to bottom, #fcf8e3 0%, #faf2cc 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0); + background-repeat: repeat-x; } - .panel-danger > .panel-heading { - background-image: -webkit-gradient(linear, left 0%, left 100%, from(#f2dede), to(#ebcccc)); - background-image: -webkit-linear-gradient(top, #f2dede, 0%, #ebcccc, 100%); - background-image: -moz-linear-gradient(top, #f2dede 0%, #ebcccc 100%); - background-image: linear-gradient(to bottom, #f2dede 0%, #ebcccc 100%); - background-repeat: repeat-x; + background-image: -webkit-linear-gradient(top, #f2dede 0%, #ebcccc 100%); + background-image: -o-linear-gradient(top, #f2dede 0%, #ebcccc 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#f2dede), to(#ebcccc)); + background-image: linear-gradient(to bottom, #f2dede 0%, #ebcccc 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0); + background-repeat: repeat-x; } - .well { - background-image: -webkit-gradient(linear, left 0%, left 100%, from(#e8e8e8), to(#f5f5f5)); - background-image: -webkit-linear-gradient(top, #e8e8e8, 0%, #f5f5f5, 100%); - background-image: -moz-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%); - background-image: linear-gradient(to bottom, #e8e8e8 0%, #f5f5f5 100%); + background-image: -webkit-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%); + background-image: -o-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#e8e8e8), to(#f5f5f5)); + background-image: linear-gradient(to bottom, #e8e8e8 0%, #f5f5f5 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0); background-repeat: repeat-x; border-color: #dcdcdc; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0); - -webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.05), 0 1px 0 rgba(255, 255, 255, 0.1); - box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.05), 0 1px 0 rgba(255, 255, 255, 0.1); -} \ No newline at end of file + -webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, .05), 0 1px 0 rgba(255, 255, 255, .1); + box-shadow: inset 0 1px 3px rgba(0, 0, 0, .05), 0 1px 0 rgba(255, 255, 255, .1); +} +/*# sourceMappingURL=bootstrap-theme.css.map */ diff --git a/vendor/bootstrap/css/bootstrap-theme.css.map b/vendor/bootstrap/css/bootstrap-theme.css.map new file mode 100755 index 000000000..1ea032ac1 --- /dev/null +++ b/vendor/bootstrap/css/bootstrap-theme.css.map @@ -0,0 +1 @@ +{"version":3,"sources":["less/theme.less","less/mixins/vendor-prefixes.less","bootstrap-theme.css","less/mixins/gradients.less","less/mixins/reset-filter.less"],"names":[],"mappings":"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","file":"bootstrap-theme.css","sourcesContent":["\n//\n// Load core variables and mixins\n// --------------------------------------------------\n\n@import \"variables.less\";\n@import \"mixins.less\";\n\n\n//\n// Buttons\n// --------------------------------------------------\n\n// Common styles\n.btn-default,\n.btn-primary,\n.btn-success,\n.btn-info,\n.btn-warning,\n.btn-danger {\n text-shadow: 0 -1px 0 rgba(0,0,0,.2);\n @shadow: inset 0 1px 0 rgba(255,255,255,.15), 0 1px 1px rgba(0,0,0,.075);\n .box-shadow(@shadow);\n\n // Reset the shadow\n &:active,\n &.active {\n .box-shadow(inset 0 3px 5px rgba(0,0,0,.125));\n }\n\n .badge {\n text-shadow: none;\n }\n}\n\n// Mixin for generating new styles\n.btn-styles(@btn-color: #555) {\n #gradient > .vertical(@start-color: @btn-color; @end-color: darken(@btn-color, 12%));\n .reset-filter(); // Disable gradients for IE9 because filter bleeds through rounded corners\n background-repeat: repeat-x;\n border-color: darken(@btn-color, 14%);\n\n &:hover,\n &:focus {\n background-color: darken(@btn-color, 12%);\n background-position: 0 -15px;\n }\n\n &:active,\n &.active {\n background-color: darken(@btn-color, 12%);\n border-color: darken(@btn-color, 14%);\n }\n\n &:disabled,\n &[disabled] {\n background-color: darken(@btn-color, 12%);\n background-image: none;\n }\n}\n\n// Common styles\n.btn {\n // Remove the gradient for the pressed/active state\n &:active,\n &.active {\n background-image: none;\n }\n}\n\n// Apply the mixin to the buttons\n.btn-default { .btn-styles(@btn-default-bg); text-shadow: 0 1px 0 #fff; border-color: #ccc; }\n.btn-primary { .btn-styles(@btn-primary-bg); }\n.btn-success { .btn-styles(@btn-success-bg); }\n.btn-info { .btn-styles(@btn-info-bg); }\n.btn-warning { .btn-styles(@btn-warning-bg); }\n.btn-danger { .btn-styles(@btn-danger-bg); }\n\n\n//\n// Images\n// --------------------------------------------------\n\n.thumbnail,\n.img-thumbnail {\n .box-shadow(0 1px 2px rgba(0,0,0,.075));\n}\n\n\n//\n// Dropdowns\n// --------------------------------------------------\n\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n #gradient > .vertical(@start-color: @dropdown-link-hover-bg; @end-color: darken(@dropdown-link-hover-bg, 5%));\n background-color: darken(@dropdown-link-hover-bg, 5%);\n}\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n #gradient > .vertical(@start-color: @dropdown-link-active-bg; @end-color: darken(@dropdown-link-active-bg, 5%));\n background-color: darken(@dropdown-link-active-bg, 5%);\n}\n\n\n//\n// Navbar\n// --------------------------------------------------\n\n// Default navbar\n.navbar-default {\n #gradient > .vertical(@start-color: lighten(@navbar-default-bg, 10%); @end-color: @navbar-default-bg);\n .reset-filter(); // Remove gradient in IE<10 to fix bug where dropdowns don't get triggered\n border-radius: @navbar-border-radius;\n @shadow: inset 0 1px 0 rgba(255,255,255,.15), 0 1px 5px rgba(0,0,0,.075);\n .box-shadow(@shadow);\n\n .navbar-nav > .open > a,\n .navbar-nav > .active > a {\n #gradient > .vertical(@start-color: darken(@navbar-default-link-active-bg, 5%); @end-color: darken(@navbar-default-link-active-bg, 2%));\n .box-shadow(inset 0 3px 9px rgba(0,0,0,.075));\n }\n}\n.navbar-brand,\n.navbar-nav > li > a {\n text-shadow: 0 1px 0 rgba(255,255,255,.25);\n}\n\n// Inverted navbar\n.navbar-inverse {\n #gradient > .vertical(@start-color: lighten(@navbar-inverse-bg, 10%); @end-color: @navbar-inverse-bg);\n .reset-filter(); // Remove gradient in IE<10 to fix bug where dropdowns don't get triggered\n\n .navbar-nav > .open > a,\n .navbar-nav > .active > a {\n #gradient > .vertical(@start-color: @navbar-inverse-link-active-bg; @end-color: lighten(@navbar-inverse-link-active-bg, 2.5%));\n .box-shadow(inset 0 3px 9px rgba(0,0,0,.25));\n }\n\n .navbar-brand,\n .navbar-nav > li > a {\n text-shadow: 0 -1px 0 rgba(0,0,0,.25);\n }\n}\n\n// Undo rounded corners in static and fixed navbars\n.navbar-static-top,\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n border-radius: 0;\n}\n\n\n//\n// Alerts\n// --------------------------------------------------\n\n// Common styles\n.alert {\n text-shadow: 0 1px 0 rgba(255,255,255,.2);\n @shadow: inset 0 1px 0 rgba(255,255,255,.25), 0 1px 2px rgba(0,0,0,.05);\n .box-shadow(@shadow);\n}\n\n// Mixin for generating new styles\n.alert-styles(@color) {\n #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 7.5%));\n border-color: darken(@color, 15%);\n}\n\n// Apply the mixin to the alerts\n.alert-success { .alert-styles(@alert-success-bg); }\n.alert-info { .alert-styles(@alert-info-bg); }\n.alert-warning { .alert-styles(@alert-warning-bg); }\n.alert-danger { .alert-styles(@alert-danger-bg); }\n\n\n//\n// Progress bars\n// --------------------------------------------------\n\n// Give the progress background some depth\n.progress {\n #gradient > .vertical(@start-color: darken(@progress-bg, 4%); @end-color: @progress-bg)\n}\n\n// Mixin for generating new styles\n.progress-bar-styles(@color) {\n #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 10%));\n}\n\n// Apply the mixin to the progress bars\n.progress-bar { .progress-bar-styles(@progress-bar-bg); }\n.progress-bar-success { .progress-bar-styles(@progress-bar-success-bg); }\n.progress-bar-info { .progress-bar-styles(@progress-bar-info-bg); }\n.progress-bar-warning { .progress-bar-styles(@progress-bar-warning-bg); }\n.progress-bar-danger { .progress-bar-styles(@progress-bar-danger-bg); }\n\n// Reset the striped class because our mixins don't do multiple gradients and\n// the above custom styles override the new `.progress-bar-striped` in v3.2.0.\n.progress-bar-striped {\n #gradient > .striped();\n}\n\n\n//\n// List groups\n// --------------------------------------------------\n\n.list-group {\n border-radius: @border-radius-base;\n .box-shadow(0 1px 2px rgba(0,0,0,.075));\n}\n.list-group-item.active,\n.list-group-item.active:hover,\n.list-group-item.active:focus {\n text-shadow: 0 -1px 0 darken(@list-group-active-bg, 10%);\n #gradient > .vertical(@start-color: @list-group-active-bg; @end-color: darken(@list-group-active-bg, 7.5%));\n border-color: darken(@list-group-active-border, 7.5%);\n\n .badge {\n text-shadow: none;\n }\n}\n\n\n//\n// Panels\n// --------------------------------------------------\n\n// Common styles\n.panel {\n .box-shadow(0 1px 2px rgba(0,0,0,.05));\n}\n\n// Mixin for generating new styles\n.panel-heading-styles(@color) {\n #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 5%));\n}\n\n// Apply the mixin to the panel headings only\n.panel-default > .panel-heading { .panel-heading-styles(@panel-default-heading-bg); }\n.panel-primary > .panel-heading { .panel-heading-styles(@panel-primary-heading-bg); }\n.panel-success > .panel-heading { .panel-heading-styles(@panel-success-heading-bg); }\n.panel-info > .panel-heading { .panel-heading-styles(@panel-info-heading-bg); }\n.panel-warning > .panel-heading { .panel-heading-styles(@panel-warning-heading-bg); }\n.panel-danger > .panel-heading { .panel-heading-styles(@panel-danger-heading-bg); }\n\n\n//\n// Wells\n// --------------------------------------------------\n\n.well {\n #gradient > .vertical(@start-color: darken(@well-bg, 5%); @end-color: @well-bg);\n border-color: darken(@well-bg, 10%);\n @shadow: inset 0 1px 3px rgba(0,0,0,.05), 0 1px 0 rgba(255,255,255,.1);\n .box-shadow(@shadow);\n}\n","// Vendor Prefixes\n//\n// All vendor mixins are deprecated as of v3.2.0 due to the introduction of\n// Autoprefixer in our Gruntfile. They will be removed in v4.\n\n// - Animations\n// - Backface visibility\n// - Box shadow\n// - Box sizing\n// - Content columns\n// - Hyphens\n// - Placeholder text\n// - Transformations\n// - Transitions\n// - User Select\n\n\n// Animations\n.animation(@animation) {\n -webkit-animation: @animation;\n -o-animation: @animation;\n animation: @animation;\n}\n.animation-name(@name) {\n -webkit-animation-name: @name;\n animation-name: @name;\n}\n.animation-duration(@duration) {\n -webkit-animation-duration: @duration;\n animation-duration: @duration;\n}\n.animation-timing-function(@timing-function) {\n -webkit-animation-timing-function: @timing-function;\n animation-timing-function: @timing-function;\n}\n.animation-delay(@delay) {\n -webkit-animation-delay: @delay;\n animation-delay: @delay;\n}\n.animation-iteration-count(@iteration-count) {\n -webkit-animation-iteration-count: @iteration-count;\n animation-iteration-count: @iteration-count;\n}\n.animation-direction(@direction) {\n -webkit-animation-direction: @direction;\n animation-direction: @direction;\n}\n.animation-fill-mode(@fill-mode) {\n -webkit-animation-fill-mode: @fill-mode;\n animation-fill-mode: @fill-mode;\n}\n\n// Backface visibility\n// Prevent browsers from flickering when using CSS 3D transforms.\n// Default value is `visible`, but can be changed to `hidden`\n\n.backface-visibility(@visibility){\n -webkit-backface-visibility: @visibility;\n -moz-backface-visibility: @visibility;\n backface-visibility: @visibility;\n}\n\n// Drop shadows\n//\n// Note: Deprecated `.box-shadow()` as of v3.1.0 since all of Bootstrap's\n// supported browsers that have box shadow capabilities now support it.\n\n.box-shadow(@shadow) {\n -webkit-box-shadow: @shadow; // iOS <4.3 & Android <4.1\n box-shadow: @shadow;\n}\n\n// Box sizing\n.box-sizing(@boxmodel) {\n -webkit-box-sizing: @boxmodel;\n -moz-box-sizing: @boxmodel;\n box-sizing: @boxmodel;\n}\n\n// CSS3 Content Columns\n.content-columns(@column-count; @column-gap: @grid-gutter-width) {\n -webkit-column-count: @column-count;\n -moz-column-count: @column-count;\n column-count: @column-count;\n -webkit-column-gap: @column-gap;\n -moz-column-gap: @column-gap;\n column-gap: @column-gap;\n}\n\n// Optional hyphenation\n.hyphens(@mode: auto) {\n word-wrap: break-word;\n -webkit-hyphens: @mode;\n -moz-hyphens: @mode;\n -ms-hyphens: @mode; // IE10+\n -o-hyphens: @mode;\n hyphens: @mode;\n}\n\n// Placeholder text\n.placeholder(@color: @input-color-placeholder) {\n // Firefox\n &::-moz-placeholder {\n color: @color;\n opacity: 1; // See https://github.com/twbs/bootstrap/pull/11526\n }\n &:-ms-input-placeholder { color: @color; } // Internet Explorer 10+\n &::-webkit-input-placeholder { color: @color; } // Safari and Chrome\n}\n\n// Transformations\n.scale(@ratio) {\n -webkit-transform: scale(@ratio);\n -ms-transform: scale(@ratio); // IE9 only\n -o-transform: scale(@ratio);\n transform: scale(@ratio);\n}\n.scale(@ratioX; @ratioY) {\n -webkit-transform: scale(@ratioX, @ratioY);\n -ms-transform: scale(@ratioX, @ratioY); // IE9 only\n -o-transform: scale(@ratioX, @ratioY);\n transform: scale(@ratioX, @ratioY);\n}\n.scaleX(@ratio) {\n -webkit-transform: scaleX(@ratio);\n -ms-transform: scaleX(@ratio); // IE9 only\n -o-transform: scaleX(@ratio);\n transform: scaleX(@ratio);\n}\n.scaleY(@ratio) {\n -webkit-transform: scaleY(@ratio);\n -ms-transform: scaleY(@ratio); // IE9 only\n -o-transform: scaleY(@ratio);\n transform: scaleY(@ratio);\n}\n.skew(@x; @y) {\n -webkit-transform: skewX(@x) skewY(@y);\n -ms-transform: skewX(@x) skewY(@y); // See https://github.com/twbs/bootstrap/issues/4885; IE9+\n -o-transform: skewX(@x) skewY(@y);\n transform: skewX(@x) skewY(@y);\n}\n.translate(@x; @y) {\n -webkit-transform: translate(@x, @y);\n -ms-transform: translate(@x, @y); // IE9 only\n -o-transform: translate(@x, @y);\n transform: translate(@x, @y);\n}\n.translate3d(@x; @y; @z) {\n -webkit-transform: translate3d(@x, @y, @z);\n transform: translate3d(@x, @y, @z);\n}\n.rotate(@degrees) {\n -webkit-transform: rotate(@degrees);\n -ms-transform: rotate(@degrees); // IE9 only\n -o-transform: rotate(@degrees);\n transform: rotate(@degrees);\n}\n.rotateX(@degrees) {\n -webkit-transform: rotateX(@degrees);\n -ms-transform: rotateX(@degrees); // IE9 only\n -o-transform: rotateX(@degrees);\n transform: rotateX(@degrees);\n}\n.rotateY(@degrees) {\n -webkit-transform: rotateY(@degrees);\n -ms-transform: rotateY(@degrees); // IE9 only\n -o-transform: rotateY(@degrees);\n transform: rotateY(@degrees);\n}\n.perspective(@perspective) {\n -webkit-perspective: @perspective;\n -moz-perspective: @perspective;\n perspective: @perspective;\n}\n.perspective-origin(@perspective) {\n -webkit-perspective-origin: @perspective;\n -moz-perspective-origin: @perspective;\n perspective-origin: @perspective;\n}\n.transform-origin(@origin) {\n -webkit-transform-origin: @origin;\n -moz-transform-origin: @origin;\n -ms-transform-origin: @origin; // IE9 only\n transform-origin: @origin;\n}\n\n\n// Transitions\n\n.transition(@transition) {\n -webkit-transition: @transition;\n -o-transition: @transition;\n transition: @transition;\n}\n.transition-property(@transition-property) {\n -webkit-transition-property: @transition-property;\n transition-property: @transition-property;\n}\n.transition-delay(@transition-delay) {\n -webkit-transition-delay: @transition-delay;\n transition-delay: @transition-delay;\n}\n.transition-duration(@transition-duration) {\n -webkit-transition-duration: @transition-duration;\n transition-duration: @transition-duration;\n}\n.transition-timing-function(@timing-function) {\n -webkit-transition-timing-function: @timing-function;\n transition-timing-function: @timing-function;\n}\n.transition-transform(@transition) {\n -webkit-transition: -webkit-transform @transition;\n -moz-transition: -moz-transform @transition;\n -o-transition: -o-transform @transition;\n transition: transform @transition;\n}\n\n\n// User select\n// For selecting text on the page\n\n.user-select(@select) {\n -webkit-user-select: @select;\n -moz-user-select: @select;\n -ms-user-select: @select; // IE10+\n user-select: @select;\n}\n",".btn-default,\n.btn-primary,\n.btn-success,\n.btn-info,\n.btn-warning,\n.btn-danger {\n text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.2);\n -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.btn-default:active,\n.btn-primary:active,\n.btn-success:active,\n.btn-info:active,\n.btn-warning:active,\n.btn-danger:active,\n.btn-default.active,\n.btn-primary.active,\n.btn-success.active,\n.btn-info.active,\n.btn-warning.active,\n.btn-danger.active {\n -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n}\n.btn-default .badge,\n.btn-primary .badge,\n.btn-success .badge,\n.btn-info .badge,\n.btn-warning .badge,\n.btn-danger .badge {\n text-shadow: none;\n}\n.btn:active,\n.btn.active {\n background-image: none;\n}\n.btn-default {\n background-image: -webkit-linear-gradient(top, #ffffff 0%, #e0e0e0 100%);\n background-image: -o-linear-gradient(top, #ffffff 0%, #e0e0e0 100%);\n background-image: linear-gradient(to bottom, #ffffff 0%, #e0e0e0 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #dbdbdb;\n text-shadow: 0 1px 0 #fff;\n border-color: #ccc;\n}\n.btn-default:hover,\n.btn-default:focus {\n background-color: #e0e0e0;\n background-position: 0 -15px;\n}\n.btn-default:active,\n.btn-default.active {\n background-color: #e0e0e0;\n border-color: #dbdbdb;\n}\n.btn-default:disabled,\n.btn-default[disabled] {\n background-color: #e0e0e0;\n background-image: none;\n}\n.btn-primary {\n background-image: -webkit-linear-gradient(top, #428bca 0%, #2d6ca2 100%);\n background-image: -o-linear-gradient(top, #428bca 0%, #2d6ca2 100%);\n background-image: linear-gradient(to bottom, #428bca 0%, #2d6ca2 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff2d6ca2', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #2b669a;\n}\n.btn-primary:hover,\n.btn-primary:focus {\n background-color: #2d6ca2;\n background-position: 0 -15px;\n}\n.btn-primary:active,\n.btn-primary.active {\n background-color: #2d6ca2;\n border-color: #2b669a;\n}\n.btn-primary:disabled,\n.btn-primary[disabled] {\n background-color: #2d6ca2;\n background-image: none;\n}\n.btn-success {\n background-image: -webkit-linear-gradient(top, #5cb85c 0%, #419641 100%);\n background-image: -o-linear-gradient(top, #5cb85c 0%, #419641 100%);\n background-image: linear-gradient(to bottom, #5cb85c 0%, #419641 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #3e8f3e;\n}\n.btn-success:hover,\n.btn-success:focus {\n background-color: #419641;\n background-position: 0 -15px;\n}\n.btn-success:active,\n.btn-success.active {\n background-color: #419641;\n border-color: #3e8f3e;\n}\n.btn-success:disabled,\n.btn-success[disabled] {\n background-color: #419641;\n background-image: none;\n}\n.btn-info {\n background-image: -webkit-linear-gradient(top, #5bc0de 0%, #2aabd2 100%);\n background-image: -o-linear-gradient(top, #5bc0de 0%, #2aabd2 100%);\n background-image: linear-gradient(to bottom, #5bc0de 0%, #2aabd2 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #28a4c9;\n}\n.btn-info:hover,\n.btn-info:focus {\n background-color: #2aabd2;\n background-position: 0 -15px;\n}\n.btn-info:active,\n.btn-info.active {\n background-color: #2aabd2;\n border-color: #28a4c9;\n}\n.btn-info:disabled,\n.btn-info[disabled] {\n background-color: #2aabd2;\n background-image: none;\n}\n.btn-warning {\n background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #eb9316 100%);\n background-image: -o-linear-gradient(top, #f0ad4e 0%, #eb9316 100%);\n background-image: linear-gradient(to bottom, #f0ad4e 0%, #eb9316 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #e38d13;\n}\n.btn-warning:hover,\n.btn-warning:focus {\n background-color: #eb9316;\n background-position: 0 -15px;\n}\n.btn-warning:active,\n.btn-warning.active {\n background-color: #eb9316;\n border-color: #e38d13;\n}\n.btn-warning:disabled,\n.btn-warning[disabled] {\n background-color: #eb9316;\n background-image: none;\n}\n.btn-danger {\n background-image: -webkit-linear-gradient(top, #d9534f 0%, #c12e2a 100%);\n background-image: -o-linear-gradient(top, #d9534f 0%, #c12e2a 100%);\n background-image: linear-gradient(to bottom, #d9534f 0%, #c12e2a 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #b92c28;\n}\n.btn-danger:hover,\n.btn-danger:focus {\n background-color: #c12e2a;\n background-position: 0 -15px;\n}\n.btn-danger:active,\n.btn-danger.active {\n background-color: #c12e2a;\n border-color: #b92c28;\n}\n.btn-danger:disabled,\n.btn-danger[disabled] {\n background-color: #c12e2a;\n background-image: none;\n}\n.thumbnail,\n.img-thumbnail {\n -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);\n}\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);\n background-color: #e8e8e8;\n}\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n background-image: -webkit-linear-gradient(top, #428bca 0%, #357ebd 100%);\n background-image: -o-linear-gradient(top, #428bca 0%, #357ebd 100%);\n background-image: linear-gradient(to bottom, #428bca 0%, #357ebd 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff357ebd', GradientType=0);\n background-color: #357ebd;\n}\n.navbar-default {\n background-image: -webkit-linear-gradient(top, #ffffff 0%, #f8f8f8 100%);\n background-image: -o-linear-gradient(top, #ffffff 0%, #f8f8f8 100%);\n background-image: linear-gradient(to bottom, #ffffff 0%, #f8f8f8 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n border-radius: 4px;\n -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 5px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 5px rgba(0, 0, 0, 0.075);\n}\n.navbar-default .navbar-nav > .open > a,\n.navbar-default .navbar-nav > .active > a {\n background-image: -webkit-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%);\n background-image: -o-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%);\n background-image: linear-gradient(to bottom, #dbdbdb 0%, #e2e2e2 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdbdbdb', endColorstr='#ffe2e2e2', GradientType=0);\n -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.075);\n}\n.navbar-brand,\n.navbar-nav > li > a {\n text-shadow: 0 1px 0 rgba(255, 255, 255, 0.25);\n}\n.navbar-inverse {\n background-image: -webkit-linear-gradient(top, #3c3c3c 0%, #222222 100%);\n background-image: -o-linear-gradient(top, #3c3c3c 0%, #222222 100%);\n background-image: linear-gradient(to bottom, #3c3c3c 0%, #222222 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n}\n.navbar-inverse .navbar-nav > .open > a,\n.navbar-inverse .navbar-nav > .active > a {\n background-image: -webkit-linear-gradient(top, #080808 0%, #0f0f0f 100%);\n background-image: -o-linear-gradient(top, #080808 0%, #0f0f0f 100%);\n background-image: linear-gradient(to bottom, #080808 0%, #0f0f0f 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff080808', endColorstr='#ff0f0f0f', GradientType=0);\n -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.25);\n box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.25);\n}\n.navbar-inverse .navbar-brand,\n.navbar-inverse .navbar-nav > li > a {\n text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);\n}\n.navbar-static-top,\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n border-radius: 0;\n}\n.alert {\n text-shadow: 0 1px 0 rgba(255, 255, 255, 0.2);\n -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05);\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05);\n}\n.alert-success {\n background-image: -webkit-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%);\n background-image: -o-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%);\n background-image: linear-gradient(to bottom, #dff0d8 0%, #c8e5bc 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0);\n border-color: #b2dba1;\n}\n.alert-info {\n background-image: -webkit-linear-gradient(top, #d9edf7 0%, #b9def0 100%);\n background-image: -o-linear-gradient(top, #d9edf7 0%, #b9def0 100%);\n background-image: linear-gradient(to bottom, #d9edf7 0%, #b9def0 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0);\n border-color: #9acfea;\n}\n.alert-warning {\n background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%);\n background-image: -o-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%);\n background-image: linear-gradient(to bottom, #fcf8e3 0%, #f8efc0 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0);\n border-color: #f5e79e;\n}\n.alert-danger {\n background-image: -webkit-linear-gradient(top, #f2dede 0%, #e7c3c3 100%);\n background-image: -o-linear-gradient(top, #f2dede 0%, #e7c3c3 100%);\n background-image: linear-gradient(to bottom, #f2dede 0%, #e7c3c3 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0);\n border-color: #dca7a7;\n}\n.progress {\n background-image: -webkit-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%);\n background-image: -o-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%);\n background-image: linear-gradient(to bottom, #ebebeb 0%, #f5f5f5 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0);\n}\n.progress-bar {\n background-image: -webkit-linear-gradient(top, #428bca 0%, #3071a9 100%);\n background-image: -o-linear-gradient(top, #428bca 0%, #3071a9 100%);\n background-image: linear-gradient(to bottom, #428bca 0%, #3071a9 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff3071a9', GradientType=0);\n}\n.progress-bar-success {\n background-image: -webkit-linear-gradient(top, #5cb85c 0%, #449d44 100%);\n background-image: -o-linear-gradient(top, #5cb85c 0%, #449d44 100%);\n background-image: linear-gradient(to bottom, #5cb85c 0%, #449d44 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0);\n}\n.progress-bar-info {\n background-image: -webkit-linear-gradient(top, #5bc0de 0%, #31b0d5 100%);\n background-image: -o-linear-gradient(top, #5bc0de 0%, #31b0d5 100%);\n background-image: linear-gradient(to bottom, #5bc0de 0%, #31b0d5 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0);\n}\n.progress-bar-warning {\n background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #ec971f 100%);\n background-image: -o-linear-gradient(top, #f0ad4e 0%, #ec971f 100%);\n background-image: linear-gradient(to bottom, #f0ad4e 0%, #ec971f 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0);\n}\n.progress-bar-danger {\n background-image: -webkit-linear-gradient(top, #d9534f 0%, #c9302c 100%);\n background-image: -o-linear-gradient(top, #d9534f 0%, #c9302c 100%);\n background-image: linear-gradient(to bottom, #d9534f 0%, #c9302c 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0);\n}\n.progress-bar-striped {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.list-group {\n border-radius: 4px;\n -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);\n}\n.list-group-item.active,\n.list-group-item.active:hover,\n.list-group-item.active:focus {\n text-shadow: 0 -1px 0 #3071a9;\n background-image: -webkit-linear-gradient(top, #428bca 0%, #3278b3 100%);\n background-image: -o-linear-gradient(top, #428bca 0%, #3278b3 100%);\n background-image: linear-gradient(to bottom, #428bca 0%, #3278b3 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff3278b3', GradientType=0);\n border-color: #3278b3;\n}\n.list-group-item.active .badge,\n.list-group-item.active:hover .badge,\n.list-group-item.active:focus .badge {\n text-shadow: none;\n}\n.panel {\n -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);\n}\n.panel-default > .panel-heading {\n background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);\n}\n.panel-primary > .panel-heading {\n background-image: -webkit-linear-gradient(top, #428bca 0%, #357ebd 100%);\n background-image: -o-linear-gradient(top, #428bca 0%, #357ebd 100%);\n background-image: linear-gradient(to bottom, #428bca 0%, #357ebd 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff357ebd', GradientType=0);\n}\n.panel-success > .panel-heading {\n background-image: -webkit-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%);\n background-image: -o-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%);\n background-image: linear-gradient(to bottom, #dff0d8 0%, #d0e9c6 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0);\n}\n.panel-info > .panel-heading {\n background-image: -webkit-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%);\n background-image: -o-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%);\n background-image: linear-gradient(to bottom, #d9edf7 0%, #c4e3f3 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0);\n}\n.panel-warning > .panel-heading {\n background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%);\n background-image: -o-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%);\n background-image: linear-gradient(to bottom, #fcf8e3 0%, #faf2cc 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0);\n}\n.panel-danger > .panel-heading {\n background-image: -webkit-linear-gradient(top, #f2dede 0%, #ebcccc 100%);\n background-image: -o-linear-gradient(top, #f2dede 0%, #ebcccc 100%);\n background-image: linear-gradient(to bottom, #f2dede 0%, #ebcccc 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0);\n}\n.well {\n background-image: -webkit-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%);\n background-image: -o-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%);\n background-image: linear-gradient(to bottom, #e8e8e8 0%, #f5f5f5 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0);\n border-color: #dcdcdc;\n -webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.05), 0 1px 0 rgba(255, 255, 255, 0.1);\n box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.05), 0 1px 0 rgba(255, 255, 255, 0.1);\n}\n/*# sourceMappingURL=bootstrap-theme.css.map */","// Gradients\n\n#gradient {\n\n // Horizontal gradient, from left to right\n //\n // Creates two color stops, start and end, by specifying a color and position for each color stop.\n // Color stops are not available in IE9 and below.\n .horizontal(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n background-image: -webkit-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Opera 12\n background-image: linear-gradient(to right, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n background-repeat: repeat-x;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\",argb(@start-color),argb(@end-color))); // IE9 and down\n }\n\n // Vertical gradient, from top to bottom\n //\n // Creates two color stops, start and end, by specifying a color and position for each color stop.\n // Color stops are not available in IE9 and below.\n .vertical(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n background-image: -webkit-linear-gradient(top, @start-color @start-percent, @end-color @end-percent); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(top, @start-color @start-percent, @end-color @end-percent); // Opera 12\n background-image: linear-gradient(to bottom, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n background-repeat: repeat-x;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\",argb(@start-color),argb(@end-color))); // IE9 and down\n }\n\n .directional(@start-color: #555; @end-color: #333; @deg: 45deg) {\n background-repeat: repeat-x;\n background-image: -webkit-linear-gradient(@deg, @start-color, @end-color); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(@deg, @start-color, @end-color); // Opera 12\n background-image: linear-gradient(@deg, @start-color, @end-color); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n }\n .horizontal-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n background-image: -webkit-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);\n background-image: -o-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);\n background-image: linear-gradient(to right, @start-color, @mid-color @color-stop, @end-color);\n background-repeat: no-repeat;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n }\n .vertical-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n background-image: -webkit-linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-image: -o-linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-image: linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-repeat: no-repeat;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n }\n .radial(@inner-color: #555; @outer-color: #333) {\n background-image: -webkit-radial-gradient(circle, @inner-color, @outer-color);\n background-image: radial-gradient(circle, @inner-color, @outer-color);\n background-repeat: no-repeat;\n }\n .striped(@color: rgba(255,255,255,.15); @angle: 45deg) {\n background-image: -webkit-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n background-image: linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n }\n}\n","// Reset filters for IE\n//\n// When you need to remove a gradient background, do not forget to use this to reset\n// the IE filter for IE9 and below.\n\n.reset-filter() {\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(enabled = false)\"));\n}\n"]} \ No newline at end of file diff --git a/vendor/bootstrap/css/bootstrap-theme.min.css b/vendor/bootstrap/css/bootstrap-theme.min.css old mode 100644 new mode 100755 index cad36b4e6..3bbb05068 --- a/vendor/bootstrap/css/bootstrap-theme.min.css +++ b/vendor/bootstrap/css/bootstrap-theme.min.css @@ -1 +1,5 @@ -.btn-default,.btn-primary,.btn-success,.btn-info,.btn-warning,.btn-danger{text-shadow:0 -1px 0 rgba(0,0,0,0.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.15),0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 0 rgba(255,255,255,0.15),0 1px 1px rgba(0,0,0,0.075)}.btn-default:active,.btn-primary:active,.btn-success:active,.btn-info:active,.btn-warning:active,.btn-danger:active,.btn-default.active,.btn-primary.active,.btn-success.active,.btn-info.active,.btn-warning.active,.btn-danger.active{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn:active,.btn.active{background-image:none}.btn-default{text-shadow:0 1px 0 #fff;background-image:-webkit-gradient(linear,left 0,left 100%,from(#fff),to(#e6e6e6));background-image:-webkit-linear-gradient(top,#fff,0%,#e6e6e6,100%);background-image:-moz-linear-gradient(top,#fff 0,#e6e6e6 100%);background-image:linear-gradient(to bottom,#fff 0,#e6e6e6 100%);background-repeat:repeat-x;border-color:#e0e0e0;border-color:#ccc;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff',endColorstr='#ffe6e6e6',GradientType=0)}.btn-default:active,.btn-default.active{background-color:#e6e6e6;border-color:#e0e0e0}.btn-primary{background-image:-webkit-gradient(linear,left 0,left 100%,from(#428bca),to(#3071a9));background-image:-webkit-linear-gradient(top,#428bca,0%,#3071a9,100%);background-image:-moz-linear-gradient(top,#428bca 0,#3071a9 100%);background-image:linear-gradient(to bottom,#428bca 0,#3071a9 100%);background-repeat:repeat-x;border-color:#2d6ca2;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca',endColorstr='#ff3071a9',GradientType=0)}.btn-primary:active,.btn-primary.active{background-color:#3071a9;border-color:#2d6ca2}.btn-success{background-image:-webkit-gradient(linear,left 0,left 100%,from(#5cb85c),to(#449d44));background-image:-webkit-linear-gradient(top,#5cb85c,0%,#449d44,100%);background-image:-moz-linear-gradient(top,#5cb85c 0,#449d44 100%);background-image:linear-gradient(to bottom,#5cb85c 0,#449d44 100%);background-repeat:repeat-x;border-color:#419641;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c',endColorstr='#ff449d44',GradientType=0)}.btn-success:active,.btn-success.active{background-color:#449d44;border-color:#419641}.btn-warning{background-image:-webkit-gradient(linear,left 0,left 100%,from(#f0ad4e),to(#ec971f));background-image:-webkit-linear-gradient(top,#f0ad4e,0%,#ec971f,100%);background-image:-moz-linear-gradient(top,#f0ad4e 0,#ec971f 100%);background-image:linear-gradient(to bottom,#f0ad4e 0,#ec971f 100%);background-repeat:repeat-x;border-color:#eb9316;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e',endColorstr='#ffec971f',GradientType=0)}.btn-warning:active,.btn-warning.active{background-color:#ec971f;border-color:#eb9316}.btn-danger{background-image:-webkit-gradient(linear,left 0,left 100%,from(#d9534f),to(#c9302c));background-image:-webkit-linear-gradient(top,#d9534f,0%,#c9302c,100%);background-image:-moz-linear-gradient(top,#d9534f 0,#c9302c 100%);background-image:linear-gradient(to bottom,#d9534f 0,#c9302c 100%);background-repeat:repeat-x;border-color:#c12e2a;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f',endColorstr='#ffc9302c',GradientType=0)}.btn-danger:active,.btn-danger.active{background-color:#c9302c;border-color:#c12e2a}.btn-info{background-image:-webkit-gradient(linear,left 0,left 100%,from(#5bc0de),to(#31b0d5));background-image:-webkit-linear-gradient(top,#5bc0de,0%,#31b0d5,100%);background-image:-moz-linear-gradient(top,#5bc0de 0,#31b0d5 100%);background-image:linear-gradient(to bottom,#5bc0de 0,#31b0d5 100%);background-repeat:repeat-x;border-color:#2aabd2;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de',endColorstr='#ff31b0d5',GradientType=0)}.btn-info:active,.btn-info.active{background-color:#31b0d5;border-color:#2aabd2}.thumbnail,.img-thumbnail{-webkit-box-shadow:0 1px 2px rgba(0,0,0,0.075);box-shadow:0 1px 2px rgba(0,0,0,0.075)}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus,.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{background-color:#357ebd;background-image:-webkit-gradient(linear,left 0,left 100%,from(#428bca),to(#357ebd));background-image:-webkit-linear-gradient(top,#428bca,0%,#357ebd,100%);background-image:-moz-linear-gradient(top,#428bca 0,#357ebd 100%);background-image:linear-gradient(to bottom,#428bca 0,#357ebd 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca',endColorstr='#ff357ebd',GradientType=0)}.navbar{background-image:-webkit-gradient(linear,left 0,left 100%,from(#fff),to(#f8f8f8));background-image:-webkit-linear-gradient(top,#fff,0%,#f8f8f8,100%);background-image:-moz-linear-gradient(top,#fff 0,#f8f8f8 100%);background-image:linear-gradient(to bottom,#fff 0,#f8f8f8 100%);background-repeat:repeat-x;border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff',endColorstr='#fff8f8f8',GradientType=0);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.15),0 1px 5px rgba(0,0,0,0.075);box-shadow:inset 0 1px 0 rgba(255,255,255,0.15),0 1px 5px rgba(0,0,0,0.075)}.navbar .navbar-nav>.active>a{background-color:#f8f8f8}.navbar-brand,.navbar-nav>li>a{text-shadow:0 1px 0 rgba(255,255,255,0.25)}.navbar-inverse{background-image:-webkit-gradient(linear,left 0,left 100%,from(#3c3c3c),to(#222));background-image:-webkit-linear-gradient(top,#3c3c3c,0%,#222,100%);background-image:-moz-linear-gradient(top,#3c3c3c 0,#222 100%);background-image:linear-gradient(to bottom,#3c3c3c 0,#222 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c',endColorstr='#ff222222',GradientType=0)}.navbar-inverse .navbar-nav>.active>a{background-color:#222}.navbar-inverse .navbar-brand,.navbar-inverse .navbar-nav>li>a{text-shadow:0 -1px 0 rgba(0,0,0,0.25)}.navbar-static-top,.navbar-fixed-top,.navbar-fixed-bottom{border-radius:0}.alert{text-shadow:0 1px 0 rgba(255,255,255,0.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.25),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 1px 0 rgba(255,255,255,0.25),0 1px 2px rgba(0,0,0,0.05)}.alert-success{background-image:-webkit-gradient(linear,left 0,left 100%,from(#dff0d8),to(#c8e5bc));background-image:-webkit-linear-gradient(top,#dff0d8,0%,#c8e5bc,100%);background-image:-moz-linear-gradient(top,#dff0d8 0,#c8e5bc 100%);background-image:linear-gradient(to bottom,#dff0d8 0,#c8e5bc 100%);background-repeat:repeat-x;border-color:#b2dba1;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8',endColorstr='#ffc8e5bc',GradientType=0)}.alert-info{background-image:-webkit-gradient(linear,left 0,left 100%,from(#d9edf7),to(#b9def0));background-image:-webkit-linear-gradient(top,#d9edf7,0%,#b9def0,100%);background-image:-moz-linear-gradient(top,#d9edf7 0,#b9def0 100%);background-image:linear-gradient(to bottom,#d9edf7 0,#b9def0 100%);background-repeat:repeat-x;border-color:#9acfea;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7',endColorstr='#ffb9def0',GradientType=0)}.alert-warning{background-image:-webkit-gradient(linear,left 0,left 100%,from(#fcf8e3),to(#f8efc0));background-image:-webkit-linear-gradient(top,#fcf8e3,0%,#f8efc0,100%);background-image:-moz-linear-gradient(top,#fcf8e3 0,#f8efc0 100%);background-image:linear-gradient(to bottom,#fcf8e3 0,#f8efc0 100%);background-repeat:repeat-x;border-color:#f5e79e;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3',endColorstr='#fff8efc0',GradientType=0)}.alert-danger{background-image:-webkit-gradient(linear,left 0,left 100%,from(#f2dede),to(#e7c3c3));background-image:-webkit-linear-gradient(top,#f2dede,0%,#e7c3c3,100%);background-image:-moz-linear-gradient(top,#f2dede 0,#e7c3c3 100%);background-image:linear-gradient(to bottom,#f2dede 0,#e7c3c3 100%);background-repeat:repeat-x;border-color:#dca7a7;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede',endColorstr='#ffe7c3c3',GradientType=0)}.progress{background-image:-webkit-gradient(linear,left 0,left 100%,from(#ebebeb),to(#f5f5f5));background-image:-webkit-linear-gradient(top,#ebebeb,0%,#f5f5f5,100%);background-image:-moz-linear-gradient(top,#ebebeb 0,#f5f5f5 100%);background-image:linear-gradient(to bottom,#ebebeb 0,#f5f5f5 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb',endColorstr='#fff5f5f5',GradientType=0)}.progress-bar{background-image:-webkit-gradient(linear,left 0,left 100%,from(#428bca),to(#3071a9));background-image:-webkit-linear-gradient(top,#428bca,0%,#3071a9,100%);background-image:-moz-linear-gradient(top,#428bca 0,#3071a9 100%);background-image:linear-gradient(to bottom,#428bca 0,#3071a9 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca',endColorstr='#ff3071a9',GradientType=0)}.progress-bar-success{background-image:-webkit-gradient(linear,left 0,left 100%,from(#5cb85c),to(#449d44));background-image:-webkit-linear-gradient(top,#5cb85c,0%,#449d44,100%);background-image:-moz-linear-gradient(top,#5cb85c 0,#449d44 100%);background-image:linear-gradient(to bottom,#5cb85c 0,#449d44 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c',endColorstr='#ff449d44',GradientType=0)}.progress-bar-info{background-image:-webkit-gradient(linear,left 0,left 100%,from(#5bc0de),to(#31b0d5));background-image:-webkit-linear-gradient(top,#5bc0de,0%,#31b0d5,100%);background-image:-moz-linear-gradient(top,#5bc0de 0,#31b0d5 100%);background-image:linear-gradient(to bottom,#5bc0de 0,#31b0d5 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de',endColorstr='#ff31b0d5',GradientType=0)}.progress-bar-warning{background-image:-webkit-gradient(linear,left 0,left 100%,from(#f0ad4e),to(#ec971f));background-image:-webkit-linear-gradient(top,#f0ad4e,0%,#ec971f,100%);background-image:-moz-linear-gradient(top,#f0ad4e 0,#ec971f 100%);background-image:linear-gradient(to bottom,#f0ad4e 0,#ec971f 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e',endColorstr='#ffec971f',GradientType=0)}.progress-bar-danger{background-image:-webkit-gradient(linear,left 0,left 100%,from(#d9534f),to(#c9302c));background-image:-webkit-linear-gradient(top,#d9534f,0%,#c9302c,100%);background-image:-moz-linear-gradient(top,#d9534f 0,#c9302c 100%);background-image:linear-gradient(to bottom,#d9534f 0,#c9302c 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f',endColorstr='#ffc9302c',GradientType=0)}.list-group{border-radius:4px;-webkit-box-shadow:0 1px 2px rgba(0,0,0,0.075);box-shadow:0 1px 2px rgba(0,0,0,0.075)}.list-group-item.active,.list-group-item.active:hover,.list-group-item.active:focus{text-shadow:0 -1px 0 #3071a9;background-image:-webkit-gradient(linear,left 0,left 100%,from(#428bca),to(#3278b3));background-image:-webkit-linear-gradient(top,#428bca,0%,#3278b3,100%);background-image:-moz-linear-gradient(top,#428bca 0,#3278b3 100%);background-image:linear-gradient(to bottom,#428bca 0,#3278b3 100%);background-repeat:repeat-x;border-color:#3278b3;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca',endColorstr='#ff3278b3',GradientType=0)}.panel{-webkit-box-shadow:0 1px 2px rgba(0,0,0,0.05);box-shadow:0 1px 2px rgba(0,0,0,0.05)}.panel-default>.panel-heading{background-image:-webkit-gradient(linear,left 0,left 100%,from(#f5f5f5),to(#e8e8e8));background-image:-webkit-linear-gradient(top,#f5f5f5,0%,#e8e8e8,100%);background-image:-moz-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:linear-gradient(to bottom,#f5f5f5 0,#e8e8e8 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5',endColorstr='#ffe8e8e8',GradientType=0)}.panel-primary>.panel-heading{background-image:-webkit-gradient(linear,left 0,left 100%,from(#428bca),to(#357ebd));background-image:-webkit-linear-gradient(top,#428bca,0%,#357ebd,100%);background-image:-moz-linear-gradient(top,#428bca 0,#357ebd 100%);background-image:linear-gradient(to bottom,#428bca 0,#357ebd 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca',endColorstr='#ff357ebd',GradientType=0)}.panel-success>.panel-heading{background-image:-webkit-gradient(linear,left 0,left 100%,from(#dff0d8),to(#d0e9c6));background-image:-webkit-linear-gradient(top,#dff0d8,0%,#d0e9c6,100%);background-image:-moz-linear-gradient(top,#dff0d8 0,#d0e9c6 100%);background-image:linear-gradient(to bottom,#dff0d8 0,#d0e9c6 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8',endColorstr='#ffd0e9c6',GradientType=0)}.panel-info>.panel-heading{background-image:-webkit-gradient(linear,left 0,left 100%,from(#d9edf7),to(#c4e3f3));background-image:-webkit-linear-gradient(top,#d9edf7,0%,#c4e3f3,100%);background-image:-moz-linear-gradient(top,#d9edf7 0,#c4e3f3 100%);background-image:linear-gradient(to bottom,#d9edf7 0,#c4e3f3 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7',endColorstr='#ffc4e3f3',GradientType=0)}.panel-warning>.panel-heading{background-image:-webkit-gradient(linear,left 0,left 100%,from(#fcf8e3),to(#faf2cc));background-image:-webkit-linear-gradient(top,#fcf8e3,0%,#faf2cc,100%);background-image:-moz-linear-gradient(top,#fcf8e3 0,#faf2cc 100%);background-image:linear-gradient(to bottom,#fcf8e3 0,#faf2cc 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3',endColorstr='#fffaf2cc',GradientType=0)}.panel-danger>.panel-heading{background-image:-webkit-gradient(linear,left 0,left 100%,from(#f2dede),to(#ebcccc));background-image:-webkit-linear-gradient(top,#f2dede,0%,#ebcccc,100%);background-image:-moz-linear-gradient(top,#f2dede 0,#ebcccc 100%);background-image:linear-gradient(to bottom,#f2dede 0,#ebcccc 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede',endColorstr='#ffebcccc',GradientType=0)}.well{background-image:-webkit-gradient(linear,left 0,left 100%,from(#e8e8e8),to(#f5f5f5));background-image:-webkit-linear-gradient(top,#e8e8e8,0%,#f5f5f5,100%);background-image:-moz-linear-gradient(top,#e8e8e8 0,#f5f5f5 100%);background-image:linear-gradient(to bottom,#e8e8e8 0,#f5f5f5 100%);background-repeat:repeat-x;border-color:#dcdcdc;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8',endColorstr='#fff5f5f5',GradientType=0);-webkit-box-shadow:inset 0 1px 3px rgba(0,0,0,0.05),0 1px 0 rgba(255,255,255,0.1);box-shadow:inset 0 1px 3px rgba(0,0,0,0.05),0 1px 0 rgba(255,255,255,0.1)} \ No newline at end of file +/*! + * Bootstrap v3.3.0 (http://getbootstrap.com) + * Copyright 2011-2014 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */.btn-default,.btn-primary,.btn-success,.btn-info,.btn-warning,.btn-danger{text-shadow:0 -1px 0 rgba(0,0,0,.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075)}.btn-default:active,.btn-primary:active,.btn-success:active,.btn-info:active,.btn-warning:active,.btn-danger:active,.btn-default.active,.btn-primary.active,.btn-success.active,.btn-info.active,.btn-warning.active,.btn-danger.active{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-default .badge,.btn-primary .badge,.btn-success .badge,.btn-info .badge,.btn-warning .badge,.btn-danger .badge{text-shadow:none}.btn:active,.btn.active{background-image:none}.btn-default{text-shadow:0 1px 0 #fff;background-image:-webkit-linear-gradient(top,#fff 0,#e0e0e0 100%);background-image:-o-linear-gradient(top,#fff 0,#e0e0e0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e0e0e0));background-image:linear-gradient(to bottom,#fff 0,#e0e0e0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#dbdbdb;border-color:#ccc}.btn-default:hover,.btn-default:focus{background-color:#e0e0e0;background-position:0 -15px}.btn-default:active,.btn-default.active{background-color:#e0e0e0;border-color:#dbdbdb}.btn-default:disabled,.btn-default[disabled]{background-color:#e0e0e0;background-image:none}.btn-primary{background-image:-webkit-linear-gradient(top,#428bca 0,#2d6ca2 100%);background-image:-o-linear-gradient(top,#428bca 0,#2d6ca2 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#428bca),to(#2d6ca2));background-image:linear-gradient(to bottom,#428bca 0,#2d6ca2 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff2d6ca2', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#2b669a}.btn-primary:hover,.btn-primary:focus{background-color:#2d6ca2;background-position:0 -15px}.btn-primary:active,.btn-primary.active{background-color:#2d6ca2;border-color:#2b669a}.btn-primary:disabled,.btn-primary[disabled]{background-color:#2d6ca2;background-image:none}.btn-success{background-image:-webkit-linear-gradient(top,#5cb85c 0,#419641 100%);background-image:-o-linear-gradient(top,#5cb85c 0,#419641 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5cb85c),to(#419641));background-image:linear-gradient(to bottom,#5cb85c 0,#419641 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#3e8f3e}.btn-success:hover,.btn-success:focus{background-color:#419641;background-position:0 -15px}.btn-success:active,.btn-success.active{background-color:#419641;border-color:#3e8f3e}.btn-success:disabled,.btn-success[disabled]{background-color:#419641;background-image:none}.btn-info{background-image:-webkit-linear-gradient(top,#5bc0de 0,#2aabd2 100%);background-image:-o-linear-gradient(top,#5bc0de 0,#2aabd2 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5bc0de),to(#2aabd2));background-image:linear-gradient(to bottom,#5bc0de 0,#2aabd2 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#28a4c9}.btn-info:hover,.btn-info:focus{background-color:#2aabd2;background-position:0 -15px}.btn-info:active,.btn-info.active{background-color:#2aabd2;border-color:#28a4c9}.btn-info:disabled,.btn-info[disabled]{background-color:#2aabd2;background-image:none}.btn-warning{background-image:-webkit-linear-gradient(top,#f0ad4e 0,#eb9316 100%);background-image:-o-linear-gradient(top,#f0ad4e 0,#eb9316 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f0ad4e),to(#eb9316));background-image:linear-gradient(to bottom,#f0ad4e 0,#eb9316 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#e38d13}.btn-warning:hover,.btn-warning:focus{background-color:#eb9316;background-position:0 -15px}.btn-warning:active,.btn-warning.active{background-color:#eb9316;border-color:#e38d13}.btn-warning:disabled,.btn-warning[disabled]{background-color:#eb9316;background-image:none}.btn-danger{background-image:-webkit-linear-gradient(top,#d9534f 0,#c12e2a 100%);background-image:-o-linear-gradient(top,#d9534f 0,#c12e2a 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9534f),to(#c12e2a));background-image:linear-gradient(to bottom,#d9534f 0,#c12e2a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#b92c28}.btn-danger:hover,.btn-danger:focus{background-color:#c12e2a;background-position:0 -15px}.btn-danger:active,.btn-danger.active{background-color:#c12e2a;border-color:#b92c28}.btn-danger:disabled,.btn-danger[disabled]{background-color:#c12e2a;background-image:none}.thumbnail,.img-thumbnail{-webkit-box-shadow:0 1px 2px rgba(0,0,0,.075);box-shadow:0 1px 2px rgba(0,0,0,.075)}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus{background-color:#e8e8e8;background-image:-webkit-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-o-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#e8e8e8));background-image:linear-gradient(to bottom,#f5f5f5 0,#e8e8e8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);background-repeat:repeat-x}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{background-color:#357ebd;background-image:-webkit-linear-gradient(top,#428bca 0,#357ebd 100%);background-image:-o-linear-gradient(top,#428bca 0,#357ebd 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#428bca),to(#357ebd));background-image:linear-gradient(to bottom,#428bca 0,#357ebd 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff357ebd', GradientType=0);background-repeat:repeat-x}.navbar-default{background-image:-webkit-linear-gradient(top,#fff 0,#f8f8f8 100%);background-image:-o-linear-gradient(top,#fff 0,#f8f8f8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#f8f8f8));background-image:linear-gradient(to bottom,#fff 0,#f8f8f8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-radius:4px;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 5px rgba(0,0,0,.075);box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 5px rgba(0,0,0,.075)}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.active>a{background-image:-webkit-linear-gradient(top,#dbdbdb 0,#e2e2e2 100%);background-image:-o-linear-gradient(top,#dbdbdb 0,#e2e2e2 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dbdbdb),to(#e2e2e2));background-image:linear-gradient(to bottom,#dbdbdb 0,#e2e2e2 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdbdbdb', endColorstr='#ffe2e2e2', GradientType=0);background-repeat:repeat-x;-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,.075);box-shadow:inset 0 3px 9px rgba(0,0,0,.075)}.navbar-brand,.navbar-nav>li>a{text-shadow:0 1px 0 rgba(255,255,255,.25)}.navbar-inverse{background-image:-webkit-linear-gradient(top,#3c3c3c 0,#222 100%);background-image:-o-linear-gradient(top,#3c3c3c 0,#222 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#3c3c3c),to(#222));background-image:linear-gradient(to bottom,#3c3c3c 0,#222 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.active>a{background-image:-webkit-linear-gradient(top,#080808 0,#0f0f0f 100%);background-image:-o-linear-gradient(top,#080808 0,#0f0f0f 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#080808),to(#0f0f0f));background-image:linear-gradient(to bottom,#080808 0,#0f0f0f 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff080808', endColorstr='#ff0f0f0f', GradientType=0);background-repeat:repeat-x;-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,.25);box-shadow:inset 0 3px 9px rgba(0,0,0,.25)}.navbar-inverse .navbar-brand,.navbar-inverse .navbar-nav>li>a{text-shadow:0 -1px 0 rgba(0,0,0,.25)}.navbar-static-top,.navbar-fixed-top,.navbar-fixed-bottom{border-radius:0}.alert{text-shadow:0 1px 0 rgba(255,255,255,.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 2px rgba(0,0,0,.05)}.alert-success{background-image:-webkit-linear-gradient(top,#dff0d8 0,#c8e5bc 100%);background-image:-o-linear-gradient(top,#dff0d8 0,#c8e5bc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dff0d8),to(#c8e5bc));background-image:linear-gradient(to bottom,#dff0d8 0,#c8e5bc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0);background-repeat:repeat-x;border-color:#b2dba1}.alert-info{background-image:-webkit-linear-gradient(top,#d9edf7 0,#b9def0 100%);background-image:-o-linear-gradient(top,#d9edf7 0,#b9def0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9edf7),to(#b9def0));background-image:linear-gradient(to bottom,#d9edf7 0,#b9def0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0);background-repeat:repeat-x;border-color:#9acfea}.alert-warning{background-image:-webkit-linear-gradient(top,#fcf8e3 0,#f8efc0 100%);background-image:-o-linear-gradient(top,#fcf8e3 0,#f8efc0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fcf8e3),to(#f8efc0));background-image:linear-gradient(to bottom,#fcf8e3 0,#f8efc0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0);background-repeat:repeat-x;border-color:#f5e79e}.alert-danger{background-image:-webkit-linear-gradient(top,#f2dede 0,#e7c3c3 100%);background-image:-o-linear-gradient(top,#f2dede 0,#e7c3c3 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f2dede),to(#e7c3c3));background-image:linear-gradient(to bottom,#f2dede 0,#e7c3c3 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0);background-repeat:repeat-x;border-color:#dca7a7}.progress{background-image:-webkit-linear-gradient(top,#ebebeb 0,#f5f5f5 100%);background-image:-o-linear-gradient(top,#ebebeb 0,#f5f5f5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#f5f5f5));background-image:linear-gradient(to bottom,#ebebeb 0,#f5f5f5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0);background-repeat:repeat-x}.progress-bar{background-image:-webkit-linear-gradient(top,#428bca 0,#3071a9 100%);background-image:-o-linear-gradient(top,#428bca 0,#3071a9 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#428bca),to(#3071a9));background-image:linear-gradient(to bottom,#428bca 0,#3071a9 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff3071a9', GradientType=0);background-repeat:repeat-x}.progress-bar-success{background-image:-webkit-linear-gradient(top,#5cb85c 0,#449d44 100%);background-image:-o-linear-gradient(top,#5cb85c 0,#449d44 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5cb85c),to(#449d44));background-image:linear-gradient(to bottom,#5cb85c 0,#449d44 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0);background-repeat:repeat-x}.progress-bar-info{background-image:-webkit-linear-gradient(top,#5bc0de 0,#31b0d5 100%);background-image:-o-linear-gradient(top,#5bc0de 0,#31b0d5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5bc0de),to(#31b0d5));background-image:linear-gradient(to bottom,#5bc0de 0,#31b0d5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0);background-repeat:repeat-x}.progress-bar-warning{background-image:-webkit-linear-gradient(top,#f0ad4e 0,#ec971f 100%);background-image:-o-linear-gradient(top,#f0ad4e 0,#ec971f 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f0ad4e),to(#ec971f));background-image:linear-gradient(to bottom,#f0ad4e 0,#ec971f 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0);background-repeat:repeat-x}.progress-bar-danger{background-image:-webkit-linear-gradient(top,#d9534f 0,#c9302c 100%);background-image:-o-linear-gradient(top,#d9534f 0,#c9302c 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9534f),to(#c9302c));background-image:linear-gradient(to bottom,#d9534f 0,#c9302c 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0);background-repeat:repeat-x}.progress-bar-striped{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.list-group{border-radius:4px;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.075);box-shadow:0 1px 2px rgba(0,0,0,.075)}.list-group-item.active,.list-group-item.active:hover,.list-group-item.active:focus{text-shadow:0 -1px 0 #3071a9;background-image:-webkit-linear-gradient(top,#428bca 0,#3278b3 100%);background-image:-o-linear-gradient(top,#428bca 0,#3278b3 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#428bca),to(#3278b3));background-image:linear-gradient(to bottom,#428bca 0,#3278b3 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff3278b3', GradientType=0);background-repeat:repeat-x;border-color:#3278b3}.list-group-item.active .badge,.list-group-item.active:hover .badge,.list-group-item.active:focus .badge{text-shadow:none}.panel{-webkit-box-shadow:0 1px 2px rgba(0,0,0,.05);box-shadow:0 1px 2px rgba(0,0,0,.05)}.panel-default>.panel-heading{background-image:-webkit-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-o-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#e8e8e8));background-image:linear-gradient(to bottom,#f5f5f5 0,#e8e8e8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);background-repeat:repeat-x}.panel-primary>.panel-heading{background-image:-webkit-linear-gradient(top,#428bca 0,#357ebd 100%);background-image:-o-linear-gradient(top,#428bca 0,#357ebd 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#428bca),to(#357ebd));background-image:linear-gradient(to bottom,#428bca 0,#357ebd 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff357ebd', GradientType=0);background-repeat:repeat-x}.panel-success>.panel-heading{background-image:-webkit-linear-gradient(top,#dff0d8 0,#d0e9c6 100%);background-image:-o-linear-gradient(top,#dff0d8 0,#d0e9c6 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dff0d8),to(#d0e9c6));background-image:linear-gradient(to bottom,#dff0d8 0,#d0e9c6 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0);background-repeat:repeat-x}.panel-info>.panel-heading{background-image:-webkit-linear-gradient(top,#d9edf7 0,#c4e3f3 100%);background-image:-o-linear-gradient(top,#d9edf7 0,#c4e3f3 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9edf7),to(#c4e3f3));background-image:linear-gradient(to bottom,#d9edf7 0,#c4e3f3 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0);background-repeat:repeat-x}.panel-warning>.panel-heading{background-image:-webkit-linear-gradient(top,#fcf8e3 0,#faf2cc 100%);background-image:-o-linear-gradient(top,#fcf8e3 0,#faf2cc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fcf8e3),to(#faf2cc));background-image:linear-gradient(to bottom,#fcf8e3 0,#faf2cc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0);background-repeat:repeat-x}.panel-danger>.panel-heading{background-image:-webkit-linear-gradient(top,#f2dede 0,#ebcccc 100%);background-image:-o-linear-gradient(top,#f2dede 0,#ebcccc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f2dede),to(#ebcccc));background-image:linear-gradient(to bottom,#f2dede 0,#ebcccc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0);background-repeat:repeat-x}.well{background-image:-webkit-linear-gradient(top,#e8e8e8 0,#f5f5f5 100%);background-image:-o-linear-gradient(top,#e8e8e8 0,#f5f5f5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#e8e8e8),to(#f5f5f5));background-image:linear-gradient(to bottom,#e8e8e8 0,#f5f5f5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0);background-repeat:repeat-x;border-color:#dcdcdc;-webkit-box-shadow:inset 0 1px 3px rgba(0,0,0,.05),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 3px rgba(0,0,0,.05),0 1px 0 rgba(255,255,255,.1)} \ No newline at end of file diff --git a/vendor/bootstrap/css/bootstrap.css b/vendor/bootstrap/css/bootstrap.css old mode 100644 new mode 100755 index bbda4eed4..4165d414d --- a/vendor/bootstrap/css/bootstrap.css +++ b/vendor/bootstrap/css/bootstrap.css @@ -1,15 +1,18 @@ /*! - * Bootstrap v3.0.0 - * - * Copyright 2013 Twitter, Inc - * Licensed under the Apache License v2.0 - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Designed and built with all the love in the world by @mdo and @fat. + * Bootstrap v3.3.0 (http://getbootstrap.com) + * Copyright 2011-2014 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) */ -/*! normalize.css v2.1.0 | MIT License | git.io/normalize */ - +/*! normalize.css v3.0.2 | MIT License | git.io/normalize */ +html { + font-family: sans-serif; + -webkit-text-size-adjust: 100%; + -ms-text-size-adjust: 100%; +} +body { + margin: 0; +} article, aside, details, @@ -19,95 +22,55 @@ footer, header, hgroup, main, +menu, nav, section, summary { display: block; } - audio, canvas, +progress, video { display: inline-block; + vertical-align: baseline; } - audio:not([controls]) { display: none; height: 0; } - -[hidden] { +[hidden], +template { display: none; } - -html { - font-family: sans-serif; - -webkit-text-size-adjust: 100%; - -ms-text-size-adjust: 100%; -} - -body { - margin: 0; -} - -a:focus { - outline: thin dotted; +a { + background-color: transparent; } - a:active, a:hover { outline: 0; } - -h1 { - margin: 0.67em 0; - font-size: 2em; -} - abbr[title] { border-bottom: 1px dotted; } - b, strong { font-weight: bold; } - dfn { font-style: italic; } - -hr { - height: 0; - -moz-box-sizing: content-box; - box-sizing: content-box; +h1 { + margin: .67em 0; + font-size: 2em; } - mark { color: #000; background: #ff0; } - -code, -kbd, -pre, -samp { - font-family: monospace, serif; - font-size: 1em; -} - -pre { - white-space: pre-wrap; -} - -q { - quotes: "\201C" "\201D" "\2018" "\2019"; -} - small { font-size: 80%; } - sub, sup { position: relative; @@ -115,110 +78,126 @@ sup { line-height: 0; vertical-align: baseline; } - sup { - top: -0.5em; + top: -.5em; } - sub { - bottom: -0.25em; + bottom: -.25em; } - img { border: 0; } - svg:not(:root) { overflow: hidden; } - figure { - margin: 0; + margin: 1em 40px; } - -fieldset { - padding: 0.35em 0.625em 0.75em; - margin: 0 2px; - border: 1px solid #c0c0c0; +hr { + height: 0; + -webkit-box-sizing: content-box; + -moz-box-sizing: content-box; + box-sizing: content-box; } - -legend { - padding: 0; - border: 0; +pre { + overflow: auto; +} +code, +kbd, +pre, +samp { + font-family: monospace, monospace; + font-size: 1em; } - button, input, +optgroup, select, textarea { margin: 0; - font-family: inherit; - font-size: 100%; + font: inherit; + color: inherit; } - -button, -input { - line-height: normal; +button { + overflow: visible; } - button, select { text-transform: none; } - button, html input[type="button"], input[type="reset"], input[type="submit"] { - cursor: pointer; -webkit-appearance: button; + cursor: pointer; } - button[disabled], html input[disabled] { cursor: default; } - +button::-moz-focus-inner, +input::-moz-focus-inner { + padding: 0; + border: 0; +} +input { + line-height: normal; +} input[type="checkbox"], input[type="radio"] { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; padding: 0; - box-sizing: border-box; } - +input[type="number"]::-webkit-inner-spin-button, +input[type="number"]::-webkit-outer-spin-button { + height: auto; +} input[type="search"] { -webkit-box-sizing: content-box; -moz-box-sizing: content-box; box-sizing: content-box; -webkit-appearance: textfield; } - input[type="search"]::-webkit-search-cancel-button, input[type="search"]::-webkit-search-decoration { -webkit-appearance: none; } - -button::-moz-focus-inner, -input::-moz-focus-inner { +fieldset { + padding: .35em .625em .75em; + margin: 0 2px; + border: 1px solid #c0c0c0; +} +legend { padding: 0; border: 0; } - textarea { overflow: auto; - vertical-align: top; } - +optgroup { + font-weight: bold; +} table { - border-collapse: collapse; border-spacing: 0; + border-collapse: collapse; } - +td, +th { + padding: 0; +} +/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */ @media print { - * { + *, + *:before, + *:after { color: #000 !important; text-shadow: none !important; background: transparent !important; - box-shadow: none !important; + -webkit-box-shadow: none !important; + box-shadow: none !important; } a, a:visited { @@ -230,14 +209,14 @@ table { abbr[title]:after { content: " (" attr(title) ")"; } - .ir a:after, - a[href^="javascript:"]:after, - a[href^="#"]:after { + a[href^="#"]:after, + a[href^="javascript:"]:after { content: ""; } pre, blockquote { border: 1px solid #999; + page-break-inside: avoid; } thead { @@ -250,9 +229,6 @@ table { img { max-width: 100% !important; } - @page { - margin: 2cm .5cm; - } p, h2, h3 { @@ -263,13 +239,12 @@ table { h3 { page-break-after: avoid; } + select { + background: #fff !important; + } .navbar { display: none; } - .table td, - .table th { - background-color: #fff !important; - } .btn > .caret, .dropup > .btn > .caret { border-top-color: #000 !important; @@ -280,2947 +255,2973 @@ table { .table { border-collapse: collapse !important; } + .table td, + .table th { + background-color: #fff !important; + } .table-bordered th, .table-bordered td { border: 1px solid #ddd !important; } } +@font-face { + font-family: 'Glyphicons Halflings'; -*, -*:before, -*:after { - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; -} - -html { - font-size: 62.5%; - -webkit-tap-highlight-color: rgba(0, 0, 0, 0); + src: url('../fonts/glyphicons-halflings-regular.eot'); + src: url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'), url('../fonts/glyphicons-halflings-regular.woff') format('woff'), url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'), url('../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular') format('svg'); } +.glyphicon { + position: relative; + top: 1px; + display: inline-block; + font-family: 'Glyphicons Halflings'; + font-style: normal; + font-weight: normal; + line-height: 1; -body { - font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; - font-size: 14px; - line-height: 1.428571429; - color: #333333; - background-color: #ffffff; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; } - -input, -button, -select, -textarea { - font-family: inherit; - font-size: inherit; - line-height: inherit; +.glyphicon-asterisk:before { + content: "\2a"; } - -button, -input, -select[multiple], -textarea { - background-image: none; +.glyphicon-plus:before { + content: "\2b"; } - -a { - color: #428bca; - text-decoration: none; +.glyphicon-euro:before, +.glyphicon-eur:before { + content: "\20ac"; } - -a:hover, -a:focus { - color: #2a6496; - text-decoration: underline; +.glyphicon-minus:before { + content: "\2212"; } - -a:focus { - outline: thin dotted #333; - outline: 5px auto -webkit-focus-ring-color; - outline-offset: -2px; +.glyphicon-cloud:before { + content: "\2601"; } - -img { - vertical-align: middle; +.glyphicon-envelope:before { + content: "\2709"; } - -.img-responsive { - display: block; - height: auto; - max-width: 100%; +.glyphicon-pencil:before { + content: "\270f"; } - -.img-rounded { - border-radius: 6px; +.glyphicon-glass:before { + content: "\e001"; } - -.img-thumbnail { - display: inline-block; - height: auto; - max-width: 100%; - padding: 4px; - line-height: 1.428571429; - background-color: #ffffff; - border: 1px solid #dddddd; - border-radius: 4px; - -webkit-transition: all 0.2s ease-in-out; - transition: all 0.2s ease-in-out; +.glyphicon-music:before { + content: "\e002"; } - -.img-circle { - border-radius: 50%; +.glyphicon-search:before { + content: "\e003"; } - -hr { - margin-top: 20px; - margin-bottom: 20px; - border: 0; - border-top: 1px solid #eeeeee; +.glyphicon-heart:before { + content: "\e005"; } - -.sr-only { - position: absolute; - width: 1px; - height: 1px; - padding: 0; - margin: -1px; - overflow: hidden; - clip: rect(0 0 0 0); - border: 0; +.glyphicon-star:before { + content: "\e006"; } - -p { - margin: 0 0 10px; +.glyphicon-star-empty:before { + content: "\e007"; } - -.lead { - margin-bottom: 20px; - font-size: 16.099999999999998px; - font-weight: 200; - line-height: 1.4; +.glyphicon-user:before { + content: "\e008"; } - -@media (min-width: 768px) { - .lead { - font-size: 21px; - } +.glyphicon-film:before { + content: "\e009"; } - -small { - font-size: 85%; +.glyphicon-th-large:before { + content: "\e010"; } - -cite { - font-style: normal; +.glyphicon-th:before { + content: "\e011"; } - -.text-muted { - color: #999999; +.glyphicon-th-list:before { + content: "\e012"; } - -.text-primary { - color: #428bca; +.glyphicon-ok:before { + content: "\e013"; } - -.text-warning { - color: #c09853; +.glyphicon-remove:before { + content: "\e014"; } - -.text-danger { - color: #b94a48; +.glyphicon-zoom-in:before { + content: "\e015"; } - -.text-success { - color: #468847; +.glyphicon-zoom-out:before { + content: "\e016"; } - -.text-info { - color: #3a87ad; +.glyphicon-off:before { + content: "\e017"; } - -.text-left { - text-align: left; +.glyphicon-signal:before { + content: "\e018"; } - -.text-right { - text-align: right; +.glyphicon-cog:before { + content: "\e019"; } - -.text-center { - text-align: center; +.glyphicon-trash:before { + content: "\e020"; } - -h1, -h2, -h3, -h4, -h5, -h6, -.h1, -.h2, -.h3, -.h4, -.h5, -.h6 { - font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; - font-weight: 500; - line-height: 1.1; +.glyphicon-home:before { + content: "\e021"; } - -h1 small, -h2 small, -h3 small, -h4 small, -h5 small, -h6 small, -.h1 small, -.h2 small, -.h3 small, -.h4 small, -.h5 small, -.h6 small { - font-weight: normal; - line-height: 1; - color: #999999; +.glyphicon-file:before { + content: "\e022"; } - -h1, -h2, -h3 { - margin-top: 20px; - margin-bottom: 10px; +.glyphicon-time:before { + content: "\e023"; } - -h4, -h5, -h6 { - margin-top: 10px; - margin-bottom: 10px; +.glyphicon-road:before { + content: "\e024"; } - -h1, -.h1 { - font-size: 36px; +.glyphicon-download-alt:before { + content: "\e025"; } - -h2, -.h2 { - font-size: 30px; +.glyphicon-download:before { + content: "\e026"; } - -h3, -.h3 { - font-size: 24px; +.glyphicon-upload:before { + content: "\e027"; } - -h4, -.h4 { - font-size: 18px; +.glyphicon-inbox:before { + content: "\e028"; } - -h5, -.h5 { - font-size: 14px; +.glyphicon-play-circle:before { + content: "\e029"; } - -h6, -.h6 { - font-size: 12px; +.glyphicon-repeat:before { + content: "\e030"; } - -h1 small, -.h1 small { - font-size: 24px; +.glyphicon-refresh:before { + content: "\e031"; } - -h2 small, -.h2 small { - font-size: 18px; +.glyphicon-list-alt:before { + content: "\e032"; } - -h3 small, -.h3 small, -h4 small, -.h4 small { - font-size: 14px; +.glyphicon-lock:before { + content: "\e033"; } - -.page-header { - padding-bottom: 9px; - margin: 40px 0 20px; - border-bottom: 1px solid #eeeeee; +.glyphicon-flag:before { + content: "\e034"; } - -ul, -ol { - margin-top: 0; - margin-bottom: 10px; +.glyphicon-headphones:before { + content: "\e035"; } - -ul ul, -ol ul, -ul ol, -ol ol { - margin-bottom: 0; +.glyphicon-volume-off:before { + content: "\e036"; } - -.list-unstyled { - padding-left: 0; - list-style: none; +.glyphicon-volume-down:before { + content: "\e037"; } - -.list-inline { - padding-left: 0; - list-style: none; +.glyphicon-volume-up:before { + content: "\e038"; } - -.list-inline > li { - display: inline-block; - padding-right: 5px; - padding-left: 5px; +.glyphicon-qrcode:before { + content: "\e039"; } - -dl { - margin-bottom: 20px; +.glyphicon-barcode:before { + content: "\e040"; } - -dt, -dd { - line-height: 1.428571429; +.glyphicon-tag:before { + content: "\e041"; } - -dt { - font-weight: bold; +.glyphicon-tags:before { + content: "\e042"; } - -dd { - margin-left: 0; +.glyphicon-book:before { + content: "\e043"; } - -@media (min-width: 768px) { - .dl-horizontal dt { - float: left; - width: 160px; - overflow: hidden; - clear: left; - text-align: right; - text-overflow: ellipsis; - white-space: nowrap; - } - .dl-horizontal dd { - margin-left: 180px; - } - .dl-horizontal dd:before, - .dl-horizontal dd:after { - display: table; - content: " "; - } - .dl-horizontal dd:after { - clear: both; - } - .dl-horizontal dd:before, - .dl-horizontal dd:after { - display: table; - content: " "; - } - .dl-horizontal dd:after { - clear: both; - } +.glyphicon-bookmark:before { + content: "\e044"; } - -abbr[title], -abbr[data-original-title] { - cursor: help; - border-bottom: 1px dotted #999999; +.glyphicon-print:before { + content: "\e045"; } - -abbr.initialism { - font-size: 90%; - text-transform: uppercase; +.glyphicon-camera:before { + content: "\e046"; } - -blockquote { - padding: 10px 20px; - margin: 0 0 20px; - border-left: 5px solid #eeeeee; +.glyphicon-font:before { + content: "\e047"; } - -blockquote p { - font-size: 17.5px; - font-weight: 300; - line-height: 1.25; +.glyphicon-bold:before { + content: "\e048"; } - -blockquote p:last-child { - margin-bottom: 0; +.glyphicon-italic:before { + content: "\e049"; } - -blockquote small { - display: block; - line-height: 1.428571429; - color: #999999; +.glyphicon-text-height:before { + content: "\e050"; } - -blockquote small:before { - content: '\2014 \00A0'; +.glyphicon-text-width:before { + content: "\e051"; } - -blockquote.pull-right { - padding-right: 15px; - padding-left: 0; - border-right: 5px solid #eeeeee; - border-left: 0; +.glyphicon-align-left:before { + content: "\e052"; } - -blockquote.pull-right p, -blockquote.pull-right small { - text-align: right; +.glyphicon-align-center:before { + content: "\e053"; } - -blockquote.pull-right small:before { - content: ''; +.glyphicon-align-right:before { + content: "\e054"; } - -blockquote.pull-right small:after { - content: '\00A0 \2014'; +.glyphicon-align-justify:before { + content: "\e055"; } - -q:before, -q:after, -blockquote:before, -blockquote:after { - content: ""; +.glyphicon-list:before { + content: "\e056"; } - -address { - display: block; - margin-bottom: 20px; - font-style: normal; - line-height: 1.428571429; +.glyphicon-indent-left:before { + content: "\e057"; } - -code, -pre { - font-family: Monaco, Menlo, Consolas, "Courier New", monospace; +.glyphicon-indent-right:before { + content: "\e058"; } - -code { - padding: 2px 4px; - font-size: 90%; - color: #c7254e; - white-space: nowrap; - background-color: #f9f2f4; - border-radius: 4px; +.glyphicon-facetime-video:before { + content: "\e059"; } - -pre { - display: block; - padding: 9.5px; - margin: 0 0 10px; - font-size: 13px; - line-height: 1.428571429; - color: #333333; - word-break: break-all; - word-wrap: break-word; - background-color: #f5f5f5; - border: 1px solid #cccccc; - border-radius: 4px; +.glyphicon-picture:before { + content: "\e060"; } - -pre.prettyprint { - margin-bottom: 20px; +.glyphicon-map-marker:before { + content: "\e062"; } - -pre code { - padding: 0; - font-size: inherit; - color: inherit; - white-space: pre-wrap; - background-color: transparent; - border: 0; +.glyphicon-adjust:before { + content: "\e063"; } - -.pre-scrollable { - max-height: 340px; - overflow-y: scroll; +.glyphicon-tint:before { + content: "\e064"; } - -.container { - padding-right: 15px; - padding-left: 15px; - margin-right: auto; - margin-left: auto; +.glyphicon-edit:before { + content: "\e065"; } - -.container:before, -.container:after { - display: table; - content: " "; +.glyphicon-share:before { + content: "\e066"; } - -.container:after { - clear: both; +.glyphicon-check:before { + content: "\e067"; } - -.container:before, -.container:after { - display: table; - content: " "; +.glyphicon-move:before { + content: "\e068"; } - -.container:after { - clear: both; +.glyphicon-step-backward:before { + content: "\e069"; } - -.row { - margin-right: -15px; - margin-left: -15px; +.glyphicon-fast-backward:before { + content: "\e070"; } - -.row:before, -.row:after { - display: table; - content: " "; +.glyphicon-backward:before { + content: "\e071"; } - -.row:after { - clear: both; +.glyphicon-play:before { + content: "\e072"; } - -.row:before, -.row:after { - display: table; - content: " "; +.glyphicon-pause:before { + content: "\e073"; } - -.row:after { - clear: both; +.glyphicon-stop:before { + content: "\e074"; } - -.col-xs-1, -.col-xs-2, -.col-xs-3, -.col-xs-4, -.col-xs-5, -.col-xs-6, -.col-xs-7, -.col-xs-8, -.col-xs-9, -.col-xs-10, -.col-xs-11, -.col-xs-12, -.col-sm-1, -.col-sm-2, -.col-sm-3, -.col-sm-4, -.col-sm-5, -.col-sm-6, -.col-sm-7, -.col-sm-8, -.col-sm-9, -.col-sm-10, -.col-sm-11, -.col-sm-12, -.col-md-1, -.col-md-2, -.col-md-3, -.col-md-4, -.col-md-5, -.col-md-6, -.col-md-7, -.col-md-8, -.col-md-9, -.col-md-10, -.col-md-11, -.col-md-12, -.col-lg-1, -.col-lg-2, -.col-lg-3, -.col-lg-4, -.col-lg-5, -.col-lg-6, -.col-lg-7, -.col-lg-8, -.col-lg-9, -.col-lg-10, -.col-lg-11, -.col-lg-12 { - position: relative; - min-height: 1px; - padding-right: 15px; - padding-left: 15px; +.glyphicon-forward:before { + content: "\e075"; } - -.col-xs-1, -.col-xs-2, -.col-xs-3, -.col-xs-4, -.col-xs-5, -.col-xs-6, -.col-xs-7, -.col-xs-8, -.col-xs-9, -.col-xs-10, -.col-xs-11 { - float: left; +.glyphicon-fast-forward:before { + content: "\e076"; } - -.col-xs-1 { - width: 8.333333333333332%; +.glyphicon-step-forward:before { + content: "\e077"; } - -.col-xs-2 { - width: 16.666666666666664%; +.glyphicon-eject:before { + content: "\e078"; } - -.col-xs-3 { - width: 25%; +.glyphicon-chevron-left:before { + content: "\e079"; } - -.col-xs-4 { - width: 33.33333333333333%; +.glyphicon-chevron-right:before { + content: "\e080"; } - -.col-xs-5 { - width: 41.66666666666667%; +.glyphicon-plus-sign:before { + content: "\e081"; } - -.col-xs-6 { - width: 50%; +.glyphicon-minus-sign:before { + content: "\e082"; } - -.col-xs-7 { - width: 58.333333333333336%; +.glyphicon-remove-sign:before { + content: "\e083"; } - -.col-xs-8 { - width: 66.66666666666666%; +.glyphicon-ok-sign:before { + content: "\e084"; } - -.col-xs-9 { - width: 75%; +.glyphicon-question-sign:before { + content: "\e085"; } - -.col-xs-10 { - width: 83.33333333333334%; +.glyphicon-info-sign:before { + content: "\e086"; } - -.col-xs-11 { - width: 91.66666666666666%; +.glyphicon-screenshot:before { + content: "\e087"; } - -.col-xs-12 { - width: 100%; +.glyphicon-remove-circle:before { + content: "\e088"; } - -@media (min-width: 768px) { - .container { - max-width: 750px; - } - .col-sm-1, - .col-sm-2, - .col-sm-3, - .col-sm-4, - .col-sm-5, - .col-sm-6, - .col-sm-7, - .col-sm-8, - .col-sm-9, - .col-sm-10, - .col-sm-11 { - float: left; - } - .col-sm-1 { - width: 8.333333333333332%; - } - .col-sm-2 { - width: 16.666666666666664%; - } - .col-sm-3 { - width: 25%; - } - .col-sm-4 { - width: 33.33333333333333%; - } - .col-sm-5 { - width: 41.66666666666667%; - } - .col-sm-6 { - width: 50%; - } - .col-sm-7 { - width: 58.333333333333336%; - } - .col-sm-8 { - width: 66.66666666666666%; - } - .col-sm-9 { - width: 75%; - } - .col-sm-10 { - width: 83.33333333333334%; - } - .col-sm-11 { - width: 91.66666666666666%; - } - .col-sm-12 { - width: 100%; - } - .col-sm-push-1 { - left: 8.333333333333332%; - } - .col-sm-push-2 { - left: 16.666666666666664%; - } - .col-sm-push-3 { - left: 25%; - } - .col-sm-push-4 { - left: 33.33333333333333%; - } - .col-sm-push-5 { - left: 41.66666666666667%; - } - .col-sm-push-6 { - left: 50%; - } - .col-sm-push-7 { - left: 58.333333333333336%; - } - .col-sm-push-8 { - left: 66.66666666666666%; - } - .col-sm-push-9 { - left: 75%; - } - .col-sm-push-10 { - left: 83.33333333333334%; - } - .col-sm-push-11 { - left: 91.66666666666666%; - } - .col-sm-pull-1 { - right: 8.333333333333332%; - } - .col-sm-pull-2 { - right: 16.666666666666664%; - } - .col-sm-pull-3 { - right: 25%; - } - .col-sm-pull-4 { - right: 33.33333333333333%; - } - .col-sm-pull-5 { - right: 41.66666666666667%; - } - .col-sm-pull-6 { - right: 50%; - } - .col-sm-pull-7 { - right: 58.333333333333336%; - } - .col-sm-pull-8 { - right: 66.66666666666666%; - } - .col-sm-pull-9 { - right: 75%; - } - .col-sm-pull-10 { - right: 83.33333333333334%; - } - .col-sm-pull-11 { - right: 91.66666666666666%; - } - .col-sm-offset-1 { - margin-left: 8.333333333333332%; - } - .col-sm-offset-2 { - margin-left: 16.666666666666664%; - } - .col-sm-offset-3 { - margin-left: 25%; - } - .col-sm-offset-4 { - margin-left: 33.33333333333333%; - } - .col-sm-offset-5 { - margin-left: 41.66666666666667%; - } - .col-sm-offset-6 { - margin-left: 50%; - } - .col-sm-offset-7 { - margin-left: 58.333333333333336%; - } - .col-sm-offset-8 { - margin-left: 66.66666666666666%; - } - .col-sm-offset-9 { - margin-left: 75%; - } - .col-sm-offset-10 { - margin-left: 83.33333333333334%; - } - .col-sm-offset-11 { - margin-left: 91.66666666666666%; - } +.glyphicon-ok-circle:before { + content: "\e089"; } - -@media (min-width: 992px) { - .container { - max-width: 970px; - } - .col-md-1, - .col-md-2, - .col-md-3, - .col-md-4, - .col-md-5, - .col-md-6, - .col-md-7, - .col-md-8, - .col-md-9, - .col-md-10, - .col-md-11 { - float: left; - } - .col-md-1 { - width: 8.333333333333332%; - } - .col-md-2 { - width: 16.666666666666664%; - } - .col-md-3 { - width: 25%; - } - .col-md-4 { - width: 33.33333333333333%; - } - .col-md-5 { - width: 41.66666666666667%; - } - .col-md-6 { - width: 50%; - } - .col-md-7 { - width: 58.333333333333336%; - } - .col-md-8 { - width: 66.66666666666666%; - } - .col-md-9 { - width: 75%; - } - .col-md-10 { - width: 83.33333333333334%; - } - .col-md-11 { - width: 91.66666666666666%; - } - .col-md-12 { - width: 100%; - } - .col-md-push-0 { - left: auto; - } - .col-md-push-1 { - left: 8.333333333333332%; - } - .col-md-push-2 { - left: 16.666666666666664%; - } - .col-md-push-3 { - left: 25%; - } - .col-md-push-4 { - left: 33.33333333333333%; - } - .col-md-push-5 { - left: 41.66666666666667%; - } - .col-md-push-6 { - left: 50%; - } - .col-md-push-7 { - left: 58.333333333333336%; - } - .col-md-push-8 { - left: 66.66666666666666%; - } - .col-md-push-9 { - left: 75%; - } - .col-md-push-10 { - left: 83.33333333333334%; - } - .col-md-push-11 { - left: 91.66666666666666%; - } - .col-md-pull-0 { - right: auto; - } - .col-md-pull-1 { - right: 8.333333333333332%; - } - .col-md-pull-2 { - right: 16.666666666666664%; - } - .col-md-pull-3 { - right: 25%; - } - .col-md-pull-4 { - right: 33.33333333333333%; - } - .col-md-pull-5 { - right: 41.66666666666667%; - } - .col-md-pull-6 { - right: 50%; - } - .col-md-pull-7 { - right: 58.333333333333336%; - } - .col-md-pull-8 { - right: 66.66666666666666%; - } - .col-md-pull-9 { - right: 75%; - } - .col-md-pull-10 { - right: 83.33333333333334%; - } - .col-md-pull-11 { - right: 91.66666666666666%; - } - .col-md-offset-0 { - margin-left: 0; - } - .col-md-offset-1 { - margin-left: 8.333333333333332%; - } - .col-md-offset-2 { - margin-left: 16.666666666666664%; - } - .col-md-offset-3 { - margin-left: 25%; - } - .col-md-offset-4 { - margin-left: 33.33333333333333%; - } - .col-md-offset-5 { - margin-left: 41.66666666666667%; - } - .col-md-offset-6 { - margin-left: 50%; - } - .col-md-offset-7 { - margin-left: 58.333333333333336%; - } - .col-md-offset-8 { - margin-left: 66.66666666666666%; - } - .col-md-offset-9 { - margin-left: 75%; - } - .col-md-offset-10 { - margin-left: 83.33333333333334%; - } - .col-md-offset-11 { - margin-left: 91.66666666666666%; - } +.glyphicon-ban-circle:before { + content: "\e090"; } - -@media (min-width: 1200px) { - .container { - max-width: 1170px; - } - .col-lg-1, - .col-lg-2, - .col-lg-3, - .col-lg-4, - .col-lg-5, - .col-lg-6, - .col-lg-7, - .col-lg-8, - .col-lg-9, - .col-lg-10, - .col-lg-11 { - float: left; - } - .col-lg-1 { - width: 8.333333333333332%; - } - .col-lg-2 { - width: 16.666666666666664%; - } - .col-lg-3 { - width: 25%; - } - .col-lg-4 { - width: 33.33333333333333%; - } - .col-lg-5 { - width: 41.66666666666667%; - } - .col-lg-6 { - width: 50%; - } - .col-lg-7 { - width: 58.333333333333336%; - } - .col-lg-8 { - width: 66.66666666666666%; - } - .col-lg-9 { - width: 75%; - } - .col-lg-10 { - width: 83.33333333333334%; - } - .col-lg-11 { - width: 91.66666666666666%; - } - .col-lg-12 { - width: 100%; - } - .col-lg-push-0 { - left: auto; - } - .col-lg-push-1 { - left: 8.333333333333332%; - } - .col-lg-push-2 { - left: 16.666666666666664%; - } - .col-lg-push-3 { - left: 25%; - } - .col-lg-push-4 { - left: 33.33333333333333%; - } - .col-lg-push-5 { - left: 41.66666666666667%; - } - .col-lg-push-6 { - left: 50%; - } - .col-lg-push-7 { - left: 58.333333333333336%; - } - .col-lg-push-8 { - left: 66.66666666666666%; - } - .col-lg-push-9 { - left: 75%; - } - .col-lg-push-10 { - left: 83.33333333333334%; - } - .col-lg-push-11 { - left: 91.66666666666666%; - } - .col-lg-pull-0 { - right: auto; - } - .col-lg-pull-1 { - right: 8.333333333333332%; - } - .col-lg-pull-2 { - right: 16.666666666666664%; - } - .col-lg-pull-3 { - right: 25%; - } - .col-lg-pull-4 { - right: 33.33333333333333%; - } - .col-lg-pull-5 { - right: 41.66666666666667%; - } - .col-lg-pull-6 { - right: 50%; - } - .col-lg-pull-7 { - right: 58.333333333333336%; - } - .col-lg-pull-8 { - right: 66.66666666666666%; - } - .col-lg-pull-9 { - right: 75%; - } - .col-lg-pull-10 { - right: 83.33333333333334%; - } - .col-lg-pull-11 { - right: 91.66666666666666%; - } - .col-lg-offset-0 { - margin-left: 0; - } - .col-lg-offset-1 { - margin-left: 8.333333333333332%; - } - .col-lg-offset-2 { - margin-left: 16.666666666666664%; - } - .col-lg-offset-3 { - margin-left: 25%; - } - .col-lg-offset-4 { - margin-left: 33.33333333333333%; - } - .col-lg-offset-5 { - margin-left: 41.66666666666667%; - } - .col-lg-offset-6 { - margin-left: 50%; - } - .col-lg-offset-7 { - margin-left: 58.333333333333336%; - } - .col-lg-offset-8 { - margin-left: 66.66666666666666%; - } - .col-lg-offset-9 { - margin-left: 75%; - } - .col-lg-offset-10 { - margin-left: 83.33333333333334%; - } - .col-lg-offset-11 { - margin-left: 91.66666666666666%; - } +.glyphicon-arrow-left:before { + content: "\e091"; +} +.glyphicon-arrow-right:before { + content: "\e092"; +} +.glyphicon-arrow-up:before { + content: "\e093"; +} +.glyphicon-arrow-down:before { + content: "\e094"; +} +.glyphicon-share-alt:before { + content: "\e095"; +} +.glyphicon-resize-full:before { + content: "\e096"; +} +.glyphicon-resize-small:before { + content: "\e097"; +} +.glyphicon-exclamation-sign:before { + content: "\e101"; +} +.glyphicon-gift:before { + content: "\e102"; +} +.glyphicon-leaf:before { + content: "\e103"; +} +.glyphicon-fire:before { + content: "\e104"; +} +.glyphicon-eye-open:before { + content: "\e105"; +} +.glyphicon-eye-close:before { + content: "\e106"; +} +.glyphicon-warning-sign:before { + content: "\e107"; +} +.glyphicon-plane:before { + content: "\e108"; +} +.glyphicon-calendar:before { + content: "\e109"; +} +.glyphicon-random:before { + content: "\e110"; +} +.glyphicon-comment:before { + content: "\e111"; +} +.glyphicon-magnet:before { + content: "\e112"; +} +.glyphicon-chevron-up:before { + content: "\e113"; +} +.glyphicon-chevron-down:before { + content: "\e114"; +} +.glyphicon-retweet:before { + content: "\e115"; } - -table { - max-width: 100%; - background-color: transparent; +.glyphicon-shopping-cart:before { + content: "\e116"; } - -th { - text-align: left; +.glyphicon-folder-close:before { + content: "\e117"; } - -.table { - width: 100%; - margin-bottom: 20px; +.glyphicon-folder-open:before { + content: "\e118"; } - -.table thead > tr > th, -.table tbody > tr > th, -.table tfoot > tr > th, -.table thead > tr > td, -.table tbody > tr > td, -.table tfoot > tr > td { - padding: 8px; - line-height: 1.428571429; - vertical-align: top; - border-top: 1px solid #dddddd; +.glyphicon-resize-vertical:before { + content: "\e119"; } - -.table thead > tr > th { - vertical-align: bottom; - border-bottom: 2px solid #dddddd; +.glyphicon-resize-horizontal:before { + content: "\e120"; } - -.table caption + thead tr:first-child th, -.table colgroup + thead tr:first-child th, -.table thead:first-child tr:first-child th, -.table caption + thead tr:first-child td, -.table colgroup + thead tr:first-child td, -.table thead:first-child tr:first-child td { - border-top: 0; +.glyphicon-hdd:before { + content: "\e121"; } - -.table tbody + tbody { - border-top: 2px solid #dddddd; +.glyphicon-bullhorn:before { + content: "\e122"; } - -.table .table { - background-color: #ffffff; +.glyphicon-bell:before { + content: "\e123"; } - -.table-condensed thead > tr > th, -.table-condensed tbody > tr > th, -.table-condensed tfoot > tr > th, -.table-condensed thead > tr > td, -.table-condensed tbody > tr > td, -.table-condensed tfoot > tr > td { - padding: 5px; +.glyphicon-certificate:before { + content: "\e124"; } - -.table-bordered { - border: 1px solid #dddddd; +.glyphicon-thumbs-up:before { + content: "\e125"; } - -.table-bordered > thead > tr > th, -.table-bordered > tbody > tr > th, -.table-bordered > tfoot > tr > th, -.table-bordered > thead > tr > td, -.table-bordered > tbody > tr > td, -.table-bordered > tfoot > tr > td { - border: 1px solid #dddddd; +.glyphicon-thumbs-down:before { + content: "\e126"; } - -.table-bordered > thead > tr > th, -.table-bordered > thead > tr > td { - border-bottom-width: 2px; +.glyphicon-hand-right:before { + content: "\e127"; } - -.table-striped > tbody > tr:nth-child(odd) > td, -.table-striped > tbody > tr:nth-child(odd) > th { - background-color: #f9f9f9; +.glyphicon-hand-left:before { + content: "\e128"; } - -.table-hover > tbody > tr:hover > td, -.table-hover > tbody > tr:hover > th { - background-color: #f5f5f5; +.glyphicon-hand-up:before { + content: "\e129"; } - -table col[class*="col-"] { - display: table-column; - float: none; +.glyphicon-hand-down:before { + content: "\e130"; } - -table td[class*="col-"], -table th[class*="col-"] { - display: table-cell; - float: none; +.glyphicon-circle-arrow-right:before { + content: "\e131"; } - -.table > thead > tr > td.active, -.table > tbody > tr > td.active, -.table > tfoot > tr > td.active, -.table > thead > tr > th.active, -.table > tbody > tr > th.active, -.table > tfoot > tr > th.active, -.table > thead > tr.active > td, -.table > tbody > tr.active > td, -.table > tfoot > tr.active > td, -.table > thead > tr.active > th, -.table > tbody > tr.active > th, -.table > tfoot > tr.active > th { - background-color: #f5f5f5; +.glyphicon-circle-arrow-left:before { + content: "\e132"; } - -.table > thead > tr > td.success, -.table > tbody > tr > td.success, -.table > tfoot > tr > td.success, -.table > thead > tr > th.success, -.table > tbody > tr > th.success, -.table > tfoot > tr > th.success, -.table > thead > tr.success > td, -.table > tbody > tr.success > td, -.table > tfoot > tr.success > td, -.table > thead > tr.success > th, -.table > tbody > tr.success > th, -.table > tfoot > tr.success > th { - background-color: #dff0d8; - border-color: #d6e9c6; +.glyphicon-circle-arrow-up:before { + content: "\e133"; } - -.table-hover > tbody > tr > td.success:hover, -.table-hover > tbody > tr > th.success:hover, -.table-hover > tbody > tr.success:hover > td { - background-color: #d0e9c6; - border-color: #c9e2b3; +.glyphicon-circle-arrow-down:before { + content: "\e134"; } - -.table > thead > tr > td.danger, -.table > tbody > tr > td.danger, -.table > tfoot > tr > td.danger, -.table > thead > tr > th.danger, -.table > tbody > tr > th.danger, -.table > tfoot > tr > th.danger, -.table > thead > tr.danger > td, -.table > tbody > tr.danger > td, -.table > tfoot > tr.danger > td, -.table > thead > tr.danger > th, -.table > tbody > tr.danger > th, -.table > tfoot > tr.danger > th { - background-color: #f2dede; - border-color: #eed3d7; +.glyphicon-globe:before { + content: "\e135"; } - -.table-hover > tbody > tr > td.danger:hover, -.table-hover > tbody > tr > th.danger:hover, -.table-hover > tbody > tr.danger:hover > td { - background-color: #ebcccc; - border-color: #e6c1c7; +.glyphicon-wrench:before { + content: "\e136"; +} +.glyphicon-tasks:before { + content: "\e137"; +} +.glyphicon-filter:before { + content: "\e138"; +} +.glyphicon-briefcase:before { + content: "\e139"; +} +.glyphicon-fullscreen:before { + content: "\e140"; +} +.glyphicon-dashboard:before { + content: "\e141"; +} +.glyphicon-paperclip:before { + content: "\e142"; +} +.glyphicon-heart-empty:before { + content: "\e143"; +} +.glyphicon-link:before { + content: "\e144"; +} +.glyphicon-phone:before { + content: "\e145"; +} +.glyphicon-pushpin:before { + content: "\e146"; +} +.glyphicon-usd:before { + content: "\e148"; +} +.glyphicon-gbp:before { + content: "\e149"; +} +.glyphicon-sort:before { + content: "\e150"; +} +.glyphicon-sort-by-alphabet:before { + content: "\e151"; +} +.glyphicon-sort-by-alphabet-alt:before { + content: "\e152"; +} +.glyphicon-sort-by-order:before { + content: "\e153"; +} +.glyphicon-sort-by-order-alt:before { + content: "\e154"; +} +.glyphicon-sort-by-attributes:before { + content: "\e155"; +} +.glyphicon-sort-by-attributes-alt:before { + content: "\e156"; +} +.glyphicon-unchecked:before { + content: "\e157"; +} +.glyphicon-expand:before { + content: "\e158"; +} +.glyphicon-collapse-down:before { + content: "\e159"; +} +.glyphicon-collapse-up:before { + content: "\e160"; +} +.glyphicon-log-in:before { + content: "\e161"; +} +.glyphicon-flash:before { + content: "\e162"; +} +.glyphicon-log-out:before { + content: "\e163"; +} +.glyphicon-new-window:before { + content: "\e164"; +} +.glyphicon-record:before { + content: "\e165"; +} +.glyphicon-save:before { + content: "\e166"; +} +.glyphicon-open:before { + content: "\e167"; +} +.glyphicon-saved:before { + content: "\e168"; +} +.glyphicon-import:before { + content: "\e169"; +} +.glyphicon-export:before { + content: "\e170"; +} +.glyphicon-send:before { + content: "\e171"; +} +.glyphicon-floppy-disk:before { + content: "\e172"; +} +.glyphicon-floppy-saved:before { + content: "\e173"; +} +.glyphicon-floppy-remove:before { + content: "\e174"; +} +.glyphicon-floppy-save:before { + content: "\e175"; +} +.glyphicon-floppy-open:before { + content: "\e176"; +} +.glyphicon-credit-card:before { + content: "\e177"; } - -.table > thead > tr > td.warning, -.table > tbody > tr > td.warning, -.table > tfoot > tr > td.warning, -.table > thead > tr > th.warning, -.table > tbody > tr > th.warning, -.table > tfoot > tr > th.warning, -.table > thead > tr.warning > td, -.table > tbody > tr.warning > td, -.table > tfoot > tr.warning > td, -.table > thead > tr.warning > th, -.table > tbody > tr.warning > th, -.table > tfoot > tr.warning > th { - background-color: #fcf8e3; - border-color: #fbeed5; +.glyphicon-transfer:before { + content: "\e178"; } - -.table-hover > tbody > tr > td.warning:hover, -.table-hover > tbody > tr > th.warning:hover, -.table-hover > tbody > tr.warning:hover > td { - background-color: #faf2cc; - border-color: #f8e5be; +.glyphicon-cutlery:before { + content: "\e179"; } - -@media (max-width: 768px) { - .table-responsive { - width: 100%; - margin-bottom: 15px; - overflow-x: scroll; - overflow-y: hidden; - border: 1px solid #dddddd; - } - .table-responsive > .table { - margin-bottom: 0; - background-color: #fff; - } - .table-responsive > .table > thead > tr > th, - .table-responsive > .table > tbody > tr > th, - .table-responsive > .table > tfoot > tr > th, - .table-responsive > .table > thead > tr > td, - .table-responsive > .table > tbody > tr > td, - .table-responsive > .table > tfoot > tr > td { - white-space: nowrap; - } - .table-responsive > .table-bordered { - border: 0; - } - .table-responsive > .table-bordered > thead > tr > th:first-child, - .table-responsive > .table-bordered > tbody > tr > th:first-child, - .table-responsive > .table-bordered > tfoot > tr > th:first-child, - .table-responsive > .table-bordered > thead > tr > td:first-child, - .table-responsive > .table-bordered > tbody > tr > td:first-child, - .table-responsive > .table-bordered > tfoot > tr > td:first-child { - border-left: 0; - } - .table-responsive > .table-bordered > thead > tr > th:last-child, - .table-responsive > .table-bordered > tbody > tr > th:last-child, - .table-responsive > .table-bordered > tfoot > tr > th:last-child, - .table-responsive > .table-bordered > thead > tr > td:last-child, - .table-responsive > .table-bordered > tbody > tr > td:last-child, - .table-responsive > .table-bordered > tfoot > tr > td:last-child { - border-right: 0; - } - .table-responsive > .table-bordered > thead > tr:last-child > th, - .table-responsive > .table-bordered > tbody > tr:last-child > th, - .table-responsive > .table-bordered > tfoot > tr:last-child > th, - .table-responsive > .table-bordered > thead > tr:last-child > td, - .table-responsive > .table-bordered > tbody > tr:last-child > td, - .table-responsive > .table-bordered > tfoot > tr:last-child > td { - border-bottom: 0; - } +.glyphicon-header:before { + content: "\e180"; } - -fieldset { - padding: 0; - margin: 0; - border: 0; +.glyphicon-compressed:before { + content: "\e181"; } - -legend { - display: block; - width: 100%; - padding: 0; - margin-bottom: 20px; - font-size: 21px; - line-height: inherit; - color: #333333; - border: 0; - border-bottom: 1px solid #e5e5e5; +.glyphicon-earphone:before { + content: "\e182"; } - -label { - display: inline-block; - margin-bottom: 5px; - font-weight: bold; +.glyphicon-phone-alt:before { + content: "\e183"; } - -input[type="search"] { - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; +.glyphicon-tower:before { + content: "\e184"; } - -input[type="radio"], -input[type="checkbox"] { - margin: 4px 0 0; - margin-top: 1px \9; - /* IE8-9 */ - - line-height: normal; +.glyphicon-stats:before { + content: "\e185"; } - -input[type="file"] { - display: block; +.glyphicon-sd-video:before { + content: "\e186"; } - -select[multiple], -select[size] { - height: auto; +.glyphicon-hd-video:before { + content: "\e187"; } - -select optgroup { - font-family: inherit; - font-size: inherit; - font-style: inherit; +.glyphicon-subtitles:before { + content: "\e188"; } - -input[type="file"]:focus, -input[type="radio"]:focus, -input[type="checkbox"]:focus { - outline: thin dotted #333; - outline: 5px auto -webkit-focus-ring-color; - outline-offset: -2px; +.glyphicon-sound-stereo:before { + content: "\e189"; } - -input[type="number"]::-webkit-outer-spin-button, -input[type="number"]::-webkit-inner-spin-button { - height: auto; +.glyphicon-sound-dolby:before { + content: "\e190"; } - -.form-control:-moz-placeholder { - color: #999999; +.glyphicon-sound-5-1:before { + content: "\e191"; } - -.form-control::-moz-placeholder { - color: #999999; +.glyphicon-sound-6-1:before { + content: "\e192"; } - -.form-control:-ms-input-placeholder { - color: #999999; +.glyphicon-sound-7-1:before { + content: "\e193"; } - -.form-control::-webkit-input-placeholder { - color: #999999; +.glyphicon-copyright-mark:before { + content: "\e194"; } - -.form-control { - display: block; - width: 100%; - height: 34px; - padding: 6px 12px; - font-size: 14px; - line-height: 1.428571429; - color: #555555; - vertical-align: middle; - background-color: #ffffff; - border: 1px solid #cccccc; - border-radius: 4px; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - -webkit-transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s; - transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s; +.glyphicon-registration-mark:before { + content: "\e195"; } - -.form-control:focus { - border-color: #66afe9; - outline: 0; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(102, 175, 233, 0.6); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(102, 175, 233, 0.6); +.glyphicon-cloud-download:before { + content: "\e197"; } - -.form-control[disabled], -.form-control[readonly], -fieldset[disabled] .form-control { - cursor: not-allowed; - background-color: #eeeeee; +.glyphicon-cloud-upload:before { + content: "\e198"; } - -textarea.form-control { - height: auto; +.glyphicon-tree-conifer:before { + content: "\e199"; } - -.form-group { - margin-bottom: 15px; +.glyphicon-tree-deciduous:before { + content: "\e200"; } - -.radio, -.checkbox { - display: block; - min-height: 20px; - padding-left: 20px; - margin-top: 10px; - margin-bottom: 10px; - vertical-align: middle; +* { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; } - -.radio label, -.checkbox label { - display: inline; - margin-bottom: 0; - font-weight: normal; - cursor: pointer; +*:before, +*:after { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; } +html { + font-size: 10px; -.radio input[type="radio"], -.radio-inline input[type="radio"], -.checkbox input[type="checkbox"], -.checkbox-inline input[type="checkbox"] { - float: left; - margin-left: -20px; + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); } - -.radio + .radio, -.checkbox + .checkbox { - margin-top: -5px; +body { + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 14px; + line-height: 1.42857143; + color: #333; + background-color: #fff; } - -.radio-inline, -.checkbox-inline { - display: inline-block; - padding-left: 20px; - margin-bottom: 0; - font-weight: normal; - vertical-align: middle; - cursor: pointer; +input, +button, +select, +textarea { + font-family: inherit; + font-size: inherit; + line-height: inherit; } - -.radio-inline + .radio-inline, -.checkbox-inline + .checkbox-inline { - margin-top: 0; - margin-left: 10px; +a { + color: #428bca; + text-decoration: none; } - -input[type="radio"][disabled], -input[type="checkbox"][disabled], -.radio[disabled], -.radio-inline[disabled], -.checkbox[disabled], -.checkbox-inline[disabled], -fieldset[disabled] input[type="radio"], -fieldset[disabled] input[type="checkbox"], -fieldset[disabled] .radio, -fieldset[disabled] .radio-inline, -fieldset[disabled] .checkbox, -fieldset[disabled] .checkbox-inline { - cursor: not-allowed; +a:hover, +a:focus { + color: #2a6496; + text-decoration: underline; } - -.input-sm { - height: 30px; - padding: 5px 10px; - font-size: 12px; - line-height: 1.5; - border-radius: 3px; +a:focus { + outline: thin dotted; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; } - -select.input-sm { - height: 30px; - line-height: 30px; +figure { + margin: 0; } - -textarea.input-sm { +img { + vertical-align: middle; +} +.img-responsive, +.thumbnail > img, +.thumbnail a > img, +.carousel-inner > .item > img, +.carousel-inner > .item > a > img { + display: block; + max-width: 100%; height: auto; } - -.input-lg { - height: 45px; - padding: 10px 16px; - font-size: 18px; - line-height: 1.33; +.img-rounded { border-radius: 6px; } - -select.input-lg { - height: 45px; - line-height: 45px; +.img-thumbnail { + display: inline-block; + max-width: 100%; + height: auto; + padding: 4px; + line-height: 1.42857143; + background-color: #fff; + border: 1px solid #ddd; + border-radius: 4px; + -webkit-transition: all .2s ease-in-out; + -o-transition: all .2s ease-in-out; + transition: all .2s ease-in-out; } - -textarea.input-lg { +.img-circle { + border-radius: 50%; +} +hr { + margin-top: 20px; + margin-bottom: 20px; + border: 0; + border-top: 1px solid #eee; +} +.sr-only { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0, 0, 0, 0); + border: 0; +} +.sr-only-focusable:active, +.sr-only-focusable:focus { + position: static; + width: auto; height: auto; + margin: 0; + overflow: visible; + clip: auto; } - -.has-warning .help-block, -.has-warning .control-label { - color: #c09853; +h1, +h2, +h3, +h4, +h5, +h6, +.h1, +.h2, +.h3, +.h4, +.h5, +.h6 { + font-family: inherit; + font-weight: 500; + line-height: 1.1; + color: inherit; } - -.has-warning .form-control { - border-color: #c09853; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +h1 small, +h2 small, +h3 small, +h4 small, +h5 small, +h6 small, +.h1 small, +.h2 small, +.h3 small, +.h4 small, +.h5 small, +.h6 small, +h1 .small, +h2 .small, +h3 .small, +h4 .small, +h5 .small, +h6 .small, +.h1 .small, +.h2 .small, +.h3 .small, +.h4 .small, +.h5 .small, +.h6 .small { + font-weight: normal; + line-height: 1; + color: #777; } - -.has-warning .form-control:focus { - border-color: #a47e3c; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e; - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e; +h1, +.h1, +h2, +.h2, +h3, +.h3 { + margin-top: 20px; + margin-bottom: 10px; } - -.has-warning .input-group-addon { - color: #c09853; - background-color: #fcf8e3; - border-color: #c09853; +h1 small, +.h1 small, +h2 small, +.h2 small, +h3 small, +.h3 small, +h1 .small, +.h1 .small, +h2 .small, +.h2 .small, +h3 .small, +.h3 .small { + font-size: 65%; } - -.has-error .help-block, -.has-error .control-label { - color: #b94a48; +h4, +.h4, +h5, +.h5, +h6, +.h6 { + margin-top: 10px; + margin-bottom: 10px; } - -.has-error .form-control { - border-color: #b94a48; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +h4 small, +.h4 small, +h5 small, +.h5 small, +h6 small, +.h6 small, +h4 .small, +.h4 .small, +h5 .small, +.h5 .small, +h6 .small, +.h6 .small { + font-size: 75%; } - -.has-error .form-control:focus { - border-color: #953b39; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392; - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392; +h1, +.h1 { + font-size: 36px; } - -.has-error .input-group-addon { - color: #b94a48; - background-color: #f2dede; - border-color: #b94a48; +h2, +.h2 { + font-size: 30px; } - -.has-success .help-block, -.has-success .control-label { - color: #468847; +h3, +.h3 { + font-size: 24px; } - -.has-success .form-control { - border-color: #468847; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +h4, +.h4 { + font-size: 18px; } - -.has-success .form-control:focus { - border-color: #356635; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b; - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b; +h5, +.h5 { + font-size: 14px; } - -.has-success .input-group-addon { - color: #468847; - background-color: #dff0d8; - border-color: #468847; +h6, +.h6 { + font-size: 12px; } - -.form-control-static { - padding-top: 7px; - margin-bottom: 0; +p { + margin: 0 0 10px; } - -.help-block { - display: block; - margin-top: 5px; - margin-bottom: 10px; - color: #737373; +.lead { + margin-bottom: 20px; + font-size: 16px; + font-weight: 300; + line-height: 1.4; } - @media (min-width: 768px) { - .form-inline .form-group { - display: inline-block; - margin-bottom: 0; - vertical-align: middle; - } - .form-inline .form-control { - display: inline-block; - } - .form-inline .radio, - .form-inline .checkbox { - display: inline-block; - padding-left: 0; - margin-top: 0; - margin-bottom: 0; - } - .form-inline .radio input[type="radio"], - .form-inline .checkbox input[type="checkbox"] { - float: none; - margin-left: 0; + .lead { + font-size: 21px; } } - -.form-horizontal .control-label, -.form-horizontal .radio, -.form-horizontal .checkbox, -.form-horizontal .radio-inline, -.form-horizontal .checkbox-inline { - padding-top: 7px; - margin-top: 0; - margin-bottom: 0; -} - -.form-horizontal .form-group { - margin-right: -15px; - margin-left: -15px; +small, +.small { + font-size: 85%; } - -.form-horizontal .form-group:before, -.form-horizontal .form-group:after { - display: table; - content: " "; +mark, +.mark { + padding: .2em; + background-color: #fcf8e3; } - -.form-horizontal .form-group:after { - clear: both; +.text-left { + text-align: left; } - -.form-horizontal .form-group:before, -.form-horizontal .form-group:after { - display: table; - content: " "; +.text-right { + text-align: right; } - -.form-horizontal .form-group:after { - clear: both; +.text-center { + text-align: center; } - -@media (min-width: 768px) { - .form-horizontal .control-label { - text-align: right; - } +.text-justify { + text-align: justify; } - -.btn { - display: inline-block; - padding: 6px 12px; - margin-bottom: 0; - font-size: 14px; - font-weight: normal; - line-height: 1.428571429; - text-align: center; +.text-nowrap { white-space: nowrap; - vertical-align: middle; - cursor: pointer; - border: 1px solid transparent; - border-radius: 4px; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - -o-user-select: none; - user-select: none; } - -.btn:focus { - outline: thin dotted #333; - outline: 5px auto -webkit-focus-ring-color; - outline-offset: -2px; +.text-lowercase { + text-transform: lowercase; +} +.text-uppercase { + text-transform: uppercase; +} +.text-capitalize { + text-transform: capitalize; } - -.btn:hover, -.btn:focus { - color: #333333; - text-decoration: none; +.text-muted { + color: #777; } - -.btn:active, -.btn.active { - background-image: none; - outline: 0; - -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); - box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); +.text-primary { + color: #428bca; } - -.btn.disabled, -.btn[disabled], -fieldset[disabled] .btn { - pointer-events: none; - cursor: not-allowed; - opacity: 0.65; - filter: alpha(opacity=65); - -webkit-box-shadow: none; - box-shadow: none; +a.text-primary:hover { + color: #3071a9; } - -.btn-default { - color: #333333; - background-color: #ffffff; - border-color: #cccccc; +.text-success { + color: #3c763d; } - -.btn-default:hover, -.btn-default:focus, -.btn-default:active, -.btn-default.active, -.open .dropdown-toggle.btn-default { - color: #333333; - background-color: #ebebeb; - border-color: #adadad; +a.text-success:hover { + color: #2b542c; } - -.btn-default:active, -.btn-default.active, -.open .dropdown-toggle.btn-default { - background-image: none; +.text-info { + color: #31708f; } - -.btn-default.disabled, -.btn-default[disabled], -fieldset[disabled] .btn-default, -.btn-default.disabled:hover, -.btn-default[disabled]:hover, -fieldset[disabled] .btn-default:hover, -.btn-default.disabled:focus, -.btn-default[disabled]:focus, -fieldset[disabled] .btn-default:focus, -.btn-default.disabled:active, -.btn-default[disabled]:active, -fieldset[disabled] .btn-default:active, -.btn-default.disabled.active, -.btn-default[disabled].active, -fieldset[disabled] .btn-default.active { - background-color: #ffffff; - border-color: #cccccc; +a.text-info:hover { + color: #245269; } - -.btn-primary { - color: #ffffff; - background-color: #428bca; - border-color: #357ebd; +.text-warning { + color: #8a6d3b; } - -.btn-primary:hover, -.btn-primary:focus, -.btn-primary:active, -.btn-primary.active, -.open .dropdown-toggle.btn-primary { - color: #ffffff; - background-color: #3276b1; - border-color: #285e8e; +a.text-warning:hover { + color: #66512c; } - -.btn-primary:active, -.btn-primary.active, -.open .dropdown-toggle.btn-primary { - background-image: none; +.text-danger { + color: #a94442; } - -.btn-primary.disabled, -.btn-primary[disabled], -fieldset[disabled] .btn-primary, -.btn-primary.disabled:hover, -.btn-primary[disabled]:hover, -fieldset[disabled] .btn-primary:hover, -.btn-primary.disabled:focus, -.btn-primary[disabled]:focus, -fieldset[disabled] .btn-primary:focus, -.btn-primary.disabled:active, -.btn-primary[disabled]:active, -fieldset[disabled] .btn-primary:active, -.btn-primary.disabled.active, -.btn-primary[disabled].active, -fieldset[disabled] .btn-primary.active { +a.text-danger:hover { + color: #843534; +} +.bg-primary { + color: #fff; background-color: #428bca; - border-color: #357ebd; } - -.btn-warning { - color: #ffffff; - background-color: #f0ad4e; - border-color: #eea236; +a.bg-primary:hover { + background-color: #3071a9; } - -.btn-warning:hover, -.btn-warning:focus, -.btn-warning:active, -.btn-warning.active, -.open .dropdown-toggle.btn-warning { - color: #ffffff; - background-color: #ed9c28; - border-color: #d58512; +.bg-success { + background-color: #dff0d8; } - -.btn-warning:active, -.btn-warning.active, -.open .dropdown-toggle.btn-warning { - background-image: none; +a.bg-success:hover { + background-color: #c1e2b3; } - -.btn-warning.disabled, -.btn-warning[disabled], -fieldset[disabled] .btn-warning, -.btn-warning.disabled:hover, -.btn-warning[disabled]:hover, -fieldset[disabled] .btn-warning:hover, -.btn-warning.disabled:focus, -.btn-warning[disabled]:focus, -fieldset[disabled] .btn-warning:focus, -.btn-warning.disabled:active, -.btn-warning[disabled]:active, -fieldset[disabled] .btn-warning:active, -.btn-warning.disabled.active, -.btn-warning[disabled].active, -fieldset[disabled] .btn-warning.active { - background-color: #f0ad4e; - border-color: #eea236; +.bg-info { + background-color: #d9edf7; } - -.btn-danger { - color: #ffffff; - background-color: #d9534f; - border-color: #d43f3a; +a.bg-info:hover { + background-color: #afd9ee; } - -.btn-danger:hover, -.btn-danger:focus, -.btn-danger:active, -.btn-danger.active, -.open .dropdown-toggle.btn-danger { - color: #ffffff; - background-color: #d2322d; - border-color: #ac2925; +.bg-warning { + background-color: #fcf8e3; } - -.btn-danger:active, -.btn-danger.active, -.open .dropdown-toggle.btn-danger { - background-image: none; +a.bg-warning:hover { + background-color: #f7ecb5; } - -.btn-danger.disabled, -.btn-danger[disabled], -fieldset[disabled] .btn-danger, -.btn-danger.disabled:hover, -.btn-danger[disabled]:hover, -fieldset[disabled] .btn-danger:hover, -.btn-danger.disabled:focus, -.btn-danger[disabled]:focus, -fieldset[disabled] .btn-danger:focus, -.btn-danger.disabled:active, -.btn-danger[disabled]:active, -fieldset[disabled] .btn-danger:active, -.btn-danger.disabled.active, -.btn-danger[disabled].active, -fieldset[disabled] .btn-danger.active { - background-color: #d9534f; - border-color: #d43f3a; +.bg-danger { + background-color: #f2dede; } - -.btn-success { - color: #ffffff; - background-color: #5cb85c; - border-color: #4cae4c; +a.bg-danger:hover { + background-color: #e4b9b9; } - -.btn-success:hover, -.btn-success:focus, -.btn-success:active, -.btn-success.active, -.open .dropdown-toggle.btn-success { - color: #ffffff; - background-color: #47a447; - border-color: #398439; +.page-header { + padding-bottom: 9px; + margin: 40px 0 20px; + border-bottom: 1px solid #eee; } - -.btn-success:active, -.btn-success.active, -.open .dropdown-toggle.btn-success { - background-image: none; +ul, +ol { + margin-top: 0; + margin-bottom: 10px; } - -.btn-success.disabled, -.btn-success[disabled], -fieldset[disabled] .btn-success, -.btn-success.disabled:hover, -.btn-success[disabled]:hover, -fieldset[disabled] .btn-success:hover, -.btn-success.disabled:focus, -.btn-success[disabled]:focus, -fieldset[disabled] .btn-success:focus, -.btn-success.disabled:active, -.btn-success[disabled]:active, -fieldset[disabled] .btn-success:active, -.btn-success.disabled.active, -.btn-success[disabled].active, -fieldset[disabled] .btn-success.active { - background-color: #5cb85c; - border-color: #4cae4c; +ul ul, +ol ul, +ul ol, +ol ol { + margin-bottom: 0; } - -.btn-info { - color: #ffffff; - background-color: #5bc0de; - border-color: #46b8da; +.list-unstyled { + padding-left: 0; + list-style: none; +} +.list-inline { + padding-left: 0; + margin-left: -5px; + list-style: none; +} +.list-inline > li { + display: inline-block; + padding-right: 5px; + padding-left: 5px; +} +dl { + margin-top: 0; + margin-bottom: 20px; +} +dt, +dd { + line-height: 1.42857143; +} +dt { + font-weight: bold; +} +dd { + margin-left: 0; +} +@media (min-width: 768px) { + .dl-horizontal dt { + float: left; + width: 160px; + overflow: hidden; + clear: left; + text-align: right; + text-overflow: ellipsis; + white-space: nowrap; + } + .dl-horizontal dd { + margin-left: 180px; + } +} +abbr[title], +abbr[data-original-title] { + cursor: help; + border-bottom: 1px dotted #777; +} +.initialism { + font-size: 90%; + text-transform: uppercase; +} +blockquote { + padding: 10px 20px; + margin: 0 0 20px; + font-size: 17.5px; + border-left: 5px solid #eee; } - -.btn-info:hover, -.btn-info:focus, -.btn-info:active, -.btn-info.active, -.open .dropdown-toggle.btn-info { - color: #ffffff; - background-color: #39b3d7; - border-color: #269abc; +blockquote p:last-child, +blockquote ul:last-child, +blockquote ol:last-child { + margin-bottom: 0; } - -.btn-info:active, -.btn-info.active, -.open .dropdown-toggle.btn-info { - background-image: none; +blockquote footer, +blockquote small, +blockquote .small { + display: block; + font-size: 80%; + line-height: 1.42857143; + color: #777; } - -.btn-info.disabled, -.btn-info[disabled], -fieldset[disabled] .btn-info, -.btn-info.disabled:hover, -.btn-info[disabled]:hover, -fieldset[disabled] .btn-info:hover, -.btn-info.disabled:focus, -.btn-info[disabled]:focus, -fieldset[disabled] .btn-info:focus, -.btn-info.disabled:active, -.btn-info[disabled]:active, -fieldset[disabled] .btn-info:active, -.btn-info.disabled.active, -.btn-info[disabled].active, -fieldset[disabled] .btn-info.active { - background-color: #5bc0de; - border-color: #46b8da; +blockquote footer:before, +blockquote small:before, +blockquote .small:before { + content: '\2014 \00A0'; } - -.btn-link { - font-weight: normal; - color: #428bca; - cursor: pointer; - border-radius: 0; +.blockquote-reverse, +blockquote.pull-right { + padding-right: 15px; + padding-left: 0; + text-align: right; + border-right: 5px solid #eee; + border-left: 0; } - -.btn-link, -.btn-link:active, -.btn-link[disabled], -fieldset[disabled] .btn-link { - background-color: transparent; - -webkit-box-shadow: none; - box-shadow: none; +.blockquote-reverse footer:before, +blockquote.pull-right footer:before, +.blockquote-reverse small:before, +blockquote.pull-right small:before, +.blockquote-reverse .small:before, +blockquote.pull-right .small:before { + content: ''; } - -.btn-link, -.btn-link:hover, -.btn-link:focus, -.btn-link:active { - border-color: transparent; +.blockquote-reverse footer:after, +blockquote.pull-right footer:after, +.blockquote-reverse small:after, +blockquote.pull-right small:after, +.blockquote-reverse .small:after, +blockquote.pull-right .small:after { + content: '\00A0 \2014'; } - -.btn-link:hover, -.btn-link:focus { - color: #2a6496; - text-decoration: underline; - background-color: transparent; +address { + margin-bottom: 20px; + font-style: normal; + line-height: 1.42857143; } - -.btn-link[disabled]:hover, -fieldset[disabled] .btn-link:hover, -.btn-link[disabled]:focus, -fieldset[disabled] .btn-link:focus { - color: #999999; - text-decoration: none; +code, +kbd, +pre, +samp { + font-family: Menlo, Monaco, Consolas, "Courier New", monospace; } - -.btn-lg { - padding: 10px 16px; - font-size: 18px; - line-height: 1.33; - border-radius: 6px; +code { + padding: 2px 4px; + font-size: 90%; + color: #c7254e; + background-color: #f9f2f4; + border-radius: 4px; } - -.btn-sm, -.btn-xs { - padding: 5px 10px; - font-size: 12px; - line-height: 1.5; +kbd { + padding: 2px 4px; + font-size: 90%; + color: #fff; + background-color: #333; border-radius: 3px; + -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .25); + box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .25); } - -.btn-xs { - padding: 1px 5px; +kbd kbd { + padding: 0; + font-size: 100%; + font-weight: bold; + -webkit-box-shadow: none; + box-shadow: none; } - -.btn-block { +pre { display: block; - width: 100%; - padding-right: 0; - padding-left: 0; + padding: 9.5px; + margin: 0 0 10px; + font-size: 13px; + line-height: 1.42857143; + color: #333; + word-break: break-all; + word-wrap: break-word; + background-color: #f5f5f5; + border: 1px solid #ccc; + border-radius: 4px; } - -.btn-block + .btn-block { - margin-top: 5px; +pre code { + padding: 0; + font-size: inherit; + color: inherit; + white-space: pre-wrap; + background-color: transparent; + border-radius: 0; } - -input[type="submit"].btn-block, -input[type="reset"].btn-block, -input[type="button"].btn-block { - width: 100%; +.pre-scrollable { + max-height: 340px; + overflow-y: scroll; } - -.fade { - opacity: 0; - -webkit-transition: opacity 0.15s linear; - transition: opacity 0.15s linear; +.container { + padding-right: 15px; + padding-left: 15px; + margin-right: auto; + margin-left: auto; } - -.fade.in { - opacity: 1; +@media (min-width: 768px) { + .container { + width: 750px; + } } - -.collapse { - display: none; +@media (min-width: 992px) { + .container { + width: 970px; + } } - -.collapse.in { - display: block; +@media (min-width: 1200px) { + .container { + width: 1170px; + } } - -.collapsing { - position: relative; - height: 0; - overflow: hidden; - -webkit-transition: height 0.35s ease; - transition: height 0.35s ease; +.container-fluid { + padding-right: 15px; + padding-left: 15px; + margin-right: auto; + margin-left: auto; } - -@font-face { - font-family: 'Glyphicons Halflings'; - src: url('../fonts/glyphicons-halflings-regular.eot'); - src: url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'), url('../fonts/glyphicons-halflings-regular.woff') format('woff'), url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'), url('../fonts/glyphicons-halflings-regular.svg#glyphicons-halflingsregular') format('svg'); +.row { + margin-right: -15px; + margin-left: -15px; } - -.glyphicon { +.col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12 { position: relative; - top: 1px; - display: inline-block; - font-family: 'Glyphicons Halflings'; - -webkit-font-smoothing: antialiased; - font-style: normal; - font-weight: normal; - line-height: 1; + min-height: 1px; + padding-right: 15px; + padding-left: 15px; } - -.glyphicon-asterisk:before { - content: "\2a"; +.col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12 { + float: left; } - -.glyphicon-plus:before { - content: "\2b"; +.col-xs-12 { + width: 100%; } - -.glyphicon-euro:before { - content: "\20ac"; +.col-xs-11 { + width: 91.66666667%; } - -.glyphicon-minus:before { - content: "\2212"; +.col-xs-10 { + width: 83.33333333%; } - -.glyphicon-cloud:before { - content: "\2601"; +.col-xs-9 { + width: 75%; } - -.glyphicon-envelope:before { - content: "\2709"; +.col-xs-8 { + width: 66.66666667%; } - -.glyphicon-pencil:before { - content: "\270f"; +.col-xs-7 { + width: 58.33333333%; } - -.glyphicon-glass:before { - content: "\e001"; +.col-xs-6 { + width: 50%; } - -.glyphicon-music:before { - content: "\e002"; +.col-xs-5 { + width: 41.66666667%; } - -.glyphicon-search:before { - content: "\e003"; +.col-xs-4 { + width: 33.33333333%; } - -.glyphicon-heart:before { - content: "\e005"; +.col-xs-3 { + width: 25%; } - -.glyphicon-star:before { - content: "\e006"; +.col-xs-2 { + width: 16.66666667%; } - -.glyphicon-star-empty:before { - content: "\e007"; +.col-xs-1 { + width: 8.33333333%; } - -.glyphicon-user:before { - content: "\e008"; +.col-xs-pull-12 { + right: 100%; } - -.glyphicon-film:before { - content: "\e009"; +.col-xs-pull-11 { + right: 91.66666667%; } - -.glyphicon-th-large:before { - content: "\e010"; +.col-xs-pull-10 { + right: 83.33333333%; +} +.col-xs-pull-9 { + right: 75%; +} +.col-xs-pull-8 { + right: 66.66666667%; +} +.col-xs-pull-7 { + right: 58.33333333%; } - -.glyphicon-th:before { - content: "\e011"; +.col-xs-pull-6 { + right: 50%; } - -.glyphicon-th-list:before { - content: "\e012"; +.col-xs-pull-5 { + right: 41.66666667%; } - -.glyphicon-ok:before { - content: "\e013"; +.col-xs-pull-4 { + right: 33.33333333%; } - -.glyphicon-remove:before { - content: "\e014"; +.col-xs-pull-3 { + right: 25%; } - -.glyphicon-zoom-in:before { - content: "\e015"; +.col-xs-pull-2 { + right: 16.66666667%; } - -.glyphicon-zoom-out:before { - content: "\e016"; +.col-xs-pull-1 { + right: 8.33333333%; } - -.glyphicon-off:before { - content: "\e017"; +.col-xs-pull-0 { + right: auto; } - -.glyphicon-signal:before { - content: "\e018"; +.col-xs-push-12 { + left: 100%; } - -.glyphicon-cog:before { - content: "\e019"; +.col-xs-push-11 { + left: 91.66666667%; } - -.glyphicon-trash:before { - content: "\e020"; +.col-xs-push-10 { + left: 83.33333333%; } - -.glyphicon-home:before { - content: "\e021"; +.col-xs-push-9 { + left: 75%; } - -.glyphicon-file:before { - content: "\e022"; +.col-xs-push-8 { + left: 66.66666667%; } - -.glyphicon-time:before { - content: "\e023"; +.col-xs-push-7 { + left: 58.33333333%; } - -.glyphicon-road:before { - content: "\e024"; +.col-xs-push-6 { + left: 50%; } - -.glyphicon-download-alt:before { - content: "\e025"; +.col-xs-push-5 { + left: 41.66666667%; } - -.glyphicon-download:before { - content: "\e026"; +.col-xs-push-4 { + left: 33.33333333%; } - -.glyphicon-upload:before { - content: "\e027"; +.col-xs-push-3 { + left: 25%; } - -.glyphicon-inbox:before { - content: "\e028"; +.col-xs-push-2 { + left: 16.66666667%; } - -.glyphicon-play-circle:before { - content: "\e029"; +.col-xs-push-1 { + left: 8.33333333%; } - -.glyphicon-repeat:before { - content: "\e030"; +.col-xs-push-0 { + left: auto; } - -.glyphicon-refresh:before { - content: "\e031"; +.col-xs-offset-12 { + margin-left: 100%; } - -.glyphicon-list-alt:before { - content: "\e032"; +.col-xs-offset-11 { + margin-left: 91.66666667%; } - -.glyphicon-flag:before { - content: "\e034"; +.col-xs-offset-10 { + margin-left: 83.33333333%; } - -.glyphicon-headphones:before { - content: "\e035"; +.col-xs-offset-9 { + margin-left: 75%; } - -.glyphicon-volume-off:before { - content: "\e036"; +.col-xs-offset-8 { + margin-left: 66.66666667%; } - -.glyphicon-volume-down:before { - content: "\e037"; +.col-xs-offset-7 { + margin-left: 58.33333333%; } - -.glyphicon-volume-up:before { - content: "\e038"; +.col-xs-offset-6 { + margin-left: 50%; } - -.glyphicon-qrcode:before { - content: "\e039"; +.col-xs-offset-5 { + margin-left: 41.66666667%; } - -.glyphicon-barcode:before { - content: "\e040"; +.col-xs-offset-4 { + margin-left: 33.33333333%; } - -.glyphicon-tag:before { - content: "\e041"; +.col-xs-offset-3 { + margin-left: 25%; } - -.glyphicon-tags:before { - content: "\e042"; +.col-xs-offset-2 { + margin-left: 16.66666667%; } - -.glyphicon-book:before { - content: "\e043"; +.col-xs-offset-1 { + margin-left: 8.33333333%; } - -.glyphicon-print:before { - content: "\e045"; +.col-xs-offset-0 { + margin-left: 0; } - -.glyphicon-font:before { - content: "\e047"; +@media (min-width: 768px) { + .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12 { + float: left; + } + .col-sm-12 { + width: 100%; + } + .col-sm-11 { + width: 91.66666667%; + } + .col-sm-10 { + width: 83.33333333%; + } + .col-sm-9 { + width: 75%; + } + .col-sm-8 { + width: 66.66666667%; + } + .col-sm-7 { + width: 58.33333333%; + } + .col-sm-6 { + width: 50%; + } + .col-sm-5 { + width: 41.66666667%; + } + .col-sm-4 { + width: 33.33333333%; + } + .col-sm-3 { + width: 25%; + } + .col-sm-2 { + width: 16.66666667%; + } + .col-sm-1 { + width: 8.33333333%; + } + .col-sm-pull-12 { + right: 100%; + } + .col-sm-pull-11 { + right: 91.66666667%; + } + .col-sm-pull-10 { + right: 83.33333333%; + } + .col-sm-pull-9 { + right: 75%; + } + .col-sm-pull-8 { + right: 66.66666667%; + } + .col-sm-pull-7 { + right: 58.33333333%; + } + .col-sm-pull-6 { + right: 50%; + } + .col-sm-pull-5 { + right: 41.66666667%; + } + .col-sm-pull-4 { + right: 33.33333333%; + } + .col-sm-pull-3 { + right: 25%; + } + .col-sm-pull-2 { + right: 16.66666667%; + } + .col-sm-pull-1 { + right: 8.33333333%; + } + .col-sm-pull-0 { + right: auto; + } + .col-sm-push-12 { + left: 100%; + } + .col-sm-push-11 { + left: 91.66666667%; + } + .col-sm-push-10 { + left: 83.33333333%; + } + .col-sm-push-9 { + left: 75%; + } + .col-sm-push-8 { + left: 66.66666667%; + } + .col-sm-push-7 { + left: 58.33333333%; + } + .col-sm-push-6 { + left: 50%; + } + .col-sm-push-5 { + left: 41.66666667%; + } + .col-sm-push-4 { + left: 33.33333333%; + } + .col-sm-push-3 { + left: 25%; + } + .col-sm-push-2 { + left: 16.66666667%; + } + .col-sm-push-1 { + left: 8.33333333%; + } + .col-sm-push-0 { + left: auto; + } + .col-sm-offset-12 { + margin-left: 100%; + } + .col-sm-offset-11 { + margin-left: 91.66666667%; + } + .col-sm-offset-10 { + margin-left: 83.33333333%; + } + .col-sm-offset-9 { + margin-left: 75%; + } + .col-sm-offset-8 { + margin-left: 66.66666667%; + } + .col-sm-offset-7 { + margin-left: 58.33333333%; + } + .col-sm-offset-6 { + margin-left: 50%; + } + .col-sm-offset-5 { + margin-left: 41.66666667%; + } + .col-sm-offset-4 { + margin-left: 33.33333333%; + } + .col-sm-offset-3 { + margin-left: 25%; + } + .col-sm-offset-2 { + margin-left: 16.66666667%; + } + .col-sm-offset-1 { + margin-left: 8.33333333%; + } + .col-sm-offset-0 { + margin-left: 0; + } +} +@media (min-width: 992px) { + .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12 { + float: left; + } + .col-md-12 { + width: 100%; + } + .col-md-11 { + width: 91.66666667%; + } + .col-md-10 { + width: 83.33333333%; + } + .col-md-9 { + width: 75%; + } + .col-md-8 { + width: 66.66666667%; + } + .col-md-7 { + width: 58.33333333%; + } + .col-md-6 { + width: 50%; + } + .col-md-5 { + width: 41.66666667%; + } + .col-md-4 { + width: 33.33333333%; + } + .col-md-3 { + width: 25%; + } + .col-md-2 { + width: 16.66666667%; + } + .col-md-1 { + width: 8.33333333%; + } + .col-md-pull-12 { + right: 100%; + } + .col-md-pull-11 { + right: 91.66666667%; + } + .col-md-pull-10 { + right: 83.33333333%; + } + .col-md-pull-9 { + right: 75%; + } + .col-md-pull-8 { + right: 66.66666667%; + } + .col-md-pull-7 { + right: 58.33333333%; + } + .col-md-pull-6 { + right: 50%; + } + .col-md-pull-5 { + right: 41.66666667%; + } + .col-md-pull-4 { + right: 33.33333333%; + } + .col-md-pull-3 { + right: 25%; + } + .col-md-pull-2 { + right: 16.66666667%; + } + .col-md-pull-1 { + right: 8.33333333%; + } + .col-md-pull-0 { + right: auto; + } + .col-md-push-12 { + left: 100%; + } + .col-md-push-11 { + left: 91.66666667%; + } + .col-md-push-10 { + left: 83.33333333%; + } + .col-md-push-9 { + left: 75%; + } + .col-md-push-8 { + left: 66.66666667%; + } + .col-md-push-7 { + left: 58.33333333%; + } + .col-md-push-6 { + left: 50%; + } + .col-md-push-5 { + left: 41.66666667%; + } + .col-md-push-4 { + left: 33.33333333%; + } + .col-md-push-3 { + left: 25%; + } + .col-md-push-2 { + left: 16.66666667%; + } + .col-md-push-1 { + left: 8.33333333%; + } + .col-md-push-0 { + left: auto; + } + .col-md-offset-12 { + margin-left: 100%; + } + .col-md-offset-11 { + margin-left: 91.66666667%; + } + .col-md-offset-10 { + margin-left: 83.33333333%; + } + .col-md-offset-9 { + margin-left: 75%; + } + .col-md-offset-8 { + margin-left: 66.66666667%; + } + .col-md-offset-7 { + margin-left: 58.33333333%; + } + .col-md-offset-6 { + margin-left: 50%; + } + .col-md-offset-5 { + margin-left: 41.66666667%; + } + .col-md-offset-4 { + margin-left: 33.33333333%; + } + .col-md-offset-3 { + margin-left: 25%; + } + .col-md-offset-2 { + margin-left: 16.66666667%; + } + .col-md-offset-1 { + margin-left: 8.33333333%; + } + .col-md-offset-0 { + margin-left: 0; + } } - -.glyphicon-bold:before { - content: "\e048"; +@media (min-width: 1200px) { + .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12 { + float: left; + } + .col-lg-12 { + width: 100%; + } + .col-lg-11 { + width: 91.66666667%; + } + .col-lg-10 { + width: 83.33333333%; + } + .col-lg-9 { + width: 75%; + } + .col-lg-8 { + width: 66.66666667%; + } + .col-lg-7 { + width: 58.33333333%; + } + .col-lg-6 { + width: 50%; + } + .col-lg-5 { + width: 41.66666667%; + } + .col-lg-4 { + width: 33.33333333%; + } + .col-lg-3 { + width: 25%; + } + .col-lg-2 { + width: 16.66666667%; + } + .col-lg-1 { + width: 8.33333333%; + } + .col-lg-pull-12 { + right: 100%; + } + .col-lg-pull-11 { + right: 91.66666667%; + } + .col-lg-pull-10 { + right: 83.33333333%; + } + .col-lg-pull-9 { + right: 75%; + } + .col-lg-pull-8 { + right: 66.66666667%; + } + .col-lg-pull-7 { + right: 58.33333333%; + } + .col-lg-pull-6 { + right: 50%; + } + .col-lg-pull-5 { + right: 41.66666667%; + } + .col-lg-pull-4 { + right: 33.33333333%; + } + .col-lg-pull-3 { + right: 25%; + } + .col-lg-pull-2 { + right: 16.66666667%; + } + .col-lg-pull-1 { + right: 8.33333333%; + } + .col-lg-pull-0 { + right: auto; + } + .col-lg-push-12 { + left: 100%; + } + .col-lg-push-11 { + left: 91.66666667%; + } + .col-lg-push-10 { + left: 83.33333333%; + } + .col-lg-push-9 { + left: 75%; + } + .col-lg-push-8 { + left: 66.66666667%; + } + .col-lg-push-7 { + left: 58.33333333%; + } + .col-lg-push-6 { + left: 50%; + } + .col-lg-push-5 { + left: 41.66666667%; + } + .col-lg-push-4 { + left: 33.33333333%; + } + .col-lg-push-3 { + left: 25%; + } + .col-lg-push-2 { + left: 16.66666667%; + } + .col-lg-push-1 { + left: 8.33333333%; + } + .col-lg-push-0 { + left: auto; + } + .col-lg-offset-12 { + margin-left: 100%; + } + .col-lg-offset-11 { + margin-left: 91.66666667%; + } + .col-lg-offset-10 { + margin-left: 83.33333333%; + } + .col-lg-offset-9 { + margin-left: 75%; + } + .col-lg-offset-8 { + margin-left: 66.66666667%; + } + .col-lg-offset-7 { + margin-left: 58.33333333%; + } + .col-lg-offset-6 { + margin-left: 50%; + } + .col-lg-offset-5 { + margin-left: 41.66666667%; + } + .col-lg-offset-4 { + margin-left: 33.33333333%; + } + .col-lg-offset-3 { + margin-left: 25%; + } + .col-lg-offset-2 { + margin-left: 16.66666667%; + } + .col-lg-offset-1 { + margin-left: 8.33333333%; + } + .col-lg-offset-0 { + margin-left: 0; + } } - -.glyphicon-italic:before { - content: "\e049"; +table { + background-color: transparent; } - -.glyphicon-text-height:before { - content: "\e050"; +caption { + padding-top: 8px; + padding-bottom: 8px; + color: #777; + text-align: left; } - -.glyphicon-text-width:before { - content: "\e051"; +th { + text-align: left; } - -.glyphicon-align-left:before { - content: "\e052"; +.table { + width: 100%; + max-width: 100%; + margin-bottom: 20px; } - -.glyphicon-align-center:before { - content: "\e053"; +.table > thead > tr > th, +.table > tbody > tr > th, +.table > tfoot > tr > th, +.table > thead > tr > td, +.table > tbody > tr > td, +.table > tfoot > tr > td { + padding: 8px; + line-height: 1.42857143; + vertical-align: top; + border-top: 1px solid #ddd; } - -.glyphicon-align-right:before { - content: "\e054"; +.table > thead > tr > th { + vertical-align: bottom; + border-bottom: 2px solid #ddd; +} +.table > caption + thead > tr:first-child > th, +.table > colgroup + thead > tr:first-child > th, +.table > thead:first-child > tr:first-child > th, +.table > caption + thead > tr:first-child > td, +.table > colgroup + thead > tr:first-child > td, +.table > thead:first-child > tr:first-child > td { + border-top: 0; } - -.glyphicon-align-justify:before { - content: "\e055"; +.table > tbody + tbody { + border-top: 2px solid #ddd; } - -.glyphicon-list:before { - content: "\e056"; +.table .table { + background-color: #fff; +} +.table-condensed > thead > tr > th, +.table-condensed > tbody > tr > th, +.table-condensed > tfoot > tr > th, +.table-condensed > thead > tr > td, +.table-condensed > tbody > tr > td, +.table-condensed > tfoot > tr > td { + padding: 5px; } - -.glyphicon-indent-left:before { - content: "\e057"; +.table-bordered { + border: 1px solid #ddd; } - -.glyphicon-indent-right:before { - content: "\e058"; +.table-bordered > thead > tr > th, +.table-bordered > tbody > tr > th, +.table-bordered > tfoot > tr > th, +.table-bordered > thead > tr > td, +.table-bordered > tbody > tr > td, +.table-bordered > tfoot > tr > td { + border: 1px solid #ddd; } - -.glyphicon-facetime-video:before { - content: "\e059"; +.table-bordered > thead > tr > th, +.table-bordered > thead > tr > td { + border-bottom-width: 2px; } - -.glyphicon-picture:before { - content: "\e060"; +.table-striped > tbody > tr:nth-child(odd) { + background-color: #f9f9f9; } - -.glyphicon-map-marker:before { - content: "\e062"; +.table-hover > tbody > tr:hover { + background-color: #f5f5f5; } - -.glyphicon-adjust:before { - content: "\e063"; +table col[class*="col-"] { + position: static; + display: table-column; + float: none; } - -.glyphicon-tint:before { - content: "\e064"; +table td[class*="col-"], +table th[class*="col-"] { + position: static; + display: table-cell; + float: none; } - -.glyphicon-edit:before { - content: "\e065"; +.table > thead > tr > td.active, +.table > tbody > tr > td.active, +.table > tfoot > tr > td.active, +.table > thead > tr > th.active, +.table > tbody > tr > th.active, +.table > tfoot > tr > th.active, +.table > thead > tr.active > td, +.table > tbody > tr.active > td, +.table > tfoot > tr.active > td, +.table > thead > tr.active > th, +.table > tbody > tr.active > th, +.table > tfoot > tr.active > th { + background-color: #f5f5f5; } - -.glyphicon-share:before { - content: "\e066"; +.table-hover > tbody > tr > td.active:hover, +.table-hover > tbody > tr > th.active:hover, +.table-hover > tbody > tr.active:hover > td, +.table-hover > tbody > tr:hover > .active, +.table-hover > tbody > tr.active:hover > th { + background-color: #e8e8e8; } - -.glyphicon-check:before { - content: "\e067"; +.table > thead > tr > td.success, +.table > tbody > tr > td.success, +.table > tfoot > tr > td.success, +.table > thead > tr > th.success, +.table > tbody > tr > th.success, +.table > tfoot > tr > th.success, +.table > thead > tr.success > td, +.table > tbody > tr.success > td, +.table > tfoot > tr.success > td, +.table > thead > tr.success > th, +.table > tbody > tr.success > th, +.table > tfoot > tr.success > th { + background-color: #dff0d8; } - -.glyphicon-move:before { - content: "\e068"; +.table-hover > tbody > tr > td.success:hover, +.table-hover > tbody > tr > th.success:hover, +.table-hover > tbody > tr.success:hover > td, +.table-hover > tbody > tr:hover > .success, +.table-hover > tbody > tr.success:hover > th { + background-color: #d0e9c6; } - -.glyphicon-step-backward:before { - content: "\e069"; +.table > thead > tr > td.info, +.table > tbody > tr > td.info, +.table > tfoot > tr > td.info, +.table > thead > tr > th.info, +.table > tbody > tr > th.info, +.table > tfoot > tr > th.info, +.table > thead > tr.info > td, +.table > tbody > tr.info > td, +.table > tfoot > tr.info > td, +.table > thead > tr.info > th, +.table > tbody > tr.info > th, +.table > tfoot > tr.info > th { + background-color: #d9edf7; } - -.glyphicon-fast-backward:before { - content: "\e070"; +.table-hover > tbody > tr > td.info:hover, +.table-hover > tbody > tr > th.info:hover, +.table-hover > tbody > tr.info:hover > td, +.table-hover > tbody > tr:hover > .info, +.table-hover > tbody > tr.info:hover > th { + background-color: #c4e3f3; } - -.glyphicon-backward:before { - content: "\e071"; +.table > thead > tr > td.warning, +.table > tbody > tr > td.warning, +.table > tfoot > tr > td.warning, +.table > thead > tr > th.warning, +.table > tbody > tr > th.warning, +.table > tfoot > tr > th.warning, +.table > thead > tr.warning > td, +.table > tbody > tr.warning > td, +.table > tfoot > tr.warning > td, +.table > thead > tr.warning > th, +.table > tbody > tr.warning > th, +.table > tfoot > tr.warning > th { + background-color: #fcf8e3; } - -.glyphicon-play:before { - content: "\e072"; +.table-hover > tbody > tr > td.warning:hover, +.table-hover > tbody > tr > th.warning:hover, +.table-hover > tbody > tr.warning:hover > td, +.table-hover > tbody > tr:hover > .warning, +.table-hover > tbody > tr.warning:hover > th { + background-color: #faf2cc; } - -.glyphicon-pause:before { - content: "\e073"; +.table > thead > tr > td.danger, +.table > tbody > tr > td.danger, +.table > tfoot > tr > td.danger, +.table > thead > tr > th.danger, +.table > tbody > tr > th.danger, +.table > tfoot > tr > th.danger, +.table > thead > tr.danger > td, +.table > tbody > tr.danger > td, +.table > tfoot > tr.danger > td, +.table > thead > tr.danger > th, +.table > tbody > tr.danger > th, +.table > tfoot > tr.danger > th { + background-color: #f2dede; } - -.glyphicon-stop:before { - content: "\e074"; +.table-hover > tbody > tr > td.danger:hover, +.table-hover > tbody > tr > th.danger:hover, +.table-hover > tbody > tr.danger:hover > td, +.table-hover > tbody > tr:hover > .danger, +.table-hover > tbody > tr.danger:hover > th { + background-color: #ebcccc; } - -.glyphicon-forward:before { - content: "\e075"; +.table-responsive { + min-height: .01%; + overflow-x: auto; } - -.glyphicon-fast-forward:before { - content: "\e076"; +@media screen and (max-width: 767px) { + .table-responsive { + width: 100%; + margin-bottom: 15px; + overflow-y: hidden; + -ms-overflow-style: -ms-autohiding-scrollbar; + border: 1px solid #ddd; + } + .table-responsive > .table { + margin-bottom: 0; + } + .table-responsive > .table > thead > tr > th, + .table-responsive > .table > tbody > tr > th, + .table-responsive > .table > tfoot > tr > th, + .table-responsive > .table > thead > tr > td, + .table-responsive > .table > tbody > tr > td, + .table-responsive > .table > tfoot > tr > td { + white-space: nowrap; + } + .table-responsive > .table-bordered { + border: 0; + } + .table-responsive > .table-bordered > thead > tr > th:first-child, + .table-responsive > .table-bordered > tbody > tr > th:first-child, + .table-responsive > .table-bordered > tfoot > tr > th:first-child, + .table-responsive > .table-bordered > thead > tr > td:first-child, + .table-responsive > .table-bordered > tbody > tr > td:first-child, + .table-responsive > .table-bordered > tfoot > tr > td:first-child { + border-left: 0; + } + .table-responsive > .table-bordered > thead > tr > th:last-child, + .table-responsive > .table-bordered > tbody > tr > th:last-child, + .table-responsive > .table-bordered > tfoot > tr > th:last-child, + .table-responsive > .table-bordered > thead > tr > td:last-child, + .table-responsive > .table-bordered > tbody > tr > td:last-child, + .table-responsive > .table-bordered > tfoot > tr > td:last-child { + border-right: 0; + } + .table-responsive > .table-bordered > tbody > tr:last-child > th, + .table-responsive > .table-bordered > tfoot > tr:last-child > th, + .table-responsive > .table-bordered > tbody > tr:last-child > td, + .table-responsive > .table-bordered > tfoot > tr:last-child > td { + border-bottom: 0; + } } - -.glyphicon-step-forward:before { - content: "\e077"; +fieldset { + min-width: 0; + padding: 0; + margin: 0; + border: 0; } - -.glyphicon-eject:before { - content: "\e078"; +legend { + display: block; + width: 100%; + padding: 0; + margin-bottom: 20px; + font-size: 21px; + line-height: inherit; + color: #333; + border: 0; + border-bottom: 1px solid #e5e5e5; } - -.glyphicon-chevron-left:before { - content: "\e079"; +label { + display: inline-block; + max-width: 100%; + margin-bottom: 5px; + font-weight: bold; } - -.glyphicon-chevron-right:before { - content: "\e080"; +input[type="search"] { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; } - -.glyphicon-plus-sign:before { - content: "\e081"; +input[type="radio"], +input[type="checkbox"] { + margin: 4px 0 0; + margin-top: 1px \9; + line-height: normal; } - -.glyphicon-minus-sign:before { - content: "\e082"; +input[type="file"] { + display: block; } - -.glyphicon-remove-sign:before { - content: "\e083"; +input[type="range"] { + display: block; + width: 100%; } - -.glyphicon-ok-sign:before { - content: "\e084"; +select[multiple], +select[size] { + height: auto; } - -.glyphicon-question-sign:before { - content: "\e085"; +input[type="file"]:focus, +input[type="radio"]:focus, +input[type="checkbox"]:focus { + outline: thin dotted; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; } - -.glyphicon-info-sign:before { - content: "\e086"; +output { + display: block; + padding-top: 7px; + font-size: 14px; + line-height: 1.42857143; + color: #555; } - -.glyphicon-screenshot:before { - content: "\e087"; +.form-control { + display: block; + width: 100%; + height: 34px; + padding: 6px 12px; + font-size: 14px; + line-height: 1.42857143; + color: #555; + background-color: #fff; + background-image: none; + border: 1px solid #ccc; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); + -webkit-transition: border-color ease-in-out .15s, -webkit-box-shadow ease-in-out .15s; + -o-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; + transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; } - -.glyphicon-remove-circle:before { - content: "\e088"; +.form-control:focus { + border-color: #66afe9; + outline: 0; + -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, .6); + box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, .6); } - -.glyphicon-ok-circle:before { - content: "\e089"; +.form-control::-moz-placeholder { + color: #999; + opacity: 1; } - -.glyphicon-ban-circle:before { - content: "\e090"; +.form-control:-ms-input-placeholder { + color: #999; } - -.glyphicon-arrow-left:before { - content: "\e091"; +.form-control::-webkit-input-placeholder { + color: #999; } - -.glyphicon-arrow-right:before { - content: "\e092"; +.form-control[disabled], +.form-control[readonly], +fieldset[disabled] .form-control { + cursor: not-allowed; + background-color: #eee; + opacity: 1; } - -.glyphicon-arrow-up:before { - content: "\e093"; +textarea.form-control { + height: auto; } - -.glyphicon-arrow-down:before { - content: "\e094"; +input[type="search"] { + -webkit-appearance: none; } - -.glyphicon-share-alt:before { - content: "\e095"; +input[type="date"], +input[type="time"], +input[type="datetime-local"], +input[type="month"] { + line-height: 34px; + line-height: 1.42857143 \0; +} +input[type="date"].input-sm, +input[type="time"].input-sm, +input[type="datetime-local"].input-sm, +input[type="month"].input-sm { + line-height: 30px; + line-height: 1.5 \0; +} +input[type="date"].input-lg, +input[type="time"].input-lg, +input[type="datetime-local"].input-lg, +input[type="month"].input-lg { + line-height: 46px; + line-height: 1.33 \0; +} +_:-ms-fullscreen, +:root input[type="date"], +_:-ms-fullscreen, +:root input[type="time"], +_:-ms-fullscreen, +:root input[type="datetime-local"], +_:-ms-fullscreen, +:root input[type="month"] { + line-height: 1.42857143; +} +_:-ms-fullscreen.input-sm, +:root input[type="date"].input-sm, +_:-ms-fullscreen.input-sm, +:root input[type="time"].input-sm, +_:-ms-fullscreen.input-sm, +:root input[type="datetime-local"].input-sm, +_:-ms-fullscreen.input-sm, +:root input[type="month"].input-sm { + line-height: 1.5; } - -.glyphicon-resize-full:before { - content: "\e096"; +_:-ms-fullscreen.input-lg, +:root input[type="date"].input-lg, +_:-ms-fullscreen.input-lg, +:root input[type="time"].input-lg, +_:-ms-fullscreen.input-lg, +:root input[type="datetime-local"].input-lg, +_:-ms-fullscreen.input-lg, +:root input[type="month"].input-lg { + line-height: 1.33; } - -.glyphicon-resize-small:before { - content: "\e097"; +.form-group { + margin-bottom: 15px; } - -.glyphicon-exclamation-sign:before { - content: "\e101"; +.radio, +.checkbox { + position: relative; + display: block; + margin-top: 10px; + margin-bottom: 10px; } - -.glyphicon-gift:before { - content: "\e102"; +.radio label, +.checkbox label { + min-height: 20px; + padding-left: 20px; + margin-bottom: 0; + font-weight: normal; + cursor: pointer; } - -.glyphicon-leaf:before { - content: "\e103"; +.radio input[type="radio"], +.radio-inline input[type="radio"], +.checkbox input[type="checkbox"], +.checkbox-inline input[type="checkbox"] { + position: absolute; + margin-top: 4px \9; + margin-left: -20px; } - -.glyphicon-eye-open:before { - content: "\e105"; +.radio + .radio, +.checkbox + .checkbox { + margin-top: -5px; } - -.glyphicon-eye-close:before { - content: "\e106"; +.radio-inline, +.checkbox-inline { + display: inline-block; + padding-left: 20px; + margin-bottom: 0; + font-weight: normal; + vertical-align: middle; + cursor: pointer; } - -.glyphicon-warning-sign:before { - content: "\e107"; +.radio-inline + .radio-inline, +.checkbox-inline + .checkbox-inline { + margin-top: 0; + margin-left: 10px; } - -.glyphicon-plane:before { - content: "\e108"; +input[type="radio"][disabled], +input[type="checkbox"][disabled], +input[type="radio"].disabled, +input[type="checkbox"].disabled, +fieldset[disabled] input[type="radio"], +fieldset[disabled] input[type="checkbox"] { + cursor: not-allowed; } - -.glyphicon-random:before { - content: "\e110"; +.radio-inline.disabled, +.checkbox-inline.disabled, +fieldset[disabled] .radio-inline, +fieldset[disabled] .checkbox-inline { + cursor: not-allowed; } - -.glyphicon-comment:before { - content: "\e111"; +.radio.disabled label, +.checkbox.disabled label, +fieldset[disabled] .radio label, +fieldset[disabled] .checkbox label { + cursor: not-allowed; } - -.glyphicon-magnet:before { - content: "\e112"; +.form-control-static { + padding-top: 7px; + padding-bottom: 7px; + margin-bottom: 0; } - -.glyphicon-chevron-up:before { - content: "\e113"; +.form-control-static.input-lg, +.form-control-static.input-sm { + padding-right: 0; + padding-left: 0; } - -.glyphicon-chevron-down:before { - content: "\e114"; +.input-sm, +.form-group-sm .form-control { + height: 30px; + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; } - -.glyphicon-retweet:before { - content: "\e115"; +select.input-sm, +select.form-group-sm .form-control { + height: 30px; + line-height: 30px; } - -.glyphicon-shopping-cart:before { - content: "\e116"; +textarea.input-sm, +textarea.form-group-sm .form-control, +select[multiple].input-sm, +select[multiple].form-group-sm .form-control { + height: auto; } - -.glyphicon-folder-close:before { - content: "\e117"; +.input-lg, +.form-group-lg .form-control { + height: 46px; + padding: 10px 16px; + font-size: 18px; + line-height: 1.33; + border-radius: 6px; } - -.glyphicon-folder-open:before { - content: "\e118"; +select.input-lg, +select.form-group-lg .form-control { + height: 46px; + line-height: 46px; } - -.glyphicon-resize-vertical:before { - content: "\e119"; +textarea.input-lg, +textarea.form-group-lg .form-control, +select[multiple].input-lg, +select[multiple].form-group-lg .form-control { + height: auto; } - -.glyphicon-resize-horizontal:before { - content: "\e120"; +.has-feedback { + position: relative; } - -.glyphicon-hdd:before { - content: "\e121"; +.has-feedback .form-control { + padding-right: 42.5px; } - -.glyphicon-bullhorn:before { - content: "\e122"; +.form-control-feedback { + position: absolute; + top: 0; + right: 0; + z-index: 2; + display: block; + width: 34px; + height: 34px; + line-height: 34px; + text-align: center; + pointer-events: none; } - -.glyphicon-certificate:before { - content: "\e124"; +.input-lg + .form-control-feedback { + width: 46px; + height: 46px; + line-height: 46px; } - -.glyphicon-thumbs-up:before { - content: "\e125"; +.input-sm + .form-control-feedback { + width: 30px; + height: 30px; + line-height: 30px; } - -.glyphicon-thumbs-down:before { - content: "\e126"; +.has-success .help-block, +.has-success .control-label, +.has-success .radio, +.has-success .checkbox, +.has-success .radio-inline, +.has-success .checkbox-inline, +.has-success.radio label, +.has-success.checkbox label, +.has-success.radio-inline label, +.has-success.checkbox-inline label { + color: #3c763d; } - -.glyphicon-hand-right:before { - content: "\e127"; +.has-success .form-control { + border-color: #3c763d; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); } - -.glyphicon-hand-left:before { - content: "\e128"; +.has-success .form-control:focus { + border-color: #2b542c; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #67b168; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #67b168; } - -.glyphicon-hand-up:before { - content: "\e129"; +.has-success .input-group-addon { + color: #3c763d; + background-color: #dff0d8; + border-color: #3c763d; } - -.glyphicon-hand-down:before { - content: "\e130"; +.has-success .form-control-feedback { + color: #3c763d; } - -.glyphicon-circle-arrow-right:before { - content: "\e131"; +.has-warning .help-block, +.has-warning .control-label, +.has-warning .radio, +.has-warning .checkbox, +.has-warning .radio-inline, +.has-warning .checkbox-inline, +.has-warning.radio label, +.has-warning.checkbox label, +.has-warning.radio-inline label, +.has-warning.checkbox-inline label { + color: #8a6d3b; } - -.glyphicon-circle-arrow-left:before { - content: "\e132"; +.has-warning .form-control { + border-color: #8a6d3b; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); } - -.glyphicon-circle-arrow-up:before { - content: "\e133"; +.has-warning .form-control:focus { + border-color: #66512c; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #c0a16b; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #c0a16b; } - -.glyphicon-circle-arrow-down:before { - content: "\e134"; +.has-warning .input-group-addon { + color: #8a6d3b; + background-color: #fcf8e3; + border-color: #8a6d3b; } - -.glyphicon-globe:before { - content: "\e135"; +.has-warning .form-control-feedback { + color: #8a6d3b; } - -.glyphicon-tasks:before { - content: "\e137"; +.has-error .help-block, +.has-error .control-label, +.has-error .radio, +.has-error .checkbox, +.has-error .radio-inline, +.has-error .checkbox-inline, +.has-error.radio label, +.has-error.checkbox label, +.has-error.radio-inline label, +.has-error.checkbox-inline label { + color: #a94442; } - -.glyphicon-filter:before { - content: "\e138"; +.has-error .form-control { + border-color: #a94442; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); } - -.glyphicon-fullscreen:before { - content: "\e140"; +.has-error .form-control:focus { + border-color: #843534; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #ce8483; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #ce8483; } - -.glyphicon-dashboard:before { - content: "\e141"; +.has-error .input-group-addon { + color: #a94442; + background-color: #f2dede; + border-color: #a94442; } - -.glyphicon-heart-empty:before { - content: "\e143"; +.has-error .form-control-feedback { + color: #a94442; } - -.glyphicon-link:before { - content: "\e144"; +.has-feedback label ~ .form-control-feedback { + top: 25px; } - -.glyphicon-phone:before { - content: "\e145"; +.has-feedback label.sr-only ~ .form-control-feedback { + top: 0; } - -.glyphicon-usd:before { - content: "\e148"; +.help-block { + display: block; + margin-top: 5px; + margin-bottom: 10px; + color: #737373; } - -.glyphicon-gbp:before { - content: "\e149"; +@media (min-width: 768px) { + .form-inline .form-group { + display: inline-block; + margin-bottom: 0; + vertical-align: middle; + } + .form-inline .form-control { + display: inline-block; + width: auto; + vertical-align: middle; + } + .form-inline .form-control-static { + display: inline-block; + } + .form-inline .input-group { + display: inline-table; + vertical-align: middle; + } + .form-inline .input-group .input-group-addon, + .form-inline .input-group .input-group-btn, + .form-inline .input-group .form-control { + width: auto; + } + .form-inline .input-group > .form-control { + width: 100%; + } + .form-inline .control-label { + margin-bottom: 0; + vertical-align: middle; + } + .form-inline .radio, + .form-inline .checkbox { + display: inline-block; + margin-top: 0; + margin-bottom: 0; + vertical-align: middle; + } + .form-inline .radio label, + .form-inline .checkbox label { + padding-left: 0; + } + .form-inline .radio input[type="radio"], + .form-inline .checkbox input[type="checkbox"] { + position: relative; + margin-left: 0; + } + .form-inline .has-feedback .form-control-feedback { + top: 0; + } } - -.glyphicon-sort:before { - content: "\e150"; +.form-horizontal .radio, +.form-horizontal .checkbox, +.form-horizontal .radio-inline, +.form-horizontal .checkbox-inline { + padding-top: 7px; + margin-top: 0; + margin-bottom: 0; } - -.glyphicon-sort-by-alphabet:before { - content: "\e151"; +.form-horizontal .radio, +.form-horizontal .checkbox { + min-height: 27px; } - -.glyphicon-sort-by-alphabet-alt:before { - content: "\e152"; +.form-horizontal .form-group { + margin-right: -15px; + margin-left: -15px; } - -.glyphicon-sort-by-order:before { - content: "\e153"; +@media (min-width: 768px) { + .form-horizontal .control-label { + padding-top: 7px; + margin-bottom: 0; + text-align: right; + } } - -.glyphicon-sort-by-order-alt:before { - content: "\e154"; +.form-horizontal .has-feedback .form-control-feedback { + right: 15px; } - -.glyphicon-sort-by-attributes:before { - content: "\e155"; +@media (min-width: 768px) { + .form-horizontal .form-group-lg .control-label { + padding-top: 14.3px; + } } - -.glyphicon-sort-by-attributes-alt:before { - content: "\e156"; +@media (min-width: 768px) { + .form-horizontal .form-group-sm .control-label { + padding-top: 6px; + } } - -.glyphicon-unchecked:before { - content: "\e157"; +.btn { + display: inline-block; + padding: 6px 12px; + margin-bottom: 0; + font-size: 14px; + font-weight: normal; + line-height: 1.42857143; + text-align: center; + white-space: nowrap; + vertical-align: middle; + -ms-touch-action: manipulation; + touch-action: manipulation; + cursor: pointer; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + background-image: none; + border: 1px solid transparent; + border-radius: 4px; } - -.glyphicon-expand:before { - content: "\e158"; +.btn:focus, +.btn:active:focus, +.btn.active:focus, +.btn.focus, +.btn:active.focus, +.btn.active.focus { + outline: thin dotted; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; } - -.glyphicon-collapse-down:before { - content: "\e159"; +.btn:hover, +.btn:focus, +.btn.focus { + color: #333; + text-decoration: none; } - -.glyphicon-collapse-up:before { - content: "\e160"; +.btn:active, +.btn.active { + background-image: none; + outline: 0; + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); } - -.glyphicon-log-in:before { - content: "\e161"; +.btn.disabled, +.btn[disabled], +fieldset[disabled] .btn { + pointer-events: none; + cursor: not-allowed; + filter: alpha(opacity=65); + -webkit-box-shadow: none; + box-shadow: none; + opacity: .65; } - -.glyphicon-flash:before { - content: "\e162"; +.btn-default { + color: #333; + background-color: #fff; + border-color: #ccc; } - -.glyphicon-log-out:before { - content: "\e163"; +.btn-default:hover, +.btn-default:focus, +.btn-default.focus, +.btn-default:active, +.btn-default.active, +.open > .dropdown-toggle.btn-default { + color: #333; + background-color: #e6e6e6; + border-color: #adadad; } - -.glyphicon-new-window:before { - content: "\e164"; +.btn-default:active, +.btn-default.active, +.open > .dropdown-toggle.btn-default { + background-image: none; } - -.glyphicon-record:before { - content: "\e165"; +.btn-default.disabled, +.btn-default[disabled], +fieldset[disabled] .btn-default, +.btn-default.disabled:hover, +.btn-default[disabled]:hover, +fieldset[disabled] .btn-default:hover, +.btn-default.disabled:focus, +.btn-default[disabled]:focus, +fieldset[disabled] .btn-default:focus, +.btn-default.disabled.focus, +.btn-default[disabled].focus, +fieldset[disabled] .btn-default.focus, +.btn-default.disabled:active, +.btn-default[disabled]:active, +fieldset[disabled] .btn-default:active, +.btn-default.disabled.active, +.btn-default[disabled].active, +fieldset[disabled] .btn-default.active { + background-color: #fff; + border-color: #ccc; } - -.glyphicon-save:before { - content: "\e166"; +.btn-default .badge { + color: #fff; + background-color: #333; } - -.glyphicon-open:before { - content: "\e167"; +.btn-primary { + color: #fff; + background-color: #428bca; + border-color: #357ebd; } - -.glyphicon-saved:before { - content: "\e168"; +.btn-primary:hover, +.btn-primary:focus, +.btn-primary.focus, +.btn-primary:active, +.btn-primary.active, +.open > .dropdown-toggle.btn-primary { + color: #fff; + background-color: #3071a9; + border-color: #285e8e; } - -.glyphicon-import:before { - content: "\e169"; +.btn-primary:active, +.btn-primary.active, +.open > .dropdown-toggle.btn-primary { + background-image: none; } - -.glyphicon-export:before { - content: "\e170"; +.btn-primary.disabled, +.btn-primary[disabled], +fieldset[disabled] .btn-primary, +.btn-primary.disabled:hover, +.btn-primary[disabled]:hover, +fieldset[disabled] .btn-primary:hover, +.btn-primary.disabled:focus, +.btn-primary[disabled]:focus, +fieldset[disabled] .btn-primary:focus, +.btn-primary.disabled.focus, +.btn-primary[disabled].focus, +fieldset[disabled] .btn-primary.focus, +.btn-primary.disabled:active, +.btn-primary[disabled]:active, +fieldset[disabled] .btn-primary:active, +.btn-primary.disabled.active, +.btn-primary[disabled].active, +fieldset[disabled] .btn-primary.active { + background-color: #428bca; + border-color: #357ebd; } - -.glyphicon-send:before { - content: "\e171"; +.btn-primary .badge { + color: #428bca; + background-color: #fff; } - -.glyphicon-floppy-disk:before { - content: "\e172"; +.btn-success { + color: #fff; + background-color: #5cb85c; + border-color: #4cae4c; } - -.glyphicon-floppy-saved:before { - content: "\e173"; +.btn-success:hover, +.btn-success:focus, +.btn-success.focus, +.btn-success:active, +.btn-success.active, +.open > .dropdown-toggle.btn-success { + color: #fff; + background-color: #449d44; + border-color: #398439; } - -.glyphicon-floppy-remove:before { - content: "\e174"; +.btn-success:active, +.btn-success.active, +.open > .dropdown-toggle.btn-success { + background-image: none; } - -.glyphicon-floppy-save:before { - content: "\e175"; +.btn-success.disabled, +.btn-success[disabled], +fieldset[disabled] .btn-success, +.btn-success.disabled:hover, +.btn-success[disabled]:hover, +fieldset[disabled] .btn-success:hover, +.btn-success.disabled:focus, +.btn-success[disabled]:focus, +fieldset[disabled] .btn-success:focus, +.btn-success.disabled.focus, +.btn-success[disabled].focus, +fieldset[disabled] .btn-success.focus, +.btn-success.disabled:active, +.btn-success[disabled]:active, +fieldset[disabled] .btn-success:active, +.btn-success.disabled.active, +.btn-success[disabled].active, +fieldset[disabled] .btn-success.active { + background-color: #5cb85c; + border-color: #4cae4c; } - -.glyphicon-floppy-open:before { - content: "\e176"; +.btn-success .badge { + color: #5cb85c; + background-color: #fff; } - -.glyphicon-credit-card:before { - content: "\e177"; +.btn-info { + color: #fff; + background-color: #5bc0de; + border-color: #46b8da; } - -.glyphicon-transfer:before { - content: "\e178"; +.btn-info:hover, +.btn-info:focus, +.btn-info.focus, +.btn-info:active, +.btn-info.active, +.open > .dropdown-toggle.btn-info { + color: #fff; + background-color: #31b0d5; + border-color: #269abc; } - -.glyphicon-cutlery:before { - content: "\e179"; +.btn-info:active, +.btn-info.active, +.open > .dropdown-toggle.btn-info { + background-image: none; } - -.glyphicon-header:before { - content: "\e180"; +.btn-info.disabled, +.btn-info[disabled], +fieldset[disabled] .btn-info, +.btn-info.disabled:hover, +.btn-info[disabled]:hover, +fieldset[disabled] .btn-info:hover, +.btn-info.disabled:focus, +.btn-info[disabled]:focus, +fieldset[disabled] .btn-info:focus, +.btn-info.disabled.focus, +.btn-info[disabled].focus, +fieldset[disabled] .btn-info.focus, +.btn-info.disabled:active, +.btn-info[disabled]:active, +fieldset[disabled] .btn-info:active, +.btn-info.disabled.active, +.btn-info[disabled].active, +fieldset[disabled] .btn-info.active { + background-color: #5bc0de; + border-color: #46b8da; } - -.glyphicon-compressed:before { - content: "\e181"; +.btn-info .badge { + color: #5bc0de; + background-color: #fff; } - -.glyphicon-earphone:before { - content: "\e182"; +.btn-warning { + color: #fff; + background-color: #f0ad4e; + border-color: #eea236; } - -.glyphicon-phone-alt:before { - content: "\e183"; +.btn-warning:hover, +.btn-warning:focus, +.btn-warning.focus, +.btn-warning:active, +.btn-warning.active, +.open > .dropdown-toggle.btn-warning { + color: #fff; + background-color: #ec971f; + border-color: #d58512; } - -.glyphicon-tower:before { - content: "\e184"; +.btn-warning:active, +.btn-warning.active, +.open > .dropdown-toggle.btn-warning { + background-image: none; } - -.glyphicon-stats:before { - content: "\e185"; +.btn-warning.disabled, +.btn-warning[disabled], +fieldset[disabled] .btn-warning, +.btn-warning.disabled:hover, +.btn-warning[disabled]:hover, +fieldset[disabled] .btn-warning:hover, +.btn-warning.disabled:focus, +.btn-warning[disabled]:focus, +fieldset[disabled] .btn-warning:focus, +.btn-warning.disabled.focus, +.btn-warning[disabled].focus, +fieldset[disabled] .btn-warning.focus, +.btn-warning.disabled:active, +.btn-warning[disabled]:active, +fieldset[disabled] .btn-warning:active, +.btn-warning.disabled.active, +.btn-warning[disabled].active, +fieldset[disabled] .btn-warning.active { + background-color: #f0ad4e; + border-color: #eea236; } - -.glyphicon-sd-video:before { - content: "\e186"; +.btn-warning .badge { + color: #f0ad4e; + background-color: #fff; } - -.glyphicon-hd-video:before { - content: "\e187"; +.btn-danger { + color: #fff; + background-color: #d9534f; + border-color: #d43f3a; } - -.glyphicon-subtitles:before { - content: "\e188"; +.btn-danger:hover, +.btn-danger:focus, +.btn-danger.focus, +.btn-danger:active, +.btn-danger.active, +.open > .dropdown-toggle.btn-danger { + color: #fff; + background-color: #c9302c; + border-color: #ac2925; } - -.glyphicon-sound-stereo:before { - content: "\e189"; +.btn-danger:active, +.btn-danger.active, +.open > .dropdown-toggle.btn-danger { + background-image: none; } - -.glyphicon-sound-dolby:before { - content: "\e190"; +.btn-danger.disabled, +.btn-danger[disabled], +fieldset[disabled] .btn-danger, +.btn-danger.disabled:hover, +.btn-danger[disabled]:hover, +fieldset[disabled] .btn-danger:hover, +.btn-danger.disabled:focus, +.btn-danger[disabled]:focus, +fieldset[disabled] .btn-danger:focus, +.btn-danger.disabled.focus, +.btn-danger[disabled].focus, +fieldset[disabled] .btn-danger.focus, +.btn-danger.disabled:active, +.btn-danger[disabled]:active, +fieldset[disabled] .btn-danger:active, +.btn-danger.disabled.active, +.btn-danger[disabled].active, +fieldset[disabled] .btn-danger.active { + background-color: #d9534f; + border-color: #d43f3a; } - -.glyphicon-sound-5-1:before { - content: "\e191"; +.btn-danger .badge { + color: #d9534f; + background-color: #fff; } - -.glyphicon-sound-6-1:before { - content: "\e192"; +.btn-link { + font-weight: normal; + color: #428bca; + border-radius: 0; } - -.glyphicon-sound-7-1:before { - content: "\e193"; +.btn-link, +.btn-link:active, +.btn-link.active, +.btn-link[disabled], +fieldset[disabled] .btn-link { + background-color: transparent; + -webkit-box-shadow: none; + box-shadow: none; } - -.glyphicon-copyright-mark:before { - content: "\e194"; +.btn-link, +.btn-link:hover, +.btn-link:focus, +.btn-link:active { + border-color: transparent; } - -.glyphicon-registration-mark:before { - content: "\e195"; +.btn-link:hover, +.btn-link:focus { + color: #2a6496; + text-decoration: underline; + background-color: transparent; } - -.glyphicon-cloud-download:before { - content: "\e197"; +.btn-link[disabled]:hover, +fieldset[disabled] .btn-link:hover, +.btn-link[disabled]:focus, +fieldset[disabled] .btn-link:focus { + color: #777; + text-decoration: none; } - -.glyphicon-cloud-upload:before { - content: "\e198"; +.btn-lg, +.btn-group-lg > .btn { + padding: 10px 16px; + font-size: 18px; + line-height: 1.33; + border-radius: 6px; } - -.glyphicon-tree-conifer:before { - content: "\e199"; +.btn-sm, +.btn-group-sm > .btn { + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; } - -.glyphicon-tree-deciduous:before { - content: "\e200"; +.btn-xs, +.btn-group-xs > .btn { + padding: 1px 5px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; } - -.glyphicon-briefcase:before { - content: "\1f4bc"; +.btn-block { + display: block; + width: 100%; } - -.glyphicon-calendar:before { - content: "\1f4c5"; +.btn-block + .btn-block { + margin-top: 5px; } - -.glyphicon-pushpin:before { - content: "\1f4cc"; +input[type="submit"].btn-block, +input[type="reset"].btn-block, +input[type="button"].btn-block { + width: 100%; } - -.glyphicon-paperclip:before { - content: "\1f4ce"; +.fade { + opacity: 0; + -webkit-transition: opacity .15s linear; + -o-transition: opacity .15s linear; + transition: opacity .15s linear; } - -.glyphicon-camera:before { - content: "\1f4f7"; +.fade.in { + opacity: 1; } - -.glyphicon-lock:before { - content: "\1f512"; +.collapse { + display: none; + visibility: hidden; } - -.glyphicon-bell:before { - content: "\1f514"; +.collapse.in { + display: block; + visibility: visible; } - -.glyphicon-bookmark:before { - content: "\1f516"; +tr.collapse.in { + display: table-row; } - -.glyphicon-fire:before { - content: "\1f525"; +tbody.collapse.in { + display: table-row-group; } - -.glyphicon-wrench:before { - content: "\1f527"; +.collapsing { + position: relative; + height: 0; + overflow: hidden; + -webkit-transition-timing-function: ease; + -o-transition-timing-function: ease; + transition-timing-function: ease; + -webkit-transition-duration: .35s; + -o-transition-duration: .35s; + transition-duration: .35s; + -webkit-transition-property: height, visibility; + -o-transition-property: height, visibility; + transition-property: height, visibility; } - .caret { display: inline-block; width: 0; height: 0; margin-left: 2px; vertical-align: middle; - border-top: 4px solid #000000; + border-top: 4px solid; border-right: 4px solid transparent; - border-bottom: 0 dotted; border-left: 4px solid transparent; - content: ""; } - .dropdown { position: relative; } - .dropdown-toggle:focus { outline: 0; } - .dropdown-menu { position: absolute; top: 100%; @@ -3232,85 +3233,85 @@ input[type="button"].btn-block { padding: 5px 0; margin: 2px 0 0; font-size: 14px; + text-align: left; list-style: none; - background-color: #ffffff; - border: 1px solid #cccccc; - border: 1px solid rgba(0, 0, 0, 0.15); + background-color: #fff; + -webkit-background-clip: padding-box; + background-clip: padding-box; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, .15); border-radius: 4px; - -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175); - box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175); - background-clip: padding-box; + -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, .175); + box-shadow: 0 6px 12px rgba(0, 0, 0, .175); } - .dropdown-menu.pull-right { right: 0; left: auto; } - .dropdown-menu .divider { height: 1px; margin: 9px 0; overflow: hidden; background-color: #e5e5e5; } - .dropdown-menu > li > a { display: block; padding: 3px 20px; clear: both; font-weight: normal; - line-height: 1.428571429; - color: #333333; + line-height: 1.42857143; + color: #333; white-space: nowrap; } - .dropdown-menu > li > a:hover, .dropdown-menu > li > a:focus { - color: #ffffff; + color: #262626; text-decoration: none; - background-color: #428bca; + background-color: #f5f5f5; } - .dropdown-menu > .active > a, .dropdown-menu > .active > a:hover, .dropdown-menu > .active > a:focus { - color: #ffffff; + color: #fff; text-decoration: none; background-color: #428bca; outline: 0; } - .dropdown-menu > .disabled > a, .dropdown-menu > .disabled > a:hover, .dropdown-menu > .disabled > a:focus { - color: #999999; + color: #777; } - .dropdown-menu > .disabled > a:hover, .dropdown-menu > .disabled > a:focus { text-decoration: none; cursor: not-allowed; background-color: transparent; background-image: none; - filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); } - .open > .dropdown-menu { display: block; } - .open > a { outline: 0; } - +.dropdown-menu-right { + right: 0; + left: auto; +} +.dropdown-menu-left { + right: auto; + left: 0; +} .dropdown-header { display: block; padding: 3px 20px; font-size: 12px; - line-height: 1.428571429; - color: #999999; + line-height: 1.42857143; + color: #777; + white-space: nowrap; } - .dropdown-backdrop { position: fixed; top: 0; @@ -3319,70 +3320,43 @@ input[type="button"].btn-block { left: 0; z-index: 990; } - .pull-right > .dropdown-menu { right: 0; left: auto; } - .dropup .caret, .navbar-fixed-bottom .dropdown .caret { - border-top: 0 dotted; - border-bottom: 4px solid #000000; content: ""; + border-top: 0; + border-bottom: 4px solid; } - .dropup .dropdown-menu, .navbar-fixed-bottom .dropdown .dropdown-menu { top: auto; bottom: 100%; margin-bottom: 1px; } - @media (min-width: 768px) { .navbar-right .dropdown-menu { right: 0; left: auto; } + .navbar-right .dropdown-menu-left { + right: auto; + left: 0; + } } - -.btn-default .caret { - border-top-color: #333333; -} - -.btn-primary .caret, -.btn-success .caret, -.btn-warning .caret, -.btn-danger .caret, -.btn-info .caret { - border-top-color: #fff; -} - -.dropup .btn-default .caret { - border-bottom-color: #333333; -} - -.dropup .btn-primary .caret, -.dropup .btn-success .caret, -.dropup .btn-warning .caret, -.dropup .btn-danger .caret, -.dropup .btn-info .caret { - border-bottom-color: #fff; -} - .btn-group, .btn-group-vertical { position: relative; display: inline-block; vertical-align: middle; } - .btn-group > .btn, .btn-group-vertical > .btn { position: relative; float: left; } - .btn-group > .btn:hover, .btn-group-vertical > .btn:hover, .btn-group > .btn:focus, @@ -3393,175 +3367,99 @@ input[type="button"].btn-block { .btn-group-vertical > .btn.active { z-index: 2; } - .btn-group > .btn:focus, .btn-group-vertical > .btn:focus { - outline: none; + outline: 0; } - .btn-group .btn + .btn, .btn-group .btn + .btn-group, .btn-group .btn-group + .btn, .btn-group .btn-group + .btn-group { margin-left: -1px; } - -.btn-toolbar:before, -.btn-toolbar:after { - display: table; - content: " "; -} - -.btn-toolbar:after { - clear: both; -} - -.btn-toolbar:before, -.btn-toolbar:after { - display: table; - content: " "; -} - -.btn-toolbar:after { - clear: both; +.btn-toolbar { + margin-left: -5px; } - -.btn-toolbar .btn-group { +.btn-toolbar .btn-group, +.btn-toolbar .input-group { float: left; } - -.btn-toolbar > .btn + .btn, -.btn-toolbar > .btn-group + .btn, -.btn-toolbar > .btn + .btn-group, -.btn-toolbar > .btn-group + .btn-group { +.btn-toolbar > .btn, +.btn-toolbar > .btn-group, +.btn-toolbar > .input-group { margin-left: 5px; } - .btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) { border-radius: 0; } - .btn-group > .btn:first-child { margin-left: 0; } - .btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) { border-top-right-radius: 0; border-bottom-right-radius: 0; } - .btn-group > .btn:last-child:not(:first-child), .btn-group > .dropdown-toggle:not(:first-child) { - border-bottom-left-radius: 0; border-top-left-radius: 0; + border-bottom-left-radius: 0; } - .btn-group > .btn-group { float: left; } - .btn-group > .btn-group:not(:first-child):not(:last-child) > .btn { border-radius: 0; } - .btn-group > .btn-group:first-child > .btn:last-child, .btn-group > .btn-group:first-child > .dropdown-toggle { border-top-right-radius: 0; border-bottom-right-radius: 0; } - .btn-group > .btn-group:last-child > .btn:first-child { - border-bottom-left-radius: 0; border-top-left-radius: 0; + border-bottom-left-radius: 0; } - .btn-group .dropdown-toggle:active, .btn-group.open .dropdown-toggle { outline: 0; } - -.btn-group-xs > .btn { - padding: 5px 10px; - padding: 1px 5px; - font-size: 12px; - line-height: 1.5; - border-radius: 3px; -} - -.btn-group-sm > .btn { - padding: 5px 10px; - font-size: 12px; - line-height: 1.5; - border-radius: 3px; -} - -.btn-group-lg > .btn { - padding: 10px 16px; - font-size: 18px; - line-height: 1.33; - border-radius: 6px; -} - .btn-group > .btn + .dropdown-toggle { padding-right: 8px; padding-left: 8px; } - .btn-group > .btn-lg + .dropdown-toggle { padding-right: 12px; padding-left: 12px; } - .btn-group.open .dropdown-toggle { - -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); - box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); +} +.btn-group.open .dropdown-toggle.btn-link { + -webkit-box-shadow: none; + box-shadow: none; } - .btn .caret { margin-left: 0; } - .btn-lg .caret { border-width: 5px 5px 0; border-bottom-width: 0; } - .dropup .btn-lg .caret { border-width: 0 5px 5px; } - .btn-group-vertical > .btn, -.btn-group-vertical > .btn-group { +.btn-group-vertical > .btn-group, +.btn-group-vertical > .btn-group > .btn { display: block; float: none; width: 100%; max-width: 100%; } - -.btn-group-vertical > .btn-group:before, -.btn-group-vertical > .btn-group:after { - display: table; - content: " "; -} - -.btn-group-vertical > .btn-group:after { - clear: both; -} - -.btn-group-vertical > .btn-group:before, -.btn-group-vertical > .btn-group:after { - display: table; - content: " "; -} - -.btn-group-vertical > .btn-group:after { - clear: both; -} - .btn-group-vertical > .btn-group > .btn { float: none; } - .btn-group-vertical > .btn + .btn, .btn-group-vertical > .btn + .btn-group, .btn-group-vertical > .btn-group + .btn, @@ -3569,96 +3467,97 @@ input[type="button"].btn-block { margin-top: -1px; margin-left: 0; } - .btn-group-vertical > .btn:not(:first-child):not(:last-child) { border-radius: 0; } - .btn-group-vertical > .btn:first-child:not(:last-child) { border-top-right-radius: 4px; border-bottom-right-radius: 0; border-bottom-left-radius: 0; } - .btn-group-vertical > .btn:last-child:not(:first-child) { + border-top-left-radius: 0; border-top-right-radius: 0; border-bottom-left-radius: 4px; - border-top-left-radius: 0; } - .btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn { border-radius: 0; } - -.btn-group-vertical > .btn-group:first-child > .btn:last-child, -.btn-group-vertical > .btn-group:first-child > .dropdown-toggle { +.btn-group-vertical > .btn-group:first-child:not(:last-child) > .btn:last-child, +.btn-group-vertical > .btn-group:first-child:not(:last-child) > .dropdown-toggle { border-bottom-right-radius: 0; border-bottom-left-radius: 0; } - -.btn-group-vertical > .btn-group:last-child > .btn:first-child { - border-top-right-radius: 0; +.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child { border-top-left-radius: 0; + border-top-right-radius: 0; } - .btn-group-justified { display: table; width: 100%; - border-collapse: separate; table-layout: fixed; + border-collapse: separate; } - -.btn-group-justified .btn { +.btn-group-justified > .btn, +.btn-group-justified > .btn-group { display: table-cell; float: none; width: 1%; } - -[data-toggle="buttons"] > .btn > input[type="radio"], -[data-toggle="buttons"] > .btn > input[type="checkbox"] { - display: none; +.btn-group-justified > .btn-group .btn { + width: 100%; +} +.btn-group-justified > .btn-group .dropdown-menu { + left: auto; +} +[data-toggle="buttons"] > .btn input[type="radio"], +[data-toggle="buttons"] > .btn-group > .btn input[type="radio"], +[data-toggle="buttons"] > .btn input[type="checkbox"], +[data-toggle="buttons"] > .btn-group > .btn input[type="checkbox"] { + position: absolute; + clip: rect(0, 0, 0, 0); + pointer-events: none; } - .input-group { position: relative; display: table; border-collapse: separate; } - -.input-group.col { +.input-group[class*="col-"] { float: none; padding-right: 0; padding-left: 0; } - .input-group .form-control { + position: relative; + z-index: 2; + float: left; width: 100%; margin-bottom: 0; } - .input-group-lg > .form-control, .input-group-lg > .input-group-addon, .input-group-lg > .input-group-btn > .btn { - height: 45px; + height: 46px; padding: 10px 16px; font-size: 18px; line-height: 1.33; border-radius: 6px; } - select.input-group-lg > .form-control, select.input-group-lg > .input-group-addon, select.input-group-lg > .input-group-btn > .btn { - height: 45px; - line-height: 45px; + height: 46px; + line-height: 46px; } - textarea.input-group-lg > .form-control, textarea.input-group-lg > .input-group-addon, -textarea.input-group-lg > .input-group-btn > .btn { +textarea.input-group-lg > .input-group-btn > .btn, +select[multiple].input-group-lg > .form-control, +select[multiple].input-group-lg > .input-group-addon, +select[multiple].input-group-lg > .input-group-btn > .btn { height: auto; } - .input-group-sm > .form-control, .input-group-sm > .input-group-addon, .input-group-sm > .input-group-btn > .btn { @@ -3668,536 +3567,434 @@ textarea.input-group-lg > .input-group-btn > .btn { line-height: 1.5; border-radius: 3px; } - select.input-group-sm > .form-control, select.input-group-sm > .input-group-addon, select.input-group-sm > .input-group-btn > .btn { height: 30px; line-height: 30px; } - textarea.input-group-sm > .form-control, textarea.input-group-sm > .input-group-addon, -textarea.input-group-sm > .input-group-btn > .btn { +textarea.input-group-sm > .input-group-btn > .btn, +select[multiple].input-group-sm > .form-control, +select[multiple].input-group-sm > .input-group-addon, +select[multiple].input-group-sm > .input-group-btn > .btn { height: auto; } - .input-group-addon, .input-group-btn, .input-group .form-control { display: table-cell; } - .input-group-addon:not(:first-child):not(:last-child), .input-group-btn:not(:first-child):not(:last-child), .input-group .form-control:not(:first-child):not(:last-child) { border-radius: 0; } - .input-group-addon, .input-group-btn { width: 1%; white-space: nowrap; vertical-align: middle; } - .input-group-addon { padding: 6px 12px; font-size: 14px; font-weight: normal; line-height: 1; + color: #555; text-align: center; - background-color: #eeeeee; - border: 1px solid #cccccc; + background-color: #eee; + border: 1px solid #ccc; border-radius: 4px; } - .input-group-addon.input-sm { padding: 5px 10px; font-size: 12px; border-radius: 3px; } - .input-group-addon.input-lg { padding: 10px 16px; font-size: 18px; border-radius: 6px; } - .input-group-addon input[type="radio"], .input-group-addon input[type="checkbox"] { margin-top: 0; } - .input-group .form-control:first-child, .input-group-addon:first-child, .input-group-btn:first-child > .btn, +.input-group-btn:first-child > .btn-group > .btn, .input-group-btn:first-child > .dropdown-toggle, -.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle) { +.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle), +.input-group-btn:last-child > .btn-group:not(:last-child) > .btn { border-top-right-radius: 0; border-bottom-right-radius: 0; } - .input-group-addon:first-child { border-right: 0; } - .input-group .form-control:last-child, .input-group-addon:last-child, .input-group-btn:last-child > .btn, +.input-group-btn:last-child > .btn-group > .btn, .input-group-btn:last-child > .dropdown-toggle, -.input-group-btn:first-child > .btn:not(:first-child) { - border-bottom-left-radius: 0; +.input-group-btn:first-child > .btn:not(:first-child), +.input-group-btn:first-child > .btn-group:not(:first-child) > .btn { border-top-left-radius: 0; + border-bottom-left-radius: 0; } - .input-group-addon:last-child { border-left: 0; } - .input-group-btn { position: relative; + font-size: 0; white-space: nowrap; } - .input-group-btn > .btn { position: relative; } - .input-group-btn > .btn + .btn { - margin-left: -4px; + margin-left: -1px; } - .input-group-btn > .btn:hover, +.input-group-btn > .btn:focus, .input-group-btn > .btn:active { z-index: 2; } - +.input-group-btn:first-child > .btn, +.input-group-btn:first-child > .btn-group { + margin-right: -1px; +} +.input-group-btn:last-child > .btn, +.input-group-btn:last-child > .btn-group { + margin-left: -1px; +} .nav { padding-left: 0; margin-bottom: 0; list-style: none; } - -.nav:before, -.nav:after { - display: table; - content: " "; -} - -.nav:after { - clear: both; -} - -.nav:before, -.nav:after { - display: table; - content: " "; -} - -.nav:after { - clear: both; -} - .nav > li { position: relative; display: block; } - .nav > li > a { position: relative; display: block; padding: 10px 15px; } - .nav > li > a:hover, .nav > li > a:focus { text-decoration: none; - background-color: #eeeeee; + background-color: #eee; } - .nav > li.disabled > a { - color: #999999; + color: #777; } - .nav > li.disabled > a:hover, .nav > li.disabled > a:focus { - color: #999999; + color: #777; text-decoration: none; cursor: not-allowed; background-color: transparent; } - .nav .open > a, .nav .open > a:hover, .nav .open > a:focus { - background-color: #eeeeee; + background-color: #eee; border-color: #428bca; } - .nav .nav-divider { height: 1px; margin: 9px 0; overflow: hidden; background-color: #e5e5e5; } - .nav > li > a > img { max-width: none; } - .nav-tabs { - border-bottom: 1px solid #dddddd; + border-bottom: 1px solid #ddd; } - .nav-tabs > li { float: left; margin-bottom: -1px; } - .nav-tabs > li > a { margin-right: 2px; - line-height: 1.428571429; + line-height: 1.42857143; border: 1px solid transparent; border-radius: 4px 4px 0 0; } - .nav-tabs > li > a:hover { - border-color: #eeeeee #eeeeee #dddddd; + border-color: #eee #eee #ddd; } - .nav-tabs > li.active > a, .nav-tabs > li.active > a:hover, .nav-tabs > li.active > a:focus { - color: #555555; + color: #555; cursor: default; - background-color: #ffffff; - border: 1px solid #dddddd; + background-color: #fff; + border: 1px solid #ddd; border-bottom-color: transparent; } - .nav-tabs.nav-justified { width: 100%; border-bottom: 0; } - .nav-tabs.nav-justified > li { float: none; } - .nav-tabs.nav-justified > li > a { + margin-bottom: 5px; text-align: center; } - +.nav-tabs.nav-justified > .dropdown .dropdown-menu { + top: auto; + left: auto; +} @media (min-width: 768px) { .nav-tabs.nav-justified > li { display: table-cell; width: 1%; } + .nav-tabs.nav-justified > li > a { + margin-bottom: 0; + } } - .nav-tabs.nav-justified > li > a { margin-right: 0; - border-bottom: 1px solid #dddddd; + border-radius: 4px; } - -.nav-tabs.nav-justified > .active > a { - border-bottom-color: #ffffff; +.nav-tabs.nav-justified > .active > a, +.nav-tabs.nav-justified > .active > a:hover, +.nav-tabs.nav-justified > .active > a:focus { + border: 1px solid #ddd; +} +@media (min-width: 768px) { + .nav-tabs.nav-justified > li > a { + border-bottom: 1px solid #ddd; + border-radius: 4px 4px 0 0; + } + .nav-tabs.nav-justified > .active > a, + .nav-tabs.nav-justified > .active > a:hover, + .nav-tabs.nav-justified > .active > a:focus { + border-bottom-color: #fff; + } } - .nav-pills > li { float: left; } - .nav-pills > li > a { - border-radius: 5px; + border-radius: 4px; } - .nav-pills > li + li { margin-left: 2px; } - .nav-pills > li.active > a, .nav-pills > li.active > a:hover, .nav-pills > li.active > a:focus { - color: #ffffff; + color: #fff; background-color: #428bca; } - .nav-stacked > li { float: none; } - .nav-stacked > li + li { margin-top: 2px; margin-left: 0; } - .nav-justified { width: 100%; } - .nav-justified > li { float: none; } - .nav-justified > li > a { + margin-bottom: 5px; text-align: center; } - +.nav-justified > .dropdown .dropdown-menu { + top: auto; + left: auto; +} @media (min-width: 768px) { .nav-justified > li { display: table-cell; width: 1%; } + .nav-justified > li > a { + margin-bottom: 0; + } } - .nav-tabs-justified { border-bottom: 0; } - .nav-tabs-justified > li > a { margin-right: 0; - border-bottom: 1px solid #dddddd; -} - -.nav-tabs-justified > .active > a { - border-bottom-color: #ffffff; -} - -.tabbable:before, -.tabbable:after { - display: table; - content: " "; -} - -.tabbable:after { - clear: both; + border-radius: 4px; } - -.tabbable:before, -.tabbable:after { - display: table; - content: " "; +.nav-tabs-justified > .active > a, +.nav-tabs-justified > .active > a:hover, +.nav-tabs-justified > .active > a:focus { + border: 1px solid #ddd; } - -.tabbable:after { - clear: both; +@media (min-width: 768px) { + .nav-tabs-justified > li > a { + border-bottom: 1px solid #ddd; + border-radius: 4px 4px 0 0; + } + .nav-tabs-justified > .active > a, + .nav-tabs-justified > .active > a:hover, + .nav-tabs-justified > .active > a:focus { + border-bottom-color: #fff; + } } - -.tab-content > .tab-pane, -.pill-content > .pill-pane { +.tab-content > .tab-pane { display: none; + visibility: hidden; } - -.tab-content > .active, -.pill-content > .active { +.tab-content > .active { display: block; + visibility: visible; } - -.nav .caret { - border-top-color: #428bca; - border-bottom-color: #428bca; -} - -.nav a:hover .caret { - border-top-color: #2a6496; - border-bottom-color: #2a6496; -} - .nav-tabs .dropdown-menu { margin-top: -1px; - border-top-right-radius: 0; border-top-left-radius: 0; + border-top-right-radius: 0; } - .navbar { position: relative; - z-index: 1000; min-height: 50px; margin-bottom: 20px; border: 1px solid transparent; } - -.navbar:before, -.navbar:after { - display: table; - content: " "; -} - -.navbar:after { - clear: both; -} - -.navbar:before, -.navbar:after { - display: table; - content: " "; -} - -.navbar:after { - clear: both; -} - @media (min-width: 768px) { .navbar { border-radius: 4px; } } - -.navbar-header:before, -.navbar-header:after { - display: table; - content: " "; -} - -.navbar-header:after { - clear: both; -} - -.navbar-header:before, -.navbar-header:after { - display: table; - content: " "; -} - -.navbar-header:after { - clear: both; -} - @media (min-width: 768px) { .navbar-header { float: left; } } - .navbar-collapse { - max-height: 340px; padding-right: 15px; padding-left: 15px; overflow-x: visible; - border-top: 1px solid transparent; - box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1); -webkit-overflow-scrolling: touch; + border-top: 1px solid transparent; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1); } - -.navbar-collapse:before, -.navbar-collapse:after { - display: table; - content: " "; -} - -.navbar-collapse:after { - clear: both; -} - -.navbar-collapse:before, -.navbar-collapse:after { - display: table; - content: " "; -} - -.navbar-collapse:after { - clear: both; -} - .navbar-collapse.in { overflow-y: auto; } - @media (min-width: 768px) { .navbar-collapse { width: auto; border-top: 0; - box-shadow: none; + -webkit-box-shadow: none; + box-shadow: none; } .navbar-collapse.collapse { display: block !important; height: auto !important; padding-bottom: 0; overflow: visible !important; + visibility: visible !important; } .navbar-collapse.in { overflow-y: visible; } - .navbar-collapse .navbar-nav.navbar-left:first-child { - margin-left: -15px; - } - .navbar-collapse .navbar-nav.navbar-right:last-child { - margin-right: -15px; + .navbar-fixed-top .navbar-collapse, + .navbar-static-top .navbar-collapse, + .navbar-fixed-bottom .navbar-collapse { + padding-right: 0; + padding-left: 0; } - .navbar-collapse .navbar-text:last-child { - margin-right: 0; +} +.navbar-fixed-top .navbar-collapse, +.navbar-fixed-bottom .navbar-collapse { + max-height: 340px; +} +@media (max-device-width: 480px) and (orientation: landscape) { + .navbar-fixed-top .navbar-collapse, + .navbar-fixed-bottom .navbar-collapse { + max-height: 200px; } } - .container > .navbar-header, -.container > .navbar-collapse { +.container-fluid > .navbar-header, +.container > .navbar-collapse, +.container-fluid > .navbar-collapse { margin-right: -15px; margin-left: -15px; } - @media (min-width: 768px) { .container > .navbar-header, - .container > .navbar-collapse { + .container-fluid > .navbar-header, + .container > .navbar-collapse, + .container-fluid > .navbar-collapse { margin-right: 0; margin-left: 0; } } - .navbar-static-top { + z-index: 1000; border-width: 0 0 1px; } - @media (min-width: 768px) { .navbar-static-top { border-radius: 0; } } - .navbar-fixed-top, .navbar-fixed-bottom { position: fixed; right: 0; left: 0; - border-width: 0 0 1px; + z-index: 1030; } - @media (min-width: 768px) { .navbar-fixed-top, .navbar-fixed-bottom { border-radius: 0; } } - .navbar-fixed-top { top: 0; - z-index: 1030; + border-width: 0 0 1px; } - .navbar-fixed-bottom { bottom: 0; margin-bottom: 0; + border-width: 1px 0 0; } - .navbar-brand { float: left; + height: 50px; padding: 15px 15px; font-size: 18px; line-height: 20px; } - .navbar-brand:hover, .navbar-brand:focus { text-decoration: none; } - +.navbar-brand > img { + display: block; +} @media (min-width: 768px) { - .navbar > .container .navbar-brand { + .navbar > .container .navbar-brand, + .navbar > .container-fluid .navbar-brand { margin-left: -15px; } } - .navbar-toggle { position: relative; float: right; @@ -4206,37 +4003,35 @@ textarea.input-group-sm > .input-group-btn > .btn { margin-right: 15px; margin-bottom: 8px; background-color: transparent; + background-image: none; border: 1px solid transparent; border-radius: 4px; } - +.navbar-toggle:focus { + outline: 0; +} .navbar-toggle .icon-bar { display: block; width: 22px; height: 2px; border-radius: 1px; } - .navbar-toggle .icon-bar + .icon-bar { margin-top: 4px; } - @media (min-width: 768px) { .navbar-toggle { display: none; } } - .navbar-nav { margin: 7.5px -15px; } - .navbar-nav > li > a { padding-top: 10px; padding-bottom: 10px; line-height: 20px; } - @media (max-width: 767px) { .navbar-nav .open .dropdown-menu { position: static; @@ -4245,7 +4040,8 @@ textarea.input-group-sm > .input-group-btn > .btn { margin-top: 0; background-color: transparent; border: 0; - box-shadow: none; + -webkit-box-shadow: none; + box-shadow: none; } .navbar-nav .open .dropdown-menu > li > a, .navbar-nav .open .dropdown-menu .dropdown-header { @@ -4259,7 +4055,6 @@ textarea.input-group-sm > .input-group-btn > .btn { background-image: none; } } - @media (min-width: 768px) { .navbar-nav { float: left; @@ -4273,16 +4068,6 @@ textarea.input-group-sm > .input-group-btn > .btn { padding-bottom: 15px; } } - -@media (min-width: 768px) { - .navbar-left { - float: left !important; - } - .navbar-right { - float: right !important; - } -} - .navbar-form { padding: 10px 15px; margin-top: 8px; @@ -4291,10 +4076,9 @@ textarea.input-group-sm > .input-group-btn > .btn { margin-left: -15px; border-top: 1px solid transparent; border-bottom: 1px solid transparent; - -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); - box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1), 0 1px 0 rgba(255, 255, 255, .1); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1), 0 1px 0 rgba(255, 255, 255, .1); } - @media (min-width: 768px) { .navbar-form .form-group { display: inline-block; @@ -4303,27 +4087,56 @@ textarea.input-group-sm > .input-group-btn > .btn { } .navbar-form .form-control { display: inline-block; + width: auto; + vertical-align: middle; + } + .navbar-form .form-control-static { + display: inline-block; + } + .navbar-form .input-group { + display: inline-table; + vertical-align: middle; + } + .navbar-form .input-group .input-group-addon, + .navbar-form .input-group .input-group-btn, + .navbar-form .input-group .form-control { + width: auto; + } + .navbar-form .input-group > .form-control { + width: 100%; + } + .navbar-form .control-label { + margin-bottom: 0; + vertical-align: middle; } .navbar-form .radio, .navbar-form .checkbox { display: inline-block; - padding-left: 0; margin-top: 0; margin-bottom: 0; + vertical-align: middle; + } + .navbar-form .radio label, + .navbar-form .checkbox label { + padding-left: 0; } .navbar-form .radio input[type="radio"], .navbar-form .checkbox input[type="checkbox"] { - float: none; + position: relative; margin-left: 0; } + .navbar-form .has-feedback .form-control-feedback { + top: 0; + } } - @media (max-width: 767px) { .navbar-form .form-group { margin-bottom: 5px; } + .navbar-form .form-group:last-child { + margin-bottom: 0; + } } - @media (min-width: 768px) { .navbar-form { width: auto; @@ -4336,278 +4149,248 @@ textarea.input-group-sm > .input-group-btn > .btn { box-shadow: none; } } - .navbar-nav > li > .dropdown-menu { margin-top: 0; - border-top-right-radius: 0; border-top-left-radius: 0; + border-top-right-radius: 0; } - .navbar-fixed-bottom .navbar-nav > li > .dropdown-menu { border-bottom-right-radius: 0; border-bottom-left-radius: 0; } - -.navbar-nav.pull-right > li > .dropdown-menu, -.navbar-nav > li > .dropdown-menu.pull-right { - right: 0; - left: auto; -} - .navbar-btn { margin-top: 8px; margin-bottom: 8px; } - +.navbar-btn.btn-sm { + margin-top: 10px; + margin-bottom: 10px; +} +.navbar-btn.btn-xs { + margin-top: 14px; + margin-bottom: 14px; +} .navbar-text { - float: left; margin-top: 15px; margin-bottom: 15px; } - @media (min-width: 768px) { .navbar-text { + float: left; margin-right: 15px; margin-left: 15px; } } - +@media (min-width: 768px) { + .navbar-left { + float: left !important; + } + .navbar-right { + float: right !important; + margin-right: -15px; + } + .navbar-right ~ .navbar-right { + margin-right: 0; + } +} .navbar-default { background-color: #f8f8f8; border-color: #e7e7e7; } - .navbar-default .navbar-brand { - color: #777777; + color: #777; } - .navbar-default .navbar-brand:hover, .navbar-default .navbar-brand:focus { color: #5e5e5e; background-color: transparent; } - .navbar-default .navbar-text { - color: #777777; + color: #777; } - .navbar-default .navbar-nav > li > a { - color: #777777; + color: #777; } - .navbar-default .navbar-nav > li > a:hover, .navbar-default .navbar-nav > li > a:focus { - color: #333333; + color: #333; background-color: transparent; } - .navbar-default .navbar-nav > .active > a, .navbar-default .navbar-nav > .active > a:hover, .navbar-default .navbar-nav > .active > a:focus { - color: #555555; + color: #555; background-color: #e7e7e7; } - .navbar-default .navbar-nav > .disabled > a, .navbar-default .navbar-nav > .disabled > a:hover, .navbar-default .navbar-nav > .disabled > a:focus { - color: #cccccc; + color: #ccc; background-color: transparent; } - .navbar-default .navbar-toggle { - border-color: #dddddd; + border-color: #ddd; } - .navbar-default .navbar-toggle:hover, .navbar-default .navbar-toggle:focus { - background-color: #dddddd; + background-color: #ddd; } - .navbar-default .navbar-toggle .icon-bar { - background-color: #cccccc; + background-color: #888; } - .navbar-default .navbar-collapse, .navbar-default .navbar-form { - border-color: #e6e6e6; -} - -.navbar-default .navbar-nav > .dropdown > a:hover .caret, -.navbar-default .navbar-nav > .dropdown > a:focus .caret { - border-top-color: #333333; - border-bottom-color: #333333; + border-color: #e7e7e7; } - .navbar-default .navbar-nav > .open > a, .navbar-default .navbar-nav > .open > a:hover, .navbar-default .navbar-nav > .open > a:focus { - color: #555555; + color: #555; background-color: #e7e7e7; } - -.navbar-default .navbar-nav > .open > a .caret, -.navbar-default .navbar-nav > .open > a:hover .caret, -.navbar-default .navbar-nav > .open > a:focus .caret { - border-top-color: #555555; - border-bottom-color: #555555; -} - -.navbar-default .navbar-nav > .dropdown > a .caret { - border-top-color: #777777; - border-bottom-color: #777777; -} - @media (max-width: 767px) { .navbar-default .navbar-nav .open .dropdown-menu > li > a { - color: #777777; + color: #777; } .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover, .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus { - color: #333333; + color: #333; background-color: transparent; } .navbar-default .navbar-nav .open .dropdown-menu > .active > a, .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover, .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus { - color: #555555; + color: #555; background-color: #e7e7e7; } .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a, .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover, .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus { - color: #cccccc; + color: #ccc; background-color: transparent; } } - .navbar-default .navbar-link { - color: #777777; + color: #777; } - .navbar-default .navbar-link:hover { - color: #333333; + color: #333; +} +.navbar-default .btn-link { + color: #777; +} +.navbar-default .btn-link:hover, +.navbar-default .btn-link:focus { + color: #333; +} +.navbar-default .btn-link[disabled]:hover, +fieldset[disabled] .navbar-default .btn-link:hover, +.navbar-default .btn-link[disabled]:focus, +fieldset[disabled] .navbar-default .btn-link:focus { + color: #ccc; } - .navbar-inverse { - background-color: #222222; + background-color: #222; border-color: #080808; } - .navbar-inverse .navbar-brand { - color: #999999; + color: #9d9d9d; } - .navbar-inverse .navbar-brand:hover, .navbar-inverse .navbar-brand:focus { - color: #ffffff; + color: #fff; background-color: transparent; } - .navbar-inverse .navbar-text { - color: #999999; + color: #9d9d9d; } - .navbar-inverse .navbar-nav > li > a { - color: #999999; + color: #9d9d9d; } - .navbar-inverse .navbar-nav > li > a:hover, .navbar-inverse .navbar-nav > li > a:focus { - color: #ffffff; + color: #fff; background-color: transparent; } - .navbar-inverse .navbar-nav > .active > a, .navbar-inverse .navbar-nav > .active > a:hover, .navbar-inverse .navbar-nav > .active > a:focus { - color: #ffffff; + color: #fff; background-color: #080808; } - .navbar-inverse .navbar-nav > .disabled > a, .navbar-inverse .navbar-nav > .disabled > a:hover, .navbar-inverse .navbar-nav > .disabled > a:focus { - color: #444444; + color: #444; background-color: transparent; } - .navbar-inverse .navbar-toggle { - border-color: #333333; + border-color: #333; } - .navbar-inverse .navbar-toggle:hover, .navbar-inverse .navbar-toggle:focus { - background-color: #333333; + background-color: #333; } - .navbar-inverse .navbar-toggle .icon-bar { - background-color: #ffffff; + background-color: #fff; } - .navbar-inverse .navbar-collapse, .navbar-inverse .navbar-form { border-color: #101010; } - .navbar-inverse .navbar-nav > .open > a, .navbar-inverse .navbar-nav > .open > a:hover, .navbar-inverse .navbar-nav > .open > a:focus { - color: #ffffff; + color: #fff; background-color: #080808; } - -.navbar-inverse .navbar-nav > .dropdown > a:hover .caret { - border-top-color: #ffffff; - border-bottom-color: #ffffff; -} - -.navbar-inverse .navbar-nav > .dropdown > a .caret { - border-top-color: #999999; - border-bottom-color: #999999; -} - -.navbar-inverse .navbar-nav > .open > a .caret, -.navbar-inverse .navbar-nav > .open > a:hover .caret, -.navbar-inverse .navbar-nav > .open > a:focus .caret { - border-top-color: #ffffff; - border-bottom-color: #ffffff; -} - @media (max-width: 767px) { .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header { border-color: #080808; } + .navbar-inverse .navbar-nav .open .dropdown-menu .divider { + background-color: #080808; + } .navbar-inverse .navbar-nav .open .dropdown-menu > li > a { - color: #999999; + color: #9d9d9d; } .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover, .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus { - color: #ffffff; + color: #fff; background-color: transparent; } .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a, .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover, .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus { - color: #ffffff; + color: #fff; background-color: #080808; } .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a, .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover, .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus { - color: #444444; + color: #444; background-color: transparent; } } - .navbar-inverse .navbar-link { - color: #999999; + color: #9d9d9d; } - .navbar-inverse .navbar-link:hover { - color: #ffffff; + color: #fff; +} +.navbar-inverse .btn-link { + color: #9d9d9d; +} +.navbar-inverse .btn-link:hover, +.navbar-inverse .btn-link:focus { + color: #fff; +} +.navbar-inverse .btn-link[disabled]:hover, +fieldset[disabled] .navbar-inverse .btn-link:hover, +.navbar-inverse .btn-link[disabled]:focus, +fieldset[disabled] .navbar-inverse .btn-link:focus { + color: #444; } - .breadcrumb { padding: 8px 15px; margin-bottom: 20px; @@ -4615,64 +4398,57 @@ textarea.input-group-sm > .input-group-btn > .btn { background-color: #f5f5f5; border-radius: 4px; } - .breadcrumb > li { display: inline-block; } - .breadcrumb > li + li:before { padding: 0 5px; - color: #cccccc; + color: #ccc; content: "/\00a0"; } - .breadcrumb > .active { - color: #999999; + color: #777; } - .pagination { display: inline-block; padding-left: 0; margin: 20px 0; border-radius: 4px; } - .pagination > li { display: inline; } - .pagination > li > a, .pagination > li > span { position: relative; float: left; padding: 6px 12px; margin-left: -1px; - line-height: 1.428571429; + line-height: 1.42857143; + color: #428bca; text-decoration: none; - background-color: #ffffff; - border: 1px solid #dddddd; + background-color: #fff; + border: 1px solid #ddd; } - .pagination > li:first-child > a, .pagination > li:first-child > span { margin-left: 0; - border-bottom-left-radius: 4px; border-top-left-radius: 4px; + border-bottom-left-radius: 4px; } - .pagination > li:last-child > a, .pagination > li:last-child > span { border-top-right-radius: 4px; border-bottom-right-radius: 4px; } - .pagination > li > a:hover, .pagination > li > span:hover, .pagination > li > a:focus, .pagination > li > span:focus { - background-color: #eeeeee; + color: #2a6496; + background-color: #eee; + border-color: #ddd; } - .pagination > .active > a, .pagination > .active > span, .pagination > .active > a:hover, @@ -4680,201 +4456,157 @@ textarea.input-group-sm > .input-group-btn > .btn { .pagination > .active > a:focus, .pagination > .active > span:focus { z-index: 2; - color: #ffffff; + color: #fff; cursor: default; background-color: #428bca; border-color: #428bca; } - .pagination > .disabled > span, +.pagination > .disabled > span:hover, +.pagination > .disabled > span:focus, .pagination > .disabled > a, .pagination > .disabled > a:hover, .pagination > .disabled > a:focus { - color: #999999; + color: #777; cursor: not-allowed; - background-color: #ffffff; - border-color: #dddddd; + background-color: #fff; + border-color: #ddd; } - .pagination-lg > li > a, .pagination-lg > li > span { padding: 10px 16px; font-size: 18px; } - .pagination-lg > li:first-child > a, .pagination-lg > li:first-child > span { - border-bottom-left-radius: 6px; border-top-left-radius: 6px; + border-bottom-left-radius: 6px; } - .pagination-lg > li:last-child > a, .pagination-lg > li:last-child > span { border-top-right-radius: 6px; border-bottom-right-radius: 6px; } - .pagination-sm > li > a, .pagination-sm > li > span { padding: 5px 10px; font-size: 12px; } - .pagination-sm > li:first-child > a, .pagination-sm > li:first-child > span { - border-bottom-left-radius: 3px; border-top-left-radius: 3px; + border-bottom-left-radius: 3px; } - .pagination-sm > li:last-child > a, .pagination-sm > li:last-child > span { border-top-right-radius: 3px; border-bottom-right-radius: 3px; } - .pager { padding-left: 0; margin: 20px 0; text-align: center; list-style: none; } - -.pager:before, -.pager:after { - display: table; - content: " "; -} - -.pager:after { - clear: both; -} - -.pager:before, -.pager:after { - display: table; - content: " "; -} - -.pager:after { - clear: both; -} - .pager li { display: inline; } - .pager li > a, .pager li > span { display: inline-block; padding: 5px 14px; - background-color: #ffffff; - border: 1px solid #dddddd; + background-color: #fff; + border: 1px solid #ddd; border-radius: 15px; } - .pager li > a:hover, .pager li > a:focus { text-decoration: none; - background-color: #eeeeee; + background-color: #eee; } - .pager .next > a, .pager .next > span { float: right; } - .pager .previous > a, .pager .previous > span { float: left; } - .pager .disabled > a, .pager .disabled > a:hover, .pager .disabled > a:focus, .pager .disabled > span { - color: #999999; + color: #777; cursor: not-allowed; - background-color: #ffffff; + background-color: #fff; } - .label { display: inline; padding: .2em .6em .3em; font-size: 75%; font-weight: bold; line-height: 1; - color: #ffffff; + color: #fff; text-align: center; white-space: nowrap; vertical-align: baseline; border-radius: .25em; } - -.label[href]:hover, -.label[href]:focus { - color: #ffffff; +a.label:hover, +a.label:focus { + color: #fff; text-decoration: none; cursor: pointer; } - .label:empty { display: none; } - +.btn .label { + position: relative; + top: -1px; +} .label-default { - background-color: #999999; + background-color: #777; } - .label-default[href]:hover, .label-default[href]:focus { - background-color: #808080; + background-color: #5e5e5e; } - .label-primary { background-color: #428bca; } - .label-primary[href]:hover, .label-primary[href]:focus { background-color: #3071a9; } - .label-success { background-color: #5cb85c; } - .label-success[href]:hover, .label-success[href]:focus { background-color: #449d44; } - .label-info { background-color: #5bc0de; } - .label-info[href]:hover, .label-info[href]:focus { background-color: #31b0d5; } - .label-warning { background-color: #f0ad4e; } - .label-warning[href]:hover, .label-warning[href]:focus { background-color: #ec971f; } - .label-danger { background-color: #d9534f; } - .label-danger[href]:hover, .label-danger[href]:focus { background-color: #c9302c; } - .badge { display: inline-block; min-width: 10px; @@ -4882,204 +4614,177 @@ textarea.input-group-sm > .input-group-btn > .btn { font-size: 12px; font-weight: bold; line-height: 1; - color: #ffffff; + color: #fff; text-align: center; white-space: nowrap; vertical-align: baseline; - background-color: #999999; + background-color: #777; border-radius: 10px; } - .badge:empty { display: none; } - +.btn .badge { + position: relative; + top: -1px; +} +.btn-xs .badge { + top: 0; + padding: 1px 5px; +} a.badge:hover, a.badge:focus { - color: #ffffff; + color: #fff; text-decoration: none; cursor: pointer; } - -.btn .badge { - position: relative; - top: -1px; -} - a.list-group-item.active > .badge, .nav-pills > .active > a > .badge { color: #428bca; - background-color: #ffffff; + background-color: #fff; } - .nav-pills > li > a > .badge { margin-left: 3px; } - .jumbotron { - padding: 30px; + padding: 30px 15px; margin-bottom: 30px; - font-size: 21px; - font-weight: 200; - line-height: 2.1428571435; color: inherit; - background-color: #eeeeee; + background-color: #eee; } - -.jumbotron h1 { - line-height: 1; +.jumbotron h1, +.jumbotron .h1 { color: inherit; } - .jumbotron p { - line-height: 1.4; + margin-bottom: 15px; + font-size: 21px; + font-weight: 200; } - -.container .jumbotron { +.jumbotron > hr { + border-top-color: #d5d5d5; +} +.container .jumbotron, +.container-fluid .jumbotron { border-radius: 6px; } - +.jumbotron .container { + max-width: 100%; +} @media screen and (min-width: 768px) { .jumbotron { - padding-top: 48px; - padding-bottom: 48px; + padding: 48px 0; } .container .jumbotron { padding-right: 60px; padding-left: 60px; } - .jumbotron h1 { + .jumbotron h1, + .jumbotron .h1 { font-size: 63px; } } - .thumbnail { - display: inline-block; display: block; - height: auto; - max-width: 100%; padding: 4px; - line-height: 1.428571429; - background-color: #ffffff; - border: 1px solid #dddddd; + margin-bottom: 20px; + line-height: 1.42857143; + background-color: #fff; + border: 1px solid #ddd; border-radius: 4px; - -webkit-transition: all 0.2s ease-in-out; - transition: all 0.2s ease-in-out; + -webkit-transition: border .2s ease-in-out; + -o-transition: border .2s ease-in-out; + transition: border .2s ease-in-out; } - -.thumbnail > img { - display: block; - height: auto; - max-width: 100%; +.thumbnail > img, +.thumbnail a > img { + margin-right: auto; + margin-left: auto; } - a.thumbnail:hover, -a.thumbnail:focus { +a.thumbnail:focus, +a.thumbnail.active { border-color: #428bca; } - -.thumbnail > img { - margin-right: auto; - margin-left: auto; -} - .thumbnail .caption { padding: 9px; - color: #333333; + color: #333; } - .alert { padding: 15px; margin-bottom: 20px; border: 1px solid transparent; border-radius: 4px; } - .alert h4 { margin-top: 0; color: inherit; } - .alert .alert-link { font-weight: bold; } - .alert > p, .alert > ul { margin-bottom: 0; } - .alert > p + p { margin-top: 5px; } - -.alert-dismissable { +.alert-dismissable, +.alert-dismissible { padding-right: 35px; } - -.alert-dismissable .close { +.alert-dismissable .close, +.alert-dismissible .close { position: relative; top: -2px; right: -21px; color: inherit; } - .alert-success { - color: #468847; + color: #3c763d; background-color: #dff0d8; border-color: #d6e9c6; } - .alert-success hr { border-top-color: #c9e2b3; } - .alert-success .alert-link { - color: #356635; + color: #2b542c; } - .alert-info { - color: #3a87ad; + color: #31708f; background-color: #d9edf7; border-color: #bce8f1; } - .alert-info hr { border-top-color: #a6e1ec; } - .alert-info .alert-link { - color: #2d6987; + color: #245269; } - .alert-warning { - color: #c09853; + color: #8a6d3b; background-color: #fcf8e3; - border-color: #fbeed5; + border-color: #faebcc; } - .alert-warning hr { - border-top-color: #f8e5be; + border-top-color: #f7e1b5; } - .alert-warning .alert-link { - color: #a47e3c; + color: #66512c; } - .alert-danger { - color: #b94a48; + color: #a94442; background-color: #f2dede; - border-color: #eed3d7; + border-color: #ebccd1; } - .alert-danger hr { - border-top-color: #e6c1c7; + border-top-color: #e4b9c0; } - .alert-danger .alert-link { - color: #953b39; + color: #843534; } - @-webkit-keyframes progress-bar-stripes { from { background-position: 40px 0; @@ -5088,8 +4793,7 @@ a.thumbnail:focus { background-position: 0 0; } } - -@-moz-keyframes progress-bar-stripes { +@-o-keyframes progress-bar-stripes { from { background-position: 40px 0; } @@ -5097,16 +4801,6 @@ a.thumbnail:focus { background-position: 0 0; } } - -@-o-keyframes progress-bar-stripes { - from { - background-position: 0 0; - } - to { - background-position: 40px 0; - } -} - @keyframes progress-bar-stripes { from { background-position: 40px 0; @@ -5115,426 +4809,647 @@ a.thumbnail:focus { background-position: 0 0; } } - .progress { height: 20px; margin-bottom: 20px; overflow: hidden; background-color: #f5f5f5; border-radius: 4px; - -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); - box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); + -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, .1); + box-shadow: inset 0 1px 2px rgba(0, 0, 0, .1); } - .progress-bar { float: left; width: 0; height: 100%; font-size: 12px; - color: #ffffff; + line-height: 20px; + color: #fff; text-align: center; background-color: #428bca; - -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); - box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); - -webkit-transition: width 0.6s ease; - transition: width 0.6s ease; -} - -.progress-striped .progress-bar { - background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-size: 40px 40px; -} - -.progress.active .progress-bar { + -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .15); + box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .15); + -webkit-transition: width .6s ease; + -o-transition: width .6s ease; + transition: width .6s ease; +} +.progress-striped .progress-bar, +.progress-bar-striped { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + -webkit-background-size: 40px 40px; + background-size: 40px 40px; +} +.progress.active .progress-bar, +.progress-bar.active { -webkit-animation: progress-bar-stripes 2s linear infinite; - -moz-animation: progress-bar-stripes 2s linear infinite; - -ms-animation: progress-bar-stripes 2s linear infinite; -o-animation: progress-bar-stripes 2s linear infinite; animation: progress-bar-stripes 2s linear infinite; } - .progress-bar-success { background-color: #5cb85c; } - .progress-striped .progress-bar-success { - background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); } - .progress-bar-info { background-color: #5bc0de; } - .progress-striped .progress-bar-info { - background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); } - .progress-bar-warning { background-color: #f0ad4e; } - .progress-striped .progress-bar-warning { - background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); } - .progress-bar-danger { background-color: #d9534f; } - .progress-striped .progress-bar-danger { - background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); -} - -.media, -.media-body { - overflow: hidden; - zoom: 1; + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); } - -.media, -.media .media { +.media { margin-top: 15px; } - .media:first-child { margin-top: 0; } - -.media-object { - display: block; -} - -.media-heading { - margin: 0 0 5px; +.media-right, +.media > .pull-right { + padding-left: 10px; } - +.media-left, .media > .pull-left { - margin-right: 10px; + padding-right: 10px; } - -.media > .pull-right { - margin-left: 10px; +.media-left, +.media-right, +.media-body { + display: table-cell; + vertical-align: top; +} +.media-middle { + vertical-align: middle; +} +.media-bottom { + vertical-align: bottom; +} +.media-heading { + margin-top: 0; + margin-bottom: 5px; } - .media-list { padding-left: 0; list-style: none; } - .list-group { padding-left: 0; margin-bottom: 20px; } - .list-group-item { position: relative; display: block; padding: 10px 15px; margin-bottom: -1px; - background-color: #ffffff; - border: 1px solid #dddddd; + background-color: #fff; + border: 1px solid #ddd; } - .list-group-item:first-child { - border-top-right-radius: 4px; border-top-left-radius: 4px; + border-top-right-radius: 4px; } - .list-group-item:last-child { margin-bottom: 0; border-bottom-right-radius: 4px; border-bottom-left-radius: 4px; } - .list-group-item > .badge { float: right; } - .list-group-item > .badge + .badge { margin-right: 5px; } - a.list-group-item { - color: #555555; + color: #555; } - a.list-group-item .list-group-item-heading { - color: #333333; + color: #333; } - a.list-group-item:hover, a.list-group-item:focus { + color: #555; text-decoration: none; background-color: #f5f5f5; } - +.list-group-item.disabled, +.list-group-item.disabled:hover, +.list-group-item.disabled:focus { + color: #777; + cursor: not-allowed; + background-color: #eee; +} +.list-group-item.disabled .list-group-item-heading, +.list-group-item.disabled:hover .list-group-item-heading, +.list-group-item.disabled:focus .list-group-item-heading { + color: inherit; +} +.list-group-item.disabled .list-group-item-text, +.list-group-item.disabled:hover .list-group-item-text, +.list-group-item.disabled:focus .list-group-item-text { + color: #777; +} .list-group-item.active, .list-group-item.active:hover, .list-group-item.active:focus { z-index: 2; - color: #ffffff; + color: #fff; background-color: #428bca; border-color: #428bca; } - .list-group-item.active .list-group-item-heading, .list-group-item.active:hover .list-group-item-heading, -.list-group-item.active:focus .list-group-item-heading { +.list-group-item.active:focus .list-group-item-heading, +.list-group-item.active .list-group-item-heading > small, +.list-group-item.active:hover .list-group-item-heading > small, +.list-group-item.active:focus .list-group-item-heading > small, +.list-group-item.active .list-group-item-heading > .small, +.list-group-item.active:hover .list-group-item-heading > .small, +.list-group-item.active:focus .list-group-item-heading > .small { color: inherit; } - .list-group-item.active .list-group-item-text, .list-group-item.active:hover .list-group-item-text, .list-group-item.active:focus .list-group-item-text { color: #e1edf7; } - +.list-group-item-success { + color: #3c763d; + background-color: #dff0d8; +} +a.list-group-item-success { + color: #3c763d; +} +a.list-group-item-success .list-group-item-heading { + color: inherit; +} +a.list-group-item-success:hover, +a.list-group-item-success:focus { + color: #3c763d; + background-color: #d0e9c6; +} +a.list-group-item-success.active, +a.list-group-item-success.active:hover, +a.list-group-item-success.active:focus { + color: #fff; + background-color: #3c763d; + border-color: #3c763d; +} +.list-group-item-info { + color: #31708f; + background-color: #d9edf7; +} +a.list-group-item-info { + color: #31708f; +} +a.list-group-item-info .list-group-item-heading { + color: inherit; +} +a.list-group-item-info:hover, +a.list-group-item-info:focus { + color: #31708f; + background-color: #c4e3f3; +} +a.list-group-item-info.active, +a.list-group-item-info.active:hover, +a.list-group-item-info.active:focus { + color: #fff; + background-color: #31708f; + border-color: #31708f; +} +.list-group-item-warning { + color: #8a6d3b; + background-color: #fcf8e3; +} +a.list-group-item-warning { + color: #8a6d3b; +} +a.list-group-item-warning .list-group-item-heading { + color: inherit; +} +a.list-group-item-warning:hover, +a.list-group-item-warning:focus { + color: #8a6d3b; + background-color: #faf2cc; +} +a.list-group-item-warning.active, +a.list-group-item-warning.active:hover, +a.list-group-item-warning.active:focus { + color: #fff; + background-color: #8a6d3b; + border-color: #8a6d3b; +} +.list-group-item-danger { + color: #a94442; + background-color: #f2dede; +} +a.list-group-item-danger { + color: #a94442; +} +a.list-group-item-danger .list-group-item-heading { + color: inherit; +} +a.list-group-item-danger:hover, +a.list-group-item-danger:focus { + color: #a94442; + background-color: #ebcccc; +} +a.list-group-item-danger.active, +a.list-group-item-danger.active:hover, +a.list-group-item-danger.active:focus { + color: #fff; + background-color: #a94442; + border-color: #a94442; +} .list-group-item-heading { margin-top: 0; margin-bottom: 5px; } - .list-group-item-text { margin-bottom: 0; line-height: 1.3; } - .panel { margin-bottom: 20px; - background-color: #ffffff; + background-color: #fff; border: 1px solid transparent; border-radius: 4px; - -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05); - box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05); + -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, .05); + box-shadow: 0 1px 1px rgba(0, 0, 0, .05); } - .panel-body { padding: 15px; } - -.panel-body:before, -.panel-body:after { - display: table; - content: " "; +.panel-heading { + padding: 10px 15px; + border-bottom: 1px solid transparent; + border-top-left-radius: 3px; + border-top-right-radius: 3px; } - -.panel-body:after { - clear: both; +.panel-heading > .dropdown .dropdown-toggle { + color: inherit; } - -.panel-body:before, -.panel-body:after { - display: table; - content: " "; +.panel-title { + margin-top: 0; + margin-bottom: 0; + font-size: 16px; + color: inherit; } - -.panel-body:after { - clear: both; +.panel-title > a { + color: inherit; } - -.panel > .list-group { +.panel-footer { + padding: 10px 15px; + background-color: #f5f5f5; + border-top: 1px solid #ddd; + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; +} +.panel > .list-group, +.panel > .panel-collapse > .list-group { margin-bottom: 0; } - -.panel > .list-group .list-group-item { +.panel > .list-group .list-group-item, +.panel > .panel-collapse > .list-group .list-group-item { border-width: 1px 0; + border-radius: 0; } - -.panel > .list-group .list-group-item:first-child { - border-top-right-radius: 0; - border-top-left-radius: 0; +.panel > .list-group:first-child .list-group-item:first-child, +.panel > .panel-collapse > .list-group:first-child .list-group-item:first-child { + border-top: 0; + border-top-left-radius: 3px; + border-top-right-radius: 3px; } - -.panel > .list-group .list-group-item:last-child { +.panel > .list-group:last-child .list-group-item:last-child, +.panel > .panel-collapse > .list-group:last-child .list-group-item:last-child { border-bottom: 0; + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; } - .panel-heading + .list-group .list-group-item:first-child { border-top-width: 0; } - -.panel > .table { +.list-group + .panel-footer { + border-top-width: 0; +} +.panel > .table, +.panel > .table-responsive > .table, +.panel > .panel-collapse > .table { margin-bottom: 0; } - -.panel > .panel-body + .table { - border-top: 1px solid #dddddd; +.panel > .table caption, +.panel > .table-responsive > .table caption, +.panel > .panel-collapse > .table caption { + padding-right: 15px; + padding-left: 15px; } - -.panel-heading { - padding: 10px 15px; - border-bottom: 1px solid transparent; +.panel > .table:first-child, +.panel > .table-responsive:first-child > .table:first-child { + border-top-left-radius: 3px; border-top-right-radius: 3px; +} +.panel > .table:first-child > thead:first-child > tr:first-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child, +.panel > .table:first-child > tbody:first-child > tr:first-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child { border-top-left-radius: 3px; + border-top-right-radius: 3px; } - -.panel-title { - margin-top: 0; - margin-bottom: 0; - font-size: 16px; +.panel > .table:first-child > thead:first-child > tr:first-child td:first-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:first-child, +.panel > .table:first-child > tbody:first-child > tr:first-child td:first-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:first-child, +.panel > .table:first-child > thead:first-child > tr:first-child th:first-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:first-child, +.panel > .table:first-child > tbody:first-child > tr:first-child th:first-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:first-child { + border-top-left-radius: 3px; } - -.panel-title > a { - color: inherit; +.panel > .table:first-child > thead:first-child > tr:first-child td:last-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:last-child, +.panel > .table:first-child > tbody:first-child > tr:first-child td:last-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:last-child, +.panel > .table:first-child > thead:first-child > tr:first-child th:last-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:last-child, +.panel > .table:first-child > tbody:first-child > tr:first-child th:last-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:last-child { + border-top-right-radius: 3px; } - -.panel-footer { - padding: 10px 15px; - background-color: #f5f5f5; - border-top: 1px solid #dddddd; +.panel > .table:last-child, +.panel > .table-responsive:last-child > .table:last-child { border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; } - +.panel > .table:last-child > tbody:last-child > tr:last-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child { + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; +} +.panel > .table:last-child > tbody:last-child > tr:last-child td:first-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:first-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:first-child, +.panel > .table:last-child > tbody:last-child > tr:last-child th:first-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:first-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:first-child { + border-bottom-left-radius: 3px; +} +.panel > .table:last-child > tbody:last-child > tr:last-child td:last-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:last-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child td:last-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:last-child, +.panel > .table:last-child > tbody:last-child > tr:last-child th:last-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:last-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:last-child { + border-bottom-right-radius: 3px; +} +.panel > .panel-body + .table, +.panel > .panel-body + .table-responsive, +.panel > .table + .panel-body, +.panel > .table-responsive + .panel-body { + border-top: 1px solid #ddd; +} +.panel > .table > tbody:first-child > tr:first-child th, +.panel > .table > tbody:first-child > tr:first-child td { + border-top: 0; +} +.panel > .table-bordered, +.panel > .table-responsive > .table-bordered { + border: 0; +} +.panel > .table-bordered > thead > tr > th:first-child, +.panel > .table-responsive > .table-bordered > thead > tr > th:first-child, +.panel > .table-bordered > tbody > tr > th:first-child, +.panel > .table-responsive > .table-bordered > tbody > tr > th:first-child, +.panel > .table-bordered > tfoot > tr > th:first-child, +.panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child, +.panel > .table-bordered > thead > tr > td:first-child, +.panel > .table-responsive > .table-bordered > thead > tr > td:first-child, +.panel > .table-bordered > tbody > tr > td:first-child, +.panel > .table-responsive > .table-bordered > tbody > tr > td:first-child, +.panel > .table-bordered > tfoot > tr > td:first-child, +.panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child { + border-left: 0; +} +.panel > .table-bordered > thead > tr > th:last-child, +.panel > .table-responsive > .table-bordered > thead > tr > th:last-child, +.panel > .table-bordered > tbody > tr > th:last-child, +.panel > .table-responsive > .table-bordered > tbody > tr > th:last-child, +.panel > .table-bordered > tfoot > tr > th:last-child, +.panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child, +.panel > .table-bordered > thead > tr > td:last-child, +.panel > .table-responsive > .table-bordered > thead > tr > td:last-child, +.panel > .table-bordered > tbody > tr > td:last-child, +.panel > .table-responsive > .table-bordered > tbody > tr > td:last-child, +.panel > .table-bordered > tfoot > tr > td:last-child, +.panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child { + border-right: 0; +} +.panel > .table-bordered > thead > tr:first-child > td, +.panel > .table-responsive > .table-bordered > thead > tr:first-child > td, +.panel > .table-bordered > tbody > tr:first-child > td, +.panel > .table-responsive > .table-bordered > tbody > tr:first-child > td, +.panel > .table-bordered > thead > tr:first-child > th, +.panel > .table-responsive > .table-bordered > thead > tr:first-child > th, +.panel > .table-bordered > tbody > tr:first-child > th, +.panel > .table-responsive > .table-bordered > tbody > tr:first-child > th { + border-bottom: 0; +} +.panel > .table-bordered > tbody > tr:last-child > td, +.panel > .table-responsive > .table-bordered > tbody > tr:last-child > td, +.panel > .table-bordered > tfoot > tr:last-child > td, +.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td, +.panel > .table-bordered > tbody > tr:last-child > th, +.panel > .table-responsive > .table-bordered > tbody > tr:last-child > th, +.panel > .table-bordered > tfoot > tr:last-child > th, +.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th { + border-bottom: 0; +} +.panel > .table-responsive { + margin-bottom: 0; + border: 0; +} +.panel-group { + margin-bottom: 20px; +} .panel-group .panel { margin-bottom: 0; - overflow: hidden; border-radius: 4px; } - .panel-group .panel + .panel { margin-top: 5px; } - .panel-group .panel-heading { border-bottom: 0; } - -.panel-group .panel-heading + .panel-collapse .panel-body { - border-top: 1px solid #dddddd; +.panel-group .panel-heading + .panel-collapse > .panel-body, +.panel-group .panel-heading + .panel-collapse > .list-group { + border-top: 1px solid #ddd; } - .panel-group .panel-footer { border-top: 0; } - .panel-group .panel-footer + .panel-collapse .panel-body { - border-bottom: 1px solid #dddddd; + border-bottom: 1px solid #ddd; } - .panel-default { - border-color: #dddddd; + border-color: #ddd; } - .panel-default > .panel-heading { - color: #333333; + color: #333; background-color: #f5f5f5; - border-color: #dddddd; + border-color: #ddd; } - -.panel-default > .panel-heading + .panel-collapse .panel-body { - border-top-color: #dddddd; +.panel-default > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #ddd; } - -.panel-default > .panel-footer + .panel-collapse .panel-body { - border-bottom-color: #dddddd; +.panel-default > .panel-heading .badge { + color: #f5f5f5; + background-color: #333; +} +.panel-default > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #ddd; } - .panel-primary { border-color: #428bca; } - .panel-primary > .panel-heading { - color: #ffffff; + color: #fff; background-color: #428bca; border-color: #428bca; } - -.panel-primary > .panel-heading + .panel-collapse .panel-body { +.panel-primary > .panel-heading + .panel-collapse > .panel-body { border-top-color: #428bca; } - -.panel-primary > .panel-footer + .panel-collapse .panel-body { +.panel-primary > .panel-heading .badge { + color: #428bca; + background-color: #fff; +} +.panel-primary > .panel-footer + .panel-collapse > .panel-body { border-bottom-color: #428bca; } - .panel-success { border-color: #d6e9c6; } - .panel-success > .panel-heading { - color: #468847; + color: #3c763d; background-color: #dff0d8; border-color: #d6e9c6; } - -.panel-success > .panel-heading + .panel-collapse .panel-body { +.panel-success > .panel-heading + .panel-collapse > .panel-body { border-top-color: #d6e9c6; } - -.panel-success > .panel-footer + .panel-collapse .panel-body { +.panel-success > .panel-heading .badge { + color: #dff0d8; + background-color: #3c763d; +} +.panel-success > .panel-footer + .panel-collapse > .panel-body { border-bottom-color: #d6e9c6; } - +.panel-info { + border-color: #bce8f1; +} +.panel-info > .panel-heading { + color: #31708f; + background-color: #d9edf7; + border-color: #bce8f1; +} +.panel-info > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #bce8f1; +} +.panel-info > .panel-heading .badge { + color: #d9edf7; + background-color: #31708f; +} +.panel-info > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #bce8f1; +} .panel-warning { - border-color: #fbeed5; + border-color: #faebcc; } - .panel-warning > .panel-heading { - color: #c09853; + color: #8a6d3b; background-color: #fcf8e3; - border-color: #fbeed5; + border-color: #faebcc; } - -.panel-warning > .panel-heading + .panel-collapse .panel-body { - border-top-color: #fbeed5; +.panel-warning > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #faebcc; } - -.panel-warning > .panel-footer + .panel-collapse .panel-body { - border-bottom-color: #fbeed5; +.panel-warning > .panel-heading .badge { + color: #fcf8e3; + background-color: #8a6d3b; +} +.panel-warning > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #faebcc; } - .panel-danger { - border-color: #eed3d7; + border-color: #ebccd1; } - .panel-danger > .panel-heading { - color: #b94a48; + color: #a94442; background-color: #f2dede; - border-color: #eed3d7; + border-color: #ebccd1; } - -.panel-danger > .panel-heading + .panel-collapse .panel-body { - border-top-color: #eed3d7; +.panel-danger > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #ebccd1; } - -.panel-danger > .panel-footer + .panel-collapse .panel-body { - border-bottom-color: #eed3d7; +.panel-danger > .panel-heading .badge { + color: #f2dede; + background-color: #a94442; } - -.panel-info { - border-color: #bce8f1; +.panel-danger > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #ebccd1; } - -.panel-info > .panel-heading { - color: #3a87ad; - background-color: #d9edf7; - border-color: #bce8f1; +.embed-responsive { + position: relative; + display: block; + height: 0; + padding: 0; + overflow: hidden; } - -.panel-info > .panel-heading + .panel-collapse .panel-body { - border-top-color: #bce8f1; +.embed-responsive .embed-responsive-item, +.embed-responsive iframe, +.embed-responsive embed, +.embed-responsive object, +.embed-responsive video { + position: absolute; + top: 0; + bottom: 0; + left: 0; + width: 100%; + height: 100%; + border: 0; } - -.panel-info > .panel-footer + .panel-collapse .panel-body { - border-bottom-color: #bce8f1; +.embed-responsive.embed-responsive-16by9 { + padding-bottom: 56.25%; +} +.embed-responsive.embed-responsive-4by3 { + padding-bottom: 75%; } - .well { min-height: 20px; padding: 19px; @@ -5542,63 +5457,49 @@ a.list-group-item:focus { background-color: #f5f5f5; border: 1px solid #e3e3e3; border-radius: 4px; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .05); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .05); } - .well blockquote { border-color: #ddd; - border-color: rgba(0, 0, 0, 0.15); + border-color: rgba(0, 0, 0, .15); } - .well-lg { padding: 24px; border-radius: 6px; } - .well-sm { padding: 9px; border-radius: 3px; } - .close { float: right; font-size: 21px; font-weight: bold; line-height: 1; - color: #000000; - text-shadow: 0 1px 0 #ffffff; - opacity: 0.2; + color: #000; + text-shadow: 0 1px 0 #fff; filter: alpha(opacity=20); + opacity: .2; } - .close:hover, .close:focus { - color: #000000; + color: #000; text-decoration: none; cursor: pointer; - opacity: 0.5; filter: alpha(opacity=50); + opacity: .5; } - button.close { + -webkit-appearance: none; padding: 0; cursor: pointer; background: transparent; border: 0; - -webkit-appearance: none; } - .modal-open { overflow: hidden; } - -body.modal-open, -.modal-open .navbar-fixed-top, -.modal-open .navbar-fixed-bottom { - margin-right: 15px; -} - .modal { position: fixed; top: 0; @@ -5607,186 +5508,157 @@ body.modal-open, left: 0; z-index: 1040; display: none; - overflow: auto; - overflow-y: scroll; + overflow: hidden; + -webkit-overflow-scrolling: touch; + outline: 0; } - .modal.fade .modal-dialog { + -webkit-transition: -webkit-transform .3s ease-out; + -o-transition: -o-transform .3s ease-out; + transition: transform .3s ease-out; -webkit-transform: translate(0, -25%); -ms-transform: translate(0, -25%); + -o-transform: translate(0, -25%); transform: translate(0, -25%); - -webkit-transition: -webkit-transform 0.3s ease-out; - -moz-transition: -moz-transform 0.3s ease-out; - -o-transition: -o-transform 0.3s ease-out; - transition: transform 0.3s ease-out; } - .modal.in .modal-dialog { -webkit-transform: translate(0, 0); -ms-transform: translate(0, 0); + -o-transform: translate(0, 0); transform: translate(0, 0); } - +.modal-open .modal { + overflow-x: hidden; + overflow-y: auto; +} .modal-dialog { - z-index: 1050; + position: relative; width: auto; - padding: 10px; - margin-right: auto; - margin-left: auto; + margin: 10px; } - .modal-content { position: relative; - background-color: #ffffff; - border: 1px solid #999999; - border: 1px solid rgba(0, 0, 0, 0.2); + background-color: #fff; + -webkit-background-clip: padding-box; + background-clip: padding-box; + border: 1px solid #999; + border: 1px solid rgba(0, 0, 0, .2); border-radius: 6px; - outline: none; - -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5); - box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5); - background-clip: padding-box; + outline: 0; + -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, .5); + box-shadow: 0 3px 9px rgba(0, 0, 0, .5); } - .modal-backdrop { position: fixed; top: 0; right: 0; bottom: 0; left: 0; - z-index: 1030; - background-color: #000000; + background-color: #000; } - .modal-backdrop.fade { - opacity: 0; filter: alpha(opacity=0); + opacity: 0; } - .modal-backdrop.in { - opacity: 0.5; filter: alpha(opacity=50); + opacity: .5; } - .modal-header { - min-height: 16.428571429px; + min-height: 16.42857143px; padding: 15px; border-bottom: 1px solid #e5e5e5; } - .modal-header .close { margin-top: -2px; } - .modal-title { margin: 0; - line-height: 1.428571429; + line-height: 1.42857143; } - .modal-body { position: relative; - padding: 20px; + padding: 15px; } - .modal-footer { - padding: 19px 20px 20px; - margin-top: 15px; + padding: 15px; text-align: right; border-top: 1px solid #e5e5e5; } - -.modal-footer:before, -.modal-footer:after { - display: table; - content: " "; -} - -.modal-footer:after { - clear: both; -} - -.modal-footer:before, -.modal-footer:after { - display: table; - content: " "; -} - -.modal-footer:after { - clear: both; -} - .modal-footer .btn + .btn { margin-bottom: 0; margin-left: 5px; } - .modal-footer .btn-group .btn + .btn { margin-left: -1px; } - .modal-footer .btn-block + .btn-block { margin-left: 0; } - -@media screen and (min-width: 768px) { +.modal-scrollbar-measure { + position: absolute; + top: -9999px; + width: 50px; + height: 50px; + overflow: scroll; +} +@media (min-width: 768px) { .modal-dialog { - right: auto; - left: 50%; width: 600px; - padding-top: 30px; - padding-bottom: 30px; + margin: 30px auto; } .modal-content { - -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5); - box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5); + -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, .5); + box-shadow: 0 5px 15px rgba(0, 0, 0, .5); + } + .modal-sm { + width: 300px; + } +} +@media (min-width: 992px) { + .modal-lg { + width: 900px; } } - .tooltip { position: absolute; - z-index: 1030; + z-index: 1070; display: block; font-size: 12px; line-height: 1.4; - opacity: 0; - filter: alpha(opacity=0); visibility: visible; + filter: alpha(opacity=0); + opacity: 0; } - .tooltip.in { - opacity: 0.9; filter: alpha(opacity=90); + opacity: .9; } - .tooltip.top { padding: 5px 0; margin-top: -3px; } - .tooltip.right { padding: 0 5px; margin-left: 3px; } - .tooltip.bottom { padding: 5px 0; margin-top: 3px; } - .tooltip.left { padding: 0 5px; margin-left: -3px; } - .tooltip-inner { max-width: 200px; padding: 3px 8px; - color: #ffffff; + color: #fff; text-align: center; text-decoration: none; - background-color: #000000; + background-color: #000; border-radius: 4px; } - .tooltip-arrow { position: absolute; width: 0; @@ -5794,119 +5666,105 @@ body.modal-open, border-color: transparent; border-style: solid; } - .tooltip.top .tooltip-arrow { bottom: 0; left: 50%; margin-left: -5px; - border-top-color: #000000; border-width: 5px 5px 0; + border-top-color: #000; } - .tooltip.top-left .tooltip-arrow { bottom: 0; left: 5px; - border-top-color: #000000; border-width: 5px 5px 0; + border-top-color: #000; } - .tooltip.top-right .tooltip-arrow { right: 5px; bottom: 0; - border-top-color: #000000; border-width: 5px 5px 0; + border-top-color: #000; } - .tooltip.right .tooltip-arrow { top: 50%; left: 0; margin-top: -5px; - border-right-color: #000000; border-width: 5px 5px 5px 0; + border-right-color: #000; } - .tooltip.left .tooltip-arrow { top: 50%; right: 0; margin-top: -5px; - border-left-color: #000000; border-width: 5px 0 5px 5px; + border-left-color: #000; } - .tooltip.bottom .tooltip-arrow { top: 0; left: 50%; margin-left: -5px; - border-bottom-color: #000000; border-width: 0 5px 5px; + border-bottom-color: #000; } - .tooltip.bottom-left .tooltip-arrow { top: 0; left: 5px; - border-bottom-color: #000000; border-width: 0 5px 5px; + border-bottom-color: #000; } - .tooltip.bottom-right .tooltip-arrow { top: 0; right: 5px; - border-bottom-color: #000000; border-width: 0 5px 5px; + border-bottom-color: #000; } - .popover { position: absolute; top: 0; left: 0; - z-index: 1010; + z-index: 1060; display: none; max-width: 276px; padding: 1px; + font-size: 14px; + font-weight: normal; + line-height: 1.42857143; text-align: left; white-space: normal; - background-color: #ffffff; - border: 1px solid #cccccc; - border: 1px solid rgba(0, 0, 0, 0.2); + background-color: #fff; + -webkit-background-clip: padding-box; + background-clip: padding-box; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, .2); border-radius: 6px; - -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); - box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); - background-clip: padding-box; + -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, .2); + box-shadow: 0 5px 10px rgba(0, 0, 0, .2); } - .popover.top { margin-top: -10px; } - .popover.right { margin-left: 10px; } - .popover.bottom { margin-top: 10px; } - .popover.left { margin-left: -10px; } - .popover-title { padding: 8px 14px; margin: 0; font-size: 14px; - font-weight: normal; - line-height: 18px; background-color: #f7f7f7; border-bottom: 1px solid #ebebeb; border-radius: 5px 5px 0 0; } - .popover-content { padding: 9px 14px; } - -.popover .arrow, -.popover .arrow:after { +.popover > .arrow, +.popover > .arrow:after { position: absolute; display: block; width: 0; @@ -5914,147 +5772,153 @@ body.modal-open, border-color: transparent; border-style: solid; } - -.popover .arrow { +.popover > .arrow { border-width: 11px; } - -.popover .arrow:after { - border-width: 10px; +.popover > .arrow:after { content: ""; + border-width: 10px; } - -.popover.top .arrow { +.popover.top > .arrow { bottom: -11px; left: 50%; margin-left: -11px; - border-top-color: #999999; - border-top-color: rgba(0, 0, 0, 0.25); + border-top-color: #999; + border-top-color: rgba(0, 0, 0, .25); border-bottom-width: 0; } - -.popover.top .arrow:after { +.popover.top > .arrow:after { bottom: 1px; margin-left: -10px; - border-top-color: #ffffff; - border-bottom-width: 0; content: " "; + border-top-color: #fff; + border-bottom-width: 0; } - -.popover.right .arrow { +.popover.right > .arrow { top: 50%; left: -11px; margin-top: -11px; - border-right-color: #999999; - border-right-color: rgba(0, 0, 0, 0.25); + border-right-color: #999; + border-right-color: rgba(0, 0, 0, .25); border-left-width: 0; } - -.popover.right .arrow:after { +.popover.right > .arrow:after { bottom: -10px; left: 1px; - border-right-color: #ffffff; - border-left-width: 0; content: " "; + border-right-color: #fff; + border-left-width: 0; } - -.popover.bottom .arrow { +.popover.bottom > .arrow { top: -11px; left: 50%; margin-left: -11px; - border-bottom-color: #999999; - border-bottom-color: rgba(0, 0, 0, 0.25); border-top-width: 0; + border-bottom-color: #999; + border-bottom-color: rgba(0, 0, 0, .25); } - -.popover.bottom .arrow:after { +.popover.bottom > .arrow:after { top: 1px; margin-left: -10px; - border-bottom-color: #ffffff; - border-top-width: 0; content: " "; + border-top-width: 0; + border-bottom-color: #fff; } - -.popover.left .arrow { +.popover.left > .arrow { top: 50%; right: -11px; margin-top: -11px; - border-left-color: #999999; - border-left-color: rgba(0, 0, 0, 0.25); border-right-width: 0; + border-left-color: #999; + border-left-color: rgba(0, 0, 0, .25); } - -.popover.left .arrow:after { +.popover.left > .arrow:after { right: 1px; bottom: -10px; - border-left-color: #ffffff; - border-right-width: 0; content: " "; + border-right-width: 0; + border-left-color: #fff; } - .carousel { position: relative; } - .carousel-inner { position: relative; width: 100%; overflow: hidden; } - .carousel-inner > .item { position: relative; display: none; - -webkit-transition: 0.6s ease-in-out left; - transition: 0.6s ease-in-out left; + -webkit-transition: .6s ease-in-out left; + -o-transition: .6s ease-in-out left; + transition: .6s ease-in-out left; } - .carousel-inner > .item > img, .carousel-inner > .item > a > img { - display: block; - height: auto; - max-width: 100%; line-height: 1; } - +@media all and (transform-3d), (-webkit-transform-3d) { + .carousel-inner > .item { + -webkit-transition: -webkit-transform .6s ease-in-out; + -o-transition: -o-transform .6s ease-in-out; + transition: transform .6s ease-in-out; + + -webkit-backface-visibility: hidden; + backface-visibility: hidden; + -webkit-perspective: 1000; + perspective: 1000; + } + .carousel-inner > .item.next, + .carousel-inner > .item.active.right { + left: 0; + -webkit-transform: translate3d(100%, 0, 0); + transform: translate3d(100%, 0, 0); + } + .carousel-inner > .item.prev, + .carousel-inner > .item.active.left { + left: 0; + -webkit-transform: translate3d(-100%, 0, 0); + transform: translate3d(-100%, 0, 0); + } + .carousel-inner > .item.next.left, + .carousel-inner > .item.prev.right, + .carousel-inner > .item.active { + left: 0; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} .carousel-inner > .active, .carousel-inner > .next, .carousel-inner > .prev { display: block; } - .carousel-inner > .active { left: 0; } - .carousel-inner > .next, .carousel-inner > .prev { position: absolute; top: 0; width: 100%; } - .carousel-inner > .next { left: 100%; } - .carousel-inner > .prev { left: -100%; } - .carousel-inner > .next.left, .carousel-inner > .prev.right { left: 0; } - .carousel-inner > .active.left { left: -100%; } - .carousel-inner > .active.right { left: 100%; } - .carousel-control { position: absolute; top: 0; @@ -6062,69 +5926,70 @@ body.modal-open, left: 0; width: 15%; font-size: 20px; - color: #ffffff; + color: #fff; text-align: center; - text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6); - opacity: 0.5; + text-shadow: 0 1px 2px rgba(0, 0, 0, .6); filter: alpha(opacity=50); + opacity: .5; } - .carousel-control.left { - background-image: -webkit-gradient(linear, 0 top, 100% top, from(rgba(0, 0, 0, 0.5)), to(rgba(0, 0, 0, 0.0001))); - background-image: -webkit-linear-gradient(left, color-stop(rgba(0, 0, 0, 0.5) 0), color-stop(rgba(0, 0, 0, 0.0001) 100%)); - background-image: -moz-linear-gradient(left, rgba(0, 0, 0, 0.5) 0, rgba(0, 0, 0, 0.0001) 100%); - background-image: linear-gradient(to right, rgba(0, 0, 0, 0.5) 0, rgba(0, 0, 0, 0.0001) 100%); - background-repeat: repeat-x; + background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%); + background-image: -o-linear-gradient(left, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%); + background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, .5)), to(rgba(0, 0, 0, .0001))); + background-image: linear-gradient(to right, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1); + background-repeat: repeat-x; } - .carousel-control.right { right: 0; left: auto; - background-image: -webkit-gradient(linear, 0 top, 100% top, from(rgba(0, 0, 0, 0.0001)), to(rgba(0, 0, 0, 0.5))); - background-image: -webkit-linear-gradient(left, color-stop(rgba(0, 0, 0, 0.0001) 0), color-stop(rgba(0, 0, 0, 0.5) 100%)); - background-image: -moz-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0, rgba(0, 0, 0, 0.5) 100%); - background-image: linear-gradient(to right, rgba(0, 0, 0, 0.0001) 0, rgba(0, 0, 0, 0.5) 100%); - background-repeat: repeat-x; + background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%); + background-image: -o-linear-gradient(left, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%); + background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, .0001)), to(rgba(0, 0, 0, .5))); + background-image: linear-gradient(to right, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1); + background-repeat: repeat-x; } - .carousel-control:hover, .carousel-control:focus { - color: #ffffff; + color: #fff; text-decoration: none; - opacity: 0.9; filter: alpha(opacity=90); + outline: 0; + opacity: .9; } - .carousel-control .icon-prev, .carousel-control .icon-next, .carousel-control .glyphicon-chevron-left, .carousel-control .glyphicon-chevron-right { position: absolute; top: 50%; - left: 50%; z-index: 5; display: inline-block; } - +.carousel-control .icon-prev, +.carousel-control .glyphicon-chevron-left { + left: 50%; + margin-left: -10px; +} +.carousel-control .icon-next, +.carousel-control .glyphicon-chevron-right { + right: 50%; + margin-right: -10px; +} .carousel-control .icon-prev, .carousel-control .icon-next { width: 20px; height: 20px; margin-top: -10px; - margin-left: -10px; font-family: serif; } - .carousel-control .icon-prev:before { content: '\2039'; } - .carousel-control .icon-next:before { content: '\203a'; } - .carousel-indicators { position: absolute; bottom: 10px; @@ -6136,7 +6001,6 @@ body.modal-open, text-align: center; list-style: none; } - .carousel-indicators li { display: inline-block; width: 10px; @@ -6144,17 +6008,17 @@ body.modal-open, margin: 1px; text-indent: -999px; cursor: pointer; - border: 1px solid #ffffff; + background-color: #000 \9; + background-color: rgba(0, 0, 0, 0); + border: 1px solid #fff; border-radius: 10px; } - .carousel-indicators .active { width: 12px; height: 12px; margin: 0; - background-color: #ffffff; + background-color: #fff; } - .carousel-caption { position: absolute; right: 15%; @@ -6163,24 +6027,31 @@ body.modal-open, z-index: 10; padding-top: 20px; padding-bottom: 20px; - color: #ffffff; + color: #fff; text-align: center; - text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6); + text-shadow: 0 1px 2px rgba(0, 0, 0, .6); } - .carousel-caption .btn { text-shadow: none; } - @media screen and (min-width: 768px) { + .carousel-control .glyphicon-chevron-left, + .carousel-control .glyphicon-chevron-right, .carousel-control .icon-prev, .carousel-control .icon-next { width: 30px; height: 30px; margin-top: -15px; - margin-left: -15px; font-size: 30px; } + .carousel-control .glyphicon-chevron-left, + .carousel-control .icon-prev { + margin-left: -15px; + } + .carousel-control .glyphicon-chevron-right, + .carousel-control .icon-next { + margin-right: -15px; + } .carousel-caption { right: 20%; left: 20%; @@ -6190,601 +6061,263 @@ body.modal-open, bottom: 20px; } } - .clearfix:before, -.clearfix:after { +.clearfix:after, +.dl-horizontal dd:before, +.dl-horizontal dd:after, +.container:before, +.container:after, +.container-fluid:before, +.container-fluid:after, +.row:before, +.row:after, +.form-horizontal .form-group:before, +.form-horizontal .form-group:after, +.btn-toolbar:before, +.btn-toolbar:after, +.btn-group-vertical > .btn-group:before, +.btn-group-vertical > .btn-group:after, +.nav:before, +.nav:after, +.navbar:before, +.navbar:after, +.navbar-header:before, +.navbar-header:after, +.navbar-collapse:before, +.navbar-collapse:after, +.pager:before, +.pager:after, +.panel-body:before, +.panel-body:after, +.modal-footer:before, +.modal-footer:after { display: table; content: " "; } - -.clearfix:after { +.clearfix:after, +.dl-horizontal dd:after, +.container:after, +.container-fluid:after, +.row:after, +.form-horizontal .form-group:after, +.btn-toolbar:after, +.btn-group-vertical > .btn-group:after, +.nav:after, +.navbar:after, +.navbar-header:after, +.navbar-collapse:after, +.pager:after, +.panel-body:after, +.modal-footer:after { clear: both; } - +.center-block { + display: block; + margin-right: auto; + margin-left: auto; +} .pull-right { float: right !important; } - .pull-left { float: left !important; } - -.hide { - display: none !important; -} - -.show { - display: block !important; -} - -.invisible { - visibility: hidden; -} - -.text-hide { - font: 0/0 a; - color: transparent; - text-shadow: none; - background-color: transparent; - border: 0; -} - -.affix { - position: fixed; -} - -@-ms-viewport { - width: device-width; -} - -@media screen and (max-width: 400px) { - @-ms-viewport { - width: 320px; - } -} - -.hidden { - display: none !important; - visibility: hidden !important; -} - -.visible-xs { - display: none !important; -} - -tr.visible-xs { - display: none !important; -} - -th.visible-xs, -td.visible-xs { - display: none !important; -} - -@media (max-width: 767px) { - .visible-xs { - display: block !important; - } - tr.visible-xs { - display: table-row !important; - } - th.visible-xs, - td.visible-xs { - display: table-cell !important; - } -} - -@media (min-width: 768px) and (max-width: 991px) { - .visible-xs.visible-sm { - display: block !important; - } - tr.visible-xs.visible-sm { - display: table-row !important; - } - th.visible-xs.visible-sm, - td.visible-xs.visible-sm { - display: table-cell !important; - } -} - -@media (min-width: 992px) and (max-width: 1199px) { - .visible-xs.visible-md { - display: block !important; - } - tr.visible-xs.visible-md { - display: table-row !important; - } - th.visible-xs.visible-md, - td.visible-xs.visible-md { - display: table-cell !important; - } -} - -@media (min-width: 1200px) { - .visible-xs.visible-lg { - display: block !important; - } - tr.visible-xs.visible-lg { - display: table-row !important; - } - th.visible-xs.visible-lg, - td.visible-xs.visible-lg { - display: table-cell !important; - } -} - -.visible-sm { - display: none !important; -} - -tr.visible-sm { - display: none !important; -} - -th.visible-sm, -td.visible-sm { - display: none !important; -} - -@media (max-width: 767px) { - .visible-sm.visible-xs { - display: block !important; - } - tr.visible-sm.visible-xs { - display: table-row !important; - } - th.visible-sm.visible-xs, - td.visible-sm.visible-xs { - display: table-cell !important; - } -} - -@media (min-width: 768px) and (max-width: 991px) { - .visible-sm { - display: block !important; - } - tr.visible-sm { - display: table-row !important; - } - th.visible-sm, - td.visible-sm { - display: table-cell !important; - } -} - -@media (min-width: 992px) and (max-width: 1199px) { - .visible-sm.visible-md { - display: block !important; - } - tr.visible-sm.visible-md { - display: table-row !important; - } - th.visible-sm.visible-md, - td.visible-sm.visible-md { - display: table-cell !important; - } -} - -@media (min-width: 1200px) { - .visible-sm.visible-lg { - display: block !important; - } - tr.visible-sm.visible-lg { - display: table-row !important; - } - th.visible-sm.visible-lg, - td.visible-sm.visible-lg { - display: table-cell !important; - } -} - -.visible-md { - display: none !important; -} - -tr.visible-md { - display: none !important; -} - -th.visible-md, -td.visible-md { - display: none !important; -} - -@media (max-width: 767px) { - .visible-md.visible-xs { - display: block !important; - } - tr.visible-md.visible-xs { - display: table-row !important; - } - th.visible-md.visible-xs, - td.visible-md.visible-xs { - display: table-cell !important; - } -} - -@media (min-width: 768px) and (max-width: 991px) { - .visible-md.visible-sm { - display: block !important; - } - tr.visible-md.visible-sm { - display: table-row !important; - } - th.visible-md.visible-sm, - td.visible-md.visible-sm { - display: table-cell !important; - } -} - -@media (min-width: 992px) and (max-width: 1199px) { - .visible-md { - display: block !important; - } - tr.visible-md { - display: table-row !important; - } - th.visible-md, - td.visible-md { - display: table-cell !important; - } +.hide { + display: none !important; } - -@media (min-width: 1200px) { - .visible-md.visible-lg { - display: block !important; - } - tr.visible-md.visible-lg { - display: table-row !important; - } - th.visible-md.visible-lg, - td.visible-md.visible-lg { - display: table-cell !important; - } +.show { + display: block !important; } - -.visible-lg { +.invisible { + visibility: hidden; +} +.text-hide { + font: 0/0 a; + color: transparent; + text-shadow: none; + background-color: transparent; + border: 0; +} +.hidden { display: none !important; + visibility: hidden !important; } - -tr.visible-lg { +.affix { + position: fixed; +} +@-ms-viewport { + width: device-width; +} +.visible-xs, +.visible-sm, +.visible-md, +.visible-lg { display: none !important; } - -th.visible-lg, -td.visible-lg { +.visible-xs-block, +.visible-xs-inline, +.visible-xs-inline-block, +.visible-sm-block, +.visible-sm-inline, +.visible-sm-inline-block, +.visible-md-block, +.visible-md-inline, +.visible-md-inline-block, +.visible-lg-block, +.visible-lg-inline, +.visible-lg-inline-block { display: none !important; } - @media (max-width: 767px) { - .visible-lg.visible-xs { + .visible-xs { display: block !important; } - tr.visible-lg.visible-xs { + table.visible-xs { + display: table; + } + tr.visible-xs { display: table-row !important; } - th.visible-lg.visible-xs, - td.visible-lg.visible-xs { + th.visible-xs, + td.visible-xs { display: table-cell !important; } } - -@media (min-width: 768px) and (max-width: 991px) { - .visible-lg.visible-sm { +@media (max-width: 767px) { + .visible-xs-block { display: block !important; } - tr.visible-lg.visible-sm { - display: table-row !important; +} +@media (max-width: 767px) { + .visible-xs-inline { + display: inline !important; } - th.visible-lg.visible-sm, - td.visible-lg.visible-sm { - display: table-cell !important; +} +@media (max-width: 767px) { + .visible-xs-inline-block { + display: inline-block !important; } } - -@media (min-width: 992px) and (max-width: 1199px) { - .visible-lg.visible-md { +@media (min-width: 768px) and (max-width: 991px) { + .visible-sm { display: block !important; } - tr.visible-lg.visible-md { + table.visible-sm { + display: table; + } + tr.visible-sm { display: table-row !important; } - th.visible-lg.visible-md, - td.visible-lg.visible-md { + th.visible-sm, + td.visible-sm { display: table-cell !important; } } - -@media (min-width: 1200px) { - .visible-lg { +@media (min-width: 768px) and (max-width: 991px) { + .visible-sm-block { display: block !important; } - tr.visible-lg { - display: table-row !important; - } - th.visible-lg, - td.visible-lg { - display: table-cell !important; - } -} - -.hidden-xs { - display: block !important; -} - -tr.hidden-xs { - display: table-row !important; } - -th.hidden-xs, -td.hidden-xs { - display: table-cell !important; -} - -@media (max-width: 767px) { - .hidden-xs { - display: none !important; - } - tr.hidden-xs { - display: none !important; - } - th.hidden-xs, - td.hidden-xs { - display: none !important; +@media (min-width: 768px) and (max-width: 991px) { + .visible-sm-inline { + display: inline !important; } } - @media (min-width: 768px) and (max-width: 991px) { - .hidden-xs.hidden-sm { - display: none !important; - } - tr.hidden-xs.hidden-sm { - display: none !important; - } - th.hidden-xs.hidden-sm, - td.hidden-xs.hidden-sm { - display: none !important; + .visible-sm-inline-block { + display: inline-block !important; } } - @media (min-width: 992px) and (max-width: 1199px) { - .hidden-xs.hidden-md { - display: none !important; - } - tr.hidden-xs.hidden-md { - display: none !important; - } - th.hidden-xs.hidden-md, - td.hidden-xs.hidden-md { - display: none !important; + .visible-md { + display: block !important; } -} - -@media (min-width: 1200px) { - .hidden-xs.hidden-lg { - display: none !important; + table.visible-md { + display: table; } - tr.hidden-xs.hidden-lg { - display: none !important; + tr.visible-md { + display: table-row !important; } - th.hidden-xs.hidden-lg, - td.hidden-xs.hidden-lg { - display: none !important; + th.visible-md, + td.visible-md { + display: table-cell !important; } } - -.hidden-sm { - display: block !important; -} - -tr.hidden-sm { - display: table-row !important; -} - -th.hidden-sm, -td.hidden-sm { - display: table-cell !important; -} - -@media (max-width: 767px) { - .hidden-sm.hidden-xs { - display: none !important; - } - tr.hidden-sm.hidden-xs { - display: none !important; - } - th.hidden-sm.hidden-xs, - td.hidden-sm.hidden-xs { - display: none !important; +@media (min-width: 992px) and (max-width: 1199px) { + .visible-md-block { + display: block !important; } } - -@media (min-width: 768px) and (max-width: 991px) { - .hidden-sm { - display: none !important; - } - tr.hidden-sm { - display: none !important; - } - th.hidden-sm, - td.hidden-sm { - display: none !important; +@media (min-width: 992px) and (max-width: 1199px) { + .visible-md-inline { + display: inline !important; } } - @media (min-width: 992px) and (max-width: 1199px) { - .hidden-sm.hidden-md { - display: none !important; - } - tr.hidden-sm.hidden-md { - display: none !important; - } - th.hidden-sm.hidden-md, - td.hidden-sm.hidden-md { - display: none !important; + .visible-md-inline-block { + display: inline-block !important; } } - @media (min-width: 1200px) { - .hidden-sm.hidden-lg { - display: none !important; - } - tr.hidden-sm.hidden-lg { - display: none !important; - } - th.hidden-sm.hidden-lg, - td.hidden-sm.hidden-lg { - display: none !important; + .visible-lg { + display: block !important; } -} - -.hidden-md { - display: block !important; -} - -tr.hidden-md { - display: table-row !important; -} - -th.hidden-md, -td.hidden-md { - display: table-cell !important; -} - -@media (max-width: 767px) { - .hidden-md.hidden-xs { - display: none !important; + table.visible-lg { + display: table; } - tr.hidden-md.hidden-xs { - display: none !important; + tr.visible-lg { + display: table-row !important; } - th.hidden-md.hidden-xs, - td.hidden-md.hidden-xs { - display: none !important; + th.visible-lg, + td.visible-lg { + display: table-cell !important; } } - -@media (min-width: 768px) and (max-width: 991px) { - .hidden-md.hidden-sm { - display: none !important; - } - tr.hidden-md.hidden-sm { - display: none !important; - } - th.hidden-md.hidden-sm, - td.hidden-md.hidden-sm { - display: none !important; +@media (min-width: 1200px) { + .visible-lg-block { + display: block !important; } } - -@media (min-width: 992px) and (max-width: 1199px) { - .hidden-md { - display: none !important; - } - tr.hidden-md { - display: none !important; - } - th.hidden-md, - td.hidden-md { - display: none !important; +@media (min-width: 1200px) { + .visible-lg-inline { + display: inline !important; } } - @media (min-width: 1200px) { - .hidden-md.hidden-lg { - display: none !important; - } - tr.hidden-md.hidden-lg { - display: none !important; - } - th.hidden-md.hidden-lg, - td.hidden-md.hidden-lg { - display: none !important; + .visible-lg-inline-block { + display: inline-block !important; } } - -.hidden-lg { - display: block !important; -} - -tr.hidden-lg { - display: table-row !important; -} - -th.hidden-lg, -td.hidden-lg { - display: table-cell !important; -} - @media (max-width: 767px) { - .hidden-lg.hidden-xs { - display: none !important; - } - tr.hidden-lg.hidden-xs { - display: none !important; - } - th.hidden-lg.hidden-xs, - td.hidden-lg.hidden-xs { + .hidden-xs { display: none !important; } } - @media (min-width: 768px) and (max-width: 991px) { - .hidden-lg.hidden-sm { - display: none !important; - } - tr.hidden-lg.hidden-sm { - display: none !important; - } - th.hidden-lg.hidden-sm, - td.hidden-lg.hidden-sm { + .hidden-sm { display: none !important; } } - @media (min-width: 992px) and (max-width: 1199px) { - .hidden-lg.hidden-md { - display: none !important; - } - tr.hidden-lg.hidden-md { - display: none !important; - } - th.hidden-lg.hidden-md, - td.hidden-lg.hidden-md { + .hidden-md { display: none !important; } } - @media (min-width: 1200px) { .hidden-lg { display: none !important; } - tr.hidden-lg { - display: none !important; - } - th.hidden-lg, - td.hidden-lg { - display: none !important; - } } - .visible-print { display: none !important; } - -tr.visible-print { - display: none !important; -} - -th.visible-print, -td.visible-print { - display: none !important; -} - @media print { .visible-print { display: block !important; } + table.visible-print { + display: table; + } tr.visible-print { display: table-row !important; } @@ -6792,14 +6325,34 @@ td.visible-print { td.visible-print { display: table-cell !important; } - .hidden-print { - display: none !important; +} +.visible-print-block { + display: none !important; +} +@media print { + .visible-print-block { + display: block !important; } - tr.hidden-print { - display: none !important; +} +.visible-print-inline { + display: none !important; +} +@media print { + .visible-print-inline { + display: inline !important; + } +} +.visible-print-inline-block { + display: none !important; +} +@media print { + .visible-print-inline-block { + display: inline-block !important; } - th.hidden-print, - td.hidden-print { +} +@media print { + .hidden-print { display: none !important; } -} \ No newline at end of file +} +/*# sourceMappingURL=bootstrap.css.map */ diff --git a/vendor/bootstrap/css/bootstrap.css.map b/vendor/bootstrap/css/bootstrap.css.map new file mode 100755 index 000000000..fa5546b59 --- /dev/null +++ b/vendor/bootstrap/css/bootstrap.css.map @@ -0,0 +1 @@ +{"version":3,"sources":["bootstrap.css","less/normalize.less","less/print.less","less/glyphicons.less","less/scaffolding.less","less/mixins/vendor-prefixes.less","less/mixins/tab-focus.less","less/mixins/image.less","less/type.less","less/mixins/text-emphasis.less","less/mixins/background-variant.less","less/mixins/text-overflow.less","less/code.less","less/grid.less","less/mixins/grid.less","less/mixins/grid-framework.less","less/tables.less","less/mixins/table-row.less","less/forms.less","less/mixins/forms.less","less/buttons.less","less/mixins/buttons.less","less/mixins/opacity.less","less/component-animations.less","less/dropdowns.less","less/mixins/nav-divider.less","less/mixins/reset-filter.less","less/button-groups.less","less/mixins/border-radius.less","less/input-groups.less","less/navs.less","less/navbar.less","less/mixins/nav-vertical-align.less","less/utilities.less","less/breadcrumbs.less","less/pagination.less","less/mixins/pagination.less","less/pager.less","less/labels.less","less/mixins/labels.less","less/badges.less","less/jumbotron.less","less/thumbnails.less","less/alerts.less","less/mixins/alerts.less","less/progress-bars.less","less/mixins/gradients.less","less/mixins/progress-bar.less","less/media.less","less/list-group.less","less/mixins/list-group.less","less/panels.less","less/mixins/panels.less","less/responsive-embed.less","less/wells.less","less/close.less","less/modals.less","less/tooltip.less","less/popovers.less","less/carousel.less","less/mixins/clearfix.less","less/mixins/center-block.less","less/mixins/hide-text.less","less/responsive-utilities.less","less/mixins/responsive-visibility.less"],"names":[],"mappings":"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AAA;EHsR9C;AGrRmC;EAAW,kBAAA;EHwR9C;AGvRmC;EAAW,kBAAA;EH0R9C;AGzRmC;EAAW,kBAAA;EH4R9C;AG3RmC;EAAW,kBAAA;EH8R9C;AG7RmC;EAAW,kBAAA;EHgS9C;AG/RmC;EAAW,kBAAA;EHkS9C;AGjSmC;EAAW,kBAAA;EHoS9C;AGnSmC;EAAW,kBAAA;EHsS9C;AGrSmC;EAAW,kBAAA;EHwS9C;AGvSmC;EAAW,kBAAA;EH0S9C;AGzSmC;EAAW,kBAAA;EH4S9C;AG3SmC;EAAW,kBAAA;EH8S9C;AG7SmC;EAAW,kBAAA;EHgT9C;AG/SmC;EAAW,kBAAA;EHkT9C;AGjTmC;EAAW,kBAAA;EHoT9C;AGnTmC;EAAW,kBAAA;EHsT9C;AGrTmC;EAAW,kBAAA;EHwT9C;AGvTmC;EAAW,kBAAA;EH0T9C;AGzTmC;EAAW,kBAAA;EH4T9C;AG3TmC;EAAW,kBAAA;EH8T9C;AG7TmC;EAAW,kBAAA;EHgU9C;AG/TmC;EAAW,kBAAA;EHkU9C;AGjUmC;EAAW,kBAAA;EHoU9C;AGnUmC;EAAW,kBAAA;EHsU9C;AGrUmC;EAAW,kBAAA;EHwU9C;AGvUmC;EAAW,kBAAA;EH0U9C;AGzUmC;EAAW,kBAAA;EH4U9C;AG3UmC;EAAW,kBAAA;EH8U9C;AG7UmC;EAAW,kBAAA;EHgV9C;AG/UmC;EAAW,kBAAA;EHkV9C;AGjVmC;EAAW,kBAAA;EHoV9C;AGnVmC;EAAW,kBAAA;EHsV9C;AGrVmC;EAAW,kBAAA;EHwV9C;AGvVmC;EAAW,kBAAA;EH0V9C;AGzVmC;EAAW,kBAAA;EH4V9C;AG3VmC;EAAW,kBAAA;EH8V9C;AG7VmC;EAAW,kBAAA;EHgW9C;AG/VmC;EAAW,kBAAA;EHkW9C;AGjWmC;EAAW,kBAAA;EHoW9C;AGnWmC;EAAW,kBAAA;EHsW9C;AGrWmC;EAAW,kBAAA;EHwW9C;AGvWmC;EAAW,kBAAA;EH0W9C;AGzWmC;EAAW,kBAAA;EH4W9C;AG3WmC;EAAW,kBAAA;EH8W9C;AG7WmC;EAAW,kBAAA;EHgX9C;AG/WmC;EAAW,kBAAA;EHkX9C;AGjXmC;EAAW,kBAAA;EHoX9C;AGnXmC;EAAW,kBAAA;EHsX9C;AGrXmC;EAAW,kBAAA;EHwX9C;AGvXmC;EAAW,kBAAA;EH0X9C;AGzXmC;EAAW,kBAAA;EH4X9C;AG3XmC;EAAW,kBAAA;EH8X9C;AG7XmC;EAAW,kBAAA;EHgY9C;AG/XmC;EAAW,kBAAA;EHkY9C;AGjYmC;EAAW,kBAAA;EHoY9C;AGnYmC;EAAW,kBAAA;EHsY9C;AGrYmC;EAAW,kBAAA;EHwY9C;AGvYmC;EAAW,kBAAA;EH0Y9C;AGzYmC;EAAW,kBAAA;EH4Y9C;AG3YmC;EAAW,kBAAA;EH8Y9C;AG7YmC;EAAW,kBAAA;EHgZ9C;AG/YmC;EAAW,kBAAA;EHkZ9C;AGjZmC;EAAW,kBAAA;EHoZ9C;AGnZmC;EAAW,kBAAA;EHsZ9C;AGrZmC;EAAW,kBAAA;EHwZ9C;AGvZmC;EAAW,kBAAA;EH0Z9C;AGzZmC;EAAW,kBAAA;EH4Z9C;AG3ZmC;EAAW,kBAAA;EH8Z9C;AG7ZmC;EAAW,kBAAA;EHga9C;AG/ZmC;EAAW,kBAAA;EHka9C;AGjamC;EAAW,kBAAA;EHoa9C;AGnamC;EAAW,kBAAA;EHsa9C;AGramC;EAAW,kBAAA;EHwa9C;AGvamC;EAAW,kBAAA;EH0a9C;AGzamC;EAAW,kBAAA;EH4a9C;AG3amC;EAAW,kBAAA;EH8a9C;AG7amC;EAAW,kBAAA;EHgb9C;AG/amC;EAAW,kBAAA;EHkb9C;AGjbmC;EAAW,kBAAA;EHob9C;AGnbmC;EAAW,kBAAA;EHsb9C;AGrbmC;EAAW,kBAAA;EHwb9C;AGvbmC;EAAW,kBAAA;EH0b9C;AGzbmC;EAAW,kBAAA;EH4b9C;AG3bmC;EAAW,kBAAA;EH8b9C;AG7bmC;EAAW,kBAAA;EHgc9C;AG/bmC;EAAW,kBAAA;EHkc9C;AGjcmC;EAAW,kBAAA;EHoc9C;AGncmC;EAAW,kBAAA;EHsc9C;AGrcmC;EAAW,kBAAA;EHwc9C;AGvcmC;EAAW,kBAAA;EH0c9C;AGzcmC;EAAW,kBAAA;EH4c9C;AG3cmC;EAAW,kBAAA;EH8c9C;AG7cmC;EAAW,kBAAA;EHgd9C;AG/cmC;EAAW,kBAAA;EHkd9C;AGjdmC;EAAW,kBAAA;EHod9C;AGndmC;EAAW,kBAAA;EHsd9C;AGrdmC;EAAW,kBAAA;EHwd9C;AGvdmC;EAAW,kBAAA;EH0d9C;AGzdmC;EAAW,kBAAA;EH4d9C;AG3dmC;EAAW,kBAAA;EH8d9C;AG7dmC;EAAW,kBAAA;EHge9C;AG/dmC;EAAW,kBAAA;EHke9C;AGjemC;EAAW,kBAAA;EHoe9C;AGnemC;EAAW,kBAAA;EHse9C;AGremC;EAAW,kBAAA;EHwe9C;AGvemC;EAAW,kBAAA;EH0e9C;AGzemC;EAAW,kBAAA;EH4e9C;AG3emC;EAAW,kBAAA;EH8e9C;AG7emC;EAAW,kBAAA;EHgf9C;AG/emC;EAAW,kBAAA;EHkf9C;AGjfmC;EAAW,kBAAA;EHof9C;AGnfmC;EAAW,kBAAA;EHsf9C;AGrfmC;EAAW,kBAAA;EHwf9C;AGvfmC;EAAW,kBAAA;EH0f9C;AGzfmC;EAAW,kBAAA;EH4f9C;AG3fmC;EAAW,kBAAA;EH8f9C;AG7fmC;EAAW,kBAAA;EHggB9C;AG/fmC;EAAW,kBAAA;EHkgB9C;AGjgBmC;EAAW,kBAAA;EHogB9C;AGngBmC;EAAW,kBAAA;EHsgB9C;AGrgBmC;EAAW,kBAAA;EHwgB9C;AGvgBmC;EAAW,kBAAA;EH0gB9C;AGzgBmC;EAAW,kBAAA;EH4gB9C;AG3gBmC;EAAW,kBAAA;EH8gB9C;AG7gBmC;EAAW,kBAAA;EHghB9C;AG/gBmC;EAAW,kBAAA;EHkhB9C;AGjhBmC;EAAW,kBAAA;EHohB9C;AGnhBmC;EAAW,kBAAA;EHshB9C;AGrhBmC;EAAW,kBAAA;EHwhB9C;AGvhBmC;EAAW,kBAAA;EH0hB9C;AGzhBmC;EAAW,kBAAA;EH4hB9C;AG3hBmC;EAAW,kBAAA;EH8hB9C;AG7hBmC;EAAW,kBAAA;EHgiB9C;AG/hBmC;EAAW,kBAAA;EHkiB9C;AGjiBmC;EAAW,kBAAA;EHoiB9C;AGniBmC;EAAW,kBAAA;EHsiB9C;AGriBmC;EAAW,kBAAA;EHwiB9C;AGviBmC;EAAW,kBAAA;EH0iB9C;AGziBmC;EAAW,kBAAA;EH4iB9C;AG3iBmC;EAAW,kBAAA;EH8iB9C;AG7iBmC;EAAW,kBAAA;EHgjB9C;AG/iBmC;EAAW,kBA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EACE,mBAAA;Efi7CH;Ael7CC;EACE,2BAAA;Efo7CH;Aer7CC;EACE,2BAAA;Efu7CH;Aex7CC;EACE,kBAAA;Ef07CH;Ae37CC;EACE,2BAAA;Ef67CH;Ae97CC;EACE,2BAAA;Efg8CH;Aej8CC;EACE,kBAAA;Efm8CH;Aep8CC;EACE,2BAAA;Efs8CH;Aev8CC;EACE,2BAAA;Efy8CH;Ae18CC;EACE,kBAAA;Ef48CH;Ae78CC;EACE,2BAAA;Ef+8CH;Aeh9CC;EACE,0BAAA;Efk9CH;Aen9CC;EACE,iBAAA;Efq9CH;Aaz9CD;EE9BI;IACE,aAAA;If0/CH;Een/CD;IACE,aAAA;Ifq/CD;Eet/CD;IACE,qBAAA;Ifw/CD;Eez/CD;IACE,qBAAA;If2/CD;Ee5/CD;IACE,YAAA;If8/CD;Ee//CD;IACE,qBAAA;IfigDD;EelgDD;IACE,qBAAA;IfogDD;EergDD;IACE,YAAA;IfugDD;EexgDD;IACE,qBAAA;If0gDD;Ee3gDD;IACE,qBAAA;If6gDD;Ee9gDD;IACE,YAAA;IfghDD;EejhDD;IACE,qBAAA;IfmhDD;EephDD;IACE,oBAAA;IfshDD;EexgDD;IACE,aAAA;If0gDD;Ee3gDD;IACE,qBAAA;If6gDD;Ee9gDD;IACE,qBAAA;IfghDD;EejhDD;IACE,YAAA;IfmhDD;EephDD;IACE,qBAAA;IfshDD;EevhDD;IACE,qBAAA;IfyhDD;Ee1hDD;IACE,YAAA;If4hDD;Ee7hDD;IACE,qBAAA;If+hDD;EehiDD;IACE,qBAAA;IfkiDD;EeniDD;IACE,YAAA;IfqiDD;EetiDD;IACE,qBAAA;IfwiDD;EeziDD;IACE,oBAAA;If2iDD;EeviDD;IACE,aAAA;IfyiDD;EezjDD;IACE,YAAA;If2jDD;Ee5jDD;IACE,oBAAA;If8jDD;Ee/jDD;IACE,oBAAA;IfikDD;EelkDD;IACE,WAAA;IfokDD;EerkDD;IACE,oBAAA;IfukDD;EexkDD;IACE,oBAAA;If0kDD;Ee3kDD;IACE,WAAA;If6kDD;Ee9kDD;IACE,oBAAA;IfglDD;EejlDD;IACE,oBAAA;IfmlDD;EeplDD;IACE,WAAA;IfslDD;EevlDD;IACE,oBAAA;IfylDD;Ee1lDD;IACE,mBAAA;If4lDD;EexlDD;IACE,YAAA;If0lDD;Ee5kDD;IACE,mBAAA;If8kDD;Ee/kDD;IACE,2BAAA;IfilDD;EellDD;IACE,2BAAA;IfolDD;EerlDD;IACE,kBAAA;IfulDD;EexlDD;IACE,2BAAA;If0lDD;Ee3lDD;IACE,2BAAA;If6lDD;Ee9lDD;IACE,kBAAA;IfgmDD;EejmDD;IACE,2BAAA;IfmmDD;EepmDD;IACE,2BAAA;IfsmDD;EevmDD;IACE,kBAAA;IfymDD;Ee1mDD;IACE,2BAAA;If4mDD;Ee7mDD;IACE,0BAAA;If+mDD;EehnDD;IACE,iBAAA;IfknDD;EACF;Aa9mDD;EEvCI;IACE,aAAA;IfwpDH;EejpDD;IACE,aAAA;IfmpDD;EeppDD;IACE,qBAAA;IfspDD;EevpDD;IACE,qBAAA;IfypDD;Ee1pDD;IACE,YAAA;If4pDD;Ee7pDD;IACE,qBAAA;If+pDD;EehqDD;IACE,qBAAA;IfkqDD;EenqDD;IACE,YAAA;IfqqDD;EetqDD;IACE,qBAAA;IfwqDD;EezqDD;IACE,qBAAA;If2qDD;Ee5qDD;IACE,YAAA;If8qDD;Ee/qDD;IACE,qBAAA;IfirDD;EelrDD;IACE,oBAAA;IforDD;EetqDD;IACE,aAAA;IfwqDD;EezqDD;IACE,qBAAA;If2qDD;Ee5qDD;IACE,qBAAA;If8qDD;Ee/qDD;IACE,YAAA;IfirDD;EelrDD;IACE,qBAAA;IforDD;EerrDD;IACE,qBAAA;IfurDD;EexrDD;IACE,YAAA;If0rDD;Ee3rDD;IACE,qBAAA;If6rDD;Ee9rDD;IACE,qBAAA;IfgsDD;EejsDD;IACE,YAAA;IfmsDD;EepsDD;IACE,qBAAA;IfssDD;EevsDD;IACE,oBAAA;IfysDD;EersDD;IACE,aAAA;IfusDD;EevtDD;IACE,YAAA;IfytDD;Ee1tDD;IACE,oBAAA;If4tDD;Ee7tDD;IACE,oBAAA;If+tDD;EehuDD;IACE,WAAA;IfkuDD;EenuDD;IACE,oBAAA;IfquDD;EetuDD;IACE,oBAAA;IfwuDD;EezuDD;IACE,WAAA;If2uDD;Ee5uDD;IACE,oBAAA;If8uDD;Ee/uDD;IACE,oBAAA;IfivDD;EelvDD;IACE,WAAA;IfovDD;EervDD;IACE,oBAAA;IfuvDD;EexvDD;IACE,mBAAA;If0vDD;EetvDD;IACE,YAAA;IfwvDD;Ee1uDD;IACE,mBAAA;If4uDD;Ee7uDD;IACE,2BAAA;If+uDD;EehvDD;IACE,2BAAA;IfkvDD;EenvDD;IACE,kBAAA;IfqvDD;EetvDD;IACE,2BAAA;IfwvDD;EezvDD;IACE,2BAAA;If2vDD;Ee5vDD;IACE,kBAAA;If8vDD;Ee/vDD;IACE,2BAAA;IfiwDD;EelwDD;IACE,2BAAA;IfowDD;EerwDD;IACE,kBAAA;IfuwDD;EexwDD;IACE,2BAAA;If0wDD;Ee3wDD;IACE,0BAAA;If6wDD;Ee9wDD;IACE,iBAAA;IfgxDD;EACF;AarwDD;EE9CI;IACE,aAAA;IfszDH;Ee/yDD;IACE,aAAA;IfizDD;EelzDD;IACE,qBAAA;IfozDD;EerzDD;IACE,qBAAA;IfuzDD;EexzDD;IACE,YAAA;If0zDD;Ee3zDD;IACE,qBAAA;If6zDD;Ee9zDD;IACE,qBAAA;Ifg0DD;Eej0DD;IACE,YAAA;Ifm0DD;Eep0DD;IACE,qBAAA;Ifs0DD;Eev0DD;IACE,qBAAA;Ify0DD;Ee10DD;IACE,YAAA;If40DD;Ee70DD;IACE,qBAAA;If+0DD;Eeh1DD;IACE,oBAAA;Ifk1DD;Eep0DD;IACE,aAAA;Ifs0DD;Eev0DD;IACE,qBAAA;Ify0DD;Ee10DD;IACE,qBAAA;If40DD;Ee70DD;IACE,YAAA;If+0DD;Eeh1DD;IACE,qBAAA;Ifk1DD;Een1DD;IACE,qBAAA;Ifq1DD;Eet1DD;IACE,YAAA;Ifw1DD;Eez1DD;IACE,qBAAA;If21DD;Ee51DD;IACE,qBAAA;If81DD;Ee/1DD;IACE,YAAA;Ifi2DD;Eel2DD;IACE,qBAAA;Ifo2DD;Eer2DD;IACE,oBAAA;Ifu2DD;Een2DD;IACE,aAAA;Ifq2DD;Eer3DD;IACE,YAAA;Ifu3DD;Eex3DD;IACE,oBAAA;If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","file":"bootstrap.css","sourcesContent":["/*! normalize.css v3.0.2 | MIT License | git.io/normalize */\nhtml {\n font-family: sans-serif;\n -ms-text-size-adjust: 100%;\n -webkit-text-size-adjust: 100%;\n}\nbody {\n margin: 0;\n}\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nmain,\nmenu,\nnav,\nsection,\nsummary {\n display: block;\n}\naudio,\ncanvas,\nprogress,\nvideo {\n display: inline-block;\n vertical-align: baseline;\n}\naudio:not([controls]) {\n display: none;\n height: 0;\n}\n[hidden],\ntemplate {\n display: none;\n}\na {\n background-color: transparent;\n}\na:active,\na:hover {\n outline: 0;\n}\nabbr[title] {\n border-bottom: 1px dotted;\n}\nb,\nstrong {\n font-weight: bold;\n}\ndfn {\n font-style: italic;\n}\nh1 {\n font-size: 2em;\n margin: 0.67em 0;\n}\nmark {\n background: #ff0;\n color: #000;\n}\nsmall {\n font-size: 80%;\n}\nsub,\nsup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n}\nsup {\n top: -0.5em;\n}\nsub {\n bottom: -0.25em;\n}\nimg {\n border: 0;\n}\nsvg:not(:root) {\n overflow: hidden;\n}\nfigure {\n margin: 1em 40px;\n}\nhr {\n -moz-box-sizing: content-box;\n box-sizing: content-box;\n height: 0;\n}\npre {\n overflow: auto;\n}\ncode,\nkbd,\npre,\nsamp {\n font-family: monospace, monospace;\n font-size: 1em;\n}\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n color: inherit;\n font: inherit;\n margin: 0;\n}\nbutton {\n overflow: visible;\n}\nbutton,\nselect {\n text-transform: none;\n}\nbutton,\nhtml input[type=\"button\"],\ninput[type=\"reset\"],\ninput[type=\"submit\"] {\n -webkit-appearance: button;\n cursor: pointer;\n}\nbutton[disabled],\nhtml input[disabled] {\n cursor: default;\n}\nbutton::-moz-focus-inner,\ninput::-moz-focus-inner {\n border: 0;\n padding: 0;\n}\ninput {\n line-height: normal;\n}\ninput[type=\"checkbox\"],\ninput[type=\"radio\"] {\n box-sizing: border-box;\n padding: 0;\n}\ninput[type=\"number\"]::-webkit-inner-spin-button,\ninput[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\ninput[type=\"search\"] {\n -webkit-appearance: textfield;\n -moz-box-sizing: content-box;\n -webkit-box-sizing: content-box;\n box-sizing: content-box;\n}\ninput[type=\"search\"]::-webkit-search-cancel-button,\ninput[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\nfieldset {\n border: 1px solid #c0c0c0;\n margin: 0 2px;\n padding: 0.35em 0.625em 0.75em;\n}\nlegend {\n border: 0;\n padding: 0;\n}\ntextarea {\n overflow: auto;\n}\noptgroup {\n font-weight: bold;\n}\ntable {\n border-collapse: collapse;\n border-spacing: 0;\n}\ntd,\nth {\n padding: 0;\n}\n/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */\n@media print {\n *,\n *:before,\n *:after {\n background: transparent !important;\n color: #000 !important;\n box-shadow: none !important;\n text-shadow: none !important;\n }\n a,\n a:visited {\n text-decoration: underline;\n }\n a[href]:after {\n content: \" (\" attr(href) \")\";\n }\n abbr[title]:after {\n content: \" (\" attr(title) \")\";\n }\n a[href^=\"#\"]:after,\n a[href^=\"javascript:\"]:after {\n content: \"\";\n }\n pre,\n blockquote {\n border: 1px solid #999;\n page-break-inside: avoid;\n }\n thead {\n display: table-header-group;\n }\n tr,\n img {\n page-break-inside: avoid;\n }\n img {\n max-width: 100% !important;\n }\n p,\n h2,\n h3 {\n orphans: 3;\n widows: 3;\n }\n h2,\n h3 {\n page-break-after: avoid;\n }\n select {\n background: #fff !important;\n }\n .navbar {\n display: none;\n }\n .btn > .caret,\n .dropup > .btn > .caret {\n border-top-color: #000 !important;\n }\n .label {\n border: 1px solid #000;\n }\n .table {\n border-collapse: collapse !important;\n }\n .table td,\n .table th {\n background-color: #fff !important;\n }\n .table-bordered th,\n .table-bordered td {\n border: 1px solid #ddd !important;\n }\n}\n@font-face {\n font-family: 'Glyphicons Halflings';\n src: url('../fonts/glyphicons-halflings-regular.eot');\n src: url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'), url('../fonts/glyphicons-halflings-regular.woff') format('woff'), url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'), url('../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular') format('svg');\n}\n.glyphicon {\n position: relative;\n top: 1px;\n display: inline-block;\n font-family: 'Glyphicons Halflings';\n font-style: normal;\n font-weight: normal;\n line-height: 1;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n}\n.glyphicon-asterisk:before {\n content: \"\\2a\";\n}\n.glyphicon-plus:before {\n content: \"\\2b\";\n}\n.glyphicon-euro:before,\n.glyphicon-eur:before {\n content: \"\\20ac\";\n}\n.glyphicon-minus:before {\n content: \"\\2212\";\n}\n.glyphicon-cloud:before {\n content: \"\\2601\";\n}\n.glyphicon-envelope:before {\n content: \"\\2709\";\n}\n.glyphicon-pencil:before {\n content: \"\\270f\";\n}\n.glyphicon-glass:before {\n content: \"\\e001\";\n}\n.glyphicon-music:before {\n content: \"\\e002\";\n}\n.glyphicon-search:before {\n content: \"\\e003\";\n}\n.glyphicon-heart:before {\n content: \"\\e005\";\n}\n.glyphicon-star:before {\n content: \"\\e006\";\n}\n.glyphicon-star-empty:before {\n content: \"\\e007\";\n}\n.glyphicon-user:before {\n content: \"\\e008\";\n}\n.glyphicon-film:before {\n content: \"\\e009\";\n}\n.glyphicon-th-large:before {\n content: \"\\e010\";\n}\n.glyphicon-th:before {\n content: \"\\e011\";\n}\n.glyphicon-th-list:before {\n content: \"\\e012\";\n}\n.glyphicon-ok:before {\n content: \"\\e013\";\n}\n.glyphicon-remove:before {\n content: \"\\e014\";\n}\n.glyphicon-zoom-in:before {\n content: \"\\e015\";\n}\n.glyphicon-zoom-out:before {\n content: \"\\e016\";\n}\n.glyphicon-off:before {\n content: \"\\e017\";\n}\n.glyphicon-signal:before {\n content: \"\\e018\";\n}\n.glyphicon-cog:before {\n content: \"\\e019\";\n}\n.glyphicon-trash:before {\n content: \"\\e020\";\n}\n.glyphicon-home:before {\n content: \"\\e021\";\n}\n.glyphicon-file:before {\n content: \"\\e022\";\n}\n.glyphicon-time:before {\n content: \"\\e023\";\n}\n.glyphicon-road:before {\n content: \"\\e024\";\n}\n.glyphicon-download-alt:before {\n content: \"\\e025\";\n}\n.glyphicon-download:before {\n content: \"\\e026\";\n}\n.glyphicon-upload:before {\n content: \"\\e027\";\n}\n.glyphicon-inbox:before {\n content: \"\\e028\";\n}\n.glyphicon-play-circle:before {\n content: \"\\e029\";\n}\n.glyphicon-repeat:before {\n content: \"\\e030\";\n}\n.glyphicon-refresh:before {\n content: \"\\e031\";\n}\n.glyphicon-list-alt:before {\n content: \"\\e032\";\n}\n.glyphicon-lock:before {\n content: \"\\e033\";\n}\n.glyphicon-flag:before {\n content: \"\\e034\";\n}\n.glyphicon-headphones:before {\n content: \"\\e035\";\n}\n.glyphicon-volume-off:before {\n content: \"\\e036\";\n}\n.glyphicon-volume-down:before {\n content: \"\\e037\";\n}\n.glyphicon-volume-up:before {\n content: \"\\e038\";\n}\n.glyphicon-qrcode:before {\n content: \"\\e039\";\n}\n.glyphicon-barcode:before {\n content: \"\\e040\";\n}\n.glyphicon-tag:before {\n content: \"\\e041\";\n}\n.glyphicon-tags:before {\n content: \"\\e042\";\n}\n.glyphicon-book:before {\n content: \"\\e043\";\n}\n.glyphicon-bookmark:before {\n content: \"\\e044\";\n}\n.glyphicon-print:before {\n content: \"\\e045\";\n}\n.glyphicon-camera:before {\n content: \"\\e046\";\n}\n.glyphicon-font:before {\n content: \"\\e047\";\n}\n.glyphicon-bold:before {\n content: \"\\e048\";\n}\n.glyphicon-italic:before {\n content: \"\\e049\";\n}\n.glyphicon-text-height:before {\n content: \"\\e050\";\n}\n.glyphicon-text-width:before {\n content: \"\\e051\";\n}\n.glyphicon-align-left:before {\n content: \"\\e052\";\n}\n.glyphicon-align-center:before {\n content: \"\\e053\";\n}\n.glyphicon-align-right:before {\n content: \"\\e054\";\n}\n.glyphicon-align-justify:before {\n content: \"\\e055\";\n}\n.glyphicon-list:before {\n content: \"\\e056\";\n}\n.glyphicon-indent-left:before {\n content: \"\\e057\";\n}\n.glyphicon-indent-right:before {\n content: \"\\e058\";\n}\n.glyphicon-facetime-video:before {\n content: \"\\e059\";\n}\n.glyphicon-picture:before {\n content: \"\\e060\";\n}\n.glyphicon-map-marker:before {\n content: \"\\e062\";\n}\n.glyphicon-adjust:before {\n content: \"\\e063\";\n}\n.glyphicon-tint:before {\n content: \"\\e064\";\n}\n.glyphicon-edit:before {\n content: \"\\e065\";\n}\n.glyphicon-share:before {\n content: \"\\e066\";\n}\n.glyphicon-check:before {\n content: \"\\e067\";\n}\n.glyphicon-move:before {\n content: \"\\e068\";\n}\n.glyphicon-step-backward:before {\n content: \"\\e069\";\n}\n.glyphicon-fast-backward:before {\n content: \"\\e070\";\n}\n.glyphicon-backward:before {\n content: \"\\e071\";\n}\n.glyphicon-play:before {\n content: \"\\e072\";\n}\n.glyphicon-pause:before {\n content: \"\\e073\";\n}\n.glyphicon-stop:before {\n content: \"\\e074\";\n}\n.glyphicon-forward:before {\n content: \"\\e075\";\n}\n.glyphicon-fast-forward:before {\n content: \"\\e076\";\n}\n.glyphicon-step-forward:before {\n content: \"\\e077\";\n}\n.glyphicon-eject:before {\n content: \"\\e078\";\n}\n.glyphicon-chevron-left:before {\n content: \"\\e079\";\n}\n.glyphicon-chevron-right:before {\n content: \"\\e080\";\n}\n.glyphicon-plus-sign:before {\n content: \"\\e081\";\n}\n.glyphicon-minus-sign:before {\n content: \"\\e082\";\n}\n.glyphicon-remove-sign:before {\n content: \"\\e083\";\n}\n.glyphicon-ok-sign:before {\n content: \"\\e084\";\n}\n.glyphicon-question-sign:before {\n content: \"\\e085\";\n}\n.glyphicon-info-sign:before {\n content: \"\\e086\";\n}\n.glyphicon-screenshot:before {\n content: \"\\e087\";\n}\n.glyphicon-remove-circle:before {\n content: \"\\e088\";\n}\n.glyphicon-ok-circle:before {\n content: \"\\e089\";\n}\n.glyphicon-ban-circle:before {\n content: \"\\e090\";\n}\n.glyphicon-arrow-left:before {\n content: \"\\e091\";\n}\n.glyphicon-arrow-right:before {\n content: \"\\e092\";\n}\n.glyphicon-arrow-up:before {\n content: \"\\e093\";\n}\n.glyphicon-arrow-down:before {\n content: \"\\e094\";\n}\n.glyphicon-share-alt:before {\n content: \"\\e095\";\n}\n.glyphicon-resize-full:before {\n content: \"\\e096\";\n}\n.glyphicon-resize-small:before {\n content: \"\\e097\";\n}\n.glyphicon-exclamation-sign:before {\n content: \"\\e101\";\n}\n.glyphicon-gift:before {\n content: \"\\e102\";\n}\n.glyphicon-leaf:before {\n content: \"\\e103\";\n}\n.glyphicon-fire:before {\n content: \"\\e104\";\n}\n.glyphicon-eye-open:before {\n content: \"\\e105\";\n}\n.glyphicon-eye-close:before {\n content: \"\\e106\";\n}\n.glyphicon-warning-sign:before {\n content: \"\\e107\";\n}\n.glyphicon-plane:before {\n content: \"\\e108\";\n}\n.glyphicon-calendar:before {\n content: \"\\e109\";\n}\n.glyphicon-random:before {\n content: \"\\e110\";\n}\n.glyphicon-comment:before {\n content: \"\\e111\";\n}\n.glyphicon-magnet:before {\n content: \"\\e112\";\n}\n.glyphicon-chevron-up:before {\n content: \"\\e113\";\n}\n.glyphicon-chevron-down:before {\n content: \"\\e114\";\n}\n.glyphicon-retweet:before {\n content: \"\\e115\";\n}\n.glyphicon-shopping-cart:before {\n content: \"\\e116\";\n}\n.glyphicon-folder-close:before {\n content: \"\\e117\";\n}\n.glyphicon-folder-open:before {\n content: \"\\e118\";\n}\n.glyphicon-resize-vertical:before {\n content: \"\\e119\";\n}\n.glyphicon-resize-horizontal:before {\n content: \"\\e120\";\n}\n.glyphicon-hdd:before {\n content: \"\\e121\";\n}\n.glyphicon-bullhorn:before {\n content: \"\\e122\";\n}\n.glyphicon-bell:before {\n content: \"\\e123\";\n}\n.glyphicon-certificate:before {\n content: \"\\e124\";\n}\n.glyphicon-thumbs-up:before {\n content: \"\\e125\";\n}\n.glyphicon-thumbs-down:before {\n content: \"\\e126\";\n}\n.glyphicon-hand-right:before {\n content: \"\\e127\";\n}\n.glyphicon-hand-left:before {\n content: \"\\e128\";\n}\n.glyphicon-hand-up:before {\n content: \"\\e129\";\n}\n.glyphicon-hand-down:before {\n content: \"\\e130\";\n}\n.glyphicon-circle-arrow-right:before {\n content: \"\\e131\";\n}\n.glyphicon-circle-arrow-left:before {\n content: \"\\e132\";\n}\n.glyphicon-circle-arrow-up:before {\n content: \"\\e133\";\n}\n.glyphicon-circle-arrow-down:before {\n content: \"\\e134\";\n}\n.glyphicon-globe:before {\n content: \"\\e135\";\n}\n.glyphicon-wrench:before {\n content: \"\\e136\";\n}\n.glyphicon-tasks:before {\n content: \"\\e137\";\n}\n.glyphicon-filter:before {\n content: \"\\e138\";\n}\n.glyphicon-briefcase:before {\n content: \"\\e139\";\n}\n.glyphicon-fullscreen:before {\n content: \"\\e140\";\n}\n.glyphicon-dashboard:before {\n content: \"\\e141\";\n}\n.glyphicon-paperclip:before {\n content: \"\\e142\";\n}\n.glyphicon-heart-empty:before {\n content: \"\\e143\";\n}\n.glyphicon-link:before {\n content: \"\\e144\";\n}\n.glyphicon-phone:before {\n content: \"\\e145\";\n}\n.glyphicon-pushpin:before {\n content: \"\\e146\";\n}\n.glyphicon-usd:before {\n content: \"\\e148\";\n}\n.glyphicon-gbp:before {\n content: \"\\e149\";\n}\n.glyphicon-sort:before {\n content: \"\\e150\";\n}\n.glyphicon-sort-by-alphabet:before {\n content: \"\\e151\";\n}\n.glyphicon-sort-by-alphabet-alt:before {\n content: \"\\e152\";\n}\n.glyphicon-sort-by-order:before {\n content: \"\\e153\";\n}\n.glyphicon-sort-by-order-alt:before {\n content: \"\\e154\";\n}\n.glyphicon-sort-by-attributes:before {\n content: \"\\e155\";\n}\n.glyphicon-sort-by-attributes-alt:before {\n content: \"\\e156\";\n}\n.glyphicon-unchecked:before {\n content: \"\\e157\";\n}\n.glyphicon-expand:before {\n content: \"\\e158\";\n}\n.glyphicon-collapse-down:before {\n content: \"\\e159\";\n}\n.glyphicon-collapse-up:before {\n content: \"\\e160\";\n}\n.glyphicon-log-in:before {\n content: \"\\e161\";\n}\n.glyphicon-flash:before {\n content: \"\\e162\";\n}\n.glyphicon-log-out:before {\n content: \"\\e163\";\n}\n.glyphicon-new-window:before {\n content: \"\\e164\";\n}\n.glyphicon-record:before {\n content: \"\\e165\";\n}\n.glyphicon-save:before {\n content: \"\\e166\";\n}\n.glyphicon-open:before {\n content: \"\\e167\";\n}\n.glyphicon-saved:before {\n content: \"\\e168\";\n}\n.glyphicon-import:before {\n content: \"\\e169\";\n}\n.glyphicon-export:before {\n content: \"\\e170\";\n}\n.glyphicon-send:before {\n content: \"\\e171\";\n}\n.glyphicon-floppy-disk:before {\n content: \"\\e172\";\n}\n.glyphicon-floppy-saved:before {\n content: \"\\e173\";\n}\n.glyphicon-floppy-remove:before {\n content: \"\\e174\";\n}\n.glyphicon-floppy-save:before {\n content: \"\\e175\";\n}\n.glyphicon-floppy-open:before {\n content: \"\\e176\";\n}\n.glyphicon-credit-card:before {\n content: \"\\e177\";\n}\n.glyphicon-transfer:before {\n content: \"\\e178\";\n}\n.glyphicon-cutlery:before {\n content: \"\\e179\";\n}\n.glyphicon-header:before {\n content: \"\\e180\";\n}\n.glyphicon-compressed:before {\n content: \"\\e181\";\n}\n.glyphicon-earphone:before {\n content: \"\\e182\";\n}\n.glyphicon-phone-alt:before {\n content: \"\\e183\";\n}\n.glyphicon-tower:before {\n content: \"\\e184\";\n}\n.glyphicon-stats:before {\n content: \"\\e185\";\n}\n.glyphicon-sd-video:before {\n content: \"\\e186\";\n}\n.glyphicon-hd-video:before {\n content: \"\\e187\";\n}\n.glyphicon-subtitles:before {\n content: \"\\e188\";\n}\n.glyphicon-sound-stereo:before {\n content: \"\\e189\";\n}\n.glyphicon-sound-dolby:before {\n content: \"\\e190\";\n}\n.glyphicon-sound-5-1:before {\n content: \"\\e191\";\n}\n.glyphicon-sound-6-1:before {\n content: \"\\e192\";\n}\n.glyphicon-sound-7-1:before {\n content: \"\\e193\";\n}\n.glyphicon-copyright-mark:before {\n content: \"\\e194\";\n}\n.glyphicon-registration-mark:before {\n content: \"\\e195\";\n}\n.glyphicon-cloud-download:before {\n content: \"\\e197\";\n}\n.glyphicon-cloud-upload:before {\n content: \"\\e198\";\n}\n.glyphicon-tree-conifer:before {\n content: \"\\e199\";\n}\n.glyphicon-tree-deciduous:before {\n content: \"\\e200\";\n}\n* {\n -webkit-box-sizing: border-box;\n -moz-box-sizing: border-box;\n box-sizing: border-box;\n}\n*:before,\n*:after {\n -webkit-box-sizing: border-box;\n -moz-box-sizing: border-box;\n box-sizing: border-box;\n}\nhtml {\n font-size: 10px;\n -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n}\nbody {\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n font-size: 14px;\n line-height: 1.42857143;\n color: #333333;\n background-color: #ffffff;\n}\ninput,\nbutton,\nselect,\ntextarea {\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n}\na {\n color: #428bca;\n text-decoration: none;\n}\na:hover,\na:focus {\n color: #2a6496;\n text-decoration: underline;\n}\na:focus {\n outline: thin dotted;\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px;\n}\nfigure {\n margin: 0;\n}\nimg {\n vertical-align: middle;\n}\n.img-responsive,\n.thumbnail > img,\n.thumbnail a > img,\n.carousel-inner > .item > img,\n.carousel-inner > .item > a > img {\n display: block;\n max-width: 100%;\n height: auto;\n}\n.img-rounded {\n border-radius: 6px;\n}\n.img-thumbnail {\n padding: 4px;\n line-height: 1.42857143;\n background-color: #ffffff;\n border: 1px solid #dddddd;\n border-radius: 4px;\n -webkit-transition: all 0.2s ease-in-out;\n -o-transition: all 0.2s ease-in-out;\n transition: all 0.2s ease-in-out;\n display: inline-block;\n max-width: 100%;\n height: auto;\n}\n.img-circle {\n border-radius: 50%;\n}\nhr {\n margin-top: 20px;\n margin-bottom: 20px;\n border: 0;\n border-top: 1px solid #eeeeee;\n}\n.sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n margin: -1px;\n padding: 0;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n border: 0;\n}\n.sr-only-focusable:active,\n.sr-only-focusable:focus {\n position: static;\n width: auto;\n height: auto;\n margin: 0;\n overflow: visible;\n clip: auto;\n}\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\n.h1,\n.h2,\n.h3,\n.h4,\n.h5,\n.h6 {\n font-family: inherit;\n font-weight: 500;\n line-height: 1.1;\n color: inherit;\n}\nh1 small,\nh2 small,\nh3 small,\nh4 small,\nh5 small,\nh6 small,\n.h1 small,\n.h2 small,\n.h3 small,\n.h4 small,\n.h5 small,\n.h6 small,\nh1 .small,\nh2 .small,\nh3 .small,\nh4 .small,\nh5 .small,\nh6 .small,\n.h1 .small,\n.h2 .small,\n.h3 .small,\n.h4 .small,\n.h5 .small,\n.h6 .small {\n font-weight: normal;\n line-height: 1;\n color: #777777;\n}\nh1,\n.h1,\nh2,\n.h2,\nh3,\n.h3 {\n margin-top: 20px;\n margin-bottom: 10px;\n}\nh1 small,\n.h1 small,\nh2 small,\n.h2 small,\nh3 small,\n.h3 small,\nh1 .small,\n.h1 .small,\nh2 .small,\n.h2 .small,\nh3 .small,\n.h3 .small {\n font-size: 65%;\n}\nh4,\n.h4,\nh5,\n.h5,\nh6,\n.h6 {\n margin-top: 10px;\n margin-bottom: 10px;\n}\nh4 small,\n.h4 small,\nh5 small,\n.h5 small,\nh6 small,\n.h6 small,\nh4 .small,\n.h4 .small,\nh5 .small,\n.h5 .small,\nh6 .small,\n.h6 .small {\n font-size: 75%;\n}\nh1,\n.h1 {\n font-size: 36px;\n}\nh2,\n.h2 {\n font-size: 30px;\n}\nh3,\n.h3 {\n font-size: 24px;\n}\nh4,\n.h4 {\n font-size: 18px;\n}\nh5,\n.h5 {\n font-size: 14px;\n}\nh6,\n.h6 {\n font-size: 12px;\n}\np {\n margin: 0 0 10px;\n}\n.lead {\n margin-bottom: 20px;\n font-size: 16px;\n font-weight: 300;\n line-height: 1.4;\n}\n@media (min-width: 768px) {\n .lead {\n font-size: 21px;\n }\n}\nsmall,\n.small {\n font-size: 85%;\n}\nmark,\n.mark {\n background-color: #fcf8e3;\n padding: .2em;\n}\n.text-left {\n text-align: left;\n}\n.text-right {\n text-align: right;\n}\n.text-center {\n text-align: center;\n}\n.text-justify {\n text-align: justify;\n}\n.text-nowrap {\n white-space: nowrap;\n}\n.text-lowercase {\n text-transform: lowercase;\n}\n.text-uppercase {\n text-transform: uppercase;\n}\n.text-capitalize {\n text-transform: capitalize;\n}\n.text-muted {\n color: #777777;\n}\n.text-primary {\n color: #428bca;\n}\na.text-primary:hover {\n color: #3071a9;\n}\n.text-success {\n color: #3c763d;\n}\na.text-success:hover {\n color: #2b542c;\n}\n.text-info {\n color: #31708f;\n}\na.text-info:hover {\n color: #245269;\n}\n.text-warning {\n color: #8a6d3b;\n}\na.text-warning:hover {\n color: #66512c;\n}\n.text-danger {\n color: #a94442;\n}\na.text-danger:hover {\n color: #843534;\n}\n.bg-primary {\n color: #fff;\n background-color: #428bca;\n}\na.bg-primary:hover {\n background-color: #3071a9;\n}\n.bg-success {\n background-color: #dff0d8;\n}\na.bg-success:hover {\n background-color: #c1e2b3;\n}\n.bg-info {\n background-color: #d9edf7;\n}\na.bg-info:hover {\n background-color: #afd9ee;\n}\n.bg-warning {\n background-color: #fcf8e3;\n}\na.bg-warning:hover {\n background-color: #f7ecb5;\n}\n.bg-danger {\n background-color: #f2dede;\n}\na.bg-danger:hover {\n background-color: #e4b9b9;\n}\n.page-header {\n padding-bottom: 9px;\n margin: 40px 0 20px;\n border-bottom: 1px solid #eeeeee;\n}\nul,\nol {\n margin-top: 0;\n margin-bottom: 10px;\n}\nul ul,\nol ul,\nul ol,\nol ol {\n margin-bottom: 0;\n}\n.list-unstyled {\n padding-left: 0;\n list-style: none;\n}\n.list-inline {\n padding-left: 0;\n list-style: none;\n margin-left: -5px;\n}\n.list-inline > li {\n display: inline-block;\n padding-left: 5px;\n padding-right: 5px;\n}\ndl {\n margin-top: 0;\n margin-bottom: 20px;\n}\ndt,\ndd {\n line-height: 1.42857143;\n}\ndt {\n font-weight: bold;\n}\ndd {\n margin-left: 0;\n}\n@media (min-width: 768px) {\n .dl-horizontal dt {\n float: left;\n width: 160px;\n clear: left;\n text-align: right;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n .dl-horizontal dd {\n margin-left: 180px;\n }\n}\nabbr[title],\nabbr[data-original-title] {\n cursor: help;\n border-bottom: 1px dotted #777777;\n}\n.initialism {\n font-size: 90%;\n text-transform: uppercase;\n}\nblockquote {\n padding: 10px 20px;\n margin: 0 0 20px;\n font-size: 17.5px;\n border-left: 5px solid #eeeeee;\n}\nblockquote p:last-child,\nblockquote ul:last-child,\nblockquote ol:last-child {\n margin-bottom: 0;\n}\nblockquote footer,\nblockquote small,\nblockquote .small {\n display: block;\n font-size: 80%;\n line-height: 1.42857143;\n color: #777777;\n}\nblockquote footer:before,\nblockquote small:before,\nblockquote .small:before {\n content: '\\2014 \\00A0';\n}\n.blockquote-reverse,\nblockquote.pull-right {\n padding-right: 15px;\n padding-left: 0;\n border-right: 5px solid #eeeeee;\n border-left: 0;\n text-align: right;\n}\n.blockquote-reverse footer:before,\nblockquote.pull-right footer:before,\n.blockquote-reverse small:before,\nblockquote.pull-right small:before,\n.blockquote-reverse .small:before,\nblockquote.pull-right .small:before {\n content: '';\n}\n.blockquote-reverse footer:after,\nblockquote.pull-right footer:after,\n.blockquote-reverse small:after,\nblockquote.pull-right small:after,\n.blockquote-reverse .small:after,\nblockquote.pull-right .small:after {\n content: '\\00A0 \\2014';\n}\naddress {\n margin-bottom: 20px;\n font-style: normal;\n line-height: 1.42857143;\n}\ncode,\nkbd,\npre,\nsamp {\n font-family: Menlo, Monaco, Consolas, \"Courier New\", monospace;\n}\ncode {\n padding: 2px 4px;\n font-size: 90%;\n color: #c7254e;\n background-color: #f9f2f4;\n border-radius: 4px;\n}\nkbd {\n padding: 2px 4px;\n font-size: 90%;\n color: #ffffff;\n background-color: #333333;\n border-radius: 3px;\n box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.25);\n}\nkbd kbd {\n padding: 0;\n font-size: 100%;\n font-weight: bold;\n box-shadow: none;\n}\npre {\n display: block;\n padding: 9.5px;\n margin: 0 0 10px;\n font-size: 13px;\n line-height: 1.42857143;\n word-break: break-all;\n word-wrap: break-word;\n color: #333333;\n background-color: #f5f5f5;\n border: 1px solid #cccccc;\n border-radius: 4px;\n}\npre code {\n padding: 0;\n font-size: inherit;\n color: inherit;\n white-space: pre-wrap;\n background-color: transparent;\n border-radius: 0;\n}\n.pre-scrollable {\n max-height: 340px;\n overflow-y: scroll;\n}\n.container {\n margin-right: auto;\n margin-left: auto;\n padding-left: 15px;\n padding-right: 15px;\n}\n@media (min-width: 768px) {\n .container {\n width: 750px;\n }\n}\n@media (min-width: 992px) {\n .container {\n width: 970px;\n }\n}\n@media (min-width: 1200px) {\n .container {\n width: 1170px;\n }\n}\n.container-fluid {\n margin-right: auto;\n margin-left: auto;\n padding-left: 15px;\n padding-right: 15px;\n}\n.row {\n margin-left: -15px;\n margin-right: -15px;\n}\n.col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12 {\n position: relative;\n min-height: 1px;\n padding-left: 15px;\n padding-right: 15px;\n}\n.col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12 {\n float: left;\n}\n.col-xs-12 {\n width: 100%;\n}\n.col-xs-11 {\n width: 91.66666667%;\n}\n.col-xs-10 {\n width: 83.33333333%;\n}\n.col-xs-9 {\n width: 75%;\n}\n.col-xs-8 {\n width: 66.66666667%;\n}\n.col-xs-7 {\n width: 58.33333333%;\n}\n.col-xs-6 {\n width: 50%;\n}\n.col-xs-5 {\n width: 41.66666667%;\n}\n.col-xs-4 {\n width: 33.33333333%;\n}\n.col-xs-3 {\n width: 25%;\n}\n.col-xs-2 {\n width: 16.66666667%;\n}\n.col-xs-1 {\n width: 8.33333333%;\n}\n.col-xs-pull-12 {\n right: 100%;\n}\n.col-xs-pull-11 {\n right: 91.66666667%;\n}\n.col-xs-pull-10 {\n right: 83.33333333%;\n}\n.col-xs-pull-9 {\n right: 75%;\n}\n.col-xs-pull-8 {\n right: 66.66666667%;\n}\n.col-xs-pull-7 {\n right: 58.33333333%;\n}\n.col-xs-pull-6 {\n right: 50%;\n}\n.col-xs-pull-5 {\n right: 41.66666667%;\n}\n.col-xs-pull-4 {\n right: 33.33333333%;\n}\n.col-xs-pull-3 {\n right: 25%;\n}\n.col-xs-pull-2 {\n right: 16.66666667%;\n}\n.col-xs-pull-1 {\n right: 8.33333333%;\n}\n.col-xs-pull-0 {\n right: auto;\n}\n.col-xs-push-12 {\n left: 100%;\n}\n.col-xs-push-11 {\n left: 91.66666667%;\n}\n.col-xs-push-10 {\n left: 83.33333333%;\n}\n.col-xs-push-9 {\n left: 75%;\n}\n.col-xs-push-8 {\n left: 66.66666667%;\n}\n.col-xs-push-7 {\n left: 58.33333333%;\n}\n.col-xs-push-6 {\n left: 50%;\n}\n.col-xs-push-5 {\n left: 41.66666667%;\n}\n.col-xs-push-4 {\n left: 33.33333333%;\n}\n.col-xs-push-3 {\n left: 25%;\n}\n.col-xs-push-2 {\n left: 16.66666667%;\n}\n.col-xs-push-1 {\n left: 8.33333333%;\n}\n.col-xs-push-0 {\n left: auto;\n}\n.col-xs-offset-12 {\n margin-left: 100%;\n}\n.col-xs-offset-11 {\n margin-left: 91.66666667%;\n}\n.col-xs-offset-10 {\n margin-left: 83.33333333%;\n}\n.col-xs-offset-9 {\n margin-left: 75%;\n}\n.col-xs-offset-8 {\n margin-left: 66.66666667%;\n}\n.col-xs-offset-7 {\n margin-left: 58.33333333%;\n}\n.col-xs-offset-6 {\n margin-left: 50%;\n}\n.col-xs-offset-5 {\n margin-left: 41.66666667%;\n}\n.col-xs-offset-4 {\n margin-left: 33.33333333%;\n}\n.col-xs-offset-3 {\n margin-left: 25%;\n}\n.col-xs-offset-2 {\n margin-left: 16.66666667%;\n}\n.col-xs-offset-1 {\n margin-left: 8.33333333%;\n}\n.col-xs-offset-0 {\n margin-left: 0%;\n}\n@media (min-width: 768px) {\n .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12 {\n float: left;\n }\n .col-sm-12 {\n width: 100%;\n }\n .col-sm-11 {\n width: 91.66666667%;\n }\n .col-sm-10 {\n width: 83.33333333%;\n }\n .col-sm-9 {\n width: 75%;\n }\n .col-sm-8 {\n width: 66.66666667%;\n }\n .col-sm-7 {\n width: 58.33333333%;\n }\n .col-sm-6 {\n width: 50%;\n }\n .col-sm-5 {\n width: 41.66666667%;\n }\n .col-sm-4 {\n width: 33.33333333%;\n }\n .col-sm-3 {\n width: 25%;\n }\n .col-sm-2 {\n width: 16.66666667%;\n }\n .col-sm-1 {\n width: 8.33333333%;\n }\n .col-sm-pull-12 {\n right: 100%;\n }\n .col-sm-pull-11 {\n right: 91.66666667%;\n }\n .col-sm-pull-10 {\n right: 83.33333333%;\n }\n .col-sm-pull-9 {\n right: 75%;\n }\n .col-sm-pull-8 {\n right: 66.66666667%;\n }\n .col-sm-pull-7 {\n right: 58.33333333%;\n }\n .col-sm-pull-6 {\n right: 50%;\n }\n .col-sm-pull-5 {\n right: 41.66666667%;\n }\n .col-sm-pull-4 {\n right: 33.33333333%;\n }\n .col-sm-pull-3 {\n right: 25%;\n }\n .col-sm-pull-2 {\n right: 16.66666667%;\n }\n .col-sm-pull-1 {\n right: 8.33333333%;\n }\n .col-sm-pull-0 {\n right: auto;\n }\n .col-sm-push-12 {\n left: 100%;\n }\n .col-sm-push-11 {\n left: 91.66666667%;\n }\n .col-sm-push-10 {\n left: 83.33333333%;\n }\n .col-sm-push-9 {\n left: 75%;\n }\n .col-sm-push-8 {\n left: 66.66666667%;\n }\n .col-sm-push-7 {\n left: 58.33333333%;\n }\n .col-sm-push-6 {\n left: 50%;\n }\n .col-sm-push-5 {\n left: 41.66666667%;\n }\n .col-sm-push-4 {\n left: 33.33333333%;\n }\n .col-sm-push-3 {\n left: 25%;\n }\n .col-sm-push-2 {\n left: 16.66666667%;\n }\n .col-sm-push-1 {\n left: 8.33333333%;\n }\n .col-sm-push-0 {\n left: auto;\n }\n .col-sm-offset-12 {\n margin-left: 100%;\n }\n .col-sm-offset-11 {\n margin-left: 91.66666667%;\n }\n .col-sm-offset-10 {\n margin-left: 83.33333333%;\n }\n .col-sm-offset-9 {\n margin-left: 75%;\n }\n .col-sm-offset-8 {\n margin-left: 66.66666667%;\n }\n .col-sm-offset-7 {\n margin-left: 58.33333333%;\n }\n .col-sm-offset-6 {\n margin-left: 50%;\n }\n .col-sm-offset-5 {\n margin-left: 41.66666667%;\n }\n .col-sm-offset-4 {\n margin-left: 33.33333333%;\n }\n .col-sm-offset-3 {\n margin-left: 25%;\n }\n .col-sm-offset-2 {\n margin-left: 16.66666667%;\n }\n .col-sm-offset-1 {\n margin-left: 8.33333333%;\n }\n .col-sm-offset-0 {\n margin-left: 0%;\n }\n}\n@media (min-width: 992px) {\n .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12 {\n float: left;\n }\n .col-md-12 {\n width: 100%;\n }\n .col-md-11 {\n width: 91.66666667%;\n }\n .col-md-10 {\n width: 83.33333333%;\n }\n .col-md-9 {\n width: 75%;\n }\n .col-md-8 {\n width: 66.66666667%;\n }\n .col-md-7 {\n width: 58.33333333%;\n }\n .col-md-6 {\n width: 50%;\n }\n .col-md-5 {\n width: 41.66666667%;\n }\n .col-md-4 {\n width: 33.33333333%;\n }\n .col-md-3 {\n width: 25%;\n }\n .col-md-2 {\n width: 16.66666667%;\n }\n .col-md-1 {\n width: 8.33333333%;\n }\n .col-md-pull-12 {\n right: 100%;\n }\n .col-md-pull-11 {\n right: 91.66666667%;\n }\n .col-md-pull-10 {\n right: 83.33333333%;\n }\n .col-md-pull-9 {\n right: 75%;\n }\n .col-md-pull-8 {\n right: 66.66666667%;\n }\n .col-md-pull-7 {\n right: 58.33333333%;\n }\n .col-md-pull-6 {\n right: 50%;\n }\n .col-md-pull-5 {\n right: 41.66666667%;\n }\n .col-md-pull-4 {\n right: 33.33333333%;\n }\n .col-md-pull-3 {\n right: 25%;\n }\n .col-md-pull-2 {\n right: 16.66666667%;\n }\n .col-md-pull-1 {\n right: 8.33333333%;\n }\n .col-md-pull-0 {\n right: auto;\n }\n .col-md-push-12 {\n left: 100%;\n }\n .col-md-push-11 {\n left: 91.66666667%;\n }\n .col-md-push-10 {\n left: 83.33333333%;\n }\n .col-md-push-9 {\n left: 75%;\n }\n .col-md-push-8 {\n left: 66.66666667%;\n }\n .col-md-push-7 {\n left: 58.33333333%;\n }\n .col-md-push-6 {\n left: 50%;\n }\n .col-md-push-5 {\n left: 41.66666667%;\n }\n .col-md-push-4 {\n left: 33.33333333%;\n }\n .col-md-push-3 {\n left: 25%;\n }\n .col-md-push-2 {\n left: 16.66666667%;\n }\n .col-md-push-1 {\n left: 8.33333333%;\n }\n .col-md-push-0 {\n left: auto;\n }\n .col-md-offset-12 {\n margin-left: 100%;\n }\n .col-md-offset-11 {\n margin-left: 91.66666667%;\n }\n .col-md-offset-10 {\n margin-left: 83.33333333%;\n }\n .col-md-offset-9 {\n margin-left: 75%;\n }\n .col-md-offset-8 {\n margin-left: 66.66666667%;\n }\n .col-md-offset-7 {\n margin-left: 58.33333333%;\n }\n .col-md-offset-6 {\n margin-left: 50%;\n }\n .col-md-offset-5 {\n margin-left: 41.66666667%;\n }\n .col-md-offset-4 {\n margin-left: 33.33333333%;\n }\n .col-md-offset-3 {\n margin-left: 25%;\n }\n .col-md-offset-2 {\n margin-left: 16.66666667%;\n }\n .col-md-offset-1 {\n margin-left: 8.33333333%;\n }\n .col-md-offset-0 {\n margin-left: 0%;\n }\n}\n@media (min-width: 1200px) {\n .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12 {\n float: left;\n }\n .col-lg-12 {\n width: 100%;\n }\n .col-lg-11 {\n width: 91.66666667%;\n }\n .col-lg-10 {\n width: 83.33333333%;\n }\n .col-lg-9 {\n width: 75%;\n }\n .col-lg-8 {\n width: 66.66666667%;\n }\n .col-lg-7 {\n width: 58.33333333%;\n }\n .col-lg-6 {\n width: 50%;\n }\n .col-lg-5 {\n width: 41.66666667%;\n }\n .col-lg-4 {\n width: 33.33333333%;\n }\n .col-lg-3 {\n width: 25%;\n }\n .col-lg-2 {\n width: 16.66666667%;\n }\n .col-lg-1 {\n width: 8.33333333%;\n }\n .col-lg-pull-12 {\n right: 100%;\n }\n .col-lg-pull-11 {\n right: 91.66666667%;\n }\n .col-lg-pull-10 {\n right: 83.33333333%;\n }\n .col-lg-pull-9 {\n right: 75%;\n }\n .col-lg-pull-8 {\n right: 66.66666667%;\n }\n .col-lg-pull-7 {\n right: 58.33333333%;\n }\n .col-lg-pull-6 {\n right: 50%;\n }\n .col-lg-pull-5 {\n right: 41.66666667%;\n }\n .col-lg-pull-4 {\n right: 33.33333333%;\n }\n .col-lg-pull-3 {\n right: 25%;\n }\n .col-lg-pull-2 {\n right: 16.66666667%;\n }\n .col-lg-pull-1 {\n right: 8.33333333%;\n }\n .col-lg-pull-0 {\n right: auto;\n }\n .col-lg-push-12 {\n left: 100%;\n }\n .col-lg-push-11 {\n left: 91.66666667%;\n }\n .col-lg-push-10 {\n left: 83.33333333%;\n }\n .col-lg-push-9 {\n left: 75%;\n }\n .col-lg-push-8 {\n left: 66.66666667%;\n }\n .col-lg-push-7 {\n left: 58.33333333%;\n }\n .col-lg-push-6 {\n left: 50%;\n }\n .col-lg-push-5 {\n left: 41.66666667%;\n }\n .col-lg-push-4 {\n left: 33.33333333%;\n }\n .col-lg-push-3 {\n left: 25%;\n }\n .col-lg-push-2 {\n left: 16.66666667%;\n }\n .col-lg-push-1 {\n left: 8.33333333%;\n }\n .col-lg-push-0 {\n left: auto;\n }\n .col-lg-offset-12 {\n margin-left: 100%;\n }\n .col-lg-offset-11 {\n margin-left: 91.66666667%;\n }\n .col-lg-offset-10 {\n margin-left: 83.33333333%;\n }\n .col-lg-offset-9 {\n margin-left: 75%;\n }\n .col-lg-offset-8 {\n margin-left: 66.66666667%;\n }\n .col-lg-offset-7 {\n margin-left: 58.33333333%;\n }\n .col-lg-offset-6 {\n margin-left: 50%;\n }\n .col-lg-offset-5 {\n margin-left: 41.66666667%;\n }\n .col-lg-offset-4 {\n margin-left: 33.33333333%;\n }\n .col-lg-offset-3 {\n margin-left: 25%;\n }\n .col-lg-offset-2 {\n margin-left: 16.66666667%;\n }\n .col-lg-offset-1 {\n margin-left: 8.33333333%;\n }\n .col-lg-offset-0 {\n margin-left: 0%;\n }\n}\ntable {\n background-color: transparent;\n}\ncaption {\n padding-top: 8px;\n padding-bottom: 8px;\n color: #777777;\n text-align: left;\n}\nth {\n text-align: left;\n}\n.table {\n width: 100%;\n max-width: 100%;\n margin-bottom: 20px;\n}\n.table > thead > tr > th,\n.table > tbody > tr > th,\n.table > tfoot > tr > th,\n.table > thead > tr > td,\n.table > tbody > tr > td,\n.table > tfoot > tr > td {\n padding: 8px;\n line-height: 1.42857143;\n vertical-align: top;\n border-top: 1px solid #dddddd;\n}\n.table > thead > tr > th {\n vertical-align: bottom;\n border-bottom: 2px solid #dddddd;\n}\n.table > caption + thead > tr:first-child > th,\n.table > colgroup + thead > tr:first-child > th,\n.table > thead:first-child > tr:first-child > th,\n.table > caption + thead > tr:first-child > td,\n.table > colgroup + thead > tr:first-child > td,\n.table > thead:first-child > tr:first-child > td {\n border-top: 0;\n}\n.table > tbody + tbody {\n border-top: 2px solid #dddddd;\n}\n.table .table {\n background-color: #ffffff;\n}\n.table-condensed > thead > tr > th,\n.table-condensed > tbody > tr > th,\n.table-condensed > tfoot > tr > th,\n.table-condensed > thead > tr > td,\n.table-condensed > tbody > tr > td,\n.table-condensed > tfoot > tr > td {\n padding: 5px;\n}\n.table-bordered {\n border: 1px solid #dddddd;\n}\n.table-bordered > thead > tr > th,\n.table-bordered > tbody > tr > th,\n.table-bordered > tfoot > tr > th,\n.table-bordered > thead > tr > td,\n.table-bordered > tbody > tr > td,\n.table-bordered > tfoot > tr > td {\n border: 1px solid #dddddd;\n}\n.table-bordered > thead > tr > th,\n.table-bordered > thead > tr > td {\n border-bottom-width: 2px;\n}\n.table-striped > tbody > tr:nth-child(odd) {\n background-color: #f9f9f9;\n}\n.table-hover > tbody > tr:hover {\n background-color: #f5f5f5;\n}\ntable col[class*=\"col-\"] {\n position: static;\n float: none;\n display: table-column;\n}\ntable td[class*=\"col-\"],\ntable th[class*=\"col-\"] {\n position: static;\n float: none;\n display: table-cell;\n}\n.table > thead > tr > td.active,\n.table > tbody > tr > td.active,\n.table > tfoot > tr > td.active,\n.table > thead > tr > th.active,\n.table > tbody > tr > th.active,\n.table > tfoot > tr > th.active,\n.table > thead > tr.active > td,\n.table > tbody > tr.active > td,\n.table > tfoot > tr.active > td,\n.table > thead > tr.active > th,\n.table > tbody > tr.active > th,\n.table > tfoot > tr.active > th {\n background-color: #f5f5f5;\n}\n.table-hover > tbody > tr > td.active:hover,\n.table-hover > tbody > tr > th.active:hover,\n.table-hover > tbody > tr.active:hover > td,\n.table-hover > tbody > tr:hover > .active,\n.table-hover > tbody > tr.active:hover > th {\n background-color: #e8e8e8;\n}\n.table > thead > tr > td.success,\n.table > tbody > tr > td.success,\n.table > tfoot > tr > td.success,\n.table > thead > tr > th.success,\n.table > tbody > tr > th.success,\n.table > tfoot > tr > th.success,\n.table > thead > tr.success > td,\n.table > tbody > tr.success > td,\n.table > tfoot > tr.success > td,\n.table > thead > tr.success > th,\n.table > tbody > tr.success > th,\n.table > tfoot > tr.success > th {\n background-color: #dff0d8;\n}\n.table-hover > tbody > tr > td.success:hover,\n.table-hover > tbody > tr > th.success:hover,\n.table-hover > tbody > tr.success:hover > td,\n.table-hover > tbody > tr:hover > .success,\n.table-hover > tbody > tr.success:hover > th {\n background-color: #d0e9c6;\n}\n.table > thead > tr > td.info,\n.table > tbody > tr > td.info,\n.table > tfoot > tr > td.info,\n.table > thead > tr > th.info,\n.table > tbody > tr > th.info,\n.table > tfoot > tr > th.info,\n.table > thead > tr.info > td,\n.table > tbody > tr.info > td,\n.table > tfoot > tr.info > td,\n.table > thead > tr.info > th,\n.table > tbody > tr.info > th,\n.table > tfoot > tr.info > th {\n background-color: #d9edf7;\n}\n.table-hover > tbody > tr > td.info:hover,\n.table-hover > tbody > tr > th.info:hover,\n.table-hover > tbody > tr.info:hover > td,\n.table-hover > tbody > tr:hover > .info,\n.table-hover > tbody > tr.info:hover > th {\n background-color: #c4e3f3;\n}\n.table > thead > tr > td.warning,\n.table > tbody > tr > td.warning,\n.table > tfoot > tr > td.warning,\n.table > thead > tr > th.warning,\n.table > tbody > tr > th.warning,\n.table > tfoot > tr > th.warning,\n.table > thead > tr.warning > td,\n.table > tbody > tr.warning > td,\n.table > tfoot > tr.warning > td,\n.table > thead > tr.warning > th,\n.table > tbody > tr.warning > th,\n.table > tfoot > tr.warning > th {\n background-color: #fcf8e3;\n}\n.table-hover > tbody > tr > td.warning:hover,\n.table-hover > tbody > tr > th.warning:hover,\n.table-hover > tbody > tr.warning:hover > td,\n.table-hover > tbody > tr:hover > .warning,\n.table-hover > tbody > tr.warning:hover > th {\n background-color: #faf2cc;\n}\n.table > thead > tr > td.danger,\n.table > tbody > tr > td.danger,\n.table > tfoot > tr > td.danger,\n.table > thead > tr > th.danger,\n.table > tbody > tr > th.danger,\n.table > tfoot > tr > th.danger,\n.table > thead > tr.danger > td,\n.table > tbody > tr.danger > td,\n.table > tfoot > tr.danger > td,\n.table > thead > tr.danger > th,\n.table > tbody > tr.danger > th,\n.table > tfoot > tr.danger > th {\n background-color: #f2dede;\n}\n.table-hover > tbody > tr > td.danger:hover,\n.table-hover > tbody > tr > th.danger:hover,\n.table-hover > tbody > tr.danger:hover > td,\n.table-hover > tbody > tr:hover > .danger,\n.table-hover > tbody > tr.danger:hover > th {\n background-color: #ebcccc;\n}\n.table-responsive {\n overflow-x: auto;\n min-height: 0.01%;\n}\n@media screen and (max-width: 767px) {\n .table-responsive {\n width: 100%;\n margin-bottom: 15px;\n overflow-y: hidden;\n -ms-overflow-style: -ms-autohiding-scrollbar;\n border: 1px solid #dddddd;\n }\n .table-responsive > .table {\n margin-bottom: 0;\n }\n .table-responsive > .table > thead > tr > th,\n .table-responsive > .table > tbody > tr > th,\n .table-responsive > .table > tfoot > tr > th,\n .table-responsive > .table > thead > tr > td,\n .table-responsive > .table > tbody > tr > td,\n .table-responsive > .table > tfoot > tr > td {\n white-space: nowrap;\n }\n .table-responsive > .table-bordered {\n border: 0;\n }\n .table-responsive > .table-bordered > thead > tr > th:first-child,\n .table-responsive > .table-bordered > tbody > tr > th:first-child,\n .table-responsive > .table-bordered > tfoot > tr > th:first-child,\n .table-responsive > .table-bordered > thead > tr > td:first-child,\n .table-responsive > .table-bordered > tbody > tr > td:first-child,\n .table-responsive > .table-bordered > tfoot > tr > td:first-child {\n border-left: 0;\n }\n .table-responsive > .table-bordered > thead > tr > th:last-child,\n .table-responsive > .table-bordered > tbody > tr > th:last-child,\n .table-responsive > .table-bordered > tfoot > tr > th:last-child,\n .table-responsive > .table-bordered > thead > tr > td:last-child,\n .table-responsive > .table-bordered > tbody > tr > td:last-child,\n .table-responsive > .table-bordered > tfoot > tr > td:last-child {\n border-right: 0;\n }\n .table-responsive > .table-bordered > tbody > tr:last-child > th,\n .table-responsive > .table-bordered > tfoot > tr:last-child > th,\n .table-responsive > .table-bordered > tbody > tr:last-child > td,\n .table-responsive > .table-bordered > tfoot > tr:last-child > td {\n border-bottom: 0;\n }\n}\nfieldset {\n padding: 0;\n margin: 0;\n border: 0;\n min-width: 0;\n}\nlegend {\n display: block;\n width: 100%;\n padding: 0;\n margin-bottom: 20px;\n font-size: 21px;\n line-height: inherit;\n color: #333333;\n border: 0;\n border-bottom: 1px solid #e5e5e5;\n}\nlabel {\n display: inline-block;\n max-width: 100%;\n margin-bottom: 5px;\n font-weight: bold;\n}\ninput[type=\"search\"] {\n -webkit-box-sizing: border-box;\n -moz-box-sizing: border-box;\n box-sizing: border-box;\n}\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n margin: 4px 0 0;\n margin-top: 1px \\9;\n line-height: normal;\n}\ninput[type=\"file\"] {\n display: block;\n}\ninput[type=\"range\"] {\n display: block;\n width: 100%;\n}\nselect[multiple],\nselect[size] {\n height: auto;\n}\ninput[type=\"file\"]:focus,\ninput[type=\"radio\"]:focus,\ninput[type=\"checkbox\"]:focus {\n outline: thin dotted;\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px;\n}\noutput {\n display: block;\n padding-top: 7px;\n font-size: 14px;\n line-height: 1.42857143;\n color: #555555;\n}\n.form-control {\n display: block;\n width: 100%;\n height: 34px;\n padding: 6px 12px;\n font-size: 14px;\n line-height: 1.42857143;\n color: #555555;\n background-color: #ffffff;\n background-image: none;\n border: 1px solid #cccccc;\n border-radius: 4px;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n -webkit-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\n -o-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\n transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\n}\n.form-control:focus {\n border-color: #66afe9;\n outline: 0;\n -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6);\n box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6);\n}\n.form-control::-moz-placeholder {\n color: #999999;\n opacity: 1;\n}\n.form-control:-ms-input-placeholder {\n color: #999999;\n}\n.form-control::-webkit-input-placeholder {\n color: #999999;\n}\n.form-control[disabled],\n.form-control[readonly],\nfieldset[disabled] .form-control {\n cursor: not-allowed;\n background-color: #eeeeee;\n opacity: 1;\n}\ntextarea.form-control {\n height: auto;\n}\ninput[type=\"search\"] {\n -webkit-appearance: none;\n}\ninput[type=\"date\"],\ninput[type=\"time\"],\ninput[type=\"datetime-local\"],\ninput[type=\"month\"] {\n line-height: 34px;\n line-height: 1.42857143 \\0;\n}\ninput[type=\"date\"].input-sm,\ninput[type=\"time\"].input-sm,\ninput[type=\"datetime-local\"].input-sm,\ninput[type=\"month\"].input-sm {\n line-height: 30px;\n line-height: 1.5 \\0;\n}\ninput[type=\"date\"].input-lg,\ninput[type=\"time\"].input-lg,\ninput[type=\"datetime-local\"].input-lg,\ninput[type=\"month\"].input-lg {\n line-height: 46px;\n line-height: 1.33 \\0;\n}\n_:-ms-fullscreen,\n:root input[type=\"date\"],\n_:-ms-fullscreen,\n:root input[type=\"time\"],\n_:-ms-fullscreen,\n:root input[type=\"datetime-local\"],\n_:-ms-fullscreen,\n:root input[type=\"month\"] {\n line-height: 1.42857143;\n}\n_:-ms-fullscreen.input-sm,\n:root input[type=\"date\"].input-sm,\n_:-ms-fullscreen.input-sm,\n:root input[type=\"time\"].input-sm,\n_:-ms-fullscreen.input-sm,\n:root input[type=\"datetime-local\"].input-sm,\n_:-ms-fullscreen.input-sm,\n:root input[type=\"month\"].input-sm {\n line-height: 1.5;\n}\n_:-ms-fullscreen.input-lg,\n:root input[type=\"date\"].input-lg,\n_:-ms-fullscreen.input-lg,\n:root input[type=\"time\"].input-lg,\n_:-ms-fullscreen.input-lg,\n:root input[type=\"datetime-local\"].input-lg,\n_:-ms-fullscreen.input-lg,\n:root input[type=\"month\"].input-lg {\n line-height: 1.33;\n}\n.form-group {\n margin-bottom: 15px;\n}\n.radio,\n.checkbox {\n position: relative;\n display: block;\n margin-top: 10px;\n margin-bottom: 10px;\n}\n.radio label,\n.checkbox label {\n min-height: 20px;\n padding-left: 20px;\n margin-bottom: 0;\n font-weight: normal;\n cursor: pointer;\n}\n.radio input[type=\"radio\"],\n.radio-inline input[type=\"radio\"],\n.checkbox input[type=\"checkbox\"],\n.checkbox-inline input[type=\"checkbox\"] {\n position: absolute;\n margin-left: -20px;\n margin-top: 4px \\9;\n}\n.radio + .radio,\n.checkbox + .checkbox {\n margin-top: -5px;\n}\n.radio-inline,\n.checkbox-inline {\n display: inline-block;\n padding-left: 20px;\n margin-bottom: 0;\n vertical-align: middle;\n font-weight: normal;\n cursor: pointer;\n}\n.radio-inline + .radio-inline,\n.checkbox-inline + .checkbox-inline {\n margin-top: 0;\n margin-left: 10px;\n}\ninput[type=\"radio\"][disabled],\ninput[type=\"checkbox\"][disabled],\ninput[type=\"radio\"].disabled,\ninput[type=\"checkbox\"].disabled,\nfieldset[disabled] input[type=\"radio\"],\nfieldset[disabled] input[type=\"checkbox\"] {\n cursor: not-allowed;\n}\n.radio-inline.disabled,\n.checkbox-inline.disabled,\nfieldset[disabled] .radio-inline,\nfieldset[disabled] .checkbox-inline {\n cursor: not-allowed;\n}\n.radio.disabled label,\n.checkbox.disabled label,\nfieldset[disabled] .radio label,\nfieldset[disabled] .checkbox label {\n cursor: not-allowed;\n}\n.form-control-static {\n padding-top: 7px;\n padding-bottom: 7px;\n margin-bottom: 0;\n}\n.form-control-static.input-lg,\n.form-control-static.input-sm {\n padding-left: 0;\n padding-right: 0;\n}\n.input-sm,\n.form-group-sm .form-control {\n height: 30px;\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\nselect.input-sm,\nselect.form-group-sm .form-control {\n height: 30px;\n line-height: 30px;\n}\ntextarea.input-sm,\ntextarea.form-group-sm .form-control,\nselect[multiple].input-sm,\nselect[multiple].form-group-sm .form-control {\n height: auto;\n}\n.input-lg,\n.form-group-lg .form-control {\n height: 46px;\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.33;\n border-radius: 6px;\n}\nselect.input-lg,\nselect.form-group-lg .form-control {\n height: 46px;\n line-height: 46px;\n}\ntextarea.input-lg,\ntextarea.form-group-lg .form-control,\nselect[multiple].input-lg,\nselect[multiple].form-group-lg .form-control {\n height: auto;\n}\n.has-feedback {\n position: relative;\n}\n.has-feedback .form-control {\n padding-right: 42.5px;\n}\n.form-control-feedback {\n position: absolute;\n top: 0;\n right: 0;\n z-index: 2;\n display: block;\n width: 34px;\n height: 34px;\n line-height: 34px;\n text-align: center;\n pointer-events: none;\n}\n.input-lg + .form-control-feedback {\n width: 46px;\n height: 46px;\n line-height: 46px;\n}\n.input-sm + .form-control-feedback {\n width: 30px;\n height: 30px;\n line-height: 30px;\n}\n.has-success .help-block,\n.has-success .control-label,\n.has-success .radio,\n.has-success .checkbox,\n.has-success .radio-inline,\n.has-success .checkbox-inline,\n.has-success.radio label,\n.has-success.checkbox label,\n.has-success.radio-inline label,\n.has-success.checkbox-inline label {\n color: #3c763d;\n}\n.has-success .form-control {\n border-color: #3c763d;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.has-success .form-control:focus {\n border-color: #2b542c;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168;\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168;\n}\n.has-success .input-group-addon {\n color: #3c763d;\n border-color: #3c763d;\n background-color: #dff0d8;\n}\n.has-success .form-control-feedback {\n color: #3c763d;\n}\n.has-warning .help-block,\n.has-warning .control-label,\n.has-warning .radio,\n.has-warning .checkbox,\n.has-warning .radio-inline,\n.has-warning .checkbox-inline,\n.has-warning.radio label,\n.has-warning.checkbox label,\n.has-warning.radio-inline label,\n.has-warning.checkbox-inline label {\n color: #8a6d3b;\n}\n.has-warning .form-control {\n border-color: #8a6d3b;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.has-warning .form-control:focus {\n border-color: #66512c;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b;\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b;\n}\n.has-warning .input-group-addon {\n color: #8a6d3b;\n border-color: #8a6d3b;\n background-color: #fcf8e3;\n}\n.has-warning .form-control-feedback {\n color: #8a6d3b;\n}\n.has-error .help-block,\n.has-error .control-label,\n.has-error .radio,\n.has-error .checkbox,\n.has-error .radio-inline,\n.has-error .checkbox-inline,\n.has-error.radio label,\n.has-error.checkbox label,\n.has-error.radio-inline label,\n.has-error.checkbox-inline label {\n color: #a94442;\n}\n.has-error .form-control {\n border-color: #a94442;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.has-error .form-control:focus {\n border-color: #843534;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483;\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483;\n}\n.has-error .input-group-addon {\n color: #a94442;\n border-color: #a94442;\n background-color: #f2dede;\n}\n.has-error .form-control-feedback {\n color: #a94442;\n}\n.has-feedback label ~ .form-control-feedback {\n top: 25px;\n}\n.has-feedback label.sr-only ~ .form-control-feedback {\n top: 0;\n}\n.help-block {\n display: block;\n margin-top: 5px;\n margin-bottom: 10px;\n color: #737373;\n}\n@media (min-width: 768px) {\n .form-inline .form-group {\n display: inline-block;\n margin-bottom: 0;\n vertical-align: middle;\n }\n .form-inline .form-control {\n display: inline-block;\n width: auto;\n vertical-align: middle;\n }\n .form-inline .form-control-static {\n display: inline-block;\n }\n .form-inline .input-group {\n display: inline-table;\n vertical-align: middle;\n }\n .form-inline .input-group .input-group-addon,\n .form-inline .input-group .input-group-btn,\n .form-inline .input-group .form-control {\n width: auto;\n }\n .form-inline .input-group > .form-control {\n width: 100%;\n }\n .form-inline .control-label {\n margin-bottom: 0;\n vertical-align: middle;\n }\n .form-inline .radio,\n .form-inline .checkbox {\n display: inline-block;\n margin-top: 0;\n margin-bottom: 0;\n vertical-align: middle;\n }\n .form-inline .radio label,\n .form-inline .checkbox label {\n padding-left: 0;\n }\n .form-inline .radio input[type=\"radio\"],\n .form-inline .checkbox input[type=\"checkbox\"] {\n position: relative;\n margin-left: 0;\n }\n .form-inline .has-feedback .form-control-feedback {\n top: 0;\n }\n}\n.form-horizontal .radio,\n.form-horizontal .checkbox,\n.form-horizontal .radio-inline,\n.form-horizontal .checkbox-inline {\n margin-top: 0;\n margin-bottom: 0;\n padding-top: 7px;\n}\n.form-horizontal .radio,\n.form-horizontal .checkbox {\n min-height: 27px;\n}\n.form-horizontal .form-group {\n margin-left: -15px;\n margin-right: -15px;\n}\n@media (min-width: 768px) {\n .form-horizontal .control-label {\n text-align: right;\n margin-bottom: 0;\n padding-top: 7px;\n }\n}\n.form-horizontal .has-feedback .form-control-feedback {\n right: 15px;\n}\n@media (min-width: 768px) {\n .form-horizontal .form-group-lg .control-label {\n padding-top: 14.3px;\n }\n}\n@media (min-width: 768px) {\n .form-horizontal .form-group-sm .control-label {\n padding-top: 6px;\n }\n}\n.btn {\n display: inline-block;\n margin-bottom: 0;\n font-weight: normal;\n text-align: center;\n vertical-align: middle;\n touch-action: manipulation;\n cursor: pointer;\n background-image: none;\n border: 1px solid transparent;\n white-space: nowrap;\n padding: 6px 12px;\n font-size: 14px;\n line-height: 1.42857143;\n border-radius: 4px;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n}\n.btn:focus,\n.btn:active:focus,\n.btn.active:focus,\n.btn.focus,\n.btn:active.focus,\n.btn.active.focus {\n outline: thin dotted;\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px;\n}\n.btn:hover,\n.btn:focus,\n.btn.focus {\n color: #333333;\n text-decoration: none;\n}\n.btn:active,\n.btn.active {\n outline: 0;\n background-image: none;\n -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n}\n.btn.disabled,\n.btn[disabled],\nfieldset[disabled] .btn {\n cursor: not-allowed;\n pointer-events: none;\n opacity: 0.65;\n filter: alpha(opacity=65);\n -webkit-box-shadow: none;\n box-shadow: none;\n}\n.btn-default {\n color: #333333;\n background-color: #ffffff;\n border-color: #cccccc;\n}\n.btn-default:hover,\n.btn-default:focus,\n.btn-default.focus,\n.btn-default:active,\n.btn-default.active,\n.open > .dropdown-toggle.btn-default {\n color: #333333;\n background-color: #e6e6e6;\n border-color: #adadad;\n}\n.btn-default:active,\n.btn-default.active,\n.open > .dropdown-toggle.btn-default {\n background-image: none;\n}\n.btn-default.disabled,\n.btn-default[disabled],\nfieldset[disabled] .btn-default,\n.btn-default.disabled:hover,\n.btn-default[disabled]:hover,\nfieldset[disabled] .btn-default:hover,\n.btn-default.disabled:focus,\n.btn-default[disabled]:focus,\nfieldset[disabled] .btn-default:focus,\n.btn-default.disabled.focus,\n.btn-default[disabled].focus,\nfieldset[disabled] .btn-default.focus,\n.btn-default.disabled:active,\n.btn-default[disabled]:active,\nfieldset[disabled] .btn-default:active,\n.btn-default.disabled.active,\n.btn-default[disabled].active,\nfieldset[disabled] .btn-default.active {\n background-color: #ffffff;\n border-color: #cccccc;\n}\n.btn-default .badge {\n color: #ffffff;\n background-color: #333333;\n}\n.btn-primary {\n color: #ffffff;\n background-color: #428bca;\n border-color: #357ebd;\n}\n.btn-primary:hover,\n.btn-primary:focus,\n.btn-primary.focus,\n.btn-primary:active,\n.btn-primary.active,\n.open > .dropdown-toggle.btn-primary {\n color: #ffffff;\n background-color: #3071a9;\n border-color: #285e8e;\n}\n.btn-primary:active,\n.btn-primary.active,\n.open > .dropdown-toggle.btn-primary {\n background-image: none;\n}\n.btn-primary.disabled,\n.btn-primary[disabled],\nfieldset[disabled] .btn-primary,\n.btn-primary.disabled:hover,\n.btn-primary[disabled]:hover,\nfieldset[disabled] .btn-primary:hover,\n.btn-primary.disabled:focus,\n.btn-primary[disabled]:focus,\nfieldset[disabled] .btn-primary:focus,\n.btn-primary.disabled.focus,\n.btn-primary[disabled].focus,\nfieldset[disabled] .btn-primary.focus,\n.btn-primary.disabled:active,\n.btn-primary[disabled]:active,\nfieldset[disabled] .btn-primary:active,\n.btn-primary.disabled.active,\n.btn-primary[disabled].active,\nfieldset[disabled] .btn-primary.active {\n background-color: #428bca;\n border-color: #357ebd;\n}\n.btn-primary .badge {\n color: #428bca;\n background-color: #ffffff;\n}\n.btn-success {\n color: #ffffff;\n background-color: #5cb85c;\n border-color: #4cae4c;\n}\n.btn-success:hover,\n.btn-success:focus,\n.btn-success.focus,\n.btn-success:active,\n.btn-success.active,\n.open > .dropdown-toggle.btn-success {\n color: #ffffff;\n background-color: #449d44;\n border-color: #398439;\n}\n.btn-success:active,\n.btn-success.active,\n.open > .dropdown-toggle.btn-success {\n background-image: none;\n}\n.btn-success.disabled,\n.btn-success[disabled],\nfieldset[disabled] .btn-success,\n.btn-success.disabled:hover,\n.btn-success[disabled]:hover,\nfieldset[disabled] .btn-success:hover,\n.btn-success.disabled:focus,\n.btn-success[disabled]:focus,\nfieldset[disabled] .btn-success:focus,\n.btn-success.disabled.focus,\n.btn-success[disabled].focus,\nfieldset[disabled] .btn-success.focus,\n.btn-success.disabled:active,\n.btn-success[disabled]:active,\nfieldset[disabled] .btn-success:active,\n.btn-success.disabled.active,\n.btn-success[disabled].active,\nfieldset[disabled] .btn-success.active {\n background-color: #5cb85c;\n border-color: #4cae4c;\n}\n.btn-success .badge {\n color: #5cb85c;\n background-color: #ffffff;\n}\n.btn-info {\n color: #ffffff;\n background-color: #5bc0de;\n border-color: #46b8da;\n}\n.btn-info:hover,\n.btn-info:focus,\n.btn-info.focus,\n.btn-info:active,\n.btn-info.active,\n.open > .dropdown-toggle.btn-info {\n color: #ffffff;\n background-color: #31b0d5;\n border-color: #269abc;\n}\n.btn-info:active,\n.btn-info.active,\n.open > .dropdown-toggle.btn-info {\n background-image: none;\n}\n.btn-info.disabled,\n.btn-info[disabled],\nfieldset[disabled] .btn-info,\n.btn-info.disabled:hover,\n.btn-info[disabled]:hover,\nfieldset[disabled] .btn-info:hover,\n.btn-info.disabled:focus,\n.btn-info[disabled]:focus,\nfieldset[disabled] .btn-info:focus,\n.btn-info.disabled.focus,\n.btn-info[disabled].focus,\nfieldset[disabled] .btn-info.focus,\n.btn-info.disabled:active,\n.btn-info[disabled]:active,\nfieldset[disabled] .btn-info:active,\n.btn-info.disabled.active,\n.btn-info[disabled].active,\nfieldset[disabled] .btn-info.active {\n background-color: #5bc0de;\n border-color: #46b8da;\n}\n.btn-info .badge {\n color: #5bc0de;\n background-color: #ffffff;\n}\n.btn-warning {\n color: #ffffff;\n background-color: #f0ad4e;\n border-color: #eea236;\n}\n.btn-warning:hover,\n.btn-warning:focus,\n.btn-warning.focus,\n.btn-warning:active,\n.btn-warning.active,\n.open > .dropdown-toggle.btn-warning {\n color: #ffffff;\n background-color: #ec971f;\n border-color: #d58512;\n}\n.btn-warning:active,\n.btn-warning.active,\n.open > .dropdown-toggle.btn-warning {\n background-image: none;\n}\n.btn-warning.disabled,\n.btn-warning[disabled],\nfieldset[disabled] .btn-warning,\n.btn-warning.disabled:hover,\n.btn-warning[disabled]:hover,\nfieldset[disabled] .btn-warning:hover,\n.btn-warning.disabled:focus,\n.btn-warning[disabled]:focus,\nfieldset[disabled] .btn-warning:focus,\n.btn-warning.disabled.focus,\n.btn-warning[disabled].focus,\nfieldset[disabled] .btn-warning.focus,\n.btn-warning.disabled:active,\n.btn-warning[disabled]:active,\nfieldset[disabled] .btn-warning:active,\n.btn-warning.disabled.active,\n.btn-warning[disabled].active,\nfieldset[disabled] .btn-warning.active {\n background-color: #f0ad4e;\n border-color: #eea236;\n}\n.btn-warning .badge {\n color: #f0ad4e;\n background-color: #ffffff;\n}\n.btn-danger {\n color: #ffffff;\n background-color: #d9534f;\n border-color: #d43f3a;\n}\n.btn-danger:hover,\n.btn-danger:focus,\n.btn-danger.focus,\n.btn-danger:active,\n.btn-danger.active,\n.open > .dropdown-toggle.btn-danger {\n color: #ffffff;\n background-color: #c9302c;\n border-color: #ac2925;\n}\n.btn-danger:active,\n.btn-danger.active,\n.open > .dropdown-toggle.btn-danger {\n background-image: none;\n}\n.btn-danger.disabled,\n.btn-danger[disabled],\nfieldset[disabled] .btn-danger,\n.btn-danger.disabled:hover,\n.btn-danger[disabled]:hover,\nfieldset[disabled] .btn-danger:hover,\n.btn-danger.disabled:focus,\n.btn-danger[disabled]:focus,\nfieldset[disabled] .btn-danger:focus,\n.btn-danger.disabled.focus,\n.btn-danger[disabled].focus,\nfieldset[disabled] .btn-danger.focus,\n.btn-danger.disabled:active,\n.btn-danger[disabled]:active,\nfieldset[disabled] .btn-danger:active,\n.btn-danger.disabled.active,\n.btn-danger[disabled].active,\nfieldset[disabled] .btn-danger.active {\n background-color: #d9534f;\n border-color: #d43f3a;\n}\n.btn-danger .badge {\n color: #d9534f;\n background-color: #ffffff;\n}\n.btn-link {\n color: #428bca;\n font-weight: normal;\n border-radius: 0;\n}\n.btn-link,\n.btn-link:active,\n.btn-link.active,\n.btn-link[disabled],\nfieldset[disabled] .btn-link {\n background-color: transparent;\n -webkit-box-shadow: none;\n box-shadow: none;\n}\n.btn-link,\n.btn-link:hover,\n.btn-link:focus,\n.btn-link:active {\n border-color: transparent;\n}\n.btn-link:hover,\n.btn-link:focus {\n color: #2a6496;\n text-decoration: underline;\n background-color: transparent;\n}\n.btn-link[disabled]:hover,\nfieldset[disabled] .btn-link:hover,\n.btn-link[disabled]:focus,\nfieldset[disabled] .btn-link:focus {\n color: #777777;\n text-decoration: none;\n}\n.btn-lg,\n.btn-group-lg > .btn {\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.33;\n border-radius: 6px;\n}\n.btn-sm,\n.btn-group-sm > .btn {\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\n.btn-xs,\n.btn-group-xs > .btn {\n padding: 1px 5px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\n.btn-block {\n display: block;\n width: 100%;\n}\n.btn-block + .btn-block {\n margin-top: 5px;\n}\ninput[type=\"submit\"].btn-block,\ninput[type=\"reset\"].btn-block,\ninput[type=\"button\"].btn-block {\n width: 100%;\n}\n.fade {\n opacity: 0;\n -webkit-transition: opacity 0.15s linear;\n -o-transition: opacity 0.15s linear;\n transition: opacity 0.15s linear;\n}\n.fade.in {\n opacity: 1;\n}\n.collapse {\n display: none;\n visibility: hidden;\n}\n.collapse.in {\n display: block;\n visibility: visible;\n}\ntr.collapse.in {\n display: table-row;\n}\ntbody.collapse.in {\n display: table-row-group;\n}\n.collapsing {\n position: relative;\n height: 0;\n overflow: hidden;\n -webkit-transition-property: height, visibility;\n transition-property: height, visibility;\n -webkit-transition-duration: 0.35s;\n transition-duration: 0.35s;\n -webkit-transition-timing-function: ease;\n transition-timing-function: ease;\n}\n.caret {\n display: inline-block;\n width: 0;\n height: 0;\n margin-left: 2px;\n vertical-align: middle;\n border-top: 4px solid;\n border-right: 4px solid transparent;\n border-left: 4px solid transparent;\n}\n.dropdown {\n position: relative;\n}\n.dropdown-toggle:focus {\n outline: 0;\n}\n.dropdown-menu {\n position: absolute;\n top: 100%;\n left: 0;\n z-index: 1000;\n display: none;\n float: left;\n min-width: 160px;\n padding: 5px 0;\n margin: 2px 0 0;\n list-style: none;\n font-size: 14px;\n text-align: left;\n background-color: #ffffff;\n border: 1px solid #cccccc;\n border: 1px solid rgba(0, 0, 0, 0.15);\n border-radius: 4px;\n -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);\n box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);\n background-clip: padding-box;\n}\n.dropdown-menu.pull-right {\n right: 0;\n left: auto;\n}\n.dropdown-menu .divider {\n height: 1px;\n margin: 9px 0;\n overflow: hidden;\n background-color: #e5e5e5;\n}\n.dropdown-menu > li > a {\n display: block;\n padding: 3px 20px;\n clear: both;\n font-weight: normal;\n line-height: 1.42857143;\n color: #333333;\n white-space: nowrap;\n}\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n text-decoration: none;\n color: #262626;\n background-color: #f5f5f5;\n}\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n color: #ffffff;\n text-decoration: none;\n outline: 0;\n background-color: #428bca;\n}\n.dropdown-menu > .disabled > a,\n.dropdown-menu > .disabled > a:hover,\n.dropdown-menu > .disabled > a:focus {\n color: #777777;\n}\n.dropdown-menu > .disabled > a:hover,\n.dropdown-menu > .disabled > a:focus {\n text-decoration: none;\n background-color: transparent;\n background-image: none;\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n cursor: not-allowed;\n}\n.open > .dropdown-menu {\n display: block;\n}\n.open > a {\n outline: 0;\n}\n.dropdown-menu-right {\n left: auto;\n right: 0;\n}\n.dropdown-menu-left {\n left: 0;\n right: auto;\n}\n.dropdown-header {\n display: block;\n padding: 3px 20px;\n font-size: 12px;\n line-height: 1.42857143;\n color: #777777;\n white-space: nowrap;\n}\n.dropdown-backdrop {\n position: fixed;\n left: 0;\n right: 0;\n bottom: 0;\n top: 0;\n z-index: 990;\n}\n.pull-right > .dropdown-menu {\n right: 0;\n left: auto;\n}\n.dropup .caret,\n.navbar-fixed-bottom .dropdown .caret {\n border-top: 0;\n border-bottom: 4px solid;\n content: \"\";\n}\n.dropup .dropdown-menu,\n.navbar-fixed-bottom .dropdown .dropdown-menu {\n top: auto;\n bottom: 100%;\n margin-bottom: 1px;\n}\n@media (min-width: 768px) {\n .navbar-right .dropdown-menu {\n left: auto;\n right: 0;\n }\n .navbar-right .dropdown-menu-left {\n left: 0;\n right: auto;\n }\n}\n.btn-group,\n.btn-group-vertical {\n position: relative;\n display: inline-block;\n vertical-align: middle;\n}\n.btn-group > .btn,\n.btn-group-vertical > .btn {\n position: relative;\n float: left;\n}\n.btn-group > .btn:hover,\n.btn-group-vertical > .btn:hover,\n.btn-group > .btn:focus,\n.btn-group-vertical > .btn:focus,\n.btn-group > .btn:active,\n.btn-group-vertical > .btn:active,\n.btn-group > .btn.active,\n.btn-group-vertical > .btn.active {\n z-index: 2;\n}\n.btn-group > .btn:focus,\n.btn-group-vertical > .btn:focus {\n outline: 0;\n}\n.btn-group .btn + .btn,\n.btn-group .btn + .btn-group,\n.btn-group .btn-group + .btn,\n.btn-group .btn-group + .btn-group {\n margin-left: -1px;\n}\n.btn-toolbar {\n margin-left: -5px;\n}\n.btn-toolbar .btn-group,\n.btn-toolbar .input-group {\n float: left;\n}\n.btn-toolbar > .btn,\n.btn-toolbar > .btn-group,\n.btn-toolbar > .input-group {\n margin-left: 5px;\n}\n.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {\n border-radius: 0;\n}\n.btn-group > .btn:first-child {\n margin-left: 0;\n}\n.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) {\n border-bottom-right-radius: 0;\n border-top-right-radius: 0;\n}\n.btn-group > .btn:last-child:not(:first-child),\n.btn-group > .dropdown-toggle:not(:first-child) {\n border-bottom-left-radius: 0;\n border-top-left-radius: 0;\n}\n.btn-group > .btn-group {\n float: left;\n}\n.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {\n border-radius: 0;\n}\n.btn-group > .btn-group:first-child > .btn:last-child,\n.btn-group > .btn-group:first-child > .dropdown-toggle {\n border-bottom-right-radius: 0;\n border-top-right-radius: 0;\n}\n.btn-group > .btn-group:last-child > .btn:first-child {\n border-bottom-left-radius: 0;\n border-top-left-radius: 0;\n}\n.btn-group .dropdown-toggle:active,\n.btn-group.open .dropdown-toggle {\n outline: 0;\n}\n.btn-group > .btn + .dropdown-toggle {\n padding-left: 8px;\n padding-right: 8px;\n}\n.btn-group > .btn-lg + .dropdown-toggle {\n padding-left: 12px;\n padding-right: 12px;\n}\n.btn-group.open .dropdown-toggle {\n -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n}\n.btn-group.open .dropdown-toggle.btn-link {\n -webkit-box-shadow: none;\n box-shadow: none;\n}\n.btn .caret {\n margin-left: 0;\n}\n.btn-lg .caret {\n border-width: 5px 5px 0;\n border-bottom-width: 0;\n}\n.dropup .btn-lg .caret {\n border-width: 0 5px 5px;\n}\n.btn-group-vertical > .btn,\n.btn-group-vertical > .btn-group,\n.btn-group-vertical > .btn-group > .btn {\n display: block;\n float: none;\n width: 100%;\n max-width: 100%;\n}\n.btn-group-vertical > .btn-group > .btn {\n float: none;\n}\n.btn-group-vertical > .btn + .btn,\n.btn-group-vertical > .btn + .btn-group,\n.btn-group-vertical > .btn-group + .btn,\n.btn-group-vertical > .btn-group + .btn-group {\n margin-top: -1px;\n margin-left: 0;\n}\n.btn-group-vertical > .btn:not(:first-child):not(:last-child) {\n border-radius: 0;\n}\n.btn-group-vertical > .btn:first-child:not(:last-child) {\n border-top-right-radius: 4px;\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n}\n.btn-group-vertical > .btn:last-child:not(:first-child) {\n border-bottom-left-radius: 4px;\n border-top-right-radius: 0;\n border-top-left-radius: 0;\n}\n.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {\n border-radius: 0;\n}\n.btn-group-vertical > .btn-group:first-child:not(:last-child) > .btn:last-child,\n.btn-group-vertical > .btn-group:first-child:not(:last-child) > .dropdown-toggle {\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n}\n.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child {\n border-top-right-radius: 0;\n border-top-left-radius: 0;\n}\n.btn-group-justified {\n display: table;\n width: 100%;\n table-layout: fixed;\n border-collapse: separate;\n}\n.btn-group-justified > .btn,\n.btn-group-justified > .btn-group {\n float: none;\n display: table-cell;\n width: 1%;\n}\n.btn-group-justified > .btn-group .btn {\n width: 100%;\n}\n.btn-group-justified > .btn-group .dropdown-menu {\n left: auto;\n}\n[data-toggle=\"buttons\"] > .btn input[type=\"radio\"],\n[data-toggle=\"buttons\"] > .btn-group > .btn input[type=\"radio\"],\n[data-toggle=\"buttons\"] > .btn input[type=\"checkbox\"],\n[data-toggle=\"buttons\"] > .btn-group > .btn input[type=\"checkbox\"] {\n position: absolute;\n clip: rect(0, 0, 0, 0);\n pointer-events: none;\n}\n.input-group {\n position: relative;\n display: table;\n border-collapse: separate;\n}\n.input-group[class*=\"col-\"] {\n float: none;\n padding-left: 0;\n padding-right: 0;\n}\n.input-group .form-control {\n position: relative;\n z-index: 2;\n float: left;\n width: 100%;\n margin-bottom: 0;\n}\n.input-group-lg > .form-control,\n.input-group-lg > .input-group-addon,\n.input-group-lg > .input-group-btn > .btn {\n height: 46px;\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.33;\n border-radius: 6px;\n}\nselect.input-group-lg > .form-control,\nselect.input-group-lg > .input-group-addon,\nselect.input-group-lg > .input-group-btn > .btn {\n height: 46px;\n line-height: 46px;\n}\ntextarea.input-group-lg > .form-control,\ntextarea.input-group-lg > .input-group-addon,\ntextarea.input-group-lg > .input-group-btn > .btn,\nselect[multiple].input-group-lg > .form-control,\nselect[multiple].input-group-lg > .input-group-addon,\nselect[multiple].input-group-lg > .input-group-btn > .btn {\n height: auto;\n}\n.input-group-sm > .form-control,\n.input-group-sm > .input-group-addon,\n.input-group-sm > .input-group-btn > .btn {\n height: 30px;\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\nselect.input-group-sm > .form-control,\nselect.input-group-sm > .input-group-addon,\nselect.input-group-sm > .input-group-btn > .btn {\n height: 30px;\n line-height: 30px;\n}\ntextarea.input-group-sm > .form-control,\ntextarea.input-group-sm > .input-group-addon,\ntextarea.input-group-sm > .input-group-btn > .btn,\nselect[multiple].input-group-sm > .form-control,\nselect[multiple].input-group-sm > .input-group-addon,\nselect[multiple].input-group-sm > .input-group-btn > .btn {\n height: auto;\n}\n.input-group-addon,\n.input-group-btn,\n.input-group .form-control {\n display: table-cell;\n}\n.input-group-addon:not(:first-child):not(:last-child),\n.input-group-btn:not(:first-child):not(:last-child),\n.input-group .form-control:not(:first-child):not(:last-child) {\n border-radius: 0;\n}\n.input-group-addon,\n.input-group-btn {\n width: 1%;\n white-space: nowrap;\n vertical-align: middle;\n}\n.input-group-addon {\n padding: 6px 12px;\n font-size: 14px;\n font-weight: normal;\n line-height: 1;\n color: #555555;\n text-align: center;\n background-color: #eeeeee;\n border: 1px solid #cccccc;\n border-radius: 4px;\n}\n.input-group-addon.input-sm {\n padding: 5px 10px;\n font-size: 12px;\n border-radius: 3px;\n}\n.input-group-addon.input-lg {\n padding: 10px 16px;\n font-size: 18px;\n border-radius: 6px;\n}\n.input-group-addon input[type=\"radio\"],\n.input-group-addon input[type=\"checkbox\"] {\n margin-top: 0;\n}\n.input-group .form-control:first-child,\n.input-group-addon:first-child,\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .btn-group > .btn,\n.input-group-btn:first-child > .dropdown-toggle,\n.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle),\n.input-group-btn:last-child > .btn-group:not(:last-child) > .btn {\n border-bottom-right-radius: 0;\n border-top-right-radius: 0;\n}\n.input-group-addon:first-child {\n border-right: 0;\n}\n.input-group .form-control:last-child,\n.input-group-addon:last-child,\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .btn-group > .btn,\n.input-group-btn:last-child > .dropdown-toggle,\n.input-group-btn:first-child > .btn:not(:first-child),\n.input-group-btn:first-child > .btn-group:not(:first-child) > .btn {\n border-bottom-left-radius: 0;\n border-top-left-radius: 0;\n}\n.input-group-addon:last-child {\n border-left: 0;\n}\n.input-group-btn {\n position: relative;\n font-size: 0;\n white-space: nowrap;\n}\n.input-group-btn > .btn {\n position: relative;\n}\n.input-group-btn > .btn + .btn {\n margin-left: -1px;\n}\n.input-group-btn > .btn:hover,\n.input-group-btn > .btn:focus,\n.input-group-btn > .btn:active {\n z-index: 2;\n}\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .btn-group {\n margin-right: -1px;\n}\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .btn-group {\n margin-left: -1px;\n}\n.nav {\n margin-bottom: 0;\n padding-left: 0;\n list-style: none;\n}\n.nav > li {\n position: relative;\n display: block;\n}\n.nav > li > a {\n position: relative;\n display: block;\n padding: 10px 15px;\n}\n.nav > li > a:hover,\n.nav > li > a:focus {\n text-decoration: none;\n background-color: #eeeeee;\n}\n.nav > li.disabled > a {\n color: #777777;\n}\n.nav > li.disabled > a:hover,\n.nav > li.disabled > a:focus {\n color: #777777;\n text-decoration: none;\n background-color: transparent;\n cursor: not-allowed;\n}\n.nav .open > a,\n.nav .open > a:hover,\n.nav .open > a:focus {\n background-color: #eeeeee;\n border-color: #428bca;\n}\n.nav .nav-divider {\n height: 1px;\n margin: 9px 0;\n overflow: hidden;\n background-color: #e5e5e5;\n}\n.nav > li > a > img {\n max-width: none;\n}\n.nav-tabs {\n border-bottom: 1px solid #dddddd;\n}\n.nav-tabs > li {\n float: left;\n margin-bottom: -1px;\n}\n.nav-tabs > li > a {\n margin-right: 2px;\n line-height: 1.42857143;\n border: 1px solid transparent;\n border-radius: 4px 4px 0 0;\n}\n.nav-tabs > li > a:hover {\n border-color: #eeeeee #eeeeee #dddddd;\n}\n.nav-tabs > li.active > a,\n.nav-tabs > li.active > a:hover,\n.nav-tabs > li.active > a:focus {\n color: #555555;\n background-color: #ffffff;\n border: 1px solid #dddddd;\n border-bottom-color: transparent;\n cursor: default;\n}\n.nav-tabs.nav-justified {\n width: 100%;\n border-bottom: 0;\n}\n.nav-tabs.nav-justified > li {\n float: none;\n}\n.nav-tabs.nav-justified > li > a {\n text-align: center;\n margin-bottom: 5px;\n}\n.nav-tabs.nav-justified > .dropdown .dropdown-menu {\n top: auto;\n left: auto;\n}\n@media (min-width: 768px) {\n .nav-tabs.nav-justified > li {\n display: table-cell;\n width: 1%;\n }\n .nav-tabs.nav-justified > li > a {\n margin-bottom: 0;\n }\n}\n.nav-tabs.nav-justified > li > a {\n margin-right: 0;\n border-radius: 4px;\n}\n.nav-tabs.nav-justified > .active > a,\n.nav-tabs.nav-justified > .active > a:hover,\n.nav-tabs.nav-justified > .active > a:focus {\n border: 1px solid #dddddd;\n}\n@media (min-width: 768px) {\n .nav-tabs.nav-justified > li > a {\n border-bottom: 1px solid #dddddd;\n border-radius: 4px 4px 0 0;\n }\n .nav-tabs.nav-justified > .active > a,\n .nav-tabs.nav-justified > .active > a:hover,\n .nav-tabs.nav-justified > .active > a:focus {\n border-bottom-color: #ffffff;\n }\n}\n.nav-pills > li {\n float: left;\n}\n.nav-pills > li > a {\n border-radius: 4px;\n}\n.nav-pills > li + li {\n margin-left: 2px;\n}\n.nav-pills > li.active > a,\n.nav-pills > li.active > a:hover,\n.nav-pills > li.active > a:focus {\n color: #ffffff;\n background-color: #428bca;\n}\n.nav-stacked > li {\n float: none;\n}\n.nav-stacked > li + li {\n margin-top: 2px;\n margin-left: 0;\n}\n.nav-justified {\n width: 100%;\n}\n.nav-justified > li {\n float: none;\n}\n.nav-justified > li > a {\n text-align: center;\n margin-bottom: 5px;\n}\n.nav-justified > .dropdown .dropdown-menu {\n top: auto;\n left: auto;\n}\n@media (min-width: 768px) {\n .nav-justified > li {\n display: table-cell;\n width: 1%;\n }\n .nav-justified > li > a {\n margin-bottom: 0;\n }\n}\n.nav-tabs-justified {\n border-bottom: 0;\n}\n.nav-tabs-justified > li > a {\n margin-right: 0;\n border-radius: 4px;\n}\n.nav-tabs-justified > .active > a,\n.nav-tabs-justified > .active > a:hover,\n.nav-tabs-justified > .active > a:focus {\n border: 1px solid #dddddd;\n}\n@media (min-width: 768px) {\n .nav-tabs-justified > li > a {\n border-bottom: 1px solid #dddddd;\n border-radius: 4px 4px 0 0;\n }\n .nav-tabs-justified > .active > a,\n .nav-tabs-justified > .active > a:hover,\n .nav-tabs-justified > .active > a:focus {\n border-bottom-color: #ffffff;\n }\n}\n.tab-content > .tab-pane {\n display: none;\n visibility: hidden;\n}\n.tab-content > .active {\n display: block;\n visibility: visible;\n}\n.nav-tabs .dropdown-menu {\n margin-top: -1px;\n border-top-right-radius: 0;\n border-top-left-radius: 0;\n}\n.navbar {\n position: relative;\n min-height: 50px;\n margin-bottom: 20px;\n border: 1px solid transparent;\n}\n@media (min-width: 768px) {\n .navbar {\n border-radius: 4px;\n }\n}\n@media (min-width: 768px) {\n .navbar-header {\n float: left;\n }\n}\n.navbar-collapse {\n overflow-x: visible;\n padding-right: 15px;\n padding-left: 15px;\n border-top: 1px solid transparent;\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1);\n -webkit-overflow-scrolling: touch;\n}\n.navbar-collapse.in {\n overflow-y: auto;\n}\n@media (min-width: 768px) {\n .navbar-collapse {\n width: auto;\n border-top: 0;\n box-shadow: none;\n }\n .navbar-collapse.collapse {\n display: block !important;\n visibility: visible !important;\n height: auto !important;\n padding-bottom: 0;\n overflow: visible !important;\n }\n .navbar-collapse.in {\n overflow-y: visible;\n }\n .navbar-fixed-top .navbar-collapse,\n .navbar-static-top .navbar-collapse,\n .navbar-fixed-bottom .navbar-collapse {\n padding-left: 0;\n padding-right: 0;\n }\n}\n.navbar-fixed-top .navbar-collapse,\n.navbar-fixed-bottom .navbar-collapse {\n max-height: 340px;\n}\n@media (max-device-width: 480px) and (orientation: landscape) {\n .navbar-fixed-top .navbar-collapse,\n .navbar-fixed-bottom .navbar-collapse {\n max-height: 200px;\n }\n}\n.container > .navbar-header,\n.container-fluid > .navbar-header,\n.container > .navbar-collapse,\n.container-fluid > .navbar-collapse {\n margin-right: -15px;\n margin-left: -15px;\n}\n@media (min-width: 768px) {\n .container > .navbar-header,\n .container-fluid > .navbar-header,\n .container > .navbar-collapse,\n .container-fluid > .navbar-collapse {\n margin-right: 0;\n margin-left: 0;\n }\n}\n.navbar-static-top {\n z-index: 1000;\n border-width: 0 0 1px;\n}\n@media (min-width: 768px) {\n .navbar-static-top {\n border-radius: 0;\n }\n}\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n position: fixed;\n right: 0;\n left: 0;\n z-index: 1030;\n}\n@media (min-width: 768px) {\n .navbar-fixed-top,\n .navbar-fixed-bottom {\n border-radius: 0;\n }\n}\n.navbar-fixed-top {\n top: 0;\n border-width: 0 0 1px;\n}\n.navbar-fixed-bottom {\n bottom: 0;\n margin-bottom: 0;\n border-width: 1px 0 0;\n}\n.navbar-brand {\n float: left;\n padding: 15px 15px;\n font-size: 18px;\n line-height: 20px;\n height: 50px;\n}\n.navbar-brand:hover,\n.navbar-brand:focus {\n text-decoration: none;\n}\n.navbar-brand > img {\n display: block;\n}\n@media (min-width: 768px) {\n .navbar > .container .navbar-brand,\n .navbar > .container-fluid .navbar-brand {\n margin-left: -15px;\n }\n}\n.navbar-toggle {\n position: relative;\n float: right;\n margin-right: 15px;\n padding: 9px 10px;\n margin-top: 8px;\n margin-bottom: 8px;\n background-color: transparent;\n background-image: none;\n border: 1px solid transparent;\n border-radius: 4px;\n}\n.navbar-toggle:focus {\n outline: 0;\n}\n.navbar-toggle .icon-bar {\n display: block;\n width: 22px;\n height: 2px;\n border-radius: 1px;\n}\n.navbar-toggle .icon-bar + .icon-bar {\n margin-top: 4px;\n}\n@media (min-width: 768px) {\n .navbar-toggle {\n display: none;\n }\n}\n.navbar-nav {\n margin: 7.5px -15px;\n}\n.navbar-nav > li > a {\n padding-top: 10px;\n padding-bottom: 10px;\n line-height: 20px;\n}\n@media (max-width: 767px) {\n .navbar-nav .open .dropdown-menu {\n position: static;\n float: none;\n width: auto;\n margin-top: 0;\n background-color: transparent;\n border: 0;\n box-shadow: none;\n }\n .navbar-nav .open .dropdown-menu > li > a,\n .navbar-nav .open .dropdown-menu .dropdown-header {\n padding: 5px 15px 5px 25px;\n }\n .navbar-nav .open .dropdown-menu > li > a {\n line-height: 20px;\n }\n .navbar-nav .open .dropdown-menu > li > a:hover,\n .navbar-nav .open .dropdown-menu > li > a:focus {\n background-image: none;\n }\n}\n@media (min-width: 768px) {\n .navbar-nav {\n float: left;\n margin: 0;\n }\n .navbar-nav > li {\n float: left;\n }\n .navbar-nav > li > a {\n padding-top: 15px;\n padding-bottom: 15px;\n }\n}\n.navbar-form {\n margin-left: -15px;\n margin-right: -15px;\n padding: 10px 15px;\n border-top: 1px solid transparent;\n border-bottom: 1px solid transparent;\n -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);\n margin-top: 8px;\n margin-bottom: 8px;\n}\n@media (min-width: 768px) {\n .navbar-form .form-group {\n display: inline-block;\n margin-bottom: 0;\n vertical-align: middle;\n }\n .navbar-form .form-control {\n display: inline-block;\n width: auto;\n vertical-align: middle;\n }\n .navbar-form .form-control-static {\n display: inline-block;\n }\n .navbar-form .input-group {\n display: inline-table;\n vertical-align: middle;\n }\n .navbar-form .input-group .input-group-addon,\n .navbar-form .input-group .input-group-btn,\n .navbar-form .input-group .form-control {\n width: auto;\n }\n .navbar-form .input-group > .form-control {\n width: 100%;\n }\n .navbar-form .control-label {\n margin-bottom: 0;\n vertical-align: middle;\n }\n .navbar-form .radio,\n .navbar-form .checkbox {\n display: inline-block;\n margin-top: 0;\n margin-bottom: 0;\n vertical-align: middle;\n }\n .navbar-form .radio label,\n .navbar-form .checkbox label {\n padding-left: 0;\n }\n .navbar-form .radio input[type=\"radio\"],\n .navbar-form .checkbox input[type=\"checkbox\"] {\n position: relative;\n margin-left: 0;\n }\n .navbar-form .has-feedback .form-control-feedback {\n top: 0;\n }\n}\n@media (max-width: 767px) {\n .navbar-form .form-group {\n margin-bottom: 5px;\n }\n .navbar-form .form-group:last-child {\n margin-bottom: 0;\n }\n}\n@media (min-width: 768px) {\n .navbar-form {\n width: auto;\n border: 0;\n margin-left: 0;\n margin-right: 0;\n padding-top: 0;\n padding-bottom: 0;\n -webkit-box-shadow: none;\n box-shadow: none;\n }\n}\n.navbar-nav > li > .dropdown-menu {\n margin-top: 0;\n border-top-right-radius: 0;\n border-top-left-radius: 0;\n}\n.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu {\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n}\n.navbar-btn {\n margin-top: 8px;\n margin-bottom: 8px;\n}\n.navbar-btn.btn-sm {\n margin-top: 10px;\n margin-bottom: 10px;\n}\n.navbar-btn.btn-xs {\n margin-top: 14px;\n margin-bottom: 14px;\n}\n.navbar-text {\n margin-top: 15px;\n margin-bottom: 15px;\n}\n@media (min-width: 768px) {\n .navbar-text {\n float: left;\n margin-left: 15px;\n margin-right: 15px;\n }\n}\n@media (min-width: 768px) {\n .navbar-left {\n float: left !important;\n }\n .navbar-right {\n float: right !important;\n margin-right: -15px;\n }\n .navbar-right ~ .navbar-right {\n margin-right: 0;\n }\n}\n.navbar-default {\n background-color: #f8f8f8;\n border-color: #e7e7e7;\n}\n.navbar-default .navbar-brand {\n color: #777777;\n}\n.navbar-default .navbar-brand:hover,\n.navbar-default .navbar-brand:focus {\n color: #5e5e5e;\n background-color: transparent;\n}\n.navbar-default .navbar-text {\n color: #777777;\n}\n.navbar-default .navbar-nav > li > a {\n color: #777777;\n}\n.navbar-default .navbar-nav > li > a:hover,\n.navbar-default .navbar-nav > li > a:focus {\n color: #333333;\n background-color: transparent;\n}\n.navbar-default .navbar-nav > .active > a,\n.navbar-default .navbar-nav > .active > a:hover,\n.navbar-default .navbar-nav > .active > a:focus {\n color: #555555;\n background-color: #e7e7e7;\n}\n.navbar-default .navbar-nav > .disabled > a,\n.navbar-default .navbar-nav > .disabled > a:hover,\n.navbar-default .navbar-nav > .disabled > a:focus {\n color: #cccccc;\n background-color: transparent;\n}\n.navbar-default .navbar-toggle {\n border-color: #dddddd;\n}\n.navbar-default .navbar-toggle:hover,\n.navbar-default .navbar-toggle:focus {\n background-color: #dddddd;\n}\n.navbar-default .navbar-toggle .icon-bar {\n background-color: #888888;\n}\n.navbar-default .navbar-collapse,\n.navbar-default .navbar-form {\n border-color: #e7e7e7;\n}\n.navbar-default .navbar-nav > .open > a,\n.navbar-default .navbar-nav > .open > a:hover,\n.navbar-default .navbar-nav > .open > a:focus {\n background-color: #e7e7e7;\n color: #555555;\n}\n@media (max-width: 767px) {\n .navbar-default .navbar-nav .open .dropdown-menu > li > a {\n color: #777777;\n }\n .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover,\n .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus {\n color: #333333;\n background-color: transparent;\n }\n .navbar-default .navbar-nav .open .dropdown-menu > .active > a,\n .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover,\n .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus {\n color: #555555;\n background-color: #e7e7e7;\n }\n .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a,\n .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover,\n .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus {\n color: #cccccc;\n background-color: transparent;\n }\n}\n.navbar-default .navbar-link {\n color: #777777;\n}\n.navbar-default .navbar-link:hover {\n color: #333333;\n}\n.navbar-default .btn-link {\n color: #777777;\n}\n.navbar-default .btn-link:hover,\n.navbar-default .btn-link:focus {\n color: #333333;\n}\n.navbar-default .btn-link[disabled]:hover,\nfieldset[disabled] .navbar-default .btn-link:hover,\n.navbar-default .btn-link[disabled]:focus,\nfieldset[disabled] .navbar-default .btn-link:focus {\n color: #cccccc;\n}\n.navbar-inverse {\n background-color: #222222;\n border-color: #080808;\n}\n.navbar-inverse .navbar-brand {\n color: #9d9d9d;\n}\n.navbar-inverse .navbar-brand:hover,\n.navbar-inverse .navbar-brand:focus {\n color: #ffffff;\n background-color: transparent;\n}\n.navbar-inverse .navbar-text {\n color: #9d9d9d;\n}\n.navbar-inverse .navbar-nav > li > a {\n color: #9d9d9d;\n}\n.navbar-inverse .navbar-nav > li > a:hover,\n.navbar-inverse .navbar-nav > li > a:focus {\n color: #ffffff;\n background-color: transparent;\n}\n.navbar-inverse .navbar-nav > .active > a,\n.navbar-inverse .navbar-nav > .active > a:hover,\n.navbar-inverse .navbar-nav > .active > a:focus {\n color: #ffffff;\n background-color: #080808;\n}\n.navbar-inverse .navbar-nav > .disabled > a,\n.navbar-inverse .navbar-nav > .disabled > a:hover,\n.navbar-inverse .navbar-nav > .disabled > a:focus {\n color: #444444;\n background-color: transparent;\n}\n.navbar-inverse .navbar-toggle {\n border-color: #333333;\n}\n.navbar-inverse .navbar-toggle:hover,\n.navbar-inverse .navbar-toggle:focus {\n background-color: #333333;\n}\n.navbar-inverse .navbar-toggle .icon-bar {\n background-color: #ffffff;\n}\n.navbar-inverse .navbar-collapse,\n.navbar-inverse .navbar-form {\n border-color: #101010;\n}\n.navbar-inverse .navbar-nav > .open > a,\n.navbar-inverse .navbar-nav > .open > a:hover,\n.navbar-inverse .navbar-nav > .open > a:focus {\n background-color: #080808;\n color: #ffffff;\n}\n@media (max-width: 767px) {\n .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header {\n border-color: #080808;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu .divider {\n background-color: #080808;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu > li > a {\n color: #9d9d9d;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover,\n .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus {\n color: #ffffff;\n background-color: transparent;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a,\n .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover,\n .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus {\n color: #ffffff;\n background-color: #080808;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a,\n .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover,\n .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus {\n color: #444444;\n background-color: transparent;\n }\n}\n.navbar-inverse .navbar-link {\n color: #9d9d9d;\n}\n.navbar-inverse .navbar-link:hover {\n color: #ffffff;\n}\n.navbar-inverse .btn-link {\n color: #9d9d9d;\n}\n.navbar-inverse .btn-link:hover,\n.navbar-inverse .btn-link:focus {\n color: #ffffff;\n}\n.navbar-inverse .btn-link[disabled]:hover,\nfieldset[disabled] .navbar-inverse .btn-link:hover,\n.navbar-inverse .btn-link[disabled]:focus,\nfieldset[disabled] .navbar-inverse .btn-link:focus {\n color: #444444;\n}\n.breadcrumb {\n padding: 8px 15px;\n margin-bottom: 20px;\n list-style: none;\n background-color: #f5f5f5;\n border-radius: 4px;\n}\n.breadcrumb > li {\n display: inline-block;\n}\n.breadcrumb > li + li:before {\n content: \"/\\00a0\";\n padding: 0 5px;\n color: #cccccc;\n}\n.breadcrumb > .active {\n color: #777777;\n}\n.pagination {\n display: inline-block;\n padding-left: 0;\n margin: 20px 0;\n border-radius: 4px;\n}\n.pagination > li {\n display: inline;\n}\n.pagination > li > a,\n.pagination > li > span {\n position: relative;\n float: left;\n padding: 6px 12px;\n line-height: 1.42857143;\n text-decoration: none;\n color: #428bca;\n background-color: #ffffff;\n border: 1px solid #dddddd;\n margin-left: -1px;\n}\n.pagination > li:first-child > a,\n.pagination > li:first-child > span {\n margin-left: 0;\n border-bottom-left-radius: 4px;\n border-top-left-radius: 4px;\n}\n.pagination > li:last-child > a,\n.pagination > li:last-child > span {\n border-bottom-right-radius: 4px;\n border-top-right-radius: 4px;\n}\n.pagination > li > a:hover,\n.pagination > li > span:hover,\n.pagination > li > a:focus,\n.pagination > li > span:focus {\n color: #2a6496;\n background-color: #eeeeee;\n border-color: #dddddd;\n}\n.pagination > .active > a,\n.pagination > .active > span,\n.pagination > .active > a:hover,\n.pagination > .active > span:hover,\n.pagination > .active > a:focus,\n.pagination > .active > span:focus {\n z-index: 2;\n color: #ffffff;\n background-color: #428bca;\n border-color: #428bca;\n cursor: default;\n}\n.pagination > .disabled > span,\n.pagination > .disabled > span:hover,\n.pagination > .disabled > span:focus,\n.pagination > .disabled > a,\n.pagination > .disabled > a:hover,\n.pagination > .disabled > a:focus {\n color: #777777;\n background-color: #ffffff;\n border-color: #dddddd;\n cursor: not-allowed;\n}\n.pagination-lg > li > a,\n.pagination-lg > li > span {\n padding: 10px 16px;\n font-size: 18px;\n}\n.pagination-lg > li:first-child > a,\n.pagination-lg > li:first-child > span {\n border-bottom-left-radius: 6px;\n border-top-left-radius: 6px;\n}\n.pagination-lg > li:last-child > a,\n.pagination-lg > li:last-child > span {\n border-bottom-right-radius: 6px;\n border-top-right-radius: 6px;\n}\n.pagination-sm > li > a,\n.pagination-sm > li > span {\n padding: 5px 10px;\n font-size: 12px;\n}\n.pagination-sm > li:first-child > a,\n.pagination-sm > li:first-child > span {\n border-bottom-left-radius: 3px;\n border-top-left-radius: 3px;\n}\n.pagination-sm > li:last-child > a,\n.pagination-sm > li:last-child > span {\n border-bottom-right-radius: 3px;\n border-top-right-radius: 3px;\n}\n.pager {\n padding-left: 0;\n margin: 20px 0;\n list-style: none;\n text-align: center;\n}\n.pager li {\n display: inline;\n}\n.pager li > a,\n.pager li > span {\n display: inline-block;\n padding: 5px 14px;\n background-color: #ffffff;\n border: 1px solid #dddddd;\n border-radius: 15px;\n}\n.pager li > a:hover,\n.pager li > a:focus {\n text-decoration: none;\n background-color: #eeeeee;\n}\n.pager .next > a,\n.pager .next > span {\n float: right;\n}\n.pager .previous > a,\n.pager .previous > span {\n float: left;\n}\n.pager .disabled > a,\n.pager .disabled > a:hover,\n.pager .disabled > a:focus,\n.pager .disabled > span {\n color: #777777;\n background-color: #ffffff;\n cursor: not-allowed;\n}\n.label {\n display: inline;\n padding: .2em .6em .3em;\n font-size: 75%;\n font-weight: bold;\n line-height: 1;\n color: #ffffff;\n text-align: center;\n white-space: nowrap;\n vertical-align: baseline;\n border-radius: .25em;\n}\na.label:hover,\na.label:focus {\n color: #ffffff;\n text-decoration: none;\n cursor: pointer;\n}\n.label:empty {\n display: none;\n}\n.btn .label {\n position: relative;\n top: -1px;\n}\n.label-default {\n background-color: #777777;\n}\n.label-default[href]:hover,\n.label-default[href]:focus {\n background-color: #5e5e5e;\n}\n.label-primary {\n background-color: #428bca;\n}\n.label-primary[href]:hover,\n.label-primary[href]:focus {\n background-color: #3071a9;\n}\n.label-success {\n background-color: #5cb85c;\n}\n.label-success[href]:hover,\n.label-success[href]:focus {\n background-color: #449d44;\n}\n.label-info {\n background-color: #5bc0de;\n}\n.label-info[href]:hover,\n.label-info[href]:focus {\n background-color: #31b0d5;\n}\n.label-warning {\n background-color: #f0ad4e;\n}\n.label-warning[href]:hover,\n.label-warning[href]:focus {\n background-color: #ec971f;\n}\n.label-danger {\n background-color: #d9534f;\n}\n.label-danger[href]:hover,\n.label-danger[href]:focus {\n background-color: #c9302c;\n}\n.badge {\n display: inline-block;\n min-width: 10px;\n padding: 3px 7px;\n font-size: 12px;\n font-weight: bold;\n color: #ffffff;\n line-height: 1;\n vertical-align: baseline;\n white-space: nowrap;\n text-align: center;\n background-color: #777777;\n border-radius: 10px;\n}\n.badge:empty {\n display: none;\n}\n.btn .badge {\n position: relative;\n top: -1px;\n}\n.btn-xs .badge {\n top: 0;\n padding: 1px 5px;\n}\na.badge:hover,\na.badge:focus {\n color: #ffffff;\n text-decoration: none;\n cursor: pointer;\n}\na.list-group-item.active > .badge,\n.nav-pills > .active > a > .badge {\n color: #428bca;\n background-color: #ffffff;\n}\n.nav-pills > li > a > .badge {\n margin-left: 3px;\n}\n.jumbotron {\n padding: 30px 15px;\n margin-bottom: 30px;\n color: inherit;\n background-color: #eeeeee;\n}\n.jumbotron h1,\n.jumbotron .h1 {\n color: inherit;\n}\n.jumbotron p {\n margin-bottom: 15px;\n font-size: 21px;\n font-weight: 200;\n}\n.jumbotron > hr {\n border-top-color: #d5d5d5;\n}\n.container .jumbotron,\n.container-fluid .jumbotron {\n border-radius: 6px;\n}\n.jumbotron .container {\n max-width: 100%;\n}\n@media screen and (min-width: 768px) {\n .jumbotron {\n padding: 48px 0;\n }\n .container .jumbotron {\n padding-left: 60px;\n padding-right: 60px;\n }\n .jumbotron h1,\n .jumbotron .h1 {\n font-size: 63px;\n }\n}\n.thumbnail {\n display: block;\n padding: 4px;\n margin-bottom: 20px;\n line-height: 1.42857143;\n background-color: #ffffff;\n border: 1px solid #dddddd;\n border-radius: 4px;\n -webkit-transition: border 0.2s ease-in-out;\n -o-transition: border 0.2s ease-in-out;\n transition: border 0.2s ease-in-out;\n}\n.thumbnail > img,\n.thumbnail a > img {\n margin-left: auto;\n margin-right: auto;\n}\na.thumbnail:hover,\na.thumbnail:focus,\na.thumbnail.active {\n border-color: #428bca;\n}\n.thumbnail .caption {\n padding: 9px;\n color: #333333;\n}\n.alert {\n padding: 15px;\n margin-bottom: 20px;\n border: 1px solid transparent;\n border-radius: 4px;\n}\n.alert h4 {\n margin-top: 0;\n color: inherit;\n}\n.alert .alert-link {\n font-weight: bold;\n}\n.alert > p,\n.alert > ul {\n margin-bottom: 0;\n}\n.alert > p + p {\n margin-top: 5px;\n}\n.alert-dismissable,\n.alert-dismissible {\n padding-right: 35px;\n}\n.alert-dismissable .close,\n.alert-dismissible .close {\n position: relative;\n top: -2px;\n right: -21px;\n color: inherit;\n}\n.alert-success {\n background-color: #dff0d8;\n border-color: #d6e9c6;\n color: #3c763d;\n}\n.alert-success hr {\n border-top-color: #c9e2b3;\n}\n.alert-success .alert-link {\n color: #2b542c;\n}\n.alert-info {\n background-color: #d9edf7;\n border-color: #bce8f1;\n color: #31708f;\n}\n.alert-info hr {\n border-top-color: #a6e1ec;\n}\n.alert-info .alert-link {\n color: #245269;\n}\n.alert-warning {\n background-color: #fcf8e3;\n border-color: #faebcc;\n color: #8a6d3b;\n}\n.alert-warning hr {\n border-top-color: #f7e1b5;\n}\n.alert-warning .alert-link {\n color: #66512c;\n}\n.alert-danger {\n background-color: #f2dede;\n border-color: #ebccd1;\n color: #a94442;\n}\n.alert-danger hr {\n border-top-color: #e4b9c0;\n}\n.alert-danger .alert-link {\n color: #843534;\n}\n@-webkit-keyframes progress-bar-stripes {\n from {\n background-position: 40px 0;\n }\n to {\n background-position: 0 0;\n }\n}\n@keyframes progress-bar-stripes {\n from {\n background-position: 40px 0;\n }\n to {\n background-position: 0 0;\n }\n}\n.progress {\n overflow: hidden;\n height: 20px;\n margin-bottom: 20px;\n background-color: #f5f5f5;\n border-radius: 4px;\n -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);\n box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);\n}\n.progress-bar {\n float: left;\n width: 0%;\n height: 100%;\n font-size: 12px;\n line-height: 20px;\n color: #ffffff;\n text-align: center;\n background-color: #428bca;\n -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);\n box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);\n -webkit-transition: width 0.6s ease;\n -o-transition: width 0.6s ease;\n transition: width 0.6s ease;\n}\n.progress-striped .progress-bar,\n.progress-bar-striped {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-size: 40px 40px;\n}\n.progress.active .progress-bar,\n.progress-bar.active {\n -webkit-animation: progress-bar-stripes 2s linear infinite;\n -o-animation: progress-bar-stripes 2s linear infinite;\n animation: progress-bar-stripes 2s linear infinite;\n}\n.progress-bar-success {\n background-color: #5cb85c;\n}\n.progress-striped .progress-bar-success {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.progress-bar-info {\n background-color: #5bc0de;\n}\n.progress-striped .progress-bar-info {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.progress-bar-warning {\n background-color: #f0ad4e;\n}\n.progress-striped .progress-bar-warning {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.progress-bar-danger {\n background-color: #d9534f;\n}\n.progress-striped .progress-bar-danger {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.media {\n margin-top: 15px;\n}\n.media:first-child {\n margin-top: 0;\n}\n.media-right,\n.media > .pull-right {\n padding-left: 10px;\n}\n.media-left,\n.media > .pull-left {\n padding-right: 10px;\n}\n.media-left,\n.media-right,\n.media-body {\n display: table-cell;\n vertical-align: top;\n}\n.media-middle {\n vertical-align: middle;\n}\n.media-bottom {\n vertical-align: bottom;\n}\n.media-heading {\n margin-top: 0;\n margin-bottom: 5px;\n}\n.media-list {\n padding-left: 0;\n list-style: none;\n}\n.list-group {\n margin-bottom: 20px;\n padding-left: 0;\n}\n.list-group-item {\n position: relative;\n display: block;\n padding: 10px 15px;\n margin-bottom: -1px;\n background-color: #ffffff;\n border: 1px solid #dddddd;\n}\n.list-group-item:first-child {\n border-top-right-radius: 4px;\n border-top-left-radius: 4px;\n}\n.list-group-item:last-child {\n margin-bottom: 0;\n border-bottom-right-radius: 4px;\n border-bottom-left-radius: 4px;\n}\n.list-group-item > .badge {\n float: right;\n}\n.list-group-item > .badge + .badge {\n margin-right: 5px;\n}\na.list-group-item {\n color: #555555;\n}\na.list-group-item .list-group-item-heading {\n color: #333333;\n}\na.list-group-item:hover,\na.list-group-item:focus {\n text-decoration: none;\n color: #555555;\n background-color: #f5f5f5;\n}\n.list-group-item.disabled,\n.list-group-item.disabled:hover,\n.list-group-item.disabled:focus {\n background-color: #eeeeee;\n color: #777777;\n cursor: not-allowed;\n}\n.list-group-item.disabled .list-group-item-heading,\n.list-group-item.disabled:hover .list-group-item-heading,\n.list-group-item.disabled:focus .list-group-item-heading {\n color: inherit;\n}\n.list-group-item.disabled .list-group-item-text,\n.list-group-item.disabled:hover .list-group-item-text,\n.list-group-item.disabled:focus .list-group-item-text {\n color: #777777;\n}\n.list-group-item.active,\n.list-group-item.active:hover,\n.list-group-item.active:focus {\n z-index: 2;\n color: #ffffff;\n background-color: #428bca;\n border-color: #428bca;\n}\n.list-group-item.active .list-group-item-heading,\n.list-group-item.active:hover .list-group-item-heading,\n.list-group-item.active:focus .list-group-item-heading,\n.list-group-item.active .list-group-item-heading > small,\n.list-group-item.active:hover .list-group-item-heading > small,\n.list-group-item.active:focus .list-group-item-heading > small,\n.list-group-item.active .list-group-item-heading > .small,\n.list-group-item.active:hover .list-group-item-heading > .small,\n.list-group-item.active:focus .list-group-item-heading > .small {\n color: inherit;\n}\n.list-group-item.active .list-group-item-text,\n.list-group-item.active:hover .list-group-item-text,\n.list-group-item.active:focus .list-group-item-text {\n color: #e1edf7;\n}\n.list-group-item-success {\n color: #3c763d;\n background-color: #dff0d8;\n}\na.list-group-item-success {\n color: #3c763d;\n}\na.list-group-item-success .list-group-item-heading {\n color: inherit;\n}\na.list-group-item-success:hover,\na.list-group-item-success:focus {\n color: #3c763d;\n background-color: #d0e9c6;\n}\na.list-group-item-success.active,\na.list-group-item-success.active:hover,\na.list-group-item-success.active:focus {\n color: #fff;\n background-color: #3c763d;\n border-color: #3c763d;\n}\n.list-group-item-info {\n color: #31708f;\n background-color: #d9edf7;\n}\na.list-group-item-info {\n color: #31708f;\n}\na.list-group-item-info .list-group-item-heading {\n color: inherit;\n}\na.list-group-item-info:hover,\na.list-group-item-info:focus {\n color: #31708f;\n background-color: #c4e3f3;\n}\na.list-group-item-info.active,\na.list-group-item-info.active:hover,\na.list-group-item-info.active:focus {\n color: #fff;\n background-color: #31708f;\n border-color: #31708f;\n}\n.list-group-item-warning {\n color: #8a6d3b;\n background-color: #fcf8e3;\n}\na.list-group-item-warning {\n color: #8a6d3b;\n}\na.list-group-item-warning .list-group-item-heading {\n color: inherit;\n}\na.list-group-item-warning:hover,\na.list-group-item-warning:focus {\n color: #8a6d3b;\n background-color: #faf2cc;\n}\na.list-group-item-warning.active,\na.list-group-item-warning.active:hover,\na.list-group-item-warning.active:focus {\n color: #fff;\n background-color: #8a6d3b;\n border-color: #8a6d3b;\n}\n.list-group-item-danger {\n color: #a94442;\n background-color: #f2dede;\n}\na.list-group-item-danger {\n color: #a94442;\n}\na.list-group-item-danger .list-group-item-heading {\n color: inherit;\n}\na.list-group-item-danger:hover,\na.list-group-item-danger:focus {\n color: #a94442;\n background-color: #ebcccc;\n}\na.list-group-item-danger.active,\na.list-group-item-danger.active:hover,\na.list-group-item-danger.active:focus {\n color: #fff;\n background-color: #a94442;\n border-color: #a94442;\n}\n.list-group-item-heading {\n margin-top: 0;\n margin-bottom: 5px;\n}\n.list-group-item-text {\n margin-bottom: 0;\n line-height: 1.3;\n}\n.panel {\n margin-bottom: 20px;\n background-color: #ffffff;\n border: 1px solid transparent;\n border-radius: 4px;\n -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05);\n box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05);\n}\n.panel-body {\n padding: 15px;\n}\n.panel-heading {\n padding: 10px 15px;\n border-bottom: 1px solid transparent;\n border-top-right-radius: 3px;\n border-top-left-radius: 3px;\n}\n.panel-heading > .dropdown .dropdown-toggle {\n color: inherit;\n}\n.panel-title {\n margin-top: 0;\n margin-bottom: 0;\n font-size: 16px;\n color: inherit;\n}\n.panel-title > a {\n color: inherit;\n}\n.panel-footer {\n padding: 10px 15px;\n background-color: #f5f5f5;\n border-top: 1px solid #dddddd;\n border-bottom-right-radius: 3px;\n border-bottom-left-radius: 3px;\n}\n.panel > .list-group,\n.panel > .panel-collapse > .list-group {\n margin-bottom: 0;\n}\n.panel > .list-group .list-group-item,\n.panel > .panel-collapse > .list-group .list-group-item {\n border-width: 1px 0;\n border-radius: 0;\n}\n.panel > .list-group:first-child .list-group-item:first-child,\n.panel > .panel-collapse > .list-group:first-child .list-group-item:first-child {\n border-top: 0;\n border-top-right-radius: 3px;\n border-top-left-radius: 3px;\n}\n.panel > .list-group:last-child .list-group-item:last-child,\n.panel > .panel-collapse > .list-group:last-child .list-group-item:last-child {\n border-bottom: 0;\n border-bottom-right-radius: 3px;\n border-bottom-left-radius: 3px;\n}\n.panel-heading + .list-group .list-group-item:first-child {\n border-top-width: 0;\n}\n.list-group + .panel-footer {\n border-top-width: 0;\n}\n.panel > .table,\n.panel > .table-responsive > .table,\n.panel > .panel-collapse > .table {\n margin-bottom: 0;\n}\n.panel > .table caption,\n.panel > .table-responsive > .table caption,\n.panel > .panel-collapse > .table caption {\n padding-left: 15px;\n padding-right: 15px;\n}\n.panel > .table:first-child,\n.panel > .table-responsive:first-child > .table:first-child {\n border-top-right-radius: 3px;\n border-top-left-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child {\n border-top-left-radius: 3px;\n border-top-right-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child td:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child td:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:first-child,\n.panel > .table:first-child > thead:first-child > tr:first-child th:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child th:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:first-child {\n border-top-left-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child td:last-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:last-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child td:last-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:last-child,\n.panel > .table:first-child > thead:first-child > tr:first-child th:last-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:last-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child th:last-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:last-child {\n border-top-right-radius: 3px;\n}\n.panel > .table:last-child,\n.panel > .table-responsive:last-child > .table:last-child {\n border-bottom-right-radius: 3px;\n border-bottom-left-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child {\n border-bottom-left-radius: 3px;\n border-bottom-right-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child td:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:first-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:first-child,\n.panel > .table:last-child > tbody:last-child > tr:last-child th:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:first-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:first-child {\n border-bottom-left-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child td:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child td:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:last-child,\n.panel > .table:last-child > tbody:last-child > tr:last-child th:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:last-child {\n border-bottom-right-radius: 3px;\n}\n.panel > .panel-body + .table,\n.panel > .panel-body + .table-responsive,\n.panel > .table + .panel-body,\n.panel > .table-responsive + .panel-body {\n border-top: 1px solid #dddddd;\n}\n.panel > .table > tbody:first-child > tr:first-child th,\n.panel > .table > tbody:first-child > tr:first-child td {\n border-top: 0;\n}\n.panel > .table-bordered,\n.panel > .table-responsive > .table-bordered {\n border: 0;\n}\n.panel > .table-bordered > thead > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > thead > tr > th:first-child,\n.panel > .table-bordered > tbody > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > th:first-child,\n.panel > .table-bordered > tfoot > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child,\n.panel > .table-bordered > thead > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > thead > tr > td:first-child,\n.panel > .table-bordered > tbody > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > td:first-child,\n.panel > .table-bordered > tfoot > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child {\n border-left: 0;\n}\n.panel > .table-bordered > thead > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > thead > tr > th:last-child,\n.panel > .table-bordered > tbody > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > th:last-child,\n.panel > .table-bordered > tfoot > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child,\n.panel > .table-bordered > thead > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > thead > tr > td:last-child,\n.panel > .table-bordered > tbody > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > td:last-child,\n.panel > .table-bordered > tfoot > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child {\n border-right: 0;\n}\n.panel > .table-bordered > thead > tr:first-child > td,\n.panel > .table-responsive > .table-bordered > thead > tr:first-child > td,\n.panel > .table-bordered > tbody > tr:first-child > td,\n.panel > .table-responsive > .table-bordered > tbody > tr:first-child > td,\n.panel > .table-bordered > thead > tr:first-child > th,\n.panel > .table-responsive > .table-bordered > thead > tr:first-child > th,\n.panel > .table-bordered > tbody > tr:first-child > th,\n.panel > .table-responsive > .table-bordered > tbody > tr:first-child > th {\n border-bottom: 0;\n}\n.panel > .table-bordered > tbody > tr:last-child > td,\n.panel > .table-responsive > .table-bordered > tbody > tr:last-child > td,\n.panel > .table-bordered > tfoot > tr:last-child > td,\n.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td,\n.panel > .table-bordered > tbody > tr:last-child > th,\n.panel > .table-responsive > .table-bordered > tbody > tr:last-child > th,\n.panel > .table-bordered > tfoot > tr:last-child > th,\n.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th {\n border-bottom: 0;\n}\n.panel > .table-responsive {\n border: 0;\n margin-bottom: 0;\n}\n.panel-group {\n margin-bottom: 20px;\n}\n.panel-group .panel {\n margin-bottom: 0;\n border-radius: 4px;\n}\n.panel-group .panel + .panel {\n margin-top: 5px;\n}\n.panel-group .panel-heading {\n border-bottom: 0;\n}\n.panel-group .panel-heading + .panel-collapse > .panel-body,\n.panel-group .panel-heading + .panel-collapse > .list-group {\n border-top: 1px solid #dddddd;\n}\n.panel-group .panel-footer {\n border-top: 0;\n}\n.panel-group .panel-footer + .panel-collapse .panel-body {\n border-bottom: 1px solid #dddddd;\n}\n.panel-default {\n border-color: #dddddd;\n}\n.panel-default > .panel-heading {\n color: #333333;\n background-color: #f5f5f5;\n border-color: #dddddd;\n}\n.panel-default > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #dddddd;\n}\n.panel-default > .panel-heading .badge {\n color: #f5f5f5;\n background-color: #333333;\n}\n.panel-default > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #dddddd;\n}\n.panel-primary {\n border-color: #428bca;\n}\n.panel-primary > .panel-heading {\n color: #ffffff;\n background-color: #428bca;\n border-color: #428bca;\n}\n.panel-primary > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #428bca;\n}\n.panel-primary > .panel-heading .badge {\n color: #428bca;\n background-color: #ffffff;\n}\n.panel-primary > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #428bca;\n}\n.panel-success {\n border-color: #d6e9c6;\n}\n.panel-success > .panel-heading {\n color: #3c763d;\n background-color: #dff0d8;\n border-color: #d6e9c6;\n}\n.panel-success > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #d6e9c6;\n}\n.panel-success > .panel-heading .badge {\n color: #dff0d8;\n background-color: #3c763d;\n}\n.panel-success > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #d6e9c6;\n}\n.panel-info {\n border-color: #bce8f1;\n}\n.panel-info > .panel-heading {\n color: #31708f;\n background-color: #d9edf7;\n border-color: #bce8f1;\n}\n.panel-info > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #bce8f1;\n}\n.panel-info > .panel-heading .badge {\n color: #d9edf7;\n background-color: #31708f;\n}\n.panel-info > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #bce8f1;\n}\n.panel-warning {\n border-color: #faebcc;\n}\n.panel-warning > .panel-heading {\n color: #8a6d3b;\n background-color: #fcf8e3;\n border-color: #faebcc;\n}\n.panel-warning > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #faebcc;\n}\n.panel-warning > .panel-heading .badge {\n color: #fcf8e3;\n background-color: #8a6d3b;\n}\n.panel-warning > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #faebcc;\n}\n.panel-danger {\n border-color: #ebccd1;\n}\n.panel-danger > .panel-heading {\n color: #a94442;\n background-color: #f2dede;\n border-color: #ebccd1;\n}\n.panel-danger > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #ebccd1;\n}\n.panel-danger > .panel-heading .badge {\n color: #f2dede;\n background-color: #a94442;\n}\n.panel-danger > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #ebccd1;\n}\n.embed-responsive {\n position: relative;\n display: block;\n height: 0;\n padding: 0;\n overflow: hidden;\n}\n.embed-responsive .embed-responsive-item,\n.embed-responsive iframe,\n.embed-responsive embed,\n.embed-responsive object,\n.embed-responsive video {\n position: absolute;\n top: 0;\n left: 0;\n bottom: 0;\n height: 100%;\n width: 100%;\n border: 0;\n}\n.embed-responsive.embed-responsive-16by9 {\n padding-bottom: 56.25%;\n}\n.embed-responsive.embed-responsive-4by3 {\n padding-bottom: 75%;\n}\n.well {\n min-height: 20px;\n padding: 19px;\n margin-bottom: 20px;\n background-color: #f5f5f5;\n border: 1px solid #e3e3e3;\n border-radius: 4px;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);\n}\n.well blockquote {\n border-color: #ddd;\n border-color: rgba(0, 0, 0, 0.15);\n}\n.well-lg {\n padding: 24px;\n border-radius: 6px;\n}\n.well-sm {\n padding: 9px;\n border-radius: 3px;\n}\n.close {\n float: right;\n font-size: 21px;\n font-weight: bold;\n line-height: 1;\n color: #000000;\n text-shadow: 0 1px 0 #ffffff;\n opacity: 0.2;\n filter: alpha(opacity=20);\n}\n.close:hover,\n.close:focus {\n color: #000000;\n text-decoration: none;\n cursor: pointer;\n opacity: 0.5;\n filter: alpha(opacity=50);\n}\nbutton.close {\n padding: 0;\n cursor: pointer;\n background: transparent;\n border: 0;\n -webkit-appearance: none;\n}\n.modal-open {\n overflow: hidden;\n}\n.modal {\n display: none;\n overflow: hidden;\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 1040;\n -webkit-overflow-scrolling: touch;\n outline: 0;\n}\n.modal.fade .modal-dialog {\n -webkit-transform: translate(0, -25%);\n -ms-transform: translate(0, -25%);\n -o-transform: translate(0, -25%);\n transform: translate(0, -25%);\n -webkit-transition: -webkit-transform 0.3s ease-out;\n -moz-transition: -moz-transform 0.3s ease-out;\n -o-transition: -o-transform 0.3s ease-out;\n transition: transform 0.3s ease-out;\n}\n.modal.in .modal-dialog {\n -webkit-transform: translate(0, 0);\n -ms-transform: translate(0, 0);\n -o-transform: translate(0, 0);\n transform: translate(0, 0);\n}\n.modal-open .modal {\n overflow-x: hidden;\n overflow-y: auto;\n}\n.modal-dialog {\n position: relative;\n width: auto;\n margin: 10px;\n}\n.modal-content {\n position: relative;\n background-color: #ffffff;\n border: 1px solid #999999;\n border: 1px solid rgba(0, 0, 0, 0.2);\n border-radius: 6px;\n -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5);\n box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5);\n background-clip: padding-box;\n outline: 0;\n}\n.modal-backdrop {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n background-color: #000000;\n}\n.modal-backdrop.fade {\n opacity: 0;\n filter: alpha(opacity=0);\n}\n.modal-backdrop.in {\n opacity: 0.5;\n filter: alpha(opacity=50);\n}\n.modal-header {\n padding: 15px;\n border-bottom: 1px solid #e5e5e5;\n min-height: 16.42857143px;\n}\n.modal-header .close {\n margin-top: -2px;\n}\n.modal-title {\n margin: 0;\n line-height: 1.42857143;\n}\n.modal-body {\n position: relative;\n padding: 15px;\n}\n.modal-footer {\n padding: 15px;\n text-align: right;\n border-top: 1px solid #e5e5e5;\n}\n.modal-footer .btn + .btn {\n margin-left: 5px;\n margin-bottom: 0;\n}\n.modal-footer .btn-group .btn + .btn {\n margin-left: -1px;\n}\n.modal-footer .btn-block + .btn-block {\n margin-left: 0;\n}\n.modal-scrollbar-measure {\n position: absolute;\n top: -9999px;\n width: 50px;\n height: 50px;\n overflow: scroll;\n}\n@media (min-width: 768px) {\n .modal-dialog {\n width: 600px;\n margin: 30px auto;\n }\n .modal-content {\n -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5);\n box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5);\n }\n .modal-sm {\n width: 300px;\n }\n}\n@media (min-width: 992px) {\n .modal-lg {\n width: 900px;\n }\n}\n.tooltip {\n position: absolute;\n z-index: 1070;\n display: block;\n visibility: visible;\n font-size: 12px;\n line-height: 1.4;\n opacity: 0;\n filter: alpha(opacity=0);\n}\n.tooltip.in {\n opacity: 0.9;\n filter: alpha(opacity=90);\n}\n.tooltip.top {\n margin-top: -3px;\n padding: 5px 0;\n}\n.tooltip.right {\n margin-left: 3px;\n padding: 0 5px;\n}\n.tooltip.bottom {\n margin-top: 3px;\n padding: 5px 0;\n}\n.tooltip.left {\n margin-left: -3px;\n padding: 0 5px;\n}\n.tooltip-inner {\n max-width: 200px;\n padding: 3px 8px;\n color: #ffffff;\n text-align: center;\n text-decoration: none;\n background-color: #000000;\n border-radius: 4px;\n}\n.tooltip-arrow {\n position: absolute;\n width: 0;\n height: 0;\n border-color: transparent;\n border-style: solid;\n}\n.tooltip.top .tooltip-arrow {\n bottom: 0;\n left: 50%;\n margin-left: -5px;\n border-width: 5px 5px 0;\n border-top-color: #000000;\n}\n.tooltip.top-left .tooltip-arrow {\n bottom: 0;\n left: 5px;\n border-width: 5px 5px 0;\n border-top-color: #000000;\n}\n.tooltip.top-right .tooltip-arrow {\n bottom: 0;\n right: 5px;\n border-width: 5px 5px 0;\n border-top-color: #000000;\n}\n.tooltip.right .tooltip-arrow {\n top: 50%;\n left: 0;\n margin-top: -5px;\n border-width: 5px 5px 5px 0;\n border-right-color: #000000;\n}\n.tooltip.left .tooltip-arrow {\n top: 50%;\n right: 0;\n margin-top: -5px;\n border-width: 5px 0 5px 5px;\n border-left-color: #000000;\n}\n.tooltip.bottom .tooltip-arrow {\n top: 0;\n left: 50%;\n margin-left: -5px;\n border-width: 0 5px 5px;\n border-bottom-color: #000000;\n}\n.tooltip.bottom-left .tooltip-arrow {\n top: 0;\n left: 5px;\n border-width: 0 5px 5px;\n border-bottom-color: #000000;\n}\n.tooltip.bottom-right .tooltip-arrow {\n top: 0;\n right: 5px;\n border-width: 0 5px 5px;\n border-bottom-color: #000000;\n}\n.popover {\n position: absolute;\n top: 0;\n left: 0;\n z-index: 1060;\n display: none;\n max-width: 276px;\n padding: 1px;\n font-size: 14px;\n font-weight: normal;\n line-height: 1.42857143;\n text-align: left;\n background-color: #ffffff;\n background-clip: padding-box;\n border: 1px solid #cccccc;\n border: 1px solid rgba(0, 0, 0, 0.2);\n border-radius: 6px;\n -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\n box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\n white-space: normal;\n}\n.popover.top {\n margin-top: -10px;\n}\n.popover.right {\n margin-left: 10px;\n}\n.popover.bottom {\n margin-top: 10px;\n}\n.popover.left {\n margin-left: -10px;\n}\n.popover-title {\n margin: 0;\n padding: 8px 14px;\n font-size: 14px;\n background-color: #f7f7f7;\n border-bottom: 1px solid #ebebeb;\n border-radius: 5px 5px 0 0;\n}\n.popover-content {\n padding: 9px 14px;\n}\n.popover > .arrow,\n.popover > .arrow:after {\n position: absolute;\n display: block;\n width: 0;\n height: 0;\n border-color: transparent;\n border-style: solid;\n}\n.popover > .arrow {\n border-width: 11px;\n}\n.popover > .arrow:after {\n border-width: 10px;\n content: \"\";\n}\n.popover.top > .arrow {\n left: 50%;\n margin-left: -11px;\n border-bottom-width: 0;\n border-top-color: #999999;\n border-top-color: rgba(0, 0, 0, 0.25);\n bottom: -11px;\n}\n.popover.top > .arrow:after {\n content: \" \";\n bottom: 1px;\n margin-left: -10px;\n border-bottom-width: 0;\n border-top-color: #ffffff;\n}\n.popover.right > .arrow {\n top: 50%;\n left: -11px;\n margin-top: -11px;\n border-left-width: 0;\n border-right-color: #999999;\n border-right-color: rgba(0, 0, 0, 0.25);\n}\n.popover.right > .arrow:after {\n content: \" \";\n left: 1px;\n bottom: -10px;\n border-left-width: 0;\n border-right-color: #ffffff;\n}\n.popover.bottom > .arrow {\n left: 50%;\n margin-left: -11px;\n border-top-width: 0;\n border-bottom-color: #999999;\n border-bottom-color: rgba(0, 0, 0, 0.25);\n top: -11px;\n}\n.popover.bottom > .arrow:after {\n content: \" \";\n top: 1px;\n margin-left: -10px;\n border-top-width: 0;\n border-bottom-color: #ffffff;\n}\n.popover.left > .arrow {\n top: 50%;\n right: -11px;\n margin-top: -11px;\n border-right-width: 0;\n border-left-color: #999999;\n border-left-color: rgba(0, 0, 0, 0.25);\n}\n.popover.left > .arrow:after {\n content: \" \";\n right: 1px;\n border-right-width: 0;\n border-left-color: #ffffff;\n bottom: -10px;\n}\n.carousel {\n position: relative;\n}\n.carousel-inner {\n position: relative;\n overflow: hidden;\n width: 100%;\n}\n.carousel-inner > .item {\n display: none;\n position: relative;\n -webkit-transition: 0.6s ease-in-out left;\n -o-transition: 0.6s ease-in-out left;\n transition: 0.6s ease-in-out left;\n}\n.carousel-inner > .item > img,\n.carousel-inner > .item > a > img {\n line-height: 1;\n}\n@media all and (transform-3d), (-webkit-transform-3d) {\n .carousel-inner > .item {\n transition: transform 0.6s ease-in-out;\n backface-visibility: hidden;\n perspective: 1000;\n }\n .carousel-inner > .item.next,\n .carousel-inner > .item.active.right {\n transform: translate3d(100%, 0, 0);\n left: 0;\n }\n .carousel-inner > .item.prev,\n .carousel-inner > .item.active.left {\n transform: translate3d(-100%, 0, 0);\n left: 0;\n }\n .carousel-inner > .item.next.left,\n .carousel-inner > .item.prev.right,\n .carousel-inner > .item.active {\n transform: translate3d(0, 0, 0);\n left: 0;\n }\n}\n.carousel-inner > .active,\n.carousel-inner > .next,\n.carousel-inner > .prev {\n display: block;\n}\n.carousel-inner > .active {\n left: 0;\n}\n.carousel-inner > .next,\n.carousel-inner > .prev {\n position: absolute;\n top: 0;\n width: 100%;\n}\n.carousel-inner > .next {\n left: 100%;\n}\n.carousel-inner > .prev {\n left: -100%;\n}\n.carousel-inner > .next.left,\n.carousel-inner > .prev.right {\n left: 0;\n}\n.carousel-inner > .active.left {\n left: -100%;\n}\n.carousel-inner > .active.right {\n left: 100%;\n}\n.carousel-control {\n position: absolute;\n top: 0;\n left: 0;\n bottom: 0;\n width: 15%;\n opacity: 0.5;\n filter: alpha(opacity=50);\n font-size: 20px;\n color: #ffffff;\n text-align: center;\n text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6);\n}\n.carousel-control.left {\n background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%);\n background-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%);\n background-image: linear-gradient(to right, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);\n}\n.carousel-control.right {\n left: auto;\n right: 0;\n background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%);\n background-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%);\n background-image: linear-gradient(to right, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);\n}\n.carousel-control:hover,\n.carousel-control:focus {\n outline: 0;\n color: #ffffff;\n text-decoration: none;\n opacity: 0.9;\n filter: alpha(opacity=90);\n}\n.carousel-control .icon-prev,\n.carousel-control .icon-next,\n.carousel-control .glyphicon-chevron-left,\n.carousel-control .glyphicon-chevron-right {\n position: absolute;\n top: 50%;\n z-index: 5;\n display: inline-block;\n}\n.carousel-control .icon-prev,\n.carousel-control .glyphicon-chevron-left {\n left: 50%;\n margin-left: -10px;\n}\n.carousel-control .icon-next,\n.carousel-control .glyphicon-chevron-right {\n right: 50%;\n margin-right: -10px;\n}\n.carousel-control .icon-prev,\n.carousel-control .icon-next {\n width: 20px;\n height: 20px;\n margin-top: -10px;\n font-family: serif;\n}\n.carousel-control .icon-prev:before {\n content: '\\2039';\n}\n.carousel-control .icon-next:before {\n content: '\\203a';\n}\n.carousel-indicators {\n position: absolute;\n bottom: 10px;\n left: 50%;\n z-index: 15;\n width: 60%;\n margin-left: -30%;\n padding-left: 0;\n list-style: none;\n text-align: center;\n}\n.carousel-indicators li {\n display: inline-block;\n width: 10px;\n height: 10px;\n margin: 1px;\n text-indent: -999px;\n border: 1px solid #ffffff;\n border-radius: 10px;\n cursor: pointer;\n background-color: #000 \\9;\n background-color: rgba(0, 0, 0, 0);\n}\n.carousel-indicators .active {\n margin: 0;\n width: 12px;\n height: 12px;\n background-color: #ffffff;\n}\n.carousel-caption {\n position: absolute;\n left: 15%;\n right: 15%;\n bottom: 20px;\n z-index: 10;\n padding-top: 20px;\n padding-bottom: 20px;\n color: #ffffff;\n text-align: center;\n text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6);\n}\n.carousel-caption .btn {\n text-shadow: none;\n}\n@media screen and (min-width: 768px) {\n .carousel-control .glyphicon-chevron-left,\n .carousel-control .glyphicon-chevron-right,\n .carousel-control .icon-prev,\n .carousel-control .icon-next {\n width: 30px;\n height: 30px;\n margin-top: -15px;\n font-size: 30px;\n }\n .carousel-control .glyphicon-chevron-left,\n .carousel-control .icon-prev {\n margin-left: -15px;\n }\n .carousel-control .glyphicon-chevron-right,\n .carousel-control .icon-next {\n margin-right: -15px;\n }\n .carousel-caption {\n left: 20%;\n right: 20%;\n padding-bottom: 30px;\n }\n .carousel-indicators {\n bottom: 20px;\n }\n}\n.clearfix:before,\n.clearfix:after,\n.dl-horizontal dd:before,\n.dl-horizontal dd:after,\n.container:before,\n.container:after,\n.container-fluid:before,\n.container-fluid:after,\n.row:before,\n.row:after,\n.form-horizontal .form-group:before,\n.form-horizontal .form-group:after,\n.btn-toolbar:before,\n.btn-toolbar:after,\n.btn-group-vertical > .btn-group:before,\n.btn-group-vertical > .btn-group:after,\n.nav:before,\n.nav:after,\n.navbar:before,\n.navbar:after,\n.navbar-header:before,\n.navbar-header:after,\n.navbar-collapse:before,\n.navbar-collapse:after,\n.pager:before,\n.pager:after,\n.panel-body:before,\n.panel-body:after,\n.modal-footer:before,\n.modal-footer:after {\n content: \" \";\n display: table;\n}\n.clearfix:after,\n.dl-horizontal dd:after,\n.container:after,\n.container-fluid:after,\n.row:after,\n.form-horizontal .form-group:after,\n.btn-toolbar:after,\n.btn-group-vertical > .btn-group:after,\n.nav:after,\n.navbar:after,\n.navbar-header:after,\n.navbar-collapse:after,\n.pager:after,\n.panel-body:after,\n.modal-footer:after {\n clear: both;\n}\n.center-block {\n display: block;\n margin-left: auto;\n margin-right: auto;\n}\n.pull-right {\n float: right !important;\n}\n.pull-left {\n float: left !important;\n}\n.hide {\n display: none !important;\n}\n.show {\n display: block !important;\n}\n.invisible {\n visibility: hidden;\n}\n.text-hide {\n font: 0/0 a;\n color: transparent;\n text-shadow: none;\n background-color: transparent;\n border: 0;\n}\n.hidden {\n display: none !important;\n visibility: hidden !important;\n}\n.affix {\n position: fixed;\n}\n@-ms-viewport {\n width: device-width;\n}\n.visible-xs,\n.visible-sm,\n.visible-md,\n.visible-lg {\n display: none !important;\n}\n.visible-xs-block,\n.visible-xs-inline,\n.visible-xs-inline-block,\n.visible-sm-block,\n.visible-sm-inline,\n.visible-sm-inline-block,\n.visible-md-block,\n.visible-md-inline,\n.visible-md-inline-block,\n.visible-lg-block,\n.visible-lg-inline,\n.visible-lg-inline-block {\n display: none !important;\n}\n@media (max-width: 767px) {\n .visible-xs {\n display: block !important;\n }\n table.visible-xs {\n display: table;\n }\n tr.visible-xs {\n display: table-row !important;\n }\n th.visible-xs,\n td.visible-xs {\n display: table-cell !important;\n }\n}\n@media (max-width: 767px) {\n .visible-xs-block {\n display: block !important;\n }\n}\n@media (max-width: 767px) {\n .visible-xs-inline {\n display: inline !important;\n }\n}\n@media (max-width: 767px) {\n .visible-xs-inline-block {\n display: inline-block !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm {\n display: block !important;\n }\n table.visible-sm {\n display: table;\n }\n tr.visible-sm {\n display: table-row !important;\n }\n th.visible-sm,\n td.visible-sm {\n display: table-cell !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm-block {\n display: block !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm-inline {\n display: inline !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm-inline-block {\n display: inline-block !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md {\n display: block !important;\n }\n table.visible-md {\n display: table;\n }\n tr.visible-md {\n display: table-row !important;\n }\n th.visible-md,\n td.visible-md {\n display: table-cell !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md-block {\n display: block !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md-inline {\n display: inline !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md-inline-block {\n display: inline-block !important;\n }\n}\n@media (min-width: 1200px) {\n .visible-lg {\n display: block !important;\n }\n table.visible-lg {\n display: table;\n }\n tr.visible-lg {\n display: table-row !important;\n }\n th.visible-lg,\n td.visible-lg {\n display: table-cell !important;\n }\n}\n@media (min-width: 1200px) {\n .visible-lg-block {\n display: block !important;\n }\n}\n@media (min-width: 1200px) {\n .visible-lg-inline {\n display: inline !important;\n }\n}\n@media (min-width: 1200px) {\n .visible-lg-inline-block {\n display: inline-block !important;\n }\n}\n@media (max-width: 767px) {\n .hidden-xs {\n display: none !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .hidden-sm {\n display: none !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .hidden-md {\n display: none !important;\n }\n}\n@media (min-width: 1200px) {\n .hidden-lg {\n display: none !important;\n }\n}\n.visible-print {\n display: none !important;\n}\n@media print {\n .visible-print {\n display: block !important;\n }\n table.visible-print {\n display: table;\n }\n tr.visible-print {\n display: table-row !important;\n }\n th.visible-print,\n td.visible-print {\n display: table-cell !important;\n }\n}\n.visible-print-block {\n display: none !important;\n}\n@media print {\n .visible-print-block {\n display: block !important;\n }\n}\n.visible-print-inline {\n display: none !important;\n}\n@media print {\n .visible-print-inline {\n display: inline !important;\n }\n}\n.visible-print-inline-block {\n display: none !important;\n}\n@media print {\n .visible-print-inline-block {\n display: inline-block !important;\n }\n}\n@media print {\n .hidden-print {\n display: none !important;\n }\n}\n/*# sourceMappingURL=bootstrap.css.map */","/*! normalize.css v3.0.2 | MIT License | git.io/normalize */\n\n//\n// 1. Set default font family to sans-serif.\n// 2. Prevent iOS text size adjust after orientation change, without disabling\n// user zoom.\n//\n\nhtml {\n font-family: sans-serif; // 1\n -ms-text-size-adjust: 100%; // 2\n -webkit-text-size-adjust: 100%; // 2\n}\n\n//\n// Remove default margin.\n//\n\nbody {\n margin: 0;\n}\n\n// HTML5 display definitions\n// ==========================================================================\n\n//\n// Correct `block` display not defined for any HTML5 element in IE 8/9.\n// Correct `block` display not defined for `details` or `summary` in IE 10/11\n// and Firefox.\n// Correct `block` display not defined for `main` in IE 11.\n//\n\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nmain,\nmenu,\nnav,\nsection,\nsummary {\n display: block;\n}\n\n//\n// 1. Correct `inline-block` display not defined in IE 8/9.\n// 2. Normalize vertical alignment of `progress` in Chrome, Firefox, and Opera.\n//\n\naudio,\ncanvas,\nprogress,\nvideo {\n display: inline-block; // 1\n vertical-align: baseline; // 2\n}\n\n//\n// Prevent modern browsers from displaying `audio` without controls.\n// Remove excess height in iOS 5 devices.\n//\n\naudio:not([controls]) {\n display: none;\n height: 0;\n}\n\n//\n// Address `[hidden]` styling not present in IE 8/9/10.\n// Hide the `template` element in IE 8/9/11, Safari, and Firefox < 22.\n//\n\n[hidden],\ntemplate {\n display: none;\n}\n\n// Links\n// ==========================================================================\n\n//\n// Remove the gray background color from active links in IE 10.\n//\n\na {\n background-color: transparent;\n}\n\n//\n// Improve readability when focused and also mouse hovered in all browsers.\n//\n\na:active,\na:hover {\n outline: 0;\n}\n\n// Text-level semantics\n// ==========================================================================\n\n//\n// Address styling not present in IE 8/9/10/11, Safari, and Chrome.\n//\n\nabbr[title] {\n border-bottom: 1px dotted;\n}\n\n//\n// Address style set to `bolder` in Firefox 4+, Safari, and Chrome.\n//\n\nb,\nstrong {\n font-weight: bold;\n}\n\n//\n// Address styling not present in Safari and Chrome.\n//\n\ndfn {\n font-style: italic;\n}\n\n//\n// Address variable `h1` font-size and margin within `section` and `article`\n// contexts in Firefox 4+, Safari, and Chrome.\n//\n\nh1 {\n font-size: 2em;\n margin: 0.67em 0;\n}\n\n//\n// Address styling not present in IE 8/9.\n//\n\nmark {\n background: #ff0;\n color: #000;\n}\n\n//\n// Address inconsistent and variable font size in all browsers.\n//\n\nsmall {\n font-size: 80%;\n}\n\n//\n// Prevent `sub` and `sup` affecting `line-height` in all browsers.\n//\n\nsub,\nsup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n}\n\nsup {\n top: -0.5em;\n}\n\nsub {\n bottom: -0.25em;\n}\n\n// Embedded content\n// ==========================================================================\n\n//\n// Remove border when inside `a` element in IE 8/9/10.\n//\n\nimg {\n border: 0;\n}\n\n//\n// Correct overflow not hidden in IE 9/10/11.\n//\n\nsvg:not(:root) {\n overflow: hidden;\n}\n\n// Grouping content\n// ==========================================================================\n\n//\n// Address margin not present in IE 8/9 and Safari.\n//\n\nfigure {\n margin: 1em 40px;\n}\n\n//\n// Address differences between Firefox and other browsers.\n//\n\nhr {\n -moz-box-sizing: content-box;\n box-sizing: content-box;\n height: 0;\n}\n\n//\n// Contain overflow in all browsers.\n//\n\npre {\n overflow: auto;\n}\n\n//\n// Address odd `em`-unit font size rendering in all browsers.\n//\n\ncode,\nkbd,\npre,\nsamp {\n font-family: monospace, monospace;\n font-size: 1em;\n}\n\n// Forms\n// ==========================================================================\n\n//\n// Known limitation: by default, Chrome and Safari on OS X allow very limited\n// styling of `select`, unless a `border` property is set.\n//\n\n//\n// 1. Correct color not being inherited.\n// Known issue: affects color of disabled elements.\n// 2. Correct font properties not being inherited.\n// 3. Address margins set differently in Firefox 4+, Safari, and Chrome.\n//\n\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n color: inherit; // 1\n font: inherit; // 2\n margin: 0; // 3\n}\n\n//\n// Address `overflow` set to `hidden` in IE 8/9/10/11.\n//\n\nbutton {\n overflow: visible;\n}\n\n//\n// Address inconsistent `text-transform` inheritance for `button` and `select`.\n// All other form control elements do not inherit `text-transform` values.\n// Correct `button` style inheritance in Firefox, IE 8/9/10/11, and Opera.\n// Correct `select` style inheritance in Firefox.\n//\n\nbutton,\nselect {\n text-transform: none;\n}\n\n//\n// 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio`\n// and `video` controls.\n// 2. Correct inability to style clickable `input` types in iOS.\n// 3. Improve usability and consistency of cursor style between image-type\n// `input` and others.\n//\n\nbutton,\nhtml input[type=\"button\"], // 1\ninput[type=\"reset\"],\ninput[type=\"submit\"] {\n -webkit-appearance: button; // 2\n cursor: pointer; // 3\n}\n\n//\n// Re-set default cursor for disabled elements.\n//\n\nbutton[disabled],\nhtml input[disabled] {\n cursor: default;\n}\n\n//\n// Remove inner padding and border in Firefox 4+.\n//\n\nbutton::-moz-focus-inner,\ninput::-moz-focus-inner {\n border: 0;\n padding: 0;\n}\n\n//\n// Address Firefox 4+ setting `line-height` on `input` using `!important` in\n// the UA stylesheet.\n//\n\ninput {\n line-height: normal;\n}\n\n//\n// It's recommended that you don't attempt to style these elements.\n// Firefox's implementation doesn't respect box-sizing, padding, or width.\n//\n// 1. Address box sizing set to `content-box` in IE 8/9/10.\n// 2. Remove excess padding in IE 8/9/10.\n//\n\ninput[type=\"checkbox\"],\ninput[type=\"radio\"] {\n box-sizing: border-box; // 1\n padding: 0; // 2\n}\n\n//\n// Fix the cursor style for Chrome's increment/decrement buttons. For certain\n// `font-size` values of the `input`, it causes the cursor style of the\n// decrement button to change from `default` to `text`.\n//\n\ninput[type=\"number\"]::-webkit-inner-spin-button,\ninput[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\n\n//\n// 1. Address `appearance` set to `searchfield` in Safari and Chrome.\n// 2. Address `box-sizing` set to `border-box` in Safari and Chrome\n// (include `-moz` to future-proof).\n//\n\ninput[type=\"search\"] {\n -webkit-appearance: textfield; // 1\n -moz-box-sizing: content-box;\n -webkit-box-sizing: content-box; // 2\n box-sizing: content-box;\n}\n\n//\n// Remove inner padding and search cancel button in Safari and Chrome on OS X.\n// Safari (but not Chrome) clips the cancel button when the search input has\n// padding (and `textfield` appearance).\n//\n\ninput[type=\"search\"]::-webkit-search-cancel-button,\ninput[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n//\n// Define consistent border, margin, and padding.\n//\n\nfieldset {\n border: 1px solid #c0c0c0;\n margin: 0 2px;\n padding: 0.35em 0.625em 0.75em;\n}\n\n//\n// 1. Correct `color` not being inherited in IE 8/9/10/11.\n// 2. Remove padding so people aren't caught out if they zero out fieldsets.\n//\n\nlegend {\n border: 0; // 1\n padding: 0; // 2\n}\n\n//\n// Remove default vertical scrollbar in IE 8/9/10/11.\n//\n\ntextarea {\n overflow: auto;\n}\n\n//\n// Don't inherit the `font-weight` (applied by a rule above).\n// NOTE: the default cannot safely be changed in Chrome and Safari on OS X.\n//\n\noptgroup {\n font-weight: bold;\n}\n\n// Tables\n// ==========================================================================\n\n//\n// Remove most spacing between table cells.\n//\n\ntable {\n border-collapse: collapse;\n border-spacing: 0;\n}\n\ntd,\nth {\n padding: 0;\n}\n","/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */\n\n// ==========================================================================\n// Print styles.\n// Inlined to avoid the additional HTTP request: h5bp.com/r\n// ==========================================================================\n\n@media print {\n *,\n *:before,\n *:after {\n background: transparent !important;\n color: #000 !important; // Black prints faster: h5bp.com/s\n box-shadow: none !important;\n text-shadow: none !important;\n }\n\n a,\n a:visited {\n text-decoration: underline;\n }\n\n a[href]:after {\n content: \" (\" attr(href) \")\";\n }\n\n abbr[title]:after {\n content: \" (\" attr(title) \")\";\n }\n\n // Don't show links that are fragment identifiers,\n // or use the `javascript:` pseudo protocol\n a[href^=\"#\"]:after,\n a[href^=\"javascript:\"]:after {\n content: \"\";\n }\n\n pre,\n blockquote {\n border: 1px solid #999;\n page-break-inside: avoid;\n }\n\n thead {\n display: table-header-group; // h5bp.com/t\n }\n\n tr,\n img {\n page-break-inside: avoid;\n }\n\n img {\n max-width: 100% !important;\n }\n\n p,\n h2,\n h3 {\n orphans: 3;\n widows: 3;\n }\n\n h2,\n h3 {\n page-break-after: avoid;\n }\n\n // Bootstrap specific changes start\n //\n // Chrome (OSX) fix for https://github.com/twbs/bootstrap/issues/11245\n // Once fixed, we can just straight up remove this.\n select {\n background: #fff !important;\n }\n\n // Bootstrap components\n .navbar {\n display: none;\n }\n .btn,\n .dropup > .btn {\n > .caret {\n border-top-color: #000 !important;\n }\n }\n .label {\n border: 1px solid #000;\n }\n\n .table {\n border-collapse: collapse !important;\n\n td,\n th {\n background-color: #fff !important;\n }\n }\n .table-bordered {\n th,\n td {\n border: 1px solid #ddd !important;\n }\n }\n\n // Bootstrap specific changes end\n}\n","//\n// Glyphicons for Bootstrap\n//\n// Since icons are fonts, they can be placed anywhere text is placed and are\n// thus automatically sized to match the surrounding child. To use, create an\n// inline element with the appropriate classes, like so:\n//\n// Star\n\n// Import the fonts\n@font-face {\n font-family: 'Glyphicons Halflings';\n src: url('@{icon-font-path}@{icon-font-name}.eot');\n src: url('@{icon-font-path}@{icon-font-name}.eot?#iefix') format('embedded-opentype'),\n url('@{icon-font-path}@{icon-font-name}.woff') format('woff'),\n url('@{icon-font-path}@{icon-font-name}.ttf') format('truetype'),\n url('@{icon-font-path}@{icon-font-name}.svg#@{icon-font-svg-id}') format('svg');\n}\n\n// Catchall baseclass\n.glyphicon {\n position: relative;\n top: 1px;\n display: inline-block;\n font-family: 'Glyphicons Halflings';\n font-style: normal;\n font-weight: normal;\n line-height: 1;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n}\n\n// Individual icons\n.glyphicon-asterisk { &:before { content: \"\\2a\"; } }\n.glyphicon-plus { &:before { content: \"\\2b\"; } }\n.glyphicon-euro,\n.glyphicon-eur { &:before { content: \"\\20ac\"; } }\n.glyphicon-minus { &:before { content: \"\\2212\"; } }\n.glyphicon-cloud { &:before { content: \"\\2601\"; } }\n.glyphicon-envelope { &:before { content: \"\\2709\"; } }\n.glyphicon-pencil { &:before { content: \"\\270f\"; } }\n.glyphicon-glass { &:before { content: \"\\e001\"; } }\n.glyphicon-music { &:before { content: \"\\e002\"; } }\n.glyphicon-search { &:before { content: \"\\e003\"; } }\n.glyphicon-heart { &:before { content: \"\\e005\"; } }\n.glyphicon-star { &:before { content: \"\\e006\"; } }\n.glyphicon-star-empty { &:before { content: \"\\e007\"; } }\n.glyphicon-user { &:before { content: \"\\e008\"; } }\n.glyphicon-film { &:before { content: \"\\e009\"; } }\n.glyphicon-th-large { &:before { content: \"\\e010\"; } }\n.glyphicon-th { &:before { content: \"\\e011\"; } }\n.glyphicon-th-list { &:before { content: \"\\e012\"; } }\n.glyphicon-ok { &:before { content: \"\\e013\"; } }\n.glyphicon-remove { &:before { content: \"\\e014\"; } }\n.glyphicon-zoom-in { &:before { content: \"\\e015\"; } }\n.glyphicon-zoom-out { &:before { content: \"\\e016\"; } }\n.glyphicon-off { &:before { content: \"\\e017\"; } }\n.glyphicon-signal { &:before { content: \"\\e018\"; } }\n.glyphicon-cog { &:before { content: \"\\e019\"; } }\n.glyphicon-trash { &:before { content: \"\\e020\"; } }\n.glyphicon-home { &:before { content: \"\\e021\"; } }\n.glyphicon-file { &:before { content: \"\\e022\"; } }\n.glyphicon-time { &:before { content: \"\\e023\"; } }\n.glyphicon-road { &:before { content: \"\\e024\"; } }\n.glyphicon-download-alt { &:before { content: \"\\e025\"; } }\n.glyphicon-download { &:before { content: \"\\e026\"; } }\n.glyphicon-upload { &:before { content: \"\\e027\"; } }\n.glyphicon-inbox { &:before { content: \"\\e028\"; } }\n.glyphicon-play-circle { &:before { content: \"\\e029\"; } }\n.glyphicon-repeat { &:before { content: \"\\e030\"; } }\n.glyphicon-refresh { &:before { content: \"\\e031\"; } }\n.glyphicon-list-alt { &:before { content: \"\\e032\"; } }\n.glyphicon-lock { &:before { content: \"\\e033\"; } }\n.glyphicon-flag { &:before { content: \"\\e034\"; } }\n.glyphicon-headphones { &:before { content: \"\\e035\"; } }\n.glyphicon-volume-off { &:before { content: \"\\e036\"; } }\n.glyphicon-volume-down { &:before { content: \"\\e037\"; } }\n.glyphicon-volume-up { &:before { content: \"\\e038\"; } }\n.glyphicon-qrcode { &:before { content: \"\\e039\"; } }\n.glyphicon-barcode { &:before { content: \"\\e040\"; } }\n.glyphicon-tag { &:before { content: \"\\e041\"; } }\n.glyphicon-tags { &:before { content: \"\\e042\"; } }\n.glyphicon-book { &:before { content: \"\\e043\"; } }\n.glyphicon-bookmark { &:before { content: \"\\e044\"; } }\n.glyphicon-print { &:before { content: \"\\e045\"; } }\n.glyphicon-camera { &:before { content: \"\\e046\"; } }\n.glyphicon-font { &:before { content: \"\\e047\"; } }\n.glyphicon-bold { &:before { content: \"\\e048\"; } }\n.glyphicon-italic { &:before { content: \"\\e049\"; } }\n.glyphicon-text-height { &:before { content: \"\\e050\"; } }\n.glyphicon-text-width { &:before { content: \"\\e051\"; } }\n.glyphicon-align-left { &:before { content: \"\\e052\"; } }\n.glyphicon-align-center { &:before { content: \"\\e053\"; } }\n.glyphicon-align-right { &:before { content: \"\\e054\"; } }\n.glyphicon-align-justify { &:before { content: \"\\e055\"; } }\n.glyphicon-list { &:before { content: \"\\e056\"; } }\n.glyphicon-indent-left { &:before { content: \"\\e057\"; } }\n.glyphicon-indent-right { &:before { content: \"\\e058\"; } }\n.glyphicon-facetime-video { &:before { content: \"\\e059\"; } }\n.glyphicon-picture { &:before { content: \"\\e060\"; } }\n.glyphicon-map-marker { &:before { content: \"\\e062\"; } }\n.glyphicon-adjust { &:before { content: \"\\e063\"; } }\n.glyphicon-tint { &:before { content: \"\\e064\"; } }\n.glyphicon-edit { &:before { content: \"\\e065\"; } }\n.glyphicon-share { &:before { content: \"\\e066\"; } }\n.glyphicon-check { &:before { content: \"\\e067\"; } }\n.glyphicon-move { &:before { content: \"\\e068\"; } }\n.glyphicon-step-backward { &:before { content: \"\\e069\"; } }\n.glyphicon-fast-backward { &:before { content: \"\\e070\"; } }\n.glyphicon-backward { &:before { content: \"\\e071\"; } }\n.glyphicon-play { &:before { content: \"\\e072\"; } }\n.glyphicon-pause { &:before { content: \"\\e073\"; } }\n.glyphicon-stop { &:before { content: \"\\e074\"; } }\n.glyphicon-forward { &:before { content: \"\\e075\"; } }\n.glyphicon-fast-forward { &:before { content: \"\\e076\"; } }\n.glyphicon-step-forward { &:before { content: \"\\e077\"; } }\n.glyphicon-eject { &:before { content: \"\\e078\"; } }\n.glyphicon-chevron-left { &:before { content: \"\\e079\"; } }\n.glyphicon-chevron-right { &:before { content: \"\\e080\"; } }\n.glyphicon-plus-sign { &:before { content: \"\\e081\"; } }\n.glyphicon-minus-sign { &:before { content: \"\\e082\"; } }\n.glyphicon-remove-sign { &:before { content: \"\\e083\"; } }\n.glyphicon-ok-sign { &:before { content: \"\\e084\"; } }\n.glyphicon-question-sign { &:before { content: \"\\e085\"; } }\n.glyphicon-info-sign { &:before { content: \"\\e086\"; } }\n.glyphicon-screenshot { &:before { content: \"\\e087\"; } }\n.glyphicon-remove-circle { &:before { content: \"\\e088\"; } }\n.glyphicon-ok-circle { &:before { content: \"\\e089\"; } }\n.glyphicon-ban-circle { &:before { content: \"\\e090\"; } }\n.glyphicon-arrow-left { &:before { content: \"\\e091\"; } }\n.glyphicon-arrow-right { &:before { content: \"\\e092\"; } }\n.glyphicon-arrow-up { &:before { content: \"\\e093\"; } }\n.glyphicon-arrow-down { &:before { content: \"\\e094\"; } }\n.glyphicon-share-alt { &:before { content: \"\\e095\"; } }\n.glyphicon-resize-full { &:before { content: \"\\e096\"; } }\n.glyphicon-resize-small { &:before { content: \"\\e097\"; } }\n.glyphicon-exclamation-sign { &:before { content: \"\\e101\"; } }\n.glyphicon-gift { &:before { content: \"\\e102\"; } }\n.glyphicon-leaf { &:before { content: \"\\e103\"; } }\n.glyphicon-fire { &:before { content: \"\\e104\"; } }\n.glyphicon-eye-open { &:before { content: \"\\e105\"; } }\n.glyphicon-eye-close { &:before { content: \"\\e106\"; } }\n.glyphicon-warning-sign { &:before { content: \"\\e107\"; } }\n.glyphicon-plane { &:before { content: \"\\e108\"; } }\n.glyphicon-calendar { &:before { content: \"\\e109\"; } }\n.glyphicon-random { &:before { content: \"\\e110\"; } }\n.glyphicon-comment { &:before { content: \"\\e111\"; } }\n.glyphicon-magnet { &:before { content: \"\\e112\"; } }\n.glyphicon-chevron-up { &:before { content: \"\\e113\"; } }\n.glyphicon-chevron-down { &:before { content: \"\\e114\"; } }\n.glyphicon-retweet { &:before { content: \"\\e115\"; } }\n.glyphicon-shopping-cart { &:before { content: \"\\e116\"; } }\n.glyphicon-folder-close { &:before { content: \"\\e117\"; } }\n.glyphicon-folder-open { &:before { content: \"\\e118\"; } }\n.glyphicon-resize-vertical { &:before { content: \"\\e119\"; } }\n.glyphicon-resize-horizontal { &:before { content: \"\\e120\"; } }\n.glyphicon-hdd { &:before { content: \"\\e121\"; } }\n.glyphicon-bullhorn { &:before { content: \"\\e122\"; } }\n.glyphicon-bell { &:before { content: \"\\e123\"; } }\n.glyphicon-certificate { &:before { content: \"\\e124\"; } }\n.glyphicon-thumbs-up { &:before { content: \"\\e125\"; } }\n.glyphicon-thumbs-down { &:before { content: \"\\e126\"; } }\n.glyphicon-hand-right { &:before { content: \"\\e127\"; } }\n.glyphicon-hand-left { &:before { content: \"\\e128\"; } }\n.glyphicon-hand-up { &:before { content: \"\\e129\"; } }\n.glyphicon-hand-down { &:before { content: \"\\e130\"; } }\n.glyphicon-circle-arrow-right { &:before { content: \"\\e131\"; } }\n.glyphicon-circle-arrow-left { &:before { content: \"\\e132\"; } }\n.glyphicon-circle-arrow-up { &:before { content: \"\\e133\"; } }\n.glyphicon-circle-arrow-down { &:before { content: \"\\e134\"; } }\n.glyphicon-globe { &:before { content: \"\\e135\"; } }\n.glyphicon-wrench { &:before { content: \"\\e136\"; } }\n.glyphicon-tasks { &:before { content: \"\\e137\"; } }\n.glyphicon-filter { &:before { content: \"\\e138\"; } }\n.glyphicon-briefcase { &:before { content: \"\\e139\"; } }\n.glyphicon-fullscreen { &:before { content: \"\\e140\"; } }\n.glyphicon-dashboard { &:before { content: \"\\e141\"; } }\n.glyphicon-paperclip { &:before { content: \"\\e142\"; } }\n.glyphicon-heart-empty { &:before { content: \"\\e143\"; } }\n.glyphicon-link { &:before { content: \"\\e144\"; } }\n.glyphicon-phone { &:before { content: \"\\e145\"; } }\n.glyphicon-pushpin { &:before { content: \"\\e146\"; } }\n.glyphicon-usd { &:before { content: \"\\e148\"; } }\n.glyphicon-gbp { &:before { content: \"\\e149\"; } }\n.glyphicon-sort { &:before { content: \"\\e150\"; } }\n.glyphicon-sort-by-alphabet { &:before { content: \"\\e151\"; } }\n.glyphicon-sort-by-alphabet-alt { &:before { content: \"\\e152\"; } }\n.glyphicon-sort-by-order { &:before { content: \"\\e153\"; } }\n.glyphicon-sort-by-order-alt { &:before { content: \"\\e154\"; } }\n.glyphicon-sort-by-attributes { &:before { content: \"\\e155\"; } }\n.glyphicon-sort-by-attributes-alt { &:before { content: \"\\e156\"; } }\n.glyphicon-unchecked { &:before { content: \"\\e157\"; } }\n.glyphicon-expand { &:before { content: \"\\e158\"; } }\n.glyphicon-collapse-down { &:before { content: \"\\e159\"; } }\n.glyphicon-collapse-up { &:before { content: \"\\e160\"; } }\n.glyphicon-log-in { &:before { content: \"\\e161\"; } }\n.glyphicon-flash { &:before { content: \"\\e162\"; } }\n.glyphicon-log-out { &:before { content: \"\\e163\"; } }\n.glyphicon-new-window { &:before { content: \"\\e164\"; } }\n.glyphicon-record { &:before { content: \"\\e165\"; } }\n.glyphicon-save { &:before { content: \"\\e166\"; } }\n.glyphicon-open { &:before { content: \"\\e167\"; } }\n.glyphicon-saved { &:before { content: \"\\e168\"; } }\n.glyphicon-import { &:before { content: \"\\e169\"; } }\n.glyphicon-export { &:before { content: \"\\e170\"; } }\n.glyphicon-send { &:before { content: \"\\e171\"; } }\n.glyphicon-floppy-disk { &:before { content: \"\\e172\"; } }\n.glyphicon-floppy-saved { &:before { content: \"\\e173\"; } }\n.glyphicon-floppy-remove { &:before { content: \"\\e174\"; } }\n.glyphicon-floppy-save { &:before { content: \"\\e175\"; } }\n.glyphicon-floppy-open { &:before { content: \"\\e176\"; } }\n.glyphicon-credit-card { &:before { content: \"\\e177\"; } }\n.glyphicon-transfer { &:before { content: \"\\e178\"; } }\n.glyphicon-cutlery { &:before { content: \"\\e179\"; } }\n.glyphicon-header { &:before { content: \"\\e180\"; } }\n.glyphicon-compressed { &:before { content: \"\\e181\"; } }\n.glyphicon-earphone { &:before { content: \"\\e182\"; } }\n.glyphicon-phone-alt { &:before { content: \"\\e183\"; } }\n.glyphicon-tower { &:before { content: \"\\e184\"; } }\n.glyphicon-stats { &:before { content: \"\\e185\"; } }\n.glyphicon-sd-video { &:before { content: \"\\e186\"; } }\n.glyphicon-hd-video { &:before { content: \"\\e187\"; } }\n.glyphicon-subtitles { &:before { content: \"\\e188\"; } }\n.glyphicon-sound-stereo { &:before { content: \"\\e189\"; } }\n.glyphicon-sound-dolby { &:before { content: \"\\e190\"; } }\n.glyphicon-sound-5-1 { &:before { content: \"\\e191\"; } }\n.glyphicon-sound-6-1 { &:before { content: \"\\e192\"; } }\n.glyphicon-sound-7-1 { &:before { content: \"\\e193\"; } }\n.glyphicon-copyright-mark { &:before { content: \"\\e194\"; } }\n.glyphicon-registration-mark { &:before { content: \"\\e195\"; } }\n.glyphicon-cloud-download { &:before { content: \"\\e197\"; } }\n.glyphicon-cloud-upload { &:before { content: \"\\e198\"; } }\n.glyphicon-tree-conifer { &:before { content: \"\\e199\"; } }\n.glyphicon-tree-deciduous { &:before { content: \"\\e200\"; } }\n","//\n// Scaffolding\n// --------------------------------------------------\n\n\n// Reset the box-sizing\n//\n// Heads up! This reset may cause conflicts with some third-party widgets.\n// For recommendations on resolving such conflicts, see\n// http://getbootstrap.com/getting-started/#third-box-sizing\n* {\n .box-sizing(border-box);\n}\n*:before,\n*:after {\n .box-sizing(border-box);\n}\n\n\n// Body reset\n\nhtml {\n font-size: 10px;\n -webkit-tap-highlight-color: rgba(0,0,0,0);\n}\n\nbody {\n font-family: @font-family-base;\n font-size: @font-size-base;\n line-height: @line-height-base;\n color: @text-color;\n background-color: @body-bg;\n}\n\n// Reset fonts for relevant elements\ninput,\nbutton,\nselect,\ntextarea {\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n}\n\n\n// Links\n\na {\n color: @link-color;\n text-decoration: none;\n\n &:hover,\n &:focus {\n color: @link-hover-color;\n text-decoration: @link-hover-decoration;\n }\n\n &:focus {\n .tab-focus();\n }\n}\n\n\n// Figures\n//\n// We reset this here because previously Normalize had no `figure` margins. This\n// ensures we don't break anyone's use of the element.\n\nfigure {\n margin: 0;\n}\n\n\n// Images\n\nimg {\n vertical-align: middle;\n}\n\n// Responsive images (ensure images don't scale beyond their parents)\n.img-responsive {\n .img-responsive();\n}\n\n// Rounded corners\n.img-rounded {\n border-radius: @border-radius-large;\n}\n\n// Image thumbnails\n//\n// Heads up! This is mixin-ed into thumbnails.less for `.thumbnail`.\n.img-thumbnail {\n padding: @thumbnail-padding;\n line-height: @line-height-base;\n background-color: @thumbnail-bg;\n border: 1px solid @thumbnail-border;\n border-radius: @thumbnail-border-radius;\n .transition(all .2s ease-in-out);\n\n // Keep them at most 100% wide\n .img-responsive(inline-block);\n}\n\n// Perfect circle\n.img-circle {\n border-radius: 50%; // set radius in percents\n}\n\n\n// Horizontal rules\n\nhr {\n margin-top: @line-height-computed;\n margin-bottom: @line-height-computed;\n border: 0;\n border-top: 1px solid @hr-border;\n}\n\n\n// Only display content to screen readers\n//\n// See: http://a11yproject.com/posts/how-to-hide-content/\n\n.sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n margin: -1px;\n padding: 0;\n overflow: hidden;\n clip: rect(0,0,0,0);\n border: 0;\n}\n\n// Use in conjunction with .sr-only to only display content when it's focused.\n// Useful for \"Skip to main content\" links; see http://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1\n// Credit: HTML5 Boilerplate\n\n.sr-only-focusable {\n &:active,\n &:focus {\n position: static;\n width: auto;\n height: auto;\n margin: 0;\n overflow: visible;\n clip: auto;\n }\n}\n","// Vendor Prefixes\n//\n// All vendor mixins are deprecated as of v3.2.0 due to the introduction of\n// Autoprefixer in our Gruntfile. They will be removed in v4.\n\n// - Animations\n// - Backface visibility\n// - Box shadow\n// - Box sizing\n// - Content columns\n// - Hyphens\n// - Placeholder text\n// - Transformations\n// - Transitions\n// - User Select\n\n\n// Animations\n.animation(@animation) {\n -webkit-animation: @animation;\n -o-animation: @animation;\n animation: @animation;\n}\n.animation-name(@name) {\n -webkit-animation-name: @name;\n animation-name: @name;\n}\n.animation-duration(@duration) {\n -webkit-animation-duration: @duration;\n animation-duration: @duration;\n}\n.animation-timing-function(@timing-function) {\n -webkit-animation-timing-function: @timing-function;\n animation-timing-function: @timing-function;\n}\n.animation-delay(@delay) {\n -webkit-animation-delay: @delay;\n animation-delay: @delay;\n}\n.animation-iteration-count(@iteration-count) {\n -webkit-animation-iteration-count: @iteration-count;\n animation-iteration-count: @iteration-count;\n}\n.animation-direction(@direction) {\n -webkit-animation-direction: @direction;\n animation-direction: @direction;\n}\n.animation-fill-mode(@fill-mode) {\n -webkit-animation-fill-mode: @fill-mode;\n animation-fill-mode: @fill-mode;\n}\n\n// Backface visibility\n// Prevent browsers from flickering when using CSS 3D transforms.\n// Default value is `visible`, but can be changed to `hidden`\n\n.backface-visibility(@visibility){\n -webkit-backface-visibility: @visibility;\n -moz-backface-visibility: @visibility;\n backface-visibility: @visibility;\n}\n\n// Drop shadows\n//\n// Note: Deprecated `.box-shadow()` as of v3.1.0 since all of Bootstrap's\n// supported browsers that have box shadow capabilities now support it.\n\n.box-shadow(@shadow) {\n -webkit-box-shadow: @shadow; // iOS <4.3 & Android <4.1\n box-shadow: @shadow;\n}\n\n// Box sizing\n.box-sizing(@boxmodel) {\n -webkit-box-sizing: @boxmodel;\n -moz-box-sizing: @boxmodel;\n box-sizing: @boxmodel;\n}\n\n// CSS3 Content Columns\n.content-columns(@column-count; @column-gap: @grid-gutter-width) {\n -webkit-column-count: @column-count;\n -moz-column-count: @column-count;\n column-count: @column-count;\n -webkit-column-gap: @column-gap;\n -moz-column-gap: @column-gap;\n column-gap: @column-gap;\n}\n\n// Optional hyphenation\n.hyphens(@mode: auto) {\n word-wrap: break-word;\n -webkit-hyphens: @mode;\n -moz-hyphens: @mode;\n -ms-hyphens: @mode; // IE10+\n -o-hyphens: @mode;\n hyphens: @mode;\n}\n\n// Placeholder text\n.placeholder(@color: @input-color-placeholder) {\n // Firefox\n &::-moz-placeholder {\n color: @color;\n opacity: 1; // See https://github.com/twbs/bootstrap/pull/11526\n }\n &:-ms-input-placeholder { color: @color; } // Internet Explorer 10+\n &::-webkit-input-placeholder { color: @color; } // Safari and Chrome\n}\n\n// Transformations\n.scale(@ratio) {\n -webkit-transform: scale(@ratio);\n -ms-transform: scale(@ratio); // IE9 only\n -o-transform: scale(@ratio);\n transform: scale(@ratio);\n}\n.scale(@ratioX; @ratioY) {\n -webkit-transform: scale(@ratioX, @ratioY);\n -ms-transform: scale(@ratioX, @ratioY); // IE9 only\n -o-transform: scale(@ratioX, @ratioY);\n transform: scale(@ratioX, @ratioY);\n}\n.scaleX(@ratio) {\n -webkit-transform: scaleX(@ratio);\n -ms-transform: scaleX(@ratio); // IE9 only\n -o-transform: scaleX(@ratio);\n transform: scaleX(@ratio);\n}\n.scaleY(@ratio) {\n -webkit-transform: scaleY(@ratio);\n -ms-transform: scaleY(@ratio); // IE9 only\n -o-transform: scaleY(@ratio);\n transform: scaleY(@ratio);\n}\n.skew(@x; @y) {\n -webkit-transform: skewX(@x) skewY(@y);\n -ms-transform: skewX(@x) skewY(@y); // See https://github.com/twbs/bootstrap/issues/4885; IE9+\n -o-transform: skewX(@x) skewY(@y);\n transform: skewX(@x) skewY(@y);\n}\n.translate(@x; @y) {\n -webkit-transform: translate(@x, @y);\n -ms-transform: translate(@x, @y); // IE9 only\n -o-transform: translate(@x, @y);\n transform: translate(@x, @y);\n}\n.translate3d(@x; @y; @z) {\n -webkit-transform: translate3d(@x, @y, @z);\n transform: translate3d(@x, @y, @z);\n}\n.rotate(@degrees) {\n -webkit-transform: rotate(@degrees);\n -ms-transform: rotate(@degrees); // IE9 only\n -o-transform: rotate(@degrees);\n transform: rotate(@degrees);\n}\n.rotateX(@degrees) {\n -webkit-transform: rotateX(@degrees);\n -ms-transform: rotateX(@degrees); // IE9 only\n -o-transform: rotateX(@degrees);\n transform: rotateX(@degrees);\n}\n.rotateY(@degrees) {\n -webkit-transform: rotateY(@degrees);\n -ms-transform: rotateY(@degrees); // IE9 only\n -o-transform: rotateY(@degrees);\n transform: rotateY(@degrees);\n}\n.perspective(@perspective) {\n -webkit-perspective: @perspective;\n -moz-perspective: @perspective;\n perspective: @perspective;\n}\n.perspective-origin(@perspective) {\n -webkit-perspective-origin: @perspective;\n -moz-perspective-origin: @perspective;\n perspective-origin: @perspective;\n}\n.transform-origin(@origin) {\n -webkit-transform-origin: @origin;\n -moz-transform-origin: @origin;\n -ms-transform-origin: @origin; // IE9 only\n transform-origin: @origin;\n}\n\n\n// Transitions\n\n.transition(@transition) {\n -webkit-transition: @transition;\n -o-transition: @transition;\n transition: @transition;\n}\n.transition-property(@transition-property) {\n -webkit-transition-property: @transition-property;\n transition-property: @transition-property;\n}\n.transition-delay(@transition-delay) {\n -webkit-transition-delay: @transition-delay;\n transition-delay: @transition-delay;\n}\n.transition-duration(@transition-duration) {\n -webkit-transition-duration: @transition-duration;\n transition-duration: @transition-duration;\n}\n.transition-timing-function(@timing-function) {\n -webkit-transition-timing-function: @timing-function;\n transition-timing-function: @timing-function;\n}\n.transition-transform(@transition) {\n -webkit-transition: -webkit-transform @transition;\n -moz-transition: -moz-transform @transition;\n -o-transition: -o-transform @transition;\n transition: transform @transition;\n}\n\n\n// User select\n// For selecting text on the page\n\n.user-select(@select) {\n -webkit-user-select: @select;\n -moz-user-select: @select;\n -ms-user-select: @select; // IE10+\n user-select: @select;\n}\n","// WebKit-style focus\n\n.tab-focus() {\n // Default\n outline: thin dotted;\n // WebKit\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px;\n}\n","// Image Mixins\n// - Responsive image\n// - Retina image\n\n\n// Responsive image\n//\n// Keep images from scaling beyond the width of their parents.\n.img-responsive(@display: block) {\n display: @display;\n max-width: 100%; // Part 1: Set a maximum relative to the parent\n height: auto; // Part 2: Scale the height according to the width, otherwise you get stretching\n}\n\n\n// Retina image\n//\n// Short retina mixin for setting background-image and -size. Note that the\n// spelling of `min--moz-device-pixel-ratio` is intentional.\n.img-retina(@file-1x; @file-2x; @width-1x; @height-1x) {\n background-image: url(\"@{file-1x}\");\n\n @media\n only screen and (-webkit-min-device-pixel-ratio: 2),\n only screen and ( min--moz-device-pixel-ratio: 2),\n only screen and ( -o-min-device-pixel-ratio: 2/1),\n only screen and ( min-device-pixel-ratio: 2),\n only screen and ( min-resolution: 192dpi),\n only screen and ( min-resolution: 2dppx) {\n background-image: url(\"@{file-2x}\");\n background-size: @width-1x @height-1x;\n }\n}\n","//\n// Typography\n// --------------------------------------------------\n\n\n// Headings\n// -------------------------\n\nh1, h2, h3, h4, h5, h6,\n.h1, .h2, .h3, .h4, .h5, .h6 {\n font-family: @headings-font-family;\n font-weight: @headings-font-weight;\n line-height: @headings-line-height;\n color: @headings-color;\n\n small,\n .small {\n font-weight: normal;\n line-height: 1;\n color: @headings-small-color;\n }\n}\n\nh1, .h1,\nh2, .h2,\nh3, .h3 {\n margin-top: @line-height-computed;\n margin-bottom: (@line-height-computed / 2);\n\n small,\n .small {\n font-size: 65%;\n }\n}\nh4, .h4,\nh5, .h5,\nh6, .h6 {\n margin-top: (@line-height-computed / 2);\n margin-bottom: (@line-height-computed / 2);\n\n small,\n .small {\n font-size: 75%;\n }\n}\n\nh1, .h1 { font-size: @font-size-h1; }\nh2, .h2 { font-size: @font-size-h2; }\nh3, .h3 { font-size: @font-size-h3; }\nh4, .h4 { font-size: @font-size-h4; }\nh5, .h5 { font-size: @font-size-h5; }\nh6, .h6 { font-size: @font-size-h6; }\n\n\n// Body text\n// -------------------------\n\np {\n margin: 0 0 (@line-height-computed / 2);\n}\n\n.lead {\n margin-bottom: @line-height-computed;\n font-size: floor((@font-size-base * 1.15));\n font-weight: 300;\n line-height: 1.4;\n\n @media (min-width: @screen-sm-min) {\n font-size: (@font-size-base * 1.5);\n }\n}\n\n\n// Emphasis & misc\n// -------------------------\n\n// Ex: (12px small font / 14px base font) * 100% = about 85%\nsmall,\n.small {\n font-size: floor((100% * @font-size-small / @font-size-base));\n}\n\nmark,\n.mark {\n background-color: @state-warning-bg;\n padding: .2em;\n}\n\n// Alignment\n.text-left { text-align: left; }\n.text-right { text-align: right; }\n.text-center { text-align: center; }\n.text-justify { text-align: justify; }\n.text-nowrap { white-space: nowrap; }\n\n// Transformation\n.text-lowercase { text-transform: lowercase; }\n.text-uppercase { text-transform: uppercase; }\n.text-capitalize { text-transform: capitalize; }\n\n// Contextual colors\n.text-muted {\n color: @text-muted;\n}\n.text-primary {\n .text-emphasis-variant(@brand-primary);\n}\n.text-success {\n .text-emphasis-variant(@state-success-text);\n}\n.text-info {\n .text-emphasis-variant(@state-info-text);\n}\n.text-warning {\n .text-emphasis-variant(@state-warning-text);\n}\n.text-danger {\n .text-emphasis-variant(@state-danger-text);\n}\n\n// Contextual backgrounds\n// For now we'll leave these alongside the text classes until v4 when we can\n// safely shift things around (per SemVer rules).\n.bg-primary {\n // Given the contrast here, this is the only class to have its color inverted\n // automatically.\n color: #fff;\n .bg-variant(@brand-primary);\n}\n.bg-success {\n .bg-variant(@state-success-bg);\n}\n.bg-info {\n .bg-variant(@state-info-bg);\n}\n.bg-warning {\n .bg-variant(@state-warning-bg);\n}\n.bg-danger {\n .bg-variant(@state-danger-bg);\n}\n\n\n// Page header\n// -------------------------\n\n.page-header {\n padding-bottom: ((@line-height-computed / 2) - 1);\n margin: (@line-height-computed * 2) 0 @line-height-computed;\n border-bottom: 1px solid @page-header-border-color;\n}\n\n\n// Lists\n// -------------------------\n\n// Unordered and Ordered lists\nul,\nol {\n margin-top: 0;\n margin-bottom: (@line-height-computed / 2);\n ul,\n ol {\n margin-bottom: 0;\n }\n}\n\n// List options\n\n// Unstyled keeps list items block level, just removes default browser padding and list-style\n.list-unstyled {\n padding-left: 0;\n list-style: none;\n}\n\n// Inline turns list items into inline-block\n.list-inline {\n .list-unstyled();\n margin-left: -5px;\n\n > li {\n display: inline-block;\n padding-left: 5px;\n padding-right: 5px;\n }\n}\n\n// Description Lists\ndl {\n margin-top: 0; // Remove browser default\n margin-bottom: @line-height-computed;\n}\ndt,\ndd {\n line-height: @line-height-base;\n}\ndt {\n font-weight: bold;\n}\ndd {\n margin-left: 0; // Undo browser default\n}\n\n// Horizontal description lists\n//\n// Defaults to being stacked without any of the below styles applied, until the\n// grid breakpoint is reached (default of ~768px).\n\n.dl-horizontal {\n dd {\n &:extend(.clearfix all); // Clear the floated `dt` if an empty `dd` is present\n }\n\n @media (min-width: @grid-float-breakpoint) {\n dt {\n float: left;\n width: (@dl-horizontal-offset - 20);\n clear: left;\n text-align: right;\n .text-overflow();\n }\n dd {\n margin-left: @dl-horizontal-offset;\n }\n }\n}\n\n\n// Misc\n// -------------------------\n\n// Abbreviations and acronyms\nabbr[title],\n// Add data-* attribute to help out our tooltip plugin, per https://github.com/twbs/bootstrap/issues/5257\nabbr[data-original-title] {\n cursor: help;\n border-bottom: 1px dotted @abbr-border-color;\n}\n.initialism {\n font-size: 90%;\n text-transform: uppercase;\n}\n\n// Blockquotes\nblockquote {\n padding: (@line-height-computed / 2) @line-height-computed;\n margin: 0 0 @line-height-computed;\n font-size: @blockquote-font-size;\n border-left: 5px solid @blockquote-border-color;\n\n p,\n ul,\n ol {\n &:last-child {\n margin-bottom: 0;\n }\n }\n\n // Note: Deprecated small and .small as of v3.1.0\n // Context: https://github.com/twbs/bootstrap/issues/11660\n footer,\n small,\n .small {\n display: block;\n font-size: 80%; // back to default font-size\n line-height: @line-height-base;\n color: @blockquote-small-color;\n\n &:before {\n content: '\\2014 \\00A0'; // em dash, nbsp\n }\n }\n}\n\n// Opposite alignment of blockquote\n//\n// Heads up: `blockquote.pull-right` has been deprecated as of v3.1.0.\n.blockquote-reverse,\nblockquote.pull-right {\n padding-right: 15px;\n padding-left: 0;\n border-right: 5px solid @blockquote-border-color;\n border-left: 0;\n text-align: right;\n\n // Account for citation\n footer,\n small,\n .small {\n &:before { content: ''; }\n &:after {\n content: '\\00A0 \\2014'; // nbsp, em dash\n }\n }\n}\n\n// Addresses\naddress {\n margin-bottom: @line-height-computed;\n font-style: normal;\n line-height: @line-height-base;\n}\n","// Typography\n\n.text-emphasis-variant(@color) {\n color: @color;\n a&:hover {\n color: darken(@color, 10%);\n }\n}\n","// Contextual backgrounds\n\n.bg-variant(@color) {\n background-color: @color;\n a&:hover {\n background-color: darken(@color, 10%);\n }\n}\n","// Text overflow\n// Requires inline-block or block for proper styling\n\n.text-overflow() {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n","//\n// Code (inline and block)\n// --------------------------------------------------\n\n\n// Inline and block code styles\ncode,\nkbd,\npre,\nsamp {\n font-family: @font-family-monospace;\n}\n\n// Inline code\ncode {\n padding: 2px 4px;\n font-size: 90%;\n color: @code-color;\n background-color: @code-bg;\n border-radius: @border-radius-base;\n}\n\n// User input typically entered via keyboard\nkbd {\n padding: 2px 4px;\n font-size: 90%;\n color: @kbd-color;\n background-color: @kbd-bg;\n border-radius: @border-radius-small;\n box-shadow: inset 0 -1px 0 rgba(0,0,0,.25);\n\n kbd {\n padding: 0;\n font-size: 100%;\n font-weight: bold;\n box-shadow: none;\n }\n}\n\n// Blocks of code\npre {\n display: block;\n padding: ((@line-height-computed - 1) / 2);\n margin: 0 0 (@line-height-computed / 2);\n font-size: (@font-size-base - 1); // 14px to 13px\n line-height: @line-height-base;\n word-break: break-all;\n word-wrap: break-word;\n color: @pre-color;\n background-color: @pre-bg;\n border: 1px solid @pre-border-color;\n border-radius: @border-radius-base;\n\n // Account for some code outputs that place code tags in pre tags\n code {\n padding: 0;\n font-size: inherit;\n color: inherit;\n white-space: pre-wrap;\n background-color: transparent;\n border-radius: 0;\n }\n}\n\n// Enable scrollable blocks of code\n.pre-scrollable {\n max-height: @pre-scrollable-max-height;\n overflow-y: scroll;\n}\n","//\n// Grid system\n// --------------------------------------------------\n\n\n// Container widths\n//\n// Set the container width, and override it for fixed navbars in media queries.\n\n.container {\n .container-fixed();\n\n @media (min-width: @screen-sm-min) {\n width: @container-sm;\n }\n @media (min-width: @screen-md-min) {\n width: @container-md;\n }\n @media (min-width: @screen-lg-min) {\n width: @container-lg;\n }\n}\n\n\n// Fluid container\n//\n// Utilizes the mixin meant for fixed width containers, but without any defined\n// width for fluid, full width layouts.\n\n.container-fluid {\n .container-fixed();\n}\n\n\n// Row\n//\n// Rows contain and clear the floats of your columns.\n\n.row {\n .make-row();\n}\n\n\n// Columns\n//\n// Common styles for small and large grid columns\n\n.make-grid-columns();\n\n\n// Extra small grid\n//\n// Columns, offsets, pushes, and pulls for extra small devices like\n// smartphones.\n\n.make-grid(xs);\n\n\n// Small grid\n//\n// Columns, offsets, pushes, and pulls for the small device range, from phones\n// to tablets.\n\n@media (min-width: @screen-sm-min) {\n .make-grid(sm);\n}\n\n\n// Medium grid\n//\n// Columns, offsets, pushes, and pulls for the desktop device range.\n\n@media (min-width: @screen-md-min) {\n .make-grid(md);\n}\n\n\n// Large grid\n//\n// Columns, offsets, pushes, and pulls for the large desktop device range.\n\n@media (min-width: @screen-lg-min) {\n .make-grid(lg);\n}\n","// Grid system\n//\n// Generate semantic grid columns with these mixins.\n\n// Centered container element\n.container-fixed(@gutter: @grid-gutter-width) {\n margin-right: auto;\n margin-left: auto;\n padding-left: (@gutter / 2);\n padding-right: (@gutter / 2);\n &:extend(.clearfix all);\n}\n\n// Creates a wrapper for a series of columns\n.make-row(@gutter: @grid-gutter-width) {\n margin-left: (@gutter / -2);\n margin-right: (@gutter / -2);\n &:extend(.clearfix all);\n}\n\n// Generate the extra small columns\n.make-xs-column(@columns; @gutter: @grid-gutter-width) {\n position: relative;\n float: left;\n width: percentage((@columns / @grid-columns));\n min-height: 1px;\n padding-left: (@gutter / 2);\n padding-right: (@gutter / 2);\n}\n.make-xs-column-offset(@columns) {\n margin-left: percentage((@columns / @grid-columns));\n}\n.make-xs-column-push(@columns) {\n left: percentage((@columns / @grid-columns));\n}\n.make-xs-column-pull(@columns) {\n right: percentage((@columns / @grid-columns));\n}\n\n// Generate the small columns\n.make-sm-column(@columns; @gutter: @grid-gutter-width) {\n position: relative;\n min-height: 1px;\n padding-left: (@gutter / 2);\n padding-right: (@gutter / 2);\n\n @media (min-width: @screen-sm-min) {\n float: left;\n width: percentage((@columns / @grid-columns));\n }\n}\n.make-sm-column-offset(@columns) {\n @media (min-width: @screen-sm-min) {\n margin-left: percentage((@columns / @grid-columns));\n }\n}\n.make-sm-column-push(@columns) {\n @media (min-width: @screen-sm-min) {\n left: percentage((@columns / @grid-columns));\n }\n}\n.make-sm-column-pull(@columns) {\n @media (min-width: @screen-sm-min) {\n right: percentage((@columns / @grid-columns));\n }\n}\n\n// Generate the medium columns\n.make-md-column(@columns; @gutter: @grid-gutter-width) {\n position: relative;\n min-height: 1px;\n padding-left: (@gutter / 2);\n padding-right: (@gutter / 2);\n\n @media (min-width: @screen-md-min) {\n float: left;\n width: percentage((@columns / @grid-columns));\n }\n}\n.make-md-column-offset(@columns) {\n @media (min-width: @screen-md-min) {\n margin-left: percentage((@columns / @grid-columns));\n }\n}\n.make-md-column-push(@columns) {\n @media (min-width: @screen-md-min) {\n left: percentage((@columns / @grid-columns));\n }\n}\n.make-md-column-pull(@columns) {\n @media (min-width: @screen-md-min) {\n right: percentage((@columns / @grid-columns));\n }\n}\n\n// Generate the large columns\n.make-lg-column(@columns; @gutter: @grid-gutter-width) {\n position: relative;\n min-height: 1px;\n padding-left: (@gutter / 2);\n padding-right: (@gutter / 2);\n\n @media (min-width: @screen-lg-min) {\n float: left;\n width: percentage((@columns / @grid-columns));\n }\n}\n.make-lg-column-offset(@columns) {\n @media (min-width: @screen-lg-min) {\n margin-left: percentage((@columns / @grid-columns));\n }\n}\n.make-lg-column-push(@columns) {\n @media (min-width: @screen-lg-min) {\n left: percentage((@columns / @grid-columns));\n }\n}\n.make-lg-column-pull(@columns) {\n @media (min-width: @screen-lg-min) {\n right: percentage((@columns / @grid-columns));\n }\n}\n","// Framework grid generation\n//\n// Used only by Bootstrap to generate the correct number of grid classes given\n// any value of `@grid-columns`.\n\n.make-grid-columns() {\n // Common styles for all sizes of grid columns, widths 1-12\n .col(@index) when (@index = 1) { // initial\n @item: ~\".col-xs-@{index}, .col-sm-@{index}, .col-md-@{index}, .col-lg-@{index}\";\n .col((@index + 1), @item);\n }\n .col(@index, @list) when (@index =< @grid-columns) { // general; \"=<\" isn't a typo\n @item: ~\".col-xs-@{index}, .col-sm-@{index}, .col-md-@{index}, .col-lg-@{index}\";\n .col((@index + 1), ~\"@{list}, @{item}\");\n }\n .col(@index, @list) when (@index > @grid-columns) { // terminal\n @{list} {\n position: relative;\n // Prevent columns from collapsing when empty\n min-height: 1px;\n // Inner gutter via padding\n padding-left: (@grid-gutter-width / 2);\n padding-right: (@grid-gutter-width / 2);\n }\n }\n .col(1); // kickstart it\n}\n\n.float-grid-columns(@class) {\n .col(@index) when (@index = 1) { // initial\n @item: ~\".col-@{class}-@{index}\";\n .col((@index + 1), @item);\n }\n .col(@index, @list) when (@index =< @grid-columns) { // general\n @item: ~\".col-@{class}-@{index}\";\n .col((@index + 1), ~\"@{list}, @{item}\");\n }\n .col(@index, @list) when (@index > @grid-columns) { // terminal\n @{list} {\n float: left;\n }\n }\n .col(1); // kickstart it\n}\n\n.calc-grid-column(@index, @class, @type) when (@type = width) and (@index > 0) {\n .col-@{class}-@{index} {\n width: percentage((@index / @grid-columns));\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = push) and (@index > 0) {\n .col-@{class}-push-@{index} {\n left: percentage((@index / @grid-columns));\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = push) and (@index = 0) {\n .col-@{class}-push-0 {\n left: auto;\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = pull) and (@index > 0) {\n .col-@{class}-pull-@{index} {\n right: percentage((@index / @grid-columns));\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = pull) and (@index = 0) {\n .col-@{class}-pull-0 {\n right: auto;\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = offset) {\n .col-@{class}-offset-@{index} {\n margin-left: percentage((@index / @grid-columns));\n }\n}\n\n// Basic looping in LESS\n.loop-grid-columns(@index, @class, @type) when (@index >= 0) {\n .calc-grid-column(@index, @class, @type);\n // next iteration\n .loop-grid-columns((@index - 1), @class, @type);\n}\n\n// Create grid for specific class\n.make-grid(@class) {\n .float-grid-columns(@class);\n .loop-grid-columns(@grid-columns, @class, width);\n .loop-grid-columns(@grid-columns, @class, pull);\n .loop-grid-columns(@grid-columns, @class, push);\n .loop-grid-columns(@grid-columns, @class, offset);\n}\n","//\n// Tables\n// --------------------------------------------------\n\n\ntable {\n background-color: @table-bg;\n}\ncaption {\n padding-top: @table-cell-padding;\n padding-bottom: @table-cell-padding;\n color: @text-muted;\n text-align: left;\n}\nth {\n text-align: left;\n}\n\n\n// Baseline styles\n\n.table {\n width: 100%;\n max-width: 100%;\n margin-bottom: @line-height-computed;\n // Cells\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th,\n > td {\n padding: @table-cell-padding;\n line-height: @line-height-base;\n vertical-align: top;\n border-top: 1px solid @table-border-color;\n }\n }\n }\n // Bottom align for column headings\n > thead > tr > th {\n vertical-align: bottom;\n border-bottom: 2px solid @table-border-color;\n }\n // Remove top border from thead by default\n > caption + thead,\n > colgroup + thead,\n > thead:first-child {\n > tr:first-child {\n > th,\n > td {\n border-top: 0;\n }\n }\n }\n // Account for multiple tbody instances\n > tbody + tbody {\n border-top: 2px solid @table-border-color;\n }\n\n // Nesting\n .table {\n background-color: @body-bg;\n }\n}\n\n\n// Condensed table w/ half padding\n\n.table-condensed {\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th,\n > td {\n padding: @table-condensed-cell-padding;\n }\n }\n }\n}\n\n\n// Bordered version\n//\n// Add borders all around the table and between all the columns.\n\n.table-bordered {\n border: 1px solid @table-border-color;\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th,\n > td {\n border: 1px solid @table-border-color;\n }\n }\n }\n > thead > tr {\n > th,\n > td {\n border-bottom-width: 2px;\n }\n }\n}\n\n\n// Zebra-striping\n//\n// Default zebra-stripe styles (alternating gray and transparent backgrounds)\n\n.table-striped {\n > tbody > tr:nth-child(odd) {\n background-color: @table-bg-accent;\n }\n}\n\n\n// Hover effect\n//\n// Placed here since it has to come after the potential zebra striping\n\n.table-hover {\n > tbody > tr:hover {\n background-color: @table-bg-hover;\n }\n}\n\n\n// Table cell sizing\n//\n// Reset default table behavior\n\ntable col[class*=\"col-\"] {\n position: static; // Prevent border hiding in Firefox and IE9/10 (see https://github.com/twbs/bootstrap/issues/11623)\n float: none;\n display: table-column;\n}\ntable {\n td,\n th {\n &[class*=\"col-\"] {\n position: static; // Prevent border hiding in Firefox and IE9/10 (see https://github.com/twbs/bootstrap/issues/11623)\n float: none;\n display: table-cell;\n }\n }\n}\n\n\n// Table backgrounds\n//\n// Exact selectors below required to override `.table-striped` and prevent\n// inheritance to nested tables.\n\n// Generate the contextual variants\n.table-row-variant(active; @table-bg-active);\n.table-row-variant(success; @state-success-bg);\n.table-row-variant(info; @state-info-bg);\n.table-row-variant(warning; @state-warning-bg);\n.table-row-variant(danger; @state-danger-bg);\n\n\n// Responsive tables\n//\n// Wrap your tables in `.table-responsive` and we'll make them mobile friendly\n// by enabling horizontal scrolling. Only applies <768px. Everything above that\n// will display normally.\n\n.table-responsive {\n overflow-x: auto;\n min-height: 0.01%; // Workaround for IE9 bug (see https://github.com/twbs/bootstrap/issues/14837)\n\n @media screen and (max-width: @screen-xs-max) {\n width: 100%;\n margin-bottom: (@line-height-computed * 0.75);\n overflow-y: hidden;\n -ms-overflow-style: -ms-autohiding-scrollbar;\n border: 1px solid @table-border-color;\n\n // Tighten up spacing\n > .table {\n margin-bottom: 0;\n\n // Ensure the content doesn't wrap\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th,\n > td {\n white-space: nowrap;\n }\n }\n }\n }\n\n // Special overrides for the bordered tables\n > .table-bordered {\n border: 0;\n\n // Nuke the appropriate borders so that the parent can handle them\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th:first-child,\n > td:first-child {\n border-left: 0;\n }\n > th:last-child,\n > td:last-child {\n border-right: 0;\n }\n }\n }\n\n // Only nuke the last row's bottom-border in `tbody` and `tfoot` since\n // chances are there will be only one `tr` in a `thead` and that would\n // remove the border altogether.\n > tbody,\n > tfoot {\n > tr:last-child {\n > th,\n > td {\n border-bottom: 0;\n }\n }\n }\n\n }\n }\n}\n","// Tables\n\n.table-row-variant(@state; @background) {\n // Exact selectors below required to override `.table-striped` and prevent\n // inheritance to nested tables.\n .table > thead > tr,\n .table > tbody > tr,\n .table > tfoot > tr {\n > td.@{state},\n > th.@{state},\n &.@{state} > td,\n &.@{state} > th {\n background-color: @background;\n }\n }\n\n // Hover states for `.table-hover`\n // Note: this is not available for cells or rows within `thead` or `tfoot`.\n .table-hover > tbody > tr {\n > td.@{state}:hover,\n > th.@{state}:hover,\n &.@{state}:hover > td,\n &:hover > .@{state},\n &.@{state}:hover > th {\n background-color: darken(@background, 5%);\n }\n }\n}\n","//\n// Forms\n// --------------------------------------------------\n\n\n// Normalize non-controls\n//\n// Restyle and baseline non-control form elements.\n\nfieldset {\n padding: 0;\n margin: 0;\n border: 0;\n // Chrome and Firefox set a `min-width: min-content;` on fieldsets,\n // so we reset that to ensure it behaves more like a standard block element.\n // See https://github.com/twbs/bootstrap/issues/12359.\n min-width: 0;\n}\n\nlegend {\n display: block;\n width: 100%;\n padding: 0;\n margin-bottom: @line-height-computed;\n font-size: (@font-size-base * 1.5);\n line-height: inherit;\n color: @legend-color;\n border: 0;\n border-bottom: 1px solid @legend-border-color;\n}\n\nlabel {\n display: inline-block;\n max-width: 100%; // Force IE8 to wrap long content (see https://github.com/twbs/bootstrap/issues/13141)\n margin-bottom: 5px;\n font-weight: bold;\n}\n\n\n// Normalize form controls\n//\n// While most of our form styles require extra classes, some basic normalization\n// is required to ensure optimum display with or without those classes to better\n// address browser inconsistencies.\n\n// Override content-box in Normalize (* isn't specific enough)\ninput[type=\"search\"] {\n .box-sizing(border-box);\n}\n\n// Position radios and checkboxes better\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n margin: 4px 0 0;\n margin-top: 1px \\9; // IE8-9\n line-height: normal;\n}\n\n// Set the height of file controls to match text inputs\ninput[type=\"file\"] {\n display: block;\n}\n\n// Make range inputs behave like textual form controls\ninput[type=\"range\"] {\n display: block;\n width: 100%;\n}\n\n// Make multiple select elements height not fixed\nselect[multiple],\nselect[size] {\n height: auto;\n}\n\n// Focus for file, radio, and checkbox\ninput[type=\"file\"]:focus,\ninput[type=\"radio\"]:focus,\ninput[type=\"checkbox\"]:focus {\n .tab-focus();\n}\n\n// Adjust output element\noutput {\n display: block;\n padding-top: (@padding-base-vertical + 1);\n font-size: @font-size-base;\n line-height: @line-height-base;\n color: @input-color;\n}\n\n\n// Common form controls\n//\n// Shared size and type resets for form controls. Apply `.form-control` to any\n// of the following form controls:\n//\n// select\n// textarea\n// input[type=\"text\"]\n// input[type=\"password\"]\n// input[type=\"datetime\"]\n// input[type=\"datetime-local\"]\n// input[type=\"date\"]\n// input[type=\"month\"]\n// input[type=\"time\"]\n// input[type=\"week\"]\n// input[type=\"number\"]\n// input[type=\"email\"]\n// input[type=\"url\"]\n// input[type=\"search\"]\n// input[type=\"tel\"]\n// input[type=\"color\"]\n\n.form-control {\n display: block;\n width: 100%;\n height: @input-height-base; // Make inputs at least the height of their button counterpart (base line-height + padding + border)\n padding: @padding-base-vertical @padding-base-horizontal;\n font-size: @font-size-base;\n line-height: @line-height-base;\n color: @input-color;\n background-color: @input-bg;\n background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214\n border: 1px solid @input-border;\n border-radius: @input-border-radius;\n .box-shadow(inset 0 1px 1px rgba(0,0,0,.075));\n .transition(~\"border-color ease-in-out .15s, box-shadow ease-in-out .15s\");\n\n // Customize the `:focus` state to imitate native WebKit styles.\n .form-control-focus();\n\n // Placeholder\n .placeholder();\n\n // Disabled and read-only inputs\n //\n // HTML5 says that controls under a fieldset > legend:first-child won't be\n // disabled if the fieldset is disabled. Due to implementation difficulty, we\n // don't honor that edge case; we style them as disabled anyway.\n &[disabled],\n &[readonly],\n fieldset[disabled] & {\n cursor: @cursor-disabled;\n background-color: @input-bg-disabled;\n opacity: 1; // iOS fix for unreadable disabled content\n }\n\n // Reset height for `textarea`s\n textarea& {\n height: auto;\n }\n}\n\n\n// Search inputs in iOS\n//\n// This overrides the extra rounded corners on search inputs in iOS so that our\n// `.form-control` class can properly style them. Note that this cannot simply\n// be added to `.form-control` as it's not specific enough. For details, see\n// https://github.com/twbs/bootstrap/issues/11586.\n\ninput[type=\"search\"] {\n -webkit-appearance: none;\n}\n\n\n// Special styles for iOS temporal inputs\n//\n// In Mobile Safari, setting `display: block` on temporal inputs causes the\n// text within the input to become vertically misaligned.\n// As a workaround, we set a pixel line-height that matches the\n// given height of the input. Since this fucks up everything else, we have to\n// appropriately reset it for Internet Explorer and the size variations.\n\ninput[type=\"date\"],\ninput[type=\"time\"],\ninput[type=\"datetime-local\"],\ninput[type=\"month\"] {\n line-height: @input-height-base;\n // IE8+ misaligns the text within date inputs, so we reset\n line-height: @line-height-base ~\"\\0\";\n\n &.input-sm {\n line-height: @input-height-small;\n line-height: @line-height-small ~\"\\0\";\n }\n &.input-lg {\n line-height: @input-height-large;\n line-height: @line-height-large ~\"\\0\";\n }\n}\n\n// IE 11 hack to reverse the iOS temporal input hack.\n_:-ms-fullscreen, :root input[type=\"date\"],\n_:-ms-fullscreen, :root input[type=\"time\"],\n_:-ms-fullscreen, :root input[type=\"datetime-local\"],\n_:-ms-fullscreen, :root input[type=\"month\"] {\n line-height: @line-height-base;\n\n &.input-sm {\n line-height: @line-height-small;\n }\n &.input-lg {\n line-height: @line-height-large;\n }\n}\n\n\n// Form groups\n//\n// Designed to help with the organization and spacing of vertical forms. For\n// horizontal forms, use the predefined grid classes.\n\n.form-group {\n margin-bottom: 15px;\n}\n\n\n// Checkboxes and radios\n//\n// Indent the labels to position radios/checkboxes as hanging controls.\n\n.radio,\n.checkbox {\n position: relative;\n display: block;\n margin-top: 10px;\n margin-bottom: 10px;\n\n label {\n min-height: @line-height-computed; // Ensure the input doesn't jump when there is no text\n padding-left: 20px;\n margin-bottom: 0;\n font-weight: normal;\n cursor: pointer;\n }\n}\n.radio input[type=\"radio\"],\n.radio-inline input[type=\"radio\"],\n.checkbox input[type=\"checkbox\"],\n.checkbox-inline input[type=\"checkbox\"] {\n position: absolute;\n margin-left: -20px;\n margin-top: 4px \\9;\n}\n\n.radio + .radio,\n.checkbox + .checkbox {\n margin-top: -5px; // Move up sibling radios or checkboxes for tighter spacing\n}\n\n// Radios and checkboxes on same line\n.radio-inline,\n.checkbox-inline {\n display: inline-block;\n padding-left: 20px;\n margin-bottom: 0;\n vertical-align: middle;\n font-weight: normal;\n cursor: pointer;\n}\n.radio-inline + .radio-inline,\n.checkbox-inline + .checkbox-inline {\n margin-top: 0;\n margin-left: 10px; // space out consecutive inline controls\n}\n\n// Apply same disabled cursor tweak as for inputs\n// Some special care is needed because