diff options
Diffstat (limited to 'tbc')
88 files changed, 19404 insertions, 0 deletions
diff --git a/tbc/__init__.py b/tbc/__init__.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/tbc/__init__.py diff --git a/tbc/admin.py b/tbc/admin.py new file mode 100644 index 0000000..959ce84 --- /dev/null +++ b/tbc/admin.py @@ -0,0 +1,8 @@ +from models import * +from django.contrib import admin + +admin.site.register(Profile) +admin.site.register(Book) +admin.site.register(Reviewer) +admin.site.register(Chapters) +admin.site.register(ScreenShots) diff --git a/tbc/forms.py b/tbc/forms.py new file mode 100644 index 0000000..685b04f --- /dev/null +++ b/tbc/forms.py @@ -0,0 +1,34 @@ +from django import forms +from django.db import models +from django.contrib.auth.models import User +from django.contrib.auth.forms import UserCreationForm, UserChangeForm + +from tbc.models import * + + +class UserProfileForm(forms.ModelForm): + class Meta: + model = Profile + exclude = ('user') + + +class UserRegisterForm(UserCreationForm): + class Meta: + model = User + fields = ('first_name', 'last_name', 'email', + 'username', 'password1', 'password2') + + +class UserLoginForm(forms.Form): + username = forms.CharField(widget=forms.TextInput(attrs={ + 'class': 'form-control', + 'placeholder': 'Username'}), label='') + password = forms.CharField(widget=forms.PasswordInput(attrs={ + 'class': 'form-control', + 'placeholder': 'Password'}), label='') + + +class BookForm(forms.ModelForm): + class Meta: + model = Book + exclude = ('contributor') diff --git a/tbc/models.py b/tbc/models.py new file mode 100644 index 0000000..2749a8f --- /dev/null +++ b/tbc/models.py @@ -0,0 +1,75 @@ +from django.db import models +from django.contrib.auth.models import User +from PythonTBC import settings + + +CATEGORY = (("computer science", "Computer Science"), + ("chemical engg", "Chemical Engg"), + ("aerospace engg", "Aerospace Engg"), + ("electronics engg", "Electronics Engg"), + ("thermodynamics", "Thermodynamics"), + ("mechanical engg", "Mechanical Engg"), + ("mathematics", "Mathematics")) + +GENDER = (("male", "Male"), + ("female", "Female")) + +def get_notebook_dir(instance, filename): + return '%s/%s/%s' % (instance.book.contributor, instance.book.name, filename) + + +def get_image_dir(instance, filename): + return '%s/%s/screenshots/%s' % (instance.book.contributor, instance.book.name, filename) + + +class Profile(models.Model): + """Model to store profile of a user.""" + user = models.ForeignKey(User) + about = models.CharField(max_length=256) + insti_org = models.CharField(max_length=128) + dept_desg = models.CharField(max_length=32) + dob = models.DateField() + gender = models.CharField(max_length=10, choices=GENDER) + phone_no = models.CharField(max_length=15) + def __unicode__(self): + name = self.user.first_name or 'Profile' + return '%s'%(name) + + +class Reviewer(models.Model): + name = models.CharField(max_length=32) + email = models.EmailField() + def __unicode__(self): + name = self.name or 'Reviewer' + return '%s'%(name) + +class Book(models.Model): + """Model to store the book details""" + name = models.CharField(max_length=32) + author = models.CharField(max_length=32) + category = models.CharField(max_length=32, choices=CATEGORY) + publisher = models.CharField(max_length=50) + isbn = models.CharField(max_length=20) + no_chapters = models.IntegerField(max_length=2) + contributor = models.ForeignKey(Profile) + reviewer = models.ForeignKey(Reviewer) + def __unicode__(self): + name = self.name or 'Book' + return '%s'%(name) + +class Chapters(models.Model): + name = models.CharField(max_length=200) + notebook = models.FileField(upload_to=get_notebook_dir) + book = models.ForeignKey(Book) + def __unicode__(self): + name = self.name or 'Chapter' + return '%s'%(name) + + +class ScreenShots(models.Model): + caption = models.CharField(max_length=128) + image = models.FileField(upload_to=get_image_dir) + book = models.ForeignKey(Book) + def __unicode__(self): + name = self.caption or 'ScreenShots' + return '%s'%(name) diff --git a/tbc/static/css/base.css b/tbc/static/css/base.css new file mode 100755 index 0000000..1c3572e --- /dev/null +++ b/tbc/static/css/base.css @@ -0,0 +1,6183 @@ +/*! + * Bootstrap v2.3.2 + * + * 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. + */ + +.clearfix { + *zoom: 1; +} + +.clearfix:before, +.clearfix:after { + display: table; + line-height: 0; + content: ""; +} + +.clearfix:after { + clear: both; +} + +.hide-text { + font: 0/0 a; + color: transparent; + text-shadow: none; + background-color: transparent; + border: 0; +} + +.input-block-level { + display: block; + width: 100%; + min-height: 30px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +article, +aside, +details, +figcaption, +figure, +footer, +header, +hgroup, +nav, +section { + display: block; +} + +audio, +canvas, +video { + display: inline-block; + *display: inline; + *zoom: 1; +} + +audio:not([controls]) { + display: none; +} + +html { + font-size: 100%; + -webkit-text-size-adjust: 100%; + -ms-text-size-adjust: 100%; +} + +a:focus { + outline: thin dotted #333; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} + +a:hover, +a:active { + outline: 0; +} + +sub, +sup { + position: relative; + font-size: 75%; + line-height: 0; + vertical-align: baseline; +} + +sup { + top: -0.5em; +} + +sub { + bottom: -0.25em; +} + +img { + width: auto\9; + height: 225px; + max-width: 300px; + vertical-align: middle; + border: 0; + -ms-interpolation-mode: bicubic; +} + +#map_canvas img, +.google-maps img { + max-width: none; +} + +button, +input, +select, +textarea { + margin: 0; + font-size: 100%; + vertical-align: middle; +} + +button, +input { + *overflow: visible; + line-height: normal; +} + +button::-moz-focus-inner, +input::-moz-focus-inner { + padding: 0; + border: 0; +} + +button, +html input[type="button"], +input[type="reset"], +input[type="submit"] { + cursor: pointer; + -webkit-appearance: button; +} + +label, +select, +button, +input[type="button"], +input[type="reset"], +input[type="submit"], +input[type="radio"], +input[type="checkbox"] { + cursor: pointer; +} + +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-decoration, +input[type="search"]::-webkit-search-cancel-button { + -webkit-appearance: none; +} + +textarea { + overflow: auto; + vertical-align: top; +} + +@media print { + * { + color: #000 !important; + text-shadow: none !important; + background: transparent !important; + box-shadow: none !important; + } + a, + a:visited { + text-decoration: underline; + } + a[href]:after { + content: " (" attr(href) ")"; + } + abbr[title]:after { + content: " (" attr(title) ")"; + } + .ir a:after, + a[href^="javascript:"]:after, + a[href^="#"]:after { + content: ""; + } + pre, + blockquote { + border: 1px solid #999; + page-break-inside: avoid; + } + thead { + display: table-header-group; + } + tr, + img { + page-break-inside: avoid; + } + img { + max-width: 100% !important; + } + @page { + margin: 0.5cm; + } + p, + h2, + h3 { + orphans: 3; + widows: 3; + } + h2, + h3 { + page-break-after: avoid; + } +} + +body { + margin: 0; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 14px; + line-height: 20px; + color: #333333; + background-color: #ffffff; +} + +a { + color: #0088cc; + text-decoration: none; +} + +a:hover, +a:focus { + color: #005580; + text-decoration: underline; +} + +.img-rounded { + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; +} + +.img-polaroid { + padding: 4px; + background-color: #fff; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, 0.2); + -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); + -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); +} + +.img-circle { + -webkit-border-radius: 500px; + -moz-border-radius: 500px; + border-radius: 500px; +} + +.row { + margin-left: -20px; + *zoom: 1; +} + +.row:before, +.row:after { + display: table; + line-height: 0; + content: ""; +} + +.row:after { + clear: both; +} + +[class*="span"] { + float: left; + min-height: 1px; + margin-left: 20px; +} + +.container, +.navbar-static-top .container, +.navbar-fixed-top .container, +.navbar-fixed-bottom .container { + width: 940px; +} + +.span12 { + width: 940px; +} + +.span11 { + width: 860px; +} + +.span10 { + width: 780px; +} + +.span9 { + width: 700px; +} + +.span8 { + width: 620px; +} + +.span7 { + width: 540px; +} + +.span6 { + width: 460px; +} + +.span5 { + width: 380px; +} + +.span4 { + width: 300px; +} + +.span3 { + width: 220px; +} + +.span2 { + width: 140px; +} + +.span1 { + width: 60px; +} + +.offset12 { + margin-left: 980px; +} + +.offset11 { + margin-left: 900px; +} + +.offset10 { + margin-left: 820px; +} + +.offset9 { + margin-left: 740px; +} + +.offset8 { + margin-left: 660px; +} + +.offset7 { + margin-left: 580px; +} + +.offset6 { + margin-left: 500px; +} + +.offset5 { + margin-left: 420px; +} + +.offset4 { + margin-left: 340px; +} + +.offset3 { + margin-left: 260px; +} + +.offset2 { + margin-left: 180px; +} + +.offset1 { + margin-left: 100px; +} + +.row-fluid { + width: 100%; + *zoom: 1; +} + +.row-fluid:before, +.row-fluid:after { + display: table; + line-height: 0; + content: ""; +} + +.row-fluid:after { + clear: both; +} + +.row-fluid [class*="span"] { + display: block; + float: left; + width: 100%; + min-height: 30px; + margin-left: 2.127659574468085%; + *margin-left: 2.074468085106383%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +.row-fluid [class*="span"]:first-child { + margin-left: 0; +} + +.row-fluid .controls-row [class*="span"] + [class*="span"] { + margin-left: 2.127659574468085%; +} + +.row-fluid .span12 { + width: 100%; + *width: 99.94680851063829%; +} + +.row-fluid .span11 { + width: 91.48936170212765%; + *width: 91.43617021276594%; +} + +.row-fluid .span10 { + width: 82.97872340425532%; + *width: 82.92553191489361%; +} + +.row-fluid .span9 { + width: 74.46808510638297%; + *width: 74.41489361702126%; +} + +.row-fluid .span8 { + width: 65.95744680851064%; + *width: 65.90425531914893%; +} + +.row-fluid .span7 { + width: 57.44680851063829%; + *width: 57.39361702127659%; +} + +.row-fluid .span6 { + width: 48.93617021276595%; + *width: 48.88297872340425%; +} + +.row-fluid .span5 { + width: 40.42553191489362%; + *width: 40.37234042553192%; +} + +.row-fluid .span4 { + width: 31.914893617021278%; + *width: 31.861702127659576%; +} + +.row-fluid .span3 { + width: 23.404255319148934%; + *width: 23.351063829787233%; +} + +.row-fluid .span2 { + width: 14.893617021276595%; + *width: 14.840425531914894%; +} + +.row-fluid .span1 { + width: 6.382978723404255%; + *width: 6.329787234042553%; +} + +.row-fluid .offset12 { + margin-left: 104.25531914893617%; + *margin-left: 104.14893617021275%; +} + +.row-fluid .offset12:first-child { + margin-left: 102.12765957446808%; + *margin-left: 102.02127659574467%; +} + +.row-fluid .offset11 { + margin-left: 95.74468085106382%; + *margin-left: 95.6382978723404%; +} + +.row-fluid .offset11:first-child { + margin-left: 93.61702127659574%; + *margin-left: 93.51063829787232%; +} + +.row-fluid .offset10 { + margin-left: 87.23404255319149%; + *margin-left: 87.12765957446807%; +} + +.row-fluid .offset10:first-child { + margin-left: 85.1063829787234%; + *margin-left: 84.99999999999999%; +} + +.row-fluid .offset9 { + margin-left: 78.72340425531914%; + *margin-left: 78.61702127659572%; +} + +.row-fluid .offset9:first-child { + margin-left: 76.59574468085106%; + *margin-left: 76.48936170212764%; +} + +.row-fluid .offset8 { + margin-left: 70.2127659574468%; + *margin-left: 70.10638297872339%; +} + +.row-fluid .offset8:first-child { + margin-left: 68.08510638297872%; + *margin-left: 67.9787234042553%; +} + +.row-fluid .offset7 { + margin-left: 61.70212765957446%; + *margin-left: 61.59574468085106%; +} + +.row-fluid .offset7:first-child { + margin-left: 59.574468085106375%; + *margin-left: 59.46808510638297%; +} + +.row-fluid .offset6 { + margin-left: 53.191489361702125%; + *margin-left: 53.085106382978715%; +} + +.row-fluid .offset6:first-child { + margin-left: 51.063829787234035%; + *margin-left: 50.95744680851063%; +} + +.row-fluid .offset5 { + margin-left: 44.68085106382979%; + *margin-left: 44.57446808510638%; +} + +.row-fluid .offset5:first-child { + margin-left: 42.5531914893617%; + *margin-left: 42.4468085106383%; +} + +.row-fluid .offset4 { + margin-left: 36.170212765957444%; + *margin-left: 36.06382978723405%; +} + +.row-fluid .offset4:first-child { + margin-left: 34.04255319148936%; + *margin-left: 33.93617021276596%; +} + +.row-fluid .offset3 { + margin-left: 27.659574468085104%; + *margin-left: 27.5531914893617%; +} + +.row-fluid .offset3:first-child { + margin-left: 25.53191489361702%; + *margin-left: 25.425531914893618%; +} + +.row-fluid .offset2 { + margin-left: 19.148936170212764%; + *margin-left: 19.04255319148936%; +} + +.row-fluid .offset2:first-child { + margin-left: 17.02127659574468%; + *margin-left: 16.914893617021278%; +} + +.row-fluid .offset1 { + margin-left: 10.638297872340425%; + *margin-left: 10.53191489361702%; +} + +.row-fluid .offset1:first-child { + margin-left: 8.51063829787234%; + *margin-left: 8.404255319148938%; +} + +[class*="span"].hide, +.row-fluid [class*="span"].hide { + display: none; +} + +[class*="span"].pull-right, +.row-fluid [class*="span"].pull-right { + float: right; +} + +.container { + margin-right: auto; + margin-left: auto; + *zoom: 1; +} + +.container:before, +.container:after { + display: table; + line-height: 0; + content: ""; +} + +.container:after { + clear: both; +} + +.container-fluid { + padding-right: 20px; + padding-left: 20px; + *zoom: 1; +} + +.container-fluid:before, +.container-fluid:after { + display: table; + line-height: 0; + content: ""; +} + +.container-fluid:after { + clear: both; +} + +p { + margin: 0 0 10px; +} + +.lead { + margin-bottom: 20px; + font-size: 21px; + font-weight: 200; + line-height: 30px; +} + +small { + font-size: 85%; +} + +strong { + font-weight: bold; +} + +em { + font-style: italic; +} + +cite { + font-style: normal; +} + +.muted { + color: #999999; +} + +a.muted:hover, +a.muted:focus { + color: #808080; +} + +.text-warning { + color: #c09853; +} + +a.text-warning:hover, +a.text-warning:focus { + color: #a47e3c; +} + +.text-error { + color: #b94a48; +} + +a.text-error:hover, +a.text-error:focus { + color: #953b39; +} + +.text-info { + color: #3a87ad; +} + +a.text-info:hover, +a.text-info:focus { + color: #2d6987; +} + +.text-success { + color: #468847; +} + +a.text-success:hover, +a.text-success:focus { + color: #356635; +} + +.text-left { + text-align: left; +} + +.text-right { + text-align: right; +} + +.text-center { + text-align: center; +} + +h1, +h2, +h3, +h4, +h5, +h6 { + margin: 10px 0; + font-family: inherit; + font-weight: bold; + line-height: 20px; + color: inherit; + text-rendering: optimizelegibility; +} + +h1 small, +h2 small, +h3 small, +h4 small, +h5 small, +h6 small { + font-weight: normal; + line-height: 1; + color: #999999; +} + +h1, +h2, +h3 { + line-height: 40px; +} + +h1 { + font-size: 38.5px; +} + +h2 { + font-size: 31.5px; +} + +h3 { + font-size: 24.5px; +} + +h4 { + font-size: 17.5px; +} + +h5 { + font-size: 14px; +} + +h6 { + font-size: 11.9px; +} + +h1 small { + font-size: 24.5px; +} + +h2 small { + font-size: 17.5px; +} + +h3 small { + font-size: 14px; +} + +h4 small { + font-size: 14px; +} + +.page-header { + padding-bottom: 9px; + margin: 20px 0 30px; + border-bottom: 1px solid #eeeeee; +} + +ul, +ol { + padding: 0; + margin: 0 0 10px 25px; +} + +ul ul, +ul ol, +ol ol, +ol ul { + margin-bottom: 0; +} + +li { + line-height: 20px; +} + +ul.unstyled, +ol.unstyled { + margin-left: 0; + list-style: none; +} + +ul.inline, +ol.inline { + margin-left: 0; + list-style: none; +} + +ul.inline > li, +ol.inline > li { + display: inline-block; + *display: inline; + padding-right: 5px; + padding-left: 5px; + *zoom: 1; +} + +dl { + margin-bottom: 20px; +} + +dt, +dd { + line-height: 20px; +} + +dt { + font-weight: bold; +} + +dd { + margin-left: 10px; +} + +.dl-horizontal { + *zoom: 1; +} + +.dl-horizontal:before, +.dl-horizontal:after { + display: table; + line-height: 0; + content: ""; +} + +.dl-horizontal:after { + clear: both; +} + +.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; +} + +hr { + margin: 20px 0; + border: 0; + border-top: 1px solid #eeeeee; + border-bottom: 1px solid #ffffff; +} + +abbr[title], +abbr[data-original-title] { + cursor: help; + border-bottom: 1px dotted #999999; +} + +abbr.initialism { + font-size: 90%; + text-transform: uppercase; +} + +blockquote { + padding: 0 0 0 15px; + margin: 0 0 20px; + border-left: 5px solid #eeeeee; +} + +blockquote p { + margin-bottom: 0; + font-size: 17.5px; + font-weight: 300; + line-height: 1.25; +} + +blockquote small { + display: block; + line-height: 20px; + color: #999999; +} + +blockquote small:before { + content: '\2014 \00A0'; +} + +blockquote.pull-right { + float: right; + padding-right: 15px; + padding-left: 0; + border-right: 5px solid #eeeeee; + border-left: 0; +} + +blockquote.pull-right p, +blockquote.pull-right small { + text-align: right; +} + +blockquote.pull-right small:before { + content: ''; +} + +blockquote.pull-right small:after { + content: '\00A0 \2014'; +} + +q:before, +q:after, +blockquote:before, +blockquote:after { + content: ""; +} + +address { + display: block; + margin-bottom: 20px; + font-style: normal; + line-height: 20px; +} + +code, +pre { + padding: 0 3px 2px; + font-family: Monaco, Menlo, Consolas, "Courier New", monospace; + font-size: 12px; + color: #333333; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; +} + +code { + padding: 2px 4px; + color: #d14; + white-space: nowrap; + background-color: #f7f7f9; + border: 1px solid #e1e1e8; +} + +pre { + display: block; + padding: 9.5px; + margin: 0 0 10px; + font-size: 13px; + line-height: 20px; + word-break: break-all; + word-wrap: break-word; + white-space: pre; + white-space: pre-wrap; + background-color: #f5f5f5; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, 0.15); + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +pre.prettyprint { + margin-bottom: 20px; +} + +pre code { + padding: 0; + color: inherit; + white-space: pre; + white-space: pre-wrap; + background-color: transparent; + border: 0; +} + +.pre-scrollable { + max-height: 340px; + overflow-y: scroll; +} + +form { + margin: 0 0 20px; +} + +fieldset { + padding: 0; + margin: 0; + border: 0; +} + +legend { + display: block; + width: 100%; + padding: 0; + margin-bottom: 20px; + font-size: 21px; + line-height: 40px; + color: #333333; + border: 0; + border-bottom: 1px solid #e5e5e5; +} + +legend small { + font-size: 15px; + color: #999999; +} + +label, +input, +button, +select, +textarea { + font-size: 14px; + font-weight: normal; + line-height: 20px; +} + +input, +button, +select, +textarea { + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; +} + +label { + display: block; + margin-bottom: 5px; +} + +select, +textarea, +input[type="text"], +input[type="password"], +input[type="datetime"], +input[type="datetime-local"], +input[type="date"], +input[type="month"], +input[type="time"], +input[type="week"], +input[type="number"], +input[type="email"], +input[type="url"], +input[type="search"], +input[type="tel"], +input[type="color"], +.uneditable-input { + display: inline-block; + height: 20px; + padding: 4px 6px; + margin-bottom: 10px; + font-size: 14px; + line-height: 20px; + color: #555555; + vertical-align: middle; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +input, +textarea, +.uneditable-input { + width: 206px; +} + +textarea { + height: auto; +} + +textarea, +input[type="text"], +input[type="password"], +input[type="datetime"], +input[type="datetime-local"], +input[type="date"], +input[type="month"], +input[type="time"], +input[type="week"], +input[type="number"], +input[type="email"], +input[type="url"], +input[type="search"], +input[type="tel"], +input[type="color"], +.uneditable-input { + background-color: #ffffff; + border: 1px solid #cccccc; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -webkit-transition: border linear 0.2s, box-shadow linear 0.2s; + -moz-transition: border linear 0.2s, box-shadow linear 0.2s; + -o-transition: border linear 0.2s, box-shadow linear 0.2s; + transition: border linear 0.2s, box-shadow linear 0.2s; +} + +textarea:focus, +input[type="text"]:focus, +input[type="password"]:focus, +input[type="datetime"]:focus, +input[type="datetime-local"]:focus, +input[type="date"]:focus, +input[type="month"]:focus, +input[type="time"]:focus, +input[type="week"]:focus, +input[type="number"]:focus, +input[type="email"]:focus, +input[type="url"]:focus, +input[type="search"]:focus, +input[type="tel"]:focus, +input[type="color"]:focus, +.uneditable-input:focus { + border-color: rgba(82, 168, 236, 0.8); + outline: 0; + outline: thin dotted \9; + /* IE6-9 */ + + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6); +} + +input[type="radio"], +input[type="checkbox"] { + margin: 4px 0 0; + margin-top: 1px \9; + *margin-top: 0; + line-height: normal; +} + +input[type="file"], +input[type="image"], +input[type="submit"], +input[type="reset"], +input[type="button"], +input[type="radio"], +input[type="checkbox"] { + width: auto; +} + +select, +input[type="file"] { + height: 30px; + /* In IE7, the height of the select element cannot be changed by height, only font-size */ + + *margin-top: 4px; + /* For IE7, add top margin to align select with labels */ + + line-height: 30px; +} + +select { + width: 220px; + background-color: #ffffff; + border: 1px solid #cccccc; +} + +select[multiple], +select[size] { + height: auto; +} + +select:focus, +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; +} + +.uneditable-input, +.uneditable-textarea { + color: #999999; + cursor: not-allowed; + background-color: #fcfcfc; + border-color: #cccccc; + -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025); + -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025); + box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025); +} + +.uneditable-input { + overflow: hidden; + white-space: nowrap; +} + +.uneditable-textarea { + width: auto; + height: auto; +} + +input:-moz-placeholder, +textarea:-moz-placeholder { + color: #999999; +} + +input:-ms-input-placeholder, +textarea:-ms-input-placeholder { + color: #999999; +} + +input::-webkit-input-placeholder, +textarea::-webkit-input-placeholder { + color: #999999; +} + +.radio, +.checkbox { + min-height: 20px; + padding-left: 20px; +} + +.radio input[type="radio"], +.checkbox input[type="checkbox"] { + float: left; + margin-left: -20px; +} + +.controls > .radio:first-child, +.controls > .checkbox:first-child { + padding-top: 5px; +} + +.radio.inline, +.checkbox.inline { + display: inline-block; + padding-top: 5px; + margin-bottom: 0; + vertical-align: middle; +} + +.radio.inline + .radio.inline, +.checkbox.inline + .checkbox.inline { + margin-left: 10px; +} + +.input-mini { + width: 60px; +} + +.input-small { + width: 90px; +} + +.input-medium { + width: 150px; +} + +.input-large { + width: 210px; +} + +.input-xlarge { + width: 270px; +} + +.input-xxlarge { + width: 530px; +} + +input[class*="span"], +select[class*="span"], +textarea[class*="span"], +.uneditable-input[class*="span"], +.row-fluid input[class*="span"], +.row-fluid select[class*="span"], +.row-fluid textarea[class*="span"], +.row-fluid .uneditable-input[class*="span"] { + float: none; + margin-left: 0; +} + +.input-append input[class*="span"], +.input-append .uneditable-input[class*="span"], +.input-prepend input[class*="span"], +.input-prepend .uneditable-input[class*="span"], +.row-fluid input[class*="span"], +.row-fluid select[class*="span"], +.row-fluid textarea[class*="span"], +.row-fluid .uneditable-input[class*="span"], +.row-fluid .input-prepend [class*="span"], +.row-fluid .input-append [class*="span"] { + display: inline-block; +} + +input, +textarea, +.uneditable-input { + margin-left: 0; +} + +.controls-row [class*="span"] + [class*="span"] { + margin-left: 20px; +} + +input.span12, +textarea.span12, +.uneditable-input.span12 { + width: 926px; +} + +input.span11, +textarea.span11, +.uneditable-input.span11 { + width: 846px; +} + +input.span10, +textarea.span10, +.uneditable-input.span10 { + width: 766px; +} + +input.span9, +textarea.span9, +.uneditable-input.span9 { + width: 686px; +} + +input.span8, +textarea.span8, +.uneditable-input.span8 { + width: 606px; +} + +input.span7, +textarea.span7, +.uneditable-input.span7 { + width: 526px; +} + +input.span6, +textarea.span6, +.uneditable-input.span6 { + width: 446px; +} + +input.span5, +textarea.span5, +.uneditable-input.span5 { + width: 366px; +} + +input.span4, +textarea.span4, +.uneditable-input.span4 { + width: 286px; +} + +input.span3, +textarea.span3, +.uneditable-input.span3 { + width: 206px; +} + +input.span2, +textarea.span2, +.uneditable-input.span2 { + width: 126px; +} + +input.span1, +textarea.span1, +.uneditable-input.span1 { + width: 46px; +} + +.controls-row { + *zoom: 1; +} + +.controls-row:before, +.controls-row:after { + display: table; + line-height: 0; + content: ""; +} + +.controls-row:after { + clear: both; +} + +.controls-row [class*="span"], +.row-fluid .controls-row [class*="span"] { + float: left; +} + +.controls-row .checkbox[class*="span"], +.controls-row .radio[class*="span"] { + padding-top: 5px; +} + +input[disabled], +select[disabled], +textarea[disabled], +input[readonly], +select[readonly], +textarea[readonly] { + cursor: not-allowed; + background-color: #eeeeee; +} + +input[type="radio"][disabled], +input[type="checkbox"][disabled], +input[type="radio"][readonly], +input[type="checkbox"][readonly] { + background-color: transparent; +} + +.control-group.warning .control-label, +.control-group.warning .help-block, +.control-group.warning .help-inline { + color: #c09853; +} + +.control-group.warning .checkbox, +.control-group.warning .radio, +.control-group.warning input, +.control-group.warning select, +.control-group.warning textarea { + color: #c09853; +} + +.control-group.warning input, +.control-group.warning select, +.control-group.warning textarea { + border-color: #c09853; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +} + +.control-group.warning input:focus, +.control-group.warning select:focus, +.control-group.warning textarea:focus { + border-color: #a47e3c; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e; + -moz-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; +} + +.control-group.warning .input-prepend .add-on, +.control-group.warning .input-append .add-on { + color: #c09853; + background-color: #fcf8e3; + border-color: #c09853; +} + +.control-group.error .control-label, +.control-group.error .help-block, +.control-group.error .help-inline { + color: #b94a48; +} + +.control-group.error .checkbox, +.control-group.error .radio, +.control-group.error input, +.control-group.error select, +.control-group.error textarea { + color: #b94a48; +} + +.control-group.error input, +.control-group.error select, +.control-group.error textarea { + border-color: #b94a48; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +} + +.control-group.error input:focus, +.control-group.error select:focus, +.control-group.error textarea:focus { + border-color: #953b39; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392; + -moz-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; +} + +.control-group.error .input-prepend .add-on, +.control-group.error .input-append .add-on { + color: #b94a48; + background-color: #f2dede; + border-color: #b94a48; +} + +.control-group.success .control-label, +.control-group.success .help-block, +.control-group.success .help-inline { + color: #468847; +} + +.control-group.success .checkbox, +.control-group.success .radio, +.control-group.success input, +.control-group.success select, +.control-group.success textarea { + color: #468847; +} + +.control-group.success input, +.control-group.success select, +.control-group.success textarea { + border-color: #468847; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +} + +.control-group.success input:focus, +.control-group.success select:focus, +.control-group.success textarea:focus { + border-color: #356635; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b; + -moz-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; +} + +.control-group.success .input-prepend .add-on, +.control-group.success .input-append .add-on { + color: #468847; + background-color: #dff0d8; + border-color: #468847; +} + +.control-group.info .control-label, +.control-group.info .help-block, +.control-group.info .help-inline { + color: #3a87ad; +} + +.control-group.info .checkbox, +.control-group.info .radio, +.control-group.info input, +.control-group.info select, +.control-group.info textarea { + color: #3a87ad; +} + +.control-group.info input, +.control-group.info select, +.control-group.info textarea { + border-color: #3a87ad; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +} + +.control-group.info input:focus, +.control-group.info select:focus, +.control-group.info textarea:focus { + border-color: #2d6987; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7ab5d3; + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7ab5d3; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7ab5d3; +} + +.control-group.info .input-prepend .add-on, +.control-group.info .input-append .add-on { + color: #3a87ad; + background-color: #d9edf7; + border-color: #3a87ad; +} + +input:focus:invalid, +textarea:focus:invalid, +select:focus:invalid { + color: #b94a48; + border-color: #ee5f5b; +} + +input:focus:invalid:focus, +textarea:focus:invalid:focus, +select:focus:invalid:focus { + border-color: #e9322d; + -webkit-box-shadow: 0 0 6px #f8b9b7; + -moz-box-shadow: 0 0 6px #f8b9b7; + box-shadow: 0 0 6px #f8b9b7; +} + +.form-actions { + padding: 19px 20px 20px; + margin-top: 20px; + margin-bottom: 20px; + background-color: #f5f5f5; + border-top: 1px solid #e5e5e5; + *zoom: 1; +} + +.form-actions:before, +.form-actions:after { + display: table; + line-height: 0; + content: ""; +} + +.form-actions:after { + clear: both; +} + +.help-block, +.help-inline { + color: #595959; +} + +.help-block { + display: block; + margin-bottom: 10px; +} + +.help-inline { + display: inline-block; + *display: inline; + padding-left: 5px; + vertical-align: middle; + *zoom: 1; +} + +.input-append, +.input-prepend { + display: inline-block; + margin-bottom: 10px; + font-size: 0; + white-space: nowrap; + vertical-align: middle; +} + +.input-append input, +.input-prepend input, +.input-append select, +.input-prepend select, +.input-append .uneditable-input, +.input-prepend .uneditable-input, +.input-append .dropdown-menu, +.input-prepend .dropdown-menu, +.input-append .popover, +.input-prepend .popover { + font-size: 14px; +} + +.input-append input, +.input-prepend input, +.input-append select, +.input-prepend select, +.input-append .uneditable-input, +.input-prepend .uneditable-input { + position: relative; + margin-bottom: 0; + *margin-left: 0; + vertical-align: top; + -webkit-border-radius: 0 4px 4px 0; + -moz-border-radius: 0 4px 4px 0; + border-radius: 0 4px 4px 0; +} + +.input-append input:focus, +.input-prepend input:focus, +.input-append select:focus, +.input-prepend select:focus, +.input-append .uneditable-input:focus, +.input-prepend .uneditable-input:focus { + z-index: 2; +} + +.input-append .add-on, +.input-prepend .add-on { + display: inline-block; + width: auto; + height: 20px; + min-width: 16px; + padding: 4px 5px; + font-size: 14px; + font-weight: normal; + line-height: 20px; + text-align: center; + text-shadow: 0 1px 0 #ffffff; + background-color: #eeeeee; + border: 1px solid #ccc; +} + +.input-append .add-on, +.input-prepend .add-on, +.input-append .btn, +.input-prepend .btn, +.input-append .btn-group > .dropdown-toggle, +.input-prepend .btn-group > .dropdown-toggle { + vertical-align: top; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +.input-append .active, +.input-prepend .active { + background-color: #a9dba9; + border-color: #46a546; +} + +.input-prepend .add-on, +.input-prepend .btn { + margin-right: -1px; +} + +.input-prepend .add-on:first-child, +.input-prepend .btn:first-child { + -webkit-border-radius: 4px 0 0 4px; + -moz-border-radius: 4px 0 0 4px; + border-radius: 4px 0 0 4px; +} + +.input-append input, +.input-append select, +.input-append .uneditable-input { + -webkit-border-radius: 4px 0 0 4px; + -moz-border-radius: 4px 0 0 4px; + border-radius: 4px 0 0 4px; +} + +.input-append input + .btn-group .btn:last-child, +.input-append select + .btn-group .btn:last-child, +.input-append .uneditable-input + .btn-group .btn:last-child { + -webkit-border-radius: 0 4px 4px 0; + -moz-border-radius: 0 4px 4px 0; + border-radius: 0 4px 4px 0; +} + +.input-append .add-on, +.input-append .btn, +.input-append .btn-group { + margin-left: -1px; +} + +.input-append .add-on:last-child, +.input-append .btn:last-child, +.input-append .btn-group:last-child > .dropdown-toggle { + -webkit-border-radius: 0 4px 4px 0; + -moz-border-radius: 0 4px 4px 0; + border-radius: 0 4px 4px 0; +} + +.input-prepend.input-append input, +.input-prepend.input-append select, +.input-prepend.input-append .uneditable-input { + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +.input-prepend.input-append input + .btn-group .btn, +.input-prepend.input-append select + .btn-group .btn, +.input-prepend.input-append .uneditable-input + .btn-group .btn { + -webkit-border-radius: 0 4px 4px 0; + -moz-border-radius: 0 4px 4px 0; + border-radius: 0 4px 4px 0; +} + +.input-prepend.input-append .add-on:first-child, +.input-prepend.input-append .btn:first-child { + margin-right: -1px; + -webkit-border-radius: 4px 0 0 4px; + -moz-border-radius: 4px 0 0 4px; + border-radius: 4px 0 0 4px; +} + +.input-prepend.input-append .add-on:last-child, +.input-prepend.input-append .btn:last-child { + margin-left: -1px; + -webkit-border-radius: 0 4px 4px 0; + -moz-border-radius: 0 4px 4px 0; + border-radius: 0 4px 4px 0; +} + +.input-prepend.input-append .btn-group:first-child { + margin-left: 0; +} + +input.search-query { + padding-right: 14px; + padding-right: 4px \9; + padding-left: 14px; + padding-left: 4px \9; + /* IE7-8 doesn't have border-radius, so don't indent the padding */ + + margin-bottom: 0; + -webkit-border-radius: 15px; + -moz-border-radius: 15px; + border-radius: 15px; +} + +/* Allow for input prepend/append in search forms */ + +.form-search .input-append .search-query, +.form-search .input-prepend .search-query { + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +.form-search .input-append .search-query { + -webkit-border-radius: 14px 0 0 14px; + -moz-border-radius: 14px 0 0 14px; + border-radius: 14px 0 0 14px; +} + +.form-search .input-append .btn { + -webkit-border-radius: 0 14px 14px 0; + -moz-border-radius: 0 14px 14px 0; + border-radius: 0 14px 14px 0; +} + +.form-search .input-prepend .search-query { + -webkit-border-radius: 0 14px 14px 0; + -moz-border-radius: 0 14px 14px 0; + border-radius: 0 14px 14px 0; +} + +.form-search .input-prepend .btn { + -webkit-border-radius: 14px 0 0 14px; + -moz-border-radius: 14px 0 0 14px; + border-radius: 14px 0 0 14px; +} + +.form-search input, +.form-inline input, +.form-horizontal input, +.form-search textarea, +.form-inline textarea, +.form-horizontal textarea, +.form-search select, +.form-inline select, +.form-horizontal select, +.form-search .help-inline, +.form-inline .help-inline, +.form-horizontal .help-inline, +.form-search .uneditable-input, +.form-inline .uneditable-input, +.form-horizontal .uneditable-input, +.form-search .input-prepend, +.form-inline .input-prepend, +.form-horizontal .input-prepend, +.form-search .input-append, +.form-inline .input-append, +.form-horizontal .input-append { + display: inline-block; + *display: inline; + margin-bottom: 0; + vertical-align: middle; + *zoom: 1; +} + +.form-search .hide, +.form-inline .hide, +.form-horizontal .hide { + display: none; +} + +.form-search label, +.form-inline label, +.form-search .btn-group, +.form-inline .btn-group { + display: inline-block; +} + +.form-search .input-append, +.form-inline .input-append, +.form-search .input-prepend, +.form-inline .input-prepend { + margin-bottom: 0; +} + +.form-search .radio, +.form-search .checkbox, +.form-inline .radio, +.form-inline .checkbox { + padding-left: 0; + margin-bottom: 0; + vertical-align: middle; +} + +.form-search .radio input[type="radio"], +.form-search .checkbox input[type="checkbox"], +.form-inline .radio input[type="radio"], +.form-inline .checkbox input[type="checkbox"] { + float: left; + margin-right: 3px; + margin-left: 0; +} + +.control-group { + margin-bottom: 10px; +} + +legend + .control-group { + margin-top: 20px; + -webkit-margin-top-collapse: separate; +} + +.form-horizontal .control-group { + margin-bottom: 20px; + *zoom: 1; +} + +.form-horizontal .control-group:before, +.form-horizontal .control-group:after { + display: table; + line-height: 0; + content: ""; +} + +.form-horizontal .control-group:after { + clear: both; +} + +.form-horizontal .control-label { + float: left; + width: 160px; + padding-top: 5px; + text-align: right; +} + +.form-horizontal .controls { + *display: inline-block; + *padding-left: 20px; + margin-left: 180px; + *margin-left: 0; +} + +.form-horizontal .controls:first-child { + *padding-left: 180px; +} + +.form-horizontal .help-block { + margin-bottom: 0; +} + +.form-horizontal input + .help-block, +.form-horizontal select + .help-block, +.form-horizontal textarea + .help-block, +.form-horizontal .uneditable-input + .help-block, +.form-horizontal .input-prepend + .help-block, +.form-horizontal .input-append + .help-block { + margin-top: 10px; +} + +.form-horizontal .form-actions { + padding-left: 180px; +} + +table { + max-width: 100%; + background-color: transparent; + border-collapse: collapse; + border-spacing: 0; +} + +.table { + width: 100%; + margin-bottom: 20px; +} + +.table th, +.table td { + padding: 8px; + line-height: 20px; + text-align: left; + vertical-align: top; + border-top: 1px solid #dddddd; +} + +.table th { + font-weight: bold; +} + +.table thead th { + vertical-align: bottom; +} + +.table caption + thead tr:first-child th, +.table caption + thead tr:first-child td, +.table colgroup + thead tr:first-child th, +.table colgroup + thead tr:first-child td, +.table thead:first-child tr:first-child th, +.table thead:first-child tr:first-child td { + border-top: 0; +} + +.table tbody + tbody { + border-top: 2px solid #dddddd; +} + +.table .table { + background-color: #ffffff; +} + +.table-condensed th, +.table-condensed td { + padding: 4px 5px; +} + +.table-bordered { + border: 1px solid #dddddd; + border-collapse: separate; + *border-collapse: collapse; + border-left: 0; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +.table-bordered th, +.table-bordered td { + border-left: 1px solid #dddddd; +} + +.table-bordered caption + thead tr:first-child th, +.table-bordered caption + tbody tr:first-child th, +.table-bordered caption + tbody tr:first-child td, +.table-bordered colgroup + thead tr:first-child th, +.table-bordered colgroup + tbody tr:first-child th, +.table-bordered colgroup + tbody tr:first-child td, +.table-bordered thead:first-child tr:first-child th, +.table-bordered tbody:first-child tr:first-child th, +.table-bordered tbody:first-child tr:first-child td { + border-top: 0; +} + +.table-bordered thead:first-child tr:first-child > th:first-child, +.table-bordered tbody:first-child tr:first-child > td:first-child, +.table-bordered tbody:first-child tr:first-child > th:first-child { + -webkit-border-top-left-radius: 4px; + border-top-left-radius: 4px; + -moz-border-radius-topleft: 4px; +} + +.table-bordered thead:first-child tr:first-child > th:last-child, +.table-bordered tbody:first-child tr:first-child > td:last-child, +.table-bordered tbody:first-child tr:first-child > th:last-child { + -webkit-border-top-right-radius: 4px; + border-top-right-radius: 4px; + -moz-border-radius-topright: 4px; +} + +.table-bordered thead:last-child tr:last-child > th:first-child, +.table-bordered tbody:last-child tr:last-child > td:first-child, +.table-bordered tbody:last-child tr:last-child > th:first-child, +.table-bordered tfoot:last-child tr:last-child > td:first-child, +.table-bordered tfoot:last-child tr:last-child > th:first-child { + -webkit-border-bottom-left-radius: 4px; + border-bottom-left-radius: 4px; + -moz-border-radius-bottomleft: 4px; +} + +.table-bordered thead:last-child tr:last-child > th:last-child, +.table-bordered tbody:last-child tr:last-child > td:last-child, +.table-bordered tbody:last-child tr:last-child > th:last-child, +.table-bordered tfoot:last-child tr:last-child > td:last-child, +.table-bordered tfoot:last-child tr:last-child > th:last-child { + -webkit-border-bottom-right-radius: 4px; + border-bottom-right-radius: 4px; + -moz-border-radius-bottomright: 4px; +} + +.table-bordered tfoot + tbody:last-child tr:last-child td:first-child { + -webkit-border-bottom-left-radius: 0; + border-bottom-left-radius: 0; + -moz-border-radius-bottomleft: 0; +} + +.table-bordered tfoot + tbody:last-child tr:last-child td:last-child { + -webkit-border-bottom-right-radius: 0; + border-bottom-right-radius: 0; + -moz-border-radius-bottomright: 0; +} + +.table-bordered caption + thead tr:first-child th:first-child, +.table-bordered caption + tbody tr:first-child td:first-child, +.table-bordered colgroup + thead tr:first-child th:first-child, +.table-bordered colgroup + tbody tr:first-child td:first-child { + -webkit-border-top-left-radius: 4px; + border-top-left-radius: 4px; + -moz-border-radius-topleft: 4px; +} + +.table-bordered caption + thead tr:first-child th:last-child, +.table-bordered caption + tbody tr:first-child td:last-child, +.table-bordered colgroup + thead tr:first-child th:last-child, +.table-bordered colgroup + tbody tr:first-child td:last-child { + -webkit-border-top-right-radius: 4px; + border-top-right-radius: 4px; + -moz-border-radius-topright: 4px; +} + +.table-striped tbody > tr:nth-child(odd) > td, +.table-striped tbody > tr:nth-child(odd) > th { + background-color: #f9f9f9; +} + +.table-hover tbody tr:hover > td, +.table-hover tbody tr:hover > th { + background-color: #f5f5f5; +} + +table td[class*="span"], +table th[class*="span"], +.row-fluid table td[class*="span"], +.row-fluid table th[class*="span"] { + display: table-cell; + float: none; + margin-left: 0; +} + +.table td.span1, +.table th.span1 { + float: none; + width: 44px; + margin-left: 0; +} + +.table td.span2, +.table th.span2 { + float: none; + width: 124px; + margin-left: 0; +} + +.table td.span3, +.table th.span3 { + float: none; + width: 204px; + margin-left: 0; +} + +.table td.span4, +.table th.span4 { + float: none; + width: 284px; + margin-left: 0; +} + +.table td.span5, +.table th.span5 { + float: none; + width: 364px; + margin-left: 0; +} + +.table td.span6, +.table th.span6 { + float: none; + width: 444px; + margin-left: 0; +} + +.table td.span7, +.table th.span7 { + float: none; + width: 524px; + margin-left: 0; +} + +.table td.span8, +.table th.span8 { + float: none; + width: 604px; + margin-left: 0; +} + +.table td.span9, +.table th.span9 { + float: none; + width: 684px; + margin-left: 0; +} + +.table td.span10, +.table th.span10 { + float: none; + width: 764px; + margin-left: 0; +} + +.table td.span11, +.table th.span11 { + float: none; + width: 844px; + margin-left: 0; +} + +.table td.span12, +.table th.span12 { + float: none; + width: 924px; + margin-left: 0; +} + +.table tbody tr.success > td { + background-color: #dff0d8; +} + +.table tbody tr.error > td { + background-color: #f2dede; +} + +.table tbody tr.warning > td { + background-color: #fcf8e3; +} + +.table tbody tr.info > td { + background-color: #d9edf7; +} + +.table-hover tbody tr.success:hover > td { + background-color: #d0e9c6; +} + +.table-hover tbody tr.error:hover > td { + background-color: #ebcccc; +} + +.table-hover tbody tr.warning:hover > td { + background-color: #faf2cc; +} + +.table-hover tbody tr.info:hover > td { + background-color: #c4e3f3; +} + +[class^="icon-"], +[class*=" icon-"] { + display: inline-block; + width: 14px; + height: 14px; + margin-top: 1px; + *margin-right: .3em; + line-height: 14px; + vertical-align: text-top; + background-image: url("../img/glyphicons-halflings.png"); + background-position: 14px 14px; + background-repeat: no-repeat; +} + +/* White icons with optional class, or on hover/focus/active states of certain elements */ + +.icon-white, +.nav-pills > .active > a > [class^="icon-"], +.nav-pills > .active > a > [class*=" icon-"], +.nav-list > .active > a > [class^="icon-"], +.nav-list > .active > a > [class*=" icon-"], +.navbar-inverse .nav > .active > a > [class^="icon-"], +.navbar-inverse .nav > .active > a > [class*=" icon-"], +.dropdown-menu > li > a:hover > [class^="icon-"], +.dropdown-menu > li > a:focus > [class^="icon-"], +.dropdown-menu > li > a:hover > [class*=" icon-"], +.dropdown-menu > li > a:focus > [class*=" icon-"], +.dropdown-menu > .active > a > [class^="icon-"], +.dropdown-menu > .active > a > [class*=" icon-"], +.dropdown-submenu:hover > a > [class^="icon-"], +.dropdown-submenu:focus > a > [class^="icon-"], +.dropdown-submenu:hover > a > [class*=" icon-"], +.dropdown-submenu:focus > a > [class*=" icon-"] { + background-image: url("../img/glyphicons-halflings-white.png"); +} + +.icon-glass { + background-position: 0 0; +} + +.icon-music { + background-position: -24px 0; +} + +.icon-search { + background-position: -48px 0; +} + +.icon-envelope { + background-position: -72px 0; +} + +.icon-heart { + background-position: -96px 0; +} + +.icon-star { + background-position: -120px 0; +} + +.icon-star-empty { + background-position: -144px 0; +} + +.icon-user { + background-position: -168px 0; +} + +.icon-film { + background-position: -192px 0; +} + +.icon-th-large { + background-position: -216px 0; +} + +.icon-th { + background-position: -240px 0; +} + +.icon-th-list { + background-position: -264px 0; +} + +.icon-ok { + background-position: -288px 0; +} + +.icon-remove { + background-position: -312px 0; +} + +.icon-zoom-in { + background-position: -336px 0; +} + +.icon-zoom-out { + background-position: -360px 0; +} + +.icon-off { + background-position: -384px 0; +} + +.icon-signal { + background-position: -408px 0; +} + +.icon-cog { + background-position: -432px 0; +} + +.icon-trash { + background-position: -456px 0; +} + +.icon-home { + background-position: 0 -24px; +} + +.icon-file { + background-position: -24px -24px; +} + +.icon-time { + background-position: -48px -24px; +} + +.icon-road { + background-position: -72px -24px; +} + +.icon-download-alt { + background-position: -96px -24px; +} + +.icon-download { + background-position: -120px -24px; +} + +.icon-upload { + background-position: -144px -24px; +} + +.icon-inbox { + background-position: -168px -24px; +} + +.icon-play-circle { + background-position: -192px -24px; +} + +.icon-repeat { + background-position: -216px -24px; +} + +.icon-refresh { + background-position: -240px -24px; +} + +.icon-list-alt { + background-position: -264px -24px; +} + +.icon-lock { + background-position: -287px -24px; +} + +.icon-flag { + background-position: -312px -24px; +} + +.icon-headphones { + background-position: -336px -24px; +} + +.icon-volume-off { + background-position: -360px -24px; +} + +.icon-volume-down { + background-position: -384px -24px; +} + +.icon-volume-up { + background-position: -408px -24px; +} + +.icon-qrcode { + background-position: -432px -24px; +} + +.icon-barcode { + background-position: -456px -24px; +} + +.icon-tag { + background-position: 0 -48px; +} + +.icon-tags { + background-position: -25px -48px; +} + +.icon-book { + background-position: -48px -48px; +} + +.icon-bookmark { + background-position: -72px -48px; +} + +.icon-print { + background-position: -96px -48px; +} + +.icon-camera { + background-position: -120px -48px; +} + +.icon-font { + background-position: -144px -48px; +} + +.icon-bold { + background-position: -167px -48px; +} + +.icon-italic { + background-position: -192px -48px; +} + +.icon-text-height { + background-position: -216px -48px; +} + +.icon-text-width { + background-position: -240px -48px; +} + +.icon-align-left { + background-position: -264px -48px; +} + +.icon-align-center { + background-position: -288px -48px; +} + +.icon-align-right { + background-position: -312px -48px; +} + +.icon-align-justify { + background-position: -336px -48px; +} + +.icon-list { + background-position: -360px -48px; +} + +.icon-indent-left { + background-position: -384px -48px; +} + +.icon-indent-right { + background-position: -408px -48px; +} + +.icon-facetime-video { + background-position: -432px -48px; +} + +.icon-picture { + background-position: -456px -48px; +} + +.icon-pencil { + background-position: 0 -72px; +} + +.icon-map-marker { + background-position: -24px -72px; +} + +.icon-adjust { + background-position: -48px -72px; +} + +.icon-tint { + background-position: -72px -72px; +} + +.icon-edit { + background-position: -96px -72px; +} + +.icon-share { + background-position: -120px -72px; +} + +.icon-check { + background-position: -144px -72px; +} + +.icon-move { + background-position: -168px -72px; +} + +.icon-step-backward { + background-position: -192px -72px; +} + +.icon-fast-backward { + background-position: -216px -72px; +} + +.icon-backward { + background-position: -240px -72px; +} + +.icon-play { + background-position: -264px -72px; +} + +.icon-pause { + background-position: -288px -72px; +} + +.icon-stop { + background-position: -312px -72px; +} + +.icon-forward { + background-position: -336px -72px; +} + +.icon-fast-forward { + background-position: -360px -72px; +} + +.icon-step-forward { + background-position: -384px -72px; +} + +.icon-eject { + background-position: -408px -72px; +} + +.icon-chevron-left { + background-position: -432px -72px; +} + +.icon-chevron-right { + background-position: -456px -72px; +} + +.icon-plus-sign { + background-position: 0 -96px; +} + +.icon-minus-sign { + background-position: -24px -96px; +} + +.icon-remove-sign { + background-position: -48px -96px; +} + +.icon-ok-sign { + background-position: -72px -96px; +} + +.icon-question-sign { + background-position: -96px -96px; +} + +.icon-info-sign { + background-position: -120px -96px; +} + +.icon-screenshot { + background-position: -144px -96px; +} + +.icon-remove-circle { + background-position: -168px -96px; +} + +.icon-ok-circle { + background-position: -192px -96px; +} + +.icon-ban-circle { + background-position: -216px -96px; +} + +.icon-arrow-left { + background-position: -240px -96px; +} + +.icon-arrow-right { + background-position: -264px -96px; +} + +.icon-arrow-up { + background-position: -289px -96px; +} + +.icon-arrow-down { + background-position: -312px -96px; +} + +.icon-share-alt { + background-position: -336px -96px; +} + +.icon-resize-full { + background-position: -360px -96px; +} + +.icon-resize-small { + background-position: -384px -96px; +} + +.icon-plus { + background-position: -408px -96px; +} + +.icon-minus { + background-position: -433px -96px; +} + +.icon-asterisk { + background-position: -456px -96px; +} + +.icon-exclamation-sign { + background-position: 0 -120px; +} + +.icon-gift { + background-position: -24px -120px; +} + +.icon-leaf { + background-position: -48px -120px; +} + +.icon-fire { + background-position: -72px -120px; +} + +.icon-eye-open { + background-position: -96px -120px; +} + +.icon-eye-close { + background-position: -120px -120px; +} + +.icon-warning-sign { + background-position: -144px -120px; +} + +.icon-plane { + background-position: -168px -120px; +} + +.icon-calendar { + background-position: -192px -120px; +} + +.icon-random { + width: 16px; + background-position: -216px -120px; +} + +.icon-comment { + background-position: -240px -120px; +} + +.icon-magnet { + background-position: -264px -120px; +} + +.icon-chevron-up { + background-position: -288px -120px; +} + +.icon-chevron-down { + background-position: -313px -119px; +} + +.icon-retweet { + background-position: -336px -120px; +} + +.icon-shopping-cart { + background-position: -360px -120px; +} + +.icon-folder-close { + width: 16px; + background-position: -384px -120px; +} + +.icon-folder-open { + width: 16px; + background-position: -408px -120px; +} + +.icon-resize-vertical { + background-position: -432px -119px; +} + +.icon-resize-horizontal { + background-position: -456px -118px; +} + +.icon-hdd { + background-position: 0 -144px; +} + +.icon-bullhorn { + background-position: -24px -144px; +} + +.icon-bell { + background-position: -48px -144px; +} + +.icon-certificate { + background-position: -72px -144px; +} + +.icon-thumbs-up { + background-position: -96px -144px; +} + +.icon-thumbs-down { + background-position: -120px -144px; +} + +.icon-hand-right { + background-position: -144px -144px; +} + +.icon-hand-left { + background-position: -168px -144px; +} + +.icon-hand-up { + background-position: -192px -144px; +} + +.icon-hand-down { + background-position: -216px -144px; +} + +.icon-circle-arrow-right { + background-position: -240px -144px; +} + +.icon-circle-arrow-left { + background-position: -264px -144px; +} + +.icon-circle-arrow-up { + background-position: -288px -144px; +} + +.icon-circle-arrow-down { + background-position: -312px -144px; +} + +.icon-globe { + background-position: -336px -144px; +} + +.icon-wrench { + background-position: -360px -144px; +} + +.icon-tasks { + background-position: -384px -144px; +} + +.icon-filter { + background-position: -408px -144px; +} + +.icon-briefcase { + background-position: -432px -144px; +} + +.icon-fullscreen { + background-position: -456px -144px; +} + +.dropup, +.dropdown { + position: relative; +} + +.dropdown-toggle { + *margin-bottom: -3px; +} + +.dropdown-toggle:active, +.open .dropdown-toggle { + outline: 0; +} + +.caret { + display: inline-block; + width: 0; + height: 0; + vertical-align: top; + border-top: 4px solid #000000; + border-right: 4px solid transparent; + border-left: 4px solid transparent; + content: ""; +} + +.dropdown .caret { + margin-top: 8px; + margin-left: 2px; +} + +.dropdown-menu { + position: absolute; + top: 100%; + left: 0; + z-index: 1000; + display: none; + float: left; + min-width: 160px; + padding: 5px 0; + margin: 2px 0 0; + list-style: none; + background-color: #ffffff; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, 0.2); + *border-right-width: 2px; + *border-bottom-width: 2px; + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; + -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + -webkit-background-clip: padding-box; + -moz-background-clip: padding; + background-clip: padding-box; +} + +.dropdown-menu.pull-right { + right: 0; + left: auto; +} + +.dropdown-menu .divider { + *width: 100%; + height: 1px; + margin: 9px 1px; + *margin: -5px 0 5px; + overflow: hidden; + background-color: #e5e5e5; + border-bottom: 1px solid #ffffff; +} + +.dropdown-menu > li > a { + display: block; + padding: 3px 20px; + clear: both; + font-weight: normal; + line-height: 20px; + color: #333333; + white-space: nowrap; +} + +.dropdown-menu > li > a:hover, +.dropdown-menu > li > a:focus, +.dropdown-submenu:hover > a, +.dropdown-submenu:focus > a { + color: #ffffff; + text-decoration: none; + background-color: #0081c2; + background-image: -moz-linear-gradient(top, #0088cc, #0077b3); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0077b3)); + background-image: -webkit-linear-gradient(top, #0088cc, #0077b3); + background-image: -o-linear-gradient(top, #0088cc, #0077b3); + background-image: linear-gradient(to bottom, #0088cc, #0077b3); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0077b3', GradientType=0); +} + +.dropdown-menu > .active > a, +.dropdown-menu > .active > a:hover, +.dropdown-menu > .active > a:focus { + color: #ffffff; + text-decoration: none; + background-color: #0081c2; + background-image: -moz-linear-gradient(top, #0088cc, #0077b3); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0077b3)); + background-image: -webkit-linear-gradient(top, #0088cc, #0077b3); + background-image: -o-linear-gradient(top, #0088cc, #0077b3); + background-image: linear-gradient(to bottom, #0088cc, #0077b3); + background-repeat: repeat-x; + outline: 0; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0077b3', GradientType=0); +} + +.dropdown-menu > .disabled > a, +.dropdown-menu > .disabled > a:hover, +.dropdown-menu > .disabled > a:focus { + color: #999999; +} + +.dropdown-menu > .disabled > a:hover, +.dropdown-menu > .disabled > a:focus { + text-decoration: none; + cursor: default; + background-color: transparent; + background-image: none; + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); +} + +.open { + *z-index: 1000; +} + +.open > .dropdown-menu { + display: block; +} + +.dropdown-backdrop { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 990; +} + +.pull-right > .dropdown-menu { + right: 0; + left: auto; +} + +.dropup .caret, +.navbar-fixed-bottom .dropdown .caret { + border-top: 0; + border-bottom: 4px solid #000000; + content: ""; +} + +.dropup .dropdown-menu, +.navbar-fixed-bottom .dropdown .dropdown-menu { + top: auto; + bottom: 100%; + margin-bottom: 1px; +} + +.dropdown-submenu { + position: relative; +} + +.dropdown-submenu > .dropdown-menu { + top: 0; + left: 100%; + margin-top: -6px; + margin-left: -1px; + -webkit-border-radius: 0 6px 6px 6px; + -moz-border-radius: 0 6px 6px 6px; + border-radius: 0 6px 6px 6px; +} + +.dropdown-submenu:hover > .dropdown-menu { + display: block; +} + +.dropup .dropdown-submenu > .dropdown-menu { + top: auto; + bottom: 0; + margin-top: 0; + margin-bottom: -2px; + -webkit-border-radius: 5px 5px 5px 0; + -moz-border-radius: 5px 5px 5px 0; + border-radius: 5px 5px 5px 0; +} + +.dropdown-submenu > a:after { + display: block; + float: right; + width: 0; + height: 0; + margin-top: 5px; + margin-right: -10px; + border-color: transparent; + border-left-color: #cccccc; + border-style: solid; + border-width: 5px 0 5px 5px; + content: " "; +} + +.dropdown-submenu:hover > a:after { + border-left-color: #ffffff; +} + +.dropdown-submenu.pull-left { + float: none; +} + +.dropdown-submenu.pull-left > .dropdown-menu { + left: -100%; + margin-left: 10px; + -webkit-border-radius: 6px 0 6px 6px; + -moz-border-radius: 6px 0 6px 6px; + border-radius: 6px 0 6px 6px; +} + +.dropdown .dropdown-menu .nav-header { + padding-right: 20px; + padding-left: 20px; +} + +.typeahead { + z-index: 1051; + margin-top: 2px; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +.well { + min-height: 20px; + padding: 19px; + margin-bottom: 20px; + background-color: #f5f5f5; + border: 1px solid #e3e3e3; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); +} + +.well blockquote { + border-color: #ddd; + border-color: rgba(0, 0, 0, 0.15); +} + +.well-large { + padding: 24px; + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; +} + +.well-small { + padding: 9px; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; +} + +.fade { + opacity: 0; + -webkit-transition: opacity 0.15s linear; + -moz-transition: opacity 0.15s linear; + -o-transition: opacity 0.15s linear; + transition: opacity 0.15s linear; +} + +.fade.in { + opacity: 1; +} + +.collapse { + position: relative; + height: 0; + overflow: hidden; + -webkit-transition: height 0.35s ease; + -moz-transition: height 0.35s ease; + -o-transition: height 0.35s ease; + transition: height 0.35s ease; +} + +.collapse.in { + height: auto; +} + +.close { + float: right; + font-size: 20px; + font-weight: bold; + line-height: 20px; + color: #000000; + text-shadow: 0 1px 0 #ffffff; + opacity: 0.2; + filter: alpha(opacity=20); +} + +.close:hover, +.close:focus { + color: #000000; + text-decoration: none; + cursor: pointer; + opacity: 0.4; + filter: alpha(opacity=40); +} + +button.close { + padding: 0; + cursor: pointer; + background: transparent; + border: 0; + -webkit-appearance: none; +} + +.btn { + display: inline-block; + *display: inline; + padding: 4px 12px; + margin-bottom: 0; + *margin-left: .3em; + font-size: 14px; + line-height: 20px; + color: #333333; + text-align: center; + text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75); + vertical-align: middle; + cursor: pointer; + background-color: #f5f5f5; + *background-color: #e6e6e6; + background-image: -moz-linear-gradient(top, #ffffff, #e6e6e6); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#e6e6e6)); + background-image: -webkit-linear-gradient(top, #ffffff, #e6e6e6); + background-image: -o-linear-gradient(top, #ffffff, #e6e6e6); + background-image: linear-gradient(to bottom, #ffffff, #e6e6e6); + background-repeat: repeat-x; + border: 1px solid #cccccc; + *border: 0; + border-color: #e6e6e6 #e6e6e6 #bfbfbf; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + border-bottom-color: #b3b3b3; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe6e6e6', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); + *zoom: 1; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); +} + +.btn:hover, +.btn:focus, +.btn:active, +.btn.active, +.btn.disabled, +.btn[disabled] { + color: #333333; + background-color: #e6e6e6; + *background-color: #d9d9d9; +} + +.btn:active, +.btn.active { + background-color: #cccccc \9; +} + +.btn:first-child { + *margin-left: 0; +} + +.btn:hover, +.btn:focus { + color: #333333; + text-decoration: none; + background-position: 0 -15px; + -webkit-transition: background-position 0.1s linear; + -moz-transition: background-position 0.1s linear; + -o-transition: background-position 0.1s linear; + transition: background-position 0.1s linear; +} + +.btn:focus { + outline: thin dotted #333; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} + +.btn.active, +.btn:active { + background-image: none; + outline: 0; + -webkit-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); +} + +.btn.disabled, +.btn[disabled] { + cursor: default; + background-image: none; + opacity: 0.65; + filter: alpha(opacity=65); + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; +} + +.btn-large { + padding: 11px 19px; + font-size: 17.5px; + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; +} + +.btn-large [class^="icon-"], +.btn-large [class*=" icon-"] { + margin-top: 4px; +} + +.btn-small { + padding: 2px 10px; + font-size: 11.9px; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; +} + +.btn-small [class^="icon-"], +.btn-small [class*=" icon-"] { + margin-top: 0; +} + +.btn-mini [class^="icon-"], +.btn-mini [class*=" icon-"] { + margin-top: -1px; +} + +.btn-mini { + padding: 0 6px; + font-size: 10.5px; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; +} + +.btn-block { + display: block; + width: 100%; + padding-right: 0; + padding-left: 0; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +.btn-block + .btn-block { + margin-top: 5px; +} + +input[type="submit"].btn-block, +input[type="reset"].btn-block, +input[type="button"].btn-block { + width: 100%; +} + +.btn-primary.active, +.btn-warning.active, +.btn-danger.active, +.btn-success.active, +.btn-info.active, +.btn-inverse.active { + color: rgba(255, 255, 255, 0.75); +} + +.btn-primary { + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #006dcc; + *background-color: #0044cc; + background-image: -moz-linear-gradient(top, #0088cc, #0044cc); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0044cc)); + background-image: -webkit-linear-gradient(top, #0088cc, #0044cc); + background-image: -o-linear-gradient(top, #0088cc, #0044cc); + background-image: linear-gradient(to bottom, #0088cc, #0044cc); + background-repeat: repeat-x; + border-color: #0044cc #0044cc #002a80; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0044cc', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); +} + +.btn-primary:hover, +.btn-primary:focus, +.btn-primary:active, +.btn-primary.active, +.btn-primary.disabled, +.btn-primary[disabled] { + color: #ffffff; + background-color: #0044cc; + *background-color: #003bb3; +} + +.btn-primary:active, +.btn-primary.active { + background-color: #003399 \9; +} + +.btn-warning { + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #faa732; + *background-color: #f89406; + background-image: -moz-linear-gradient(top, #fbb450, #f89406); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406)); + background-image: -webkit-linear-gradient(top, #fbb450, #f89406); + background-image: -o-linear-gradient(top, #fbb450, #f89406); + background-image: linear-gradient(to bottom, #fbb450, #f89406); + background-repeat: repeat-x; + border-color: #f89406 #f89406 #ad6704; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450', endColorstr='#fff89406', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); +} + +.btn-warning:hover, +.btn-warning:focus, +.btn-warning:active, +.btn-warning.active, +.btn-warning.disabled, +.btn-warning[disabled] { + color: #ffffff; + background-color: #f89406; + *background-color: #df8505; +} + +.btn-warning:active, +.btn-warning.active { + background-color: #c67605 \9; +} + +.btn-danger { + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #da4f49; + *background-color: #bd362f; + background-image: -moz-linear-gradient(top, #ee5f5b, #bd362f); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#bd362f)); + background-image: -webkit-linear-gradient(top, #ee5f5b, #bd362f); + background-image: -o-linear-gradient(top, #ee5f5b, #bd362f); + background-image: linear-gradient(to bottom, #ee5f5b, #bd362f); + background-repeat: repeat-x; + border-color: #bd362f #bd362f #802420; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b', endColorstr='#ffbd362f', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); +} + +.btn-danger:hover, +.btn-danger:focus, +.btn-danger:active, +.btn-danger.active, +.btn-danger.disabled, +.btn-danger[disabled] { + color: #ffffff; + background-color: #bd362f; + *background-color: #a9302a; +} + +.btn-danger:active, +.btn-danger.active { + background-color: #942a25 \9; +} + +.btn-success { + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #5bb75b; + *background-color: #51a351; + background-image: -moz-linear-gradient(top, #62c462, #51a351); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#51a351)); + background-image: -webkit-linear-gradient(top, #62c462, #51a351); + background-image: -o-linear-gradient(top, #62c462, #51a351); + background-image: linear-gradient(to bottom, #62c462, #51a351); + background-repeat: repeat-x; + border-color: #51a351 #51a351 #387038; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462', endColorstr='#ff51a351', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); +} + +.btn-success:hover, +.btn-success:focus, +.btn-success:active, +.btn-success.active, +.btn-success.disabled, +.btn-success[disabled] { + color: #ffffff; + background-color: #51a351; + *background-color: #499249; +} + +.btn-success:active, +.btn-success.active { + background-color: #408140 \9; +} + +.btn-info { + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #49afcd; + *background-color: #2f96b4; + background-image: -moz-linear-gradient(top, #5bc0de, #2f96b4); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#2f96b4)); + background-image: -webkit-linear-gradient(top, #5bc0de, #2f96b4); + background-image: -o-linear-gradient(top, #5bc0de, #2f96b4); + background-image: linear-gradient(to bottom, #5bc0de, #2f96b4); + background-repeat: repeat-x; + border-color: #2f96b4 #2f96b4 #1f6377; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2f96b4', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); +} + +.btn-info:hover, +.btn-info:focus, +.btn-info:active, +.btn-info.active, +.btn-info.disabled, +.btn-info[disabled] { + color: #ffffff; + background-color: #2f96b4; + *background-color: #2a85a0; +} + +.btn-info:active, +.btn-info.active { + background-color: #24748c \9; +} + +.btn-inverse { + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #363636; + *background-color: #222222; + background-image: -moz-linear-gradient(top, #444444, #222222); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#444444), to(#222222)); + background-image: -webkit-linear-gradient(top, #444444, #222222); + background-image: -o-linear-gradient(top, #444444, #222222); + background-image: linear-gradient(to bottom, #444444, #222222); + background-repeat: repeat-x; + border-color: #222222 #222222 #000000; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff444444', endColorstr='#ff222222', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); +} + +.btn-inverse:hover, +.btn-inverse:focus, +.btn-inverse:active, +.btn-inverse.active, +.btn-inverse.disabled, +.btn-inverse[disabled] { + color: #ffffff; + background-color: #222222; + *background-color: #151515; +} + +.btn-inverse:active, +.btn-inverse.active { + background-color: #080808 \9; +} + +button.btn, +input[type="submit"].btn { + *padding-top: 3px; + *padding-bottom: 3px; +} + +button.btn::-moz-focus-inner, +input[type="submit"].btn::-moz-focus-inner { + padding: 0; + border: 0; +} + +button.btn.btn-large, +input[type="submit"].btn.btn-large { + *padding-top: 7px; + *padding-bottom: 7px; +} + +button.btn.btn-small, +input[type="submit"].btn.btn-small { + *padding-top: 3px; + *padding-bottom: 3px; +} + +button.btn.btn-mini, +input[type="submit"].btn.btn-mini { + *padding-top: 1px; + *padding-bottom: 1px; +} + +.btn-link, +.btn-link:active, +.btn-link[disabled] { + background-color: transparent; + background-image: none; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; +} + +.btn-link { + color: #0088cc; + cursor: pointer; + border-color: transparent; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +.btn-link:hover, +.btn-link:focus { + color: #005580; + text-decoration: underline; + background-color: transparent; +} + +.btn-link[disabled]:hover, +.btn-link[disabled]:focus { + color: #333333; + text-decoration: none; +} + +.btn-group { + position: relative; + display: inline-block; + *display: inline; + *margin-left: .3em; + font-size: 0; + white-space: nowrap; + vertical-align: middle; + *zoom: 1; +} + +.btn-group:first-child { + *margin-left: 0; +} + +.btn-group + .btn-group { + margin-left: 5px; +} + +.btn-toolbar { + margin-top: 10px; + margin-bottom: 10px; + font-size: 0; +} + +.btn-toolbar > .btn + .btn, +.btn-toolbar > .btn-group + .btn, +.btn-toolbar > .btn + .btn-group { + margin-left: 5px; +} + +.btn-group > .btn { + position: relative; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +.btn-group > .btn + .btn { + margin-left: -1px; +} + +.btn-group > .btn, +.btn-group > .dropdown-menu, +.btn-group > .popover { + font-size: 14px; +} + +.btn-group > .btn-mini { + font-size: 10.5px; +} + +.btn-group > .btn-small { + font-size: 11.9px; +} + +.btn-group > .btn-large { + font-size: 17.5px; +} + +.btn-group > .btn:first-child { + margin-left: 0; + -webkit-border-bottom-left-radius: 4px; + border-bottom-left-radius: 4px; + -webkit-border-top-left-radius: 4px; + border-top-left-radius: 4px; + -moz-border-radius-bottomleft: 4px; + -moz-border-radius-topleft: 4px; +} + +.btn-group > .btn:last-child, +.btn-group > .dropdown-toggle { + -webkit-border-top-right-radius: 4px; + border-top-right-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + border-bottom-right-radius: 4px; + -moz-border-radius-topright: 4px; + -moz-border-radius-bottomright: 4px; +} + +.btn-group > .btn.large:first-child { + margin-left: 0; + -webkit-border-bottom-left-radius: 6px; + border-bottom-left-radius: 6px; + -webkit-border-top-left-radius: 6px; + border-top-left-radius: 6px; + -moz-border-radius-bottomleft: 6px; + -moz-border-radius-topleft: 6px; +} + +.btn-group > .btn.large:last-child, +.btn-group > .large.dropdown-toggle { + -webkit-border-top-right-radius: 6px; + border-top-right-radius: 6px; + -webkit-border-bottom-right-radius: 6px; + border-bottom-right-radius: 6px; + -moz-border-radius-topright: 6px; + -moz-border-radius-bottomright: 6px; +} + +.btn-group > .btn:hover, +.btn-group > .btn:focus, +.btn-group > .btn:active, +.btn-group > .btn.active { + z-index: 2; +} + +.btn-group .dropdown-toggle:active, +.btn-group.open .dropdown-toggle { + outline: 0; +} + +.btn-group > .btn + .dropdown-toggle { + *padding-top: 5px; + padding-right: 8px; + *padding-bottom: 5px; + padding-left: 8px; + -webkit-box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); + box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); +} + +.btn-group > .btn-mini + .dropdown-toggle { + *padding-top: 2px; + padding-right: 5px; + *padding-bottom: 2px; + padding-left: 5px; +} + +.btn-group > .btn-small + .dropdown-toggle { + *padding-top: 5px; + *padding-bottom: 4px; +} + +.btn-group > .btn-large + .dropdown-toggle { + *padding-top: 7px; + padding-right: 12px; + *padding-bottom: 7px; + padding-left: 12px; +} + +.btn-group.open .dropdown-toggle { + background-image: none; + -webkit-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); +} + +.btn-group.open .btn.dropdown-toggle { + background-color: #e6e6e6; +} + +.btn-group.open .btn-primary.dropdown-toggle { + background-color: #0044cc; +} + +.btn-group.open .btn-warning.dropdown-toggle { + background-color: #f89406; +} + +.btn-group.open .btn-danger.dropdown-toggle { + background-color: #bd362f; +} + +.btn-group.open .btn-success.dropdown-toggle { + background-color: #51a351; +} + +.btn-group.open .btn-info.dropdown-toggle { + background-color: #2f96b4; +} + +.btn-group.open .btn-inverse.dropdown-toggle { + background-color: #222222; +} + +.btn .caret { + margin-top: 8px; + margin-left: 0; +} + +.btn-large .caret { + margin-top: 6px; +} + +.btn-large .caret { + border-top-width: 5px; + border-right-width: 5px; + border-left-width: 5px; +} + +.btn-mini .caret, +.btn-small .caret { + margin-top: 8px; +} + +.dropup .btn-large .caret { + border-bottom-width: 5px; +} + +.btn-primary .caret, +.btn-warning .caret, +.btn-danger .caret, +.btn-info .caret, +.btn-success .caret, +.btn-inverse .caret { + border-top-color: #ffffff; + border-bottom-color: #ffffff; +} + +.btn-group-vertical { + display: inline-block; + *display: inline; + /* IE7 inline-block hack */ + + *zoom: 1; +} + +.btn-group-vertical > .btn { + display: block; + float: none; + max-width: 100%; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +.btn-group-vertical > .btn + .btn { + margin-top: -1px; + margin-left: 0; +} + +.btn-group-vertical > .btn:first-child { + -webkit-border-radius: 4px 4px 0 0; + -moz-border-radius: 4px 4px 0 0; + border-radius: 4px 4px 0 0; +} + +.btn-group-vertical > .btn:last-child { + -webkit-border-radius: 0 0 4px 4px; + -moz-border-radius: 0 0 4px 4px; + border-radius: 0 0 4px 4px; +} + +.btn-group-vertical > .btn-large:first-child { + -webkit-border-radius: 6px 6px 0 0; + -moz-border-radius: 6px 6px 0 0; + border-radius: 6px 6px 0 0; +} + +.btn-group-vertical > .btn-large:last-child { + -webkit-border-radius: 0 0 6px 6px; + -moz-border-radius: 0 0 6px 6px; + border-radius: 0 0 6px 6px; +} + +.alert { + padding: 8px 35px 8px 14px; + margin-bottom: 20px; + text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); + background-color: #fcf8e3; + border: 1px solid #fbeed5; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +.alert, +.alert h4 { + color: #c09853; +} + +.alert h4 { + margin: 0; +} + +.alert .close { + position: relative; + top: -2px; + right: -21px; + line-height: 20px; +} + +.alert-success { + color: #468847; + background-color: #dff0d8; + border-color: #d6e9c6; +} + +.alert-success h4 { + color: #468847; +} + +.alert-danger, +.alert-error { + color: #b94a48; + background-color: #f2dede; + border-color: #eed3d7; +} + +.alert-danger h4, +.alert-error h4 { + color: #b94a48; +} + +.alert-info { + color: #3a87ad; + background-color: #d9edf7; + border-color: #bce8f1; +} + +.alert-info h4 { + color: #3a87ad; +} + +.alert-block { + padding-top: 14px; + padding-bottom: 14px; +} + +.alert-block > p, +.alert-block > ul { + margin-bottom: 0; +} + +.alert-block p + p { + margin-top: 5px; +} + +.nav { + margin-bottom: 20px; + margin-left: 0; + list-style: none; +} + +.nav > li > a { + display: block; +} + +.nav > li > a:hover, +.nav > li > a:focus { + text-decoration: none; + background-color: #eeeeee; +} + +.nav > li > a > img { + max-width: none; +} + +.nav > .pull-right { + float: right; +} + +.nav-header { + display: block; + padding: 3px 15px; + font-size: 11px; + font-weight: bold; + line-height: 20px; + color: #999999; + text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); + text-transform: uppercase; +} + +.nav li + .nav-header { + margin-top: 9px; +} + +.nav-list { + padding-right: 15px; + padding-left: 15px; + margin-bottom: 0; +} + +.nav-list > li > a, +.nav-list .nav-header { + margin-right: -15px; + margin-left: -15px; + text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); +} + +.nav-list > li > a { + padding: 3px 15px; +} + +.nav-list > .active > a, +.nav-list > .active > a:hover, +.nav-list > .active > a:focus { + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.2); + background-color: #0088cc; +} + +.nav-list [class^="icon-"], +.nav-list [class*=" icon-"] { + margin-right: 2px; +} + +.nav-list .divider { + *width: 100%; + height: 1px; + margin: 9px 1px; + *margin: -5px 0 5px; + overflow: hidden; + background-color: #e5e5e5; + border-bottom: 1px solid #ffffff; +} + +.nav-tabs, +.nav-pills { + *zoom: 1; +} + +.nav-tabs:before, +.nav-pills:before, +.nav-tabs:after, +.nav-pills:after { + display: table; + line-height: 0; + content: ""; +} + +.nav-tabs:after, +.nav-pills:after { + clear: both; +} + +.nav-tabs > li, +.nav-pills > li { + float: left; +} + +.nav-tabs > li > a, +.nav-pills > li > a { + padding-right: 12px; + padding-left: 12px; + margin-right: 2px; + line-height: 14px; +} + +.nav-tabs { + border-bottom: 1px solid #ddd; +} + +.nav-tabs > li { + margin-bottom: -1px; +} + +.nav-tabs > li > a { + padding-top: 8px; + padding-bottom: 8px; + line-height: 20px; + border: 1px solid transparent; + -webkit-border-radius: 4px 4px 0 0; + -moz-border-radius: 4px 4px 0 0; + border-radius: 4px 4px 0 0; +} + +.nav-tabs > li > a:hover, +.nav-tabs > li > a:focus { + border-color: #eeeeee #eeeeee #dddddd; +} + +.nav-tabs > .active > a, +.nav-tabs > .active > a:hover, +.nav-tabs > .active > a:focus { + color: #555555; + cursor: default; + background-color: #ffffff; + border: 1px solid #ddd; + border-bottom-color: transparent; +} + +.nav-pills > li > a { + padding-top: 8px; + padding-bottom: 8px; + margin-top: 2px; + margin-bottom: 2px; + -webkit-border-radius: 5px; + -moz-border-radius: 5px; + border-radius: 5px; +} + +.nav-pills > .active > a, +.nav-pills > .active > a:hover, +.nav-pills > .active > a:focus { + color: #ffffff; + background-color: #0088cc; +} + +.nav-stacked > li { + float: none; +} + +.nav-stacked > li > a { + margin-right: 0; +} + +.nav-tabs.nav-stacked { + border-bottom: 0; +} + +.nav-tabs.nav-stacked > li > a { + border: 1px solid #ddd; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +.nav-tabs.nav-stacked > li:first-child > a { + -webkit-border-top-right-radius: 4px; + border-top-right-radius: 4px; + -webkit-border-top-left-radius: 4px; + border-top-left-radius: 4px; + -moz-border-radius-topright: 4px; + -moz-border-radius-topleft: 4px; +} + +.nav-tabs.nav-stacked > li:last-child > a { + -webkit-border-bottom-right-radius: 4px; + border-bottom-right-radius: 4px; + -webkit-border-bottom-left-radius: 4px; + border-bottom-left-radius: 4px; + -moz-border-radius-bottomright: 4px; + -moz-border-radius-bottomleft: 4px; +} + +.nav-tabs.nav-stacked > li > a:hover, +.nav-tabs.nav-stacked > li > a:focus { + z-index: 2; + border-color: #ddd; +} + +.nav-pills.nav-stacked > li > a { + margin-bottom: 3px; +} + +.nav-pills.nav-stacked > li:last-child > a { + margin-bottom: 1px; +} + +.nav-tabs .dropdown-menu { + -webkit-border-radius: 0 0 6px 6px; + -moz-border-radius: 0 0 6px 6px; + border-radius: 0 0 6px 6px; +} + +.nav-pills .dropdown-menu { + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; +} + +.nav .dropdown-toggle .caret { + margin-top: 6px; + border-top-color: #0088cc; + border-bottom-color: #0088cc; +} + +.nav .dropdown-toggle:hover .caret, +.nav .dropdown-toggle:focus .caret { + border-top-color: #005580; + border-bottom-color: #005580; +} + +/* move down carets for tabs */ + +.nav-tabs .dropdown-toggle .caret { + margin-top: 8px; +} + +.nav .active .dropdown-toggle .caret { + border-top-color: #fff; + border-bottom-color: #fff; +} + +.nav-tabs .active .dropdown-toggle .caret { + border-top-color: #555555; + border-bottom-color: #555555; +} + +.nav > .dropdown.active > a:hover, +.nav > .dropdown.active > a:focus { + cursor: pointer; +} + +.nav-tabs .open .dropdown-toggle, +.nav-pills .open .dropdown-toggle, +.nav > li.dropdown.open.active > a:hover, +.nav > li.dropdown.open.active > a:focus { + color: #ffffff; + background-color: #999999; + border-color: #999999; +} + +.nav li.dropdown.open .caret, +.nav li.dropdown.open.active .caret, +.nav li.dropdown.open a:hover .caret, +.nav li.dropdown.open a:focus .caret { + border-top-color: #ffffff; + border-bottom-color: #ffffff; + opacity: 1; + filter: alpha(opacity=100); +} + +.tabs-stacked .open > a:hover, +.tabs-stacked .open > a:focus { + border-color: #999999; +} + +.tabbable { + *zoom: 1; +} + +.tabbable:before, +.tabbable:after { + display: table; + line-height: 0; + content: ""; +} + +.tabbable:after { + clear: both; +} + +.tab-content { + overflow: auto; +} + +.tabs-below > .nav-tabs, +.tabs-right > .nav-tabs, +.tabs-left > .nav-tabs { + border-bottom: 0; +} + +.tab-content > .tab-pane, +.pill-content > .pill-pane { + display: none; +} + +.tab-content > .active, +.pill-content > .active { + display: block; +} + +.tabs-below > .nav-tabs { + border-top: 1px solid #ddd; +} + +.tabs-below > .nav-tabs > li { + margin-top: -1px; + margin-bottom: 0; +} + +.tabs-below > .nav-tabs > li > a { + -webkit-border-radius: 0 0 4px 4px; + -moz-border-radius: 0 0 4px 4px; + border-radius: 0 0 4px 4px; +} + +.tabs-below > .nav-tabs > li > a:hover, +.tabs-below > .nav-tabs > li > a:focus { + border-top-color: #ddd; + border-bottom-color: transparent; +} + +.tabs-below > .nav-tabs > .active > a, +.tabs-below > .nav-tabs > .active > a:hover, +.tabs-below > .nav-tabs > .active > a:focus { + border-color: transparent #ddd #ddd #ddd; +} + +.tabs-left > .nav-tabs > li, +.tabs-right > .nav-tabs > li { + float: none; +} + +.tabs-left > .nav-tabs > li > a, +.tabs-right > .nav-tabs > li > a { + min-width: 74px; + margin-right: 0; + margin-bottom: 3px; +} + +.tabs-left > .nav-tabs { + float: left; + margin-right: 19px; + border-right: 1px solid #ddd; +} + +.tabs-left > .nav-tabs > li > a { + margin-right: -1px; + -webkit-border-radius: 4px 0 0 4px; + -moz-border-radius: 4px 0 0 4px; + border-radius: 4px 0 0 4px; +} + +.tabs-left > .nav-tabs > li > a:hover, +.tabs-left > .nav-tabs > li > a:focus { + border-color: #eeeeee #dddddd #eeeeee #eeeeee; +} + +.tabs-left > .nav-tabs .active > a, +.tabs-left > .nav-tabs .active > a:hover, +.tabs-left > .nav-tabs .active > a:focus { + border-color: #ddd transparent #ddd #ddd; + *border-right-color: #ffffff; +} + +.tabs-right > .nav-tabs { + float: right; + margin-left: 19px; + border-left: 1px solid #ddd; +} + +.tabs-right > .nav-tabs > li > a { + margin-left: -1px; + -webkit-border-radius: 0 4px 4px 0; + -moz-border-radius: 0 4px 4px 0; + border-radius: 0 4px 4px 0; +} + +.tabs-right > .nav-tabs > li > a:hover, +.tabs-right > .nav-tabs > li > a:focus { + border-color: #eeeeee #eeeeee #eeeeee #dddddd; +} + +.tabs-right > .nav-tabs .active > a, +.tabs-right > .nav-tabs .active > a:hover, +.tabs-right > .nav-tabs .active > a:focus { + border-color: #ddd #ddd #ddd transparent; + *border-left-color: #ffffff; +} + +.nav > .disabled > a { + color: #999999; +} + +.nav > .disabled > a:hover, +.nav > .disabled > a:focus { + text-decoration: none; + cursor: default; + background-color: transparent; +} + +.navbar { + *position: relative; + *z-index: 2; + margin-bottom: 20px; + overflow: visible; +} + +.navbar-inner { + min-height: 40px; + padding-right: 20px; + padding-left: 20px; + background-color: #fafafa; + background-image: -moz-linear-gradient(top, #ffffff, #f2f2f2); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#f2f2f2)); + background-image: -webkit-linear-gradient(top, #ffffff, #f2f2f2); + background-image: -o-linear-gradient(top, #ffffff, #f2f2f2); + background-image: linear-gradient(to bottom, #ffffff, #f2f2f2); + background-repeat: repeat-x; + border: 1px solid #d4d4d4; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff2f2f2', GradientType=0); + *zoom: 1; + -webkit-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065); + -moz-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065); + box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065); +} + +.navbar-inner:before, +.navbar-inner:after { + display: table; + line-height: 0; + content: ""; +} + +.navbar-inner:after { + clear: both; +} + +.navbar .container { + width: auto; +} + +.nav-collapse.collapse { + height: auto; + overflow: visible; +} + +.navbar .brand { + display: block; + float: left; + padding: 10px 20px 10px; + margin-left: -20px; + font-size: 20px; + font-weight: 200; + color: #777777; + text-shadow: 0 1px 0 #ffffff; +} + +.navbar .brand:hover, +.navbar .brand:focus { + text-decoration: none; +} + +.navbar-text { + margin-bottom: 0; + line-height: 40px; + color: #777777; +} + +.navbar-link { + color: #777777; +} + +.navbar-link:hover, +.navbar-link:focus { + color: #333333; +} + +.navbar .divider-vertical { + height: 40px; + margin: 0 9px; + border-right: 1px solid #ffffff; + border-left: 1px solid #f2f2f2; +} + +.navbar .btn, +.navbar .btn-group { + margin-top: 5px; +} + +.navbar .btn-group .btn, +.navbar .input-prepend .btn, +.navbar .input-append .btn, +.navbar .input-prepend .btn-group, +.navbar .input-append .btn-group { + margin-top: 0; +} + +.navbar-form { + margin-bottom: 0; + *zoom: 1; +} + +.navbar-form:before, +.navbar-form:after { + display: table; + line-height: 0; + content: ""; +} + +.navbar-form:after { + clear: both; +} + +.navbar-form input, +.navbar-form select, +.navbar-form .radio, +.navbar-form .checkbox { + margin-top: 5px; +} + +.navbar-form input, +.navbar-form select, +.navbar-form .btn { + display: inline-block; + margin-bottom: 0; +} + +.navbar-form input[type="image"], +.navbar-form input[type="checkbox"], +.navbar-form input[type="radio"] { + margin-top: 3px; +} + +.navbar-form .input-append, +.navbar-form .input-prepend { + margin-top: 5px; + white-space: nowrap; +} + +.navbar-form .input-append input, +.navbar-form .input-prepend input { + margin-top: 0; +} + +.navbar-search { + position: relative; + float: left; + margin-top: 5px; + margin-bottom: 0; +} + +.navbar-search .search-query { + padding: 4px 14px; + margin-bottom: 0; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 13px; + font-weight: normal; + line-height: 1; + -webkit-border-radius: 15px; + -moz-border-radius: 15px; + border-radius: 15px; +} + +.navbar-static-top { + position: static; + margin-bottom: 0; +} + +.navbar-static-top .navbar-inner { + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +.navbar-fixed-top, +.navbar-fixed-bottom { + position: fixed; + right: 0; + left: 0; + z-index: 1030; + margin-bottom: 0; +} + +.navbar-fixed-top .navbar-inner, +.navbar-static-top .navbar-inner { + border-width: 0 0 1px; +} + +.navbar-fixed-bottom .navbar-inner { + border-width: 1px 0 0; +} + +.navbar-fixed-top .navbar-inner, +.navbar-fixed-bottom .navbar-inner { + padding-right: 0; + padding-left: 0; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +.navbar-static-top .container, +.navbar-fixed-top .container, +.navbar-fixed-bottom .container { + width: 940px; +} + +.navbar-fixed-top { + top: 0; +} + +.navbar-fixed-top .navbar-inner, +.navbar-static-top .navbar-inner { + -webkit-box-shadow: 0 1px 10px rgba(0, 0, 0, 0.1); + -moz-box-shadow: 0 1px 10px rgba(0, 0, 0, 0.1); + box-shadow: 0 1px 10px rgba(0, 0, 0, 0.1); +} + +.navbar-fixed-bottom { + bottom: 0; +} + +.navbar-fixed-bottom .navbar-inner { + -webkit-box-shadow: 0 -1px 10px rgba(0, 0, 0, 0.1); + -moz-box-shadow: 0 -1px 10px rgba(0, 0, 0, 0.1); + box-shadow: 0 -1px 10px rgba(0, 0, 0, 0.1); +} + +.navbar .nav { + position: relative; + left: 0; + display: block; + float: left; + margin: 0 10px 0 0; +} + +.navbar .nav.pull-right { + float: right; + margin-right: 0; +} + +.navbar .nav > li { + float: left; +} + +.navbar .nav > li > a { + float: none; + padding: 10px 15px 10px; + color: #777777; + text-decoration: none; + text-shadow: 0 1px 0 #ffffff; +} + +.navbar .nav .dropdown-toggle .caret { + margin-top: 8px; +} + +.navbar .nav > li > a:focus, +.navbar .nav > li > a:hover { + color: #333333; + text-decoration: none; + background-color: transparent; +} + +.navbar .nav > .active > a, +.navbar .nav > .active > a:hover, +.navbar .nav > .active > a:focus { + color: #555555; + text-decoration: none; + background-color: #e5e5e5; + -webkit-box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125); + -moz-box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125); + box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125); +} + +.navbar .btn-navbar { + display: none; + float: right; + padding: 7px 10px; + margin-right: 5px; + margin-left: 5px; + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #ededed; + *background-color: #e5e5e5; + background-image: -moz-linear-gradient(top, #f2f2f2, #e5e5e5); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f2f2f2), to(#e5e5e5)); + background-image: -webkit-linear-gradient(top, #f2f2f2, #e5e5e5); + background-image: -o-linear-gradient(top, #f2f2f2, #e5e5e5); + background-image: linear-gradient(to bottom, #f2f2f2, #e5e5e5); + background-repeat: repeat-x; + border-color: #e5e5e5 #e5e5e5 #bfbfbf; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2f2f2', endColorstr='#ffe5e5e5', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075); + -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075); +} + +.navbar .btn-navbar:hover, +.navbar .btn-navbar:focus, +.navbar .btn-navbar:active, +.navbar .btn-navbar.active, +.navbar .btn-navbar.disabled, +.navbar .btn-navbar[disabled] { + color: #ffffff; + background-color: #e5e5e5; + *background-color: #d9d9d9; +} + +.navbar .btn-navbar:active, +.navbar .btn-navbar.active { + background-color: #cccccc \9; +} + +.navbar .btn-navbar .icon-bar { + display: block; + width: 18px; + height: 2px; + background-color: #f5f5f5; + -webkit-border-radius: 1px; + -moz-border-radius: 1px; + border-radius: 1px; + -webkit-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25); + -moz-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25); + box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25); +} + +.btn-navbar .icon-bar + .icon-bar { + margin-top: 3px; +} + +.navbar .nav > li > .dropdown-menu:before { + position: absolute; + top: -7px; + left: 9px; + display: inline-block; + border-right: 7px solid transparent; + border-bottom: 7px solid #ccc; + border-left: 7px solid transparent; + border-bottom-color: rgba(0, 0, 0, 0.2); + content: ''; +} + +.navbar .nav > li > .dropdown-menu:after { + position: absolute; + top: -6px; + left: 10px; + display: inline-block; + border-right: 6px solid transparent; + border-bottom: 6px solid #ffffff; + border-left: 6px solid transparent; + content: ''; +} + +.navbar-fixed-bottom .nav > li > .dropdown-menu:before { + top: auto; + bottom: -7px; + border-top: 7px solid #ccc; + border-bottom: 0; + border-top-color: rgba(0, 0, 0, 0.2); +} + +.navbar-fixed-bottom .nav > li > .dropdown-menu:after { + top: auto; + bottom: -6px; + border-top: 6px solid #ffffff; + border-bottom: 0; +} + +.navbar .nav li.dropdown > a:hover .caret, +.navbar .nav li.dropdown > a:focus .caret { + border-top-color: #333333; + border-bottom-color: #333333; +} + +.navbar .nav li.dropdown.open > .dropdown-toggle, +.navbar .nav li.dropdown.active > .dropdown-toggle, +.navbar .nav li.dropdown.open.active > .dropdown-toggle { + color: #555555; + background-color: #e5e5e5; +} + +.navbar .nav li.dropdown > .dropdown-toggle .caret { + border-top-color: #777777; + border-bottom-color: #777777; +} + +.navbar .nav li.dropdown.open > .dropdown-toggle .caret, +.navbar .nav li.dropdown.active > .dropdown-toggle .caret, +.navbar .nav li.dropdown.open.active > .dropdown-toggle .caret { + border-top-color: #555555; + border-bottom-color: #555555; +} + +.navbar .pull-right > li > .dropdown-menu, +.navbar .nav > li > .dropdown-menu.pull-right { + right: 0; + left: auto; +} + +.navbar .pull-right > li > .dropdown-menu:before, +.navbar .nav > li > .dropdown-menu.pull-right:before { + right: 12px; + left: auto; +} + +.navbar .pull-right > li > .dropdown-menu:after, +.navbar .nav > li > .dropdown-menu.pull-right:after { + right: 13px; + left: auto; +} + +.navbar .pull-right > li > .dropdown-menu .dropdown-menu, +.navbar .nav > li > .dropdown-menu.pull-right .dropdown-menu { + right: 100%; + left: auto; + margin-right: -1px; + margin-left: 0; + -webkit-border-radius: 6px 0 6px 6px; + -moz-border-radius: 6px 0 6px 6px; + border-radius: 6px 0 6px 6px; +} + +.navbar-inverse .navbar-inner { + background-color: #1b1b1b; + background-image: -moz-linear-gradient(top, #222222, #111111); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#222222), to(#111111)); + background-image: -webkit-linear-gradient(top, #222222, #111111); + background-image: -o-linear-gradient(top, #222222, #111111); + background-image: linear-gradient(to bottom, #222222, #111111); + background-repeat: repeat-x; + border-color: #252525; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff222222', endColorstr='#ff111111', GradientType=0); +} + +.navbar-inverse .brand, +.navbar-inverse .nav > li > a { + color: #999999; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); +} + +.navbar-inverse .brand:hover, +.navbar-inverse .nav > li > a:hover, +.navbar-inverse .brand:focus, +.navbar-inverse .nav > li > a:focus { + color: #ffffff; +} + +.navbar-inverse .brand { + color: #999999; +} + +.navbar-inverse .navbar-text { + color: #999999; +} + +.navbar-inverse .nav > li > a:focus, +.navbar-inverse .nav > li > a:hover { + color: #ffffff; + background-color: transparent; +} + +.navbar-inverse .nav .active > a, +.navbar-inverse .nav .active > a:hover, +.navbar-inverse .nav .active > a:focus { + color: #ffffff; + background-color: #111111; +} + +.navbar-inverse .navbar-link { + color: #999999; +} + +.navbar-inverse .navbar-link:hover, +.navbar-inverse .navbar-link:focus { + color: #ffffff; +} + +.navbar-inverse .divider-vertical { + border-right-color: #222222; + border-left-color: #111111; +} + +.navbar-inverse .nav li.dropdown.open > .dropdown-toggle, +.navbar-inverse .nav li.dropdown.active > .dropdown-toggle, +.navbar-inverse .nav li.dropdown.open.active > .dropdown-toggle { + color: #ffffff; + background-color: #111111; +} + +.navbar-inverse .nav li.dropdown > a:hover .caret, +.navbar-inverse .nav li.dropdown > a:focus .caret { + border-top-color: #ffffff; + border-bottom-color: #ffffff; +} + +.navbar-inverse .nav li.dropdown > .dropdown-toggle .caret { + border-top-color: #999999; + border-bottom-color: #999999; +} + +.navbar-inverse .nav li.dropdown.open > .dropdown-toggle .caret, +.navbar-inverse .nav li.dropdown.active > .dropdown-toggle .caret, +.navbar-inverse .nav li.dropdown.open.active > .dropdown-toggle .caret { + border-top-color: #ffffff; + border-bottom-color: #ffffff; +} + +.navbar-inverse .navbar-search .search-query { + color: #ffffff; + background-color: #515151; + border-color: #111111; + -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0 rgba(255, 255, 255, 0.15); + -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0 rgba(255, 255, 255, 0.15); + box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0 rgba(255, 255, 255, 0.15); + -webkit-transition: none; + -moz-transition: none; + -o-transition: none; + transition: none; +} + +.navbar-inverse .navbar-search .search-query:-moz-placeholder { + color: #cccccc; +} + +.navbar-inverse .navbar-search .search-query:-ms-input-placeholder { + color: #cccccc; +} + +.navbar-inverse .navbar-search .search-query::-webkit-input-placeholder { + color: #cccccc; +} + +.navbar-inverse .navbar-search .search-query:focus, +.navbar-inverse .navbar-search .search-query.focused { + padding: 5px 15px; + color: #333333; + text-shadow: 0 1px 0 #ffffff; + background-color: #ffffff; + border: 0; + outline: 0; + -webkit-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15); + -moz-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15); + box-shadow: 0 0 3px rgba(0, 0, 0, 0.15); +} + +.navbar-inverse .btn-navbar { + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #0e0e0e; + *background-color: #040404; + background-image: -moz-linear-gradient(top, #151515, #040404); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#151515), to(#040404)); + background-image: -webkit-linear-gradient(top, #151515, #040404); + background-image: -o-linear-gradient(top, #151515, #040404); + background-image: linear-gradient(to bottom, #151515, #040404); + background-repeat: repeat-x; + border-color: #040404 #040404 #000000; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff151515', endColorstr='#ff040404', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); +} + +.navbar-inverse .btn-navbar:hover, +.navbar-inverse .btn-navbar:focus, +.navbar-inverse .btn-navbar:active, +.navbar-inverse .btn-navbar.active, +.navbar-inverse .btn-navbar.disabled, +.navbar-inverse .btn-navbar[disabled] { + color: #ffffff; + background-color: #040404; + *background-color: #000000; +} + +.navbar-inverse .btn-navbar:active, +.navbar-inverse .btn-navbar.active { + background-color: #000000 \9; +} + +.breadcrumb { + padding: 8px 15px; + margin: 0 0 20px; + list-style: none; + background-color: #f5f5f5; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +.breadcrumb > li { + display: inline-block; + *display: inline; + text-shadow: 0 1px 0 #ffffff; + *zoom: 1; +} + +.breadcrumb > li > .divider { + padding: 0 5px; + color: #ccc; +} + +.breadcrumb > .active { + color: #999999; +} + +.pagination { + margin: 20px 0; +} + +.pagination ul { + display: inline-block; + *display: inline; + margin-bottom: 0; + margin-left: 0; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + *zoom: 1; + -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); + -moz-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); + box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); +} + +.pagination ul > li { + display: inline; +} + +.pagination ul > li > a, +.pagination ul > li > span { + float: left; + padding: 4px 12px; + line-height: 20px; + text-decoration: none; + background-color: #ffffff; + border: 1px solid #dddddd; + border-left-width: 0; +} + +.pagination ul > li > a:hover, +.pagination ul > li > a:focus, +.pagination ul > .active > a, +.pagination ul > .active > span { + background-color: #f5f5f5; +} + +.pagination ul > .active > a, +.pagination ul > .active > span { + color: #999999; + cursor: default; +} + +.pagination ul > .disabled > span, +.pagination ul > .disabled > a, +.pagination ul > .disabled > a:hover, +.pagination ul > .disabled > a:focus { + color: #999999; + cursor: default; + background-color: transparent; +} + +.pagination ul > li:first-child > a, +.pagination ul > li:first-child > span { + border-left-width: 1px; + -webkit-border-bottom-left-radius: 4px; + border-bottom-left-radius: 4px; + -webkit-border-top-left-radius: 4px; + border-top-left-radius: 4px; + -moz-border-radius-bottomleft: 4px; + -moz-border-radius-topleft: 4px; +} + +.pagination ul > li:last-child > a, +.pagination ul > li:last-child > span { + -webkit-border-top-right-radius: 4px; + border-top-right-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + border-bottom-right-radius: 4px; + -moz-border-radius-topright: 4px; + -moz-border-radius-bottomright: 4px; +} + +.pagination-centered { + text-align: center; +} + +.pagination-right { + text-align: right; +} + +.pagination-large ul > li > a, +.pagination-large ul > li > span { + padding: 11px 19px; + font-size: 17.5px; +} + +.pagination-large ul > li:first-child > a, +.pagination-large ul > li:first-child > span { + -webkit-border-bottom-left-radius: 6px; + border-bottom-left-radius: 6px; + -webkit-border-top-left-radius: 6px; + border-top-left-radius: 6px; + -moz-border-radius-bottomleft: 6px; + -moz-border-radius-topleft: 6px; +} + +.pagination-large ul > li:last-child > a, +.pagination-large ul > li:last-child > span { + -webkit-border-top-right-radius: 6px; + border-top-right-radius: 6px; + -webkit-border-bottom-right-radius: 6px; + border-bottom-right-radius: 6px; + -moz-border-radius-topright: 6px; + -moz-border-radius-bottomright: 6px; +} + +.pagination-mini ul > li:first-child > a, +.pagination-small ul > li:first-child > a, +.pagination-mini ul > li:first-child > span, +.pagination-small ul > li:first-child > span { + -webkit-border-bottom-left-radius: 3px; + border-bottom-left-radius: 3px; + -webkit-border-top-left-radius: 3px; + border-top-left-radius: 3px; + -moz-border-radius-bottomleft: 3px; + -moz-border-radius-topleft: 3px; +} + +.pagination-mini ul > li:last-child > a, +.pagination-small ul > li:last-child > a, +.pagination-mini ul > li:last-child > span, +.pagination-small ul > li:last-child > span { + -webkit-border-top-right-radius: 3px; + border-top-right-radius: 3px; + -webkit-border-bottom-right-radius: 3px; + border-bottom-right-radius: 3px; + -moz-border-radius-topright: 3px; + -moz-border-radius-bottomright: 3px; +} + +.pagination-small ul > li > a, +.pagination-small ul > li > span { + padding: 2px 10px; + font-size: 11.9px; +} + +.pagination-mini ul > li > a, +.pagination-mini ul > li > span { + padding: 0 6px; + font-size: 10.5px; +} + +.pager { + margin: 20px 0; + text-align: center; + list-style: none; + *zoom: 1; +} + +.pager:before, +.pager:after { + display: table; + line-height: 0; + content: ""; +} + +.pager:after { + clear: both; +} + +.pager li { + display: inline; +} + +.pager li > a, +.pager li > span { + display: inline-block; + padding: 5px 14px; + background-color: #fff; + border: 1px solid #ddd; + -webkit-border-radius: 15px; + -moz-border-radius: 15px; + border-radius: 15px; +} + +.pager li > a:hover, +.pager li > a:focus { + text-decoration: none; + background-color: #f5f5f5; +} + +.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; + cursor: default; + background-color: #fff; +} + +.modal-backdrop { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1040; + background-color: #000000; +} + +.modal-backdrop.fade { + opacity: 0; +} + +.modal-backdrop, +.modal-backdrop.fade.in { + opacity: 0.8; + filter: alpha(opacity=80); +} + +.modal { + position: fixed; + top: 10%; + left: 50%; + z-index: 1050; + width: 560px; + margin-left: -280px; + background-color: #ffffff; + border: 1px solid #999; + border: 1px solid rgba(0, 0, 0, 0.3); + *border: 1px solid #999; + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; + outline: none; + -webkit-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); + -moz-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); + box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); + -webkit-background-clip: padding-box; + -moz-background-clip: padding-box; + background-clip: padding-box; +} + +.modal.fade { + top: -25%; + -webkit-transition: opacity 0.3s linear, top 0.3s ease-out; + -moz-transition: opacity 0.3s linear, top 0.3s ease-out; + -o-transition: opacity 0.3s linear, top 0.3s ease-out; + transition: opacity 0.3s linear, top 0.3s ease-out; +} + +.modal.fade.in { + top: 10%; +} + +.modal-header { + padding: 9px 15px; + border-bottom: 1px solid #eee; +} + +.modal-header .close { + margin-top: 2px; +} + +.modal-header h3 { + margin: 0; + line-height: 30px; +} + +.modal-body { + position: relative; + max-height: 400px; + padding: 15px; + overflow-y: auto; +} + +.modal-form { + margin-bottom: 0; +} + +.modal-footer { + padding: 14px 15px 15px; + margin-bottom: 0; + text-align: right; + background-color: #f5f5f5; + border-top: 1px solid #ddd; + -webkit-border-radius: 0 0 6px 6px; + -moz-border-radius: 0 0 6px 6px; + border-radius: 0 0 6px 6px; + *zoom: 1; + -webkit-box-shadow: inset 0 1px 0 #ffffff; + -moz-box-shadow: inset 0 1px 0 #ffffff; + box-shadow: inset 0 1px 0 #ffffff; +} + +.modal-footer:before, +.modal-footer:after { + display: table; + line-height: 0; + 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; +} + +.tooltip { + position: absolute; + z-index: 1030; + display: block; + font-size: 11px; + line-height: 1.4; + opacity: 0; + filter: alpha(opacity=0); + visibility: visible; +} + +.tooltip.in { + opacity: 0.8; + filter: alpha(opacity=80); +} + +.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: 8px; + color: #ffffff; + text-align: center; + text-decoration: none; + background-color: #000000; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +.tooltip-arrow { + position: absolute; + width: 0; + height: 0; + 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; +} + +.tooltip.right .tooltip-arrow { + top: 50%; + left: 0; + margin-top: -5px; + border-right-color: #000000; + border-width: 5px 5px 5px 0; +} + +.tooltip.left .tooltip-arrow { + top: 50%; + right: 0; + margin-top: -5px; + border-left-color: #000000; + border-width: 5px 0 5px 5px; +} + +.tooltip.bottom .tooltip-arrow { + top: 0; + left: 50%; + margin-left: -5px; + border-bottom-color: #000000; + border-width: 0 5px 5px; +} + +.popover { + position: absolute; + top: 0; + left: 0; + z-index: 1010; + display: none; + max-width: 276px; + padding: 1px; + text-align: left; + white-space: normal; + background-color: #ffffff; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, 0.2); + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; + -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + -webkit-background-clip: padding-box; + -moz-background-clip: padding; + background-clip: padding-box; +} + +.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; + -webkit-border-radius: 5px 5px 0 0; + -moz-border-radius: 5px 5px 0 0; + border-radius: 5px 5px 0 0; +} + +.popover-title:empty { + display: none; +} + +.popover-content { + padding: 9px 14px; +} + +.popover .arrow, +.popover .arrow:after { + position: absolute; + display: block; + width: 0; + height: 0; + border-color: transparent; + border-style: solid; +} + +.popover .arrow { + border-width: 11px; +} + +.popover .arrow:after { + border-width: 10px; + content: ""; +} + +.popover.top .arrow { + bottom: -11px; + left: 50%; + margin-left: -11px; + border-top-color: #999; + border-top-color: rgba(0, 0, 0, 0.25); + border-bottom-width: 0; +} + +.popover.top .arrow:after { + bottom: 1px; + margin-left: -10px; + border-top-color: #ffffff; + border-bottom-width: 0; +} + +.popover.right .arrow { + top: 50%; + left: -11px; + margin-top: -11px; + border-right-color: #999; + border-right-color: rgba(0, 0, 0, 0.25); + border-left-width: 0; +} + +.popover.right .arrow:after { + bottom: -10px; + left: 1px; + border-right-color: #ffffff; + border-left-width: 0; +} + +.popover.bottom .arrow { + top: -11px; + left: 50%; + margin-left: -11px; + border-bottom-color: #999; + border-bottom-color: rgba(0, 0, 0, 0.25); + border-top-width: 0; +} + +.popover.bottom .arrow:after { + top: 1px; + margin-left: -10px; + border-bottom-color: #ffffff; + border-top-width: 0; +} + +.popover.left .arrow { + top: 50%; + right: -11px; + margin-top: -11px; + border-left-color: #999; + border-left-color: rgba(0, 0, 0, 0.25); + border-right-width: 0; +} + +.popover.left .arrow:after { + right: 1px; + bottom: -10px; + border-left-color: #ffffff; + border-right-width: 0; +} + +.thumbnails { + margin-left: -20px; + list-style: none; + *zoom: 1; +} + +.thumbnails:before, +.thumbnails:after { + display: table; + line-height: 0; + content: ""; +} + +.thumbnails:after { + clear: both; +} + +.row-fluid .thumbnails { + margin-left: 0; +} + +.thumbnails > li { + float: left; + margin-bottom: 20px; + margin-left: 20px; +} + +.thumbnail { + display: block; + padding: 4px; + line-height: 20px; + border: 1px solid #ddd; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055); + -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055); + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055); + -webkit-transition: all 0.2s ease-in-out; + -moz-transition: all 0.2s ease-in-out; + -o-transition: all 0.2s ease-in-out; + transition: all 0.2s ease-in-out; +} + +a.thumbnail:hover, +a.thumbnail:focus { + border-color: #0088cc; + -webkit-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25); + -moz-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25); + box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25); +} + +.thumbnail > img { + display: block; + max-width: 100%; + margin-right: auto; + margin-left: auto; +} + +.thumbnail .caption { + padding: 9px; + color: #555555; +} + +.media, +.media-body { + overflow: hidden; + *overflow: visible; + zoom: 1; +} + +.media, +.media .media { + margin-top: 15px; +} + +.media:first-child { + margin-top: 0; +} + +.media-object { + display: block; +} + +.media-heading { + margin: 0 0 5px; +} + +.media > .pull-left { + margin-right: 10px; +} + +.media > .pull-right { + margin-left: 10px; +} + +.media-list { + margin-left: 0; + list-style: none; +} + +.label, +.badge { + display: inline-block; + padding: 2px 4px; + font-size: 11.844px; + font-weight: bold; + line-height: 14px; + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + white-space: nowrap; + vertical-align: baseline; + background-color: #999999; +} + +.label { + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; +} + +.badge { + padding-right: 9px; + padding-left: 9px; + -webkit-border-radius: 9px; + -moz-border-radius: 9px; + border-radius: 9px; +} + +.label:empty, +.badge:empty { + display: none; +} + +a.label:hover, +a.label:focus, +a.badge:hover, +a.badge:focus { + color: #ffffff; + text-decoration: none; + cursor: pointer; +} + +.label-important, +.badge-important { + background-color: #b94a48; +} + +.label-important[href], +.badge-important[href] { + background-color: #953b39; +} + +.label-warning, +.badge-warning { + background-color: #f89406; +} + +.label-warning[href], +.badge-warning[href] { + background-color: #c67605; +} + +.label-success, +.badge-success { + background-color: #468847; +} + +.label-success[href], +.badge-success[href] { + background-color: #356635; +} + +.label-info, +.badge-info { + background-color: #3a87ad; +} + +.label-info[href], +.badge-info[href] { + background-color: #2d6987; +} + +.label-inverse, +.badge-inverse { + background-color: #333333; +} + +.label-inverse[href], +.badge-inverse[href] { + background-color: #1a1a1a; +} + +.btn .label, +.btn .badge { + position: relative; + top: -1px; +} + +.btn-mini .label, +.btn-mini .badge { + top: 0; +} + +@-webkit-keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} + +@-moz-keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} + +@-ms-keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + 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; + } + to { + background-position: 0 0; + } +} + +.progress { + height: 20px; + margin-bottom: 20px; + overflow: hidden; + background-color: #f7f7f7; + background-image: -moz-linear-gradient(top, #f5f5f5, #f9f9f9); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f5f5f5), to(#f9f9f9)); + background-image: -webkit-linear-gradient(top, #f5f5f5, #f9f9f9); + background-image: -o-linear-gradient(top, #f5f5f5, #f9f9f9); + background-image: linear-gradient(to bottom, #f5f5f5, #f9f9f9); + background-repeat: repeat-x; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#fff9f9f9', GradientType=0); + -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); + -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); + box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); +} + +.progress .bar { + float: left; + width: 0; + height: 100%; + font-size: 12px; + color: #ffffff; + text-align: center; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #0e90d2; + background-image: -moz-linear-gradient(top, #149bdf, #0480be); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#149bdf), to(#0480be)); + background-image: -webkit-linear-gradient(top, #149bdf, #0480be); + background-image: -o-linear-gradient(top, #149bdf, #0480be); + background-image: linear-gradient(to bottom, #149bdf, #0480be); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff149bdf', endColorstr='#ff0480be', GradientType=0); + -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); + -moz-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-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + -webkit-transition: width 0.6s ease; + -moz-transition: width 0.6s ease; + -o-transition: width 0.6s ease; + transition: width 0.6s ease; +} + +.progress .bar + .bar { + -webkit-box-shadow: inset 1px 0 0 rgba(0, 0, 0, 0.15), inset 0 -1px 0 rgba(0, 0, 0, 0.15); + -moz-box-shadow: inset 1px 0 0 rgba(0, 0, 0, 0.15), inset 0 -1px 0 rgba(0, 0, 0, 0.15); + box-shadow: inset 1px 0 0 rgba(0, 0, 0, 0.15), inset 0 -1px 0 rgba(0, 0, 0, 0.15); +} + +.progress-striped .bar { + background-color: #149bdf; + 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: -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); + 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); + -webkit-background-size: 40px 40px; + -moz-background-size: 40px 40px; + -o-background-size: 40px 40px; + background-size: 40px 40px; +} + +.progress.active .bar { + -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-danger .bar, +.progress .bar-danger { + background-color: #dd514c; + background-image: -moz-linear-gradient(top, #ee5f5b, #c43c35); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#c43c35)); + background-image: -webkit-linear-gradient(top, #ee5f5b, #c43c35); + background-image: -o-linear-gradient(top, #ee5f5b, #c43c35); + background-image: linear-gradient(to bottom, #ee5f5b, #c43c35); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b', endColorstr='#ffc43c35', GradientType=0); +} + +.progress-danger.progress-striped .bar, +.progress-striped .bar-danger { + background-color: #ee5f5b; + 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: -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); + 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); +} + +.progress-success .bar, +.progress .bar-success { + background-color: #5eb95e; + background-image: -moz-linear-gradient(top, #62c462, #57a957); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#57a957)); + background-image: -webkit-linear-gradient(top, #62c462, #57a957); + background-image: -o-linear-gradient(top, #62c462, #57a957); + background-image: linear-gradient(to bottom, #62c462, #57a957); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462', endColorstr='#ff57a957', GradientType=0); +} + +.progress-success.progress-striped .bar, +.progress-striped .bar-success { + background-color: #62c462; + 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: -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); + 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); +} + +.progress-info .bar, +.progress .bar-info { + background-color: #4bb1cf; + background-image: -moz-linear-gradient(top, #5bc0de, #339bb9); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#339bb9)); + background-image: -webkit-linear-gradient(top, #5bc0de, #339bb9); + background-image: -o-linear-gradient(top, #5bc0de, #339bb9); + background-image: linear-gradient(to bottom, #5bc0de, #339bb9); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff339bb9', GradientType=0); +} + +.progress-info.progress-striped .bar, +.progress-striped .bar-info { + background-color: #5bc0de; + 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: -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); + 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); +} + +.progress-warning .bar, +.progress .bar-warning { + background-color: #faa732; + background-image: -moz-linear-gradient(top, #fbb450, #f89406); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406)); + background-image: -webkit-linear-gradient(top, #fbb450, #f89406); + background-image: -o-linear-gradient(top, #fbb450, #f89406); + background-image: linear-gradient(to bottom, #fbb450, #f89406); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450', endColorstr='#fff89406', GradientType=0); +} + +.progress-warning.progress-striped .bar, +.progress-striped .bar-warning { + background-color: #fbb450; + 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: -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); + 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); +} + +.accordion { + margin-bottom: 20px; +} + +.accordion-group { + margin-bottom: 2px; + border: 1px solid #e5e5e5; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +.accordion-heading { + border-bottom: 0; +} + +.accordion-heading .accordion-toggle { + display: block; + padding: 8px 15px; +} + +.accordion-toggle { + cursor: pointer; +} + +.accordion-inner { + padding: 9px 15px; + border-top: 1px solid #e5e5e5; +} + +.carousel { + position: relative; + margin-bottom: 20px; + line-height: 1; +} + +.carousel-inner { + position: relative; + width: 100%; + overflow: hidden; +} + +.carousel-inner > .item { + position: relative; + display: none; + -webkit-transition: 0.6s ease-in-out left; + -moz-transition: 0.6s ease-in-out left; + -o-transition: 0.6s ease-in-out left; + transition: 0.6s ease-in-out left; +} + +.carousel-inner > .item > img, +.carousel-inner > .item > a > img { + display: block; + line-height: 1; +} + +.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: 40%; + left: 15px; + width: 40px; + height: 40px; + margin-top: -20px; + font-size: 60px; + font-weight: 100; + line-height: 30px; + color: #ffffff; + text-align: center; + background: #222222; + border: 3px solid #ffffff; + -webkit-border-radius: 23px; + -moz-border-radius: 23px; + border-radius: 23px; + opacity: 0.5; + filter: alpha(opacity=50); +} + +.carousel-control.right { + right: 15px; + left: auto; +} + +.carousel-control:hover, +.carousel-control:focus { + color: #ffffff; + text-decoration: none; + opacity: 0.9; + filter: alpha(opacity=90); +} + +.carousel-indicators { + position: absolute; + top: 15px; + right: 15px; + z-index: 5; + margin: 0; + list-style: none; +} + +.carousel-indicators li { + display: block; + float: left; + width: 10px; + height: 10px; + margin-left: 5px; + text-indent: -999px; + background-color: #ccc; + background-color: rgba(255, 255, 255, 0.25); + border-radius: 5px; +} + +.carousel-indicators .active { + background-color: #fff; +} + +.carousel-caption { + position: absolute; + right: 0; + bottom: 0; + left: 0; + padding: 15px; + background: #333333; + background: rgba(0, 0, 0, 0.75); +} + +.carousel-caption h4, +.carousel-caption p { + line-height: 20px; + color: #ffffff; +} + +.carousel-caption h4 { + margin: 0 0 5px; +} + +.carousel-caption p { + margin-bottom: 0; +} + +.hero-unit { + padding: 60px; + padding-top: 20px; + margin-bottom: 30px; + font-size: 18px; + font-weight: 200; + line-height: 30px; + color: inherit; + background-color: #eeeeee; + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; +} + +.hero-unit h1 { + margin-bottom: 0; + font-size: 60px; + line-height: 1; + letter-spacing: -1px; + color: inherit; +} + +.hero-unit li { + line-height: 30px; +} + +.pull-right { + float: right; +} + +.pull-left { + float: left; +} + +.hide { + display: none; +} + +.show { + display: block; +} + +.invisible { + visibility: hidden; +} + +.affix { + position: fixed; +} + + +.title { + border-bottom: 1px solid #E1E2E1; +} + +.module-list { + border-right: 1px solid #E1E1E2; + float: left; + height: 220px; + margin: 20px 0 0 20px; + padding: 10px; + position: relative; + width: 300px; +} diff --git a/tbc/static/css/responsive.css b/tbc/static/css/responsive.css new file mode 100755 index 0000000..c0bba15 --- /dev/null +++ b/tbc/static/css/responsive.css @@ -0,0 +1,1109 @@ +/*! + * Bootstrap Responsive v2.3.2 + * + * 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. + */ + +.clearfix { + *zoom: 1; +} + +.clearfix:before, +.clearfix:after { + display: table; + line-height: 0; + content: ""; +} + +.clearfix:after { + clear: both; +} + +.hide-text { + font: 0/0 a; + color: transparent; + text-shadow: none; + background-color: transparent; + border: 0; +} + +.input-block-level { + display: block; + width: 100%; + min-height: 30px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +@-ms-viewport { + width: device-width; +} + +.hidden { + display: none; + visibility: hidden; +} + +.visible-phone { + display: none !important; +} + +.visible-tablet { + display: none !important; +} + +.hidden-desktop { + display: none !important; +} + +.visible-desktop { + display: inherit !important; +} + +@media (min-width: 768px) and (max-width: 979px) { + .hidden-desktop { + display: inherit !important; + } + .visible-desktop { + display: none !important ; + } + .visible-tablet { + display: inherit !important; + } + .hidden-tablet { + display: none !important; + } +} + +@media (max-width: 767px) { + .hidden-desktop { + display: inherit !important; + } + .visible-desktop { + display: none !important; + } + .visible-phone { + display: inherit !important; + } + .hidden-phone { + display: none !important; + } +} + +.visible-print { + display: none !important; +} + +@media print { + .visible-print { + display: inherit !important; + } + .hidden-print { + display: none !important; + } +} + +@media (min-width: 1200px) { + .row { + margin-left: -30px; + *zoom: 1; + } + .row:before, + .row:after { + display: table; + line-height: 0; + content: ""; + } + .row:after { + clear: both; + } + [class*="span"] { + float: left; + min-height: 1px; + margin-left: 30px; + } + .container, + .navbar-static-top .container, + .navbar-fixed-top .container, + .navbar-fixed-bottom .container { + width: 1170px; + } + .span12 { + width: 1170px; + } + .span11 { + width: 1070px; + } + .span10 { + width: 970px; + } + .span9 { + width: 870px; + } + .span8 { + width: 770px; + } + .span7 { + width: 670px; + } + .span6 { + width: 570px; + } + .span5 { + width: 470px; + } + .span4 { + width: 370px; + } + .span3 { + width: 270px; + } + .span2 { + width: 170px; + } + .span1 { + width: 70px; + } + .offset12 { + margin-left: 1230px; + } + .offset11 { + margin-left: 1130px; + } + .offset10 { + margin-left: 1030px; + } + .offset9 { + margin-left: 930px; + } + .offset8 { + margin-left: 830px; + } + .offset7 { + margin-left: 730px; + } + .offset6 { + margin-left: 630px; + } + .offset5 { + margin-left: 530px; + } + .offset4 { + margin-left: 430px; + } + .offset3 { + margin-left: 330px; + } + .offset2 { + margin-left: 230px; + } + .offset1 { + margin-left: 130px; + } + .row-fluid { + width: 100%; + *zoom: 1; + } + .row-fluid:before, + .row-fluid:after { + display: table; + line-height: 0; + content: ""; + } + .row-fluid:after { + clear: both; + } + .row-fluid [class*="span"] { + display: block; + float: left; + width: 100%; + min-height: 30px; + margin-left: 2.564102564102564%; + *margin-left: 2.5109110747408616%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + .row-fluid [class*="span"]:first-child { + margin-left: 0; + } + .row-fluid .controls-row [class*="span"] + [class*="span"] { + margin-left: 2.564102564102564%; + } + .row-fluid .span12 { + width: 100%; + *width: 99.94680851063829%; + } + .row-fluid .span11 { + width: 91.45299145299145%; + *width: 91.39979996362975%; + } + .row-fluid .span10 { + width: 82.90598290598291%; + *width: 82.8527914166212%; + } + .row-fluid .span9 { + width: 74.35897435897436%; + *width: 74.30578286961266%; + } + .row-fluid .span8 { + width: 65.81196581196582%; + *width: 65.75877432260411%; + } + .row-fluid .span7 { + width: 57.26495726495726%; + *width: 57.21176577559556%; + } + .row-fluid .span6 { + width: 48.717948717948715%; + *width: 48.664757228587014%; + } + .row-fluid .span5 { + width: 40.17094017094017%; + *width: 40.11774868157847%; + } + .row-fluid .span4 { + width: 31.623931623931625%; + *width: 31.570740134569924%; + } + .row-fluid .span3 { + width: 23.076923076923077%; + *width: 23.023731587561375%; + } + .row-fluid .span2 { + width: 14.52991452991453%; + *width: 14.476723040552828%; + } + .row-fluid .span1 { + width: 5.982905982905983%; + *width: 5.929714493544281%; + } + .row-fluid .offset12 { + margin-left: 105.12820512820512%; + *margin-left: 105.02182214948171%; + } + .row-fluid .offset12:first-child { + margin-left: 102.56410256410257%; + *margin-left: 102.45771958537915%; + } + .row-fluid .offset11 { + margin-left: 96.58119658119658%; + *margin-left: 96.47481360247316%; + } + .row-fluid .offset11:first-child { + margin-left: 94.01709401709402%; + *margin-left: 93.91071103837061%; + } + .row-fluid .offset10 { + margin-left: 88.03418803418803%; + *margin-left: 87.92780505546462%; + } + .row-fluid .offset10:first-child { + margin-left: 85.47008547008548%; + *margin-left: 85.36370249136206%; + } + .row-fluid .offset9 { + margin-left: 79.48717948717949%; + *margin-left: 79.38079650845607%; + } + .row-fluid .offset9:first-child { + margin-left: 76.92307692307693%; + *margin-left: 76.81669394435352%; + } + .row-fluid .offset8 { + margin-left: 70.94017094017094%; + *margin-left: 70.83378796144753%; + } + .row-fluid .offset8:first-child { + margin-left: 68.37606837606839%; + *margin-left: 68.26968539734497%; + } + .row-fluid .offset7 { + margin-left: 62.393162393162385%; + *margin-left: 62.28677941443899%; + } + .row-fluid .offset7:first-child { + margin-left: 59.82905982905982%; + *margin-left: 59.72267685033642%; + } + .row-fluid .offset6 { + margin-left: 53.84615384615384%; + *margin-left: 53.739770867430444%; + } + .row-fluid .offset6:first-child { + margin-left: 51.28205128205128%; + *margin-left: 51.175668303327875%; + } + .row-fluid .offset5 { + margin-left: 45.299145299145295%; + *margin-left: 45.1927623204219%; + } + .row-fluid .offset5:first-child { + margin-left: 42.73504273504273%; + *margin-left: 42.62865975631933%; + } + .row-fluid .offset4 { + margin-left: 36.75213675213675%; + *margin-left: 36.645753773413354%; + } + .row-fluid .offset4:first-child { + margin-left: 34.18803418803419%; + *margin-left: 34.081651209310785%; + } + .row-fluid .offset3 { + margin-left: 28.205128205128204%; + *margin-left: 28.0987452264048%; + } + .row-fluid .offset3:first-child { + margin-left: 25.641025641025642%; + *margin-left: 25.53464266230224%; + } + .row-fluid .offset2 { + margin-left: 19.65811965811966%; + *margin-left: 19.551736679396257%; + } + .row-fluid .offset2:first-child { + margin-left: 17.094017094017094%; + *margin-left: 16.98763411529369%; + } + .row-fluid .offset1 { + margin-left: 11.11111111111111%; + *margin-left: 11.004728132387708%; + } + .row-fluid .offset1:first-child { + margin-left: 8.547008547008547%; + *margin-left: 8.440625568285142%; + } + input, + textarea, + .uneditable-input { + margin-left: 0; + } + .controls-row [class*="span"] + [class*="span"] { + margin-left: 30px; + } + input.span12, + textarea.span12, + .uneditable-input.span12 { + width: 1156px; + } + input.span11, + textarea.span11, + .uneditable-input.span11 { + width: 1056px; + } + input.span10, + textarea.span10, + .uneditable-input.span10 { + width: 956px; + } + input.span9, + textarea.span9, + .uneditable-input.span9 { + width: 856px; + } + input.span8, + textarea.span8, + .uneditable-input.span8 { + width: 756px; + } + input.span7, + textarea.span7, + .uneditable-input.span7 { + width: 656px; + } + input.span6, + textarea.span6, + .uneditable-input.span6 { + width: 556px; + } + input.span5, + textarea.span5, + .uneditable-input.span5 { + width: 456px; + } + input.span4, + textarea.span4, + .uneditable-input.span4 { + width: 356px; + } + input.span3, + textarea.span3, + .uneditable-input.span3 { + width: 256px; + } + input.span2, + textarea.span2, + .uneditable-input.span2 { + width: 156px; + } + input.span1, + textarea.span1, + .uneditable-input.span1 { + width: 56px; + } + .thumbnails { + margin-left: -30px; + } + .thumbnails > li { + margin-left: 30px; + } + .row-fluid .thumbnails { + margin-left: 0; + } +} + +@media (min-width: 768px) and (max-width: 979px) { + .row { + margin-left: -20px; + *zoom: 1; + } + .row:before, + .row:after { + display: table; + line-height: 0; + content: ""; + } + .row:after { + clear: both; + } + [class*="span"] { + float: left; + min-height: 1px; + margin-left: 20px; + } + .container, + .navbar-static-top .container, + .navbar-fixed-top .container, + .navbar-fixed-bottom .container { + width: 724px; + } + .span12 { + width: 724px; + } + .span11 { + width: 662px; + } + .span10 { + width: 600px; + } + .span9 { + width: 538px; + } + .span8 { + width: 476px; + } + .span7 { + width: 414px; + } + .span6 { + width: 352px; + } + .span5 { + width: 290px; + } + .span4 { + width: 228px; + } + .span3 { + width: 166px; + } + .span2 { + width: 104px; + } + .span1 { + width: 42px; + } + .offset12 { + margin-left: 764px; + } + .offset11 { + margin-left: 702px; + } + .offset10 { + margin-left: 640px; + } + .offset9 { + margin-left: 578px; + } + .offset8 { + margin-left: 516px; + } + .offset7 { + margin-left: 454px; + } + .offset6 { + margin-left: 392px; + } + .offset5 { + margin-left: 330px; + } + .offset4 { + margin-left: 268px; + } + .offset3 { + margin-left: 206px; + } + .offset2 { + margin-left: 144px; + } + .offset1 { + margin-left: 82px; + } + .row-fluid { + width: 100%; + *zoom: 1; + } + .row-fluid:before, + .row-fluid:after { + display: table; + line-height: 0; + content: ""; + } + .row-fluid:after { + clear: both; + } + .row-fluid [class*="span"] { + display: block; + float: left; + width: 100%; + min-height: 30px; + margin-left: 2.7624309392265194%; + *margin-left: 2.709239449864817%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + .row-fluid [class*="span"]:first-child { + margin-left: 0; + } + .row-fluid .controls-row [class*="span"] + [class*="span"] { + margin-left: 2.7624309392265194%; + } + .row-fluid .span12 { + width: 100%; + *width: 99.94680851063829%; + } + .row-fluid .span11 { + width: 91.43646408839778%; + *width: 91.38327259903608%; + } + .row-fluid .span10 { + width: 82.87292817679558%; + *width: 82.81973668743387%; + } + .row-fluid .span9 { + width: 74.30939226519337%; + *width: 74.25620077583166%; + } + .row-fluid .span8 { + width: 65.74585635359117%; + *width: 65.69266486422946%; + } + .row-fluid .span7 { + width: 57.18232044198895%; + *width: 57.12912895262725%; + } + .row-fluid .span6 { + width: 48.61878453038674%; + *width: 48.56559304102504%; + } + .row-fluid .span5 { + width: 40.05524861878453%; + *width: 40.00205712942283%; + } + .row-fluid .span4 { + width: 31.491712707182323%; + *width: 31.43852121782062%; + } + .row-fluid .span3 { + width: 22.92817679558011%; + *width: 22.87498530621841%; + } + .row-fluid .span2 { + width: 14.3646408839779%; + *width: 14.311449394616199%; + } + .row-fluid .span1 { + width: 5.801104972375691%; + *width: 5.747913483013988%; + } + .row-fluid .offset12 { + margin-left: 105.52486187845304%; + *margin-left: 105.41847889972962%; + } + .row-fluid .offset12:first-child { + margin-left: 102.76243093922652%; + *margin-left: 102.6560479605031%; + } + .row-fluid .offset11 { + margin-left: 96.96132596685082%; + *margin-left: 96.8549429881274%; + } + .row-fluid .offset11:first-child { + margin-left: 94.1988950276243%; + *margin-left: 94.09251204890089%; + } + .row-fluid .offset10 { + margin-left: 88.39779005524862%; + *margin-left: 88.2914070765252%; + } + .row-fluid .offset10:first-child { + margin-left: 85.6353591160221%; + *margin-left: 85.52897613729868%; + } + .row-fluid .offset9 { + margin-left: 79.8342541436464%; + *margin-left: 79.72787116492299%; + } + .row-fluid .offset9:first-child { + margin-left: 77.07182320441989%; + *margin-left: 76.96544022569647%; + } + .row-fluid .offset8 { + margin-left: 71.2707182320442%; + *margin-left: 71.16433525332079%; + } + .row-fluid .offset8:first-child { + margin-left: 68.50828729281768%; + *margin-left: 68.40190431409427%; + } + .row-fluid .offset7 { + margin-left: 62.70718232044199%; + *margin-left: 62.600799341718584%; + } + .row-fluid .offset7:first-child { + margin-left: 59.94475138121547%; + *margin-left: 59.838368402492065%; + } + .row-fluid .offset6 { + margin-left: 54.14364640883978%; + *margin-left: 54.037263430116376%; + } + .row-fluid .offset6:first-child { + margin-left: 51.38121546961326%; + *margin-left: 51.27483249088986%; + } + .row-fluid .offset5 { + margin-left: 45.58011049723757%; + *margin-left: 45.47372751851417%; + } + .row-fluid .offset5:first-child { + margin-left: 42.81767955801105%; + *margin-left: 42.71129657928765%; + } + .row-fluid .offset4 { + margin-left: 37.01657458563536%; + *margin-left: 36.91019160691196%; + } + .row-fluid .offset4:first-child { + margin-left: 34.25414364640884%; + *margin-left: 34.14776066768544%; + } + .row-fluid .offset3 { + margin-left: 28.45303867403315%; + *margin-left: 28.346655695309746%; + } + .row-fluid .offset3:first-child { + margin-left: 25.69060773480663%; + *margin-left: 25.584224756083227%; + } + .row-fluid .offset2 { + margin-left: 19.88950276243094%; + *margin-left: 19.783119783707537%; + } + .row-fluid .offset2:first-child { + margin-left: 17.12707182320442%; + *margin-left: 17.02068884448102%; + } + .row-fluid .offset1 { + margin-left: 11.32596685082873%; + *margin-left: 11.219583872105325%; + } + .row-fluid .offset1:first-child { + margin-left: 8.56353591160221%; + *margin-left: 8.457152932878806%; + } + input, + textarea, + .uneditable-input { + margin-left: 0; + } + .controls-row [class*="span"] + [class*="span"] { + margin-left: 20px; + } + input.span12, + textarea.span12, + .uneditable-input.span12 { + width: 710px; + } + input.span11, + textarea.span11, + .uneditable-input.span11 { + width: 648px; + } + input.span10, + textarea.span10, + .uneditable-input.span10 { + width: 586px; + } + input.span9, + textarea.span9, + .uneditable-input.span9 { + width: 524px; + } + input.span8, + textarea.span8, + .uneditable-input.span8 { + width: 462px; + } + input.span7, + textarea.span7, + .uneditable-input.span7 { + width: 400px; + } + input.span6, + textarea.span6, + .uneditable-input.span6 { + width: 338px; + } + input.span5, + textarea.span5, + .uneditable-input.span5 { + width: 276px; + } + input.span4, + textarea.span4, + .uneditable-input.span4 { + width: 214px; + } + input.span3, + textarea.span3, + .uneditable-input.span3 { + width: 152px; + } + input.span2, + textarea.span2, + .uneditable-input.span2 { + width: 90px; + } + input.span1, + textarea.span1, + .uneditable-input.span1 { + width: 28px; + } +} + +@media (max-width: 767px) { + body { + padding-right: 20px; + padding-left: 20px; + } + .navbar-fixed-top, + .navbar-fixed-bottom, + .navbar-static-top { + margin-right: -20px; + margin-left: -20px; + } + .container-fluid { + padding: 0; + } + .dl-horizontal dt { + float: none; + width: auto; + clear: none; + text-align: left; + } + .dl-horizontal dd { + margin-left: 0; + } + .container { + width: auto; + } + .row-fluid { + width: 100%; + } + .row, + .thumbnails { + margin-left: 0; + } + .thumbnails > li { + float: none; + margin-left: 0; + } + [class*="span"], + .uneditable-input[class*="span"], + .row-fluid [class*="span"] { + display: block; + float: none; + width: 100%; + margin-left: 0; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + .span12, + .row-fluid .span12 { + width: 100%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + .row-fluid [class*="offset"]:first-child { + margin-left: 0; + } + .input-large, + .input-xlarge, + .input-xxlarge, + input[class*="span"], + select[class*="span"], + textarea[class*="span"], + .uneditable-input { + display: block; + width: 100%; + min-height: 30px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + .input-prepend input, + .input-append input, + .input-prepend input[class*="span"], + .input-append input[class*="span"] { + display: inline-block; + width: auto; + } + .controls-row [class*="span"] + [class*="span"] { + margin-left: 0; + } + .modal { + position: fixed; + top: 20px; + right: 20px; + left: 20px; + width: auto; + margin: 0; + } + .modal.fade { + top: -100px; + } + .modal.fade.in { + top: 20px; + } +} + +@media (max-width: 480px) { + .nav-collapse { + -webkit-transform: translate3d(0, 0, 0); + } + .page-header h1 small { + display: block; + line-height: 20px; + } + input[type="checkbox"], + input[type="radio"] { + border: 1px solid #ccc; + } + .form-horizontal .control-label { + float: none; + width: auto; + padding-top: 0; + text-align: left; + } + .form-horizontal .controls { + margin-left: 0; + } + .form-horizontal .control-list { + padding-top: 0; + } + .form-horizontal .form-actions { + padding-right: 10px; + padding-left: 10px; + } + .media .pull-left, + .media .pull-right { + display: block; + float: none; + margin-bottom: 10px; + } + .media-object { + margin-right: 0; + margin-left: 0; + } + .modal { + top: 10px; + right: 10px; + left: 10px; + } + .modal-header .close { + padding: 10px; + margin: -10px; + } + .carousel-caption { + position: static; + } +} + +@media (max-width: 979px) { + body { + padding-top: 0; + } + .navbar-fixed-top, + .navbar-fixed-bottom { + position: static; + } + .navbar-fixed-top { + margin-bottom: 20px; + } + .navbar-fixed-bottom { + margin-top: 20px; + } + .navbar-fixed-top .navbar-inner, + .navbar-fixed-bottom .navbar-inner { + padding: 5px; + } + .navbar .container { + width: auto; + padding: 0; + } + .navbar .brand { + padding-right: 10px; + padding-left: 10px; + margin: 0 0 0 -5px; + } + .nav-collapse { + clear: both; + } + .nav-collapse .nav { + float: none; + margin: 0 0 10px; + } + .nav-collapse .nav > li { + float: none; + } + .nav-collapse .nav > li > a { + margin-bottom: 2px; + } + .nav-collapse .nav > .divider-vertical { + display: none; + } + .nav-collapse .nav .nav-header { + color: #777777; + text-shadow: none; + } + .nav-collapse .nav > li > a, + .nav-collapse .dropdown-menu a { + padding: 9px 15px; + font-weight: bold; + color: #777777; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + } + .nav-collapse .btn { + padding: 4px 10px 4px; + font-weight: normal; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + } + .nav-collapse .dropdown-menu li + li a { + margin-bottom: 2px; + } + .nav-collapse .nav > li > a:hover, + .nav-collapse .nav > li > a:focus, + .nav-collapse .dropdown-menu a:hover, + .nav-collapse .dropdown-menu a:focus { + background-color: #f2f2f2; + } + .navbar-inverse .nav-collapse .nav > li > a, + .navbar-inverse .nav-collapse .dropdown-menu a { + color: #999999; + } + .navbar-inverse .nav-collapse .nav > li > a:hover, + .navbar-inverse .nav-collapse .nav > li > a:focus, + .navbar-inverse .nav-collapse .dropdown-menu a:hover, + .navbar-inverse .nav-collapse .dropdown-menu a:focus { + background-color: #111111; + } + .nav-collapse.in .btn-group { + padding: 0; + margin-top: 5px; + } + .nav-collapse .dropdown-menu { + position: static; + top: auto; + left: auto; + display: none; + float: none; + max-width: none; + padding: 0; + margin: 0 15px; + background-color: transparent; + border: none; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; + } + .nav-collapse .open > .dropdown-menu { + display: block; + } + .nav-collapse .dropdown-menu:before, + .nav-collapse .dropdown-menu:after { + display: none; + } + .nav-collapse .dropdown-menu .divider { + display: none; + } + .nav-collapse .nav > li > .dropdown-menu:before, + .nav-collapse .nav > li > .dropdown-menu:after { + display: none; + } + .nav-collapse .navbar-form, + .nav-collapse .navbar-search { + float: none; + padding: 10px 15px; + margin: 10px 0; + border-top: 1px solid #f2f2f2; + border-bottom: 1px solid #f2f2f2; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + -moz-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); + } + .navbar-inverse .nav-collapse .navbar-form, + .navbar-inverse .nav-collapse .navbar-search { + border-top-color: #111111; + border-bottom-color: #111111; + } + .navbar .nav-collapse .nav.pull-right { + float: none; + margin-left: 0; + } + .nav-collapse, + .nav-collapse.collapse { + height: 0; + overflow: hidden; + } + .navbar .btn-navbar { + display: block; + } + .navbar-static .navbar-inner { + padding-right: 10px; + padding-left: 10px; + } +} + +@media (min-width: 980px) { + .nav-collapse.collapse { + height: auto !important; + overflow: visible !important; + } +} diff --git a/tbc/static/js/.jshintrc b/tbc/static/js/.jshintrc new file mode 100755 index 0000000..e072269 --- /dev/null +++ b/tbc/static/js/.jshintrc @@ -0,0 +1,12 @@ +{ + "validthis": true, + "laxcomma" : true, + "laxbreak" : true, + "browser" : true, + "eqnull" : true, + "debug" : true, + "devel" : true, + "boss" : true, + "expr" : true, + "asi" : true +}
\ No newline at end of file diff --git a/tbc/static/js/bootstrap-affix.js b/tbc/static/js/bootstrap-affix.js new file mode 100755 index 0000000..c1059a8 --- /dev/null +++ b/tbc/static/js/bootstrap-affix.js @@ -0,0 +1,117 @@ +/* ========================================================== + * bootstrap-affix.js v2.3.2 + * http://getbootstrap.com/2.3.2/javascript.html#affix + * ========================================================== + * Copyright 2013 Twitter, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ========================================================== */ + + +!function ($) { + + "use strict"; // jshint ;_; + + + /* AFFIX CLASS DEFINITION + * ====================== */ + + var Affix = function (element, options) { + this.options = $.extend({}, $.fn.affix.defaults, options) + this.$window = $(window) + .on('scroll.affix.data-api', $.proxy(this.checkPosition, this)) + .on('click.affix.data-api', $.proxy(function () { setTimeout($.proxy(this.checkPosition, this), 1) }, this)) + this.$element = $(element) + this.checkPosition() + } + + Affix.prototype.checkPosition = function () { + if (!this.$element.is(':visible')) return + + var scrollHeight = $(document).height() + , scrollTop = this.$window.scrollTop() + , position = this.$element.offset() + , offset = this.options.offset + , offsetBottom = offset.bottom + , offsetTop = offset.top + , reset = 'affix affix-top affix-bottom' + , affix + + if (typeof offset != 'object') offsetBottom = offsetTop = offset + if (typeof offsetTop == 'function') offsetTop = offset.top() + if (typeof offsetBottom == 'function') offsetBottom = offset.bottom() + + affix = this.unpin != null && (scrollTop + this.unpin <= position.top) ? + false : offsetBottom != null && (position.top + this.$element.height() >= scrollHeight - offsetBottom) ? + 'bottom' : offsetTop != null && scrollTop <= offsetTop ? + 'top' : false + + if (this.affixed === affix) return + + this.affixed = affix + this.unpin = affix == 'bottom' ? position.top - scrollTop : null + + this.$element.removeClass(reset).addClass('affix' + (affix ? '-' + affix : '')) + } + + + /* AFFIX PLUGIN DEFINITION + * ======================= */ + + var old = $.fn.affix + + $.fn.affix = function (option) { + return this.each(function () { + var $this = $(this) + , data = $this.data('affix') + , options = typeof option == 'object' && option + if (!data) $this.data('affix', (data = new Affix(this, options))) + if (typeof option == 'string') data[option]() + }) + } + + $.fn.affix.Constructor = Affix + + $.fn.affix.defaults = { + offset: 0 + } + + + /* AFFIX NO CONFLICT + * ================= */ + + $.fn.affix.noConflict = function () { + $.fn.affix = old + return this + } + + + /* AFFIX DATA-API + * ============== */ + + $(window).on('load', function () { + $('[data-spy="affix"]').each(function () { + var $spy = $(this) + , data = $spy.data() + + data.offset = data.offset || {} + + data.offsetBottom && (data.offset.bottom = data.offsetBottom) + data.offsetTop && (data.offset.top = data.offsetTop) + + $spy.affix(data) + }) + }) + + +}(window.jQuery);
\ No newline at end of file diff --git a/tbc/static/js/bootstrap-alert.js b/tbc/static/js/bootstrap-alert.js new file mode 100755 index 0000000..9577e62 --- /dev/null +++ b/tbc/static/js/bootstrap-alert.js @@ -0,0 +1,99 @@ +/* ========================================================== + * bootstrap-alert.js v2.3.2 + * http://getbootstrap.com/2.3.2/javascript.html#alerts + * ========================================================== + * Copyright 2013 Twitter, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ========================================================== */ + + +!function ($) { + + "use strict"; // jshint ;_; + + + /* ALERT CLASS DEFINITION + * ====================== */ + + var dismiss = '[data-dismiss="alert"]' + , Alert = function (el) { + $(el).on('click', dismiss, this.close) + } + + Alert.prototype.close = function (e) { + var $this = $(this) + , selector = $this.attr('data-target') + , $parent + + if (!selector) { + selector = $this.attr('href') + selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7 + } + + $parent = $(selector) + + e && e.preventDefault() + + $parent.length || ($parent = $this.hasClass('alert') ? $this : $this.parent()) + + $parent.trigger(e = $.Event('close')) + + if (e.isDefaultPrevented()) return + + $parent.removeClass('in') + + function removeElement() { + $parent + .trigger('closed') + .remove() + } + + $.support.transition && $parent.hasClass('fade') ? + $parent.on($.support.transition.end, removeElement) : + removeElement() + } + + + /* ALERT PLUGIN DEFINITION + * ======================= */ + + var old = $.fn.alert + + $.fn.alert = function (option) { + return this.each(function () { + var $this = $(this) + , data = $this.data('alert') + if (!data) $this.data('alert', (data = new Alert(this))) + if (typeof option == 'string') data[option].call($this) + }) + } + + $.fn.alert.Constructor = Alert + + + /* ALERT NO CONFLICT + * ================= */ + + $.fn.alert.noConflict = function () { + $.fn.alert = old + return this + } + + + /* ALERT DATA-API + * ============== */ + + $(document).on('click.alert.data-api', dismiss, Alert.prototype.close) + +}(window.jQuery);
\ No newline at end of file diff --git a/tbc/static/js/bootstrap-button.js b/tbc/static/js/bootstrap-button.js new file mode 100755 index 0000000..4b2a90a --- /dev/null +++ b/tbc/static/js/bootstrap-button.js @@ -0,0 +1,105 @@ +/* ============================================================ + * bootstrap-button.js v2.3.2 + * http://getbootstrap.com/2.3.2/javascript.html#buttons + * ============================================================ + * Copyright 2013 Twitter, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================ */ + + +!function ($) { + + "use strict"; // jshint ;_; + + + /* BUTTON PUBLIC CLASS DEFINITION + * ============================== */ + + var Button = function (element, options) { + this.$element = $(element) + this.options = $.extend({}, $.fn.button.defaults, options) + } + + Button.prototype.setState = function (state) { + var d = 'disabled' + , $el = this.$element + , data = $el.data() + , val = $el.is('input') ? 'val' : 'html' + + state = state + 'Text' + data.resetText || $el.data('resetText', $el[val]()) + + $el[val](data[state] || this.options[state]) + + // push to event loop to allow forms to submit + setTimeout(function () { + state == 'loadingText' ? + $el.addClass(d).attr(d, d) : + $el.removeClass(d).removeAttr(d) + }, 0) + } + + Button.prototype.toggle = function () { + var $parent = this.$element.closest('[data-toggle="buttons-radio"]') + + $parent && $parent + .find('.active') + .removeClass('active') + + this.$element.toggleClass('active') + } + + + /* BUTTON PLUGIN DEFINITION + * ======================== */ + + var old = $.fn.button + + $.fn.button = function (option) { + return this.each(function () { + var $this = $(this) + , data = $this.data('button') + , options = typeof option == 'object' && option + if (!data) $this.data('button', (data = new Button(this, options))) + if (option == 'toggle') data.toggle() + else if (option) data.setState(option) + }) + } + + $.fn.button.defaults = { + loadingText: 'loading...' + } + + $.fn.button.Constructor = Button + + + /* BUTTON NO CONFLICT + * ================== */ + + $.fn.button.noConflict = function () { + $.fn.button = old + return this + } + + + /* BUTTON DATA-API + * =============== */ + + $(document).on('click.button.data-api', '[data-toggle^=button]', function (e) { + var $btn = $(e.target) + if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn') + $btn.button('toggle') + }) + +}(window.jQuery);
\ No newline at end of file diff --git a/tbc/static/js/bootstrap-carousel.js b/tbc/static/js/bootstrap-carousel.js new file mode 100755 index 0000000..c1e8ade --- /dev/null +++ b/tbc/static/js/bootstrap-carousel.js @@ -0,0 +1,207 @@ +/* ========================================================== + * bootstrap-carousel.js v2.3.2 + * http://getbootstrap.com/2.3.2/javascript.html#carousel + * ========================================================== + * Copyright 2013 Twitter, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ========================================================== */ + + +!function ($) { + + "use strict"; // jshint ;_; + + + /* CAROUSEL CLASS DEFINITION + * ========================= */ + + var Carousel = function (element, options) { + this.$element = $(element) + this.$indicators = this.$element.find('.carousel-indicators') + this.options = options + this.options.pause == 'hover' && this.$element + .on('mouseenter', $.proxy(this.pause, this)) + .on('mouseleave', $.proxy(this.cycle, this)) + } + + Carousel.prototype = { + + cycle: function (e) { + if (!e) this.paused = false + if (this.interval) clearInterval(this.interval); + this.options.interval + && !this.paused + && (this.interval = setInterval($.proxy(this.next, this), this.options.interval)) + return this + } + + , getActiveIndex: function () { + this.$active = this.$element.find('.item.active') + this.$items = this.$active.parent().children() + return this.$items.index(this.$active) + } + + , to: function (pos) { + var activeIndex = this.getActiveIndex() + , that = this + + if (pos > (this.$items.length - 1) || pos < 0) return + + if (this.sliding) { + return this.$element.one('slid', function () { + that.to(pos) + }) + } + + if (activeIndex == pos) { + return this.pause().cycle() + } + + return this.slide(pos > activeIndex ? 'next' : 'prev', $(this.$items[pos])) + } + + , pause: function (e) { + if (!e) this.paused = true + if (this.$element.find('.next, .prev').length && $.support.transition.end) { + this.$element.trigger($.support.transition.end) + this.cycle(true) + } + clearInterval(this.interval) + this.interval = null + return this + } + + , next: function () { + if (this.sliding) return + return this.slide('next') + } + + , prev: function () { + if (this.sliding) return + return this.slide('prev') + } + + , slide: function (type, next) { + var $active = this.$element.find('.item.active') + , $next = next || $active[type]() + , isCycling = this.interval + , direction = type == 'next' ? 'left' : 'right' + , fallback = type == 'next' ? 'first' : 'last' + , that = this + , e + + this.sliding = true + + isCycling && this.pause() + + $next = $next.length ? $next : this.$element.find('.item')[fallback]() + + e = $.Event('slide', { + relatedTarget: $next[0] + , direction: direction + }) + + if ($next.hasClass('active')) return + + if (this.$indicators.length) { + this.$indicators.find('.active').removeClass('active') + this.$element.one('slid', function () { + var $nextIndicator = $(that.$indicators.children()[that.getActiveIndex()]) + $nextIndicator && $nextIndicator.addClass('active') + }) + } + + if ($.support.transition && this.$element.hasClass('slide')) { + this.$element.trigger(e) + if (e.isDefaultPrevented()) return + $next.addClass(type) + $next[0].offsetWidth // force reflow + $active.addClass(direction) + $next.addClass(direction) + this.$element.one($.support.transition.end, function () { + $next.removeClass([type, direction].join(' ')).addClass('active') + $active.removeClass(['active', direction].join(' ')) + that.sliding = false + setTimeout(function () { that.$element.trigger('slid') }, 0) + }) + } else { + this.$element.trigger(e) + if (e.isDefaultPrevented()) return + $active.removeClass('active') + $next.addClass('active') + this.sliding = false + this.$element.trigger('slid') + } + + isCycling && this.cycle() + + return this + } + + } + + + /* CAROUSEL PLUGIN DEFINITION + * ========================== */ + + var old = $.fn.carousel + + $.fn.carousel = function (option) { + return this.each(function () { + var $this = $(this) + , data = $this.data('carousel') + , options = $.extend({}, $.fn.carousel.defaults, typeof option == 'object' && option) + , action = typeof option == 'string' ? option : options.slide + if (!data) $this.data('carousel', (data = new Carousel(this, options))) + if (typeof option == 'number') data.to(option) + else if (action) data[action]() + else if (options.interval) data.pause().cycle() + }) + } + + $.fn.carousel.defaults = { + interval: 5000 + , pause: 'hover' + } + + $.fn.carousel.Constructor = Carousel + + + /* CAROUSEL NO CONFLICT + * ==================== */ + + $.fn.carousel.noConflict = function () { + $.fn.carousel = old + return this + } + + /* CAROUSEL DATA-API + * ================= */ + + $(document).on('click.carousel.data-api', '[data-slide], [data-slide-to]', function (e) { + var $this = $(this), href + , $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7 + , options = $.extend({}, $target.data(), $this.data()) + , slideIndex + + $target.carousel(options) + + if (slideIndex = $this.attr('data-slide-to')) { + $target.data('carousel').pause().to(slideIndex).cycle() + } + + e.preventDefault() + }) + +}(window.jQuery);
\ No newline at end of file diff --git a/tbc/static/js/bootstrap-collapse.js b/tbc/static/js/bootstrap-collapse.js new file mode 100755 index 0000000..ae3e4c6 --- /dev/null +++ b/tbc/static/js/bootstrap-collapse.js @@ -0,0 +1,167 @@ +/* ============================================================= + * bootstrap-collapse.js v2.3.2 + * http://getbootstrap.com/2.3.2/javascript.html#collapse + * ============================================================= + * Copyright 2013 Twitter, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================ */ + + +!function ($) { + + "use strict"; // jshint ;_; + + + /* COLLAPSE PUBLIC CLASS DEFINITION + * ================================ */ + + var Collapse = function (element, options) { + this.$element = $(element) + this.options = $.extend({}, $.fn.collapse.defaults, options) + + if (this.options.parent) { + this.$parent = $(this.options.parent) + } + + this.options.toggle && this.toggle() + } + + Collapse.prototype = { + + constructor: Collapse + + , dimension: function () { + var hasWidth = this.$element.hasClass('width') + return hasWidth ? 'width' : 'height' + } + + , show: function () { + var dimension + , scroll + , actives + , hasData + + if (this.transitioning || this.$element.hasClass('in')) return + + dimension = this.dimension() + scroll = $.camelCase(['scroll', dimension].join('-')) + actives = this.$parent && this.$parent.find('> .accordion-group > .in') + + if (actives && actives.length) { + hasData = actives.data('collapse') + if (hasData && hasData.transitioning) return + actives.collapse('hide') + hasData || actives.data('collapse', null) + } + + this.$element[dimension](0) + this.transition('addClass', $.Event('show'), 'shown') + $.support.transition && this.$element[dimension](this.$element[0][scroll]) + } + + , hide: function () { + var dimension + if (this.transitioning || !this.$element.hasClass('in')) return + dimension = this.dimension() + this.reset(this.$element[dimension]()) + this.transition('removeClass', $.Event('hide'), 'hidden') + this.$element[dimension](0) + } + + , reset: function (size) { + var dimension = this.dimension() + + this.$element + .removeClass('collapse') + [dimension](size || 'auto') + [0].offsetWidth + + this.$element[size !== null ? 'addClass' : 'removeClass']('collapse') + + return this + } + + , transition: function (method, startEvent, completeEvent) { + var that = this + , complete = function () { + if (startEvent.type == 'show') that.reset() + that.transitioning = 0 + that.$element.trigger(completeEvent) + } + + this.$element.trigger(startEvent) + + if (startEvent.isDefaultPrevented()) return + + this.transitioning = 1 + + this.$element[method]('in') + + $.support.transition && this.$element.hasClass('collapse') ? + this.$element.one($.support.transition.end, complete) : + complete() + } + + , toggle: function () { + this[this.$element.hasClass('in') ? 'hide' : 'show']() + } + + } + + + /* COLLAPSE PLUGIN DEFINITION + * ========================== */ + + var old = $.fn.collapse + + $.fn.collapse = function (option) { + return this.each(function () { + var $this = $(this) + , data = $this.data('collapse') + , options = $.extend({}, $.fn.collapse.defaults, $this.data(), typeof option == 'object' && option) + if (!data) $this.data('collapse', (data = new Collapse(this, options))) + if (typeof option == 'string') data[option]() + }) + } + + $.fn.collapse.defaults = { + toggle: true + } + + $.fn.collapse.Constructor = Collapse + + + /* COLLAPSE NO CONFLICT + * ==================== */ + + $.fn.collapse.noConflict = function () { + $.fn.collapse = old + return this + } + + + /* COLLAPSE DATA-API + * ================= */ + + $(document).on('click.collapse.data-api', '[data-toggle=collapse]', function (e) { + var $this = $(this), href + , target = $this.attr('data-target') + || e.preventDefault() + || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') //strip for ie7 + , option = $(target).data('collapse') ? 'toggle' : $this.data() + $this[$(target).hasClass('in') ? 'addClass' : 'removeClass']('collapsed') + $(target).collapse(option) + }) + +}(window.jQuery);
\ No newline at end of file diff --git a/tbc/static/js/bootstrap-dropdown.js b/tbc/static/js/bootstrap-dropdown.js new file mode 100755 index 0000000..d04da5d --- /dev/null +++ b/tbc/static/js/bootstrap-dropdown.js @@ -0,0 +1,169 @@ +/* ============================================================ + * bootstrap-dropdown.js v2.3.2 + * http://getbootstrap.com/2.3.2/javascript.html#dropdowns + * ============================================================ + * Copyright 2013 Twitter, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================ */ + + +!function ($) { + + "use strict"; // jshint ;_; + + + /* DROPDOWN CLASS DEFINITION + * ========================= */ + + var toggle = '[data-toggle=dropdown]' + , Dropdown = function (element) { + var $el = $(element).on('click.dropdown.data-api', this.toggle) + $('html').on('click.dropdown.data-api', function () { + $el.parent().removeClass('open') + }) + } + + Dropdown.prototype = { + + constructor: Dropdown + + , toggle: function (e) { + var $this = $(this) + , $parent + , isActive + + if ($this.is('.disabled, :disabled')) return + + $parent = getParent($this) + + isActive = $parent.hasClass('open') + + clearMenus() + + if (!isActive) { + if ('ontouchstart' in document.documentElement) { + // if mobile we we use a backdrop because click events don't delegate + $('<div class="dropdown-backdrop"/>').insertBefore($(this)).on('click', clearMenus) + } + $parent.toggleClass('open') + } + + $this.focus() + + return false + } + + , keydown: function (e) { + var $this + , $items + , $active + , $parent + , isActive + , index + + if (!/(38|40|27)/.test(e.keyCode)) return + + $this = $(this) + + e.preventDefault() + e.stopPropagation() + + if ($this.is('.disabled, :disabled')) return + + $parent = getParent($this) + + isActive = $parent.hasClass('open') + + if (!isActive || (isActive && e.keyCode == 27)) { + if (e.which == 27) $parent.find(toggle).focus() + return $this.click() + } + + $items = $('[role=menu] li:not(.divider):visible a', $parent) + + if (!$items.length) return + + index = $items.index($items.filter(':focus')) + + if (e.keyCode == 38 && index > 0) index-- // up + if (e.keyCode == 40 && index < $items.length - 1) index++ // down + if (!~index) index = 0 + + $items + .eq(index) + .focus() + } + + } + + function clearMenus() { + $('.dropdown-backdrop').remove() + $(toggle).each(function () { + getParent($(this)).removeClass('open') + }) + } + + function getParent($this) { + var selector = $this.attr('data-target') + , $parent + + if (!selector) { + selector = $this.attr('href') + selector = selector && /#/.test(selector) && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7 + } + + $parent = selector && $(selector) + + if (!$parent || !$parent.length) $parent = $this.parent() + + return $parent + } + + + /* DROPDOWN PLUGIN DEFINITION + * ========================== */ + + var old = $.fn.dropdown + + $.fn.dropdown = function (option) { + return this.each(function () { + var $this = $(this) + , data = $this.data('dropdown') + if (!data) $this.data('dropdown', (data = new Dropdown(this))) + if (typeof option == 'string') data[option].call($this) + }) + } + + $.fn.dropdown.Constructor = Dropdown + + + /* DROPDOWN NO CONFLICT + * ==================== */ + + $.fn.dropdown.noConflict = function () { + $.fn.dropdown = old + return this + } + + + /* APPLY TO STANDARD DROPDOWN ELEMENTS + * =================================== */ + + $(document) + .on('click.dropdown.data-api', clearMenus) + .on('click.dropdown.data-api', '.dropdown form', function (e) { e.stopPropagation() }) + .on('click.dropdown.data-api' , toggle, Dropdown.prototype.toggle) + .on('keydown.dropdown.data-api', toggle + ', [role=menu]' , Dropdown.prototype.keydown) + +}(window.jQuery); diff --git a/tbc/static/js/bootstrap-modal.js b/tbc/static/js/bootstrap-modal.js new file mode 100755 index 0000000..fb0b0db --- /dev/null +++ b/tbc/static/js/bootstrap-modal.js @@ -0,0 +1,247 @@ +/* ========================================================= + * bootstrap-modal.js v2.3.2 + * http://getbootstrap.com/2.3.2/javascript.html#modals + * ========================================================= + * Copyright 2013 Twitter, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ========================================================= */ + + +!function ($) { + + "use strict"; // jshint ;_; + + + /* MODAL CLASS DEFINITION + * ====================== */ + + var Modal = function (element, options) { + this.options = options + this.$element = $(element) + .delegate('[data-dismiss="modal"]', 'click.dismiss.modal', $.proxy(this.hide, this)) + this.options.remote && this.$element.find('.modal-body').load(this.options.remote) + } + + Modal.prototype = { + + constructor: Modal + + , toggle: function () { + return this[!this.isShown ? 'show' : 'hide']() + } + + , show: function () { + var that = this + , e = $.Event('show') + + this.$element.trigger(e) + + if (this.isShown || e.isDefaultPrevented()) return + + this.isShown = true + + this.escape() + + this.backdrop(function () { + var transition = $.support.transition && that.$element.hasClass('fade') + + if (!that.$element.parent().length) { + that.$element.appendTo(document.body) //don't move modals dom position + } + + that.$element.show() + + if (transition) { + that.$element[0].offsetWidth // force reflow + } + + that.$element + .addClass('in') + .attr('aria-hidden', false) + + that.enforceFocus() + + transition ? + that.$element.one($.support.transition.end, function () { that.$element.focus().trigger('shown') }) : + that.$element.focus().trigger('shown') + + }) + } + + , hide: function (e) { + e && e.preventDefault() + + var that = this + + e = $.Event('hide') + + this.$element.trigger(e) + + if (!this.isShown || e.isDefaultPrevented()) return + + this.isShown = false + + this.escape() + + $(document).off('focusin.modal') + + this.$element + .removeClass('in') + .attr('aria-hidden', true) + + $.support.transition && this.$element.hasClass('fade') ? + this.hideWithTransition() : + this.hideModal() + } + + , enforceFocus: function () { + var that = this + $(document).on('focusin.modal', function (e) { + if (that.$element[0] !== e.target && !that.$element.has(e.target).length) { + that.$element.focus() + } + }) + } + + , escape: function () { + var that = this + if (this.isShown && this.options.keyboard) { + this.$element.on('keyup.dismiss.modal', function ( e ) { + e.which == 27 && that.hide() + }) + } else if (!this.isShown) { + this.$element.off('keyup.dismiss.modal') + } + } + + , hideWithTransition: function () { + var that = this + , timeout = setTimeout(function () { + that.$element.off($.support.transition.end) + that.hideModal() + }, 500) + + this.$element.one($.support.transition.end, function () { + clearTimeout(timeout) + that.hideModal() + }) + } + + , hideModal: function () { + var that = this + this.$element.hide() + this.backdrop(function () { + that.removeBackdrop() + that.$element.trigger('hidden') + }) + } + + , removeBackdrop: function () { + this.$backdrop && this.$backdrop.remove() + this.$backdrop = null + } + + , backdrop: function (callback) { + var that = this + , animate = this.$element.hasClass('fade') ? 'fade' : '' + + if (this.isShown && this.options.backdrop) { + var doAnimate = $.support.transition && animate + + this.$backdrop = $('<div class="modal-backdrop ' + animate + '" />') + .appendTo(document.body) + + this.$backdrop.click( + this.options.backdrop == 'static' ? + $.proxy(this.$element[0].focus, this.$element[0]) + : $.proxy(this.hide, this) + ) + + if (doAnimate) this.$backdrop[0].offsetWidth // force reflow + + this.$backdrop.addClass('in') + + if (!callback) return + + doAnimate ? + this.$backdrop.one($.support.transition.end, callback) : + callback() + + } else if (!this.isShown && this.$backdrop) { + this.$backdrop.removeClass('in') + + $.support.transition && this.$element.hasClass('fade')? + this.$backdrop.one($.support.transition.end, callback) : + callback() + + } else if (callback) { + callback() + } + } + } + + + /* MODAL PLUGIN DEFINITION + * ======================= */ + + var old = $.fn.modal + + $.fn.modal = function (option) { + return this.each(function () { + var $this = $(this) + , data = $this.data('modal') + , options = $.extend({}, $.fn.modal.defaults, $this.data(), typeof option == 'object' && option) + if (!data) $this.data('modal', (data = new Modal(this, options))) + if (typeof option == 'string') data[option]() + else if (options.show) data.show() + }) + } + + $.fn.modal.defaults = { + backdrop: true + , keyboard: true + , show: true + } + + $.fn.modal.Constructor = Modal + + + /* MODAL NO CONFLICT + * ================= */ + + $.fn.modal.noConflict = function () { + $.fn.modal = old + return this + } + + + /* MODAL DATA-API + * ============== */ + + $(document).on('click.modal.data-api', '[data-toggle="modal"]', function (e) { + var $this = $(this) + , href = $this.attr('href') + , $target = $($this.attr('data-target') || (href && href.replace(/.*(?=#[^\s]+$)/, ''))) //strip for ie7 + , option = $target.data('modal') ? 'toggle' : $.extend({ remote:!/#/.test(href) && href }, $target.data(), $this.data()) + + e.preventDefault() + + $target + .modal(option) + .one('hide', function () { + $this.focus() + }) + }) + +}(window.jQuery); diff --git a/tbc/static/js/bootstrap-popover.js b/tbc/static/js/bootstrap-popover.js new file mode 100755 index 0000000..2b323b4 --- /dev/null +++ b/tbc/static/js/bootstrap-popover.js @@ -0,0 +1,114 @@ +/* =========================================================== + * bootstrap-popover.js v2.3.2 + * http://getbootstrap.com/2.3.2/javascript.html#popovers + * =========================================================== + * Copyright 2013 Twitter, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * =========================================================== */ + + +!function ($) { + + "use strict"; // jshint ;_; + + + /* POPOVER PUBLIC CLASS DEFINITION + * =============================== */ + + var Popover = function (element, options) { + this.init('popover', element, options) + } + + + /* NOTE: POPOVER EXTENDS BOOTSTRAP-TOOLTIP.js + ========================================== */ + + Popover.prototype = $.extend({}, $.fn.tooltip.Constructor.prototype, { + + constructor: Popover + + , setContent: function () { + var $tip = this.tip() + , title = this.getTitle() + , content = this.getContent() + + $tip.find('.popover-title')[this.options.html ? 'html' : 'text'](title) + $tip.find('.popover-content')[this.options.html ? 'html' : 'text'](content) + + $tip.removeClass('fade top bottom left right in') + } + + , hasContent: function () { + return this.getTitle() || this.getContent() + } + + , getContent: function () { + var content + , $e = this.$element + , o = this.options + + content = (typeof o.content == 'function' ? o.content.call($e[0]) : o.content) + || $e.attr('data-content') + + return content + } + + , tip: function () { + if (!this.$tip) { + this.$tip = $(this.options.template) + } + return this.$tip + } + + , destroy: function () { + this.hide().$element.off('.' + this.type).removeData(this.type) + } + + }) + + + /* POPOVER PLUGIN DEFINITION + * ======================= */ + + var old = $.fn.popover + + $.fn.popover = function (option) { + return this.each(function () { + var $this = $(this) + , data = $this.data('popover') + , options = typeof option == 'object' && option + if (!data) $this.data('popover', (data = new Popover(this, options))) + if (typeof option == 'string') data[option]() + }) + } + + $.fn.popover.Constructor = Popover + + $.fn.popover.defaults = $.extend({} , $.fn.tooltip.defaults, { + placement: 'right' + , trigger: 'click' + , content: '' + , template: '<div class="popover"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>' + }) + + + /* POPOVER NO CONFLICT + * =================== */ + + $.fn.popover.noConflict = function () { + $.fn.popover = old + return this + } + +}(window.jQuery); diff --git a/tbc/static/js/bootstrap-scrollspy.js b/tbc/static/js/bootstrap-scrollspy.js new file mode 100755 index 0000000..3ce5461 --- /dev/null +++ b/tbc/static/js/bootstrap-scrollspy.js @@ -0,0 +1,162 @@ +/* ============================================================= + * bootstrap-scrollspy.js v2.3.2 + * http://getbootstrap.com/2.3.2/javascript.html#scrollspy + * ============================================================= + * Copyright 2013 Twitter, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================== */ + + +!function ($) { + + "use strict"; // jshint ;_; + + + /* SCROLLSPY CLASS DEFINITION + * ========================== */ + + function ScrollSpy(element, options) { + var process = $.proxy(this.process, this) + , $element = $(element).is('body') ? $(window) : $(element) + , href + this.options = $.extend({}, $.fn.scrollspy.defaults, options) + this.$scrollElement = $element.on('scroll.scroll-spy.data-api', process) + this.selector = (this.options.target + || ((href = $(element).attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7 + || '') + ' .nav li > a' + this.$body = $('body') + this.refresh() + this.process() + } + + ScrollSpy.prototype = { + + constructor: ScrollSpy + + , refresh: function () { + var self = this + , $targets + + this.offsets = $([]) + this.targets = $([]) + + $targets = this.$body + .find(this.selector) + .map(function () { + var $el = $(this) + , href = $el.data('target') || $el.attr('href') + , $href = /^#\w/.test(href) && $(href) + return ( $href + && $href.length + && [[ $href.position().top + (!$.isWindow(self.$scrollElement.get(0)) && self.$scrollElement.scrollTop()), href ]] ) || null + }) + .sort(function (a, b) { return a[0] - b[0] }) + .each(function () { + self.offsets.push(this[0]) + self.targets.push(this[1]) + }) + } + + , process: function () { + var scrollTop = this.$scrollElement.scrollTop() + this.options.offset + , scrollHeight = this.$scrollElement[0].scrollHeight || this.$body[0].scrollHeight + , maxScroll = scrollHeight - this.$scrollElement.height() + , offsets = this.offsets + , targets = this.targets + , activeTarget = this.activeTarget + , i + + if (scrollTop >= maxScroll) { + return activeTarget != (i = targets.last()[0]) + && this.activate ( i ) + } + + for (i = offsets.length; i--;) { + activeTarget != targets[i] + && scrollTop >= offsets[i] + && (!offsets[i + 1] || scrollTop <= offsets[i + 1]) + && this.activate( targets[i] ) + } + } + + , activate: function (target) { + var active + , selector + + this.activeTarget = target + + $(this.selector) + .parent('.active') + .removeClass('active') + + selector = this.selector + + '[data-target="' + target + '"],' + + this.selector + '[href="' + target + '"]' + + active = $(selector) + .parent('li') + .addClass('active') + + if (active.parent('.dropdown-menu').length) { + active = active.closest('li.dropdown').addClass('active') + } + + active.trigger('activate') + } + + } + + + /* SCROLLSPY PLUGIN DEFINITION + * =========================== */ + + var old = $.fn.scrollspy + + $.fn.scrollspy = function (option) { + return this.each(function () { + var $this = $(this) + , data = $this.data('scrollspy') + , options = typeof option == 'object' && option + if (!data) $this.data('scrollspy', (data = new ScrollSpy(this, options))) + if (typeof option == 'string') data[option]() + }) + } + + $.fn.scrollspy.Constructor = ScrollSpy + + $.fn.scrollspy.defaults = { + offset: 10 + } + + + /* SCROLLSPY NO CONFLICT + * ===================== */ + + $.fn.scrollspy.noConflict = function () { + $.fn.scrollspy = old + return this + } + + + /* SCROLLSPY DATA-API + * ================== */ + + $(window).on('load', function () { + $('[data-spy="scroll"]').each(function () { + var $spy = $(this) + $spy.scrollspy($spy.data()) + }) + }) + +}(window.jQuery);
\ No newline at end of file diff --git a/tbc/static/js/bootstrap-tab.js b/tbc/static/js/bootstrap-tab.js new file mode 100755 index 0000000..3a132c0 --- /dev/null +++ b/tbc/static/js/bootstrap-tab.js @@ -0,0 +1,144 @@ +/* ======================================================== + * bootstrap-tab.js v2.3.2 + * http://getbootstrap.com/2.3.2/javascript.html#tabs + * ======================================================== + * Copyright 2013 Twitter, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ======================================================== */ + + +!function ($) { + + "use strict"; // jshint ;_; + + + /* TAB CLASS DEFINITION + * ==================== */ + + var Tab = function (element) { + this.element = $(element) + } + + Tab.prototype = { + + constructor: Tab + + , show: function () { + var $this = this.element + , $ul = $this.closest('ul:not(.dropdown-menu)') + , selector = $this.attr('data-target') + , previous + , $target + , e + + if (!selector) { + selector = $this.attr('href') + selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7 + } + + if ( $this.parent('li').hasClass('active') ) return + + previous = $ul.find('.active:last a')[0] + + e = $.Event('show', { + relatedTarget: previous + }) + + $this.trigger(e) + + if (e.isDefaultPrevented()) return + + $target = $(selector) + + this.activate($this.parent('li'), $ul) + this.activate($target, $target.parent(), function () { + $this.trigger({ + type: 'shown' + , relatedTarget: previous + }) + }) + } + + , activate: function ( element, container, callback) { + var $active = container.find('> .active') + , transition = callback + && $.support.transition + && $active.hasClass('fade') + + function next() { + $active + .removeClass('active') + .find('> .dropdown-menu > .active') + .removeClass('active') + + element.addClass('active') + + if (transition) { + element[0].offsetWidth // reflow for transition + element.addClass('in') + } else { + element.removeClass('fade') + } + + if ( element.parent('.dropdown-menu') ) { + element.closest('li.dropdown').addClass('active') + } + + callback && callback() + } + + transition ? + $active.one($.support.transition.end, next) : + next() + + $active.removeClass('in') + } + } + + + /* TAB PLUGIN DEFINITION + * ===================== */ + + var old = $.fn.tab + + $.fn.tab = function ( option ) { + return this.each(function () { + var $this = $(this) + , data = $this.data('tab') + if (!data) $this.data('tab', (data = new Tab(this))) + if (typeof option == 'string') data[option]() + }) + } + + $.fn.tab.Constructor = Tab + + + /* TAB NO CONFLICT + * =============== */ + + $.fn.tab.noConflict = function () { + $.fn.tab = old + return this + } + + + /* TAB DATA-API + * ============ */ + + $(document).on('click.tab.data-api', '[data-toggle="tab"], [data-toggle="pill"]', function (e) { + e.preventDefault() + $(this).tab('show') + }) + +}(window.jQuery);
\ No newline at end of file diff --git a/tbc/static/js/bootstrap-tooltip.js b/tbc/static/js/bootstrap-tooltip.js new file mode 100755 index 0000000..acd6096 --- /dev/null +++ b/tbc/static/js/bootstrap-tooltip.js @@ -0,0 +1,361 @@ +/* =========================================================== + * bootstrap-tooltip.js v2.3.2 + * http://getbootstrap.com/2.3.2/javascript.html#tooltips + * Inspired by the original jQuery.tipsy by Jason Frame + * =========================================================== + * Copyright 2013 Twitter, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ========================================================== */ + + +!function ($) { + + "use strict"; // jshint ;_; + + + /* TOOLTIP PUBLIC CLASS DEFINITION + * =============================== */ + + var Tooltip = function (element, options) { + this.init('tooltip', element, options) + } + + Tooltip.prototype = { + + constructor: Tooltip + + , init: function (type, element, options) { + var eventIn + , eventOut + , triggers + , trigger + , i + + this.type = type + this.$element = $(element) + this.options = this.getOptions(options) + this.enabled = true + + triggers = this.options.trigger.split(' ') + + for (i = triggers.length; i--;) { + trigger = triggers[i] + if (trigger == 'click') { + this.$element.on('click.' + this.type, this.options.selector, $.proxy(this.toggle, this)) + } else if (trigger != 'manual') { + eventIn = trigger == 'hover' ? 'mouseenter' : 'focus' + eventOut = trigger == 'hover' ? 'mouseleave' : 'blur' + this.$element.on(eventIn + '.' + this.type, this.options.selector, $.proxy(this.enter, this)) + this.$element.on(eventOut + '.' + this.type, this.options.selector, $.proxy(this.leave, this)) + } + } + + this.options.selector ? + (this._options = $.extend({}, this.options, { trigger: 'manual', selector: '' })) : + this.fixTitle() + } + + , getOptions: function (options) { + options = $.extend({}, $.fn[this.type].defaults, this.$element.data(), options) + + if (options.delay && typeof options.delay == 'number') { + options.delay = { + show: options.delay + , hide: options.delay + } + } + + return options + } + + , enter: function (e) { + var defaults = $.fn[this.type].defaults + , options = {} + , self + + this._options && $.each(this._options, function (key, value) { + if (defaults[key] != value) options[key] = value + }, this) + + self = $(e.currentTarget)[this.type](options).data(this.type) + + if (!self.options.delay || !self.options.delay.show) return self.show() + + clearTimeout(this.timeout) + self.hoverState = 'in' + this.timeout = setTimeout(function() { + if (self.hoverState == 'in') self.show() + }, self.options.delay.show) + } + + , leave: function (e) { + var self = $(e.currentTarget)[this.type](this._options).data(this.type) + + if (this.timeout) clearTimeout(this.timeout) + if (!self.options.delay || !self.options.delay.hide) return self.hide() + + self.hoverState = 'out' + this.timeout = setTimeout(function() { + if (self.hoverState == 'out') self.hide() + }, self.options.delay.hide) + } + + , show: function () { + var $tip + , pos + , actualWidth + , actualHeight + , placement + , tp + , e = $.Event('show') + + if (this.hasContent() && this.enabled) { + this.$element.trigger(e) + if (e.isDefaultPrevented()) return + $tip = this.tip() + this.setContent() + + if (this.options.animation) { + $tip.addClass('fade') + } + + placement = typeof this.options.placement == 'function' ? + this.options.placement.call(this, $tip[0], this.$element[0]) : + this.options.placement + + $tip + .detach() + .css({ top: 0, left: 0, display: 'block' }) + + this.options.container ? $tip.appendTo(this.options.container) : $tip.insertAfter(this.$element) + + pos = this.getPosition() + + actualWidth = $tip[0].offsetWidth + actualHeight = $tip[0].offsetHeight + + switch (placement) { + case 'bottom': + tp = {top: pos.top + pos.height, left: pos.left + pos.width / 2 - actualWidth / 2} + break + case 'top': + tp = {top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2} + break + case 'left': + tp = {top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth} + break + case 'right': + tp = {top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width} + break + } + + this.applyPlacement(tp, placement) + this.$element.trigger('shown') + } + } + + , applyPlacement: function(offset, placement){ + var $tip = this.tip() + , width = $tip[0].offsetWidth + , height = $tip[0].offsetHeight + , actualWidth + , actualHeight + , delta + , replace + + $tip + .offset(offset) + .addClass(placement) + .addClass('in') + + actualWidth = $tip[0].offsetWidth + actualHeight = $tip[0].offsetHeight + + if (placement == 'top' && actualHeight != height) { + offset.top = offset.top + height - actualHeight + replace = true + } + + if (placement == 'bottom' || placement == 'top') { + delta = 0 + + if (offset.left < 0){ + delta = offset.left * -2 + offset.left = 0 + $tip.offset(offset) + actualWidth = $tip[0].offsetWidth + actualHeight = $tip[0].offsetHeight + } + + this.replaceArrow(delta - width + actualWidth, actualWidth, 'left') + } else { + this.replaceArrow(actualHeight - height, actualHeight, 'top') + } + + if (replace) $tip.offset(offset) + } + + , replaceArrow: function(delta, dimension, position){ + this + .arrow() + .css(position, delta ? (50 * (1 - delta / dimension) + "%") : '') + } + + , setContent: function () { + var $tip = this.tip() + , title = this.getTitle() + + $tip.find('.tooltip-inner')[this.options.html ? 'html' : 'text'](title) + $tip.removeClass('fade in top bottom left right') + } + + , hide: function () { + var that = this + , $tip = this.tip() + , e = $.Event('hide') + + this.$element.trigger(e) + if (e.isDefaultPrevented()) return + + $tip.removeClass('in') + + function removeWithAnimation() { + var timeout = setTimeout(function () { + $tip.off($.support.transition.end).detach() + }, 500) + + $tip.one($.support.transition.end, function () { + clearTimeout(timeout) + $tip.detach() + }) + } + + $.support.transition && this.$tip.hasClass('fade') ? + removeWithAnimation() : + $tip.detach() + + this.$element.trigger('hidden') + + return this + } + + , fixTitle: function () { + var $e = this.$element + if ($e.attr('title') || typeof($e.attr('data-original-title')) != 'string') { + $e.attr('data-original-title', $e.attr('title') || '').attr('title', '') + } + } + + , hasContent: function () { + return this.getTitle() + } + + , getPosition: function () { + var el = this.$element[0] + return $.extend({}, (typeof el.getBoundingClientRect == 'function') ? el.getBoundingClientRect() : { + width: el.offsetWidth + , height: el.offsetHeight + }, this.$element.offset()) + } + + , getTitle: function () { + var title + , $e = this.$element + , o = this.options + + title = $e.attr('data-original-title') + || (typeof o.title == 'function' ? o.title.call($e[0]) : o.title) + + return title + } + + , tip: function () { + return this.$tip = this.$tip || $(this.options.template) + } + + , arrow: function(){ + return this.$arrow = this.$arrow || this.tip().find(".tooltip-arrow") + } + + , validate: function () { + if (!this.$element[0].parentNode) { + this.hide() + this.$element = null + this.options = null + } + } + + , enable: function () { + this.enabled = true + } + + , disable: function () { + this.enabled = false + } + + , toggleEnabled: function () { + this.enabled = !this.enabled + } + + , toggle: function (e) { + var self = e ? $(e.currentTarget)[this.type](this._options).data(this.type) : this + self.tip().hasClass('in') ? self.hide() : self.show() + } + + , destroy: function () { + this.hide().$element.off('.' + this.type).removeData(this.type) + } + + } + + + /* TOOLTIP PLUGIN DEFINITION + * ========================= */ + + var old = $.fn.tooltip + + $.fn.tooltip = function ( option ) { + return this.each(function () { + var $this = $(this) + , data = $this.data('tooltip') + , options = typeof option == 'object' && option + if (!data) $this.data('tooltip', (data = new Tooltip(this, options))) + if (typeof option == 'string') data[option]() + }) + } + + $.fn.tooltip.Constructor = Tooltip + + $.fn.tooltip.defaults = { + animation: true + , placement: 'top' + , selector: false + , template: '<div class="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>' + , trigger: 'hover focus' + , title: '' + , delay: 0 + , html: false + , container: false + } + + + /* TOOLTIP NO CONFLICT + * =================== */ + + $.fn.tooltip.noConflict = function () { + $.fn.tooltip = old + return this + } + +}(window.jQuery); diff --git a/tbc/static/js/bootstrap-transition.js b/tbc/static/js/bootstrap-transition.js new file mode 100755 index 0000000..c4fd401 --- /dev/null +++ b/tbc/static/js/bootstrap-transition.js @@ -0,0 +1,60 @@ +/* =================================================== + * bootstrap-transition.js v2.3.2 + * http://getbootstrap.com/2.3.2/javascript.html#transitions + * =================================================== + * Copyright 2013 Twitter, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ========================================================== */ + + +!function ($) { + + "use strict"; // jshint ;_; + + + /* CSS TRANSITION SUPPORT (http://www.modernizr.com/) + * ======================================================= */ + + $(function () { + + $.support.transition = (function () { + + var transitionEnd = (function () { + + var el = document.createElement('bootstrap') + , transEndEventNames = { + 'WebkitTransition' : 'webkitTransitionEnd' + , 'MozTransition' : 'transitionend' + , 'OTransition' : 'oTransitionEnd otransitionend' + , 'transition' : 'transitionend' + } + , name + + for (name in transEndEventNames){ + if (el.style[name] !== undefined) { + return transEndEventNames[name] + } + } + + }()) + + return transitionEnd && { + end: transitionEnd + } + + })() + + }) + +}(window.jQuery);
\ No newline at end of file diff --git a/tbc/static/js/bootstrap-typeahead.js b/tbc/static/js/bootstrap-typeahead.js new file mode 100755 index 0000000..9cc84d8 --- /dev/null +++ b/tbc/static/js/bootstrap-typeahead.js @@ -0,0 +1,335 @@ +/* ============================================================= + * bootstrap-typeahead.js v2.3.2 + * http://getbootstrap.com/2.3.2/javascript.html#typeahead + * ============================================================= + * Copyright 2013 Twitter, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================ */ + + +!function($){ + + "use strict"; // jshint ;_; + + + /* TYPEAHEAD PUBLIC CLASS DEFINITION + * ================================= */ + + var Typeahead = function (element, options) { + this.$element = $(element) + this.options = $.extend({}, $.fn.typeahead.defaults, options) + this.matcher = this.options.matcher || this.matcher + this.sorter = this.options.sorter || this.sorter + this.highlighter = this.options.highlighter || this.highlighter + this.updater = this.options.updater || this.updater + this.source = this.options.source + this.$menu = $(this.options.menu) + this.shown = false + this.listen() + } + + Typeahead.prototype = { + + constructor: Typeahead + + , select: function () { + var val = this.$menu.find('.active').attr('data-value') + this.$element + .val(this.updater(val)) + .change() + return this.hide() + } + + , updater: function (item) { + return item + } + + , show: function () { + var pos = $.extend({}, this.$element.position(), { + height: this.$element[0].offsetHeight + }) + + this.$menu + .insertAfter(this.$element) + .css({ + top: pos.top + pos.height + , left: pos.left + }) + .show() + + this.shown = true + return this + } + + , hide: function () { + this.$menu.hide() + this.shown = false + return this + } + + , lookup: function (event) { + var items + + this.query = this.$element.val() + + if (!this.query || this.query.length < this.options.minLength) { + return this.shown ? this.hide() : this + } + + items = $.isFunction(this.source) ? this.source(this.query, $.proxy(this.process, this)) : this.source + + return items ? this.process(items) : this + } + + , process: function (items) { + var that = this + + items = $.grep(items, function (item) { + return that.matcher(item) + }) + + items = this.sorter(items) + + if (!items.length) { + return this.shown ? this.hide() : this + } + + return this.render(items.slice(0, this.options.items)).show() + } + + , matcher: function (item) { + return ~item.toLowerCase().indexOf(this.query.toLowerCase()) + } + + , sorter: function (items) { + var beginswith = [] + , caseSensitive = [] + , caseInsensitive = [] + , item + + while (item = items.shift()) { + if (!item.toLowerCase().indexOf(this.query.toLowerCase())) beginswith.push(item) + else if (~item.indexOf(this.query)) caseSensitive.push(item) + else caseInsensitive.push(item) + } + + return beginswith.concat(caseSensitive, caseInsensitive) + } + + , highlighter: function (item) { + var query = this.query.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g, '\\$&') + return item.replace(new RegExp('(' + query + ')', 'ig'), function ($1, match) { + return '<strong>' + match + '</strong>' + }) + } + + , render: function (items) { + var that = this + + items = $(items).map(function (i, item) { + i = $(that.options.item).attr('data-value', item) + i.find('a').html(that.highlighter(item)) + return i[0] + }) + + items.first().addClass('active') + this.$menu.html(items) + return this + } + + , next: function (event) { + var active = this.$menu.find('.active').removeClass('active') + , next = active.next() + + if (!next.length) { + next = $(this.$menu.find('li')[0]) + } + + next.addClass('active') + } + + , prev: function (event) { + var active = this.$menu.find('.active').removeClass('active') + , prev = active.prev() + + if (!prev.length) { + prev = this.$menu.find('li').last() + } + + prev.addClass('active') + } + + , listen: function () { + this.$element + .on('focus', $.proxy(this.focus, this)) + .on('blur', $.proxy(this.blur, this)) + .on('keypress', $.proxy(this.keypress, this)) + .on('keyup', $.proxy(this.keyup, this)) + + if (this.eventSupported('keydown')) { + this.$element.on('keydown', $.proxy(this.keydown, this)) + } + + this.$menu + .on('click', $.proxy(this.click, this)) + .on('mouseenter', 'li', $.proxy(this.mouseenter, this)) + .on('mouseleave', 'li', $.proxy(this.mouseleave, this)) + } + + , eventSupported: function(eventName) { + var isSupported = eventName in this.$element + if (!isSupported) { + this.$element.setAttribute(eventName, 'return;') + isSupported = typeof this.$element[eventName] === 'function' + } + return isSupported + } + + , move: function (e) { + if (!this.shown) return + + switch(e.keyCode) { + case 9: // tab + case 13: // enter + case 27: // escape + e.preventDefault() + break + + case 38: // up arrow + e.preventDefault() + this.prev() + break + + case 40: // down arrow + e.preventDefault() + this.next() + break + } + + e.stopPropagation() + } + + , keydown: function (e) { + this.suppressKeyPressRepeat = ~$.inArray(e.keyCode, [40,38,9,13,27]) + this.move(e) + } + + , keypress: function (e) { + if (this.suppressKeyPressRepeat) return + this.move(e) + } + + , keyup: function (e) { + switch(e.keyCode) { + case 40: // down arrow + case 38: // up arrow + case 16: // shift + case 17: // ctrl + case 18: // alt + break + + case 9: // tab + case 13: // enter + if (!this.shown) return + this.select() + break + + case 27: // escape + if (!this.shown) return + this.hide() + break + + default: + this.lookup() + } + + e.stopPropagation() + e.preventDefault() + } + + , focus: function (e) { + this.focused = true + } + + , blur: function (e) { + this.focused = false + if (!this.mousedover && this.shown) this.hide() + } + + , click: function (e) { + e.stopPropagation() + e.preventDefault() + this.select() + this.$element.focus() + } + + , mouseenter: function (e) { + this.mousedover = true + this.$menu.find('.active').removeClass('active') + $(e.currentTarget).addClass('active') + } + + , mouseleave: function (e) { + this.mousedover = false + if (!this.focused && this.shown) this.hide() + } + + } + + + /* TYPEAHEAD PLUGIN DEFINITION + * =========================== */ + + var old = $.fn.typeahead + + $.fn.typeahead = function (option) { + return this.each(function () { + var $this = $(this) + , data = $this.data('typeahead') + , options = typeof option == 'object' && option + if (!data) $this.data('typeahead', (data = new Typeahead(this, options))) + if (typeof option == 'string') data[option]() + }) + } + + $.fn.typeahead.defaults = { + source: [] + , items: 8 + , menu: '<ul class="typeahead dropdown-menu"></ul>' + , item: '<li><a href="#"></a></li>' + , minLength: 1 + } + + $.fn.typeahead.Constructor = Typeahead + + + /* TYPEAHEAD NO CONFLICT + * =================== */ + + $.fn.typeahead.noConflict = function () { + $.fn.typeahead = old + return this + } + + + /* TYPEAHEAD DATA-API + * ================== */ + + $(document).on('focus.typeahead.data-api', '[data-provide="typeahead"]', function (e) { + var $this = $(this) + if ($this.data('typeahead')) return + $this.typeahead($this.data()) + }) + +}(window.jQuery); diff --git a/tbc/static/js/jquery.js b/tbc/static/js/jquery.js new file mode 100755 index 0000000..006e953 --- /dev/null +++ b/tbc/static/js/jquery.js @@ -0,0 +1,5 @@ +/*! jQuery v1.9.1 | (c) 2005, 2012 jQuery Foundation, Inc. | jquery.org/license +//@ sourceMappingURL=jquery.min.map +*/(function(e,t){var n,r,i=typeof t,o=e.document,a=e.location,s=e.jQuery,u=e.$,l={},c=[],p="1.9.1",f=c.concat,d=c.push,h=c.slice,g=c.indexOf,m=l.toString,y=l.hasOwnProperty,v=p.trim,b=function(e,t){return new b.fn.init(e,t,r)},x=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,w=/\S+/g,T=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,N=/^(?:(<[\w\W]+>)[^>]*|#([\w-]*))$/,C=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,k=/^[\],:{}\s]*$/,E=/(?:^|:|,)(?:\s*\[)+/g,S=/\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,A=/"[^"\\\r\n]*"|true|false|null|-?(?:\d+\.|)\d+(?:[eE][+-]?\d+|)/g,j=/^-ms-/,D=/-([\da-z])/gi,L=function(e,t){return t.toUpperCase()},H=function(e){(o.addEventListener||"load"===e.type||"complete"===o.readyState)&&(q(),b.ready())},q=function(){o.addEventListener?(o.removeEventListener("DOMContentLoaded",H,!1),e.removeEventListener("load",H,!1)):(o.detachEvent("onreadystatechange",H),e.detachEvent("onload",H))};b.fn=b.prototype={jquery:p,constructor:b,init:function(e,n,r){var i,a;if(!e)return this;if("string"==typeof e){if(i="<"===e.charAt(0)&&">"===e.charAt(e.length-1)&&e.length>=3?[null,e,null]:N.exec(e),!i||!i[1]&&n)return!n||n.jquery?(n||r).find(e):this.constructor(n).find(e);if(i[1]){if(n=n instanceof b?n[0]:n,b.merge(this,b.parseHTML(i[1],n&&n.nodeType?n.ownerDocument||n:o,!0)),C.test(i[1])&&b.isPlainObject(n))for(i in n)b.isFunction(this[i])?this[i](n[i]):this.attr(i,n[i]);return this}if(a=o.getElementById(i[2]),a&&a.parentNode){if(a.id!==i[2])return r.find(e);this.length=1,this[0]=a}return this.context=o,this.selector=e,this}return e.nodeType?(this.context=this[0]=e,this.length=1,this):b.isFunction(e)?r.ready(e):(e.selector!==t&&(this.selector=e.selector,this.context=e.context),b.makeArray(e,this))},selector:"",length:0,size:function(){return this.length},toArray:function(){return h.call(this)},get:function(e){return null==e?this.toArray():0>e?this[this.length+e]:this[e]},pushStack:function(e){var t=b.merge(this.constructor(),e);return t.prevObject=this,t.context=this.context,t},each:function(e,t){return b.each(this,e,t)},ready:function(e){return b.ready.promise().done(e),this},slice:function(){return this.pushStack(h.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(e){var t=this.length,n=+e+(0>e?t:0);return this.pushStack(n>=0&&t>n?[this[n]]:[])},map:function(e){return this.pushStack(b.map(this,function(t,n){return e.call(t,n,t)}))},end:function(){return this.prevObject||this.constructor(null)},push:d,sort:[].sort,splice:[].splice},b.fn.init.prototype=b.fn,b.extend=b.fn.extend=function(){var e,n,r,i,o,a,s=arguments[0]||{},u=1,l=arguments.length,c=!1;for("boolean"==typeof s&&(c=s,s=arguments[1]||{},u=2),"object"==typeof s||b.isFunction(s)||(s={}),l===u&&(s=this,--u);l>u;u++)if(null!=(o=arguments[u]))for(i in o)e=s[i],r=o[i],s!==r&&(c&&r&&(b.isPlainObject(r)||(n=b.isArray(r)))?(n?(n=!1,a=e&&b.isArray(e)?e:[]):a=e&&b.isPlainObject(e)?e:{},s[i]=b.extend(c,a,r)):r!==t&&(s[i]=r));return s},b.extend({noConflict:function(t){return e.$===b&&(e.$=u),t&&e.jQuery===b&&(e.jQuery=s),b},isReady:!1,readyWait:1,holdReady:function(e){e?b.readyWait++:b.ready(!0)},ready:function(e){if(e===!0?!--b.readyWait:!b.isReady){if(!o.body)return setTimeout(b.ready);b.isReady=!0,e!==!0&&--b.readyWait>0||(n.resolveWith(o,[b]),b.fn.trigger&&b(o).trigger("ready").off("ready"))}},isFunction:function(e){return"function"===b.type(e)},isArray:Array.isArray||function(e){return"array"===b.type(e)},isWindow:function(e){return null!=e&&e==e.window},isNumeric:function(e){return!isNaN(parseFloat(e))&&isFinite(e)},type:function(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?l[m.call(e)]||"object":typeof e},isPlainObject:function(e){if(!e||"object"!==b.type(e)||e.nodeType||b.isWindow(e))return!1;try{if(e.constructor&&!y.call(e,"constructor")&&!y.call(e.constructor.prototype,"isPrototypeOf"))return!1}catch(n){return!1}var r;for(r in e);return r===t||y.call(e,r)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},error:function(e){throw Error(e)},parseHTML:function(e,t,n){if(!e||"string"!=typeof e)return null;"boolean"==typeof t&&(n=t,t=!1),t=t||o;var r=C.exec(e),i=!n&&[];return r?[t.createElement(r[1])]:(r=b.buildFragment([e],t,i),i&&b(i).remove(),b.merge([],r.childNodes))},parseJSON:function(n){return e.JSON&&e.JSON.parse?e.JSON.parse(n):null===n?n:"string"==typeof n&&(n=b.trim(n),n&&k.test(n.replace(S,"@").replace(A,"]").replace(E,"")))?Function("return "+n)():(b.error("Invalid JSON: "+n),t)},parseXML:function(n){var r,i;if(!n||"string"!=typeof n)return null;try{e.DOMParser?(i=new DOMParser,r=i.parseFromString(n,"text/xml")):(r=new ActiveXObject("Microsoft.XMLDOM"),r.async="false",r.loadXML(n))}catch(o){r=t}return r&&r.documentElement&&!r.getElementsByTagName("parsererror").length||b.error("Invalid XML: "+n),r},noop:function(){},globalEval:function(t){t&&b.trim(t)&&(e.execScript||function(t){e.eval.call(e,t)})(t)},camelCase:function(e){return e.replace(j,"ms-").replace(D,L)},nodeName:function(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()},each:function(e,t,n){var r,i=0,o=e.length,a=M(e);if(n){if(a){for(;o>i;i++)if(r=t.apply(e[i],n),r===!1)break}else for(i in e)if(r=t.apply(e[i],n),r===!1)break}else if(a){for(;o>i;i++)if(r=t.call(e[i],i,e[i]),r===!1)break}else for(i in e)if(r=t.call(e[i],i,e[i]),r===!1)break;return e},trim:v&&!v.call("\ufeff\u00a0")?function(e){return null==e?"":v.call(e)}:function(e){return null==e?"":(e+"").replace(T,"")},makeArray:function(e,t){var n=t||[];return null!=e&&(M(Object(e))?b.merge(n,"string"==typeof e?[e]:e):d.call(n,e)),n},inArray:function(e,t,n){var r;if(t){if(g)return g.call(t,e,n);for(r=t.length,n=n?0>n?Math.max(0,r+n):n:0;r>n;n++)if(n in t&&t[n]===e)return n}return-1},merge:function(e,n){var r=n.length,i=e.length,o=0;if("number"==typeof r)for(;r>o;o++)e[i++]=n[o];else while(n[o]!==t)e[i++]=n[o++];return e.length=i,e},grep:function(e,t,n){var r,i=[],o=0,a=e.length;for(n=!!n;a>o;o++)r=!!t(e[o],o),n!==r&&i.push(e[o]);return i},map:function(e,t,n){var r,i=0,o=e.length,a=M(e),s=[];if(a)for(;o>i;i++)r=t(e[i],i,n),null!=r&&(s[s.length]=r);else for(i in e)r=t(e[i],i,n),null!=r&&(s[s.length]=r);return f.apply([],s)},guid:1,proxy:function(e,n){var r,i,o;return"string"==typeof n&&(o=e[n],n=e,e=o),b.isFunction(e)?(r=h.call(arguments,2),i=function(){return e.apply(n||this,r.concat(h.call(arguments)))},i.guid=e.guid=e.guid||b.guid++,i):t},access:function(e,n,r,i,o,a,s){var u=0,l=e.length,c=null==r;if("object"===b.type(r)){o=!0;for(u in r)b.access(e,n,u,r[u],!0,a,s)}else if(i!==t&&(o=!0,b.isFunction(i)||(s=!0),c&&(s?(n.call(e,i),n=null):(c=n,n=function(e,t,n){return c.call(b(e),n)})),n))for(;l>u;u++)n(e[u],r,s?i:i.call(e[u],u,n(e[u],r)));return o?e:c?n.call(e):l?n(e[0],r):a},now:function(){return(new Date).getTime()}}),b.ready.promise=function(t){if(!n)if(n=b.Deferred(),"complete"===o.readyState)setTimeout(b.ready);else if(o.addEventListener)o.addEventListener("DOMContentLoaded",H,!1),e.addEventListener("load",H,!1);else{o.attachEvent("onreadystatechange",H),e.attachEvent("onload",H);var r=!1;try{r=null==e.frameElement&&o.documentElement}catch(i){}r&&r.doScroll&&function a(){if(!b.isReady){try{r.doScroll("left")}catch(e){return setTimeout(a,50)}q(),b.ready()}}()}return n.promise(t)},b.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(e,t){l["[object "+t+"]"]=t.toLowerCase()});function M(e){var t=e.length,n=b.type(e);return b.isWindow(e)?!1:1===e.nodeType&&t?!0:"array"===n||"function"!==n&&(0===t||"number"==typeof t&&t>0&&t-1 in e)}r=b(o);var _={};function F(e){var t=_[e]={};return b.each(e.match(w)||[],function(e,n){t[n]=!0}),t}b.Callbacks=function(e){e="string"==typeof e?_[e]||F(e):b.extend({},e);var n,r,i,o,a,s,u=[],l=!e.once&&[],c=function(t){for(r=e.memory&&t,i=!0,a=s||0,s=0,o=u.length,n=!0;u&&o>a;a++)if(u[a].apply(t[0],t[1])===!1&&e.stopOnFalse){r=!1;break}n=!1,u&&(l?l.length&&c(l.shift()):r?u=[]:p.disable())},p={add:function(){if(u){var t=u.length;(function i(t){b.each(t,function(t,n){var r=b.type(n);"function"===r?e.unique&&p.has(n)||u.push(n):n&&n.length&&"string"!==r&&i(n)})})(arguments),n?o=u.length:r&&(s=t,c(r))}return this},remove:function(){return u&&b.each(arguments,function(e,t){var r;while((r=b.inArray(t,u,r))>-1)u.splice(r,1),n&&(o>=r&&o--,a>=r&&a--)}),this},has:function(e){return e?b.inArray(e,u)>-1:!(!u||!u.length)},empty:function(){return u=[],this},disable:function(){return u=l=r=t,this},disabled:function(){return!u},lock:function(){return l=t,r||p.disable(),this},locked:function(){return!l},fireWith:function(e,t){return t=t||[],t=[e,t.slice?t.slice():t],!u||i&&!l||(n?l.push(t):c(t)),this},fire:function(){return p.fireWith(this,arguments),this},fired:function(){return!!i}};return p},b.extend({Deferred:function(e){var t=[["resolve","done",b.Callbacks("once memory"),"resolved"],["reject","fail",b.Callbacks("once memory"),"rejected"],["notify","progress",b.Callbacks("memory")]],n="pending",r={state:function(){return n},always:function(){return i.done(arguments).fail(arguments),this},then:function(){var e=arguments;return b.Deferred(function(n){b.each(t,function(t,o){var a=o[0],s=b.isFunction(e[t])&&e[t];i[o[1]](function(){var e=s&&s.apply(this,arguments);e&&b.isFunction(e.promise)?e.promise().done(n.resolve).fail(n.reject).progress(n.notify):n[a+"With"](this===r?n.promise():this,s?[e]:arguments)})}),e=null}).promise()},promise:function(e){return null!=e?b.extend(e,r):r}},i={};return r.pipe=r.then,b.each(t,function(e,o){var a=o[2],s=o[3];r[o[1]]=a.add,s&&a.add(function(){n=s},t[1^e][2].disable,t[2][2].lock),i[o[0]]=function(){return i[o[0]+"With"](this===i?r:this,arguments),this},i[o[0]+"With"]=a.fireWith}),r.promise(i),e&&e.call(i,i),i},when:function(e){var t=0,n=h.call(arguments),r=n.length,i=1!==r||e&&b.isFunction(e.promise)?r:0,o=1===i?e:b.Deferred(),a=function(e,t,n){return function(r){t[e]=this,n[e]=arguments.length>1?h.call(arguments):r,n===s?o.notifyWith(t,n):--i||o.resolveWith(t,n)}},s,u,l;if(r>1)for(s=Array(r),u=Array(r),l=Array(r);r>t;t++)n[t]&&b.isFunction(n[t].promise)?n[t].promise().done(a(t,l,n)).fail(o.reject).progress(a(t,u,s)):--i;return i||o.resolveWith(l,n),o.promise()}}),b.support=function(){var t,n,r,a,s,u,l,c,p,f,d=o.createElement("div");if(d.setAttribute("className","t"),d.innerHTML=" <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",n=d.getElementsByTagName("*"),r=d.getElementsByTagName("a")[0],!n||!r||!n.length)return{};s=o.createElement("select"),l=s.appendChild(o.createElement("option")),a=d.getElementsByTagName("input")[0],r.style.cssText="top:1px;float:left;opacity:.5",t={getSetAttribute:"t"!==d.className,leadingWhitespace:3===d.firstChild.nodeType,tbody:!d.getElementsByTagName("tbody").length,htmlSerialize:!!d.getElementsByTagName("link").length,style:/top/.test(r.getAttribute("style")),hrefNormalized:"/a"===r.getAttribute("href"),opacity:/^0.5/.test(r.style.opacity),cssFloat:!!r.style.cssFloat,checkOn:!!a.value,optSelected:l.selected,enctype:!!o.createElement("form").enctype,html5Clone:"<:nav></:nav>"!==o.createElement("nav").cloneNode(!0).outerHTML,boxModel:"CSS1Compat"===o.compatMode,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0,boxSizingReliable:!0,pixelPosition:!1},a.checked=!0,t.noCloneChecked=a.cloneNode(!0).checked,s.disabled=!0,t.optDisabled=!l.disabled;try{delete d.test}catch(h){t.deleteExpando=!1}a=o.createElement("input"),a.setAttribute("value",""),t.input=""===a.getAttribute("value"),a.value="t",a.setAttribute("type","radio"),t.radioValue="t"===a.value,a.setAttribute("checked","t"),a.setAttribute("name","t"),u=o.createDocumentFragment(),u.appendChild(a),t.appendChecked=a.checked,t.checkClone=u.cloneNode(!0).cloneNode(!0).lastChild.checked,d.attachEvent&&(d.attachEvent("onclick",function(){t.noCloneEvent=!1}),d.cloneNode(!0).click());for(f in{submit:!0,change:!0,focusin:!0})d.setAttribute(c="on"+f,"t"),t[f+"Bubbles"]=c in e||d.attributes[c].expando===!1;return d.style.backgroundClip="content-box",d.cloneNode(!0).style.backgroundClip="",t.clearCloneStyle="content-box"===d.style.backgroundClip,b(function(){var n,r,a,s="padding:0;margin:0;border:0;display:block;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;",u=o.getElementsByTagName("body")[0];u&&(n=o.createElement("div"),n.style.cssText="border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px",u.appendChild(n).appendChild(d),d.innerHTML="<table><tr><td></td><td>t</td></tr></table>",a=d.getElementsByTagName("td"),a[0].style.cssText="padding:0;margin:0;border:0;display:none",p=0===a[0].offsetHeight,a[0].style.display="",a[1].style.display="none",t.reliableHiddenOffsets=p&&0===a[0].offsetHeight,d.innerHTML="",d.style.cssText="box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;",t.boxSizing=4===d.offsetWidth,t.doesNotIncludeMarginInBodyOffset=1!==u.offsetTop,e.getComputedStyle&&(t.pixelPosition="1%"!==(e.getComputedStyle(d,null)||{}).top,t.boxSizingReliable="4px"===(e.getComputedStyle(d,null)||{width:"4px"}).width,r=d.appendChild(o.createElement("div")),r.style.cssText=d.style.cssText=s,r.style.marginRight=r.style.width="0",d.style.width="1px",t.reliableMarginRight=!parseFloat((e.getComputedStyle(r,null)||{}).marginRight)),typeof d.style.zoom!==i&&(d.innerHTML="",d.style.cssText=s+"width:1px;padding:1px;display:inline;zoom:1",t.inlineBlockNeedsLayout=3===d.offsetWidth,d.style.display="block",d.innerHTML="<div></div>",d.firstChild.style.width="5px",t.shrinkWrapBlocks=3!==d.offsetWidth,t.inlineBlockNeedsLayout&&(u.style.zoom=1)),u.removeChild(n),n=d=a=r=null)}),n=s=u=l=r=a=null,t}();var O=/(?:\{[\s\S]*\}|\[[\s\S]*\])$/,B=/([A-Z])/g;function P(e,n,r,i){if(b.acceptData(e)){var o,a,s=b.expando,u="string"==typeof n,l=e.nodeType,p=l?b.cache:e,f=l?e[s]:e[s]&&s;if(f&&p[f]&&(i||p[f].data)||!u||r!==t)return f||(l?e[s]=f=c.pop()||b.guid++:f=s),p[f]||(p[f]={},l||(p[f].toJSON=b.noop)),("object"==typeof n||"function"==typeof n)&&(i?p[f]=b.extend(p[f],n):p[f].data=b.extend(p[f].data,n)),o=p[f],i||(o.data||(o.data={}),o=o.data),r!==t&&(o[b.camelCase(n)]=r),u?(a=o[n],null==a&&(a=o[b.camelCase(n)])):a=o,a}}function R(e,t,n){if(b.acceptData(e)){var r,i,o,a=e.nodeType,s=a?b.cache:e,u=a?e[b.expando]:b.expando;if(s[u]){if(t&&(o=n?s[u]:s[u].data)){b.isArray(t)?t=t.concat(b.map(t,b.camelCase)):t in o?t=[t]:(t=b.camelCase(t),t=t in o?[t]:t.split(" "));for(r=0,i=t.length;i>r;r++)delete o[t[r]];if(!(n?$:b.isEmptyObject)(o))return}(n||(delete s[u].data,$(s[u])))&&(a?b.cleanData([e],!0):b.support.deleteExpando||s!=s.window?delete s[u]:s[u]=null)}}}b.extend({cache:{},expando:"jQuery"+(p+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(e){return e=e.nodeType?b.cache[e[b.expando]]:e[b.expando],!!e&&!$(e)},data:function(e,t,n){return P(e,t,n)},removeData:function(e,t){return R(e,t)},_data:function(e,t,n){return P(e,t,n,!0)},_removeData:function(e,t){return R(e,t,!0)},acceptData:function(e){if(e.nodeType&&1!==e.nodeType&&9!==e.nodeType)return!1;var t=e.nodeName&&b.noData[e.nodeName.toLowerCase()];return!t||t!==!0&&e.getAttribute("classid")===t}}),b.fn.extend({data:function(e,n){var r,i,o=this[0],a=0,s=null;if(e===t){if(this.length&&(s=b.data(o),1===o.nodeType&&!b._data(o,"parsedAttrs"))){for(r=o.attributes;r.length>a;a++)i=r[a].name,i.indexOf("data-")||(i=b.camelCase(i.slice(5)),W(o,i,s[i]));b._data(o,"parsedAttrs",!0)}return s}return"object"==typeof e?this.each(function(){b.data(this,e)}):b.access(this,function(n){return n===t?o?W(o,e,b.data(o,e)):null:(this.each(function(){b.data(this,e,n)}),t)},null,n,arguments.length>1,null,!0)},removeData:function(e){return this.each(function(){b.removeData(this,e)})}});function W(e,n,r){if(r===t&&1===e.nodeType){var i="data-"+n.replace(B,"-$1").toLowerCase();if(r=e.getAttribute(i),"string"==typeof r){try{r="true"===r?!0:"false"===r?!1:"null"===r?null:+r+""===r?+r:O.test(r)?b.parseJSON(r):r}catch(o){}b.data(e,n,r)}else r=t}return r}function $(e){var t;for(t in e)if(("data"!==t||!b.isEmptyObject(e[t]))&&"toJSON"!==t)return!1;return!0}b.extend({queue:function(e,n,r){var i;return e?(n=(n||"fx")+"queue",i=b._data(e,n),r&&(!i||b.isArray(r)?i=b._data(e,n,b.makeArray(r)):i.push(r)),i||[]):t},dequeue:function(e,t){t=t||"fx";var n=b.queue(e,t),r=n.length,i=n.shift(),o=b._queueHooks(e,t),a=function(){b.dequeue(e,t)};"inprogress"===i&&(i=n.shift(),r--),o.cur=i,i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,a,o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return b._data(e,n)||b._data(e,n,{empty:b.Callbacks("once memory").add(function(){b._removeData(e,t+"queue"),b._removeData(e,n)})})}}),b.fn.extend({queue:function(e,n){var r=2;return"string"!=typeof e&&(n=e,e="fx",r--),r>arguments.length?b.queue(this[0],e):n===t?this:this.each(function(){var t=b.queue(this,e,n);b._queueHooks(this,e),"fx"===e&&"inprogress"!==t[0]&&b.dequeue(this,e)})},dequeue:function(e){return this.each(function(){b.dequeue(this,e)})},delay:function(e,t){return e=b.fx?b.fx.speeds[e]||e:e,t=t||"fx",this.queue(t,function(t,n){var r=setTimeout(t,e);n.stop=function(){clearTimeout(r)}})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,n){var r,i=1,o=b.Deferred(),a=this,s=this.length,u=function(){--i||o.resolveWith(a,[a])};"string"!=typeof e&&(n=e,e=t),e=e||"fx";while(s--)r=b._data(a[s],e+"queueHooks"),r&&r.empty&&(i++,r.empty.add(u));return u(),o.promise(n)}});var I,z,X=/[\t\r\n]/g,U=/\r/g,V=/^(?:input|select|textarea|button|object)$/i,Y=/^(?:a|area)$/i,J=/^(?:checked|selected|autofocus|autoplay|async|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped)$/i,G=/^(?:checked|selected)$/i,Q=b.support.getSetAttribute,K=b.support.input;b.fn.extend({attr:function(e,t){return b.access(this,b.attr,e,t,arguments.length>1)},removeAttr:function(e){return this.each(function(){b.removeAttr(this,e)})},prop:function(e,t){return b.access(this,b.prop,e,t,arguments.length>1)},removeProp:function(e){return e=b.propFix[e]||e,this.each(function(){try{this[e]=t,delete this[e]}catch(n){}})},addClass:function(e){var t,n,r,i,o,a=0,s=this.length,u="string"==typeof e&&e;if(b.isFunction(e))return this.each(function(t){b(this).addClass(e.call(this,t,this.className))});if(u)for(t=(e||"").match(w)||[];s>a;a++)if(n=this[a],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(X," "):" ")){o=0;while(i=t[o++])0>r.indexOf(" "+i+" ")&&(r+=i+" ");n.className=b.trim(r)}return this},removeClass:function(e){var t,n,r,i,o,a=0,s=this.length,u=0===arguments.length||"string"==typeof e&&e;if(b.isFunction(e))return this.each(function(t){b(this).removeClass(e.call(this,t,this.className))});if(u)for(t=(e||"").match(w)||[];s>a;a++)if(n=this[a],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(X," "):"")){o=0;while(i=t[o++])while(r.indexOf(" "+i+" ")>=0)r=r.replace(" "+i+" "," ");n.className=e?b.trim(r):""}return this},toggleClass:function(e,t){var n=typeof e,r="boolean"==typeof t;return b.isFunction(e)?this.each(function(n){b(this).toggleClass(e.call(this,n,this.className,t),t)}):this.each(function(){if("string"===n){var o,a=0,s=b(this),u=t,l=e.match(w)||[];while(o=l[a++])u=r?u:!s.hasClass(o),s[u?"addClass":"removeClass"](o)}else(n===i||"boolean"===n)&&(this.className&&b._data(this,"__className__",this.className),this.className=this.className||e===!1?"":b._data(this,"__className__")||"")})},hasClass:function(e){var t=" "+e+" ",n=0,r=this.length;for(;r>n;n++)if(1===this[n].nodeType&&(" "+this[n].className+" ").replace(X," ").indexOf(t)>=0)return!0;return!1},val:function(e){var n,r,i,o=this[0];{if(arguments.length)return i=b.isFunction(e),this.each(function(n){var o,a=b(this);1===this.nodeType&&(o=i?e.call(this,n,a.val()):e,null==o?o="":"number"==typeof o?o+="":b.isArray(o)&&(o=b.map(o,function(e){return null==e?"":e+""})),r=b.valHooks[this.type]||b.valHooks[this.nodeName.toLowerCase()],r&&"set"in r&&r.set(this,o,"value")!==t||(this.value=o))});if(o)return r=b.valHooks[o.type]||b.valHooks[o.nodeName.toLowerCase()],r&&"get"in r&&(n=r.get(o,"value"))!==t?n:(n=o.value,"string"==typeof n?n.replace(U,""):null==n?"":n)}}}),b.extend({valHooks:{option:{get:function(e){var t=e.attributes.value;return!t||t.specified?e.value:e.text}},select:{get:function(e){var t,n,r=e.options,i=e.selectedIndex,o="select-one"===e.type||0>i,a=o?null:[],s=o?i+1:r.length,u=0>i?s:o?i:0;for(;s>u;u++)if(n=r[u],!(!n.selected&&u!==i||(b.support.optDisabled?n.disabled:null!==n.getAttribute("disabled"))||n.parentNode.disabled&&b.nodeName(n.parentNode,"optgroup"))){if(t=b(n).val(),o)return t;a.push(t)}return a},set:function(e,t){var n=b.makeArray(t);return b(e).find("option").each(function(){this.selected=b.inArray(b(this).val(),n)>=0}),n.length||(e.selectedIndex=-1),n}}},attr:function(e,n,r){var o,a,s,u=e.nodeType;if(e&&3!==u&&8!==u&&2!==u)return typeof e.getAttribute===i?b.prop(e,n,r):(a=1!==u||!b.isXMLDoc(e),a&&(n=n.toLowerCase(),o=b.attrHooks[n]||(J.test(n)?z:I)),r===t?o&&a&&"get"in o&&null!==(s=o.get(e,n))?s:(typeof e.getAttribute!==i&&(s=e.getAttribute(n)),null==s?t:s):null!==r?o&&a&&"set"in o&&(s=o.set(e,r,n))!==t?s:(e.setAttribute(n,r+""),r):(b.removeAttr(e,n),t))},removeAttr:function(e,t){var n,r,i=0,o=t&&t.match(w);if(o&&1===e.nodeType)while(n=o[i++])r=b.propFix[n]||n,J.test(n)?!Q&&G.test(n)?e[b.camelCase("default-"+n)]=e[r]=!1:e[r]=!1:b.attr(e,n,""),e.removeAttribute(Q?n:r)},attrHooks:{type:{set:function(e,t){if(!b.support.radioValue&&"radio"===t&&b.nodeName(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},propFix:{tabindex:"tabIndex",readonly:"readOnly","for":"htmlFor","class":"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},prop:function(e,n,r){var i,o,a,s=e.nodeType;if(e&&3!==s&&8!==s&&2!==s)return a=1!==s||!b.isXMLDoc(e),a&&(n=b.propFix[n]||n,o=b.propHooks[n]),r!==t?o&&"set"in o&&(i=o.set(e,r,n))!==t?i:e[n]=r:o&&"get"in o&&null!==(i=o.get(e,n))?i:e[n]},propHooks:{tabIndex:{get:function(e){var n=e.getAttributeNode("tabindex");return n&&n.specified?parseInt(n.value,10):V.test(e.nodeName)||Y.test(e.nodeName)&&e.href?0:t}}}}),z={get:function(e,n){var r=b.prop(e,n),i="boolean"==typeof r&&e.getAttribute(n),o="boolean"==typeof r?K&&Q?null!=i:G.test(n)?e[b.camelCase("default-"+n)]:!!i:e.getAttributeNode(n);return o&&o.value!==!1?n.toLowerCase():t},set:function(e,t,n){return t===!1?b.removeAttr(e,n):K&&Q||!G.test(n)?e.setAttribute(!Q&&b.propFix[n]||n,n):e[b.camelCase("default-"+n)]=e[n]=!0,n}},K&&Q||(b.attrHooks.value={get:function(e,n){var r=e.getAttributeNode(n);return b.nodeName(e,"input")?e.defaultValue:r&&r.specified?r.value:t},set:function(e,n,r){return b.nodeName(e,"input")?(e.defaultValue=n,t):I&&I.set(e,n,r)}}),Q||(I=b.valHooks.button={get:function(e,n){var r=e.getAttributeNode(n);return r&&("id"===n||"name"===n||"coords"===n?""!==r.value:r.specified)?r.value:t},set:function(e,n,r){var i=e.getAttributeNode(r);return i||e.setAttributeNode(i=e.ownerDocument.createAttribute(r)),i.value=n+="","value"===r||n===e.getAttribute(r)?n:t}},b.attrHooks.contenteditable={get:I.get,set:function(e,t,n){I.set(e,""===t?!1:t,n)}},b.each(["width","height"],function(e,n){b.attrHooks[n]=b.extend(b.attrHooks[n],{set:function(e,r){return""===r?(e.setAttribute(n,"auto"),r):t}})})),b.support.hrefNormalized||(b.each(["href","src","width","height"],function(e,n){b.attrHooks[n]=b.extend(b.attrHooks[n],{get:function(e){var r=e.getAttribute(n,2);return null==r?t:r}})}),b.each(["href","src"],function(e,t){b.propHooks[t]={get:function(e){return e.getAttribute(t,4)}}})),b.support.style||(b.attrHooks.style={get:function(e){return e.style.cssText||t},set:function(e,t){return e.style.cssText=t+""}}),b.support.optSelected||(b.propHooks.selected=b.extend(b.propHooks.selected,{get:function(e){var t=e.parentNode;return t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex),null}})),b.support.enctype||(b.propFix.enctype="encoding"),b.support.checkOn||b.each(["radio","checkbox"],function(){b.valHooks[this]={get:function(e){return null===e.getAttribute("value")?"on":e.value}}}),b.each(["radio","checkbox"],function(){b.valHooks[this]=b.extend(b.valHooks[this],{set:function(e,n){return b.isArray(n)?e.checked=b.inArray(b(e).val(),n)>=0:t}})});var Z=/^(?:input|select|textarea)$/i,et=/^key/,tt=/^(?:mouse|contextmenu)|click/,nt=/^(?:focusinfocus|focusoutblur)$/,rt=/^([^.]*)(?:\.(.+)|)$/;function it(){return!0}function ot(){return!1}b.event={global:{},add:function(e,n,r,o,a){var s,u,l,c,p,f,d,h,g,m,y,v=b._data(e);if(v){r.handler&&(c=r,r=c.handler,a=c.selector),r.guid||(r.guid=b.guid++),(u=v.events)||(u=v.events={}),(f=v.handle)||(f=v.handle=function(e){return typeof b===i||e&&b.event.triggered===e.type?t:b.event.dispatch.apply(f.elem,arguments)},f.elem=e),n=(n||"").match(w)||[""],l=n.length;while(l--)s=rt.exec(n[l])||[],g=y=s[1],m=(s[2]||"").split(".").sort(),p=b.event.special[g]||{},g=(a?p.delegateType:p.bindType)||g,p=b.event.special[g]||{},d=b.extend({type:g,origType:y,data:o,handler:r,guid:r.guid,selector:a,needsContext:a&&b.expr.match.needsContext.test(a),namespace:m.join(".")},c),(h=u[g])||(h=u[g]=[],h.delegateCount=0,p.setup&&p.setup.call(e,o,m,f)!==!1||(e.addEventListener?e.addEventListener(g,f,!1):e.attachEvent&&e.attachEvent("on"+g,f))),p.add&&(p.add.call(e,d),d.handler.guid||(d.handler.guid=r.guid)),a?h.splice(h.delegateCount++,0,d):h.push(d),b.event.global[g]=!0;e=null}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,p,f,d,h,g,m=b.hasData(e)&&b._data(e);if(m&&(c=m.events)){t=(t||"").match(w)||[""],l=t.length;while(l--)if(s=rt.exec(t[l])||[],d=g=s[1],h=(s[2]||"").split(".").sort(),d){p=b.event.special[d]||{},d=(r?p.delegateType:p.bindType)||d,f=c[d]||[],s=s[2]&&RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),u=o=f.length;while(o--)a=f[o],!i&&g!==a.origType||n&&n.guid!==a.guid||s&&!s.test(a.namespace)||r&&r!==a.selector&&("**"!==r||!a.selector)||(f.splice(o,1),a.selector&&f.delegateCount--,p.remove&&p.remove.call(e,a));u&&!f.length&&(p.teardown&&p.teardown.call(e,h,m.handle)!==!1||b.removeEvent(e,d,m.handle),delete c[d])}else for(d in c)b.event.remove(e,d+t[l],n,r,!0);b.isEmptyObject(c)&&(delete m.handle,b._removeData(e,"events"))}},trigger:function(n,r,i,a){var s,u,l,c,p,f,d,h=[i||o],g=y.call(n,"type")?n.type:n,m=y.call(n,"namespace")?n.namespace.split("."):[];if(l=f=i=i||o,3!==i.nodeType&&8!==i.nodeType&&!nt.test(g+b.event.triggered)&&(g.indexOf(".")>=0&&(m=g.split("."),g=m.shift(),m.sort()),u=0>g.indexOf(":")&&"on"+g,n=n[b.expando]?n:new b.Event(g,"object"==typeof n&&n),n.isTrigger=!0,n.namespace=m.join("."),n.namespace_re=n.namespace?RegExp("(^|\\.)"+m.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,n.result=t,n.target||(n.target=i),r=null==r?[n]:b.makeArray(r,[n]),p=b.event.special[g]||{},a||!p.trigger||p.trigger.apply(i,r)!==!1)){if(!a&&!p.noBubble&&!b.isWindow(i)){for(c=p.delegateType||g,nt.test(c+g)||(l=l.parentNode);l;l=l.parentNode)h.push(l),f=l;f===(i.ownerDocument||o)&&h.push(f.defaultView||f.parentWindow||e)}d=0;while((l=h[d++])&&!n.isPropagationStopped())n.type=d>1?c:p.bindType||g,s=(b._data(l,"events")||{})[n.type]&&b._data(l,"handle"),s&&s.apply(l,r),s=u&&l[u],s&&b.acceptData(l)&&s.apply&&s.apply(l,r)===!1&&n.preventDefault();if(n.type=g,!(a||n.isDefaultPrevented()||p._default&&p._default.apply(i.ownerDocument,r)!==!1||"click"===g&&b.nodeName(i,"a")||!b.acceptData(i)||!u||!i[g]||b.isWindow(i))){f=i[u],f&&(i[u]=null),b.event.triggered=g;try{i[g]()}catch(v){}b.event.triggered=t,f&&(i[u]=f)}return n.result}},dispatch:function(e){e=b.event.fix(e);var n,r,i,o,a,s=[],u=h.call(arguments),l=(b._data(this,"events")||{})[e.type]||[],c=b.event.special[e.type]||{};if(u[0]=e,e.delegateTarget=this,!c.preDispatch||c.preDispatch.call(this,e)!==!1){s=b.event.handlers.call(this,e,l),n=0;while((o=s[n++])&&!e.isPropagationStopped()){e.currentTarget=o.elem,a=0;while((i=o.handlers[a++])&&!e.isImmediatePropagationStopped())(!e.namespace_re||e.namespace_re.test(i.namespace))&&(e.handleObj=i,e.data=i.data,r=((b.event.special[i.origType]||{}).handle||i.handler).apply(o.elem,u),r!==t&&(e.result=r)===!1&&(e.preventDefault(),e.stopPropagation()))}return c.postDispatch&&c.postDispatch.call(this,e),e.result}},handlers:function(e,n){var r,i,o,a,s=[],u=n.delegateCount,l=e.target;if(u&&l.nodeType&&(!e.button||"click"!==e.type))for(;l!=this;l=l.parentNode||this)if(1===l.nodeType&&(l.disabled!==!0||"click"!==e.type)){for(o=[],a=0;u>a;a++)i=n[a],r=i.selector+" ",o[r]===t&&(o[r]=i.needsContext?b(r,this).index(l)>=0:b.find(r,this,null,[l]).length),o[r]&&o.push(i);o.length&&s.push({elem:l,handlers:o})}return n.length>u&&s.push({elem:this,handlers:n.slice(u)}),s},fix:function(e){if(e[b.expando])return e;var t,n,r,i=e.type,a=e,s=this.fixHooks[i];s||(this.fixHooks[i]=s=tt.test(i)?this.mouseHooks:et.test(i)?this.keyHooks:{}),r=s.props?this.props.concat(s.props):this.props,e=new b.Event(a),t=r.length;while(t--)n=r[t],e[n]=a[n];return e.target||(e.target=a.srcElement||o),3===e.target.nodeType&&(e.target=e.target.parentNode),e.metaKey=!!e.metaKey,s.filter?s.filter(e,a):e},props:"altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(e,t){return null==e.which&&(e.which=null!=t.charCode?t.charCode:t.keyCode),e}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(e,n){var r,i,a,s=n.button,u=n.fromElement;return null==e.pageX&&null!=n.clientX&&(i=e.target.ownerDocument||o,a=i.documentElement,r=i.body,e.pageX=n.clientX+(a&&a.scrollLeft||r&&r.scrollLeft||0)-(a&&a.clientLeft||r&&r.clientLeft||0),e.pageY=n.clientY+(a&&a.scrollTop||r&&r.scrollTop||0)-(a&&a.clientTop||r&&r.clientTop||0)),!e.relatedTarget&&u&&(e.relatedTarget=u===e.target?n.toElement:u),e.which||s===t||(e.which=1&s?1:2&s?3:4&s?2:0),e}},special:{load:{noBubble:!0},click:{trigger:function(){return b.nodeName(this,"input")&&"checkbox"===this.type&&this.click?(this.click(),!1):t}},focus:{trigger:function(){if(this!==o.activeElement&&this.focus)try{return this.focus(),!1}catch(e){}},delegateType:"focusin"},blur:{trigger:function(){return this===o.activeElement&&this.blur?(this.blur(),!1):t},delegateType:"focusout"},beforeunload:{postDispatch:function(e){e.result!==t&&(e.originalEvent.returnValue=e.result)}}},simulate:function(e,t,n,r){var i=b.extend(new b.Event,n,{type:e,isSimulated:!0,originalEvent:{}});r?b.event.trigger(i,null,t):b.event.dispatch.call(t,i),i.isDefaultPrevented()&&n.preventDefault()}},b.removeEvent=o.removeEventListener?function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n,!1)}:function(e,t,n){var r="on"+t;e.detachEvent&&(typeof e[r]===i&&(e[r]=null),e.detachEvent(r,n))},b.Event=function(e,n){return this instanceof b.Event?(e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||e.returnValue===!1||e.getPreventDefault&&e.getPreventDefault()?it:ot):this.type=e,n&&b.extend(this,n),this.timeStamp=e&&e.timeStamp||b.now(),this[b.expando]=!0,t):new b.Event(e,n)},b.Event.prototype={isDefaultPrevented:ot,isPropagationStopped:ot,isImmediatePropagationStopped:ot,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=it,e&&(e.preventDefault?e.preventDefault():e.returnValue=!1)},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=it,e&&(e.stopPropagation&&e.stopPropagation(),e.cancelBubble=!0)},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=it,this.stopPropagation()}},b.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(e,t){b.event.special[e]={delegateType:t,bindType:t,handle:function(e){var n,r=this,i=e.relatedTarget,o=e.handleObj; +return(!i||i!==r&&!b.contains(r,i))&&(e.type=o.origType,n=o.handler.apply(this,arguments),e.type=t),n}}}),b.support.submitBubbles||(b.event.special.submit={setup:function(){return b.nodeName(this,"form")?!1:(b.event.add(this,"click._submit keypress._submit",function(e){var n=e.target,r=b.nodeName(n,"input")||b.nodeName(n,"button")?n.form:t;r&&!b._data(r,"submitBubbles")&&(b.event.add(r,"submit._submit",function(e){e._submit_bubble=!0}),b._data(r,"submitBubbles",!0))}),t)},postDispatch:function(e){e._submit_bubble&&(delete e._submit_bubble,this.parentNode&&!e.isTrigger&&b.event.simulate("submit",this.parentNode,e,!0))},teardown:function(){return b.nodeName(this,"form")?!1:(b.event.remove(this,"._submit"),t)}}),b.support.changeBubbles||(b.event.special.change={setup:function(){return Z.test(this.nodeName)?(("checkbox"===this.type||"radio"===this.type)&&(b.event.add(this,"propertychange._change",function(e){"checked"===e.originalEvent.propertyName&&(this._just_changed=!0)}),b.event.add(this,"click._change",function(e){this._just_changed&&!e.isTrigger&&(this._just_changed=!1),b.event.simulate("change",this,e,!0)})),!1):(b.event.add(this,"beforeactivate._change",function(e){var t=e.target;Z.test(t.nodeName)&&!b._data(t,"changeBubbles")&&(b.event.add(t,"change._change",function(e){!this.parentNode||e.isSimulated||e.isTrigger||b.event.simulate("change",this.parentNode,e,!0)}),b._data(t,"changeBubbles",!0))}),t)},handle:function(e){var n=e.target;return this!==n||e.isSimulated||e.isTrigger||"radio"!==n.type&&"checkbox"!==n.type?e.handleObj.handler.apply(this,arguments):t},teardown:function(){return b.event.remove(this,"._change"),!Z.test(this.nodeName)}}),b.support.focusinBubbles||b.each({focus:"focusin",blur:"focusout"},function(e,t){var n=0,r=function(e){b.event.simulate(t,e.target,b.event.fix(e),!0)};b.event.special[t]={setup:function(){0===n++&&o.addEventListener(e,r,!0)},teardown:function(){0===--n&&o.removeEventListener(e,r,!0)}}}),b.fn.extend({on:function(e,n,r,i,o){var a,s;if("object"==typeof e){"string"!=typeof n&&(r=r||n,n=t);for(a in e)this.on(a,n,r,e[a],o);return this}if(null==r&&null==i?(i=n,r=n=t):null==i&&("string"==typeof n?(i=r,r=t):(i=r,r=n,n=t)),i===!1)i=ot;else if(!i)return this;return 1===o&&(s=i,i=function(e){return b().off(e),s.apply(this,arguments)},i.guid=s.guid||(s.guid=b.guid++)),this.each(function(){b.event.add(this,e,i,r,n)})},one:function(e,t,n,r){return this.on(e,t,n,r,1)},off:function(e,n,r){var i,o;if(e&&e.preventDefault&&e.handleObj)return i=e.handleObj,b(e.delegateTarget).off(i.namespace?i.origType+"."+i.namespace:i.origType,i.selector,i.handler),this;if("object"==typeof e){for(o in e)this.off(o,n,e[o]);return this}return(n===!1||"function"==typeof n)&&(r=n,n=t),r===!1&&(r=ot),this.each(function(){b.event.remove(this,e,r,n)})},bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},trigger:function(e,t){return this.each(function(){b.event.trigger(e,t,this)})},triggerHandler:function(e,n){var r=this[0];return r?b.event.trigger(e,n,r,!0):t}}),function(e,t){var n,r,i,o,a,s,u,l,c,p,f,d,h,g,m,y,v,x="sizzle"+-new Date,w=e.document,T={},N=0,C=0,k=it(),E=it(),S=it(),A=typeof t,j=1<<31,D=[],L=D.pop,H=D.push,q=D.slice,M=D.indexOf||function(e){var t=0,n=this.length;for(;n>t;t++)if(this[t]===e)return t;return-1},_="[\\x20\\t\\r\\n\\f]",F="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",O=F.replace("w","w#"),B="([*^$|!~]?=)",P="\\["+_+"*("+F+")"+_+"*(?:"+B+_+"*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|("+O+")|)|)"+_+"*\\]",R=":("+F+")(?:\\(((['\"])((?:\\\\.|[^\\\\])*?)\\3|((?:\\\\.|[^\\\\()[\\]]|"+P.replace(3,8)+")*)|.*)\\)|)",W=RegExp("^"+_+"+|((?:^|[^\\\\])(?:\\\\.)*)"+_+"+$","g"),$=RegExp("^"+_+"*,"+_+"*"),I=RegExp("^"+_+"*([\\x20\\t\\r\\n\\f>+~])"+_+"*"),z=RegExp(R),X=RegExp("^"+O+"$"),U={ID:RegExp("^#("+F+")"),CLASS:RegExp("^\\.("+F+")"),NAME:RegExp("^\\[name=['\"]?("+F+")['\"]?\\]"),TAG:RegExp("^("+F.replace("w","w*")+")"),ATTR:RegExp("^"+P),PSEUDO:RegExp("^"+R),CHILD:RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+_+"*(even|odd|(([+-]|)(\\d*)n|)"+_+"*(?:([+-]|)"+_+"*(\\d+)|))"+_+"*\\)|)","i"),needsContext:RegExp("^"+_+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+_+"*((?:-\\d)?\\d*)"+_+"*\\)|)(?=[^-]|$)","i")},V=/[\x20\t\r\n\f]*[+~]/,Y=/^[^{]+\{\s*\[native code/,J=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,G=/^(?:input|select|textarea|button)$/i,Q=/^h\d$/i,K=/'|\\/g,Z=/\=[\x20\t\r\n\f]*([^'"\]]*)[\x20\t\r\n\f]*\]/g,et=/\\([\da-fA-F]{1,6}[\x20\t\r\n\f]?|.)/g,tt=function(e,t){var n="0x"+t-65536;return n!==n?t:0>n?String.fromCharCode(n+65536):String.fromCharCode(55296|n>>10,56320|1023&n)};try{q.call(w.documentElement.childNodes,0)[0].nodeType}catch(nt){q=function(e){var t,n=[];while(t=this[e++])n.push(t);return n}}function rt(e){return Y.test(e+"")}function it(){var e,t=[];return e=function(n,r){return t.push(n+=" ")>i.cacheLength&&delete e[t.shift()],e[n]=r}}function ot(e){return e[x]=!0,e}function at(e){var t=p.createElement("div");try{return e(t)}catch(n){return!1}finally{t=null}}function st(e,t,n,r){var i,o,a,s,u,l,f,g,m,v;if((t?t.ownerDocument||t:w)!==p&&c(t),t=t||p,n=n||[],!e||"string"!=typeof e)return n;if(1!==(s=t.nodeType)&&9!==s)return[];if(!d&&!r){if(i=J.exec(e))if(a=i[1]){if(9===s){if(o=t.getElementById(a),!o||!o.parentNode)return n;if(o.id===a)return n.push(o),n}else if(t.ownerDocument&&(o=t.ownerDocument.getElementById(a))&&y(t,o)&&o.id===a)return n.push(o),n}else{if(i[2])return H.apply(n,q.call(t.getElementsByTagName(e),0)),n;if((a=i[3])&&T.getByClassName&&t.getElementsByClassName)return H.apply(n,q.call(t.getElementsByClassName(a),0)),n}if(T.qsa&&!h.test(e)){if(f=!0,g=x,m=t,v=9===s&&e,1===s&&"object"!==t.nodeName.toLowerCase()){l=ft(e),(f=t.getAttribute("id"))?g=f.replace(K,"\\$&"):t.setAttribute("id",g),g="[id='"+g+"'] ",u=l.length;while(u--)l[u]=g+dt(l[u]);m=V.test(e)&&t.parentNode||t,v=l.join(",")}if(v)try{return H.apply(n,q.call(m.querySelectorAll(v),0)),n}catch(b){}finally{f||t.removeAttribute("id")}}}return wt(e.replace(W,"$1"),t,n,r)}a=st.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return t?"HTML"!==t.nodeName:!1},c=st.setDocument=function(e){var n=e?e.ownerDocument||e:w;return n!==p&&9===n.nodeType&&n.documentElement?(p=n,f=n.documentElement,d=a(n),T.tagNameNoComments=at(function(e){return e.appendChild(n.createComment("")),!e.getElementsByTagName("*").length}),T.attributes=at(function(e){e.innerHTML="<select></select>";var t=typeof e.lastChild.getAttribute("multiple");return"boolean"!==t&&"string"!==t}),T.getByClassName=at(function(e){return e.innerHTML="<div class='hidden e'></div><div class='hidden'></div>",e.getElementsByClassName&&e.getElementsByClassName("e").length?(e.lastChild.className="e",2===e.getElementsByClassName("e").length):!1}),T.getByName=at(function(e){e.id=x+0,e.innerHTML="<a name='"+x+"'></a><div name='"+x+"'></div>",f.insertBefore(e,f.firstChild);var t=n.getElementsByName&&n.getElementsByName(x).length===2+n.getElementsByName(x+0).length;return T.getIdNotName=!n.getElementById(x),f.removeChild(e),t}),i.attrHandle=at(function(e){return e.innerHTML="<a href='#'></a>",e.firstChild&&typeof e.firstChild.getAttribute!==A&&"#"===e.firstChild.getAttribute("href")})?{}:{href:function(e){return e.getAttribute("href",2)},type:function(e){return e.getAttribute("type")}},T.getIdNotName?(i.find.ID=function(e,t){if(typeof t.getElementById!==A&&!d){var n=t.getElementById(e);return n&&n.parentNode?[n]:[]}},i.filter.ID=function(e){var t=e.replace(et,tt);return function(e){return e.getAttribute("id")===t}}):(i.find.ID=function(e,n){if(typeof n.getElementById!==A&&!d){var r=n.getElementById(e);return r?r.id===e||typeof r.getAttributeNode!==A&&r.getAttributeNode("id").value===e?[r]:t:[]}},i.filter.ID=function(e){var t=e.replace(et,tt);return function(e){var n=typeof e.getAttributeNode!==A&&e.getAttributeNode("id");return n&&n.value===t}}),i.find.TAG=T.tagNameNoComments?function(e,n){return typeof n.getElementsByTagName!==A?n.getElementsByTagName(e):t}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},i.find.NAME=T.getByName&&function(e,n){return typeof n.getElementsByName!==A?n.getElementsByName(name):t},i.find.CLASS=T.getByClassName&&function(e,n){return typeof n.getElementsByClassName===A||d?t:n.getElementsByClassName(e)},g=[],h=[":focus"],(T.qsa=rt(n.querySelectorAll))&&(at(function(e){e.innerHTML="<select><option selected=''></option></select>",e.querySelectorAll("[selected]").length||h.push("\\["+_+"*(?:checked|disabled|ismap|multiple|readonly|selected|value)"),e.querySelectorAll(":checked").length||h.push(":checked")}),at(function(e){e.innerHTML="<input type='hidden' i=''/>",e.querySelectorAll("[i^='']").length&&h.push("[*^$]="+_+"*(?:\"\"|'')"),e.querySelectorAll(":enabled").length||h.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),h.push(",.*:")})),(T.matchesSelector=rt(m=f.matchesSelector||f.mozMatchesSelector||f.webkitMatchesSelector||f.oMatchesSelector||f.msMatchesSelector))&&at(function(e){T.disconnectedMatch=m.call(e,"div"),m.call(e,"[s!='']:x"),g.push("!=",R)}),h=RegExp(h.join("|")),g=RegExp(g.join("|")),y=rt(f.contains)||f.compareDocumentPosition?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},v=f.compareDocumentPosition?function(e,t){var r;return e===t?(u=!0,0):(r=t.compareDocumentPosition&&e.compareDocumentPosition&&e.compareDocumentPosition(t))?1&r||e.parentNode&&11===e.parentNode.nodeType?e===n||y(w,e)?-1:t===n||y(w,t)?1:0:4&r?-1:1:e.compareDocumentPosition?-1:1}:function(e,t){var r,i=0,o=e.parentNode,a=t.parentNode,s=[e],l=[t];if(e===t)return u=!0,0;if(!o||!a)return e===n?-1:t===n?1:o?-1:a?1:0;if(o===a)return ut(e,t);r=e;while(r=r.parentNode)s.unshift(r);r=t;while(r=r.parentNode)l.unshift(r);while(s[i]===l[i])i++;return i?ut(s[i],l[i]):s[i]===w?-1:l[i]===w?1:0},u=!1,[0,0].sort(v),T.detectDuplicates=u,p):p},st.matches=function(e,t){return st(e,null,null,t)},st.matchesSelector=function(e,t){if((e.ownerDocument||e)!==p&&c(e),t=t.replace(Z,"='$1']"),!(!T.matchesSelector||d||g&&g.test(t)||h.test(t)))try{var n=m.call(e,t);if(n||T.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(r){}return st(t,p,null,[e]).length>0},st.contains=function(e,t){return(e.ownerDocument||e)!==p&&c(e),y(e,t)},st.attr=function(e,t){var n;return(e.ownerDocument||e)!==p&&c(e),d||(t=t.toLowerCase()),(n=i.attrHandle[t])?n(e):d||T.attributes?e.getAttribute(t):((n=e.getAttributeNode(t))||e.getAttribute(t))&&e[t]===!0?t:n&&n.specified?n.value:null},st.error=function(e){throw Error("Syntax error, unrecognized expression: "+e)},st.uniqueSort=function(e){var t,n=[],r=1,i=0;if(u=!T.detectDuplicates,e.sort(v),u){for(;t=e[r];r++)t===e[r-1]&&(i=n.push(r));while(i--)e.splice(n[i],1)}return e};function ut(e,t){var n=t&&e,r=n&&(~t.sourceIndex||j)-(~e.sourceIndex||j);if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function lt(e){return function(t){var n=t.nodeName.toLowerCase();return"input"===n&&t.type===e}}function ct(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}}function pt(e){return ot(function(t){return t=+t,ot(function(n,r){var i,o=e([],n.length,t),a=o.length;while(a--)n[i=o[a]]&&(n[i]=!(r[i]=n[i]))})})}o=st.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=o(e)}else if(3===i||4===i)return e.nodeValue}else for(;t=e[r];r++)n+=o(t);return n},i=st.selectors={cacheLength:50,createPseudo:ot,match:U,find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(et,tt),e[3]=(e[4]||e[5]||"").replace(et,tt),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||st.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&st.error(e[0]),e},PSEUDO:function(e){var t,n=!e[5]&&e[2];return U.CHILD.test(e[0])?null:(e[4]?e[2]=e[4]:n&&z.test(n)&&(t=ft(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){return"*"===e?function(){return!0}:(e=e.replace(et,tt).toLowerCase(),function(t){return t.nodeName&&t.nodeName.toLowerCase()===e})},CLASS:function(e){var t=k[e+" "];return t||(t=RegExp("(^|"+_+")"+e+"("+_+"|$)"))&&k(e,function(e){return t.test(e.className||typeof e.getAttribute!==A&&e.getAttribute("class")||"")})},ATTR:function(e,t,n){return function(r){var i=st.attr(r,e);return null==i?"!="===t:t?(i+="","="===t?i===n:"!="===t?i!==n:"^="===t?n&&0===i.indexOf(n):"*="===t?n&&i.indexOf(n)>-1:"$="===t?n&&i.slice(-n.length)===n:"~="===t?(" "+i+" ").indexOf(n)>-1:"|="===t?i===n||i.slice(0,n.length+1)===n+"-":!1):!0}},CHILD:function(e,t,n,r,i){var o="nth"!==e.slice(0,3),a="last"!==e.slice(-4),s="of-type"===t;return 1===r&&0===i?function(e){return!!e.parentNode}:function(t,n,u){var l,c,p,f,d,h,g=o!==a?"nextSibling":"previousSibling",m=t.parentNode,y=s&&t.nodeName.toLowerCase(),v=!u&&!s;if(m){if(o){while(g){p=t;while(p=p[g])if(s?p.nodeName.toLowerCase()===y:1===p.nodeType)return!1;h=g="only"===e&&!h&&"nextSibling"}return!0}if(h=[a?m.firstChild:m.lastChild],a&&v){c=m[x]||(m[x]={}),l=c[e]||[],d=l[0]===N&&l[1],f=l[0]===N&&l[2],p=d&&m.childNodes[d];while(p=++d&&p&&p[g]||(f=d=0)||h.pop())if(1===p.nodeType&&++f&&p===t){c[e]=[N,d,f];break}}else if(v&&(l=(t[x]||(t[x]={}))[e])&&l[0]===N)f=l[1];else while(p=++d&&p&&p[g]||(f=d=0)||h.pop())if((s?p.nodeName.toLowerCase()===y:1===p.nodeType)&&++f&&(v&&((p[x]||(p[x]={}))[e]=[N,f]),p===t))break;return f-=i,f===r||0===f%r&&f/r>=0}}},PSEUDO:function(e,t){var n,r=i.pseudos[e]||i.setFilters[e.toLowerCase()]||st.error("unsupported pseudo: "+e);return r[x]?r(t):r.length>1?(n=[e,e,"",t],i.setFilters.hasOwnProperty(e.toLowerCase())?ot(function(e,n){var i,o=r(e,t),a=o.length;while(a--)i=M.call(e,o[a]),e[i]=!(n[i]=o[a])}):function(e){return r(e,0,n)}):r}},pseudos:{not:ot(function(e){var t=[],n=[],r=s(e.replace(W,"$1"));return r[x]?ot(function(e,t,n,i){var o,a=r(e,null,i,[]),s=e.length;while(s--)(o=a[s])&&(e[s]=!(t[s]=o))}):function(e,i,o){return t[0]=e,r(t,null,o,n),!n.pop()}}),has:ot(function(e){return function(t){return st(e,t).length>0}}),contains:ot(function(e){return function(t){return(t.textContent||t.innerText||o(t)).indexOf(e)>-1}}),lang:ot(function(e){return X.test(e||"")||st.error("unsupported lang: "+e),e=e.replace(et,tt).toLowerCase(),function(t){var n;do if(n=d?t.getAttribute("xml:lang")||t.getAttribute("lang"):t.lang)return n=n.toLowerCase(),n===e||0===n.indexOf(e+"-");while((t=t.parentNode)&&1===t.nodeType);return!1}}),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===f},focus:function(e){return e===p.activeElement&&(!p.hasFocus||p.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:function(e){return e.disabled===!1},disabled:function(e){return e.disabled===!0},checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,e.selected===!0},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeName>"@"||3===e.nodeType||4===e.nodeType)return!1;return!0},parent:function(e){return!i.pseudos.empty(e)},header:function(e){return Q.test(e.nodeName)},input:function(e){return G.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||t.toLowerCase()===e.type)},first:pt(function(){return[0]}),last:pt(function(e,t){return[t-1]}),eq:pt(function(e,t,n){return[0>n?n+t:n]}),even:pt(function(e,t){var n=0;for(;t>n;n+=2)e.push(n);return e}),odd:pt(function(e,t){var n=1;for(;t>n;n+=2)e.push(n);return e}),lt:pt(function(e,t,n){var r=0>n?n+t:n;for(;--r>=0;)e.push(r);return e}),gt:pt(function(e,t,n){var r=0>n?n+t:n;for(;t>++r;)e.push(r);return e})}};for(n in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})i.pseudos[n]=lt(n);for(n in{submit:!0,reset:!0})i.pseudos[n]=ct(n);function ft(e,t){var n,r,o,a,s,u,l,c=E[e+" "];if(c)return t?0:c.slice(0);s=e,u=[],l=i.preFilter;while(s){(!n||(r=$.exec(s)))&&(r&&(s=s.slice(r[0].length)||s),u.push(o=[])),n=!1,(r=I.exec(s))&&(n=r.shift(),o.push({value:n,type:r[0].replace(W," ")}),s=s.slice(n.length));for(a in i.filter)!(r=U[a].exec(s))||l[a]&&!(r=l[a](r))||(n=r.shift(),o.push({value:n,type:a,matches:r}),s=s.slice(n.length));if(!n)break}return t?s.length:s?st.error(e):E(e,u).slice(0)}function dt(e){var t=0,n=e.length,r="";for(;n>t;t++)r+=e[t].value;return r}function ht(e,t,n){var i=t.dir,o=n&&"parentNode"===i,a=C++;return t.first?function(t,n,r){while(t=t[i])if(1===t.nodeType||o)return e(t,n,r)}:function(t,n,s){var u,l,c,p=N+" "+a;if(s){while(t=t[i])if((1===t.nodeType||o)&&e(t,n,s))return!0}else while(t=t[i])if(1===t.nodeType||o)if(c=t[x]||(t[x]={}),(l=c[i])&&l[0]===p){if((u=l[1])===!0||u===r)return u===!0}else if(l=c[i]=[p],l[1]=e(t,n,s)||r,l[1]===!0)return!0}}function gt(e){return e.length>1?function(t,n,r){var i=e.length;while(i--)if(!e[i](t,n,r))return!1;return!0}:e[0]}function mt(e,t,n,r,i){var o,a=[],s=0,u=e.length,l=null!=t;for(;u>s;s++)(o=e[s])&&(!n||n(o,r,i))&&(a.push(o),l&&t.push(s));return a}function yt(e,t,n,r,i,o){return r&&!r[x]&&(r=yt(r)),i&&!i[x]&&(i=yt(i,o)),ot(function(o,a,s,u){var l,c,p,f=[],d=[],h=a.length,g=o||xt(t||"*",s.nodeType?[s]:s,[]),m=!e||!o&&t?g:mt(g,f,e,s,u),y=n?i||(o?e:h||r)?[]:a:m;if(n&&n(m,y,s,u),r){l=mt(y,d),r(l,[],s,u),c=l.length;while(c--)(p=l[c])&&(y[d[c]]=!(m[d[c]]=p))}if(o){if(i||e){if(i){l=[],c=y.length;while(c--)(p=y[c])&&l.push(m[c]=p);i(null,y=[],l,u)}c=y.length;while(c--)(p=y[c])&&(l=i?M.call(o,p):f[c])>-1&&(o[l]=!(a[l]=p))}}else y=mt(y===a?y.splice(h,y.length):y),i?i(null,a,y,u):H.apply(a,y)})}function vt(e){var t,n,r,o=e.length,a=i.relative[e[0].type],s=a||i.relative[" "],u=a?1:0,c=ht(function(e){return e===t},s,!0),p=ht(function(e){return M.call(t,e)>-1},s,!0),f=[function(e,n,r){return!a&&(r||n!==l)||((t=n).nodeType?c(e,n,r):p(e,n,r))}];for(;o>u;u++)if(n=i.relative[e[u].type])f=[ht(gt(f),n)];else{if(n=i.filter[e[u].type].apply(null,e[u].matches),n[x]){for(r=++u;o>r;r++)if(i.relative[e[r].type])break;return yt(u>1&>(f),u>1&&dt(e.slice(0,u-1)).replace(W,"$1"),n,r>u&&vt(e.slice(u,r)),o>r&&vt(e=e.slice(r)),o>r&&dt(e))}f.push(n)}return gt(f)}function bt(e,t){var n=0,o=t.length>0,a=e.length>0,s=function(s,u,c,f,d){var h,g,m,y=[],v=0,b="0",x=s&&[],w=null!=d,T=l,C=s||a&&i.find.TAG("*",d&&u.parentNode||u),k=N+=null==T?1:Math.random()||.1;for(w&&(l=u!==p&&u,r=n);null!=(h=C[b]);b++){if(a&&h){g=0;while(m=e[g++])if(m(h,u,c)){f.push(h);break}w&&(N=k,r=++n)}o&&((h=!m&&h)&&v--,s&&x.push(h))}if(v+=b,o&&b!==v){g=0;while(m=t[g++])m(x,y,u,c);if(s){if(v>0)while(b--)x[b]||y[b]||(y[b]=L.call(f));y=mt(y)}H.apply(f,y),w&&!s&&y.length>0&&v+t.length>1&&st.uniqueSort(f)}return w&&(N=k,l=T),x};return o?ot(s):s}s=st.compile=function(e,t){var n,r=[],i=[],o=S[e+" "];if(!o){t||(t=ft(e)),n=t.length;while(n--)o=vt(t[n]),o[x]?r.push(o):i.push(o);o=S(e,bt(i,r))}return o};function xt(e,t,n){var r=0,i=t.length;for(;i>r;r++)st(e,t[r],n);return n}function wt(e,t,n,r){var o,a,u,l,c,p=ft(e);if(!r&&1===p.length){if(a=p[0]=p[0].slice(0),a.length>2&&"ID"===(u=a[0]).type&&9===t.nodeType&&!d&&i.relative[a[1].type]){if(t=i.find.ID(u.matches[0].replace(et,tt),t)[0],!t)return n;e=e.slice(a.shift().value.length)}o=U.needsContext.test(e)?0:a.length;while(o--){if(u=a[o],i.relative[l=u.type])break;if((c=i.find[l])&&(r=c(u.matches[0].replace(et,tt),V.test(a[0].type)&&t.parentNode||t))){if(a.splice(o,1),e=r.length&&dt(a),!e)return H.apply(n,q.call(r,0)),n;break}}}return s(e,p)(r,t,d,n,V.test(e)),n}i.pseudos.nth=i.pseudos.eq;function Tt(){}i.filters=Tt.prototype=i.pseudos,i.setFilters=new Tt,c(),st.attr=b.attr,b.find=st,b.expr=st.selectors,b.expr[":"]=b.expr.pseudos,b.unique=st.uniqueSort,b.text=st.getText,b.isXMLDoc=st.isXML,b.contains=st.contains}(e);var at=/Until$/,st=/^(?:parents|prev(?:Until|All))/,ut=/^.[^:#\[\.,]*$/,lt=b.expr.match.needsContext,ct={children:!0,contents:!0,next:!0,prev:!0};b.fn.extend({find:function(e){var t,n,r,i=this.length;if("string"!=typeof e)return r=this,this.pushStack(b(e).filter(function(){for(t=0;i>t;t++)if(b.contains(r[t],this))return!0}));for(n=[],t=0;i>t;t++)b.find(e,this[t],n);return n=this.pushStack(i>1?b.unique(n):n),n.selector=(this.selector?this.selector+" ":"")+e,n},has:function(e){var t,n=b(e,this),r=n.length;return this.filter(function(){for(t=0;r>t;t++)if(b.contains(this,n[t]))return!0})},not:function(e){return this.pushStack(ft(this,e,!1))},filter:function(e){return this.pushStack(ft(this,e,!0))},is:function(e){return!!e&&("string"==typeof e?lt.test(e)?b(e,this.context).index(this[0])>=0:b.filter(e,this).length>0:this.filter(e).length>0)},closest:function(e,t){var n,r=0,i=this.length,o=[],a=lt.test(e)||"string"!=typeof e?b(e,t||this.context):0;for(;i>r;r++){n=this[r];while(n&&n.ownerDocument&&n!==t&&11!==n.nodeType){if(a?a.index(n)>-1:b.find.matchesSelector(n,e)){o.push(n);break}n=n.parentNode}}return this.pushStack(o.length>1?b.unique(o):o)},index:function(e){return e?"string"==typeof e?b.inArray(this[0],b(e)):b.inArray(e.jquery?e[0]:e,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){var n="string"==typeof e?b(e,t):b.makeArray(e&&e.nodeType?[e]:e),r=b.merge(this.get(),n);return this.pushStack(b.unique(r))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}}),b.fn.andSelf=b.fn.addBack;function pt(e,t){do e=e[t];while(e&&1!==e.nodeType);return e}b.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return b.dir(e,"parentNode")},parentsUntil:function(e,t,n){return b.dir(e,"parentNode",n)},next:function(e){return pt(e,"nextSibling")},prev:function(e){return pt(e,"previousSibling")},nextAll:function(e){return b.dir(e,"nextSibling")},prevAll:function(e){return b.dir(e,"previousSibling")},nextUntil:function(e,t,n){return b.dir(e,"nextSibling",n)},prevUntil:function(e,t,n){return b.dir(e,"previousSibling",n)},siblings:function(e){return b.sibling((e.parentNode||{}).firstChild,e)},children:function(e){return b.sibling(e.firstChild)},contents:function(e){return b.nodeName(e,"iframe")?e.contentDocument||e.contentWindow.document:b.merge([],e.childNodes)}},function(e,t){b.fn[e]=function(n,r){var i=b.map(this,t,n);return at.test(e)||(r=n),r&&"string"==typeof r&&(i=b.filter(r,i)),i=this.length>1&&!ct[e]?b.unique(i):i,this.length>1&&st.test(e)&&(i=i.reverse()),this.pushStack(i)}}),b.extend({filter:function(e,t,n){return n&&(e=":not("+e+")"),1===t.length?b.find.matchesSelector(t[0],e)?[t[0]]:[]:b.find.matches(e,t)},dir:function(e,n,r){var i=[],o=e[n];while(o&&9!==o.nodeType&&(r===t||1!==o.nodeType||!b(o).is(r)))1===o.nodeType&&i.push(o),o=o[n];return i},sibling:function(e,t){var n=[];for(;e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n}});function ft(e,t,n){if(t=t||0,b.isFunction(t))return b.grep(e,function(e,r){var i=!!t.call(e,r,e);return i===n});if(t.nodeType)return b.grep(e,function(e){return e===t===n});if("string"==typeof t){var r=b.grep(e,function(e){return 1===e.nodeType});if(ut.test(t))return b.filter(t,r,!n);t=b.filter(t,r)}return b.grep(e,function(e){return b.inArray(e,t)>=0===n})}function dt(e){var t=ht.split("|"),n=e.createDocumentFragment();if(n.createElement)while(t.length)n.createElement(t.pop());return n}var ht="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",gt=/ jQuery\d+="(?:null|\d+)"/g,mt=RegExp("<(?:"+ht+")[\\s/>]","i"),yt=/^\s+/,vt=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,bt=/<([\w:]+)/,xt=/<tbody/i,wt=/<|&#?\w+;/,Tt=/<(?:script|style|link)/i,Nt=/^(?:checkbox|radio)$/i,Ct=/checked\s*(?:[^=]|=\s*.checked.)/i,kt=/^$|\/(?:java|ecma)script/i,Et=/^true\/(.*)/,St=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,At={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],area:[1,"<map>","</map>"],param:[1,"<object>","</object>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:b.support.htmlSerialize?[0,"",""]:[1,"X<div>","</div>"]},jt=dt(o),Dt=jt.appendChild(o.createElement("div"));At.optgroup=At.option,At.tbody=At.tfoot=At.colgroup=At.caption=At.thead,At.th=At.td,b.fn.extend({text:function(e){return b.access(this,function(e){return e===t?b.text(this):this.empty().append((this[0]&&this[0].ownerDocument||o).createTextNode(e))},null,e,arguments.length)},wrapAll:function(e){if(b.isFunction(e))return this.each(function(t){b(this).wrapAll(e.call(this,t))});if(this[0]){var t=b(e,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstChild&&1===e.firstChild.nodeType)e=e.firstChild;return e}).append(this)}return this},wrapInner:function(e){return b.isFunction(e)?this.each(function(t){b(this).wrapInner(e.call(this,t))}):this.each(function(){var t=b(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=b.isFunction(e);return this.each(function(n){b(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(){return this.parent().each(function(){b.nodeName(this,"body")||b(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(e){(1===this.nodeType||11===this.nodeType||9===this.nodeType)&&this.appendChild(e)})},prepend:function(){return this.domManip(arguments,!0,function(e){(1===this.nodeType||11===this.nodeType||9===this.nodeType)&&this.insertBefore(e,this.firstChild)})},before:function(){return this.domManip(arguments,!1,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return this.domManip(arguments,!1,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},remove:function(e,t){var n,r=0;for(;null!=(n=this[r]);r++)(!e||b.filter(e,[n]).length>0)&&(t||1!==n.nodeType||b.cleanData(Ot(n)),n.parentNode&&(t&&b.contains(n.ownerDocument,n)&&Mt(Ot(n,"script")),n.parentNode.removeChild(n)));return this},empty:function(){var e,t=0;for(;null!=(e=this[t]);t++){1===e.nodeType&&b.cleanData(Ot(e,!1));while(e.firstChild)e.removeChild(e.firstChild);e.options&&b.nodeName(e,"select")&&(e.options.length=0)}return this},clone:function(e,t){return e=null==e?!1:e,t=null==t?e:t,this.map(function(){return b.clone(this,e,t)})},html:function(e){return b.access(this,function(e){var n=this[0]||{},r=0,i=this.length;if(e===t)return 1===n.nodeType?n.innerHTML.replace(gt,""):t;if(!("string"!=typeof e||Tt.test(e)||!b.support.htmlSerialize&&mt.test(e)||!b.support.leadingWhitespace&&yt.test(e)||At[(bt.exec(e)||["",""])[1].toLowerCase()])){e=e.replace(vt,"<$1></$2>");try{for(;i>r;r++)n=this[r]||{},1===n.nodeType&&(b.cleanData(Ot(n,!1)),n.innerHTML=e);n=0}catch(o){}}n&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(e){var t=b.isFunction(e);return t||"string"==typeof e||(e=b(e).not(this).detach()),this.domManip([e],!0,function(e){var t=this.nextSibling,n=this.parentNode;n&&(b(this).remove(),n.insertBefore(e,t))})},detach:function(e){return this.remove(e,!0)},domManip:function(e,n,r){e=f.apply([],e);var i,o,a,s,u,l,c=0,p=this.length,d=this,h=p-1,g=e[0],m=b.isFunction(g);if(m||!(1>=p||"string"!=typeof g||b.support.checkClone)&&Ct.test(g))return this.each(function(i){var o=d.eq(i);m&&(e[0]=g.call(this,i,n?o.html():t)),o.domManip(e,n,r)});if(p&&(l=b.buildFragment(e,this[0].ownerDocument,!1,this),i=l.firstChild,1===l.childNodes.length&&(l=i),i)){for(n=n&&b.nodeName(i,"tr"),s=b.map(Ot(l,"script"),Ht),a=s.length;p>c;c++)o=l,c!==h&&(o=b.clone(o,!0,!0),a&&b.merge(s,Ot(o,"script"))),r.call(n&&b.nodeName(this[c],"table")?Lt(this[c],"tbody"):this[c],o,c);if(a)for(u=s[s.length-1].ownerDocument,b.map(s,qt),c=0;a>c;c++)o=s[c],kt.test(o.type||"")&&!b._data(o,"globalEval")&&b.contains(u,o)&&(o.src?b.ajax({url:o.src,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0}):b.globalEval((o.text||o.textContent||o.innerHTML||"").replace(St,"")));l=i=null}return this}});function Lt(e,t){return e.getElementsByTagName(t)[0]||e.appendChild(e.ownerDocument.createElement(t))}function Ht(e){var t=e.getAttributeNode("type");return e.type=(t&&t.specified)+"/"+e.type,e}function qt(e){var t=Et.exec(e.type);return t?e.type=t[1]:e.removeAttribute("type"),e}function Mt(e,t){var n,r=0;for(;null!=(n=e[r]);r++)b._data(n,"globalEval",!t||b._data(t[r],"globalEval"))}function _t(e,t){if(1===t.nodeType&&b.hasData(e)){var n,r,i,o=b._data(e),a=b._data(t,o),s=o.events;if(s){delete a.handle,a.events={};for(n in s)for(r=0,i=s[n].length;i>r;r++)b.event.add(t,n,s[n][r])}a.data&&(a.data=b.extend({},a.data))}}function Ft(e,t){var n,r,i;if(1===t.nodeType){if(n=t.nodeName.toLowerCase(),!b.support.noCloneEvent&&t[b.expando]){i=b._data(t);for(r in i.events)b.removeEvent(t,r,i.handle);t.removeAttribute(b.expando)}"script"===n&&t.text!==e.text?(Ht(t).text=e.text,qt(t)):"object"===n?(t.parentNode&&(t.outerHTML=e.outerHTML),b.support.html5Clone&&e.innerHTML&&!b.trim(t.innerHTML)&&(t.innerHTML=e.innerHTML)):"input"===n&&Nt.test(e.type)?(t.defaultChecked=t.checked=e.checked,t.value!==e.value&&(t.value=e.value)):"option"===n?t.defaultSelected=t.selected=e.defaultSelected:("input"===n||"textarea"===n)&&(t.defaultValue=e.defaultValue)}}b.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,t){b.fn[e]=function(e){var n,r=0,i=[],o=b(e),a=o.length-1;for(;a>=r;r++)n=r===a?this:this.clone(!0),b(o[r])[t](n),d.apply(i,n.get());return this.pushStack(i)}});function Ot(e,n){var r,o,a=0,s=typeof e.getElementsByTagName!==i?e.getElementsByTagName(n||"*"):typeof e.querySelectorAll!==i?e.querySelectorAll(n||"*"):t;if(!s)for(s=[],r=e.childNodes||e;null!=(o=r[a]);a++)!n||b.nodeName(o,n)?s.push(o):b.merge(s,Ot(o,n));return n===t||n&&b.nodeName(e,n)?b.merge([e],s):s}function Bt(e){Nt.test(e.type)&&(e.defaultChecked=e.checked)}b.extend({clone:function(e,t,n){var r,i,o,a,s,u=b.contains(e.ownerDocument,e);if(b.support.html5Clone||b.isXMLDoc(e)||!mt.test("<"+e.nodeName+">")?o=e.cloneNode(!0):(Dt.innerHTML=e.outerHTML,Dt.removeChild(o=Dt.firstChild)),!(b.support.noCloneEvent&&b.support.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||b.isXMLDoc(e)))for(r=Ot(o),s=Ot(e),a=0;null!=(i=s[a]);++a)r[a]&&Ft(i,r[a]);if(t)if(n)for(s=s||Ot(e),r=r||Ot(o),a=0;null!=(i=s[a]);a++)_t(i,r[a]);else _t(e,o);return r=Ot(o,"script"),r.length>0&&Mt(r,!u&&Ot(e,"script")),r=s=i=null,o},buildFragment:function(e,t,n,r){var i,o,a,s,u,l,c,p=e.length,f=dt(t),d=[],h=0;for(;p>h;h++)if(o=e[h],o||0===o)if("object"===b.type(o))b.merge(d,o.nodeType?[o]:o);else if(wt.test(o)){s=s||f.appendChild(t.createElement("div")),u=(bt.exec(o)||["",""])[1].toLowerCase(),c=At[u]||At._default,s.innerHTML=c[1]+o.replace(vt,"<$1></$2>")+c[2],i=c[0];while(i--)s=s.lastChild;if(!b.support.leadingWhitespace&&yt.test(o)&&d.push(t.createTextNode(yt.exec(o)[0])),!b.support.tbody){o="table"!==u||xt.test(o)?"<table>"!==c[1]||xt.test(o)?0:s:s.firstChild,i=o&&o.childNodes.length;while(i--)b.nodeName(l=o.childNodes[i],"tbody")&&!l.childNodes.length&&o.removeChild(l) +}b.merge(d,s.childNodes),s.textContent="";while(s.firstChild)s.removeChild(s.firstChild);s=f.lastChild}else d.push(t.createTextNode(o));s&&f.removeChild(s),b.support.appendChecked||b.grep(Ot(d,"input"),Bt),h=0;while(o=d[h++])if((!r||-1===b.inArray(o,r))&&(a=b.contains(o.ownerDocument,o),s=Ot(f.appendChild(o),"script"),a&&Mt(s),n)){i=0;while(o=s[i++])kt.test(o.type||"")&&n.push(o)}return s=null,f},cleanData:function(e,t){var n,r,o,a,s=0,u=b.expando,l=b.cache,p=b.support.deleteExpando,f=b.event.special;for(;null!=(n=e[s]);s++)if((t||b.acceptData(n))&&(o=n[u],a=o&&l[o])){if(a.events)for(r in a.events)f[r]?b.event.remove(n,r):b.removeEvent(n,r,a.handle);l[o]&&(delete l[o],p?delete n[u]:typeof n.removeAttribute!==i?n.removeAttribute(u):n[u]=null,c.push(o))}}});var Pt,Rt,Wt,$t=/alpha\([^)]*\)/i,It=/opacity\s*=\s*([^)]*)/,zt=/^(top|right|bottom|left)$/,Xt=/^(none|table(?!-c[ea]).+)/,Ut=/^margin/,Vt=RegExp("^("+x+")(.*)$","i"),Yt=RegExp("^("+x+")(?!px)[a-z%]+$","i"),Jt=RegExp("^([+-])=("+x+")","i"),Gt={BODY:"block"},Qt={position:"absolute",visibility:"hidden",display:"block"},Kt={letterSpacing:0,fontWeight:400},Zt=["Top","Right","Bottom","Left"],en=["Webkit","O","Moz","ms"];function tn(e,t){if(t in e)return t;var n=t.charAt(0).toUpperCase()+t.slice(1),r=t,i=en.length;while(i--)if(t=en[i]+n,t in e)return t;return r}function nn(e,t){return e=t||e,"none"===b.css(e,"display")||!b.contains(e.ownerDocument,e)}function rn(e,t){var n,r,i,o=[],a=0,s=e.length;for(;s>a;a++)r=e[a],r.style&&(o[a]=b._data(r,"olddisplay"),n=r.style.display,t?(o[a]||"none"!==n||(r.style.display=""),""===r.style.display&&nn(r)&&(o[a]=b._data(r,"olddisplay",un(r.nodeName)))):o[a]||(i=nn(r),(n&&"none"!==n||!i)&&b._data(r,"olddisplay",i?n:b.css(r,"display"))));for(a=0;s>a;a++)r=e[a],r.style&&(t&&"none"!==r.style.display&&""!==r.style.display||(r.style.display=t?o[a]||"":"none"));return e}b.fn.extend({css:function(e,n){return b.access(this,function(e,n,r){var i,o,a={},s=0;if(b.isArray(n)){for(o=Rt(e),i=n.length;i>s;s++)a[n[s]]=b.css(e,n[s],!1,o);return a}return r!==t?b.style(e,n,r):b.css(e,n)},e,n,arguments.length>1)},show:function(){return rn(this,!0)},hide:function(){return rn(this)},toggle:function(e){var t="boolean"==typeof e;return this.each(function(){(t?e:nn(this))?b(this).show():b(this).hide()})}}),b.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=Wt(e,"opacity");return""===n?"1":n}}}},cssNumber:{columnCount:!0,fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":b.support.cssFloat?"cssFloat":"styleFloat"},style:function(e,n,r,i){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var o,a,s,u=b.camelCase(n),l=e.style;if(n=b.cssProps[u]||(b.cssProps[u]=tn(l,u)),s=b.cssHooks[n]||b.cssHooks[u],r===t)return s&&"get"in s&&(o=s.get(e,!1,i))!==t?o:l[n];if(a=typeof r,"string"===a&&(o=Jt.exec(r))&&(r=(o[1]+1)*o[2]+parseFloat(b.css(e,n)),a="number"),!(null==r||"number"===a&&isNaN(r)||("number"!==a||b.cssNumber[u]||(r+="px"),b.support.clearCloneStyle||""!==r||0!==n.indexOf("background")||(l[n]="inherit"),s&&"set"in s&&(r=s.set(e,r,i))===t)))try{l[n]=r}catch(c){}}},css:function(e,n,r,i){var o,a,s,u=b.camelCase(n);return n=b.cssProps[u]||(b.cssProps[u]=tn(e.style,u)),s=b.cssHooks[n]||b.cssHooks[u],s&&"get"in s&&(a=s.get(e,!0,r)),a===t&&(a=Wt(e,n,i)),"normal"===a&&n in Kt&&(a=Kt[n]),""===r||r?(o=parseFloat(a),r===!0||b.isNumeric(o)?o||0:a):a},swap:function(e,t,n,r){var i,o,a={};for(o in t)a[o]=e.style[o],e.style[o]=t[o];i=n.apply(e,r||[]);for(o in t)e.style[o]=a[o];return i}}),e.getComputedStyle?(Rt=function(t){return e.getComputedStyle(t,null)},Wt=function(e,n,r){var i,o,a,s=r||Rt(e),u=s?s.getPropertyValue(n)||s[n]:t,l=e.style;return s&&(""!==u||b.contains(e.ownerDocument,e)||(u=b.style(e,n)),Yt.test(u)&&Ut.test(n)&&(i=l.width,o=l.minWidth,a=l.maxWidth,l.minWidth=l.maxWidth=l.width=u,u=s.width,l.width=i,l.minWidth=o,l.maxWidth=a)),u}):o.documentElement.currentStyle&&(Rt=function(e){return e.currentStyle},Wt=function(e,n,r){var i,o,a,s=r||Rt(e),u=s?s[n]:t,l=e.style;return null==u&&l&&l[n]&&(u=l[n]),Yt.test(u)&&!zt.test(n)&&(i=l.left,o=e.runtimeStyle,a=o&&o.left,a&&(o.left=e.currentStyle.left),l.left="fontSize"===n?"1em":u,u=l.pixelLeft+"px",l.left=i,a&&(o.left=a)),""===u?"auto":u});function on(e,t,n){var r=Vt.exec(t);return r?Math.max(0,r[1]-(n||0))+(r[2]||"px"):t}function an(e,t,n,r,i){var o=n===(r?"border":"content")?4:"width"===t?1:0,a=0;for(;4>o;o+=2)"margin"===n&&(a+=b.css(e,n+Zt[o],!0,i)),r?("content"===n&&(a-=b.css(e,"padding"+Zt[o],!0,i)),"margin"!==n&&(a-=b.css(e,"border"+Zt[o]+"Width",!0,i))):(a+=b.css(e,"padding"+Zt[o],!0,i),"padding"!==n&&(a+=b.css(e,"border"+Zt[o]+"Width",!0,i)));return a}function sn(e,t,n){var r=!0,i="width"===t?e.offsetWidth:e.offsetHeight,o=Rt(e),a=b.support.boxSizing&&"border-box"===b.css(e,"boxSizing",!1,o);if(0>=i||null==i){if(i=Wt(e,t,o),(0>i||null==i)&&(i=e.style[t]),Yt.test(i))return i;r=a&&(b.support.boxSizingReliable||i===e.style[t]),i=parseFloat(i)||0}return i+an(e,t,n||(a?"border":"content"),r,o)+"px"}function un(e){var t=o,n=Gt[e];return n||(n=ln(e,t),"none"!==n&&n||(Pt=(Pt||b("<iframe frameborder='0' width='0' height='0'/>").css("cssText","display:block !important")).appendTo(t.documentElement),t=(Pt[0].contentWindow||Pt[0].contentDocument).document,t.write("<!doctype html><html><body>"),t.close(),n=ln(e,t),Pt.detach()),Gt[e]=n),n}function ln(e,t){var n=b(t.createElement(e)).appendTo(t.body),r=b.css(n[0],"display");return n.remove(),r}b.each(["height","width"],function(e,n){b.cssHooks[n]={get:function(e,r,i){return r?0===e.offsetWidth&&Xt.test(b.css(e,"display"))?b.swap(e,Qt,function(){return sn(e,n,i)}):sn(e,n,i):t},set:function(e,t,r){var i=r&&Rt(e);return on(e,t,r?an(e,n,r,b.support.boxSizing&&"border-box"===b.css(e,"boxSizing",!1,i),i):0)}}}),b.support.opacity||(b.cssHooks.opacity={get:function(e,t){return It.test((t&&e.currentStyle?e.currentStyle.filter:e.style.filter)||"")?.01*parseFloat(RegExp.$1)+"":t?"1":""},set:function(e,t){var n=e.style,r=e.currentStyle,i=b.isNumeric(t)?"alpha(opacity="+100*t+")":"",o=r&&r.filter||n.filter||"";n.zoom=1,(t>=1||""===t)&&""===b.trim(o.replace($t,""))&&n.removeAttribute&&(n.removeAttribute("filter"),""===t||r&&!r.filter)||(n.filter=$t.test(o)?o.replace($t,i):o+" "+i)}}),b(function(){b.support.reliableMarginRight||(b.cssHooks.marginRight={get:function(e,n){return n?b.swap(e,{display:"inline-block"},Wt,[e,"marginRight"]):t}}),!b.support.pixelPosition&&b.fn.position&&b.each(["top","left"],function(e,n){b.cssHooks[n]={get:function(e,r){return r?(r=Wt(e,n),Yt.test(r)?b(e).position()[n]+"px":r):t}}})}),b.expr&&b.expr.filters&&(b.expr.filters.hidden=function(e){return 0>=e.offsetWidth&&0>=e.offsetHeight||!b.support.reliableHiddenOffsets&&"none"===(e.style&&e.style.display||b.css(e,"display"))},b.expr.filters.visible=function(e){return!b.expr.filters.hidden(e)}),b.each({margin:"",padding:"",border:"Width"},function(e,t){b.cssHooks[e+t]={expand:function(n){var r=0,i={},o="string"==typeof n?n.split(" "):[n];for(;4>r;r++)i[e+Zt[r]+t]=o[r]||o[r-2]||o[0];return i}},Ut.test(e)||(b.cssHooks[e+t].set=on)});var cn=/%20/g,pn=/\[\]$/,fn=/\r?\n/g,dn=/^(?:submit|button|image|reset|file)$/i,hn=/^(?:input|select|textarea|keygen)/i;b.fn.extend({serialize:function(){return b.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=b.prop(this,"elements");return e?b.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!b(this).is(":disabled")&&hn.test(this.nodeName)&&!dn.test(e)&&(this.checked||!Nt.test(e))}).map(function(e,t){var n=b(this).val();return null==n?null:b.isArray(n)?b.map(n,function(e){return{name:t.name,value:e.replace(fn,"\r\n")}}):{name:t.name,value:n.replace(fn,"\r\n")}}).get()}}),b.param=function(e,n){var r,i=[],o=function(e,t){t=b.isFunction(t)?t():null==t?"":t,i[i.length]=encodeURIComponent(e)+"="+encodeURIComponent(t)};if(n===t&&(n=b.ajaxSettings&&b.ajaxSettings.traditional),b.isArray(e)||e.jquery&&!b.isPlainObject(e))b.each(e,function(){o(this.name,this.value)});else for(r in e)gn(r,e[r],n,o);return i.join("&").replace(cn,"+")};function gn(e,t,n,r){var i;if(b.isArray(t))b.each(t,function(t,i){n||pn.test(e)?r(e,i):gn(e+"["+("object"==typeof i?t:"")+"]",i,n,r)});else if(n||"object"!==b.type(t))r(e,t);else for(i in t)gn(e+"["+i+"]",t[i],n,r)}b.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(e,t){b.fn[t]=function(e,n){return arguments.length>0?this.on(t,null,e,n):this.trigger(t)}}),b.fn.hover=function(e,t){return this.mouseenter(e).mouseleave(t||e)};var mn,yn,vn=b.now(),bn=/\?/,xn=/#.*$/,wn=/([?&])_=[^&]*/,Tn=/^(.*?):[ \t]*([^\r\n]*)\r?$/gm,Nn=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Cn=/^(?:GET|HEAD)$/,kn=/^\/\//,En=/^([\w.+-]+:)(?:\/\/([^\/?#:]*)(?::(\d+)|)|)/,Sn=b.fn.load,An={},jn={},Dn="*/".concat("*");try{yn=a.href}catch(Ln){yn=o.createElement("a"),yn.href="",yn=yn.href}mn=En.exec(yn.toLowerCase())||[];function Hn(e){return function(t,n){"string"!=typeof t&&(n=t,t="*");var r,i=0,o=t.toLowerCase().match(w)||[];if(b.isFunction(n))while(r=o[i++])"+"===r[0]?(r=r.slice(1)||"*",(e[r]=e[r]||[]).unshift(n)):(e[r]=e[r]||[]).push(n)}}function qn(e,n,r,i){var o={},a=e===jn;function s(u){var l;return o[u]=!0,b.each(e[u]||[],function(e,u){var c=u(n,r,i);return"string"!=typeof c||a||o[c]?a?!(l=c):t:(n.dataTypes.unshift(c),s(c),!1)}),l}return s(n.dataTypes[0])||!o["*"]&&s("*")}function Mn(e,n){var r,i,o=b.ajaxSettings.flatOptions||{};for(i in n)n[i]!==t&&((o[i]?e:r||(r={}))[i]=n[i]);return r&&b.extend(!0,e,r),e}b.fn.load=function(e,n,r){if("string"!=typeof e&&Sn)return Sn.apply(this,arguments);var i,o,a,s=this,u=e.indexOf(" ");return u>=0&&(i=e.slice(u,e.length),e=e.slice(0,u)),b.isFunction(n)?(r=n,n=t):n&&"object"==typeof n&&(a="POST"),s.length>0&&b.ajax({url:e,type:a,dataType:"html",data:n}).done(function(e){o=arguments,s.html(i?b("<div>").append(b.parseHTML(e)).find(i):e)}).complete(r&&function(e,t){s.each(r,o||[e.responseText,t,e])}),this},b.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){b.fn[t]=function(e){return this.on(t,e)}}),b.each(["get","post"],function(e,n){b[n]=function(e,r,i,o){return b.isFunction(r)&&(o=o||i,i=r,r=t),b.ajax({url:e,type:n,dataType:o,data:r,success:i})}}),b.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:yn,type:"GET",isLocal:Nn.test(mn[1]),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Dn,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":e.String,"text html":!0,"text json":b.parseJSON,"text xml":b.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?Mn(Mn(e,b.ajaxSettings),t):Mn(b.ajaxSettings,e)},ajaxPrefilter:Hn(An),ajaxTransport:Hn(jn),ajax:function(e,n){"object"==typeof e&&(n=e,e=t),n=n||{};var r,i,o,a,s,u,l,c,p=b.ajaxSetup({},n),f=p.context||p,d=p.context&&(f.nodeType||f.jquery)?b(f):b.event,h=b.Deferred(),g=b.Callbacks("once memory"),m=p.statusCode||{},y={},v={},x=0,T="canceled",N={readyState:0,getResponseHeader:function(e){var t;if(2===x){if(!c){c={};while(t=Tn.exec(a))c[t[1].toLowerCase()]=t[2]}t=c[e.toLowerCase()]}return null==t?null:t},getAllResponseHeaders:function(){return 2===x?a:null},setRequestHeader:function(e,t){var n=e.toLowerCase();return x||(e=v[n]=v[n]||e,y[e]=t),this},overrideMimeType:function(e){return x||(p.mimeType=e),this},statusCode:function(e){var t;if(e)if(2>x)for(t in e)m[t]=[m[t],e[t]];else N.always(e[N.status]);return this},abort:function(e){var t=e||T;return l&&l.abort(t),k(0,t),this}};if(h.promise(N).complete=g.add,N.success=N.done,N.error=N.fail,p.url=((e||p.url||yn)+"").replace(xn,"").replace(kn,mn[1]+"//"),p.type=n.method||n.type||p.method||p.type,p.dataTypes=b.trim(p.dataType||"*").toLowerCase().match(w)||[""],null==p.crossDomain&&(r=En.exec(p.url.toLowerCase()),p.crossDomain=!(!r||r[1]===mn[1]&&r[2]===mn[2]&&(r[3]||("http:"===r[1]?80:443))==(mn[3]||("http:"===mn[1]?80:443)))),p.data&&p.processData&&"string"!=typeof p.data&&(p.data=b.param(p.data,p.traditional)),qn(An,p,n,N),2===x)return N;u=p.global,u&&0===b.active++&&b.event.trigger("ajaxStart"),p.type=p.type.toUpperCase(),p.hasContent=!Cn.test(p.type),o=p.url,p.hasContent||(p.data&&(o=p.url+=(bn.test(o)?"&":"?")+p.data,delete p.data),p.cache===!1&&(p.url=wn.test(o)?o.replace(wn,"$1_="+vn++):o+(bn.test(o)?"&":"?")+"_="+vn++)),p.ifModified&&(b.lastModified[o]&&N.setRequestHeader("If-Modified-Since",b.lastModified[o]),b.etag[o]&&N.setRequestHeader("If-None-Match",b.etag[o])),(p.data&&p.hasContent&&p.contentType!==!1||n.contentType)&&N.setRequestHeader("Content-Type",p.contentType),N.setRequestHeader("Accept",p.dataTypes[0]&&p.accepts[p.dataTypes[0]]?p.accepts[p.dataTypes[0]]+("*"!==p.dataTypes[0]?", "+Dn+"; q=0.01":""):p.accepts["*"]);for(i in p.headers)N.setRequestHeader(i,p.headers[i]);if(p.beforeSend&&(p.beforeSend.call(f,N,p)===!1||2===x))return N.abort();T="abort";for(i in{success:1,error:1,complete:1})N[i](p[i]);if(l=qn(jn,p,n,N)){N.readyState=1,u&&d.trigger("ajaxSend",[N,p]),p.async&&p.timeout>0&&(s=setTimeout(function(){N.abort("timeout")},p.timeout));try{x=1,l.send(y,k)}catch(C){if(!(2>x))throw C;k(-1,C)}}else k(-1,"No Transport");function k(e,n,r,i){var c,y,v,w,T,C=n;2!==x&&(x=2,s&&clearTimeout(s),l=t,a=i||"",N.readyState=e>0?4:0,r&&(w=_n(p,N,r)),e>=200&&300>e||304===e?(p.ifModified&&(T=N.getResponseHeader("Last-Modified"),T&&(b.lastModified[o]=T),T=N.getResponseHeader("etag"),T&&(b.etag[o]=T)),204===e?(c=!0,C="nocontent"):304===e?(c=!0,C="notmodified"):(c=Fn(p,w),C=c.state,y=c.data,v=c.error,c=!v)):(v=C,(e||!C)&&(C="error",0>e&&(e=0))),N.status=e,N.statusText=(n||C)+"",c?h.resolveWith(f,[y,C,N]):h.rejectWith(f,[N,C,v]),N.statusCode(m),m=t,u&&d.trigger(c?"ajaxSuccess":"ajaxError",[N,p,c?y:v]),g.fireWith(f,[N,C]),u&&(d.trigger("ajaxComplete",[N,p]),--b.active||b.event.trigger("ajaxStop")))}return N},getScript:function(e,n){return b.get(e,t,n,"script")},getJSON:function(e,t,n){return b.get(e,t,n,"json")}});function _n(e,n,r){var i,o,a,s,u=e.contents,l=e.dataTypes,c=e.responseFields;for(s in c)s in r&&(n[c[s]]=r[s]);while("*"===l[0])l.shift(),o===t&&(o=e.mimeType||n.getResponseHeader("Content-Type"));if(o)for(s in u)if(u[s]&&u[s].test(o)){l.unshift(s);break}if(l[0]in r)a=l[0];else{for(s in r){if(!l[0]||e.converters[s+" "+l[0]]){a=s;break}i||(i=s)}a=a||i}return a?(a!==l[0]&&l.unshift(a),r[a]):t}function Fn(e,t){var n,r,i,o,a={},s=0,u=e.dataTypes.slice(),l=u[0];if(e.dataFilter&&(t=e.dataFilter(t,e.dataType)),u[1])for(i in e.converters)a[i.toLowerCase()]=e.converters[i];for(;r=u[++s];)if("*"!==r){if("*"!==l&&l!==r){if(i=a[l+" "+r]||a["* "+r],!i)for(n in a)if(o=n.split(" "),o[1]===r&&(i=a[l+" "+o[0]]||a["* "+o[0]])){i===!0?i=a[n]:a[n]!==!0&&(r=o[0],u.splice(s--,0,r));break}if(i!==!0)if(i&&e["throws"])t=i(t);else try{t=i(t)}catch(c){return{state:"parsererror",error:i?c:"No conversion from "+l+" to "+r}}}l=r}return{state:"success",data:t}}b.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/(?:java|ecma)script/},converters:{"text script":function(e){return b.globalEval(e),e}}}),b.ajaxPrefilter("script",function(e){e.cache===t&&(e.cache=!1),e.crossDomain&&(e.type="GET",e.global=!1)}),b.ajaxTransport("script",function(e){if(e.crossDomain){var n,r=o.head||b("head")[0]||o.documentElement;return{send:function(t,i){n=o.createElement("script"),n.async=!0,e.scriptCharset&&(n.charset=e.scriptCharset),n.src=e.url,n.onload=n.onreadystatechange=function(e,t){(t||!n.readyState||/loaded|complete/.test(n.readyState))&&(n.onload=n.onreadystatechange=null,n.parentNode&&n.parentNode.removeChild(n),n=null,t||i(200,"success"))},r.insertBefore(n,r.firstChild)},abort:function(){n&&n.onload(t,!0)}}}});var On=[],Bn=/(=)\?(?=&|$)|\?\?/;b.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=On.pop()||b.expando+"_"+vn++;return this[e]=!0,e}}),b.ajaxPrefilter("json jsonp",function(n,r,i){var o,a,s,u=n.jsonp!==!1&&(Bn.test(n.url)?"url":"string"==typeof n.data&&!(n.contentType||"").indexOf("application/x-www-form-urlencoded")&&Bn.test(n.data)&&"data");return u||"jsonp"===n.dataTypes[0]?(o=n.jsonpCallback=b.isFunction(n.jsonpCallback)?n.jsonpCallback():n.jsonpCallback,u?n[u]=n[u].replace(Bn,"$1"+o):n.jsonp!==!1&&(n.url+=(bn.test(n.url)?"&":"?")+n.jsonp+"="+o),n.converters["script json"]=function(){return s||b.error(o+" was not called"),s[0]},n.dataTypes[0]="json",a=e[o],e[o]=function(){s=arguments},i.always(function(){e[o]=a,n[o]&&(n.jsonpCallback=r.jsonpCallback,On.push(o)),s&&b.isFunction(a)&&a(s[0]),s=a=t}),"script"):t});var Pn,Rn,Wn=0,$n=e.ActiveXObject&&function(){var e;for(e in Pn)Pn[e](t,!0)};function In(){try{return new e.XMLHttpRequest}catch(t){}}function zn(){try{return new e.ActiveXObject("Microsoft.XMLHTTP")}catch(t){}}b.ajaxSettings.xhr=e.ActiveXObject?function(){return!this.isLocal&&In()||zn()}:In,Rn=b.ajaxSettings.xhr(),b.support.cors=!!Rn&&"withCredentials"in Rn,Rn=b.support.ajax=!!Rn,Rn&&b.ajaxTransport(function(n){if(!n.crossDomain||b.support.cors){var r;return{send:function(i,o){var a,s,u=n.xhr();if(n.username?u.open(n.type,n.url,n.async,n.username,n.password):u.open(n.type,n.url,n.async),n.xhrFields)for(s in n.xhrFields)u[s]=n.xhrFields[s];n.mimeType&&u.overrideMimeType&&u.overrideMimeType(n.mimeType),n.crossDomain||i["X-Requested-With"]||(i["X-Requested-With"]="XMLHttpRequest");try{for(s in i)u.setRequestHeader(s,i[s])}catch(l){}u.send(n.hasContent&&n.data||null),r=function(e,i){var s,l,c,p;try{if(r&&(i||4===u.readyState))if(r=t,a&&(u.onreadystatechange=b.noop,$n&&delete Pn[a]),i)4!==u.readyState&&u.abort();else{p={},s=u.status,l=u.getAllResponseHeaders(),"string"==typeof u.responseText&&(p.text=u.responseText);try{c=u.statusText}catch(f){c=""}s||!n.isLocal||n.crossDomain?1223===s&&(s=204):s=p.text?200:404}}catch(d){i||o(-1,d)}p&&o(s,c,p,l)},n.async?4===u.readyState?setTimeout(r):(a=++Wn,$n&&(Pn||(Pn={},b(e).unload($n)),Pn[a]=r),u.onreadystatechange=r):r()},abort:function(){r&&r(t,!0)}}}});var Xn,Un,Vn=/^(?:toggle|show|hide)$/,Yn=RegExp("^(?:([+-])=|)("+x+")([a-z%]*)$","i"),Jn=/queueHooks$/,Gn=[nr],Qn={"*":[function(e,t){var n,r,i=this.createTween(e,t),o=Yn.exec(t),a=i.cur(),s=+a||0,u=1,l=20;if(o){if(n=+o[2],r=o[3]||(b.cssNumber[e]?"":"px"),"px"!==r&&s){s=b.css(i.elem,e,!0)||n||1;do u=u||".5",s/=u,b.style(i.elem,e,s+r);while(u!==(u=i.cur()/a)&&1!==u&&--l)}i.unit=r,i.start=s,i.end=o[1]?s+(o[1]+1)*n:n}return i}]};function Kn(){return setTimeout(function(){Xn=t}),Xn=b.now()}function Zn(e,t){b.each(t,function(t,n){var r=(Qn[t]||[]).concat(Qn["*"]),i=0,o=r.length;for(;o>i;i++)if(r[i].call(e,t,n))return})}function er(e,t,n){var r,i,o=0,a=Gn.length,s=b.Deferred().always(function(){delete u.elem}),u=function(){if(i)return!1;var t=Xn||Kn(),n=Math.max(0,l.startTime+l.duration-t),r=n/l.duration||0,o=1-r,a=0,u=l.tweens.length;for(;u>a;a++)l.tweens[a].run(o);return s.notifyWith(e,[l,o,n]),1>o&&u?n:(s.resolveWith(e,[l]),!1)},l=s.promise({elem:e,props:b.extend({},t),opts:b.extend(!0,{specialEasing:{}},n),originalProperties:t,originalOptions:n,startTime:Xn||Kn(),duration:n.duration,tweens:[],createTween:function(t,n){var r=b.Tween(e,l.opts,t,n,l.opts.specialEasing[t]||l.opts.easing);return l.tweens.push(r),r},stop:function(t){var n=0,r=t?l.tweens.length:0;if(i)return this;for(i=!0;r>n;n++)l.tweens[n].run(1);return t?s.resolveWith(e,[l,t]):s.rejectWith(e,[l,t]),this}}),c=l.props;for(tr(c,l.opts.specialEasing);a>o;o++)if(r=Gn[o].call(l,e,c,l.opts))return r;return Zn(l,c),b.isFunction(l.opts.start)&&l.opts.start.call(e,l),b.fx.timer(b.extend(u,{elem:e,anim:l,queue:l.opts.queue})),l.progress(l.opts.progress).done(l.opts.done,l.opts.complete).fail(l.opts.fail).always(l.opts.always)}function tr(e,t){var n,r,i,o,a;for(i in e)if(r=b.camelCase(i),o=t[r],n=e[i],b.isArray(n)&&(o=n[1],n=e[i]=n[0]),i!==r&&(e[r]=n,delete e[i]),a=b.cssHooks[r],a&&"expand"in a){n=a.expand(n),delete e[r];for(i in n)i in e||(e[i]=n[i],t[i]=o)}else t[r]=o}b.Animation=b.extend(er,{tweener:function(e,t){b.isFunction(e)?(t=e,e=["*"]):e=e.split(" ");var n,r=0,i=e.length;for(;i>r;r++)n=e[r],Qn[n]=Qn[n]||[],Qn[n].unshift(t)},prefilter:function(e,t){t?Gn.unshift(e):Gn.push(e)}});function nr(e,t,n){var r,i,o,a,s,u,l,c,p,f=this,d=e.style,h={},g=[],m=e.nodeType&&nn(e);n.queue||(c=b._queueHooks(e,"fx"),null==c.unqueued&&(c.unqueued=0,p=c.empty.fire,c.empty.fire=function(){c.unqueued||p()}),c.unqueued++,f.always(function(){f.always(function(){c.unqueued--,b.queue(e,"fx").length||c.empty.fire()})})),1===e.nodeType&&("height"in t||"width"in t)&&(n.overflow=[d.overflow,d.overflowX,d.overflowY],"inline"===b.css(e,"display")&&"none"===b.css(e,"float")&&(b.support.inlineBlockNeedsLayout&&"inline"!==un(e.nodeName)?d.zoom=1:d.display="inline-block")),n.overflow&&(d.overflow="hidden",b.support.shrinkWrapBlocks||f.always(function(){d.overflow=n.overflow[0],d.overflowX=n.overflow[1],d.overflowY=n.overflow[2]}));for(i in t)if(a=t[i],Vn.exec(a)){if(delete t[i],u=u||"toggle"===a,a===(m?"hide":"show"))continue;g.push(i)}if(o=g.length){s=b._data(e,"fxshow")||b._data(e,"fxshow",{}),"hidden"in s&&(m=s.hidden),u&&(s.hidden=!m),m?b(e).show():f.done(function(){b(e).hide()}),f.done(function(){var t;b._removeData(e,"fxshow");for(t in h)b.style(e,t,h[t])});for(i=0;o>i;i++)r=g[i],l=f.createTween(r,m?s[r]:0),h[r]=s[r]||b.style(e,r),r in s||(s[r]=l.start,m&&(l.end=l.start,l.start="width"===r||"height"===r?1:0))}}function rr(e,t,n,r,i){return new rr.prototype.init(e,t,n,r,i)}b.Tween=rr,rr.prototype={constructor:rr,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||"swing",this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(b.cssNumber[n]?"":"px")},cur:function(){var e=rr.propHooks[this.prop];return e&&e.get?e.get(this):rr.propHooks._default.get(this)},run:function(e){var t,n=rr.propHooks[this.prop];return this.pos=t=this.options.duration?b.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):rr.propHooks._default.set(this),this}},rr.prototype.init.prototype=rr.prototype,rr.propHooks={_default:{get:function(e){var t;return null==e.elem[e.prop]||e.elem.style&&null!=e.elem.style[e.prop]?(t=b.css(e.elem,e.prop,""),t&&"auto"!==t?t:0):e.elem[e.prop]},set:function(e){b.fx.step[e.prop]?b.fx.step[e.prop](e):e.elem.style&&(null!=e.elem.style[b.cssProps[e.prop]]||b.cssHooks[e.prop])?b.style(e.elem,e.prop,e.now+e.unit):e.elem[e.prop]=e.now}}},rr.propHooks.scrollTop=rr.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},b.each(["toggle","show","hide"],function(e,t){var n=b.fn[t];b.fn[t]=function(e,r,i){return null==e||"boolean"==typeof e?n.apply(this,arguments):this.animate(ir(t,!0),e,r,i)}}),b.fn.extend({fadeTo:function(e,t,n,r){return this.filter(nn).css("opacity",0).show().end().animate({opacity:t},e,n,r)},animate:function(e,t,n,r){var i=b.isEmptyObject(e),o=b.speed(t,n,r),a=function(){var t=er(this,b.extend({},e),o);a.finish=function(){t.stop(!0)},(i||b._data(this,"finish"))&&t.stop(!0)};return a.finish=a,i||o.queue===!1?this.each(a):this.queue(o.queue,a)},stop:function(e,n,r){var i=function(e){var t=e.stop;delete e.stop,t(r)};return"string"!=typeof e&&(r=n,n=e,e=t),n&&e!==!1&&this.queue(e||"fx",[]),this.each(function(){var t=!0,n=null!=e&&e+"queueHooks",o=b.timers,a=b._data(this);if(n)a[n]&&a[n].stop&&i(a[n]);else for(n in a)a[n]&&a[n].stop&&Jn.test(n)&&i(a[n]);for(n=o.length;n--;)o[n].elem!==this||null!=e&&o[n].queue!==e||(o[n].anim.stop(r),t=!1,o.splice(n,1));(t||!r)&&b.dequeue(this,e)})},finish:function(e){return e!==!1&&(e=e||"fx"),this.each(function(){var t,n=b._data(this),r=n[e+"queue"],i=n[e+"queueHooks"],o=b.timers,a=r?r.length:0;for(n.finish=!0,b.queue(this,e,[]),i&&i.cur&&i.cur.finish&&i.cur.finish.call(this),t=o.length;t--;)o[t].elem===this&&o[t].queue===e&&(o[t].anim.stop(!0),o.splice(t,1));for(t=0;a>t;t++)r[t]&&r[t].finish&&r[t].finish.call(this);delete n.finish})}});function ir(e,t){var n,r={height:e},i=0;for(t=t?1:0;4>i;i+=2-t)n=Zt[i],r["margin"+n]=r["padding"+n]=e;return t&&(r.opacity=r.width=e),r}b.each({slideDown:ir("show"),slideUp:ir("hide"),slideToggle:ir("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,t){b.fn[e]=function(e,n,r){return this.animate(t,e,n,r)}}),b.speed=function(e,t,n){var r=e&&"object"==typeof e?b.extend({},e):{complete:n||!n&&t||b.isFunction(e)&&e,duration:e,easing:n&&t||t&&!b.isFunction(t)&&t};return r.duration=b.fx.off?0:"number"==typeof r.duration?r.duration:r.duration in b.fx.speeds?b.fx.speeds[r.duration]:b.fx.speeds._default,(null==r.queue||r.queue===!0)&&(r.queue="fx"),r.old=r.complete,r.complete=function(){b.isFunction(r.old)&&r.old.call(this),r.queue&&b.dequeue(this,r.queue)},r},b.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2}},b.timers=[],b.fx=rr.prototype.init,b.fx.tick=function(){var e,n=b.timers,r=0;for(Xn=b.now();n.length>r;r++)e=n[r],e()||n[r]!==e||n.splice(r--,1);n.length||b.fx.stop(),Xn=t},b.fx.timer=function(e){e()&&b.timers.push(e)&&b.fx.start()},b.fx.interval=13,b.fx.start=function(){Un||(Un=setInterval(b.fx.tick,b.fx.interval))},b.fx.stop=function(){clearInterval(Un),Un=null},b.fx.speeds={slow:600,fast:200,_default:400},b.fx.step={},b.expr&&b.expr.filters&&(b.expr.filters.animated=function(e){return b.grep(b.timers,function(t){return e===t.elem}).length}),b.fn.offset=function(e){if(arguments.length)return e===t?this:this.each(function(t){b.offset.setOffset(this,e,t)});var n,r,o={top:0,left:0},a=this[0],s=a&&a.ownerDocument;if(s)return n=s.documentElement,b.contains(n,a)?(typeof a.getBoundingClientRect!==i&&(o=a.getBoundingClientRect()),r=or(s),{top:o.top+(r.pageYOffset||n.scrollTop)-(n.clientTop||0),left:o.left+(r.pageXOffset||n.scrollLeft)-(n.clientLeft||0)}):o},b.offset={setOffset:function(e,t,n){var r=b.css(e,"position");"static"===r&&(e.style.position="relative");var i=b(e),o=i.offset(),a=b.css(e,"top"),s=b.css(e,"left"),u=("absolute"===r||"fixed"===r)&&b.inArray("auto",[a,s])>-1,l={},c={},p,f;u?(c=i.position(),p=c.top,f=c.left):(p=parseFloat(a)||0,f=parseFloat(s)||0),b.isFunction(t)&&(t=t.call(e,n,o)),null!=t.top&&(l.top=t.top-o.top+p),null!=t.left&&(l.left=t.left-o.left+f),"using"in t?t.using.call(e,l):i.css(l)}},b.fn.extend({position:function(){if(this[0]){var e,t,n={top:0,left:0},r=this[0];return"fixed"===b.css(r,"position")?t=r.getBoundingClientRect():(e=this.offsetParent(),t=this.offset(),b.nodeName(e[0],"html")||(n=e.offset()),n.top+=b.css(e[0],"borderTopWidth",!0),n.left+=b.css(e[0],"borderLeftWidth",!0)),{top:t.top-n.top-b.css(r,"marginTop",!0),left:t.left-n.left-b.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent||o.documentElement;while(e&&!b.nodeName(e,"html")&&"static"===b.css(e,"position"))e=e.offsetParent;return e||o.documentElement})}}),b.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(e,n){var r=/Y/.test(n);b.fn[e]=function(i){return b.access(this,function(e,i,o){var a=or(e);return o===t?a?n in a?a[n]:a.document.documentElement[i]:e[i]:(a?a.scrollTo(r?b(a).scrollLeft():o,r?o:b(a).scrollTop()):e[i]=o,t)},e,i,arguments.length,null)}});function or(e){return b.isWindow(e)?e:9===e.nodeType?e.defaultView||e.parentWindow:!1}b.each({Height:"height",Width:"width"},function(e,n){b.each({padding:"inner"+e,content:n,"":"outer"+e},function(r,i){b.fn[i]=function(i,o){var a=arguments.length&&(r||"boolean"!=typeof i),s=r||(i===!0||o===!0?"margin":"border");return b.access(this,function(n,r,i){var o;return b.isWindow(n)?n.document.documentElement["client"+e]:9===n.nodeType?(o=n.documentElement,Math.max(n.body["scroll"+e],o["scroll"+e],n.body["offset"+e],o["offset"+e],o["client"+e])):i===t?b.css(n,r,s):b.style(n,r,i,s)},n,a?i:t,a,null)}})}),e.jQuery=e.$=b,"function"==typeof define&&define.amd&&define.amd.jQuery&&define("jquery",[],function(){return b})})(window);
\ No newline at end of file diff --git a/tbc/static/js/tests/index.html b/tbc/static/js/tests/index.html new file mode 100755 index 0000000..976ca16 --- /dev/null +++ b/tbc/static/js/tests/index.html @@ -0,0 +1,56 @@ +<!DOCTYPE HTML> +<html> +<head> + <title>Bootstrap Plugin Test Suite</title> + + <!-- jquery --> + <!--<script src="http://code.jquery.com/jquery-1.7.min.js"></script>--> + <script src="vendor/jquery.js"></script> + + <!-- qunit --> + <link rel="stylesheet" href="vendor/qunit.css" type="text/css" media="screen" /> + <script src="vendor/qunit.js"></script> + + <!-- phantomjs logging script--> + <script src="unit/bootstrap-phantom.js"></script> + + <!-- plugin sources --> + <script src="../../js/bootstrap-transition.js"></script> + <script src="../../js/bootstrap-alert.js"></script> + <script src="../../js/bootstrap-button.js"></script> + <script src="../../js/bootstrap-carousel.js"></script> + <script src="../../js/bootstrap-collapse.js"></script> + <script src="../../js/bootstrap-dropdown.js"></script> + <script src="../../js/bootstrap-modal.js"></script> + <script src="../../js/bootstrap-scrollspy.js"></script> + <script src="../../js/bootstrap-tab.js"></script> + <script src="../../js/bootstrap-tooltip.js"></script> + <script src="../../js/bootstrap-popover.js"></script> + <script src="../../js/bootstrap-typeahead.js"></script> + <script src="../../js/bootstrap-affix.js"></script> + + <!-- unit tests --> + <script src="unit/bootstrap-transition.js"></script> + <script src="unit/bootstrap-alert.js"></script> + <script src="unit/bootstrap-button.js"></script> + <script src="unit/bootstrap-carousel.js"></script> + <script src="unit/bootstrap-collapse.js"></script> + <script src="unit/bootstrap-dropdown.js"></script> + <script src="unit/bootstrap-modal.js"></script> + <script src="unit/bootstrap-scrollspy.js"></script> + <script src="unit/bootstrap-tab.js"></script> + <script src="unit/bootstrap-tooltip.js"></script> + <script src="unit/bootstrap-popover.js"></script> + <script src="unit/bootstrap-typeahead.js"></script> + <script src="unit/bootstrap-affix.js"></script> +</head> +<body> + <div> + <h1 id="qunit-header">Bootstrap Plugin Test Suite</h1> + <h2 id="qunit-banner"></h2> + <h2 id="qunit-userAgent"></h2> + <ol id="qunit-tests"></ol> + <div id="qunit-fixture"></div> + </div> +</body> +</html>
\ No newline at end of file diff --git a/tbc/static/js/tests/phantom.js b/tbc/static/js/tests/phantom.js new file mode 100755 index 0000000..4105bf5 --- /dev/null +++ b/tbc/static/js/tests/phantom.js @@ -0,0 +1,63 @@ +// Simple phantom.js integration script +// Adapted from Modernizr + +function waitFor(testFx, onReady, timeOutMillis) { + var maxtimeOutMillis = timeOutMillis ? timeOutMillis : 5001 //< Default Max Timout is 5s + , start = new Date().getTime() + , condition = false + , interval = setInterval(function () { + if ((new Date().getTime() - start < maxtimeOutMillis) && !condition) { + // If not time-out yet and condition not yet fulfilled + condition = (typeof(testFx) === "string" ? eval(testFx) : testFx()) //< defensive code + } else { + if (!condition) { + // If condition still not fulfilled (timeout but condition is 'false') + console.log("'waitFor()' timeout") + phantom.exit(1) + } else { + // Condition fulfilled (timeout and/or condition is 'true') + typeof(onReady) === "string" ? eval(onReady) : onReady() //< Do what it's supposed to do once the condition is fulfilled + clearInterval(interval) //< Stop this interval + } + } + }, 100) //< repeat check every 100ms +} + + +if (phantom.args.length === 0 || phantom.args.length > 2) { + console.log('Usage: phantom.js URL') + phantom.exit() +} + +var page = new WebPage() + +// Route "console.log()" calls from within the Page context to the main Phantom context (i.e. current "this") +page.onConsoleMessage = function(msg) { + console.log(msg) +}; + +page.open(phantom.args[0], function(status){ + if (status !== "success") { + console.log("Unable to access network") + phantom.exit() + } else { + waitFor(function(){ + return page.evaluate(function(){ + var el = document.getElementById('qunit-testresult') + if (el && el.innerText.match('completed')) { + return true + } + return false + }) + }, function(){ + var failedNum = page.evaluate(function(){ + var el = document.getElementById('qunit-testresult') + try { + return el.getElementsByClassName('failed')[0].innerHTML + } catch (e) { } + return 10000 + }); + phantom.exit((parseInt(failedNum, 10) > 0) ? 1 : 0) + }) + } +})
\ No newline at end of file diff --git a/tbc/static/js/tests/server.js b/tbc/static/js/tests/server.js new file mode 100755 index 0000000..7c8445f --- /dev/null +++ b/tbc/static/js/tests/server.js @@ -0,0 +1,14 @@ +/* + * Simple connect server for phantom.js + * Adapted from Modernizr + */ + +var connect = require('connect') + , http = require('http') + , fs = require('fs') + , app = connect() + .use(connect.static(__dirname + '/../../')); + +http.createServer(app).listen(3000); + +fs.writeFileSync(__dirname + '/pid.txt', process.pid, 'utf-8')
\ No newline at end of file diff --git a/tbc/static/js/tests/unit/bootstrap-affix.js b/tbc/static/js/tests/unit/bootstrap-affix.js new file mode 100755 index 0000000..c978878 --- /dev/null +++ b/tbc/static/js/tests/unit/bootstrap-affix.js @@ -0,0 +1,25 @@ +$(function () { + + module("bootstrap-affix") + + test("should provide no conflict", function () { + var affix = $.fn.affix.noConflict() + ok(!$.fn.affix, 'affix was set back to undefined (org value)') + $.fn.affix = affix + }) + + test("should be defined on jquery object", function () { + ok($(document.body).affix, 'affix method is defined') + }) + + test("should return element", function () { + ok($(document.body).affix()[0] == document.body, 'document.body returned') + }) + + test("should exit early if element is not visible", function () { + var $affix = $('<div style="display: none"></div>').affix() + $affix.data('affix').checkPosition() + ok(!$affix.hasClass('affix'), 'affix class was not added') + }) + +})
\ No newline at end of file diff --git a/tbc/static/js/tests/unit/bootstrap-alert.js b/tbc/static/js/tests/unit/bootstrap-alert.js new file mode 100755 index 0000000..9a6b514 --- /dev/null +++ b/tbc/static/js/tests/unit/bootstrap-alert.js @@ -0,0 +1,62 @@ +$(function () { + + module("bootstrap-alerts") + + test("should provide no conflict", function () { + var alert = $.fn.alert.noConflict() + ok(!$.fn.alert, 'alert was set back to undefined (org value)') + $.fn.alert = alert + }) + + test("should be defined on jquery object", function () { + ok($(document.body).alert, 'alert method is defined') + }) + + test("should return element", function () { + ok($(document.body).alert()[0] == document.body, 'document.body returned') + }) + + test("should fade element out on clicking .close", function () { + var alertHTML = '<div class="alert-message warning fade in">' + + '<a class="close" href="#" data-dismiss="alert">×</a>' + + '<p><strong>Holy guacamole!</strong> Best check yo self, you\'re not looking too good.</p>' + + '</div>' + , alert = $(alertHTML).alert() + + alert.find('.close').click() + + ok(!alert.hasClass('in'), 'remove .in class on .close click') + }) + + test("should remove element when clicking .close", function () { + $.support.transition = false + + var alertHTML = '<div class="alert-message warning fade in">' + + '<a class="close" href="#" data-dismiss="alert">×</a>' + + '<p><strong>Holy guacamole!</strong> Best check yo self, you\'re not looking too good.</p>' + + '</div>' + , alert = $(alertHTML).appendTo('#qunit-fixture').alert() + + ok($('#qunit-fixture').find('.alert-message').length, 'element added to dom') + + alert.find('.close').click() + + ok(!$('#qunit-fixture').find('.alert-message').length, 'element removed from dom') + }) + + test("should not fire closed when close is prevented", function () { + $.support.transition = false + stop(); + $('<div class="alert"/>') + .bind('close', function (e) { + e.preventDefault(); + ok(true); + start(); + }) + .bind('closed', function () { + ok(false); + }) + .alert('close') + }) + +})
\ No newline at end of file diff --git a/tbc/static/js/tests/unit/bootstrap-button.js b/tbc/static/js/tests/unit/bootstrap-button.js new file mode 100755 index 0000000..e23ff9e --- /dev/null +++ b/tbc/static/js/tests/unit/bootstrap-button.js @@ -0,0 +1,102 @@ +$(function () { + + module("bootstrap-buttons") + + test("should provide no conflict", function () { + var button = $.fn.button.noConflict() + ok(!$.fn.button, 'button was set back to undefined (org value)') + $.fn.button = button + }) + + test("should be defined on jquery object", function () { + ok($(document.body).button, 'button method is defined') + }) + + test("should return element", function () { + ok($(document.body).button()[0] == document.body, 'document.body returned') + }) + + test("should return set state to loading", function () { + var btn = $('<button class="btn" data-loading-text="fat">mdo</button>') + equals(btn.html(), 'mdo', 'btn text equals mdo') + btn.button('loading') + equals(btn.html(), 'fat', 'btn text equals fat') + stop() + setTimeout(function () { + ok(btn.attr('disabled'), 'btn is disabled') + ok(btn.hasClass('disabled'), 'btn has disabled class') + start() + }, 0) + }) + + test("should return reset state", function () { + var btn = $('<button class="btn" data-loading-text="fat">mdo</button>') + equals(btn.html(), 'mdo', 'btn text equals mdo') + btn.button('loading') + equals(btn.html(), 'fat', 'btn text equals fat') + stop() + setTimeout(function () { + ok(btn.attr('disabled'), 'btn is disabled') + ok(btn.hasClass('disabled'), 'btn has disabled class') + start() + stop() + }, 0) + btn.button('reset') + equals(btn.html(), 'mdo', 'btn text equals mdo') + setTimeout(function () { + ok(!btn.attr('disabled'), 'btn is not disabled') + ok(!btn.hasClass('disabled'), 'btn does not have disabled class') + start() + }, 0) + }) + + test("should toggle active", function () { + var btn = $('<button class="btn">mdo</button>') + ok(!btn.hasClass('active'), 'btn does not have active class') + btn.button('toggle') + ok(btn.hasClass('active'), 'btn has class active') + }) + + test("should toggle active when btn children are clicked", function () { + var btn = $('<button class="btn" data-toggle="button">mdo</button>') + , inner = $('<i></i>') + btn + .append(inner) + .appendTo($('#qunit-fixture')) + ok(!btn.hasClass('active'), 'btn does not have active class') + inner.click() + ok(btn.hasClass('active'), 'btn has class active') + }) + + test("should toggle active when btn children are clicked within btn-group", function () { + var btngroup = $('<div class="btn-group" data-toggle="buttons-checkbox"></div>') + , btn = $('<button class="btn">fat</button>') + , inner = $('<i></i>') + btngroup + .append(btn.append(inner)) + .appendTo($('#qunit-fixture')) + ok(!btn.hasClass('active'), 'btn does not have active class') + inner.click() + ok(btn.hasClass('active'), 'btn has class active') + }) + + test("should check for closest matching toggle", function () { + var group = $("<div data-toggle='buttons-radio'></div>") + , btn1 = $("<button class='btn active'></button>") + , btn2 = $("<button class='btn'></button>") + , wrap = $("<div></div>") + + wrap.append(btn1, btn2) + + group + .append(wrap) + .appendTo($('#qunit-fixture')) + + ok(btn1.hasClass('active'), 'btn1 has active class') + ok(!btn2.hasClass('active'), 'btn2 does not have active class') + btn2.click() + ok(!btn1.hasClass('active'), 'btn1 does not have active class') + ok(btn2.hasClass('active'), 'btn2 has active class') + }) + +})
\ No newline at end of file diff --git a/tbc/static/js/tests/unit/bootstrap-carousel.js b/tbc/static/js/tests/unit/bootstrap-carousel.js new file mode 100755 index 0000000..80b6e13 --- /dev/null +++ b/tbc/static/js/tests/unit/bootstrap-carousel.js @@ -0,0 +1,81 @@ +$(function () { + + module("bootstrap-carousel") + + test("should provide no conflict", function () { + var carousel = $.fn.carousel.noConflict() + ok(!$.fn.carousel, 'carousel was set back to undefined (org value)') + $.fn.carousel = carousel + }) + + test("should be defined on jquery object", function () { + ok($(document.body).carousel, 'carousel method is defined') + }) + + test("should return element", function () { + ok($(document.body).carousel()[0] == document.body, 'document.body returned') + }) + + test("should not fire sliden when slide is prevented", function () { + $.support.transition = false + stop() + $('<div class="carousel"/>') + .bind('slide', function (e) { + e.preventDefault(); + ok(true); + start(); + }) + .bind('slid', function () { + ok(false); + }) + .carousel('next') + }) + + test("should fire slide event with direction", function () { + var template = '<div id="myCarousel" class="carousel slide"><div class="carousel-inner"><div class="item active"><img alt=""><div class="carousel-caption"><h4>{{_i}}First Thumbnail label{{/i}}</h4><p>Cras justo odio, dapibus ac facilisis in, egestas eget quam. Donec id elit non mi porta gravida at eget metus. Nullam id dolor id nibh ultricies vehicula ut id elit.</p></div></div><div class="item"><img alt=""><div class="carousel-caption"><h4>{{_i}}Second Thumbnail label{{/i}}</h4><p>Cras justo odio, dapibus ac facilisis in, egestas eget quam. Donec id elit non mi porta gravida at eget metus. Nullam id dolor id nibh ultricies vehicula ut id elit.</p></div></div><div class="item"><img alt=""><div class="carousel-caption"><h4>{{_i}}Third Thumbnail label{{/i}}</h4><p>Cras justo odio, dapibus ac facilisis in, egestas eget quam. Donec id elit non mi porta gravida at eget metus. Nullam id dolor id nibh ultricies vehicula ut id elit.</p></div></div></div><a class="left carousel-control" href="#myCarousel" data-slide="prev">‹</a><a class="right carousel-control" href="#myCarousel" data-slide="next">›</a></div>' + $.support.transition = false + stop() + $(template).on('slide', function (e) { + e.preventDefault() + ok(e.direction) + ok(e.direction === 'right' || e.direction === 'left') + start() + }).carousel('next') + }) + + test("should fire slide event with relatedTarget", function () { + var template = '<div id="myCarousel" class="carousel slide"><div class="carousel-inner"><div class="item active"><img alt=""><div class="carousel-caption"><h4>{{_i}}First Thumbnail label{{/i}}</h4><p>Cras justo odio, dapibus ac facilisis in, egestas eget quam. Donec id elit non mi porta gravida at eget metus. Nullam id dolor id nibh ultricies vehicula ut id elit.</p></div></div><div class="item"><img alt=""><div class="carousel-caption"><h4>{{_i}}Second Thumbnail label{{/i}}</h4><p>Cras justo odio, dapibus ac facilisis in, egestas eget quam. Donec id elit non mi porta gravida at eget metus. Nullam id dolor id nibh ultricies vehicula ut id elit.</p></div></div><div class="item"><img alt=""><div class="carousel-caption"><h4>{{_i}}Third Thumbnail label{{/i}}</h4><p>Cras justo odio, dapibus ac facilisis in, egestas eget quam. Donec id elit non mi porta gravida at eget metus. Nullam id dolor id nibh ultricies vehicula ut id elit.</p></div></div></div><a class="left carousel-control" href="#myCarousel" data-slide="prev">‹</a><a class="right carousel-control" href="#myCarousel" data-slide="next">›</a></div>' + $.support.transition = false + stop() + $(template) + .on('slide', function (e) { + e.preventDefault(); + ok(e.relatedTarget); + ok($(e.relatedTarget).hasClass('item')); + start(); + }) + .carousel('next') + }) + + test("should set interval from data attribute", 3,function () { + var template = $('<div id="myCarousel" class="carousel slide"> <div class="carousel-inner"> <div class="item active"> <img alt=""> <div class="carousel-caption"> <h4>{{_i}}First Thumbnail label{{/i}}</h4> <p>Cras justo odio, dapibus ac facilisis in, egestas eget quam. Donec id elit non mi porta gravida at eget metus. Nullam id dolor id nibh ultricies vehicula ut id elit.</p> </div> </div> <div class="item"> <img alt=""> <div class="carousel-caption"> <h4>{{_i}}Second Thumbnail label{{/i}}</h4> <p>Cras justo odio, dapibus ac facilisis in, egestas eget quam. Donec id elit non mi porta gravida at eget metus. Nullam id dolor id nibh ultricies vehicula ut id elit.</p> </div> </div> <div class="item"> <img alt=""> <div class="carousel-caption"> <h4>{{_i}}Third Thumbnail label{{/i}}</h4> <p>Cras justo odio, dapibus ac facilisis in, egestas eget quam. Donec id elit non mi porta gravida at eget metus. Nullam id dolor id nibh ultricies vehicula ut id elit.</p> </div> </div> </div> <a class="left carousel-control" href="#myCarousel" data-slide="prev">‹</a> <a class="right carousel-control" href="#myCarousel" data-slide="next">›</a> </div>'); + template.attr("data-interval", 1814); + + template.appendTo("body"); + $('[data-slide]').first().click(); + ok($('#myCarousel').data('carousel').options.interval == 1814); + $('#myCarousel').remove(); + + template.appendTo("body").attr("data-modal", "foobar"); + $('[data-slide]').first().click(); + ok($('#myCarousel').data('carousel').options.interval == 1814, "even if there is an data-modal attribute set"); + $('#myCarousel').remove(); + + template.appendTo("body"); + $('[data-slide]').first().click(); + $('#myCarousel').attr('data-interval', 1860); + $('[data-slide]').first().click(); + ok($('#myCarousel').data('carousel').options.interval == 1814, "attributes should be read only on intitialization"); + $('#myCarousel').remove(); + }) +})
\ No newline at end of file diff --git a/tbc/static/js/tests/unit/bootstrap-collapse.js b/tbc/static/js/tests/unit/bootstrap-collapse.js new file mode 100755 index 0000000..4c5916e --- /dev/null +++ b/tbc/static/js/tests/unit/bootstrap-collapse.js @@ -0,0 +1,94 @@ +$(function () { + + module("bootstrap-collapse") + + test("should provide no conflict", function () { + var collapse = $.fn.collapse.noConflict() + ok(!$.fn.collapse, 'collapse was set back to undefined (org value)') + $.fn.collapse = collapse + }) + + test("should be defined on jquery object", function () { + ok($(document.body).collapse, 'collapse method is defined') + }) + + test("should return element", function () { + ok($(document.body).collapse()[0] == document.body, 'document.body returned') + }) + + test("should show a collapsed element", function () { + var el = $('<div class="collapse"></div>').collapse('show') + ok(el.hasClass('in'), 'has class in') + ok(/height/.test(el.attr('style')), 'has height set') + }) + + test("should hide a collapsed element", function () { + var el = $('<div class="collapse"></div>').collapse('hide') + ok(!el.hasClass('in'), 'does not have class in') + ok(/height/.test(el.attr('style')), 'has height set') + }) + + test("should not fire shown when show is prevented", function () { + $.support.transition = false + stop() + $('<div class="collapse"/>') + .bind('show', function (e) { + e.preventDefault(); + ok(true); + start(); + }) + .bind('shown', function () { + ok(false); + }) + .collapse('show') + }) + + test("should reset style to auto after finishing opening collapse", function () { + $.support.transition = false + stop() + $('<div class="collapse" style="height: 0px"/>') + .bind('show', function () { + ok(this.style.height == '0px') + }) + .bind('shown', function () { + ok(this.style.height == 'auto') + start() + }) + .collapse('show') + }) + + test("should add active class to target when collapse shown", function () { + $.support.transition = false + stop() + + var target = $('<a data-toggle="collapse" href="#test1"></a>') + .appendTo($('#qunit-fixture')) + + var collapsible = $('<div id="test1"></div>') + .appendTo($('#qunit-fixture')) + .on('show', function () { + ok(!target.hasClass('collapsed')) + start() + }) + + target.click() + }) + + test("should remove active class to target when collapse hidden", function () { + $.support.transition = false + stop() + + var target = $('<a data-toggle="collapse" href="#test1"></a>') + .appendTo($('#qunit-fixture')) + + var collapsible = $('<div id="test1" class="in"></div>') + .appendTo($('#qunit-fixture')) + .on('hide', function () { + ok(target.hasClass('collapsed')) + start() + }) + + target.click() + }) + +})
\ No newline at end of file diff --git a/tbc/static/js/tests/unit/bootstrap-dropdown.js b/tbc/static/js/tests/unit/bootstrap-dropdown.js new file mode 100755 index 0000000..2f0d2d2 --- /dev/null +++ b/tbc/static/js/tests/unit/bootstrap-dropdown.js @@ -0,0 +1,151 @@ +$(function () { + + module("bootstrap-dropdowns") + + test("should provide no conflict", function () { + var dropdown = $.fn.dropdown.noConflict() + ok(!$.fn.dropdown, 'dropdown was set back to undefined (org value)') + $.fn.dropdown = dropdown + }) + + test("should be defined on jquery object", function () { + ok($(document.body).dropdown, 'dropdown method is defined') + }) + + test("should return element", function () { + var el = $("<div />") + ok(el.dropdown()[0] === el[0], 'same element returned') + }) + + test("should not open dropdown if target is disabled", function () { + var dropdownHTML = '<ul class="tabs">' + + '<li class="dropdown">' + + '<button disabled href="#" class="btn dropdown-toggle" data-toggle="dropdown">Dropdown</button>' + + '<ul class="dropdown-menu">' + + '<li><a href="#">Secondary link</a></li>' + + '<li><a href="#">Something else here</a></li>' + + '<li class="divider"></li>' + + '<li><a href="#">Another link</a></li>' + + '</ul>' + + '</li>' + + '</ul>' + , dropdown = $(dropdownHTML).find('[data-toggle="dropdown"]').dropdown().click() + + ok(!dropdown.parent('.dropdown').hasClass('open'), 'open class added on click') + }) + + test("should not open dropdown if target is disabled", function () { + var dropdownHTML = '<ul class="tabs">' + + '<li class="dropdown">' + + '<button href="#" class="btn dropdown-toggle disabled" data-toggle="dropdown">Dropdown</button>' + + '<ul class="dropdown-menu">' + + '<li><a href="#">Secondary link</a></li>' + + '<li><a href="#">Something else here</a></li>' + + '<li class="divider"></li>' + + '<li><a href="#">Another link</a></li>' + + '</ul>' + + '</li>' + + '</ul>' + , dropdown = $(dropdownHTML).find('[data-toggle="dropdown"]').dropdown().click() + + ok(!dropdown.parent('.dropdown').hasClass('open'), 'open class added on click') + }) + + test("should add class open to menu if clicked", function () { + var dropdownHTML = '<ul class="tabs">' + + '<li class="dropdown">' + + '<a href="#" class="dropdown-toggle" data-toggle="dropdown">Dropdown</a>' + + '<ul class="dropdown-menu">' + + '<li><a href="#">Secondary link</a></li>' + + '<li><a href="#">Something else here</a></li>' + + '<li class="divider"></li>' + + '<li><a href="#">Another link</a></li>' + + '</ul>' + + '</li>' + + '</ul>' + , dropdown = $(dropdownHTML).find('[data-toggle="dropdown"]').dropdown().click() + + ok(dropdown.parent('.dropdown').hasClass('open'), 'open class added on click') + }) + + test("should test if element has a # before assuming it's a selector", function () { + var dropdownHTML = '<ul class="tabs">' + + '<li class="dropdown">' + + '<a href="/foo/" class="dropdown-toggle" data-toggle="dropdown">Dropdown</a>' + + '<ul class="dropdown-menu">' + + '<li><a href="#">Secondary link</a></li>' + + '<li><a href="#">Something else here</a></li>' + + '<li class="divider"></li>' + + '<li><a href="#">Another link</a></li>' + + '</ul>' + + '</li>' + + '</ul>' + , dropdown = $(dropdownHTML).find('[data-toggle="dropdown"]').dropdown().click() + + ok(dropdown.parent('.dropdown').hasClass('open'), 'open class added on click') + }) + + + test("should remove open class if body clicked", function () { + var dropdownHTML = '<ul class="tabs">' + + '<li class="dropdown">' + + '<a href="#" class="dropdown-toggle" data-toggle="dropdown">Dropdown</a>' + + '<ul class="dropdown-menu">' + + '<li><a href="#">Secondary link</a></li>' + + '<li><a href="#">Something else here</a></li>' + + '<li class="divider"></li>' + + '<li><a href="#">Another link</a></li>' + + '</ul>' + + '</li>' + + '</ul>' + , dropdown = $(dropdownHTML) + .appendTo('#qunit-fixture') + .find('[data-toggle="dropdown"]') + .dropdown() + .click() + ok(dropdown.parent('.dropdown').hasClass('open'), 'open class added on click') + $('body').click() + ok(!dropdown.parent('.dropdown').hasClass('open'), 'open class removed') + dropdown.remove() + }) + + test("should remove open class if body clicked, with multiple drop downs", function () { + var dropdownHTML = + '<ul class="nav">' + + ' <li><a href="#menu1">Menu 1</a></li>' + + ' <li class="dropdown" id="testmenu">' + + ' <a class="dropdown-toggle" data-toggle="dropdown" href="#testmenu">Test menu <b class="caret"></b></a>' + + ' <ul class="dropdown-menu" role="menu">' + + ' <li><a href="#sub1">Submenu 1</a></li>' + + ' </ul>' + + ' </li>' + + '</ul>' + + '<div class="btn-group">' + + ' <button class="btn">Actions</button>' + + ' <button class="btn dropdown-toggle" data-toggle="dropdown"><span class="caret"></span></button>' + + ' <ul class="dropdown-menu">' + + ' <li><a href="#">Action 1</a></li>' + + ' </ul>' + + '</div>' + , dropdowns = $(dropdownHTML).appendTo('#qunit-fixture').find('[data-toggle="dropdown"]') + , first = dropdowns.first() + , last = dropdowns.last() + + ok(dropdowns.length == 2, "Should be two dropdowns") + + first.click() + ok(first.parents('.open').length == 1, 'open class added on click') + ok($('#qunit-fixture .open').length == 1, 'only one object is open') + $('body').click() + ok($("#qunit-fixture .open").length === 0, 'open class removed') + + last.click() + ok(last.parent('.open').length == 1, 'open class added on click') + ok($('#qunit-fixture .open').length == 1, 'only one object is open') + $('body').click() + ok($("#qunit-fixture .open").length === 0, 'open class removed') + + $("#qunit-fixture").html("") + }) + +})
\ No newline at end of file diff --git a/tbc/static/js/tests/unit/bootstrap-modal.js b/tbc/static/js/tests/unit/bootstrap-modal.js new file mode 100755 index 0000000..b0096f8 --- /dev/null +++ b/tbc/static/js/tests/unit/bootstrap-modal.js @@ -0,0 +1,137 @@ +$(function () { + + module("bootstrap-modal") + + test("should provide no conflict", function () { + var modal = $.fn.modal.noConflict() + ok(!$.fn.modal, 'modal was set back to undefined (org value)') + $.fn.modal = modal + }) + + test("should be defined on jquery object", function () { + var div = $("<div id='modal-test'></div>") + ok(div.modal, 'modal method is defined') + }) + + test("should return element", function () { + var div = $("<div id='modal-test'></div>") + ok(div.modal() == div, 'document.body returned') + $('#modal-test').remove() + }) + + test("should expose defaults var for settings", function () { + ok($.fn.modal.defaults, 'default object exposed') + }) + + test("should insert into dom when show method is called", function () { + stop() + $.support.transition = false + $("<div id='modal-test'></div>") + .bind("shown", function () { + ok($('#modal-test').length, 'modal insterted into dom') + $(this).remove() + start() + }) + .modal("show") + }) + + test("should fire show event", function () { + stop() + $.support.transition = false + $("<div id='modal-test'></div>") + .bind("show", function () { + ok(true, "show was called") + }) + .bind("shown", function () { + $(this).remove() + start() + }) + .modal("show") + }) + + test("should not fire shown when default prevented", function () { + stop() + $.support.transition = false + $("<div id='modal-test'></div>") + .bind("show", function (e) { + e.preventDefault() + ok(true, "show was called") + start() + }) + .bind("shown", function () { + ok(false, "shown was called") + }) + .modal("show") + }) + + test("should hide modal when hide is called", function () { + stop() + $.support.transition = false + + $("<div id='modal-test'></div>") + .bind("shown", function () { + ok($('#modal-test').is(":visible"), 'modal visible') + ok($('#modal-test').length, 'modal insterted into dom') + $(this).modal("hide") + }) + .bind("hidden", function() { + ok(!$('#modal-test').is(":visible"), 'modal hidden') + $('#modal-test').remove() + start() + }) + .modal("show") + }) + + test("should toggle when toggle is called", function () { + stop() + $.support.transition = false + var div = $("<div id='modal-test'></div>") + div + .bind("shown", function () { + ok($('#modal-test').is(":visible"), 'modal visible') + ok($('#modal-test').length, 'modal insterted into dom') + div.modal("toggle") + }) + .bind("hidden", function() { + ok(!$('#modal-test').is(":visible"), 'modal hidden') + div.remove() + start() + }) + .modal("toggle") + }) + + test("should remove from dom when click [data-dismiss=modal]", function () { + stop() + $.support.transition = false + var div = $("<div id='modal-test'><span class='close' data-dismiss='modal'></span></div>") + div + .bind("shown", function () { + ok($('#modal-test').is(":visible"), 'modal visible') + ok($('#modal-test').length, 'modal insterted into dom') + div.find('.close').click() + }) + .bind("hidden", function() { + ok(!$('#modal-test').is(":visible"), 'modal hidden') + div.remove() + start() + }) + .modal("toggle") + }) + + test("should allow modal close with 'backdrop:false'", function () { + stop() + $.support.transition = false + var div = $("<div>", { id: 'modal-test', "data-backdrop": false }) + div + .bind("shown", function () { + ok($('#modal-test').is(":visible"), 'modal visible') + div.modal("hide") + }) + .bind("hidden", function() { + ok(!$('#modal-test').is(":visible"), 'modal hidden') + div.remove() + start() + }) + .modal("show") + }) +})
\ No newline at end of file diff --git a/tbc/static/js/tests/unit/bootstrap-phantom.js b/tbc/static/js/tests/unit/bootstrap-phantom.js new file mode 100755 index 0000000..a04aeaa --- /dev/null +++ b/tbc/static/js/tests/unit/bootstrap-phantom.js @@ -0,0 +1,21 @@ +// Logging setup for phantom integration +// adapted from Modernizr + +QUnit.begin = function () { + console.log("Starting test suite") + console.log("================================================\n") +} + +QUnit.moduleDone = function (opts) { + if (opts.failed === 0) { + console.log("\u2714 All tests passed in '" + opts.name + "' module") + } else { + console.log("\u2716 " + opts.failed + " tests failed in '" + opts.name + "' module") + } +} + +QUnit.done = function (opts) { + console.log("\n================================================") + console.log("Tests completed in " + opts.runtime + " milliseconds") + console.log(opts.passed + " tests of " + opts.total + " passed, " + opts.failed + " failed.") +}
\ No newline at end of file diff --git a/tbc/static/js/tests/unit/bootstrap-popover.js b/tbc/static/js/tests/unit/bootstrap-popover.js new file mode 100755 index 0000000..20234e1 --- /dev/null +++ b/tbc/static/js/tests/unit/bootstrap-popover.js @@ -0,0 +1,113 @@ +$(function () { + + module("bootstrap-popover") + + test("should provide no conflict", function () { + var popover = $.fn.popover.noConflict() + ok(!$.fn.popover, 'popover was set back to undefined (org value)') + $.fn.popover = popover + }) + + test("should be defined on jquery object", function () { + var div = $('<div></div>') + ok(div.popover, 'popover method is defined') + }) + + test("should return element", function () { + var div = $('<div></div>') + ok(div.popover() == div, 'document.body returned') + }) + + test("should render popover element", function () { + $.support.transition = false + var popover = $('<a href="#" title="mdo" data-content="http://twitter.com/mdo">@mdo</a>') + .appendTo('#qunit-fixture') + .popover('show') + + ok($('.popover').length, 'popover was inserted') + popover.popover('hide') + ok(!$(".popover").length, 'popover removed') + }) + + test("should store popover instance in popover data object", function () { + $.support.transition = false + var popover = $('<a href="#" title="mdo" data-content="http://twitter.com/mdo">@mdo</a>') + .popover() + + ok(!!popover.data('popover'), 'popover instance exists') + }) + + test("should get title and content from options", function () { + $.support.transition = false + var popover = $('<a href="#">@fat</a>') + .appendTo('#qunit-fixture') + .popover({ + title: function () { + return '@fat' + } + , content: function () { + return 'loves writing tests (╯°□°)╯︵ ┻━┻' + } + }) + + popover.popover('show') + + ok($('.popover').length, 'popover was inserted') + equals($('.popover .popover-title').text(), '@fat', 'title correctly inserted') + equals($('.popover .popover-content').text(), 'loves writing tests (╯°□°)╯︵ ┻━┻', 'content correctly inserted') + + popover.popover('hide') + ok(!$('.popover').length, 'popover was removed') + $('#qunit-fixture').empty() + }) + + test("should get title and content from attributes", function () { + $.support.transition = false + var popover = $('<a href="#" title="@mdo" data-content="loves data attributes (づ。◕‿‿◕。)づ ︵ ┻━┻" >@mdo</a>') + .appendTo('#qunit-fixture') + .popover() + .popover('show') + + ok($('.popover').length, 'popover was inserted') + equals($('.popover .popover-title').text(), '@mdo', 'title correctly inserted') + equals($('.popover .popover-content').text(), "loves data attributes (づ。◕‿‿◕。)づ ︵ ┻━┻", 'content correctly inserted') + + popover.popover('hide') + ok(!$('.popover').length, 'popover was removed') + $('#qunit-fixture').empty() + }) + + test("should respect custom classes", function() { + $.support.transition = false + var popover = $('<a href="#">@fat</a>') + .appendTo('#qunit-fixture') + .popover({ + title: 'Test' + , content: 'Test' + , template: '<div class="popover foobar"><div class="arrow"></div><div class="inner"><h3 class="title"></h3><div class="content"><p></p></div></div></div>' + }) + + popover.popover('show') + + ok($('.popover').length, 'popover was inserted') + ok($('.popover').hasClass('foobar'), 'custom class is present') + + popover.popover('hide') + ok(!$('.popover').length, 'popover was removed') + $('#qunit-fixture').empty() + }) + + test("should destroy popover", function () { + var popover = $('<div/>').popover({trigger: 'hover'}).on('click.foo', function(){}) + ok(popover.data('popover'), 'popover has data') + ok($._data(popover[0], 'events').mouseover && $._data(popover[0], 'events').mouseout, 'popover has hover event') + ok($._data(popover[0], 'events').click[0].namespace == 'foo', 'popover has extra click.foo event') + popover.popover('show') + popover.popover('destroy') + ok(!popover.hasClass('in'), 'popover is hidden') + ok(!popover.data('popover'), 'popover does not have data') + ok($._data(popover[0],'events').click[0].namespace == 'foo', 'popover still has click.foo') + ok(!$._data(popover[0], 'events').mouseover && !$._data(popover[0], 'events').mouseout, 'popover does not have any events') + }) + +})
\ No newline at end of file diff --git a/tbc/static/js/tests/unit/bootstrap-scrollspy.js b/tbc/static/js/tests/unit/bootstrap-scrollspy.js new file mode 100755 index 0000000..32bfa71 --- /dev/null +++ b/tbc/static/js/tests/unit/bootstrap-scrollspy.js @@ -0,0 +1,37 @@ +$(function () { + + module("bootstrap-scrollspy") + + test("should provide no conflict", function () { + var scrollspy = $.fn.scrollspy.noConflict() + ok(!$.fn.scrollspy, 'scrollspy was set back to undefined (org value)') + $.fn.scrollspy = scrollspy + }) + + test("should be defined on jquery object", function () { + ok($(document.body).scrollspy, 'scrollspy method is defined') + }) + + test("should return element", function () { + ok($(document.body).scrollspy()[0] == document.body, 'document.body returned') + }) + + test("should switch active class on scroll", function () { + var sectionHTML = '<div id="masthead"></div>' + , $section = $(sectionHTML).append('#qunit-fixture') + , topbarHTML ='<div class="topbar">' + + '<div class="topbar-inner">' + + '<div class="container">' + + '<h3><a href="#">Bootstrap</a></h3>' + + '<ul class="nav">' + + '<li><a href="#masthead">Overview</a></li>' + + '</ul>' + + '</div>' + + '</div>' + + '</div>' + , $topbar = $(topbarHTML).scrollspy() + + ok($topbar.find('.active', true)) + }) + +})
\ No newline at end of file diff --git a/tbc/static/js/tests/unit/bootstrap-tab.js b/tbc/static/js/tests/unit/bootstrap-tab.js new file mode 100755 index 0000000..ba5910d --- /dev/null +++ b/tbc/static/js/tests/unit/bootstrap-tab.js @@ -0,0 +1,86 @@ +$(function () { + + module("bootstrap-tabs") + + test("should provide no conflict", function () { + var tab = $.fn.tab.noConflict() + ok(!$.fn.tab, 'tab was set back to undefined (org value)') + $.fn.tab = tab + }) + + test("should be defined on jquery object", function () { + ok($(document.body).tab, 'tabs method is defined') + }) + + test("should return element", function () { + ok($(document.body).tab()[0] == document.body, 'document.body returned') + }) + + test("should activate element by tab id", function () { + var tabsHTML = + '<ul class="tabs">' + + '<li><a href="#home">Home</a></li>' + + '<li><a href="#profile">Profile</a></li>' + + '</ul>' + + $('<ul><li id="home"></li><li id="profile"></li></ul>').appendTo("#qunit-fixture") + + $(tabsHTML).find('li:last a').tab('show') + equals($("#qunit-fixture").find('.active').attr('id'), "profile") + + $(tabsHTML).find('li:first a').tab('show') + equals($("#qunit-fixture").find('.active').attr('id'), "home") + }) + + test("should activate element by tab id", function () { + var pillsHTML = + '<ul class="pills">' + + '<li><a href="#home">Home</a></li>' + + '<li><a href="#profile">Profile</a></li>' + + '</ul>' + + $('<ul><li id="home"></li><li id="profile"></li></ul>').appendTo("#qunit-fixture") + + $(pillsHTML).find('li:last a').tab('show') + equals($("#qunit-fixture").find('.active').attr('id'), "profile") + + $(pillsHTML).find('li:first a').tab('show') + equals($("#qunit-fixture").find('.active').attr('id'), "home") + }) + + + test("should not fire closed when close is prevented", function () { + $.support.transition = false + stop(); + $('<div class="tab"/>') + .bind('show', function (e) { + e.preventDefault(); + ok(true); + start(); + }) + .bind('shown', function () { + ok(false); + }) + .tab('show') + }) + + test("show and shown events should reference correct relatedTarget", function () { + var dropHTML = + '<ul class="drop">' + + '<li class="dropdown"><a data-toggle="dropdown" href="#">1</a>' + + '<ul class="dropdown-menu">' + + '<li><a href="#1-1" data-toggle="tab">1-1</a></li>' + + '<li><a href="#1-2" data-toggle="tab">1-2</a></li>' + + '</ul>' + + '</li>' + + '</ul>' + + $(dropHTML).find('ul>li:first a').tab('show').end() + .find('ul>li:last a').on('show', function(event){ + equals(event.relatedTarget.hash, "#1-1") + }).on('shown', function(event){ + equals(event.relatedTarget.hash, "#1-1") + }).tab('show') + }) + +})
\ No newline at end of file diff --git a/tbc/static/js/tests/unit/bootstrap-tooltip.js b/tbc/static/js/tests/unit/bootstrap-tooltip.js new file mode 100755 index 0000000..5b37b4e --- /dev/null +++ b/tbc/static/js/tests/unit/bootstrap-tooltip.js @@ -0,0 +1,294 @@ +$(function () { + + module("bootstrap-tooltip") + + test("should provide no conflict", function () { + var tooltip = $.fn.tooltip.noConflict() + ok(!$.fn.tooltip, 'tooltip was set back to undefined (org value)') + $.fn.tooltip = tooltip + }) + + test("should be defined on jquery object", function () { + var div = $("<div></div>") + ok(div.tooltip, 'popover method is defined') + }) + + test("should return element", function () { + var div = $("<div></div>") + ok(div.tooltip() == div, 'document.body returned') + }) + + test("should expose default settings", function () { + ok(!!$.fn.tooltip.defaults, 'defaults is defined') + }) + + test("should empty title attribute", function () { + var tooltip = $('<a href="#" rel="tooltip" title="Another tooltip"></a>').tooltip() + ok(tooltip.attr('title') === '', 'title attribute was emptied') + }) + + test("should add data attribute for referencing original title", function () { + var tooltip = $('<a href="#" rel="tooltip" title="Another tooltip"></a>').tooltip() + equals(tooltip.attr('data-original-title'), 'Another tooltip', 'original title preserved in data attribute') + }) + + test("should place tooltips relative to placement option", function () { + $.support.transition = false + var tooltip = $('<a href="#" rel="tooltip" title="Another tooltip"></a>') + .appendTo('#qunit-fixture') + .tooltip({placement: 'bottom'}) + .tooltip('show') + + ok($(".tooltip").is('.fade.bottom.in'), 'has correct classes applied') + tooltip.tooltip('hide') + }) + + test("should allow html entities", function () { + $.support.transition = false + var tooltip = $('<a href="#" rel="tooltip" title="<b>@fat</b>"></a>') + .appendTo('#qunit-fixture') + .tooltip({html: true}) + .tooltip('show') + + ok($('.tooltip b').length, 'b tag was inserted') + tooltip.tooltip('hide') + ok(!$(".tooltip").length, 'tooltip removed') + }) + + test("should respect custom classes", function () { + var tooltip = $('<a href="#" rel="tooltip" title="Another tooltip"></a>') + .appendTo('#qunit-fixture') + .tooltip({ template: '<div class="tooltip some-class"><div class="tooltip-arrow"/><div class="tooltip-inner"/></div>'}) + .tooltip('show') + + ok($('.tooltip').hasClass('some-class'), 'custom class is present') + tooltip.tooltip('hide') + ok(!$(".tooltip").length, 'tooltip removed') + }) + + test("should fire show event", function () { + stop() + var tooltip = $('<div title="tooltip title"></div>') + .bind("show", function() { + ok(true, "show was called") + start() + }) + .tooltip('show') + }) + + test("should fire shown event", function () { + stop() + var tooltip = $('<div title="tooltip title"></div>') + .bind("shown", function() { + ok(true, "shown was called") + start() + }) + .tooltip('show') + }) + + test("should not fire shown event when default prevented", function () { + stop() + var tooltip = $('<div title="tooltip title"></div>') + .bind("show", function(e) { + e.preventDefault() + ok(true, "show was called") + start() + }) + .bind("shown", function() { + ok(false, "shown was called") + }) + .tooltip('show') + }) + + test("should fire hide event", function () { + stop() + var tooltip = $('<div title="tooltip title"></div>') + .bind("shown", function() { + $(this).tooltip('hide') + }) + .bind("hide", function() { + ok(true, "hide was called") + start() + }) + .tooltip('show') + }) + + test("should fire hidden event", function () { + stop() + var tooltip = $('<div title="tooltip title"></div>') + .bind("shown", function() { + $(this).tooltip('hide') + }) + .bind("hidden", function() { + ok(true, "hidden was called") + start() + }) + .tooltip('show') + }) + + test("should not fire hidden event when default prevented", function () { + stop() + var tooltip = $('<div title="tooltip title"></div>') + .bind("shown", function() { + $(this).tooltip('hide') + }) + .bind("hide", function(e) { + e.preventDefault() + ok(true, "hide was called") + start() + }) + .bind("hidden", function() { + ok(false, "hidden was called") + }) + .tooltip('show') + }) + + test("should not show tooltip if leave event occurs before delay expires", function () { + var tooltip = $('<a href="#" rel="tooltip" title="Another tooltip"></a>') + .appendTo('#qunit-fixture') + .tooltip({ delay: 200 }) + + stop() + + tooltip.trigger('mouseenter') + + setTimeout(function () { + ok(!$(".tooltip").is('.fade.in'), 'tooltip is not faded in') + tooltip.trigger('mouseout') + setTimeout(function () { + ok(!$(".tooltip").is('.fade.in'), 'tooltip is not faded in') + start() + }, 200) + }, 100) + }) + + test("should not show tooltip if leave event occurs before delay expires, even if hide delay is 0", function () { + var tooltip = $('<a href="#" rel="tooltip" title="Another tooltip"></a>') + .appendTo('#qunit-fixture') + .tooltip({ delay: { show: 200, hide: 0} }) + + stop() + + tooltip.trigger('mouseenter') + + setTimeout(function () { + ok(!$(".tooltip").is('.fade.in'), 'tooltip is not faded in') + tooltip.trigger('mouseout') + setTimeout(function () { + ok(!$(".tooltip").is('.fade.in'), 'tooltip is not faded in') + start() + }, 200) + }, 100) + }) + + test("should not show tooltip if leave event occurs before delay expires", function () { + var tooltip = $('<a href="#" rel="tooltip" title="Another tooltip"></a>') + .appendTo('#qunit-fixture') + .tooltip({ delay: 100 }) + stop() + tooltip.trigger('mouseenter') + setTimeout(function () { + ok(!$(".tooltip").is('.fade.in'), 'tooltip is not faded in') + tooltip.trigger('mouseout') + setTimeout(function () { + ok(!$(".tooltip").is('.fade.in'), 'tooltip is not faded in') + start() + }, 100) + }, 50) + }) + + test("should show tooltip if leave event hasn't occured before delay expires", function () { + var tooltip = $('<a href="#" rel="tooltip" title="Another tooltip"></a>') + .appendTo('#qunit-fixture') + .tooltip({ delay: 150 }) + stop() + tooltip.trigger('mouseenter') + setTimeout(function () { + ok(!$(".tooltip").is('.fade.in'), 'tooltip is not faded in') + }, 100) + setTimeout(function () { + ok($(".tooltip").is('.fade.in'), 'tooltip has faded in') + start() + }, 200) + }) + + test("should destroy tooltip", function () { + var tooltip = $('<div/>').tooltip().on('click.foo', function(){}) + ok(tooltip.data('tooltip'), 'tooltip has data') + ok($._data(tooltip[0], 'events').mouseover && $._data(tooltip[0], 'events').mouseout, 'tooltip has hover event') + ok($._data(tooltip[0], 'events').click[0].namespace == 'foo', 'tooltip has extra click.foo event') + tooltip.tooltip('show') + tooltip.tooltip('destroy') + ok(!tooltip.hasClass('in'), 'tooltip is hidden') + ok(!$._data(tooltip[0], 'tooltip'), 'tooltip does not have data') + ok($._data(tooltip[0], 'events').click[0].namespace == 'foo', 'tooltip still has click.foo') + ok(!$._data(tooltip[0], 'events').mouseover && !$._data(tooltip[0], 'events').mouseout, 'tooltip does not have any events') + }) + + test("should show tooltip with delegate selector on click", function () { + var div = $('<div><a href="#" rel="tooltip" title="Another tooltip"></a></div>') + var tooltip = div.appendTo('#qunit-fixture') + .tooltip({ selector: 'a[rel=tooltip]', + trigger: 'click' }) + div.find('a').trigger('click') + ok($(".tooltip").is('.fade.in'), 'tooltip is faded in') + }) + + test("should show tooltip when toggle is called", function () { + var tooltip = $('<a href="#" rel="tooltip" title="tooltip on toggle"></a>') + .appendTo('#qunit-fixture') + .tooltip({trigger: 'manual'}) + .tooltip('toggle') + ok($(".tooltip").is('.fade.in'), 'tooltip should be toggled in') + }) + + test("should place tooltips inside the body", function () { + var tooltip = $('<a href="#" rel="tooltip" title="Another tooltip"></a>') + .appendTo('#qunit-fixture') + .tooltip({container:'body'}) + .tooltip('show') + ok($("body > .tooltip").length, 'inside the body') + ok(!$("#qunit-fixture > .tooltip").length, 'not found in parent') + tooltip.tooltip('hide') + }) + + test("should place tooltip inside window", function(){ + var container = $("<div />").appendTo("body") + .css({position: "absolute", width: 200, height: 200, bottom: 0, left: 0}) + , tooltip = $("<a href='#' title='Very very very very very very very very long tooltip'>Hover me</a>") + .css({position: "absolute", top:0, left: 0}) + .appendTo(container) + .tooltip({placement: "top", animate: false}) + .tooltip("show") + + stop() + + setTimeout(function(){ + ok($(".tooltip").offset().left >= 0) + + start() + container.remove() + }, 100) + }) + + test("should place tooltip on top of element", function(){ + var container = $("<div />").appendTo("body") + .css({position: "absolute", bottom: 0, left: 0, textAlign: "right", width: 300, height: 300}) + , p = $("<p style='margin-top:200px' />").appendTo(container) + , tooltiped = $("<a href='#' title='very very very very very very very long tooltip'>Hover me</a>") + .css({marginTop: 200}) + .appendTo(p) + .tooltip({placement: "top", animate: false}) + .tooltip("show") + + stop() + + setTimeout(function(){ + var tooltip = container.find(".tooltip") + + start() + ok(tooltip.offset().top + tooltip.outerHeight() <= tooltiped.offset().top) + container.remove() + }, 100) + }) +}) diff --git a/tbc/static/js/tests/unit/bootstrap-transition.js b/tbc/static/js/tests/unit/bootstrap-transition.js new file mode 100755 index 0000000..086773f --- /dev/null +++ b/tbc/static/js/tests/unit/bootstrap-transition.js @@ -0,0 +1,13 @@ +$(function () { + + module("bootstrap-transition") + + test("should be defined on jquery support object", function () { + ok($.support.transition !== undefined, 'transition object is defined') + }) + + test("should provide an end object", function () { + ok($.support.transition ? $.support.transition.end : true, 'end string is defined') + }) + +})
\ No newline at end of file diff --git a/tbc/static/js/tests/unit/bootstrap-typeahead.js b/tbc/static/js/tests/unit/bootstrap-typeahead.js new file mode 100755 index 0000000..0aa2d61 --- /dev/null +++ b/tbc/static/js/tests/unit/bootstrap-typeahead.js @@ -0,0 +1,236 @@ +$(function () { + + module("bootstrap-typeahead") + + test("should provide no conflict", function () { + var typeahead = $.fn.typeahead.noConflict() + ok(!$.fn.typeahead, 'typeahead was set back to undefined (org value)') + $.fn.typeahead = typeahead + }) + + test("should be defined on jquery object", function () { + ok($(document.body).typeahead, 'alert method is defined') + }) + + test("should return element", function () { + ok($(document.body).typeahead()[0] == document.body, 'document.body returned') + }) + + test("should listen to an input", function () { + var $input = $('<input />') + $input.typeahead() + ok($._data($input[0], 'events').blur, 'has a blur event') + ok($._data($input[0], 'events').keypress, 'has a keypress event') + ok($._data($input[0], 'events').keyup, 'has a keyup event') + }) + + test("should create a menu", function () { + var $input = $('<input />') + ok($input.typeahead().data('typeahead').$menu, 'has a menu') + }) + + test("should listen to the menu", function () { + var $input = $('<input />') + , $menu = $input.typeahead().data('typeahead').$menu + + ok($._data($menu[0], 'events').mouseover, 'has a mouseover(pseudo: mouseenter)') + ok($._data($menu[0], 'events').click, 'has a click') + }) + + test("should show menu when query entered", function () { + var $input = $('<input />') + .appendTo('body') + .typeahead({ + source: ['aa', 'ab', 'ac'] + }) + , typeahead = $input.data('typeahead') + + $input.val('a') + typeahead.lookup() + + ok(typeahead.$menu.is(":visible"), 'typeahead is visible') + equals(typeahead.$menu.find('li').length, 3, 'has 3 items in menu') + equals(typeahead.$menu.find('.active').length, 1, 'one item is active') + + $input.remove() + typeahead.$menu.remove() + }) + + test("should accept data source via synchronous function", function () { + var $input = $('<input />').typeahead({ + source: function () { + return ['aa', 'ab', 'ac'] + } + }).appendTo('body') + , typeahead = $input.data('typeahead') + + $input.val('a') + typeahead.lookup() + + ok(typeahead.$menu.is(":visible"), 'typeahead is visible') + equals(typeahead.$menu.find('li').length, 3, 'has 3 items in menu') + equals(typeahead.$menu.find('.active').length, 1, 'one item is active') + + $input.remove() + typeahead.$menu.remove() + }) + + test("should accept data source via asynchronous function", function () { + var $input = $('<input />').typeahead({ + source: function (query, process) { + process(['aa', 'ab', 'ac']) + } + }).appendTo('body') + , typeahead = $input.data('typeahead') + + $input.val('a') + typeahead.lookup() + + ok(typeahead.$menu.is(":visible"), 'typeahead is visible') + equals(typeahead.$menu.find('li').length, 3, 'has 3 items in menu') + equals(typeahead.$menu.find('.active').length, 1, 'one item is active') + + $input.remove() + typeahead.$menu.remove() + }) + + test("should not explode when regex chars are entered", function () { + var $input = $('<input />').typeahead({ + source: ['aa', 'ab', 'ac', 'mdo*', 'fat+'] + }).appendTo('body') + , typeahead = $input.data('typeahead') + + $input.val('+') + typeahead.lookup() + + ok(typeahead.$menu.is(":visible"), 'typeahead is visible') + equals(typeahead.$menu.find('li').length, 1, 'has 1 item in menu') + equals(typeahead.$menu.find('.active').length, 1, 'one item is active') + + $input.remove() + typeahead.$menu.remove() + }) + + test("should hide menu when query entered", function () { + stop() + var $input = $('<input />').typeahead({ + source: ['aa', 'ab', 'ac'] + }).appendTo('body') + , typeahead = $input.data('typeahead') + + $input.val('a') + typeahead.lookup() + + ok(typeahead.$menu.is(":visible"), 'typeahead is visible') + equals(typeahead.$menu.find('li').length, 3, 'has 3 items in menu') + equals(typeahead.$menu.find('.active').length, 1, 'one item is active') + + $input.blur() + + setTimeout(function () { + ok(!typeahead.$menu.is(":visible"), "typeahead is no longer visible") + start() + }, 200) + + $input.remove() + typeahead.$menu.remove() + }) + + test("should set next item when down arrow is pressed", function () { + var $input = $('<input />').typeahead({ + source: ['aa', 'ab', 'ac'] + }).appendTo('body') + , typeahead = $input.data('typeahead') + + $input.val('a') + typeahead.lookup() + + ok(typeahead.$menu.is(":visible"), 'typeahead is visible') + equals(typeahead.$menu.find('li').length, 3, 'has 3 items in menu') + equals(typeahead.$menu.find('.active').length, 1, 'one item is active') + ok(typeahead.$menu.find('li').first().hasClass('active'), "first item is active") + + // simulate entire key pressing event + $input.trigger({ + type: 'keydown' + , keyCode: 40 + }) + .trigger({ + type: 'keypress' + , keyCode: 40 + }) + .trigger({ + type: 'keyup' + , keyCode: 40 + }) + + ok(typeahead.$menu.find('li').first().next().hasClass('active'), "second item is active") + + $input.trigger({ + type: 'keydown' + , keyCode: 38 + }) + .trigger({ + type: 'keypress' + , keyCode: 38 + }) + .trigger({ + type: 'keyup' + , keyCode: 38 + }) + + ok(typeahead.$menu.find('li').first().hasClass('active'), "first item is active") + + $input.remove() + typeahead.$menu.remove() + }) + + + test("should set input value to selected item", function () { + var $input = $('<input />').typeahead({ + source: ['aa', 'ab', 'ac'] + }).appendTo('body') + , typeahead = $input.data('typeahead') + , changed = false + , focus = false + , blur = false + + $input.val('a') + typeahead.lookup() + + $input.change(function() { changed = true }); + $input.focus(function() { focus = true; blur = false }); + $input.blur(function() { blur = true; focus = false }); + + $(typeahead.$menu.find('li')[2]).mouseover().click() + + equals($input.val(), 'ac', 'input value was correctly set') + ok(!typeahead.$menu.is(':visible'), 'the menu was hidden') + ok(changed, 'a change event was fired') + ok(focus && !blur, 'focus is still set') + + $input.remove() + typeahead.$menu.remove() + }) + + test("should start querying when minLength is met", function () { + var $input = $('<input />').typeahead({ + source: ['aaaa', 'aaab', 'aaac'], + minLength: 3 + }).appendTo('body') + , typeahead = $input.data('typeahead') + + $input.val('aa') + typeahead.lookup() + + equals(typeahead.$menu.find('li').length, 0, 'has 0 items in menu') + + $input.val('aaa') + typeahead.lookup() + + equals(typeahead.$menu.find('li').length, 3, 'has 3 items in menu') + + $input.remove() + typeahead.$menu.remove() + }) +}) diff --git a/tbc/static/js/tests/vendor/jquery.js b/tbc/static/js/tests/vendor/jquery.js new file mode 100755 index 0000000..006e953 --- /dev/null +++ b/tbc/static/js/tests/vendor/jquery.js @@ -0,0 +1,5 @@ +/*! jQuery v1.9.1 | (c) 2005, 2012 jQuery Foundation, Inc. | jquery.org/license +//@ sourceMappingURL=jquery.min.map +*/(function(e,t){var n,r,i=typeof t,o=e.document,a=e.location,s=e.jQuery,u=e.$,l={},c=[],p="1.9.1",f=c.concat,d=c.push,h=c.slice,g=c.indexOf,m=l.toString,y=l.hasOwnProperty,v=p.trim,b=function(e,t){return new b.fn.init(e,t,r)},x=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,w=/\S+/g,T=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,N=/^(?:(<[\w\W]+>)[^>]*|#([\w-]*))$/,C=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,k=/^[\],:{}\s]*$/,E=/(?:^|:|,)(?:\s*\[)+/g,S=/\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,A=/"[^"\\\r\n]*"|true|false|null|-?(?:\d+\.|)\d+(?:[eE][+-]?\d+|)/g,j=/^-ms-/,D=/-([\da-z])/gi,L=function(e,t){return t.toUpperCase()},H=function(e){(o.addEventListener||"load"===e.type||"complete"===o.readyState)&&(q(),b.ready())},q=function(){o.addEventListener?(o.removeEventListener("DOMContentLoaded",H,!1),e.removeEventListener("load",H,!1)):(o.detachEvent("onreadystatechange",H),e.detachEvent("onload",H))};b.fn=b.prototype={jquery:p,constructor:b,init:function(e,n,r){var i,a;if(!e)return this;if("string"==typeof e){if(i="<"===e.charAt(0)&&">"===e.charAt(e.length-1)&&e.length>=3?[null,e,null]:N.exec(e),!i||!i[1]&&n)return!n||n.jquery?(n||r).find(e):this.constructor(n).find(e);if(i[1]){if(n=n instanceof b?n[0]:n,b.merge(this,b.parseHTML(i[1],n&&n.nodeType?n.ownerDocument||n:o,!0)),C.test(i[1])&&b.isPlainObject(n))for(i in n)b.isFunction(this[i])?this[i](n[i]):this.attr(i,n[i]);return this}if(a=o.getElementById(i[2]),a&&a.parentNode){if(a.id!==i[2])return r.find(e);this.length=1,this[0]=a}return this.context=o,this.selector=e,this}return e.nodeType?(this.context=this[0]=e,this.length=1,this):b.isFunction(e)?r.ready(e):(e.selector!==t&&(this.selector=e.selector,this.context=e.context),b.makeArray(e,this))},selector:"",length:0,size:function(){return this.length},toArray:function(){return h.call(this)},get:function(e){return null==e?this.toArray():0>e?this[this.length+e]:this[e]},pushStack:function(e){var t=b.merge(this.constructor(),e);return t.prevObject=this,t.context=this.context,t},each:function(e,t){return b.each(this,e,t)},ready:function(e){return b.ready.promise().done(e),this},slice:function(){return this.pushStack(h.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(e){var t=this.length,n=+e+(0>e?t:0);return this.pushStack(n>=0&&t>n?[this[n]]:[])},map:function(e){return this.pushStack(b.map(this,function(t,n){return e.call(t,n,t)}))},end:function(){return this.prevObject||this.constructor(null)},push:d,sort:[].sort,splice:[].splice},b.fn.init.prototype=b.fn,b.extend=b.fn.extend=function(){var e,n,r,i,o,a,s=arguments[0]||{},u=1,l=arguments.length,c=!1;for("boolean"==typeof s&&(c=s,s=arguments[1]||{},u=2),"object"==typeof s||b.isFunction(s)||(s={}),l===u&&(s=this,--u);l>u;u++)if(null!=(o=arguments[u]))for(i in o)e=s[i],r=o[i],s!==r&&(c&&r&&(b.isPlainObject(r)||(n=b.isArray(r)))?(n?(n=!1,a=e&&b.isArray(e)?e:[]):a=e&&b.isPlainObject(e)?e:{},s[i]=b.extend(c,a,r)):r!==t&&(s[i]=r));return s},b.extend({noConflict:function(t){return e.$===b&&(e.$=u),t&&e.jQuery===b&&(e.jQuery=s),b},isReady:!1,readyWait:1,holdReady:function(e){e?b.readyWait++:b.ready(!0)},ready:function(e){if(e===!0?!--b.readyWait:!b.isReady){if(!o.body)return setTimeout(b.ready);b.isReady=!0,e!==!0&&--b.readyWait>0||(n.resolveWith(o,[b]),b.fn.trigger&&b(o).trigger("ready").off("ready"))}},isFunction:function(e){return"function"===b.type(e)},isArray:Array.isArray||function(e){return"array"===b.type(e)},isWindow:function(e){return null!=e&&e==e.window},isNumeric:function(e){return!isNaN(parseFloat(e))&&isFinite(e)},type:function(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?l[m.call(e)]||"object":typeof e},isPlainObject:function(e){if(!e||"object"!==b.type(e)||e.nodeType||b.isWindow(e))return!1;try{if(e.constructor&&!y.call(e,"constructor")&&!y.call(e.constructor.prototype,"isPrototypeOf"))return!1}catch(n){return!1}var r;for(r in e);return r===t||y.call(e,r)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},error:function(e){throw Error(e)},parseHTML:function(e,t,n){if(!e||"string"!=typeof e)return null;"boolean"==typeof t&&(n=t,t=!1),t=t||o;var r=C.exec(e),i=!n&&[];return r?[t.createElement(r[1])]:(r=b.buildFragment([e],t,i),i&&b(i).remove(),b.merge([],r.childNodes))},parseJSON:function(n){return e.JSON&&e.JSON.parse?e.JSON.parse(n):null===n?n:"string"==typeof n&&(n=b.trim(n),n&&k.test(n.replace(S,"@").replace(A,"]").replace(E,"")))?Function("return "+n)():(b.error("Invalid JSON: "+n),t)},parseXML:function(n){var r,i;if(!n||"string"!=typeof n)return null;try{e.DOMParser?(i=new DOMParser,r=i.parseFromString(n,"text/xml")):(r=new ActiveXObject("Microsoft.XMLDOM"),r.async="false",r.loadXML(n))}catch(o){r=t}return r&&r.documentElement&&!r.getElementsByTagName("parsererror").length||b.error("Invalid XML: "+n),r},noop:function(){},globalEval:function(t){t&&b.trim(t)&&(e.execScript||function(t){e.eval.call(e,t)})(t)},camelCase:function(e){return e.replace(j,"ms-").replace(D,L)},nodeName:function(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()},each:function(e,t,n){var r,i=0,o=e.length,a=M(e);if(n){if(a){for(;o>i;i++)if(r=t.apply(e[i],n),r===!1)break}else for(i in e)if(r=t.apply(e[i],n),r===!1)break}else if(a){for(;o>i;i++)if(r=t.call(e[i],i,e[i]),r===!1)break}else for(i in e)if(r=t.call(e[i],i,e[i]),r===!1)break;return e},trim:v&&!v.call("\ufeff\u00a0")?function(e){return null==e?"":v.call(e)}:function(e){return null==e?"":(e+"").replace(T,"")},makeArray:function(e,t){var n=t||[];return null!=e&&(M(Object(e))?b.merge(n,"string"==typeof e?[e]:e):d.call(n,e)),n},inArray:function(e,t,n){var r;if(t){if(g)return g.call(t,e,n);for(r=t.length,n=n?0>n?Math.max(0,r+n):n:0;r>n;n++)if(n in t&&t[n]===e)return n}return-1},merge:function(e,n){var r=n.length,i=e.length,o=0;if("number"==typeof r)for(;r>o;o++)e[i++]=n[o];else while(n[o]!==t)e[i++]=n[o++];return e.length=i,e},grep:function(e,t,n){var r,i=[],o=0,a=e.length;for(n=!!n;a>o;o++)r=!!t(e[o],o),n!==r&&i.push(e[o]);return i},map:function(e,t,n){var r,i=0,o=e.length,a=M(e),s=[];if(a)for(;o>i;i++)r=t(e[i],i,n),null!=r&&(s[s.length]=r);else for(i in e)r=t(e[i],i,n),null!=r&&(s[s.length]=r);return f.apply([],s)},guid:1,proxy:function(e,n){var r,i,o;return"string"==typeof n&&(o=e[n],n=e,e=o),b.isFunction(e)?(r=h.call(arguments,2),i=function(){return e.apply(n||this,r.concat(h.call(arguments)))},i.guid=e.guid=e.guid||b.guid++,i):t},access:function(e,n,r,i,o,a,s){var u=0,l=e.length,c=null==r;if("object"===b.type(r)){o=!0;for(u in r)b.access(e,n,u,r[u],!0,a,s)}else if(i!==t&&(o=!0,b.isFunction(i)||(s=!0),c&&(s?(n.call(e,i),n=null):(c=n,n=function(e,t,n){return c.call(b(e),n)})),n))for(;l>u;u++)n(e[u],r,s?i:i.call(e[u],u,n(e[u],r)));return o?e:c?n.call(e):l?n(e[0],r):a},now:function(){return(new Date).getTime()}}),b.ready.promise=function(t){if(!n)if(n=b.Deferred(),"complete"===o.readyState)setTimeout(b.ready);else if(o.addEventListener)o.addEventListener("DOMContentLoaded",H,!1),e.addEventListener("load",H,!1);else{o.attachEvent("onreadystatechange",H),e.attachEvent("onload",H);var r=!1;try{r=null==e.frameElement&&o.documentElement}catch(i){}r&&r.doScroll&&function a(){if(!b.isReady){try{r.doScroll("left")}catch(e){return setTimeout(a,50)}q(),b.ready()}}()}return n.promise(t)},b.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(e,t){l["[object "+t+"]"]=t.toLowerCase()});function M(e){var t=e.length,n=b.type(e);return b.isWindow(e)?!1:1===e.nodeType&&t?!0:"array"===n||"function"!==n&&(0===t||"number"==typeof t&&t>0&&t-1 in e)}r=b(o);var _={};function F(e){var t=_[e]={};return b.each(e.match(w)||[],function(e,n){t[n]=!0}),t}b.Callbacks=function(e){e="string"==typeof e?_[e]||F(e):b.extend({},e);var n,r,i,o,a,s,u=[],l=!e.once&&[],c=function(t){for(r=e.memory&&t,i=!0,a=s||0,s=0,o=u.length,n=!0;u&&o>a;a++)if(u[a].apply(t[0],t[1])===!1&&e.stopOnFalse){r=!1;break}n=!1,u&&(l?l.length&&c(l.shift()):r?u=[]:p.disable())},p={add:function(){if(u){var t=u.length;(function i(t){b.each(t,function(t,n){var r=b.type(n);"function"===r?e.unique&&p.has(n)||u.push(n):n&&n.length&&"string"!==r&&i(n)})})(arguments),n?o=u.length:r&&(s=t,c(r))}return this},remove:function(){return u&&b.each(arguments,function(e,t){var r;while((r=b.inArray(t,u,r))>-1)u.splice(r,1),n&&(o>=r&&o--,a>=r&&a--)}),this},has:function(e){return e?b.inArray(e,u)>-1:!(!u||!u.length)},empty:function(){return u=[],this},disable:function(){return u=l=r=t,this},disabled:function(){return!u},lock:function(){return l=t,r||p.disable(),this},locked:function(){return!l},fireWith:function(e,t){return t=t||[],t=[e,t.slice?t.slice():t],!u||i&&!l||(n?l.push(t):c(t)),this},fire:function(){return p.fireWith(this,arguments),this},fired:function(){return!!i}};return p},b.extend({Deferred:function(e){var t=[["resolve","done",b.Callbacks("once memory"),"resolved"],["reject","fail",b.Callbacks("once memory"),"rejected"],["notify","progress",b.Callbacks("memory")]],n="pending",r={state:function(){return n},always:function(){return i.done(arguments).fail(arguments),this},then:function(){var e=arguments;return b.Deferred(function(n){b.each(t,function(t,o){var a=o[0],s=b.isFunction(e[t])&&e[t];i[o[1]](function(){var e=s&&s.apply(this,arguments);e&&b.isFunction(e.promise)?e.promise().done(n.resolve).fail(n.reject).progress(n.notify):n[a+"With"](this===r?n.promise():this,s?[e]:arguments)})}),e=null}).promise()},promise:function(e){return null!=e?b.extend(e,r):r}},i={};return r.pipe=r.then,b.each(t,function(e,o){var a=o[2],s=o[3];r[o[1]]=a.add,s&&a.add(function(){n=s},t[1^e][2].disable,t[2][2].lock),i[o[0]]=function(){return i[o[0]+"With"](this===i?r:this,arguments),this},i[o[0]+"With"]=a.fireWith}),r.promise(i),e&&e.call(i,i),i},when:function(e){var t=0,n=h.call(arguments),r=n.length,i=1!==r||e&&b.isFunction(e.promise)?r:0,o=1===i?e:b.Deferred(),a=function(e,t,n){return function(r){t[e]=this,n[e]=arguments.length>1?h.call(arguments):r,n===s?o.notifyWith(t,n):--i||o.resolveWith(t,n)}},s,u,l;if(r>1)for(s=Array(r),u=Array(r),l=Array(r);r>t;t++)n[t]&&b.isFunction(n[t].promise)?n[t].promise().done(a(t,l,n)).fail(o.reject).progress(a(t,u,s)):--i;return i||o.resolveWith(l,n),o.promise()}}),b.support=function(){var t,n,r,a,s,u,l,c,p,f,d=o.createElement("div");if(d.setAttribute("className","t"),d.innerHTML=" <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",n=d.getElementsByTagName("*"),r=d.getElementsByTagName("a")[0],!n||!r||!n.length)return{};s=o.createElement("select"),l=s.appendChild(o.createElement("option")),a=d.getElementsByTagName("input")[0],r.style.cssText="top:1px;float:left;opacity:.5",t={getSetAttribute:"t"!==d.className,leadingWhitespace:3===d.firstChild.nodeType,tbody:!d.getElementsByTagName("tbody").length,htmlSerialize:!!d.getElementsByTagName("link").length,style:/top/.test(r.getAttribute("style")),hrefNormalized:"/a"===r.getAttribute("href"),opacity:/^0.5/.test(r.style.opacity),cssFloat:!!r.style.cssFloat,checkOn:!!a.value,optSelected:l.selected,enctype:!!o.createElement("form").enctype,html5Clone:"<:nav></:nav>"!==o.createElement("nav").cloneNode(!0).outerHTML,boxModel:"CSS1Compat"===o.compatMode,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0,boxSizingReliable:!0,pixelPosition:!1},a.checked=!0,t.noCloneChecked=a.cloneNode(!0).checked,s.disabled=!0,t.optDisabled=!l.disabled;try{delete d.test}catch(h){t.deleteExpando=!1}a=o.createElement("input"),a.setAttribute("value",""),t.input=""===a.getAttribute("value"),a.value="t",a.setAttribute("type","radio"),t.radioValue="t"===a.value,a.setAttribute("checked","t"),a.setAttribute("name","t"),u=o.createDocumentFragment(),u.appendChild(a),t.appendChecked=a.checked,t.checkClone=u.cloneNode(!0).cloneNode(!0).lastChild.checked,d.attachEvent&&(d.attachEvent("onclick",function(){t.noCloneEvent=!1}),d.cloneNode(!0).click());for(f in{submit:!0,change:!0,focusin:!0})d.setAttribute(c="on"+f,"t"),t[f+"Bubbles"]=c in e||d.attributes[c].expando===!1;return d.style.backgroundClip="content-box",d.cloneNode(!0).style.backgroundClip="",t.clearCloneStyle="content-box"===d.style.backgroundClip,b(function(){var n,r,a,s="padding:0;margin:0;border:0;display:block;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;",u=o.getElementsByTagName("body")[0];u&&(n=o.createElement("div"),n.style.cssText="border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px",u.appendChild(n).appendChild(d),d.innerHTML="<table><tr><td></td><td>t</td></tr></table>",a=d.getElementsByTagName("td"),a[0].style.cssText="padding:0;margin:0;border:0;display:none",p=0===a[0].offsetHeight,a[0].style.display="",a[1].style.display="none",t.reliableHiddenOffsets=p&&0===a[0].offsetHeight,d.innerHTML="",d.style.cssText="box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;",t.boxSizing=4===d.offsetWidth,t.doesNotIncludeMarginInBodyOffset=1!==u.offsetTop,e.getComputedStyle&&(t.pixelPosition="1%"!==(e.getComputedStyle(d,null)||{}).top,t.boxSizingReliable="4px"===(e.getComputedStyle(d,null)||{width:"4px"}).width,r=d.appendChild(o.createElement("div")),r.style.cssText=d.style.cssText=s,r.style.marginRight=r.style.width="0",d.style.width="1px",t.reliableMarginRight=!parseFloat((e.getComputedStyle(r,null)||{}).marginRight)),typeof d.style.zoom!==i&&(d.innerHTML="",d.style.cssText=s+"width:1px;padding:1px;display:inline;zoom:1",t.inlineBlockNeedsLayout=3===d.offsetWidth,d.style.display="block",d.innerHTML="<div></div>",d.firstChild.style.width="5px",t.shrinkWrapBlocks=3!==d.offsetWidth,t.inlineBlockNeedsLayout&&(u.style.zoom=1)),u.removeChild(n),n=d=a=r=null)}),n=s=u=l=r=a=null,t}();var O=/(?:\{[\s\S]*\}|\[[\s\S]*\])$/,B=/([A-Z])/g;function P(e,n,r,i){if(b.acceptData(e)){var o,a,s=b.expando,u="string"==typeof n,l=e.nodeType,p=l?b.cache:e,f=l?e[s]:e[s]&&s;if(f&&p[f]&&(i||p[f].data)||!u||r!==t)return f||(l?e[s]=f=c.pop()||b.guid++:f=s),p[f]||(p[f]={},l||(p[f].toJSON=b.noop)),("object"==typeof n||"function"==typeof n)&&(i?p[f]=b.extend(p[f],n):p[f].data=b.extend(p[f].data,n)),o=p[f],i||(o.data||(o.data={}),o=o.data),r!==t&&(o[b.camelCase(n)]=r),u?(a=o[n],null==a&&(a=o[b.camelCase(n)])):a=o,a}}function R(e,t,n){if(b.acceptData(e)){var r,i,o,a=e.nodeType,s=a?b.cache:e,u=a?e[b.expando]:b.expando;if(s[u]){if(t&&(o=n?s[u]:s[u].data)){b.isArray(t)?t=t.concat(b.map(t,b.camelCase)):t in o?t=[t]:(t=b.camelCase(t),t=t in o?[t]:t.split(" "));for(r=0,i=t.length;i>r;r++)delete o[t[r]];if(!(n?$:b.isEmptyObject)(o))return}(n||(delete s[u].data,$(s[u])))&&(a?b.cleanData([e],!0):b.support.deleteExpando||s!=s.window?delete s[u]:s[u]=null)}}}b.extend({cache:{},expando:"jQuery"+(p+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(e){return e=e.nodeType?b.cache[e[b.expando]]:e[b.expando],!!e&&!$(e)},data:function(e,t,n){return P(e,t,n)},removeData:function(e,t){return R(e,t)},_data:function(e,t,n){return P(e,t,n,!0)},_removeData:function(e,t){return R(e,t,!0)},acceptData:function(e){if(e.nodeType&&1!==e.nodeType&&9!==e.nodeType)return!1;var t=e.nodeName&&b.noData[e.nodeName.toLowerCase()];return!t||t!==!0&&e.getAttribute("classid")===t}}),b.fn.extend({data:function(e,n){var r,i,o=this[0],a=0,s=null;if(e===t){if(this.length&&(s=b.data(o),1===o.nodeType&&!b._data(o,"parsedAttrs"))){for(r=o.attributes;r.length>a;a++)i=r[a].name,i.indexOf("data-")||(i=b.camelCase(i.slice(5)),W(o,i,s[i]));b._data(o,"parsedAttrs",!0)}return s}return"object"==typeof e?this.each(function(){b.data(this,e)}):b.access(this,function(n){return n===t?o?W(o,e,b.data(o,e)):null:(this.each(function(){b.data(this,e,n)}),t)},null,n,arguments.length>1,null,!0)},removeData:function(e){return this.each(function(){b.removeData(this,e)})}});function W(e,n,r){if(r===t&&1===e.nodeType){var i="data-"+n.replace(B,"-$1").toLowerCase();if(r=e.getAttribute(i),"string"==typeof r){try{r="true"===r?!0:"false"===r?!1:"null"===r?null:+r+""===r?+r:O.test(r)?b.parseJSON(r):r}catch(o){}b.data(e,n,r)}else r=t}return r}function $(e){var t;for(t in e)if(("data"!==t||!b.isEmptyObject(e[t]))&&"toJSON"!==t)return!1;return!0}b.extend({queue:function(e,n,r){var i;return e?(n=(n||"fx")+"queue",i=b._data(e,n),r&&(!i||b.isArray(r)?i=b._data(e,n,b.makeArray(r)):i.push(r)),i||[]):t},dequeue:function(e,t){t=t||"fx";var n=b.queue(e,t),r=n.length,i=n.shift(),o=b._queueHooks(e,t),a=function(){b.dequeue(e,t)};"inprogress"===i&&(i=n.shift(),r--),o.cur=i,i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,a,o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return b._data(e,n)||b._data(e,n,{empty:b.Callbacks("once memory").add(function(){b._removeData(e,t+"queue"),b._removeData(e,n)})})}}),b.fn.extend({queue:function(e,n){var r=2;return"string"!=typeof e&&(n=e,e="fx",r--),r>arguments.length?b.queue(this[0],e):n===t?this:this.each(function(){var t=b.queue(this,e,n);b._queueHooks(this,e),"fx"===e&&"inprogress"!==t[0]&&b.dequeue(this,e)})},dequeue:function(e){return this.each(function(){b.dequeue(this,e)})},delay:function(e,t){return e=b.fx?b.fx.speeds[e]||e:e,t=t||"fx",this.queue(t,function(t,n){var r=setTimeout(t,e);n.stop=function(){clearTimeout(r)}})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,n){var r,i=1,o=b.Deferred(),a=this,s=this.length,u=function(){--i||o.resolveWith(a,[a])};"string"!=typeof e&&(n=e,e=t),e=e||"fx";while(s--)r=b._data(a[s],e+"queueHooks"),r&&r.empty&&(i++,r.empty.add(u));return u(),o.promise(n)}});var I,z,X=/[\t\r\n]/g,U=/\r/g,V=/^(?:input|select|textarea|button|object)$/i,Y=/^(?:a|area)$/i,J=/^(?:checked|selected|autofocus|autoplay|async|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped)$/i,G=/^(?:checked|selected)$/i,Q=b.support.getSetAttribute,K=b.support.input;b.fn.extend({attr:function(e,t){return b.access(this,b.attr,e,t,arguments.length>1)},removeAttr:function(e){return this.each(function(){b.removeAttr(this,e)})},prop:function(e,t){return b.access(this,b.prop,e,t,arguments.length>1)},removeProp:function(e){return e=b.propFix[e]||e,this.each(function(){try{this[e]=t,delete this[e]}catch(n){}})},addClass:function(e){var t,n,r,i,o,a=0,s=this.length,u="string"==typeof e&&e;if(b.isFunction(e))return this.each(function(t){b(this).addClass(e.call(this,t,this.className))});if(u)for(t=(e||"").match(w)||[];s>a;a++)if(n=this[a],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(X," "):" ")){o=0;while(i=t[o++])0>r.indexOf(" "+i+" ")&&(r+=i+" ");n.className=b.trim(r)}return this},removeClass:function(e){var t,n,r,i,o,a=0,s=this.length,u=0===arguments.length||"string"==typeof e&&e;if(b.isFunction(e))return this.each(function(t){b(this).removeClass(e.call(this,t,this.className))});if(u)for(t=(e||"").match(w)||[];s>a;a++)if(n=this[a],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(X," "):"")){o=0;while(i=t[o++])while(r.indexOf(" "+i+" ")>=0)r=r.replace(" "+i+" "," ");n.className=e?b.trim(r):""}return this},toggleClass:function(e,t){var n=typeof e,r="boolean"==typeof t;return b.isFunction(e)?this.each(function(n){b(this).toggleClass(e.call(this,n,this.className,t),t)}):this.each(function(){if("string"===n){var o,a=0,s=b(this),u=t,l=e.match(w)||[];while(o=l[a++])u=r?u:!s.hasClass(o),s[u?"addClass":"removeClass"](o)}else(n===i||"boolean"===n)&&(this.className&&b._data(this,"__className__",this.className),this.className=this.className||e===!1?"":b._data(this,"__className__")||"")})},hasClass:function(e){var t=" "+e+" ",n=0,r=this.length;for(;r>n;n++)if(1===this[n].nodeType&&(" "+this[n].className+" ").replace(X," ").indexOf(t)>=0)return!0;return!1},val:function(e){var n,r,i,o=this[0];{if(arguments.length)return i=b.isFunction(e),this.each(function(n){var o,a=b(this);1===this.nodeType&&(o=i?e.call(this,n,a.val()):e,null==o?o="":"number"==typeof o?o+="":b.isArray(o)&&(o=b.map(o,function(e){return null==e?"":e+""})),r=b.valHooks[this.type]||b.valHooks[this.nodeName.toLowerCase()],r&&"set"in r&&r.set(this,o,"value")!==t||(this.value=o))});if(o)return r=b.valHooks[o.type]||b.valHooks[o.nodeName.toLowerCase()],r&&"get"in r&&(n=r.get(o,"value"))!==t?n:(n=o.value,"string"==typeof n?n.replace(U,""):null==n?"":n)}}}),b.extend({valHooks:{option:{get:function(e){var t=e.attributes.value;return!t||t.specified?e.value:e.text}},select:{get:function(e){var t,n,r=e.options,i=e.selectedIndex,o="select-one"===e.type||0>i,a=o?null:[],s=o?i+1:r.length,u=0>i?s:o?i:0;for(;s>u;u++)if(n=r[u],!(!n.selected&&u!==i||(b.support.optDisabled?n.disabled:null!==n.getAttribute("disabled"))||n.parentNode.disabled&&b.nodeName(n.parentNode,"optgroup"))){if(t=b(n).val(),o)return t;a.push(t)}return a},set:function(e,t){var n=b.makeArray(t);return b(e).find("option").each(function(){this.selected=b.inArray(b(this).val(),n)>=0}),n.length||(e.selectedIndex=-1),n}}},attr:function(e,n,r){var o,a,s,u=e.nodeType;if(e&&3!==u&&8!==u&&2!==u)return typeof e.getAttribute===i?b.prop(e,n,r):(a=1!==u||!b.isXMLDoc(e),a&&(n=n.toLowerCase(),o=b.attrHooks[n]||(J.test(n)?z:I)),r===t?o&&a&&"get"in o&&null!==(s=o.get(e,n))?s:(typeof e.getAttribute!==i&&(s=e.getAttribute(n)),null==s?t:s):null!==r?o&&a&&"set"in o&&(s=o.set(e,r,n))!==t?s:(e.setAttribute(n,r+""),r):(b.removeAttr(e,n),t))},removeAttr:function(e,t){var n,r,i=0,o=t&&t.match(w);if(o&&1===e.nodeType)while(n=o[i++])r=b.propFix[n]||n,J.test(n)?!Q&&G.test(n)?e[b.camelCase("default-"+n)]=e[r]=!1:e[r]=!1:b.attr(e,n,""),e.removeAttribute(Q?n:r)},attrHooks:{type:{set:function(e,t){if(!b.support.radioValue&&"radio"===t&&b.nodeName(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},propFix:{tabindex:"tabIndex",readonly:"readOnly","for":"htmlFor","class":"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},prop:function(e,n,r){var i,o,a,s=e.nodeType;if(e&&3!==s&&8!==s&&2!==s)return a=1!==s||!b.isXMLDoc(e),a&&(n=b.propFix[n]||n,o=b.propHooks[n]),r!==t?o&&"set"in o&&(i=o.set(e,r,n))!==t?i:e[n]=r:o&&"get"in o&&null!==(i=o.get(e,n))?i:e[n]},propHooks:{tabIndex:{get:function(e){var n=e.getAttributeNode("tabindex");return n&&n.specified?parseInt(n.value,10):V.test(e.nodeName)||Y.test(e.nodeName)&&e.href?0:t}}}}),z={get:function(e,n){var r=b.prop(e,n),i="boolean"==typeof r&&e.getAttribute(n),o="boolean"==typeof r?K&&Q?null!=i:G.test(n)?e[b.camelCase("default-"+n)]:!!i:e.getAttributeNode(n);return o&&o.value!==!1?n.toLowerCase():t},set:function(e,t,n){return t===!1?b.removeAttr(e,n):K&&Q||!G.test(n)?e.setAttribute(!Q&&b.propFix[n]||n,n):e[b.camelCase("default-"+n)]=e[n]=!0,n}},K&&Q||(b.attrHooks.value={get:function(e,n){var r=e.getAttributeNode(n);return b.nodeName(e,"input")?e.defaultValue:r&&r.specified?r.value:t},set:function(e,n,r){return b.nodeName(e,"input")?(e.defaultValue=n,t):I&&I.set(e,n,r)}}),Q||(I=b.valHooks.button={get:function(e,n){var r=e.getAttributeNode(n);return r&&("id"===n||"name"===n||"coords"===n?""!==r.value:r.specified)?r.value:t},set:function(e,n,r){var i=e.getAttributeNode(r);return i||e.setAttributeNode(i=e.ownerDocument.createAttribute(r)),i.value=n+="","value"===r||n===e.getAttribute(r)?n:t}},b.attrHooks.contenteditable={get:I.get,set:function(e,t,n){I.set(e,""===t?!1:t,n)}},b.each(["width","height"],function(e,n){b.attrHooks[n]=b.extend(b.attrHooks[n],{set:function(e,r){return""===r?(e.setAttribute(n,"auto"),r):t}})})),b.support.hrefNormalized||(b.each(["href","src","width","height"],function(e,n){b.attrHooks[n]=b.extend(b.attrHooks[n],{get:function(e){var r=e.getAttribute(n,2);return null==r?t:r}})}),b.each(["href","src"],function(e,t){b.propHooks[t]={get:function(e){return e.getAttribute(t,4)}}})),b.support.style||(b.attrHooks.style={get:function(e){return e.style.cssText||t},set:function(e,t){return e.style.cssText=t+""}}),b.support.optSelected||(b.propHooks.selected=b.extend(b.propHooks.selected,{get:function(e){var t=e.parentNode;return t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex),null}})),b.support.enctype||(b.propFix.enctype="encoding"),b.support.checkOn||b.each(["radio","checkbox"],function(){b.valHooks[this]={get:function(e){return null===e.getAttribute("value")?"on":e.value}}}),b.each(["radio","checkbox"],function(){b.valHooks[this]=b.extend(b.valHooks[this],{set:function(e,n){return b.isArray(n)?e.checked=b.inArray(b(e).val(),n)>=0:t}})});var Z=/^(?:input|select|textarea)$/i,et=/^key/,tt=/^(?:mouse|contextmenu)|click/,nt=/^(?:focusinfocus|focusoutblur)$/,rt=/^([^.]*)(?:\.(.+)|)$/;function it(){return!0}function ot(){return!1}b.event={global:{},add:function(e,n,r,o,a){var s,u,l,c,p,f,d,h,g,m,y,v=b._data(e);if(v){r.handler&&(c=r,r=c.handler,a=c.selector),r.guid||(r.guid=b.guid++),(u=v.events)||(u=v.events={}),(f=v.handle)||(f=v.handle=function(e){return typeof b===i||e&&b.event.triggered===e.type?t:b.event.dispatch.apply(f.elem,arguments)},f.elem=e),n=(n||"").match(w)||[""],l=n.length;while(l--)s=rt.exec(n[l])||[],g=y=s[1],m=(s[2]||"").split(".").sort(),p=b.event.special[g]||{},g=(a?p.delegateType:p.bindType)||g,p=b.event.special[g]||{},d=b.extend({type:g,origType:y,data:o,handler:r,guid:r.guid,selector:a,needsContext:a&&b.expr.match.needsContext.test(a),namespace:m.join(".")},c),(h=u[g])||(h=u[g]=[],h.delegateCount=0,p.setup&&p.setup.call(e,o,m,f)!==!1||(e.addEventListener?e.addEventListener(g,f,!1):e.attachEvent&&e.attachEvent("on"+g,f))),p.add&&(p.add.call(e,d),d.handler.guid||(d.handler.guid=r.guid)),a?h.splice(h.delegateCount++,0,d):h.push(d),b.event.global[g]=!0;e=null}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,p,f,d,h,g,m=b.hasData(e)&&b._data(e);if(m&&(c=m.events)){t=(t||"").match(w)||[""],l=t.length;while(l--)if(s=rt.exec(t[l])||[],d=g=s[1],h=(s[2]||"").split(".").sort(),d){p=b.event.special[d]||{},d=(r?p.delegateType:p.bindType)||d,f=c[d]||[],s=s[2]&&RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),u=o=f.length;while(o--)a=f[o],!i&&g!==a.origType||n&&n.guid!==a.guid||s&&!s.test(a.namespace)||r&&r!==a.selector&&("**"!==r||!a.selector)||(f.splice(o,1),a.selector&&f.delegateCount--,p.remove&&p.remove.call(e,a));u&&!f.length&&(p.teardown&&p.teardown.call(e,h,m.handle)!==!1||b.removeEvent(e,d,m.handle),delete c[d])}else for(d in c)b.event.remove(e,d+t[l],n,r,!0);b.isEmptyObject(c)&&(delete m.handle,b._removeData(e,"events"))}},trigger:function(n,r,i,a){var s,u,l,c,p,f,d,h=[i||o],g=y.call(n,"type")?n.type:n,m=y.call(n,"namespace")?n.namespace.split("."):[];if(l=f=i=i||o,3!==i.nodeType&&8!==i.nodeType&&!nt.test(g+b.event.triggered)&&(g.indexOf(".")>=0&&(m=g.split("."),g=m.shift(),m.sort()),u=0>g.indexOf(":")&&"on"+g,n=n[b.expando]?n:new b.Event(g,"object"==typeof n&&n),n.isTrigger=!0,n.namespace=m.join("."),n.namespace_re=n.namespace?RegExp("(^|\\.)"+m.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,n.result=t,n.target||(n.target=i),r=null==r?[n]:b.makeArray(r,[n]),p=b.event.special[g]||{},a||!p.trigger||p.trigger.apply(i,r)!==!1)){if(!a&&!p.noBubble&&!b.isWindow(i)){for(c=p.delegateType||g,nt.test(c+g)||(l=l.parentNode);l;l=l.parentNode)h.push(l),f=l;f===(i.ownerDocument||o)&&h.push(f.defaultView||f.parentWindow||e)}d=0;while((l=h[d++])&&!n.isPropagationStopped())n.type=d>1?c:p.bindType||g,s=(b._data(l,"events")||{})[n.type]&&b._data(l,"handle"),s&&s.apply(l,r),s=u&&l[u],s&&b.acceptData(l)&&s.apply&&s.apply(l,r)===!1&&n.preventDefault();if(n.type=g,!(a||n.isDefaultPrevented()||p._default&&p._default.apply(i.ownerDocument,r)!==!1||"click"===g&&b.nodeName(i,"a")||!b.acceptData(i)||!u||!i[g]||b.isWindow(i))){f=i[u],f&&(i[u]=null),b.event.triggered=g;try{i[g]()}catch(v){}b.event.triggered=t,f&&(i[u]=f)}return n.result}},dispatch:function(e){e=b.event.fix(e);var n,r,i,o,a,s=[],u=h.call(arguments),l=(b._data(this,"events")||{})[e.type]||[],c=b.event.special[e.type]||{};if(u[0]=e,e.delegateTarget=this,!c.preDispatch||c.preDispatch.call(this,e)!==!1){s=b.event.handlers.call(this,e,l),n=0;while((o=s[n++])&&!e.isPropagationStopped()){e.currentTarget=o.elem,a=0;while((i=o.handlers[a++])&&!e.isImmediatePropagationStopped())(!e.namespace_re||e.namespace_re.test(i.namespace))&&(e.handleObj=i,e.data=i.data,r=((b.event.special[i.origType]||{}).handle||i.handler).apply(o.elem,u),r!==t&&(e.result=r)===!1&&(e.preventDefault(),e.stopPropagation()))}return c.postDispatch&&c.postDispatch.call(this,e),e.result}},handlers:function(e,n){var r,i,o,a,s=[],u=n.delegateCount,l=e.target;if(u&&l.nodeType&&(!e.button||"click"!==e.type))for(;l!=this;l=l.parentNode||this)if(1===l.nodeType&&(l.disabled!==!0||"click"!==e.type)){for(o=[],a=0;u>a;a++)i=n[a],r=i.selector+" ",o[r]===t&&(o[r]=i.needsContext?b(r,this).index(l)>=0:b.find(r,this,null,[l]).length),o[r]&&o.push(i);o.length&&s.push({elem:l,handlers:o})}return n.length>u&&s.push({elem:this,handlers:n.slice(u)}),s},fix:function(e){if(e[b.expando])return e;var t,n,r,i=e.type,a=e,s=this.fixHooks[i];s||(this.fixHooks[i]=s=tt.test(i)?this.mouseHooks:et.test(i)?this.keyHooks:{}),r=s.props?this.props.concat(s.props):this.props,e=new b.Event(a),t=r.length;while(t--)n=r[t],e[n]=a[n];return e.target||(e.target=a.srcElement||o),3===e.target.nodeType&&(e.target=e.target.parentNode),e.metaKey=!!e.metaKey,s.filter?s.filter(e,a):e},props:"altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(e,t){return null==e.which&&(e.which=null!=t.charCode?t.charCode:t.keyCode),e}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(e,n){var r,i,a,s=n.button,u=n.fromElement;return null==e.pageX&&null!=n.clientX&&(i=e.target.ownerDocument||o,a=i.documentElement,r=i.body,e.pageX=n.clientX+(a&&a.scrollLeft||r&&r.scrollLeft||0)-(a&&a.clientLeft||r&&r.clientLeft||0),e.pageY=n.clientY+(a&&a.scrollTop||r&&r.scrollTop||0)-(a&&a.clientTop||r&&r.clientTop||0)),!e.relatedTarget&&u&&(e.relatedTarget=u===e.target?n.toElement:u),e.which||s===t||(e.which=1&s?1:2&s?3:4&s?2:0),e}},special:{load:{noBubble:!0},click:{trigger:function(){return b.nodeName(this,"input")&&"checkbox"===this.type&&this.click?(this.click(),!1):t}},focus:{trigger:function(){if(this!==o.activeElement&&this.focus)try{return this.focus(),!1}catch(e){}},delegateType:"focusin"},blur:{trigger:function(){return this===o.activeElement&&this.blur?(this.blur(),!1):t},delegateType:"focusout"},beforeunload:{postDispatch:function(e){e.result!==t&&(e.originalEvent.returnValue=e.result)}}},simulate:function(e,t,n,r){var i=b.extend(new b.Event,n,{type:e,isSimulated:!0,originalEvent:{}});r?b.event.trigger(i,null,t):b.event.dispatch.call(t,i),i.isDefaultPrevented()&&n.preventDefault()}},b.removeEvent=o.removeEventListener?function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n,!1)}:function(e,t,n){var r="on"+t;e.detachEvent&&(typeof e[r]===i&&(e[r]=null),e.detachEvent(r,n))},b.Event=function(e,n){return this instanceof b.Event?(e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||e.returnValue===!1||e.getPreventDefault&&e.getPreventDefault()?it:ot):this.type=e,n&&b.extend(this,n),this.timeStamp=e&&e.timeStamp||b.now(),this[b.expando]=!0,t):new b.Event(e,n)},b.Event.prototype={isDefaultPrevented:ot,isPropagationStopped:ot,isImmediatePropagationStopped:ot,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=it,e&&(e.preventDefault?e.preventDefault():e.returnValue=!1)},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=it,e&&(e.stopPropagation&&e.stopPropagation(),e.cancelBubble=!0)},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=it,this.stopPropagation()}},b.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(e,t){b.event.special[e]={delegateType:t,bindType:t,handle:function(e){var n,r=this,i=e.relatedTarget,o=e.handleObj; +return(!i||i!==r&&!b.contains(r,i))&&(e.type=o.origType,n=o.handler.apply(this,arguments),e.type=t),n}}}),b.support.submitBubbles||(b.event.special.submit={setup:function(){return b.nodeName(this,"form")?!1:(b.event.add(this,"click._submit keypress._submit",function(e){var n=e.target,r=b.nodeName(n,"input")||b.nodeName(n,"button")?n.form:t;r&&!b._data(r,"submitBubbles")&&(b.event.add(r,"submit._submit",function(e){e._submit_bubble=!0}),b._data(r,"submitBubbles",!0))}),t)},postDispatch:function(e){e._submit_bubble&&(delete e._submit_bubble,this.parentNode&&!e.isTrigger&&b.event.simulate("submit",this.parentNode,e,!0))},teardown:function(){return b.nodeName(this,"form")?!1:(b.event.remove(this,"._submit"),t)}}),b.support.changeBubbles||(b.event.special.change={setup:function(){return Z.test(this.nodeName)?(("checkbox"===this.type||"radio"===this.type)&&(b.event.add(this,"propertychange._change",function(e){"checked"===e.originalEvent.propertyName&&(this._just_changed=!0)}),b.event.add(this,"click._change",function(e){this._just_changed&&!e.isTrigger&&(this._just_changed=!1),b.event.simulate("change",this,e,!0)})),!1):(b.event.add(this,"beforeactivate._change",function(e){var t=e.target;Z.test(t.nodeName)&&!b._data(t,"changeBubbles")&&(b.event.add(t,"change._change",function(e){!this.parentNode||e.isSimulated||e.isTrigger||b.event.simulate("change",this.parentNode,e,!0)}),b._data(t,"changeBubbles",!0))}),t)},handle:function(e){var n=e.target;return this!==n||e.isSimulated||e.isTrigger||"radio"!==n.type&&"checkbox"!==n.type?e.handleObj.handler.apply(this,arguments):t},teardown:function(){return b.event.remove(this,"._change"),!Z.test(this.nodeName)}}),b.support.focusinBubbles||b.each({focus:"focusin",blur:"focusout"},function(e,t){var n=0,r=function(e){b.event.simulate(t,e.target,b.event.fix(e),!0)};b.event.special[t]={setup:function(){0===n++&&o.addEventListener(e,r,!0)},teardown:function(){0===--n&&o.removeEventListener(e,r,!0)}}}),b.fn.extend({on:function(e,n,r,i,o){var a,s;if("object"==typeof e){"string"!=typeof n&&(r=r||n,n=t);for(a in e)this.on(a,n,r,e[a],o);return this}if(null==r&&null==i?(i=n,r=n=t):null==i&&("string"==typeof n?(i=r,r=t):(i=r,r=n,n=t)),i===!1)i=ot;else if(!i)return this;return 1===o&&(s=i,i=function(e){return b().off(e),s.apply(this,arguments)},i.guid=s.guid||(s.guid=b.guid++)),this.each(function(){b.event.add(this,e,i,r,n)})},one:function(e,t,n,r){return this.on(e,t,n,r,1)},off:function(e,n,r){var i,o;if(e&&e.preventDefault&&e.handleObj)return i=e.handleObj,b(e.delegateTarget).off(i.namespace?i.origType+"."+i.namespace:i.origType,i.selector,i.handler),this;if("object"==typeof e){for(o in e)this.off(o,n,e[o]);return this}return(n===!1||"function"==typeof n)&&(r=n,n=t),r===!1&&(r=ot),this.each(function(){b.event.remove(this,e,r,n)})},bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},trigger:function(e,t){return this.each(function(){b.event.trigger(e,t,this)})},triggerHandler:function(e,n){var r=this[0];return r?b.event.trigger(e,n,r,!0):t}}),function(e,t){var n,r,i,o,a,s,u,l,c,p,f,d,h,g,m,y,v,x="sizzle"+-new Date,w=e.document,T={},N=0,C=0,k=it(),E=it(),S=it(),A=typeof t,j=1<<31,D=[],L=D.pop,H=D.push,q=D.slice,M=D.indexOf||function(e){var t=0,n=this.length;for(;n>t;t++)if(this[t]===e)return t;return-1},_="[\\x20\\t\\r\\n\\f]",F="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",O=F.replace("w","w#"),B="([*^$|!~]?=)",P="\\["+_+"*("+F+")"+_+"*(?:"+B+_+"*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|("+O+")|)|)"+_+"*\\]",R=":("+F+")(?:\\(((['\"])((?:\\\\.|[^\\\\])*?)\\3|((?:\\\\.|[^\\\\()[\\]]|"+P.replace(3,8)+")*)|.*)\\)|)",W=RegExp("^"+_+"+|((?:^|[^\\\\])(?:\\\\.)*)"+_+"+$","g"),$=RegExp("^"+_+"*,"+_+"*"),I=RegExp("^"+_+"*([\\x20\\t\\r\\n\\f>+~])"+_+"*"),z=RegExp(R),X=RegExp("^"+O+"$"),U={ID:RegExp("^#("+F+")"),CLASS:RegExp("^\\.("+F+")"),NAME:RegExp("^\\[name=['\"]?("+F+")['\"]?\\]"),TAG:RegExp("^("+F.replace("w","w*")+")"),ATTR:RegExp("^"+P),PSEUDO:RegExp("^"+R),CHILD:RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+_+"*(even|odd|(([+-]|)(\\d*)n|)"+_+"*(?:([+-]|)"+_+"*(\\d+)|))"+_+"*\\)|)","i"),needsContext:RegExp("^"+_+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+_+"*((?:-\\d)?\\d*)"+_+"*\\)|)(?=[^-]|$)","i")},V=/[\x20\t\r\n\f]*[+~]/,Y=/^[^{]+\{\s*\[native code/,J=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,G=/^(?:input|select|textarea|button)$/i,Q=/^h\d$/i,K=/'|\\/g,Z=/\=[\x20\t\r\n\f]*([^'"\]]*)[\x20\t\r\n\f]*\]/g,et=/\\([\da-fA-F]{1,6}[\x20\t\r\n\f]?|.)/g,tt=function(e,t){var n="0x"+t-65536;return n!==n?t:0>n?String.fromCharCode(n+65536):String.fromCharCode(55296|n>>10,56320|1023&n)};try{q.call(w.documentElement.childNodes,0)[0].nodeType}catch(nt){q=function(e){var t,n=[];while(t=this[e++])n.push(t);return n}}function rt(e){return Y.test(e+"")}function it(){var e,t=[];return e=function(n,r){return t.push(n+=" ")>i.cacheLength&&delete e[t.shift()],e[n]=r}}function ot(e){return e[x]=!0,e}function at(e){var t=p.createElement("div");try{return e(t)}catch(n){return!1}finally{t=null}}function st(e,t,n,r){var i,o,a,s,u,l,f,g,m,v;if((t?t.ownerDocument||t:w)!==p&&c(t),t=t||p,n=n||[],!e||"string"!=typeof e)return n;if(1!==(s=t.nodeType)&&9!==s)return[];if(!d&&!r){if(i=J.exec(e))if(a=i[1]){if(9===s){if(o=t.getElementById(a),!o||!o.parentNode)return n;if(o.id===a)return n.push(o),n}else if(t.ownerDocument&&(o=t.ownerDocument.getElementById(a))&&y(t,o)&&o.id===a)return n.push(o),n}else{if(i[2])return H.apply(n,q.call(t.getElementsByTagName(e),0)),n;if((a=i[3])&&T.getByClassName&&t.getElementsByClassName)return H.apply(n,q.call(t.getElementsByClassName(a),0)),n}if(T.qsa&&!h.test(e)){if(f=!0,g=x,m=t,v=9===s&&e,1===s&&"object"!==t.nodeName.toLowerCase()){l=ft(e),(f=t.getAttribute("id"))?g=f.replace(K,"\\$&"):t.setAttribute("id",g),g="[id='"+g+"'] ",u=l.length;while(u--)l[u]=g+dt(l[u]);m=V.test(e)&&t.parentNode||t,v=l.join(",")}if(v)try{return H.apply(n,q.call(m.querySelectorAll(v),0)),n}catch(b){}finally{f||t.removeAttribute("id")}}}return wt(e.replace(W,"$1"),t,n,r)}a=st.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return t?"HTML"!==t.nodeName:!1},c=st.setDocument=function(e){var n=e?e.ownerDocument||e:w;return n!==p&&9===n.nodeType&&n.documentElement?(p=n,f=n.documentElement,d=a(n),T.tagNameNoComments=at(function(e){return e.appendChild(n.createComment("")),!e.getElementsByTagName("*").length}),T.attributes=at(function(e){e.innerHTML="<select></select>";var t=typeof e.lastChild.getAttribute("multiple");return"boolean"!==t&&"string"!==t}),T.getByClassName=at(function(e){return e.innerHTML="<div class='hidden e'></div><div class='hidden'></div>",e.getElementsByClassName&&e.getElementsByClassName("e").length?(e.lastChild.className="e",2===e.getElementsByClassName("e").length):!1}),T.getByName=at(function(e){e.id=x+0,e.innerHTML="<a name='"+x+"'></a><div name='"+x+"'></div>",f.insertBefore(e,f.firstChild);var t=n.getElementsByName&&n.getElementsByName(x).length===2+n.getElementsByName(x+0).length;return T.getIdNotName=!n.getElementById(x),f.removeChild(e),t}),i.attrHandle=at(function(e){return e.innerHTML="<a href='#'></a>",e.firstChild&&typeof e.firstChild.getAttribute!==A&&"#"===e.firstChild.getAttribute("href")})?{}:{href:function(e){return e.getAttribute("href",2)},type:function(e){return e.getAttribute("type")}},T.getIdNotName?(i.find.ID=function(e,t){if(typeof t.getElementById!==A&&!d){var n=t.getElementById(e);return n&&n.parentNode?[n]:[]}},i.filter.ID=function(e){var t=e.replace(et,tt);return function(e){return e.getAttribute("id")===t}}):(i.find.ID=function(e,n){if(typeof n.getElementById!==A&&!d){var r=n.getElementById(e);return r?r.id===e||typeof r.getAttributeNode!==A&&r.getAttributeNode("id").value===e?[r]:t:[]}},i.filter.ID=function(e){var t=e.replace(et,tt);return function(e){var n=typeof e.getAttributeNode!==A&&e.getAttributeNode("id");return n&&n.value===t}}),i.find.TAG=T.tagNameNoComments?function(e,n){return typeof n.getElementsByTagName!==A?n.getElementsByTagName(e):t}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},i.find.NAME=T.getByName&&function(e,n){return typeof n.getElementsByName!==A?n.getElementsByName(name):t},i.find.CLASS=T.getByClassName&&function(e,n){return typeof n.getElementsByClassName===A||d?t:n.getElementsByClassName(e)},g=[],h=[":focus"],(T.qsa=rt(n.querySelectorAll))&&(at(function(e){e.innerHTML="<select><option selected=''></option></select>",e.querySelectorAll("[selected]").length||h.push("\\["+_+"*(?:checked|disabled|ismap|multiple|readonly|selected|value)"),e.querySelectorAll(":checked").length||h.push(":checked")}),at(function(e){e.innerHTML="<input type='hidden' i=''/>",e.querySelectorAll("[i^='']").length&&h.push("[*^$]="+_+"*(?:\"\"|'')"),e.querySelectorAll(":enabled").length||h.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),h.push(",.*:")})),(T.matchesSelector=rt(m=f.matchesSelector||f.mozMatchesSelector||f.webkitMatchesSelector||f.oMatchesSelector||f.msMatchesSelector))&&at(function(e){T.disconnectedMatch=m.call(e,"div"),m.call(e,"[s!='']:x"),g.push("!=",R)}),h=RegExp(h.join("|")),g=RegExp(g.join("|")),y=rt(f.contains)||f.compareDocumentPosition?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},v=f.compareDocumentPosition?function(e,t){var r;return e===t?(u=!0,0):(r=t.compareDocumentPosition&&e.compareDocumentPosition&&e.compareDocumentPosition(t))?1&r||e.parentNode&&11===e.parentNode.nodeType?e===n||y(w,e)?-1:t===n||y(w,t)?1:0:4&r?-1:1:e.compareDocumentPosition?-1:1}:function(e,t){var r,i=0,o=e.parentNode,a=t.parentNode,s=[e],l=[t];if(e===t)return u=!0,0;if(!o||!a)return e===n?-1:t===n?1:o?-1:a?1:0;if(o===a)return ut(e,t);r=e;while(r=r.parentNode)s.unshift(r);r=t;while(r=r.parentNode)l.unshift(r);while(s[i]===l[i])i++;return i?ut(s[i],l[i]):s[i]===w?-1:l[i]===w?1:0},u=!1,[0,0].sort(v),T.detectDuplicates=u,p):p},st.matches=function(e,t){return st(e,null,null,t)},st.matchesSelector=function(e,t){if((e.ownerDocument||e)!==p&&c(e),t=t.replace(Z,"='$1']"),!(!T.matchesSelector||d||g&&g.test(t)||h.test(t)))try{var n=m.call(e,t);if(n||T.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(r){}return st(t,p,null,[e]).length>0},st.contains=function(e,t){return(e.ownerDocument||e)!==p&&c(e),y(e,t)},st.attr=function(e,t){var n;return(e.ownerDocument||e)!==p&&c(e),d||(t=t.toLowerCase()),(n=i.attrHandle[t])?n(e):d||T.attributes?e.getAttribute(t):((n=e.getAttributeNode(t))||e.getAttribute(t))&&e[t]===!0?t:n&&n.specified?n.value:null},st.error=function(e){throw Error("Syntax error, unrecognized expression: "+e)},st.uniqueSort=function(e){var t,n=[],r=1,i=0;if(u=!T.detectDuplicates,e.sort(v),u){for(;t=e[r];r++)t===e[r-1]&&(i=n.push(r));while(i--)e.splice(n[i],1)}return e};function ut(e,t){var n=t&&e,r=n&&(~t.sourceIndex||j)-(~e.sourceIndex||j);if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function lt(e){return function(t){var n=t.nodeName.toLowerCase();return"input"===n&&t.type===e}}function ct(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}}function pt(e){return ot(function(t){return t=+t,ot(function(n,r){var i,o=e([],n.length,t),a=o.length;while(a--)n[i=o[a]]&&(n[i]=!(r[i]=n[i]))})})}o=st.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=o(e)}else if(3===i||4===i)return e.nodeValue}else for(;t=e[r];r++)n+=o(t);return n},i=st.selectors={cacheLength:50,createPseudo:ot,match:U,find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(et,tt),e[3]=(e[4]||e[5]||"").replace(et,tt),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||st.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&st.error(e[0]),e},PSEUDO:function(e){var t,n=!e[5]&&e[2];return U.CHILD.test(e[0])?null:(e[4]?e[2]=e[4]:n&&z.test(n)&&(t=ft(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){return"*"===e?function(){return!0}:(e=e.replace(et,tt).toLowerCase(),function(t){return t.nodeName&&t.nodeName.toLowerCase()===e})},CLASS:function(e){var t=k[e+" "];return t||(t=RegExp("(^|"+_+")"+e+"("+_+"|$)"))&&k(e,function(e){return t.test(e.className||typeof e.getAttribute!==A&&e.getAttribute("class")||"")})},ATTR:function(e,t,n){return function(r){var i=st.attr(r,e);return null==i?"!="===t:t?(i+="","="===t?i===n:"!="===t?i!==n:"^="===t?n&&0===i.indexOf(n):"*="===t?n&&i.indexOf(n)>-1:"$="===t?n&&i.slice(-n.length)===n:"~="===t?(" "+i+" ").indexOf(n)>-1:"|="===t?i===n||i.slice(0,n.length+1)===n+"-":!1):!0}},CHILD:function(e,t,n,r,i){var o="nth"!==e.slice(0,3),a="last"!==e.slice(-4),s="of-type"===t;return 1===r&&0===i?function(e){return!!e.parentNode}:function(t,n,u){var l,c,p,f,d,h,g=o!==a?"nextSibling":"previousSibling",m=t.parentNode,y=s&&t.nodeName.toLowerCase(),v=!u&&!s;if(m){if(o){while(g){p=t;while(p=p[g])if(s?p.nodeName.toLowerCase()===y:1===p.nodeType)return!1;h=g="only"===e&&!h&&"nextSibling"}return!0}if(h=[a?m.firstChild:m.lastChild],a&&v){c=m[x]||(m[x]={}),l=c[e]||[],d=l[0]===N&&l[1],f=l[0]===N&&l[2],p=d&&m.childNodes[d];while(p=++d&&p&&p[g]||(f=d=0)||h.pop())if(1===p.nodeType&&++f&&p===t){c[e]=[N,d,f];break}}else if(v&&(l=(t[x]||(t[x]={}))[e])&&l[0]===N)f=l[1];else while(p=++d&&p&&p[g]||(f=d=0)||h.pop())if((s?p.nodeName.toLowerCase()===y:1===p.nodeType)&&++f&&(v&&((p[x]||(p[x]={}))[e]=[N,f]),p===t))break;return f-=i,f===r||0===f%r&&f/r>=0}}},PSEUDO:function(e,t){var n,r=i.pseudos[e]||i.setFilters[e.toLowerCase()]||st.error("unsupported pseudo: "+e);return r[x]?r(t):r.length>1?(n=[e,e,"",t],i.setFilters.hasOwnProperty(e.toLowerCase())?ot(function(e,n){var i,o=r(e,t),a=o.length;while(a--)i=M.call(e,o[a]),e[i]=!(n[i]=o[a])}):function(e){return r(e,0,n)}):r}},pseudos:{not:ot(function(e){var t=[],n=[],r=s(e.replace(W,"$1"));return r[x]?ot(function(e,t,n,i){var o,a=r(e,null,i,[]),s=e.length;while(s--)(o=a[s])&&(e[s]=!(t[s]=o))}):function(e,i,o){return t[0]=e,r(t,null,o,n),!n.pop()}}),has:ot(function(e){return function(t){return st(e,t).length>0}}),contains:ot(function(e){return function(t){return(t.textContent||t.innerText||o(t)).indexOf(e)>-1}}),lang:ot(function(e){return X.test(e||"")||st.error("unsupported lang: "+e),e=e.replace(et,tt).toLowerCase(),function(t){var n;do if(n=d?t.getAttribute("xml:lang")||t.getAttribute("lang"):t.lang)return n=n.toLowerCase(),n===e||0===n.indexOf(e+"-");while((t=t.parentNode)&&1===t.nodeType);return!1}}),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===f},focus:function(e){return e===p.activeElement&&(!p.hasFocus||p.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:function(e){return e.disabled===!1},disabled:function(e){return e.disabled===!0},checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,e.selected===!0},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeName>"@"||3===e.nodeType||4===e.nodeType)return!1;return!0},parent:function(e){return!i.pseudos.empty(e)},header:function(e){return Q.test(e.nodeName)},input:function(e){return G.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||t.toLowerCase()===e.type)},first:pt(function(){return[0]}),last:pt(function(e,t){return[t-1]}),eq:pt(function(e,t,n){return[0>n?n+t:n]}),even:pt(function(e,t){var n=0;for(;t>n;n+=2)e.push(n);return e}),odd:pt(function(e,t){var n=1;for(;t>n;n+=2)e.push(n);return e}),lt:pt(function(e,t,n){var r=0>n?n+t:n;for(;--r>=0;)e.push(r);return e}),gt:pt(function(e,t,n){var r=0>n?n+t:n;for(;t>++r;)e.push(r);return e})}};for(n in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})i.pseudos[n]=lt(n);for(n in{submit:!0,reset:!0})i.pseudos[n]=ct(n);function ft(e,t){var n,r,o,a,s,u,l,c=E[e+" "];if(c)return t?0:c.slice(0);s=e,u=[],l=i.preFilter;while(s){(!n||(r=$.exec(s)))&&(r&&(s=s.slice(r[0].length)||s),u.push(o=[])),n=!1,(r=I.exec(s))&&(n=r.shift(),o.push({value:n,type:r[0].replace(W," ")}),s=s.slice(n.length));for(a in i.filter)!(r=U[a].exec(s))||l[a]&&!(r=l[a](r))||(n=r.shift(),o.push({value:n,type:a,matches:r}),s=s.slice(n.length));if(!n)break}return t?s.length:s?st.error(e):E(e,u).slice(0)}function dt(e){var t=0,n=e.length,r="";for(;n>t;t++)r+=e[t].value;return r}function ht(e,t,n){var i=t.dir,o=n&&"parentNode"===i,a=C++;return t.first?function(t,n,r){while(t=t[i])if(1===t.nodeType||o)return e(t,n,r)}:function(t,n,s){var u,l,c,p=N+" "+a;if(s){while(t=t[i])if((1===t.nodeType||o)&&e(t,n,s))return!0}else while(t=t[i])if(1===t.nodeType||o)if(c=t[x]||(t[x]={}),(l=c[i])&&l[0]===p){if((u=l[1])===!0||u===r)return u===!0}else if(l=c[i]=[p],l[1]=e(t,n,s)||r,l[1]===!0)return!0}}function gt(e){return e.length>1?function(t,n,r){var i=e.length;while(i--)if(!e[i](t,n,r))return!1;return!0}:e[0]}function mt(e,t,n,r,i){var o,a=[],s=0,u=e.length,l=null!=t;for(;u>s;s++)(o=e[s])&&(!n||n(o,r,i))&&(a.push(o),l&&t.push(s));return a}function yt(e,t,n,r,i,o){return r&&!r[x]&&(r=yt(r)),i&&!i[x]&&(i=yt(i,o)),ot(function(o,a,s,u){var l,c,p,f=[],d=[],h=a.length,g=o||xt(t||"*",s.nodeType?[s]:s,[]),m=!e||!o&&t?g:mt(g,f,e,s,u),y=n?i||(o?e:h||r)?[]:a:m;if(n&&n(m,y,s,u),r){l=mt(y,d),r(l,[],s,u),c=l.length;while(c--)(p=l[c])&&(y[d[c]]=!(m[d[c]]=p))}if(o){if(i||e){if(i){l=[],c=y.length;while(c--)(p=y[c])&&l.push(m[c]=p);i(null,y=[],l,u)}c=y.length;while(c--)(p=y[c])&&(l=i?M.call(o,p):f[c])>-1&&(o[l]=!(a[l]=p))}}else y=mt(y===a?y.splice(h,y.length):y),i?i(null,a,y,u):H.apply(a,y)})}function vt(e){var t,n,r,o=e.length,a=i.relative[e[0].type],s=a||i.relative[" "],u=a?1:0,c=ht(function(e){return e===t},s,!0),p=ht(function(e){return M.call(t,e)>-1},s,!0),f=[function(e,n,r){return!a&&(r||n!==l)||((t=n).nodeType?c(e,n,r):p(e,n,r))}];for(;o>u;u++)if(n=i.relative[e[u].type])f=[ht(gt(f),n)];else{if(n=i.filter[e[u].type].apply(null,e[u].matches),n[x]){for(r=++u;o>r;r++)if(i.relative[e[r].type])break;return yt(u>1&>(f),u>1&&dt(e.slice(0,u-1)).replace(W,"$1"),n,r>u&&vt(e.slice(u,r)),o>r&&vt(e=e.slice(r)),o>r&&dt(e))}f.push(n)}return gt(f)}function bt(e,t){var n=0,o=t.length>0,a=e.length>0,s=function(s,u,c,f,d){var h,g,m,y=[],v=0,b="0",x=s&&[],w=null!=d,T=l,C=s||a&&i.find.TAG("*",d&&u.parentNode||u),k=N+=null==T?1:Math.random()||.1;for(w&&(l=u!==p&&u,r=n);null!=(h=C[b]);b++){if(a&&h){g=0;while(m=e[g++])if(m(h,u,c)){f.push(h);break}w&&(N=k,r=++n)}o&&((h=!m&&h)&&v--,s&&x.push(h))}if(v+=b,o&&b!==v){g=0;while(m=t[g++])m(x,y,u,c);if(s){if(v>0)while(b--)x[b]||y[b]||(y[b]=L.call(f));y=mt(y)}H.apply(f,y),w&&!s&&y.length>0&&v+t.length>1&&st.uniqueSort(f)}return w&&(N=k,l=T),x};return o?ot(s):s}s=st.compile=function(e,t){var n,r=[],i=[],o=S[e+" "];if(!o){t||(t=ft(e)),n=t.length;while(n--)o=vt(t[n]),o[x]?r.push(o):i.push(o);o=S(e,bt(i,r))}return o};function xt(e,t,n){var r=0,i=t.length;for(;i>r;r++)st(e,t[r],n);return n}function wt(e,t,n,r){var o,a,u,l,c,p=ft(e);if(!r&&1===p.length){if(a=p[0]=p[0].slice(0),a.length>2&&"ID"===(u=a[0]).type&&9===t.nodeType&&!d&&i.relative[a[1].type]){if(t=i.find.ID(u.matches[0].replace(et,tt),t)[0],!t)return n;e=e.slice(a.shift().value.length)}o=U.needsContext.test(e)?0:a.length;while(o--){if(u=a[o],i.relative[l=u.type])break;if((c=i.find[l])&&(r=c(u.matches[0].replace(et,tt),V.test(a[0].type)&&t.parentNode||t))){if(a.splice(o,1),e=r.length&&dt(a),!e)return H.apply(n,q.call(r,0)),n;break}}}return s(e,p)(r,t,d,n,V.test(e)),n}i.pseudos.nth=i.pseudos.eq;function Tt(){}i.filters=Tt.prototype=i.pseudos,i.setFilters=new Tt,c(),st.attr=b.attr,b.find=st,b.expr=st.selectors,b.expr[":"]=b.expr.pseudos,b.unique=st.uniqueSort,b.text=st.getText,b.isXMLDoc=st.isXML,b.contains=st.contains}(e);var at=/Until$/,st=/^(?:parents|prev(?:Until|All))/,ut=/^.[^:#\[\.,]*$/,lt=b.expr.match.needsContext,ct={children:!0,contents:!0,next:!0,prev:!0};b.fn.extend({find:function(e){var t,n,r,i=this.length;if("string"!=typeof e)return r=this,this.pushStack(b(e).filter(function(){for(t=0;i>t;t++)if(b.contains(r[t],this))return!0}));for(n=[],t=0;i>t;t++)b.find(e,this[t],n);return n=this.pushStack(i>1?b.unique(n):n),n.selector=(this.selector?this.selector+" ":"")+e,n},has:function(e){var t,n=b(e,this),r=n.length;return this.filter(function(){for(t=0;r>t;t++)if(b.contains(this,n[t]))return!0})},not:function(e){return this.pushStack(ft(this,e,!1))},filter:function(e){return this.pushStack(ft(this,e,!0))},is:function(e){return!!e&&("string"==typeof e?lt.test(e)?b(e,this.context).index(this[0])>=0:b.filter(e,this).length>0:this.filter(e).length>0)},closest:function(e,t){var n,r=0,i=this.length,o=[],a=lt.test(e)||"string"!=typeof e?b(e,t||this.context):0;for(;i>r;r++){n=this[r];while(n&&n.ownerDocument&&n!==t&&11!==n.nodeType){if(a?a.index(n)>-1:b.find.matchesSelector(n,e)){o.push(n);break}n=n.parentNode}}return this.pushStack(o.length>1?b.unique(o):o)},index:function(e){return e?"string"==typeof e?b.inArray(this[0],b(e)):b.inArray(e.jquery?e[0]:e,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){var n="string"==typeof e?b(e,t):b.makeArray(e&&e.nodeType?[e]:e),r=b.merge(this.get(),n);return this.pushStack(b.unique(r))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}}),b.fn.andSelf=b.fn.addBack;function pt(e,t){do e=e[t];while(e&&1!==e.nodeType);return e}b.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return b.dir(e,"parentNode")},parentsUntil:function(e,t,n){return b.dir(e,"parentNode",n)},next:function(e){return pt(e,"nextSibling")},prev:function(e){return pt(e,"previousSibling")},nextAll:function(e){return b.dir(e,"nextSibling")},prevAll:function(e){return b.dir(e,"previousSibling")},nextUntil:function(e,t,n){return b.dir(e,"nextSibling",n)},prevUntil:function(e,t,n){return b.dir(e,"previousSibling",n)},siblings:function(e){return b.sibling((e.parentNode||{}).firstChild,e)},children:function(e){return b.sibling(e.firstChild)},contents:function(e){return b.nodeName(e,"iframe")?e.contentDocument||e.contentWindow.document:b.merge([],e.childNodes)}},function(e,t){b.fn[e]=function(n,r){var i=b.map(this,t,n);return at.test(e)||(r=n),r&&"string"==typeof r&&(i=b.filter(r,i)),i=this.length>1&&!ct[e]?b.unique(i):i,this.length>1&&st.test(e)&&(i=i.reverse()),this.pushStack(i)}}),b.extend({filter:function(e,t,n){return n&&(e=":not("+e+")"),1===t.length?b.find.matchesSelector(t[0],e)?[t[0]]:[]:b.find.matches(e,t)},dir:function(e,n,r){var i=[],o=e[n];while(o&&9!==o.nodeType&&(r===t||1!==o.nodeType||!b(o).is(r)))1===o.nodeType&&i.push(o),o=o[n];return i},sibling:function(e,t){var n=[];for(;e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n}});function ft(e,t,n){if(t=t||0,b.isFunction(t))return b.grep(e,function(e,r){var i=!!t.call(e,r,e);return i===n});if(t.nodeType)return b.grep(e,function(e){return e===t===n});if("string"==typeof t){var r=b.grep(e,function(e){return 1===e.nodeType});if(ut.test(t))return b.filter(t,r,!n);t=b.filter(t,r)}return b.grep(e,function(e){return b.inArray(e,t)>=0===n})}function dt(e){var t=ht.split("|"),n=e.createDocumentFragment();if(n.createElement)while(t.length)n.createElement(t.pop());return n}var ht="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",gt=/ jQuery\d+="(?:null|\d+)"/g,mt=RegExp("<(?:"+ht+")[\\s/>]","i"),yt=/^\s+/,vt=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,bt=/<([\w:]+)/,xt=/<tbody/i,wt=/<|&#?\w+;/,Tt=/<(?:script|style|link)/i,Nt=/^(?:checkbox|radio)$/i,Ct=/checked\s*(?:[^=]|=\s*.checked.)/i,kt=/^$|\/(?:java|ecma)script/i,Et=/^true\/(.*)/,St=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,At={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],area:[1,"<map>","</map>"],param:[1,"<object>","</object>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:b.support.htmlSerialize?[0,"",""]:[1,"X<div>","</div>"]},jt=dt(o),Dt=jt.appendChild(o.createElement("div"));At.optgroup=At.option,At.tbody=At.tfoot=At.colgroup=At.caption=At.thead,At.th=At.td,b.fn.extend({text:function(e){return b.access(this,function(e){return e===t?b.text(this):this.empty().append((this[0]&&this[0].ownerDocument||o).createTextNode(e))},null,e,arguments.length)},wrapAll:function(e){if(b.isFunction(e))return this.each(function(t){b(this).wrapAll(e.call(this,t))});if(this[0]){var t=b(e,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstChild&&1===e.firstChild.nodeType)e=e.firstChild;return e}).append(this)}return this},wrapInner:function(e){return b.isFunction(e)?this.each(function(t){b(this).wrapInner(e.call(this,t))}):this.each(function(){var t=b(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=b.isFunction(e);return this.each(function(n){b(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(){return this.parent().each(function(){b.nodeName(this,"body")||b(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(e){(1===this.nodeType||11===this.nodeType||9===this.nodeType)&&this.appendChild(e)})},prepend:function(){return this.domManip(arguments,!0,function(e){(1===this.nodeType||11===this.nodeType||9===this.nodeType)&&this.insertBefore(e,this.firstChild)})},before:function(){return this.domManip(arguments,!1,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return this.domManip(arguments,!1,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},remove:function(e,t){var n,r=0;for(;null!=(n=this[r]);r++)(!e||b.filter(e,[n]).length>0)&&(t||1!==n.nodeType||b.cleanData(Ot(n)),n.parentNode&&(t&&b.contains(n.ownerDocument,n)&&Mt(Ot(n,"script")),n.parentNode.removeChild(n)));return this},empty:function(){var e,t=0;for(;null!=(e=this[t]);t++){1===e.nodeType&&b.cleanData(Ot(e,!1));while(e.firstChild)e.removeChild(e.firstChild);e.options&&b.nodeName(e,"select")&&(e.options.length=0)}return this},clone:function(e,t){return e=null==e?!1:e,t=null==t?e:t,this.map(function(){return b.clone(this,e,t)})},html:function(e){return b.access(this,function(e){var n=this[0]||{},r=0,i=this.length;if(e===t)return 1===n.nodeType?n.innerHTML.replace(gt,""):t;if(!("string"!=typeof e||Tt.test(e)||!b.support.htmlSerialize&&mt.test(e)||!b.support.leadingWhitespace&&yt.test(e)||At[(bt.exec(e)||["",""])[1].toLowerCase()])){e=e.replace(vt,"<$1></$2>");try{for(;i>r;r++)n=this[r]||{},1===n.nodeType&&(b.cleanData(Ot(n,!1)),n.innerHTML=e);n=0}catch(o){}}n&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(e){var t=b.isFunction(e);return t||"string"==typeof e||(e=b(e).not(this).detach()),this.domManip([e],!0,function(e){var t=this.nextSibling,n=this.parentNode;n&&(b(this).remove(),n.insertBefore(e,t))})},detach:function(e){return this.remove(e,!0)},domManip:function(e,n,r){e=f.apply([],e);var i,o,a,s,u,l,c=0,p=this.length,d=this,h=p-1,g=e[0],m=b.isFunction(g);if(m||!(1>=p||"string"!=typeof g||b.support.checkClone)&&Ct.test(g))return this.each(function(i){var o=d.eq(i);m&&(e[0]=g.call(this,i,n?o.html():t)),o.domManip(e,n,r)});if(p&&(l=b.buildFragment(e,this[0].ownerDocument,!1,this),i=l.firstChild,1===l.childNodes.length&&(l=i),i)){for(n=n&&b.nodeName(i,"tr"),s=b.map(Ot(l,"script"),Ht),a=s.length;p>c;c++)o=l,c!==h&&(o=b.clone(o,!0,!0),a&&b.merge(s,Ot(o,"script"))),r.call(n&&b.nodeName(this[c],"table")?Lt(this[c],"tbody"):this[c],o,c);if(a)for(u=s[s.length-1].ownerDocument,b.map(s,qt),c=0;a>c;c++)o=s[c],kt.test(o.type||"")&&!b._data(o,"globalEval")&&b.contains(u,o)&&(o.src?b.ajax({url:o.src,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0}):b.globalEval((o.text||o.textContent||o.innerHTML||"").replace(St,"")));l=i=null}return this}});function Lt(e,t){return e.getElementsByTagName(t)[0]||e.appendChild(e.ownerDocument.createElement(t))}function Ht(e){var t=e.getAttributeNode("type");return e.type=(t&&t.specified)+"/"+e.type,e}function qt(e){var t=Et.exec(e.type);return t?e.type=t[1]:e.removeAttribute("type"),e}function Mt(e,t){var n,r=0;for(;null!=(n=e[r]);r++)b._data(n,"globalEval",!t||b._data(t[r],"globalEval"))}function _t(e,t){if(1===t.nodeType&&b.hasData(e)){var n,r,i,o=b._data(e),a=b._data(t,o),s=o.events;if(s){delete a.handle,a.events={};for(n in s)for(r=0,i=s[n].length;i>r;r++)b.event.add(t,n,s[n][r])}a.data&&(a.data=b.extend({},a.data))}}function Ft(e,t){var n,r,i;if(1===t.nodeType){if(n=t.nodeName.toLowerCase(),!b.support.noCloneEvent&&t[b.expando]){i=b._data(t);for(r in i.events)b.removeEvent(t,r,i.handle);t.removeAttribute(b.expando)}"script"===n&&t.text!==e.text?(Ht(t).text=e.text,qt(t)):"object"===n?(t.parentNode&&(t.outerHTML=e.outerHTML),b.support.html5Clone&&e.innerHTML&&!b.trim(t.innerHTML)&&(t.innerHTML=e.innerHTML)):"input"===n&&Nt.test(e.type)?(t.defaultChecked=t.checked=e.checked,t.value!==e.value&&(t.value=e.value)):"option"===n?t.defaultSelected=t.selected=e.defaultSelected:("input"===n||"textarea"===n)&&(t.defaultValue=e.defaultValue)}}b.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,t){b.fn[e]=function(e){var n,r=0,i=[],o=b(e),a=o.length-1;for(;a>=r;r++)n=r===a?this:this.clone(!0),b(o[r])[t](n),d.apply(i,n.get());return this.pushStack(i)}});function Ot(e,n){var r,o,a=0,s=typeof e.getElementsByTagName!==i?e.getElementsByTagName(n||"*"):typeof e.querySelectorAll!==i?e.querySelectorAll(n||"*"):t;if(!s)for(s=[],r=e.childNodes||e;null!=(o=r[a]);a++)!n||b.nodeName(o,n)?s.push(o):b.merge(s,Ot(o,n));return n===t||n&&b.nodeName(e,n)?b.merge([e],s):s}function Bt(e){Nt.test(e.type)&&(e.defaultChecked=e.checked)}b.extend({clone:function(e,t,n){var r,i,o,a,s,u=b.contains(e.ownerDocument,e);if(b.support.html5Clone||b.isXMLDoc(e)||!mt.test("<"+e.nodeName+">")?o=e.cloneNode(!0):(Dt.innerHTML=e.outerHTML,Dt.removeChild(o=Dt.firstChild)),!(b.support.noCloneEvent&&b.support.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||b.isXMLDoc(e)))for(r=Ot(o),s=Ot(e),a=0;null!=(i=s[a]);++a)r[a]&&Ft(i,r[a]);if(t)if(n)for(s=s||Ot(e),r=r||Ot(o),a=0;null!=(i=s[a]);a++)_t(i,r[a]);else _t(e,o);return r=Ot(o,"script"),r.length>0&&Mt(r,!u&&Ot(e,"script")),r=s=i=null,o},buildFragment:function(e,t,n,r){var i,o,a,s,u,l,c,p=e.length,f=dt(t),d=[],h=0;for(;p>h;h++)if(o=e[h],o||0===o)if("object"===b.type(o))b.merge(d,o.nodeType?[o]:o);else if(wt.test(o)){s=s||f.appendChild(t.createElement("div")),u=(bt.exec(o)||["",""])[1].toLowerCase(),c=At[u]||At._default,s.innerHTML=c[1]+o.replace(vt,"<$1></$2>")+c[2],i=c[0];while(i--)s=s.lastChild;if(!b.support.leadingWhitespace&&yt.test(o)&&d.push(t.createTextNode(yt.exec(o)[0])),!b.support.tbody){o="table"!==u||xt.test(o)?"<table>"!==c[1]||xt.test(o)?0:s:s.firstChild,i=o&&o.childNodes.length;while(i--)b.nodeName(l=o.childNodes[i],"tbody")&&!l.childNodes.length&&o.removeChild(l) +}b.merge(d,s.childNodes),s.textContent="";while(s.firstChild)s.removeChild(s.firstChild);s=f.lastChild}else d.push(t.createTextNode(o));s&&f.removeChild(s),b.support.appendChecked||b.grep(Ot(d,"input"),Bt),h=0;while(o=d[h++])if((!r||-1===b.inArray(o,r))&&(a=b.contains(o.ownerDocument,o),s=Ot(f.appendChild(o),"script"),a&&Mt(s),n)){i=0;while(o=s[i++])kt.test(o.type||"")&&n.push(o)}return s=null,f},cleanData:function(e,t){var n,r,o,a,s=0,u=b.expando,l=b.cache,p=b.support.deleteExpando,f=b.event.special;for(;null!=(n=e[s]);s++)if((t||b.acceptData(n))&&(o=n[u],a=o&&l[o])){if(a.events)for(r in a.events)f[r]?b.event.remove(n,r):b.removeEvent(n,r,a.handle);l[o]&&(delete l[o],p?delete n[u]:typeof n.removeAttribute!==i?n.removeAttribute(u):n[u]=null,c.push(o))}}});var Pt,Rt,Wt,$t=/alpha\([^)]*\)/i,It=/opacity\s*=\s*([^)]*)/,zt=/^(top|right|bottom|left)$/,Xt=/^(none|table(?!-c[ea]).+)/,Ut=/^margin/,Vt=RegExp("^("+x+")(.*)$","i"),Yt=RegExp("^("+x+")(?!px)[a-z%]+$","i"),Jt=RegExp("^([+-])=("+x+")","i"),Gt={BODY:"block"},Qt={position:"absolute",visibility:"hidden",display:"block"},Kt={letterSpacing:0,fontWeight:400},Zt=["Top","Right","Bottom","Left"],en=["Webkit","O","Moz","ms"];function tn(e,t){if(t in e)return t;var n=t.charAt(0).toUpperCase()+t.slice(1),r=t,i=en.length;while(i--)if(t=en[i]+n,t in e)return t;return r}function nn(e,t){return e=t||e,"none"===b.css(e,"display")||!b.contains(e.ownerDocument,e)}function rn(e,t){var n,r,i,o=[],a=0,s=e.length;for(;s>a;a++)r=e[a],r.style&&(o[a]=b._data(r,"olddisplay"),n=r.style.display,t?(o[a]||"none"!==n||(r.style.display=""),""===r.style.display&&nn(r)&&(o[a]=b._data(r,"olddisplay",un(r.nodeName)))):o[a]||(i=nn(r),(n&&"none"!==n||!i)&&b._data(r,"olddisplay",i?n:b.css(r,"display"))));for(a=0;s>a;a++)r=e[a],r.style&&(t&&"none"!==r.style.display&&""!==r.style.display||(r.style.display=t?o[a]||"":"none"));return e}b.fn.extend({css:function(e,n){return b.access(this,function(e,n,r){var i,o,a={},s=0;if(b.isArray(n)){for(o=Rt(e),i=n.length;i>s;s++)a[n[s]]=b.css(e,n[s],!1,o);return a}return r!==t?b.style(e,n,r):b.css(e,n)},e,n,arguments.length>1)},show:function(){return rn(this,!0)},hide:function(){return rn(this)},toggle:function(e){var t="boolean"==typeof e;return this.each(function(){(t?e:nn(this))?b(this).show():b(this).hide()})}}),b.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=Wt(e,"opacity");return""===n?"1":n}}}},cssNumber:{columnCount:!0,fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":b.support.cssFloat?"cssFloat":"styleFloat"},style:function(e,n,r,i){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var o,a,s,u=b.camelCase(n),l=e.style;if(n=b.cssProps[u]||(b.cssProps[u]=tn(l,u)),s=b.cssHooks[n]||b.cssHooks[u],r===t)return s&&"get"in s&&(o=s.get(e,!1,i))!==t?o:l[n];if(a=typeof r,"string"===a&&(o=Jt.exec(r))&&(r=(o[1]+1)*o[2]+parseFloat(b.css(e,n)),a="number"),!(null==r||"number"===a&&isNaN(r)||("number"!==a||b.cssNumber[u]||(r+="px"),b.support.clearCloneStyle||""!==r||0!==n.indexOf("background")||(l[n]="inherit"),s&&"set"in s&&(r=s.set(e,r,i))===t)))try{l[n]=r}catch(c){}}},css:function(e,n,r,i){var o,a,s,u=b.camelCase(n);return n=b.cssProps[u]||(b.cssProps[u]=tn(e.style,u)),s=b.cssHooks[n]||b.cssHooks[u],s&&"get"in s&&(a=s.get(e,!0,r)),a===t&&(a=Wt(e,n,i)),"normal"===a&&n in Kt&&(a=Kt[n]),""===r||r?(o=parseFloat(a),r===!0||b.isNumeric(o)?o||0:a):a},swap:function(e,t,n,r){var i,o,a={};for(o in t)a[o]=e.style[o],e.style[o]=t[o];i=n.apply(e,r||[]);for(o in t)e.style[o]=a[o];return i}}),e.getComputedStyle?(Rt=function(t){return e.getComputedStyle(t,null)},Wt=function(e,n,r){var i,o,a,s=r||Rt(e),u=s?s.getPropertyValue(n)||s[n]:t,l=e.style;return s&&(""!==u||b.contains(e.ownerDocument,e)||(u=b.style(e,n)),Yt.test(u)&&Ut.test(n)&&(i=l.width,o=l.minWidth,a=l.maxWidth,l.minWidth=l.maxWidth=l.width=u,u=s.width,l.width=i,l.minWidth=o,l.maxWidth=a)),u}):o.documentElement.currentStyle&&(Rt=function(e){return e.currentStyle},Wt=function(e,n,r){var i,o,a,s=r||Rt(e),u=s?s[n]:t,l=e.style;return null==u&&l&&l[n]&&(u=l[n]),Yt.test(u)&&!zt.test(n)&&(i=l.left,o=e.runtimeStyle,a=o&&o.left,a&&(o.left=e.currentStyle.left),l.left="fontSize"===n?"1em":u,u=l.pixelLeft+"px",l.left=i,a&&(o.left=a)),""===u?"auto":u});function on(e,t,n){var r=Vt.exec(t);return r?Math.max(0,r[1]-(n||0))+(r[2]||"px"):t}function an(e,t,n,r,i){var o=n===(r?"border":"content")?4:"width"===t?1:0,a=0;for(;4>o;o+=2)"margin"===n&&(a+=b.css(e,n+Zt[o],!0,i)),r?("content"===n&&(a-=b.css(e,"padding"+Zt[o],!0,i)),"margin"!==n&&(a-=b.css(e,"border"+Zt[o]+"Width",!0,i))):(a+=b.css(e,"padding"+Zt[o],!0,i),"padding"!==n&&(a+=b.css(e,"border"+Zt[o]+"Width",!0,i)));return a}function sn(e,t,n){var r=!0,i="width"===t?e.offsetWidth:e.offsetHeight,o=Rt(e),a=b.support.boxSizing&&"border-box"===b.css(e,"boxSizing",!1,o);if(0>=i||null==i){if(i=Wt(e,t,o),(0>i||null==i)&&(i=e.style[t]),Yt.test(i))return i;r=a&&(b.support.boxSizingReliable||i===e.style[t]),i=parseFloat(i)||0}return i+an(e,t,n||(a?"border":"content"),r,o)+"px"}function un(e){var t=o,n=Gt[e];return n||(n=ln(e,t),"none"!==n&&n||(Pt=(Pt||b("<iframe frameborder='0' width='0' height='0'/>").css("cssText","display:block !important")).appendTo(t.documentElement),t=(Pt[0].contentWindow||Pt[0].contentDocument).document,t.write("<!doctype html><html><body>"),t.close(),n=ln(e,t),Pt.detach()),Gt[e]=n),n}function ln(e,t){var n=b(t.createElement(e)).appendTo(t.body),r=b.css(n[0],"display");return n.remove(),r}b.each(["height","width"],function(e,n){b.cssHooks[n]={get:function(e,r,i){return r?0===e.offsetWidth&&Xt.test(b.css(e,"display"))?b.swap(e,Qt,function(){return sn(e,n,i)}):sn(e,n,i):t},set:function(e,t,r){var i=r&&Rt(e);return on(e,t,r?an(e,n,r,b.support.boxSizing&&"border-box"===b.css(e,"boxSizing",!1,i),i):0)}}}),b.support.opacity||(b.cssHooks.opacity={get:function(e,t){return It.test((t&&e.currentStyle?e.currentStyle.filter:e.style.filter)||"")?.01*parseFloat(RegExp.$1)+"":t?"1":""},set:function(e,t){var n=e.style,r=e.currentStyle,i=b.isNumeric(t)?"alpha(opacity="+100*t+")":"",o=r&&r.filter||n.filter||"";n.zoom=1,(t>=1||""===t)&&""===b.trim(o.replace($t,""))&&n.removeAttribute&&(n.removeAttribute("filter"),""===t||r&&!r.filter)||(n.filter=$t.test(o)?o.replace($t,i):o+" "+i)}}),b(function(){b.support.reliableMarginRight||(b.cssHooks.marginRight={get:function(e,n){return n?b.swap(e,{display:"inline-block"},Wt,[e,"marginRight"]):t}}),!b.support.pixelPosition&&b.fn.position&&b.each(["top","left"],function(e,n){b.cssHooks[n]={get:function(e,r){return r?(r=Wt(e,n),Yt.test(r)?b(e).position()[n]+"px":r):t}}})}),b.expr&&b.expr.filters&&(b.expr.filters.hidden=function(e){return 0>=e.offsetWidth&&0>=e.offsetHeight||!b.support.reliableHiddenOffsets&&"none"===(e.style&&e.style.display||b.css(e,"display"))},b.expr.filters.visible=function(e){return!b.expr.filters.hidden(e)}),b.each({margin:"",padding:"",border:"Width"},function(e,t){b.cssHooks[e+t]={expand:function(n){var r=0,i={},o="string"==typeof n?n.split(" "):[n];for(;4>r;r++)i[e+Zt[r]+t]=o[r]||o[r-2]||o[0];return i}},Ut.test(e)||(b.cssHooks[e+t].set=on)});var cn=/%20/g,pn=/\[\]$/,fn=/\r?\n/g,dn=/^(?:submit|button|image|reset|file)$/i,hn=/^(?:input|select|textarea|keygen)/i;b.fn.extend({serialize:function(){return b.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=b.prop(this,"elements");return e?b.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!b(this).is(":disabled")&&hn.test(this.nodeName)&&!dn.test(e)&&(this.checked||!Nt.test(e))}).map(function(e,t){var n=b(this).val();return null==n?null:b.isArray(n)?b.map(n,function(e){return{name:t.name,value:e.replace(fn,"\r\n")}}):{name:t.name,value:n.replace(fn,"\r\n")}}).get()}}),b.param=function(e,n){var r,i=[],o=function(e,t){t=b.isFunction(t)?t():null==t?"":t,i[i.length]=encodeURIComponent(e)+"="+encodeURIComponent(t)};if(n===t&&(n=b.ajaxSettings&&b.ajaxSettings.traditional),b.isArray(e)||e.jquery&&!b.isPlainObject(e))b.each(e,function(){o(this.name,this.value)});else for(r in e)gn(r,e[r],n,o);return i.join("&").replace(cn,"+")};function gn(e,t,n,r){var i;if(b.isArray(t))b.each(t,function(t,i){n||pn.test(e)?r(e,i):gn(e+"["+("object"==typeof i?t:"")+"]",i,n,r)});else if(n||"object"!==b.type(t))r(e,t);else for(i in t)gn(e+"["+i+"]",t[i],n,r)}b.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(e,t){b.fn[t]=function(e,n){return arguments.length>0?this.on(t,null,e,n):this.trigger(t)}}),b.fn.hover=function(e,t){return this.mouseenter(e).mouseleave(t||e)};var mn,yn,vn=b.now(),bn=/\?/,xn=/#.*$/,wn=/([?&])_=[^&]*/,Tn=/^(.*?):[ \t]*([^\r\n]*)\r?$/gm,Nn=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Cn=/^(?:GET|HEAD)$/,kn=/^\/\//,En=/^([\w.+-]+:)(?:\/\/([^\/?#:]*)(?::(\d+)|)|)/,Sn=b.fn.load,An={},jn={},Dn="*/".concat("*");try{yn=a.href}catch(Ln){yn=o.createElement("a"),yn.href="",yn=yn.href}mn=En.exec(yn.toLowerCase())||[];function Hn(e){return function(t,n){"string"!=typeof t&&(n=t,t="*");var r,i=0,o=t.toLowerCase().match(w)||[];if(b.isFunction(n))while(r=o[i++])"+"===r[0]?(r=r.slice(1)||"*",(e[r]=e[r]||[]).unshift(n)):(e[r]=e[r]||[]).push(n)}}function qn(e,n,r,i){var o={},a=e===jn;function s(u){var l;return o[u]=!0,b.each(e[u]||[],function(e,u){var c=u(n,r,i);return"string"!=typeof c||a||o[c]?a?!(l=c):t:(n.dataTypes.unshift(c),s(c),!1)}),l}return s(n.dataTypes[0])||!o["*"]&&s("*")}function Mn(e,n){var r,i,o=b.ajaxSettings.flatOptions||{};for(i in n)n[i]!==t&&((o[i]?e:r||(r={}))[i]=n[i]);return r&&b.extend(!0,e,r),e}b.fn.load=function(e,n,r){if("string"!=typeof e&&Sn)return Sn.apply(this,arguments);var i,o,a,s=this,u=e.indexOf(" ");return u>=0&&(i=e.slice(u,e.length),e=e.slice(0,u)),b.isFunction(n)?(r=n,n=t):n&&"object"==typeof n&&(a="POST"),s.length>0&&b.ajax({url:e,type:a,dataType:"html",data:n}).done(function(e){o=arguments,s.html(i?b("<div>").append(b.parseHTML(e)).find(i):e)}).complete(r&&function(e,t){s.each(r,o||[e.responseText,t,e])}),this},b.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){b.fn[t]=function(e){return this.on(t,e)}}),b.each(["get","post"],function(e,n){b[n]=function(e,r,i,o){return b.isFunction(r)&&(o=o||i,i=r,r=t),b.ajax({url:e,type:n,dataType:o,data:r,success:i})}}),b.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:yn,type:"GET",isLocal:Nn.test(mn[1]),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Dn,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":e.String,"text html":!0,"text json":b.parseJSON,"text xml":b.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?Mn(Mn(e,b.ajaxSettings),t):Mn(b.ajaxSettings,e)},ajaxPrefilter:Hn(An),ajaxTransport:Hn(jn),ajax:function(e,n){"object"==typeof e&&(n=e,e=t),n=n||{};var r,i,o,a,s,u,l,c,p=b.ajaxSetup({},n),f=p.context||p,d=p.context&&(f.nodeType||f.jquery)?b(f):b.event,h=b.Deferred(),g=b.Callbacks("once memory"),m=p.statusCode||{},y={},v={},x=0,T="canceled",N={readyState:0,getResponseHeader:function(e){var t;if(2===x){if(!c){c={};while(t=Tn.exec(a))c[t[1].toLowerCase()]=t[2]}t=c[e.toLowerCase()]}return null==t?null:t},getAllResponseHeaders:function(){return 2===x?a:null},setRequestHeader:function(e,t){var n=e.toLowerCase();return x||(e=v[n]=v[n]||e,y[e]=t),this},overrideMimeType:function(e){return x||(p.mimeType=e),this},statusCode:function(e){var t;if(e)if(2>x)for(t in e)m[t]=[m[t],e[t]];else N.always(e[N.status]);return this},abort:function(e){var t=e||T;return l&&l.abort(t),k(0,t),this}};if(h.promise(N).complete=g.add,N.success=N.done,N.error=N.fail,p.url=((e||p.url||yn)+"").replace(xn,"").replace(kn,mn[1]+"//"),p.type=n.method||n.type||p.method||p.type,p.dataTypes=b.trim(p.dataType||"*").toLowerCase().match(w)||[""],null==p.crossDomain&&(r=En.exec(p.url.toLowerCase()),p.crossDomain=!(!r||r[1]===mn[1]&&r[2]===mn[2]&&(r[3]||("http:"===r[1]?80:443))==(mn[3]||("http:"===mn[1]?80:443)))),p.data&&p.processData&&"string"!=typeof p.data&&(p.data=b.param(p.data,p.traditional)),qn(An,p,n,N),2===x)return N;u=p.global,u&&0===b.active++&&b.event.trigger("ajaxStart"),p.type=p.type.toUpperCase(),p.hasContent=!Cn.test(p.type),o=p.url,p.hasContent||(p.data&&(o=p.url+=(bn.test(o)?"&":"?")+p.data,delete p.data),p.cache===!1&&(p.url=wn.test(o)?o.replace(wn,"$1_="+vn++):o+(bn.test(o)?"&":"?")+"_="+vn++)),p.ifModified&&(b.lastModified[o]&&N.setRequestHeader("If-Modified-Since",b.lastModified[o]),b.etag[o]&&N.setRequestHeader("If-None-Match",b.etag[o])),(p.data&&p.hasContent&&p.contentType!==!1||n.contentType)&&N.setRequestHeader("Content-Type",p.contentType),N.setRequestHeader("Accept",p.dataTypes[0]&&p.accepts[p.dataTypes[0]]?p.accepts[p.dataTypes[0]]+("*"!==p.dataTypes[0]?", "+Dn+"; q=0.01":""):p.accepts["*"]);for(i in p.headers)N.setRequestHeader(i,p.headers[i]);if(p.beforeSend&&(p.beforeSend.call(f,N,p)===!1||2===x))return N.abort();T="abort";for(i in{success:1,error:1,complete:1})N[i](p[i]);if(l=qn(jn,p,n,N)){N.readyState=1,u&&d.trigger("ajaxSend",[N,p]),p.async&&p.timeout>0&&(s=setTimeout(function(){N.abort("timeout")},p.timeout));try{x=1,l.send(y,k)}catch(C){if(!(2>x))throw C;k(-1,C)}}else k(-1,"No Transport");function k(e,n,r,i){var c,y,v,w,T,C=n;2!==x&&(x=2,s&&clearTimeout(s),l=t,a=i||"",N.readyState=e>0?4:0,r&&(w=_n(p,N,r)),e>=200&&300>e||304===e?(p.ifModified&&(T=N.getResponseHeader("Last-Modified"),T&&(b.lastModified[o]=T),T=N.getResponseHeader("etag"),T&&(b.etag[o]=T)),204===e?(c=!0,C="nocontent"):304===e?(c=!0,C="notmodified"):(c=Fn(p,w),C=c.state,y=c.data,v=c.error,c=!v)):(v=C,(e||!C)&&(C="error",0>e&&(e=0))),N.status=e,N.statusText=(n||C)+"",c?h.resolveWith(f,[y,C,N]):h.rejectWith(f,[N,C,v]),N.statusCode(m),m=t,u&&d.trigger(c?"ajaxSuccess":"ajaxError",[N,p,c?y:v]),g.fireWith(f,[N,C]),u&&(d.trigger("ajaxComplete",[N,p]),--b.active||b.event.trigger("ajaxStop")))}return N},getScript:function(e,n){return b.get(e,t,n,"script")},getJSON:function(e,t,n){return b.get(e,t,n,"json")}});function _n(e,n,r){var i,o,a,s,u=e.contents,l=e.dataTypes,c=e.responseFields;for(s in c)s in r&&(n[c[s]]=r[s]);while("*"===l[0])l.shift(),o===t&&(o=e.mimeType||n.getResponseHeader("Content-Type"));if(o)for(s in u)if(u[s]&&u[s].test(o)){l.unshift(s);break}if(l[0]in r)a=l[0];else{for(s in r){if(!l[0]||e.converters[s+" "+l[0]]){a=s;break}i||(i=s)}a=a||i}return a?(a!==l[0]&&l.unshift(a),r[a]):t}function Fn(e,t){var n,r,i,o,a={},s=0,u=e.dataTypes.slice(),l=u[0];if(e.dataFilter&&(t=e.dataFilter(t,e.dataType)),u[1])for(i in e.converters)a[i.toLowerCase()]=e.converters[i];for(;r=u[++s];)if("*"!==r){if("*"!==l&&l!==r){if(i=a[l+" "+r]||a["* "+r],!i)for(n in a)if(o=n.split(" "),o[1]===r&&(i=a[l+" "+o[0]]||a["* "+o[0]])){i===!0?i=a[n]:a[n]!==!0&&(r=o[0],u.splice(s--,0,r));break}if(i!==!0)if(i&&e["throws"])t=i(t);else try{t=i(t)}catch(c){return{state:"parsererror",error:i?c:"No conversion from "+l+" to "+r}}}l=r}return{state:"success",data:t}}b.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/(?:java|ecma)script/},converters:{"text script":function(e){return b.globalEval(e),e}}}),b.ajaxPrefilter("script",function(e){e.cache===t&&(e.cache=!1),e.crossDomain&&(e.type="GET",e.global=!1)}),b.ajaxTransport("script",function(e){if(e.crossDomain){var n,r=o.head||b("head")[0]||o.documentElement;return{send:function(t,i){n=o.createElement("script"),n.async=!0,e.scriptCharset&&(n.charset=e.scriptCharset),n.src=e.url,n.onload=n.onreadystatechange=function(e,t){(t||!n.readyState||/loaded|complete/.test(n.readyState))&&(n.onload=n.onreadystatechange=null,n.parentNode&&n.parentNode.removeChild(n),n=null,t||i(200,"success"))},r.insertBefore(n,r.firstChild)},abort:function(){n&&n.onload(t,!0)}}}});var On=[],Bn=/(=)\?(?=&|$)|\?\?/;b.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=On.pop()||b.expando+"_"+vn++;return this[e]=!0,e}}),b.ajaxPrefilter("json jsonp",function(n,r,i){var o,a,s,u=n.jsonp!==!1&&(Bn.test(n.url)?"url":"string"==typeof n.data&&!(n.contentType||"").indexOf("application/x-www-form-urlencoded")&&Bn.test(n.data)&&"data");return u||"jsonp"===n.dataTypes[0]?(o=n.jsonpCallback=b.isFunction(n.jsonpCallback)?n.jsonpCallback():n.jsonpCallback,u?n[u]=n[u].replace(Bn,"$1"+o):n.jsonp!==!1&&(n.url+=(bn.test(n.url)?"&":"?")+n.jsonp+"="+o),n.converters["script json"]=function(){return s||b.error(o+" was not called"),s[0]},n.dataTypes[0]="json",a=e[o],e[o]=function(){s=arguments},i.always(function(){e[o]=a,n[o]&&(n.jsonpCallback=r.jsonpCallback,On.push(o)),s&&b.isFunction(a)&&a(s[0]),s=a=t}),"script"):t});var Pn,Rn,Wn=0,$n=e.ActiveXObject&&function(){var e;for(e in Pn)Pn[e](t,!0)};function In(){try{return new e.XMLHttpRequest}catch(t){}}function zn(){try{return new e.ActiveXObject("Microsoft.XMLHTTP")}catch(t){}}b.ajaxSettings.xhr=e.ActiveXObject?function(){return!this.isLocal&&In()||zn()}:In,Rn=b.ajaxSettings.xhr(),b.support.cors=!!Rn&&"withCredentials"in Rn,Rn=b.support.ajax=!!Rn,Rn&&b.ajaxTransport(function(n){if(!n.crossDomain||b.support.cors){var r;return{send:function(i,o){var a,s,u=n.xhr();if(n.username?u.open(n.type,n.url,n.async,n.username,n.password):u.open(n.type,n.url,n.async),n.xhrFields)for(s in n.xhrFields)u[s]=n.xhrFields[s];n.mimeType&&u.overrideMimeType&&u.overrideMimeType(n.mimeType),n.crossDomain||i["X-Requested-With"]||(i["X-Requested-With"]="XMLHttpRequest");try{for(s in i)u.setRequestHeader(s,i[s])}catch(l){}u.send(n.hasContent&&n.data||null),r=function(e,i){var s,l,c,p;try{if(r&&(i||4===u.readyState))if(r=t,a&&(u.onreadystatechange=b.noop,$n&&delete Pn[a]),i)4!==u.readyState&&u.abort();else{p={},s=u.status,l=u.getAllResponseHeaders(),"string"==typeof u.responseText&&(p.text=u.responseText);try{c=u.statusText}catch(f){c=""}s||!n.isLocal||n.crossDomain?1223===s&&(s=204):s=p.text?200:404}}catch(d){i||o(-1,d)}p&&o(s,c,p,l)},n.async?4===u.readyState?setTimeout(r):(a=++Wn,$n&&(Pn||(Pn={},b(e).unload($n)),Pn[a]=r),u.onreadystatechange=r):r()},abort:function(){r&&r(t,!0)}}}});var Xn,Un,Vn=/^(?:toggle|show|hide)$/,Yn=RegExp("^(?:([+-])=|)("+x+")([a-z%]*)$","i"),Jn=/queueHooks$/,Gn=[nr],Qn={"*":[function(e,t){var n,r,i=this.createTween(e,t),o=Yn.exec(t),a=i.cur(),s=+a||0,u=1,l=20;if(o){if(n=+o[2],r=o[3]||(b.cssNumber[e]?"":"px"),"px"!==r&&s){s=b.css(i.elem,e,!0)||n||1;do u=u||".5",s/=u,b.style(i.elem,e,s+r);while(u!==(u=i.cur()/a)&&1!==u&&--l)}i.unit=r,i.start=s,i.end=o[1]?s+(o[1]+1)*n:n}return i}]};function Kn(){return setTimeout(function(){Xn=t}),Xn=b.now()}function Zn(e,t){b.each(t,function(t,n){var r=(Qn[t]||[]).concat(Qn["*"]),i=0,o=r.length;for(;o>i;i++)if(r[i].call(e,t,n))return})}function er(e,t,n){var r,i,o=0,a=Gn.length,s=b.Deferred().always(function(){delete u.elem}),u=function(){if(i)return!1;var t=Xn||Kn(),n=Math.max(0,l.startTime+l.duration-t),r=n/l.duration||0,o=1-r,a=0,u=l.tweens.length;for(;u>a;a++)l.tweens[a].run(o);return s.notifyWith(e,[l,o,n]),1>o&&u?n:(s.resolveWith(e,[l]),!1)},l=s.promise({elem:e,props:b.extend({},t),opts:b.extend(!0,{specialEasing:{}},n),originalProperties:t,originalOptions:n,startTime:Xn||Kn(),duration:n.duration,tweens:[],createTween:function(t,n){var r=b.Tween(e,l.opts,t,n,l.opts.specialEasing[t]||l.opts.easing);return l.tweens.push(r),r},stop:function(t){var n=0,r=t?l.tweens.length:0;if(i)return this;for(i=!0;r>n;n++)l.tweens[n].run(1);return t?s.resolveWith(e,[l,t]):s.rejectWith(e,[l,t]),this}}),c=l.props;for(tr(c,l.opts.specialEasing);a>o;o++)if(r=Gn[o].call(l,e,c,l.opts))return r;return Zn(l,c),b.isFunction(l.opts.start)&&l.opts.start.call(e,l),b.fx.timer(b.extend(u,{elem:e,anim:l,queue:l.opts.queue})),l.progress(l.opts.progress).done(l.opts.done,l.opts.complete).fail(l.opts.fail).always(l.opts.always)}function tr(e,t){var n,r,i,o,a;for(i in e)if(r=b.camelCase(i),o=t[r],n=e[i],b.isArray(n)&&(o=n[1],n=e[i]=n[0]),i!==r&&(e[r]=n,delete e[i]),a=b.cssHooks[r],a&&"expand"in a){n=a.expand(n),delete e[r];for(i in n)i in e||(e[i]=n[i],t[i]=o)}else t[r]=o}b.Animation=b.extend(er,{tweener:function(e,t){b.isFunction(e)?(t=e,e=["*"]):e=e.split(" ");var n,r=0,i=e.length;for(;i>r;r++)n=e[r],Qn[n]=Qn[n]||[],Qn[n].unshift(t)},prefilter:function(e,t){t?Gn.unshift(e):Gn.push(e)}});function nr(e,t,n){var r,i,o,a,s,u,l,c,p,f=this,d=e.style,h={},g=[],m=e.nodeType&&nn(e);n.queue||(c=b._queueHooks(e,"fx"),null==c.unqueued&&(c.unqueued=0,p=c.empty.fire,c.empty.fire=function(){c.unqueued||p()}),c.unqueued++,f.always(function(){f.always(function(){c.unqueued--,b.queue(e,"fx").length||c.empty.fire()})})),1===e.nodeType&&("height"in t||"width"in t)&&(n.overflow=[d.overflow,d.overflowX,d.overflowY],"inline"===b.css(e,"display")&&"none"===b.css(e,"float")&&(b.support.inlineBlockNeedsLayout&&"inline"!==un(e.nodeName)?d.zoom=1:d.display="inline-block")),n.overflow&&(d.overflow="hidden",b.support.shrinkWrapBlocks||f.always(function(){d.overflow=n.overflow[0],d.overflowX=n.overflow[1],d.overflowY=n.overflow[2]}));for(i in t)if(a=t[i],Vn.exec(a)){if(delete t[i],u=u||"toggle"===a,a===(m?"hide":"show"))continue;g.push(i)}if(o=g.length){s=b._data(e,"fxshow")||b._data(e,"fxshow",{}),"hidden"in s&&(m=s.hidden),u&&(s.hidden=!m),m?b(e).show():f.done(function(){b(e).hide()}),f.done(function(){var t;b._removeData(e,"fxshow");for(t in h)b.style(e,t,h[t])});for(i=0;o>i;i++)r=g[i],l=f.createTween(r,m?s[r]:0),h[r]=s[r]||b.style(e,r),r in s||(s[r]=l.start,m&&(l.end=l.start,l.start="width"===r||"height"===r?1:0))}}function rr(e,t,n,r,i){return new rr.prototype.init(e,t,n,r,i)}b.Tween=rr,rr.prototype={constructor:rr,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||"swing",this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(b.cssNumber[n]?"":"px")},cur:function(){var e=rr.propHooks[this.prop];return e&&e.get?e.get(this):rr.propHooks._default.get(this)},run:function(e){var t,n=rr.propHooks[this.prop];return this.pos=t=this.options.duration?b.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):rr.propHooks._default.set(this),this}},rr.prototype.init.prototype=rr.prototype,rr.propHooks={_default:{get:function(e){var t;return null==e.elem[e.prop]||e.elem.style&&null!=e.elem.style[e.prop]?(t=b.css(e.elem,e.prop,""),t&&"auto"!==t?t:0):e.elem[e.prop]},set:function(e){b.fx.step[e.prop]?b.fx.step[e.prop](e):e.elem.style&&(null!=e.elem.style[b.cssProps[e.prop]]||b.cssHooks[e.prop])?b.style(e.elem,e.prop,e.now+e.unit):e.elem[e.prop]=e.now}}},rr.propHooks.scrollTop=rr.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},b.each(["toggle","show","hide"],function(e,t){var n=b.fn[t];b.fn[t]=function(e,r,i){return null==e||"boolean"==typeof e?n.apply(this,arguments):this.animate(ir(t,!0),e,r,i)}}),b.fn.extend({fadeTo:function(e,t,n,r){return this.filter(nn).css("opacity",0).show().end().animate({opacity:t},e,n,r)},animate:function(e,t,n,r){var i=b.isEmptyObject(e),o=b.speed(t,n,r),a=function(){var t=er(this,b.extend({},e),o);a.finish=function(){t.stop(!0)},(i||b._data(this,"finish"))&&t.stop(!0)};return a.finish=a,i||o.queue===!1?this.each(a):this.queue(o.queue,a)},stop:function(e,n,r){var i=function(e){var t=e.stop;delete e.stop,t(r)};return"string"!=typeof e&&(r=n,n=e,e=t),n&&e!==!1&&this.queue(e||"fx",[]),this.each(function(){var t=!0,n=null!=e&&e+"queueHooks",o=b.timers,a=b._data(this);if(n)a[n]&&a[n].stop&&i(a[n]);else for(n in a)a[n]&&a[n].stop&&Jn.test(n)&&i(a[n]);for(n=o.length;n--;)o[n].elem!==this||null!=e&&o[n].queue!==e||(o[n].anim.stop(r),t=!1,o.splice(n,1));(t||!r)&&b.dequeue(this,e)})},finish:function(e){return e!==!1&&(e=e||"fx"),this.each(function(){var t,n=b._data(this),r=n[e+"queue"],i=n[e+"queueHooks"],o=b.timers,a=r?r.length:0;for(n.finish=!0,b.queue(this,e,[]),i&&i.cur&&i.cur.finish&&i.cur.finish.call(this),t=o.length;t--;)o[t].elem===this&&o[t].queue===e&&(o[t].anim.stop(!0),o.splice(t,1));for(t=0;a>t;t++)r[t]&&r[t].finish&&r[t].finish.call(this);delete n.finish})}});function ir(e,t){var n,r={height:e},i=0;for(t=t?1:0;4>i;i+=2-t)n=Zt[i],r["margin"+n]=r["padding"+n]=e;return t&&(r.opacity=r.width=e),r}b.each({slideDown:ir("show"),slideUp:ir("hide"),slideToggle:ir("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,t){b.fn[e]=function(e,n,r){return this.animate(t,e,n,r)}}),b.speed=function(e,t,n){var r=e&&"object"==typeof e?b.extend({},e):{complete:n||!n&&t||b.isFunction(e)&&e,duration:e,easing:n&&t||t&&!b.isFunction(t)&&t};return r.duration=b.fx.off?0:"number"==typeof r.duration?r.duration:r.duration in b.fx.speeds?b.fx.speeds[r.duration]:b.fx.speeds._default,(null==r.queue||r.queue===!0)&&(r.queue="fx"),r.old=r.complete,r.complete=function(){b.isFunction(r.old)&&r.old.call(this),r.queue&&b.dequeue(this,r.queue)},r},b.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2}},b.timers=[],b.fx=rr.prototype.init,b.fx.tick=function(){var e,n=b.timers,r=0;for(Xn=b.now();n.length>r;r++)e=n[r],e()||n[r]!==e||n.splice(r--,1);n.length||b.fx.stop(),Xn=t},b.fx.timer=function(e){e()&&b.timers.push(e)&&b.fx.start()},b.fx.interval=13,b.fx.start=function(){Un||(Un=setInterval(b.fx.tick,b.fx.interval))},b.fx.stop=function(){clearInterval(Un),Un=null},b.fx.speeds={slow:600,fast:200,_default:400},b.fx.step={},b.expr&&b.expr.filters&&(b.expr.filters.animated=function(e){return b.grep(b.timers,function(t){return e===t.elem}).length}),b.fn.offset=function(e){if(arguments.length)return e===t?this:this.each(function(t){b.offset.setOffset(this,e,t)});var n,r,o={top:0,left:0},a=this[0],s=a&&a.ownerDocument;if(s)return n=s.documentElement,b.contains(n,a)?(typeof a.getBoundingClientRect!==i&&(o=a.getBoundingClientRect()),r=or(s),{top:o.top+(r.pageYOffset||n.scrollTop)-(n.clientTop||0),left:o.left+(r.pageXOffset||n.scrollLeft)-(n.clientLeft||0)}):o},b.offset={setOffset:function(e,t,n){var r=b.css(e,"position");"static"===r&&(e.style.position="relative");var i=b(e),o=i.offset(),a=b.css(e,"top"),s=b.css(e,"left"),u=("absolute"===r||"fixed"===r)&&b.inArray("auto",[a,s])>-1,l={},c={},p,f;u?(c=i.position(),p=c.top,f=c.left):(p=parseFloat(a)||0,f=parseFloat(s)||0),b.isFunction(t)&&(t=t.call(e,n,o)),null!=t.top&&(l.top=t.top-o.top+p),null!=t.left&&(l.left=t.left-o.left+f),"using"in t?t.using.call(e,l):i.css(l)}},b.fn.extend({position:function(){if(this[0]){var e,t,n={top:0,left:0},r=this[0];return"fixed"===b.css(r,"position")?t=r.getBoundingClientRect():(e=this.offsetParent(),t=this.offset(),b.nodeName(e[0],"html")||(n=e.offset()),n.top+=b.css(e[0],"borderTopWidth",!0),n.left+=b.css(e[0],"borderLeftWidth",!0)),{top:t.top-n.top-b.css(r,"marginTop",!0),left:t.left-n.left-b.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent||o.documentElement;while(e&&!b.nodeName(e,"html")&&"static"===b.css(e,"position"))e=e.offsetParent;return e||o.documentElement})}}),b.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(e,n){var r=/Y/.test(n);b.fn[e]=function(i){return b.access(this,function(e,i,o){var a=or(e);return o===t?a?n in a?a[n]:a.document.documentElement[i]:e[i]:(a?a.scrollTo(r?b(a).scrollLeft():o,r?o:b(a).scrollTop()):e[i]=o,t)},e,i,arguments.length,null)}});function or(e){return b.isWindow(e)?e:9===e.nodeType?e.defaultView||e.parentWindow:!1}b.each({Height:"height",Width:"width"},function(e,n){b.each({padding:"inner"+e,content:n,"":"outer"+e},function(r,i){b.fn[i]=function(i,o){var a=arguments.length&&(r||"boolean"!=typeof i),s=r||(i===!0||o===!0?"margin":"border");return b.access(this,function(n,r,i){var o;return b.isWindow(n)?n.document.documentElement["client"+e]:9===n.nodeType?(o=n.documentElement,Math.max(n.body["scroll"+e],o["scroll"+e],n.body["offset"+e],o["offset"+e],o["client"+e])):i===t?b.css(n,r,s):b.style(n,r,i,s)},n,a?i:t,a,null)}})}),e.jQuery=e.$=b,"function"==typeof define&&define.amd&&define.amd.jQuery&&define("jquery",[],function(){return b})})(window);
\ No newline at end of file diff --git a/tbc/static/js/tests/vendor/qunit.css b/tbc/static/js/tests/vendor/qunit.css new file mode 100755 index 0000000..b3e3d00 --- /dev/null +++ b/tbc/static/js/tests/vendor/qunit.css @@ -0,0 +1,232 @@ +/** + * QUnit - A JavaScript Unit Testing Framework + * + * http://docs.jquery.com/QUnit + * + * Copyright (c) 2012 John Resig, Jörn Zaefferer + * Dual licensed under the MIT (MIT-LICENSE.txt) + * or GPL (GPL-LICENSE.txt) licenses. + */ + +/** Font Family and Sizes */ + +#qunit-tests, #qunit-header, #qunit-banner, #qunit-testrunner-toolbar, #qunit-userAgent, #qunit-testresult { + font-family: "Helvetica Neue Light", "HelveticaNeue-Light", "Helvetica Neue", Calibri, Helvetica, Arial, sans-serif; +} + +#qunit-testrunner-toolbar, #qunit-userAgent, #qunit-testresult, #qunit-tests li { font-size: small; } +#qunit-tests { font-size: smaller; } + + +/** Resets */ + +#qunit-tests, #qunit-tests ol, #qunit-header, #qunit-banner, #qunit-userAgent, #qunit-testresult { + margin: 0; + padding: 0; +} + + +/** Header */ + +#qunit-header { + padding: 0.5em 0 0.5em 1em; + + color: #8699a4; + background-color: #0d3349; + + font-size: 1.5em; + line-height: 1em; + font-weight: normal; + + border-radius: 15px 15px 0 0; + -moz-border-radius: 15px 15px 0 0; + -webkit-border-top-right-radius: 15px; + -webkit-border-top-left-radius: 15px; +} + +#qunit-header a { + text-decoration: none; + color: #c2ccd1; +} + +#qunit-header a:hover, +#qunit-header a:focus { + color: #fff; +} + +#qunit-banner { + height: 5px; +} + +#qunit-testrunner-toolbar { + padding: 0.5em 0 0.5em 2em; + color: #5E740B; + background-color: #eee; +} + +#qunit-userAgent { + padding: 0.5em 0 0.5em 2.5em; + background-color: #2b81af; + color: #fff; + text-shadow: rgba(0, 0, 0, 0.5) 2px 2px 1px; +} + + +/** Tests: Pass/Fail */ + +#qunit-tests { + list-style-position: inside; +} + +#qunit-tests li { + padding: 0.4em 0.5em 0.4em 2.5em; + border-bottom: 1px solid #fff; + list-style-position: inside; +} + +#qunit-tests.hidepass li.pass, #qunit-tests.hidepass li.running { + display: none; +} + +#qunit-tests li strong { + cursor: pointer; +} + +#qunit-tests li a { + padding: 0.5em; + color: #c2ccd1; + text-decoration: none; +} +#qunit-tests li a:hover, +#qunit-tests li a:focus { + color: #000; +} + +#qunit-tests ol { + margin-top: 0.5em; + padding: 0.5em; + + background-color: #fff; + + border-radius: 15px; + -moz-border-radius: 15px; + -webkit-border-radius: 15px; + + box-shadow: inset 0px 2px 13px #999; + -moz-box-shadow: inset 0px 2px 13px #999; + -webkit-box-shadow: inset 0px 2px 13px #999; +} + +#qunit-tests table { + border-collapse: collapse; + margin-top: .2em; +} + +#qunit-tests th { + text-align: right; + vertical-align: top; + padding: 0 .5em 0 0; +} + +#qunit-tests td { + vertical-align: top; +} + +#qunit-tests pre { + margin: 0; + white-space: pre-wrap; + word-wrap: break-word; +} + +#qunit-tests del { + background-color: #e0f2be; + color: #374e0c; + text-decoration: none; +} + +#qunit-tests ins { + background-color: #ffcaca; + color: #500; + text-decoration: none; +} + +/*** Test Counts */ + +#qunit-tests b.counts { color: black; } +#qunit-tests b.passed { color: #5E740B; } +#qunit-tests b.failed { color: #710909; } + +#qunit-tests li li { + margin: 0.5em; + padding: 0.4em 0.5em 0.4em 0.5em; + background-color: #fff; + border-bottom: none; + list-style-position: inside; +} + +/*** Passing Styles */ + +#qunit-tests li li.pass { + color: #5E740B; + background-color: #fff; + border-left: 26px solid #C6E746; +} + +#qunit-tests .pass { color: #528CE0; background-color: #D2E0E6; } +#qunit-tests .pass .test-name { color: #366097; } + +#qunit-tests .pass .test-actual, +#qunit-tests .pass .test-expected { color: #999999; } + +#qunit-banner.qunit-pass { background-color: #C6E746; } + +/*** Failing Styles */ + +#qunit-tests li li.fail { + color: #710909; + background-color: #fff; + border-left: 26px solid #EE5757; + white-space: pre; +} + +#qunit-tests > li:last-child { + border-radius: 0 0 15px 15px; + -moz-border-radius: 0 0 15px 15px; + -webkit-border-bottom-right-radius: 15px; + -webkit-border-bottom-left-radius: 15px; +} + +#qunit-tests .fail { color: #000000; background-color: #EE5757; } +#qunit-tests .fail .test-name, +#qunit-tests .fail .module-name { color: #000000; } + +#qunit-tests .fail .test-actual { color: #EE5757; } +#qunit-tests .fail .test-expected { color: green; } + +#qunit-banner.qunit-fail { background-color: #EE5757; } + + +/** Result */ + +#qunit-testresult { + padding: 0.5em 0.5em 0.5em 2.5em; + + color: #2b81af; + background-color: #D2E0E6; + + border-bottom: 1px solid white; +} + +/** Fixture */ + +#qunit-fixture { + position: absolute; + top: -10000px; + left: -10000px; +} + +/** Runoff */ + +#qunit-fixture { + display:none; +}
\ No newline at end of file diff --git a/tbc/static/js/tests/vendor/qunit.js b/tbc/static/js/tests/vendor/qunit.js new file mode 100755 index 0000000..46c95b2 --- /dev/null +++ b/tbc/static/js/tests/vendor/qunit.js @@ -0,0 +1,1510 @@ +/** + * QUnit - A JavaScript Unit Testing Framework + * + * http://docs.jquery.com/QUnit + * + * Copyright (c) 2012 John Resig, Jörn Zaefferer + * Dual licensed under the MIT (MIT-LICENSE.txt) + * or GPL (GPL-LICENSE.txt) licenses. + */ + +(function(window) { + +var defined = { + setTimeout: typeof window.setTimeout !== "undefined", + sessionStorage: (function() { + try { + return !!sessionStorage.getItem; + } catch(e) { + return false; + } + })() +}; + +var testId = 0; + +var Test = function(name, testName, expected, testEnvironmentArg, async, callback) { + this.name = name; + this.testName = testName; + this.expected = expected; + this.testEnvironmentArg = testEnvironmentArg; + this.async = async; + this.callback = callback; + this.assertions = []; +}; +Test.prototype = { + init: function() { + var tests = id("qunit-tests"); + if (tests) { + var b = document.createElement("strong"); + b.innerHTML = "Running " + this.name; + var li = document.createElement("li"); + li.appendChild( b ); + li.className = "running"; + li.id = this.id = "test-output" + testId++; + tests.appendChild( li ); + } + }, + setup: function() { + if (this.module != config.previousModule) { + if ( config.previousModule ) { + QUnit.moduleDone( { + name: config.previousModule, + failed: config.moduleStats.bad, + passed: config.moduleStats.all - config.moduleStats.bad, + total: config.moduleStats.all + } ); + } + config.previousModule = this.module; + config.moduleStats = { all: 0, bad: 0 }; + QUnit.moduleStart( { + name: this.module + } ); + } + + config.current = this; + this.testEnvironment = extend({ + setup: function() {}, + teardown: function() {} + }, this.moduleTestEnvironment); + if (this.testEnvironmentArg) { + extend(this.testEnvironment, this.testEnvironmentArg); + } + + QUnit.testStart( { + name: this.testName + } ); + + // allow utility functions to access the current test environment + // TODO why?? + QUnit.current_testEnvironment = this.testEnvironment; + + try { + if ( !config.pollution ) { + saveGlobal(); + } + + this.testEnvironment.setup.call(this.testEnvironment); + } catch(e) { + QUnit.ok( false, "Setup failed on " + this.testName + ": " + e.message ); + } + }, + run: function() { + if ( this.async ) { + QUnit.stop(); + } + + if ( config.notrycatch ) { + this.callback.call(this.testEnvironment); + return; + } + try { + this.callback.call(this.testEnvironment); + } catch(e) { + fail("Test " + this.testName + " died, exception and test follows", e, this.callback); + QUnit.ok( false, "Died on test #" + (this.assertions.length + 1) + ": " + e.message + " - " + QUnit.jsDump.parse(e) ); + // else next test will carry the responsibility + saveGlobal(); + + // Restart the tests if they're blocking + if ( config.blocking ) { + start(); + } + } + }, + teardown: function() { + try { + this.testEnvironment.teardown.call(this.testEnvironment); + checkPollution(); + } catch(e) { + QUnit.ok( false, "Teardown failed on " + this.testName + ": " + e.message ); + } + }, + finish: function() { + if ( this.expected && this.expected != this.assertions.length ) { + QUnit.ok( false, "Expected " + this.expected + " assertions, but " + this.assertions.length + " were run" ); + } + + var good = 0, bad = 0, + tests = id("qunit-tests"); + + config.stats.all += this.assertions.length; + config.moduleStats.all += this.assertions.length; + + if ( tests ) { + var ol = document.createElement("ol"); + + for ( var i = 0; i < this.assertions.length; i++ ) { + var assertion = this.assertions[i]; + + var li = document.createElement("li"); + li.className = assertion.result ? "pass" : "fail"; + li.innerHTML = assertion.message || (assertion.result ? "okay" : "failed"); + ol.appendChild( li ); + + if ( assertion.result ) { + good++; + } else { + bad++; + config.stats.bad++; + config.moduleStats.bad++; + } + } + + // store result when possible + if ( QUnit.config.reorder && defined.sessionStorage ) { + if (bad) { + sessionStorage.setItem("qunit-" + this.module + "-" + this.testName, bad); + } else { + sessionStorage.removeItem("qunit-" + this.module + "-" + this.testName); + } + } + + if (bad == 0) { + ol.style.display = "none"; + } + + var b = document.createElement("strong"); + b.innerHTML = this.name + " <b class='counts'>(<b class='failed'>" + bad + "</b>, <b class='passed'>" + good + "</b>, " + this.assertions.length + ")</b>"; + + var a = document.createElement("a"); + a.innerHTML = "Rerun"; + a.href = QUnit.url({ filter: getText([b]).replace(/\([^)]+\)$/, "").replace(/(^\s*|\s*$)/g, "") }); + + addEvent(b, "click", function() { + var next = b.nextSibling.nextSibling, + display = next.style.display; + next.style.display = display === "none" ? "block" : "none"; + }); + + addEvent(b, "dblclick", function(e) { + var target = e && e.target ? e.target : window.event.srcElement; + if ( target.nodeName.toLowerCase() == "span" || target.nodeName.toLowerCase() == "b" ) { + target = target.parentNode; + } + if ( window.location && target.nodeName.toLowerCase() === "strong" ) { + window.location = QUnit.url({ filter: getText([target]).replace(/\([^)]+\)$/, "").replace(/(^\s*|\s*$)/g, "") }); + } + }); + + var li = id(this.id); + li.className = bad ? "fail" : "pass"; + li.removeChild( li.firstChild ); + li.appendChild( b ); + li.appendChild( a ); + li.appendChild( ol ); + + } else { + for ( var i = 0; i < this.assertions.length; i++ ) { + if ( !this.assertions[i].result ) { + bad++; + config.stats.bad++; + config.moduleStats.bad++; + } + } + } + + try { + QUnit.reset(); + } catch(e) { + fail("reset() failed, following Test " + this.testName + ", exception and reset fn follows", e, QUnit.reset); + } + + QUnit.testDone( { + name: this.testName, + failed: bad, + passed: this.assertions.length - bad, + total: this.assertions.length + } ); + }, + + queue: function() { + var test = this; + synchronize(function() { + test.init(); + }); + function run() { + // each of these can by async + synchronize(function() { + test.setup(); + }); + synchronize(function() { + test.run(); + }); + synchronize(function() { + test.teardown(); + }); + synchronize(function() { + test.finish(); + }); + } + // defer when previous test run passed, if storage is available + var bad = QUnit.config.reorder && defined.sessionStorage && +sessionStorage.getItem("qunit-" + this.module + "-" + this.testName); + if (bad) { + run(); + } else { + synchronize(run); + }; + } + +}; + +var QUnit = { + + // call on start of module test to prepend name to all tests + module: function(name, testEnvironment) { + config.currentModule = name; + config.currentModuleTestEnviroment = testEnvironment; + }, + + asyncTest: function(testName, expected, callback) { + if ( arguments.length === 2 ) { + callback = expected; + expected = 0; + } + + QUnit.test(testName, expected, callback, true); + }, + + test: function(testName, expected, callback, async) { + var name = '<span class="test-name">' + testName + '</span>', testEnvironmentArg; + + if ( arguments.length === 2 ) { + callback = expected; + expected = null; + } + // is 2nd argument a testEnvironment? + if ( expected && typeof expected === 'object') { + testEnvironmentArg = expected; + expected = null; + } + + if ( config.currentModule ) { + name = '<span class="module-name">' + config.currentModule + "</span>: " + name; + } + + if ( !validTest(config.currentModule + ": " + testName) ) { + return; + } + + var test = new Test(name, testName, expected, testEnvironmentArg, async, callback); + test.module = config.currentModule; + test.moduleTestEnvironment = config.currentModuleTestEnviroment; + test.queue(); + }, + + /** + * Specify the number of expected assertions to gurantee that failed test (no assertions are run at all) don't slip through. + */ + expect: function(asserts) { + config.current.expected = asserts; + }, + + /** + * Asserts true. + * @example ok( "asdfasdf".length > 5, "There must be at least 5 chars" ); + */ + ok: function(a, msg) { + a = !!a; + var details = { + result: a, + message: msg + }; + msg = escapeHtml(msg); + QUnit.log(details); + config.current.assertions.push({ + result: a, + message: msg + }); + }, + + /** + * Checks that the first two arguments are equal, with an optional message. + * Prints out both actual and expected values. + * + * Prefered to ok( actual == expected, message ) + * + * @example equal( format("Received {0} bytes.", 2), "Received 2 bytes." ); + * + * @param Object actual + * @param Object expected + * @param String message (optional) + */ + equal: function(actual, expected, message) { + QUnit.push(expected == actual, actual, expected, message); + }, + + notEqual: function(actual, expected, message) { + QUnit.push(expected != actual, actual, expected, message); + }, + + deepEqual: function(actual, expected, message) { + QUnit.push(QUnit.equiv(actual, expected), actual, expected, message); + }, + + notDeepEqual: function(actual, expected, message) { + QUnit.push(!QUnit.equiv(actual, expected), actual, expected, message); + }, + + strictEqual: function(actual, expected, message) { + QUnit.push(expected === actual, actual, expected, message); + }, + + notStrictEqual: function(actual, expected, message) { + QUnit.push(expected !== actual, actual, expected, message); + }, + + raises: function(block, expected, message) { + var actual, ok = false; + + if (typeof expected === 'string') { + message = expected; + expected = null; + } + + try { + block(); + } catch (e) { + actual = e; + } + + if (actual) { + // we don't want to validate thrown error + if (!expected) { + ok = true; + // expected is a regexp + } else if (QUnit.objectType(expected) === "regexp") { + ok = expected.test(actual); + // expected is a constructor + } else if (actual instanceof expected) { + ok = true; + // expected is a validation function which returns true is validation passed + } else if (expected.call({}, actual) === true) { + ok = true; + } + } + + QUnit.ok(ok, message); + }, + + start: function() { + config.semaphore--; + if (config.semaphore > 0) { + // don't start until equal number of stop-calls + return; + } + if (config.semaphore < 0) { + // ignore if start is called more often then stop + config.semaphore = 0; + } + // A slight delay, to avoid any current callbacks + if ( defined.setTimeout ) { + window.setTimeout(function() { + if (config.semaphore > 0) { + return; + } + if ( config.timeout ) { + clearTimeout(config.timeout); + } + + config.blocking = false; + process(); + }, 13); + } else { + config.blocking = false; + process(); + } + }, + + stop: function(timeout) { + config.semaphore++; + config.blocking = true; + + if ( timeout && defined.setTimeout ) { + clearTimeout(config.timeout); + config.timeout = window.setTimeout(function() { + QUnit.ok( false, "Test timed out" ); + QUnit.start(); + }, timeout); + } + } +}; + +// Backwards compatibility, deprecated +QUnit.equals = QUnit.equal; +QUnit.same = QUnit.deepEqual; + +// Maintain internal state +var config = { + // The queue of tests to run + queue: [], + + // block until document ready + blocking: true, + + // when enabled, show only failing tests + // gets persisted through sessionStorage and can be changed in UI via checkbox + hidepassed: false, + + // by default, run previously failed tests first + // very useful in combination with "Hide passed tests" checked + reorder: true, + + // by default, modify document.title when suite is done + altertitle: true, + + urlConfig: ['noglobals', 'notrycatch'] +}; + +// Load paramaters +(function() { + var location = window.location || { search: "", protocol: "file:" }, + params = location.search.slice( 1 ).split( "&" ), + length = params.length, + urlParams = {}, + current; + + if ( params[ 0 ] ) { + for ( var i = 0; i < length; i++ ) { + current = params[ i ].split( "=" ); + current[ 0 ] = decodeURIComponent( current[ 0 ] ); + // allow just a key to turn on a flag, e.g., test.html?noglobals + current[ 1 ] = current[ 1 ] ? decodeURIComponent( current[ 1 ] ) : true; + urlParams[ current[ 0 ] ] = current[ 1 ]; + } + } + + QUnit.urlParams = urlParams; + config.filter = urlParams.filter; + + // Figure out if we're running the tests from a server or not + QUnit.isLocal = !!(location.protocol === 'file:'); +})(); + +// Expose the API as global variables, unless an 'exports' +// object exists, in that case we assume we're in CommonJS +if ( typeof exports === "undefined" || typeof require === "undefined" ) { + extend(window, QUnit); + window.QUnit = QUnit; +} else { + extend(exports, QUnit); + exports.QUnit = QUnit; +} + +// define these after exposing globals to keep them in these QUnit namespace only +extend(QUnit, { + config: config, + + // Initialize the configuration options + init: function() { + extend(config, { + stats: { all: 0, bad: 0 }, + moduleStats: { all: 0, bad: 0 }, + started: +new Date, + updateRate: 1000, + blocking: false, + autostart: true, + autorun: false, + filter: "", + queue: [], + semaphore: 0 + }); + + var tests = id( "qunit-tests" ), + banner = id( "qunit-banner" ), + result = id( "qunit-testresult" ); + + if ( tests ) { + tests.innerHTML = ""; + } + + if ( banner ) { + banner.className = ""; + } + + if ( result ) { + result.parentNode.removeChild( result ); + } + + if ( tests ) { + result = document.createElement( "p" ); + result.id = "qunit-testresult"; + result.className = "result"; + tests.parentNode.insertBefore( result, tests ); + result.innerHTML = 'Running...<br/> '; + } + }, + + /** + * Resets the test setup. Useful for tests that modify the DOM. + * + * If jQuery is available, uses jQuery's html(), otherwise just innerHTML. + */ + reset: function() { + if ( window.jQuery ) { + jQuery( "#qunit-fixture" ).html( config.fixture ); + } else { + var main = id( 'qunit-fixture' ); + if ( main ) { + main.innerHTML = config.fixture; + } + } + }, + + /** + * Trigger an event on an element. + * + * @example triggerEvent( document.body, "click" ); + * + * @param DOMElement elem + * @param String type + */ + triggerEvent: function( elem, type, event ) { + if ( document.createEvent ) { + event = document.createEvent("MouseEvents"); + event.initMouseEvent(type, true, true, elem.ownerDocument.defaultView, + 0, 0, 0, 0, 0, false, false, false, false, 0, null); + elem.dispatchEvent( event ); + + } else if ( elem.fireEvent ) { + elem.fireEvent("on"+type); + } + }, + + // Safe object type checking + is: function( type, obj ) { + return QUnit.objectType( obj ) == type; + }, + + objectType: function( obj ) { + if (typeof obj === "undefined") { + return "undefined"; + + // consider: typeof null === object + } + if (obj === null) { + return "null"; + } + + var type = Object.prototype.toString.call( obj ) + .match(/^\[object\s(.*)\]$/)[1] || ''; + + switch (type) { + case 'Number': + if (isNaN(obj)) { + return "nan"; + } else { + return "number"; + } + case 'String': + case 'Boolean': + case 'Array': + case 'Date': + case 'RegExp': + case 'Function': + return type.toLowerCase(); + } + if (typeof obj === "object") { + return "object"; + } + return undefined; + }, + + push: function(result, actual, expected, message) { + var details = { + result: result, + message: message, + actual: actual, + expected: expected + }; + + message = escapeHtml(message) || (result ? "okay" : "failed"); + message = '<span class="test-message">' + message + "</span>"; + expected = escapeHtml(QUnit.jsDump.parse(expected)); + actual = escapeHtml(QUnit.jsDump.parse(actual)); + var output = message + '<table><tr class="test-expected"><th>Expected: </th><td><pre>' + expected + '</pre></td></tr>'; + if (actual != expected) { + output += '<tr class="test-actual"><th>Result: </th><td><pre>' + actual + '</pre></td></tr>'; + output += '<tr class="test-diff"><th>Diff: </th><td><pre>' + QUnit.diff(expected, actual) +'</pre></td></tr>'; + } + if (!result) { + var source = sourceFromStacktrace(); + if (source) { + details.source = source; + output += '<tr class="test-source"><th>Source: </th><td><pre>' + escapeHtml(source) + '</pre></td></tr>'; + } + } + output += "</table>"; + + QUnit.log(details); + + config.current.assertions.push({ + result: !!result, + message: output + }); + }, + + url: function( params ) { + params = extend( extend( {}, QUnit.urlParams ), params ); + var querystring = "?", + key; + for ( key in params ) { + querystring += encodeURIComponent( key ) + "=" + + encodeURIComponent( params[ key ] ) + "&"; + } + return window.location.pathname + querystring.slice( 0, -1 ); + }, + + extend: extend, + id: id, + addEvent: addEvent, + + // Logging callbacks; all receive a single argument with the listed properties + // run test/logs.html for any related changes + begin: function() {}, + // done: { failed, passed, total, runtime } + done: function() {}, + // log: { result, actual, expected, message } + log: function() {}, + // testStart: { name } + testStart: function() {}, + // testDone: { name, failed, passed, total } + testDone: function() {}, + // moduleStart: { name } + moduleStart: function() {}, + // moduleDone: { name, failed, passed, total } + moduleDone: function() {} +}); + +if ( typeof document === "undefined" || document.readyState === "complete" ) { + config.autorun = true; +} + +QUnit.load = function() { + QUnit.begin({}); + + // Initialize the config, saving the execution queue + var oldconfig = extend({}, config); + QUnit.init(); + extend(config, oldconfig); + + config.blocking = false; + + var urlConfigHtml = '', len = config.urlConfig.length; + for ( var i = 0, val; i < len, val = config.urlConfig[i]; i++ ) { + config[val] = QUnit.urlParams[val]; + urlConfigHtml += '<label><input name="' + val + '" type="checkbox"' + ( config[val] ? ' checked="checked"' : '' ) + '>' + val + '</label>'; + } + + var userAgent = id("qunit-userAgent"); + if ( userAgent ) { + userAgent.innerHTML = navigator.userAgent; + } + var banner = id("qunit-header"); + if ( banner ) { + banner.innerHTML = '<a href="' + QUnit.url({ filter: undefined }) + '"> ' + banner.innerHTML + '</a> ' + urlConfigHtml; + addEvent( banner, "change", function( event ) { + var params = {}; + params[ event.target.name ] = event.target.checked ? true : undefined; + window.location = QUnit.url( params ); + }); + } + + var toolbar = id("qunit-testrunner-toolbar"); + if ( toolbar ) { + var filter = document.createElement("input"); + filter.type = "checkbox"; + filter.id = "qunit-filter-pass"; + addEvent( filter, "click", function() { + var ol = document.getElementById("qunit-tests"); + if ( filter.checked ) { + ol.className = ol.className + " hidepass"; + } else { + var tmp = " " + ol.className.replace( /[\n\t\r]/g, " " ) + " "; + ol.className = tmp.replace(/ hidepass /, " "); + } + if ( defined.sessionStorage ) { + if (filter.checked) { + sessionStorage.setItem("qunit-filter-passed-tests", "true"); + } else { + sessionStorage.removeItem("qunit-filter-passed-tests"); + } + } + }); + if ( config.hidepassed || defined.sessionStorage && sessionStorage.getItem("qunit-filter-passed-tests") ) { + filter.checked = true; + var ol = document.getElementById("qunit-tests"); + ol.className = ol.className + " hidepass"; + } + toolbar.appendChild( filter ); + + var label = document.createElement("label"); + label.setAttribute("for", "qunit-filter-pass"); + label.innerHTML = "Hide passed tests"; + toolbar.appendChild( label ); + } + + var main = id('qunit-fixture'); + if ( main ) { + config.fixture = main.innerHTML; + } + + if (config.autostart) { + QUnit.start(); + } +}; + +addEvent(window, "load", QUnit.load); + +function done() { + config.autorun = true; + + // Log the last module results + if ( config.currentModule ) { + QUnit.moduleDone( { + name: config.currentModule, + failed: config.moduleStats.bad, + passed: config.moduleStats.all - config.moduleStats.bad, + total: config.moduleStats.all + } ); + } + + var banner = id("qunit-banner"), + tests = id("qunit-tests"), + runtime = +new Date - config.started, + passed = config.stats.all - config.stats.bad, + html = [ + 'Tests completed in ', + runtime, + ' milliseconds.<br/>', + '<span class="passed">', + passed, + '</span> tests of <span class="total">', + config.stats.all, + '</span> passed, <span class="failed">', + config.stats.bad, + '</span> failed.' + ].join(''); + + if ( banner ) { + banner.className = (config.stats.bad ? "qunit-fail" : "qunit-pass"); + } + + if ( tests ) { + id( "qunit-testresult" ).innerHTML = html; + } + + if ( config.altertitle && typeof document !== "undefined" && document.title ) { + // show ✖ for good, ✔ for bad suite result in title + // use escape sequences in case file gets loaded with non-utf-8-charset + document.title = [ + (config.stats.bad ? "\u2716" : "\u2714"), + document.title.replace(/^[\u2714\u2716] /i, "") + ].join(" "); + } + + QUnit.done( { + failed: config.stats.bad, + passed: passed, + total: config.stats.all, + runtime: runtime + } ); +} + +function validTest( name ) { + var filter = config.filter, + run = false; + + if ( !filter ) { + return true; + } + + var not = filter.charAt( 0 ) === "!"; + if ( not ) { + filter = filter.slice( 1 ); + } + + if ( name.indexOf( filter ) !== -1 ) { + return !not; + } + + if ( not ) { + run = true; + } + + return run; +} + +// so far supports only Firefox, Chrome and Opera (buggy) +// could be extended in the future to use something like https://github.com/csnover/TraceKit +function sourceFromStacktrace() { + try { + throw new Error(); + } catch ( e ) { + if (e.stacktrace) { + // Opera + return e.stacktrace.split("\n")[6]; + } else if (e.stack) { + // Firefox, Chrome + return e.stack.split("\n")[4]; + } else if (e.sourceURL) { + // Safari, PhantomJS + // TODO sourceURL points at the 'throw new Error' line above, useless + //return e.sourceURL + ":" + e.line; + } + } +} + +function escapeHtml(s) { + if (!s) { + return ""; + } + s = s + ""; + return s.replace(/[\&"<>\\]/g, function(s) { + switch(s) { + case "&": return "&"; + case "\\": return "\\\\"; + case '"': return '\"'; + case "<": return "<"; + case ">": return ">"; + default: return s; + } + }); +} + +function synchronize( callback ) { + config.queue.push( callback ); + + if ( config.autorun && !config.blocking ) { + process(); + } +} + +function process() { + var start = (new Date()).getTime(); + + while ( config.queue.length && !config.blocking ) { + if ( config.updateRate <= 0 || (((new Date()).getTime() - start) < config.updateRate) ) { + config.queue.shift()(); + } else { + window.setTimeout( process, 13 ); + break; + } + } + if (!config.blocking && !config.queue.length) { + done(); + } +} + +function saveGlobal() { + config.pollution = []; + + if ( config.noglobals ) { + for ( var key in window ) { + config.pollution.push( key ); + } + } +} + +function checkPollution( name ) { + var old = config.pollution; + saveGlobal(); + + var newGlobals = diff( config.pollution, old ); + if ( newGlobals.length > 0 ) { + ok( false, "Introduced global variable(s): " + newGlobals.join(", ") ); + } + + var deletedGlobals = diff( old, config.pollution ); + if ( deletedGlobals.length > 0 ) { + ok( false, "Deleted global variable(s): " + deletedGlobals.join(", ") ); + } +} + +// returns a new Array with the elements that are in a but not in b +function diff( a, b ) { + var result = a.slice(); + for ( var i = 0; i < result.length; i++ ) { + for ( var j = 0; j < b.length; j++ ) { + if ( result[i] === b[j] ) { + result.splice(i, 1); + i--; + break; + } + } + } + return result; +} + +function fail(message, exception, callback) { + if ( typeof console !== "undefined" && console.error && console.warn ) { + console.error(message); + console.error(exception); + console.warn(callback.toString()); + + } else if ( window.opera && opera.postError ) { + opera.postError(message, exception, callback.toString); + } +} + +function extend(a, b) { + for ( var prop in b ) { + if ( b[prop] === undefined ) { + delete a[prop]; + } else { + a[prop] = b[prop]; + } + } + + return a; +} + +function addEvent(elem, type, fn) { + if ( elem.addEventListener ) { + elem.addEventListener( type, fn, false ); + } else if ( elem.attachEvent ) { + elem.attachEvent( "on" + type, fn ); + } else { + fn(); + } +} + +function id(name) { + return !!(typeof document !== "undefined" && document && document.getElementById) && + document.getElementById( name ); +} + +// Test for equality any JavaScript type. +// Discussions and reference: http://philrathe.com/articles/equiv +// Test suites: http://philrathe.com/tests/equiv +// Author: Philippe Rathé <prathe@gmail.com> +QUnit.equiv = function () { + + var innerEquiv; // the real equiv function + var callers = []; // stack to decide between skip/abort functions + var parents = []; // stack to avoiding loops from circular referencing + + // Call the o related callback with the given arguments. + function bindCallbacks(o, callbacks, args) { + var prop = QUnit.objectType(o); + if (prop) { + if (QUnit.objectType(callbacks[prop]) === "function") { + return callbacks[prop].apply(callbacks, args); + } else { + return callbacks[prop]; // or undefined + } + } + } + + var callbacks = function () { + + // for string, boolean, number and null + function useStrictEquality(b, a) { + if (b instanceof a.constructor || a instanceof b.constructor) { + // to catch short annotaion VS 'new' annotation of a + // declaration + // e.g. var i = 1; + // var j = new Number(1); + return a == b; + } else { + return a === b; + } + } + + return { + "string" : useStrictEquality, + "boolean" : useStrictEquality, + "number" : useStrictEquality, + "null" : useStrictEquality, + "undefined" : useStrictEquality, + + "nan" : function(b) { + return isNaN(b); + }, + + "date" : function(b, a) { + return QUnit.objectType(b) === "date" + && a.valueOf() === b.valueOf(); + }, + + "regexp" : function(b, a) { + return QUnit.objectType(b) === "regexp" + && a.source === b.source && // the regex itself + a.global === b.global && // and its modifers + // (gmi) ... + a.ignoreCase === b.ignoreCase + && a.multiline === b.multiline; + }, + + // - skip when the property is a method of an instance (OOP) + // - abort otherwise, + // initial === would have catch identical references anyway + "function" : function() { + var caller = callers[callers.length - 1]; + return caller !== Object && typeof caller !== "undefined"; + }, + + "array" : function(b, a) { + var i, j, loop; + var len; + + // b could be an object literal here + if (!(QUnit.objectType(b) === "array")) { + return false; + } + + len = a.length; + if (len !== b.length) { // safe and faster + return false; + } + + // track reference to avoid circular references + parents.push(a); + for (i = 0; i < len; i++) { + loop = false; + for (j = 0; j < parents.length; j++) { + if (parents[j] === a[i]) { + loop = true;// dont rewalk array + } + } + if (!loop && !innerEquiv(a[i], b[i])) { + parents.pop(); + return false; + } + } + parents.pop(); + return true; + }, + + "object" : function(b, a) { + var i, j, loop; + var eq = true; // unless we can proove it + var aProperties = [], bProperties = []; // collection of + // strings + + // comparing constructors is more strict than using + // instanceof + if (a.constructor !== b.constructor) { + return false; + } + + // stack constructor before traversing properties + callers.push(a.constructor); + // track reference to avoid circular references + parents.push(a); + + for (i in a) { // be strict: don't ensures hasOwnProperty + // and go deep + loop = false; + for (j = 0; j < parents.length; j++) { + if (parents[j] === a[i]) + loop = true; // don't go down the same path + // twice + } + aProperties.push(i); // collect a's properties + + if (!loop && !innerEquiv(a[i], b[i])) { + eq = false; + break; + } + } + + callers.pop(); // unstack, we are done + parents.pop(); + + for (i in b) { + bProperties.push(i); // collect b's properties + } + + // Ensures identical properties name + return eq + && innerEquiv(aProperties.sort(), bProperties + .sort()); + } + }; + }(); + + innerEquiv = function() { // can take multiple arguments + var args = Array.prototype.slice.apply(arguments); + if (args.length < 2) { + return true; // end transition + } + + return (function(a, b) { + if (a === b) { + return true; // catch the most you can + } else if (a === null || b === null || typeof a === "undefined" + || typeof b === "undefined" + || QUnit.objectType(a) !== QUnit.objectType(b)) { + return false; // don't lose time with error prone cases + } else { + return bindCallbacks(a, callbacks, [ b, a ]); + } + + // apply transition with (1..n) arguments + })(args[0], args[1]) + && arguments.callee.apply(this, args.splice(1, + args.length - 1)); + }; + + return innerEquiv; + +}(); + +/** + * jsDump Copyright (c) 2008 Ariel Flesler - aflesler(at)gmail(dot)com | + * http://flesler.blogspot.com Licensed under BSD + * (http://www.opensource.org/licenses/bsd-license.php) Date: 5/15/2008 + * + * @projectDescription Advanced and extensible data dumping for Javascript. + * @version 1.0.0 + * @author Ariel Flesler + * @link {http://flesler.blogspot.com/2008/05/jsdump-pretty-dump-of-any-javascript.html} + */ +QUnit.jsDump = (function() { + function quote( str ) { + return '"' + str.toString().replace(/"/g, '\\"') + '"'; + }; + function literal( o ) { + return o + ''; + }; + function join( pre, arr, post ) { + var s = jsDump.separator(), + base = jsDump.indent(), + inner = jsDump.indent(1); + if ( arr.join ) + arr = arr.join( ',' + s + inner ); + if ( !arr ) + return pre + post; + return [ pre, inner + arr, base + post ].join(s); + }; + function array( arr, stack ) { + var i = arr.length, ret = Array(i); + this.up(); + while ( i-- ) + ret[i] = this.parse( arr[i] , undefined , stack); + this.down(); + return join( '[', ret, ']' ); + }; + + var reName = /^function (\w+)/; + + var jsDump = { + parse:function( obj, type, stack ) { //type is used mostly internally, you can fix a (custom)type in advance + stack = stack || [ ]; + var parser = this.parsers[ type || this.typeOf(obj) ]; + type = typeof parser; + var inStack = inArray(obj, stack); + if (inStack != -1) { + return 'recursion('+(inStack - stack.length)+')'; + } + //else + if (type == 'function') { + stack.push(obj); + var res = parser.call( this, obj, stack ); + stack.pop(); + return res; + } + // else + return (type == 'string') ? parser : this.parsers.error; + }, + typeOf:function( obj ) { + var type; + if ( obj === null ) { + type = "null"; + } else if (typeof obj === "undefined") { + type = "undefined"; + } else if (QUnit.is("RegExp", obj)) { + type = "regexp"; + } else if (QUnit.is("Date", obj)) { + type = "date"; + } else if (QUnit.is("Function", obj)) { + type = "function"; + } else if (typeof obj.setInterval !== undefined && typeof obj.document !== "undefined" && typeof obj.nodeType === "undefined") { + type = "window"; + } else if (obj.nodeType === 9) { + type = "document"; + } else if (obj.nodeType) { + type = "node"; + } else if (typeof obj === "object" && typeof obj.length === "number" && obj.length >= 0) { + type = "array"; + } else { + type = typeof obj; + } + return type; + }, + separator:function() { + return this.multiline ? this.HTML ? '<br />' : '\n' : this.HTML ? ' ' : ' '; + }, + indent:function( extra ) {// extra can be a number, shortcut for increasing-calling-decreasing + if ( !this.multiline ) + return ''; + var chr = this.indentChar; + if ( this.HTML ) + chr = chr.replace(/\t/g,' ').replace(/ /g,' '); + return Array( this._depth_ + (extra||0) ).join(chr); + }, + up:function( a ) { + this._depth_ += a || 1; + }, + down:function( a ) { + this._depth_ -= a || 1; + }, + setParser:function( name, parser ) { + this.parsers[name] = parser; + }, + // The next 3 are exposed so you can use them + quote:quote, + literal:literal, + join:join, + // + _depth_: 1, + // This is the list of parsers, to modify them, use jsDump.setParser + parsers:{ + window: '[Window]', + document: '[Document]', + error:'[ERROR]', //when no parser is found, shouldn't happen + unknown: '[Unknown]', + 'null':'null', + 'undefined':'undefined', + 'function':function( fn ) { + var ret = 'function', + name = 'name' in fn ? fn.name : (reName.exec(fn)||[])[1];//functions never have name in IE + if ( name ) + ret += ' ' + name; + ret += '('; + + ret = [ ret, QUnit.jsDump.parse( fn, 'functionArgs' ), '){'].join(''); + return join( ret, QUnit.jsDump.parse(fn,'functionCode'), '}' ); + }, + array: array, + nodelist: array, + arguments: array, + object:function( map, stack ) { + var ret = [ ]; + QUnit.jsDump.up(); + for ( var key in map ) { + var val = map[key]; + ret.push( QUnit.jsDump.parse(key,'key') + ': ' + QUnit.jsDump.parse(val, undefined, stack)); + } + QUnit.jsDump.down(); + return join( '{', ret, '}' ); + }, + node:function( node ) { + var open = QUnit.jsDump.HTML ? '<' : '<', + close = QUnit.jsDump.HTML ? '>' : '>'; + + var tag = node.nodeName.toLowerCase(), + ret = open + tag; + + for ( var a in QUnit.jsDump.DOMAttrs ) { + var val = node[QUnit.jsDump.DOMAttrs[a]]; + if ( val ) + ret += ' ' + a + '=' + QUnit.jsDump.parse( val, 'attribute' ); + } + return ret + close + open + '/' + tag + close; + }, + functionArgs:function( fn ) {//function calls it internally, it's the arguments part of the function + var l = fn.length; + if ( !l ) return ''; + + var args = Array(l); + while ( l-- ) + args[l] = String.fromCharCode(97+l);//97 is 'a' + return ' ' + args.join(', ') + ' '; + }, + key:quote, //object calls it internally, the key part of an item in a map + functionCode:'[code]', //function calls it internally, it's the content of the function + attribute:quote, //node calls it internally, it's an html attribute value + string:quote, + date:quote, + regexp:literal, //regex + number:literal, + 'boolean':literal + }, + DOMAttrs:{//attributes to dump from nodes, name=>realName + id:'id', + name:'name', + 'class':'className' + }, + HTML:false,//if true, entities are escaped ( <, >, \t, space and \n ) + indentChar:' ',//indentation unit + multiline:true //if true, items in a collection, are separated by a \n, else just a space. + }; + + return jsDump; +})(); + +// from Sizzle.js +function getText( elems ) { + var ret = "", elem; + + for ( var i = 0; elems[i]; i++ ) { + elem = elems[i]; + + // Get the text from text nodes and CDATA nodes + if ( elem.nodeType === 3 || elem.nodeType === 4 ) { + ret += elem.nodeValue; + + // Traverse everything else, except comment nodes + } else if ( elem.nodeType !== 8 ) { + ret += getText( elem.childNodes ); + } + } + + return ret; +}; + +//from jquery.js +function inArray( elem, array ) { + if ( array.indexOf ) { + return array.indexOf( elem ); + } + + for ( var i = 0, length = array.length; i < length; i++ ) { + if ( array[ i ] === elem ) { + return i; + } + } + + return -1; +} + +/* + * Javascript Diff Algorithm + * By John Resig (http://ejohn.org/) + * Modified by Chu Alan "sprite" + * + * Released under the MIT license. + * + * More Info: + * http://ejohn.org/projects/javascript-diff-algorithm/ + * + * Usage: QUnit.diff(expected, actual) + * + * QUnit.diff("the quick brown fox jumped over", "the quick fox jumps over") == "the quick <del>brown </del> fox <del>jumped </del><ins>jumps </ins> over" + */ +QUnit.diff = (function() { + function diff(o, n) { + var ns = {}; + var os = {}; + + for (var i = 0; i < n.length; i++) { + if (ns[n[i]] == null) + ns[n[i]] = { + rows: [], + o: null + }; + ns[n[i]].rows.push(i); + } + + for (var i = 0; i < o.length; i++) { + if (os[o[i]] == null) + os[o[i]] = { + rows: [], + n: null + }; + os[o[i]].rows.push(i); + } + + for (var i in ns) { + if (ns[i].rows.length == 1 && typeof(os[i]) != "undefined" && os[i].rows.length == 1) { + n[ns[i].rows[0]] = { + text: n[ns[i].rows[0]], + row: os[i].rows[0] + }; + o[os[i].rows[0]] = { + text: o[os[i].rows[0]], + row: ns[i].rows[0] + }; + } + } + + for (var i = 0; i < n.length - 1; i++) { + if (n[i].text != null && n[i + 1].text == null && n[i].row + 1 < o.length && o[n[i].row + 1].text == null && + n[i + 1] == o[n[i].row + 1]) { + n[i + 1] = { + text: n[i + 1], + row: n[i].row + 1 + }; + o[n[i].row + 1] = { + text: o[n[i].row + 1], + row: i + 1 + }; + } + } + + for (var i = n.length - 1; i > 0; i--) { + if (n[i].text != null && n[i - 1].text == null && n[i].row > 0 && o[n[i].row - 1].text == null && + n[i - 1] == o[n[i].row - 1]) { + n[i - 1] = { + text: n[i - 1], + row: n[i].row - 1 + }; + o[n[i].row - 1] = { + text: o[n[i].row - 1], + row: i - 1 + }; + } + } + + return { + o: o, + n: n + }; + } + + return function(o, n) { + o = o.replace(/\s+$/, ''); + n = n.replace(/\s+$/, ''); + var out = diff(o == "" ? [] : o.split(/\s+/), n == "" ? [] : n.split(/\s+/)); + + var str = ""; + + var oSpace = o.match(/\s+/g); + if (oSpace == null) { + oSpace = [" "]; + } + else { + oSpace.push(" "); + } + var nSpace = n.match(/\s+/g); + if (nSpace == null) { + nSpace = [" "]; + } + else { + nSpace.push(" "); + } + + if (out.n.length == 0) { + for (var i = 0; i < out.o.length; i++) { + str += '<del>' + out.o[i] + oSpace[i] + "</del>"; + } + } + else { + if (out.n[0].text == null) { + for (n = 0; n < out.o.length && out.o[n].text == null; n++) { + str += '<del>' + out.o[n] + oSpace[n] + "</del>"; + } + } + + for (var i = 0; i < out.n.length; i++) { + if (out.n[i].text == null) { + str += '<ins>' + out.n[i] + nSpace[i] + "</ins>"; + } + else { + var pre = ""; + + for (n = out.n[i].row + 1; n < out.o.length && out.o[n].text == null; n++) { + pre += '<del>' + out.o[n] + oSpace[n] + "</del>"; + } + str += " " + out.n[i].text + nSpace[i] + pre; + } + } + } + + return str; + }; +})(); + +})(this);
\ No newline at end of file diff --git a/tbc/static/uploads/Hardik/C++/Chapter1.ipynb b/tbc/static/uploads/Hardik/C++/Chapter1.ipynb new file mode 100644 index 0000000..68dac58 --- /dev/null +++ b/tbc/static/uploads/Hardik/C++/Chapter1.ipynb @@ -0,0 +1,158 @@ +{ + "metadata": { + "name": "Chapter_1" + }, + "nbformat": 2, + "worksheets": [ + { + "cells": [ + { + "cell_type": "markdown", + "source": [ + "<h1>Chapter 1: Semiconductor Basics<h1>" + ] + }, + { + "cell_type": "markdown", + "source": [ + "<h3>Example 1.1(a), Page Number:29<h3>" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "'''Voltages of different models'''", + "", + "# variable declaration", + "V_bias=10.0; #bias voltage in volt", + "R_limit=1000; #limiting resistance in ohm", + "r_d =10.0; #r_d value", + "", + "#calculation", + "#IDEAL MODEL", + "print \"IDEAL MODEL\"", + "V_f=0; #voltage in volt", + "I_f=V_bias/R_limit; #foward current", + "V_R_limit=I_f*R_limit; #limiting voltage", + "print \"forward voltage = %.2f volts\" %V_f", + "print \"forward current = %.2f amperes\" %I_f", + "print \"voltage across limiting resistor = %.2f volts\" %V_R_limit", + "", + "#PRACTICAL MODEL", + "print \"\\nPRACTICAL MODEL\"", + "V_f=0.7; #voltage in volt", + "I_f=(V_bias-V_f)/R_limit; #foward current", + "V_R_limit=I_f*R_limit; #limiting voltage", + "print \"forward voltage = %.2f volts\" %V_f", + "print \"forward current = %.3f amperes\" %I_f", + "print \"voltage across limiting resistor = %.2f volts\" %V_R_limit", + "", + "#COMPLETE MODEL", + "print \"\\nCOMPLETE MODEL\"", + "I_f=(V_bias-0.7)/(R_limit+r_d); #foward current", + "V_f=0.7+I_f*r_d; #forward voltage", + "V_R_limit=I_f*R_limit; #limiting voltage", + "print \"forward voltage = %.3f volts\" %V_f", + "print \"forward current = %.3f amperes\" %I_f", + "print \"voltage across limiting resistor = %.2f volts\" %V_R_limit" + ], + "language": "python", + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "IDEAL MODEL", + "forward voltage = 0.00 volts", + "forward current = 0.01 amperes", + "voltage across limiting resistor = 10.00 volts", + "", + "PRACTICAL MODEL", + "forward voltage = 0.70 volts", + "forward current = 0.009 amperes", + "voltage across limiting resistor = 9.30 volts", + "", + "COMPLETE MODEL", + "forward voltage = 0.792 volts", + "forward current = 0.009 amperes", + "voltage across limiting resistor = 9.21 volts" + ] + } + ], + "prompt_number": 1 + }, + { + "cell_type": "markdown", + "source": [ + "<h3>Example 1.1(b), Page Number:29<h3>" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "'''voltages of different models'''", + "", + "# variable declaration", + "V_bias=5; #bias voltage in volt", + "I_R=1*10**-6; #current", + "R_limit=1000 #in Ohm", + "", + "#calculation", + "#IDEAL MODEL", + "print \"IDEAL MODEL\"", + "I_r=0.0; #current in ampere", + "V_R=V_bias; #voltages are equal", + "V_R_limit=I_r*R_limit; #limiting voltage", + "print \"Reverse voltage across diode = %.2f volts\" %V_R", + "print \"Reverse current through diode= %.2f amperes\" %I_r", + "print \"voltage across limiting resistor = %.2f volts\" %V_R_limit", + "", + "#PRACTICAL MODEL", + "print \"\\nPRACTICAL MODEL\"", + "I_r=0.0; #current in ampere", + "V_R=V_bias; #voltages are equal", + "V_R_limit=I_r*R_limit; #limiting voltage", + "print \"Reverse voltage across diode= %.2f volts\" %V_R", + "print \"Reverse current through diode = %.2f amperes\" %I_r", + "print \"voltage across limiting resistor = %.2f volts\" %V_R_limit", + "", + "#COMPLETE MODEL", + "print \"\\nCOMPLETE MODEL\"", + "I_r=I_R; #current in ampere", + "V_R_limit=I_r*R_limit; #limiting voltage", + "V_R=V_bias-V_R_limit; #voltage in volt", + "print \"Reverse voltage across diode = %.3f volts\" %V_R", + "print \"Reverse current through diode = %d micro Amp\" %(I_r*10**6)", + "print \"voltage across limiting resistor = %d mV\" %(V_R_limit*1000)" + ], + "language": "python", + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "IDEAL MODEL", + "Reverse voltage across diode = 5.00 volts", + "Reverse current through diode= 0.00 amperes", + "voltage across limiting resistor = 0.00 volts", + "", + "PRACTICAL MODEL", + "Reverse voltage across diode= 5.00 volts", + "Reverse current through diode = 0.00 amperes", + "voltage across limiting resistor = 0.00 volts", + "", + "COMPLETE MODEL", + "Reverse voltage across diode = 4.999 volts", + "Reverse current through diode = 1 micro Amp", + "voltage across limiting resistor = 1 mV" + ] + } + ], + "prompt_number": 2 + } + ] + } + ] +}
\ No newline at end of file diff --git a/tbc/static/uploads/Hardik/C++/Chapter2.ipynb b/tbc/static/uploads/Hardik/C++/Chapter2.ipynb new file mode 100644 index 0000000..107fc33 --- /dev/null +++ b/tbc/static/uploads/Hardik/C++/Chapter2.ipynb @@ -0,0 +1,608 @@ +{ + "metadata": { + "name": "Chapter_2" + }, + "nbformat": 2, + "worksheets": [ + { + "cells": [ + { + "cell_type": "markdown", + "source": [ + "<h1>Chapter 2: Diode Application<h1>" + ] + }, + { + "cell_type": "markdown", + "source": [ + "<h3>Example 2.1, Page Number: 46<h3>" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "%pylab inline" + ], + "language": "python", + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "", + "Welcome to pylab, a matplotlib-based Python environment [backend: module://IPython.zmq.pylab.backend_inline].", + "For more information, type 'help(pylab)'." + ] + } + ], + "prompt_number": 1 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "''' Average value of half wave rectifier'''", + "", + "import math", + "", + "# variable declaration", + "V_p=50; #Peak value is 50V", + "", + "#calculation", + "V_avg=V_p/math.pi;", + "", + "#result", + "print \"average value of half wave rectifier = %.2f volts\" %V_avg" + ], + "language": "python", + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "average value of half wave rectifier = 15.92 volts" + ] + } + ], + "prompt_number": 2 + }, + { + "cell_type": "markdown", + "source": [ + "<h3>Example 2.2(a), Page Number: 46<h3>" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "''' half wave rectifier output'''", + "", + "import math", + "", + "# variable declaration", + "#let V_in=5*sin(2*%pi*f.*t) be input wave ,hence frequency=1Hz", + "f=1; #frequency", + "V_p_in=5; #peak input", + "", + "#calculation", + "V_pout=V_p_in-0.7; #output voltage", + "t_d=(math.asin(0.7/V_p_in))/(2*math.pi*f);", + "", + "#result", + "print \"half wave rectifier output = %.2f volts\" %V_pout;" + ], + "language": "python", + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "half wave rectifier output = 4.30 volts" + ] + } + ], + "prompt_number": 3 + }, + { + "cell_type": "markdown", + "source": [ + "<h3>Example 2.2(b), Page Number: 46<h3>" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "''' half wave rectifier output'''", + "", + "import math", + "", + "# variable declaration", + "#let V_in=100*sin(2*%pi*f.*t) be input wave ,hence frequency=1Hz", + "f=1; #frequency", + "T=1/f; #time period", + "V_p_in=100; #peak input voltage", + "", + "#calculation", + "V_pout=(V_p_in-0.7); #peak output ", + "t_d=(math.asin(0.7/V_p_in))/(2*math.pi*f) ", + "", + "#result", + "print \"output of half wave rectifier = %.2f volts\" %V_pout" + ], + "language": "python", + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "output of half wave rectifier = 99.30 volts" + ] + } + ], + "prompt_number": 4 + }, + { + "cell_type": "markdown", + "source": [ + "<h3>Example 2.3, Page Number: 48<h3>" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "''' Average value of half wave rectifier'''", + "", + "import math", + "", + "# variable declaration", + "V_p_in=156; #Peak input voltage", + "V_p_pri=156; #Peak voltage of primary of transformer", + "n=0.5; #Turn ratio is 2:1", + "", + "#calculation", + "V_p_sec=n*V_p_pri;", + "V_p_out=(V_p_sec-0.7); #Peak output voltage", + "", + "#result", + "print \"peak output voltage of half wave rectifier = %.1f volts\" %V_p_out" + ], + "language": "python", + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "peak output voltage of half wave rectifier = 77.3 volts" + ] + } + ], + "prompt_number": 5 + }, + { + "cell_type": "markdown", + "source": [ + "<h3>Example 2.4, Page Number: 49<h3>" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "''' Average value of full wave rectifier'''", + "", + "import math", + "", + "# variable declaration", + "V_p=15; #Peak voltage in volt", + "", + "#calculation", + "V_avg=(2*V_p)/math.pi;", + "", + "#result", + "print \"Average value of output of full wave rectifier = %.2f volts\" %V_avg" + ], + "language": "python", + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "Average value of output of full wave rectifier = 9.55 volts" + ] + } + ], + "prompt_number": 6 + }, + { + "cell_type": "markdown", + "source": [ + "<h3>Example 2.5, Page Number: 52<h3>" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "'''PIV full wave'''", + "", + "V_p_pri=100.0; #Peak voltage across primary winding", + "n=1.0/2; #tun ratio is 2:1", + "V_p_sec=n*V_p_pri;", + "V_sec=V_p_sec/2; #voltage across each secondary is half the total voltage", + "V_pout=V_sec-0.7;", + "", + "print('full wave rectifier output voltage = %f V'%V_pout)", + "PIV=2*V_pout+0.7;", + "print('PIV = %fV'%PIV)" + ], + "language": "python", + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "full wave rectifier output voltage = 24.300000 V", + "PIV = 49.300000V" + ] + } + ], + "prompt_number": 7 + }, + { + "cell_type": "markdown", + "source": [ + "<h3>Example 2.6, Page Number: 54<h3>" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "''' Peak voltage of diode'''", + "", + "import math", + "", + "# variable declaration", + "V_rms=12.0; #rms secondary voltage", + "", + "#calculation", + "V_p_sec=math.sqrt(2)*V_rms; #peak secondary voltage", + "V_th=0.7; #knee voltage of diode", + "V_p_out=V_p_sec-2*V_th; #in one cycle, 2 diodes conduct", + "PIV=V_p_out+V_th; #applying KVL", + "", + "#result", + "print \"Peak output voltage = %.2f volt\" %V_p_out", + "print \"PIV across each diode = %.2f volt\" %PIV" + ], + "language": "python", + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "Peak output voltage = 15.57 volt", + "PIV across each diode = 16.27 volt" + ] + } + ], + "prompt_number": 8 + }, + { + "cell_type": "markdown", + "source": [ + "<h3>Example 2.7, Page Number: 58<h3>" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "''' Ripple Factor'''", + "", + "import math", + "", + "# variable declaration", + "R_l=2200; #load resistance in Ohm", + "C=50*10**-6; #capacitance in Farad", + "V_rms=115; #rms of primary", + "", + "#calculation", + "V_p_pri=math.sqrt(2)*V_rms; #peak voltage across primary", + "n=0.1; #turn ratio is 10:1", + "V_p_sec=n*V_p_pri; #primary voltage across secondary", + "V_p_rect=V_p_sec-1.4 #unfiltered peak rectified voltage", + "#we subtract 1.4 because in each cycle 2 diodes conduct & 2 do not", + "f=120; #frequency of full wave rectified voltage", + "V_r_pp=(1/(f*R_l*C))*V_p_rect; #peak to peak ripple voltage", + "V_DC=(1-(1/(2*f*R_l*C)))*V_p_rect;", + "r=V_r_pp/V_DC;", + "", + "#result", + "print \"Ripple factor = %.3f \" %r" + ], + "language": "python", + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "Ripple factor = 0.079 " + ] + } + ], + "prompt_number": 9 + }, + { + "cell_type": "markdown", + "source": [ + "<h3>Example 2.8, Page Number: 62<h3>" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "''' Min & Max voltage'''", + "", + "import math", + "", + "# variable declaration", + "V_REF=1.25; #in volts", + "V_R1=V_REF; #voltage in volt", + "R1=220.0; #in ohms", + "I_ADJ=50*10**-6 #in amperes", + "", + "#calculation", + "# MAX VALUE OF R2=5000 Ohms", + "R2_min=0.0; #min resistance", + "V_out_min=V_REF*(1+(R2_min/R1))+I_ADJ*R2_min;", + "R2_max=5000.0; #max value of resistance", + "V_out_max=V_REF*(1+(R2_max/R1))+I_ADJ*R2_max;", + "", + "#result", + "print \"minimum output voltage = %.2f volt\" %V_out_min", + "print \"maximum output voltage = %.2f volt\" %V_out_max" + ], + "language": "python", + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "minimum output voltage = 1.25 volt", + "maximum output voltage = 29.91 volt" + ] + } + ], + "prompt_number": 10 + }, + { + "cell_type": "markdown", + "source": [ + "<h3>Example 2.9,Page Number: 64<h3>" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "'''Load regulation percentage'''", + "", + "V_NL=5.18 #No load output voltage", + "V_FL=5.15 #Full load output voltage", + "load_reg=((V_NL-V_FL)/V_FL)*100 #In percentage", + "print('load regulation percent = %.2f%% '%load_reg)" + ], + "language": "python", + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "load regulation percent = 0.58% " + ] + } + ], + "prompt_number": 11 + }, + { + "cell_type": "markdown", + "source": [ + "<h3>Example 2.10, Page Number: 66<h3>" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "'''Negative diode limiter'''", + "", + "import pylab as py", + "import numpy as np", + "", + "#let input wave be V_in=V_p_in*sin(2*%pi*f*t) ", + "f=1.0; #Frequency is 1Hz", + "T=1/f;", + "R_1=100.0; #Resistances in ohms", + "R_L=1000.0; #Load", + "V_p_in=10.0; #Peak input voltage", + "V_th=0.7; #knee voltage of diode", + "", + "V_p_out=V_p_in*(R_L/(R_L+R_1)); #peak output voltage", + "print('peak output voltage = %.2f V'%V_p_out)", + "", + "t = np.arange(0, 3.5 , 0.0005)", + "z=V_p_in*np.sin(2*np.pi*f*t)*(R_L/(R_L+R_1))", + "", + "subplot(211)", + "plot(t,z)", + "ylim(-9.09,9.09)", + "title('Input Voltage Waveform')", + "", + "subplot(212)", + "plot(t,z)", + "ylim(-0.07,9.09)", + "title('Output Voltage Waveform')" + ], + "language": "python", + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "peak output voltage = 9.09 V" + ] + }, + { + "output_type": "pyout", + "prompt_number": 12, + "text": [ + "<matplotlib.text.Text at 0xa3bf44c>" + ] + }, + { + "output_type": "display_data", + "png": "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\n" + } + ], + "prompt_number": 12 + }, + { + "cell_type": "markdown", + "source": [ + "<h3>Example 2.11, Page Number: 67<h3>" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "'''Positive and negative Diode limiter'''", + "", + "#from pylab import figure, show", + "#from numpy import arange, sin, pi,bool", + "#import numpy as np", + "import pylab as py", + "import numpy as np", + "#let input wave be V_in=V_p_in*sin(2*%pi*f*t) ", + "f=1.0; #Frequency is 1Hz", + "T=1/f;", + "V_p_in=10; #Peak input voltage", + "V_th=0.7; #knee voltage of diode", + "print('max output voltage is 5.7V')", + "print('min output voltage is -5.7V')", + "", + "###############GRAPH Plotting#################################", + "t = arange(0.0,4.5,0.0005)", + "V_in=V_p_in*sin(2*pi*f*t);", + "", + "Vout=V_in;", + "#fig = figure(2)", + "subplot(211)", + "plot(t,V_in)", + "#ax2.grid(True)", + "ylim( (-10,10) )", + "title('Input to the +ve and -ve diode limiter ')", + "subplot(212)", + "plot(t,V_in)", + "#ax1.grid(True)", + "ylim( (-5.7,5.7) )", + "title('Output of +ve and -ve diode limiter')", + " " + ], + "language": "python", + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "max output voltage is 5.7V", + "min output voltage is -5.7V" + ] + }, + { + "output_type": "pyout", + "prompt_number": 13, + "text": [ + "<matplotlib.text.Text at 0xa6c976c>" + ] + }, + { + "output_type": "display_data", + "png": "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\nx/PeAAAAAElFTkSuQmCC\n" + } + ], + "prompt_number": 13 + }, + { + "cell_type": "markdown", + "source": [ + "<h3>Example 2.12, Page Number: 76<h3>" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "'''Positive diode limiter'''", + "", + "#variable declaration", + "V_p_in=18.0; #peak input voltage is 18V", + "V_supply=12.0;", + "R2=100.0;", + "R3=220.0; #resistances in ohms", + "#calculation", + "V_bias=V_supply*(R3/(R2+R3));", + "", + "#result", + "print('diode limiting the voltage at this voltage =%fV'%V_bias)" + ], + "language": "python", + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "diode limiting the voltage at this voltage =8.250000V" + ] + } + ], + "prompt_number": 14 + }, + { + "cell_type": "markdown", + "source": [ + "<h3>Example 2.13, Page Number: 78<h3>" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "'''Negative Clamping circuit'''", + "", + "V_p_in=24.0;", + "V_DC=-(V_p_in-0.7); #DC level added to output", + "print('V_DC = %.1fV'%V_DC)" + ], + "language": "python", + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "V_DC = -23.3V" + ] + } + ], + "prompt_number": 15 + } + ] + } + ] +}
\ No newline at end of file diff --git a/tbc/static/uploads/Hardik/C++/Chapter3.ipynb b/tbc/static/uploads/Hardik/C++/Chapter3.ipynb new file mode 100644 index 0000000..41e63a8 --- /dev/null +++ b/tbc/static/uploads/Hardik/C++/Chapter3.ipynb @@ -0,0 +1,377 @@ +{ + "metadata": { + "name": "Chapter_3" + }, + "nbformat": 2, + "worksheets": [ + { + "cells": [ + { + "cell_type": "markdown", + "source": [ + "<h1>Chapter 3: Special-purpose Diodes<h1>" + ] + }, + { + "cell_type": "markdown", + "source": [ + "<h3>Example 3.1, Page Number:88<h3>" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "%pylab inline" + ], + "language": "python", + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "", + "Welcome to pylab, a matplotlib-based Python environment [backend: module://IPython.zmq.pylab.backend_inline].", + "For more information, type 'help(pylab)'." + ] + } + ], + "prompt_number": 1 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "''' To find Zener Impedence'''", + "", + "# variable declaration", + "delVZ=50*10**-3; #voltage in volts, from graph", + "delIZ=5*10**-3; #current in amperes, from rgraph", + "", + "#calculation", + "ZZ=delVZ/delIZ; #zener impedence", + "", + "# result", + "print \"zener impedance = %d ohm \" %ZZ" + ], + "language": "python", + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "zener impedance = 10 ohm " + ] + } + ], + "prompt_number": 2 + }, + { + "cell_type": "markdown", + "source": [ + "<h3>Example 3.2, Page Number:89<h3>" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "''' Voltage accross zener terminals'''", + "", + "# variable declaration", + "I_ZT=37*10**-3; #IN AMPERES", + "V_ZT=6.80; #IN VOLTS", + "Z_ZT=3.50; #IN OHMS", + "I_Z=50*10**-3; #IN AMPERES", + "", + "#calculation", + "DEL_I_Z=I_Z-I_ZT; #change current", + "DEL_V_Z=DEL_I_Z*Z_ZT; #change voltage", + "V_Z=V_ZT+DEL_V_Z; #voltage across zener terminals", + "print \"voltage across zener terminals when current is 50 mA = %.3f volts\" %V_Z", + "I_Z=25*10**-3; #IN AMPERES", + "DEL_I_Z=I_Z-I_ZT; #change current", + "DEL_V_Z=DEL_I_Z*Z_ZT; #change voltage", + "V_Z=V_ZT+DEL_V_Z; #voltage across zener terminals", + "", + "#result", + "print \"voltage across zener terminals when current is 25 mA = %.3f volts\" %V_Z" + ], + "language": "python", + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "voltage across zener terminals when current is 50 mA = 6.845 volts", + "voltage across zener terminals when current is 25 mA = 6.758 volts" + ] + } + ], + "prompt_number": 3 + }, + { + "cell_type": "markdown", + "source": [ + "<h3>Example 3.3, Page Number:90<h3>" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "''' Zener Voltage'''", + "", + "# variable declaration", + "V_Z=8.2; #8.2 volt zener diode", + "TC=0.0005; #Temperature coefficient (per degree celsius)", + "T1=60; #Temperature 1 in celsius", + "T2=25; #Temperature 2 in celsius", + "", + "#calculation", + "DEL_T=T1-T2; #change in temp", + "del_V_Z=V_Z*TC*DEL_T; #change in voltage", + "voltage=V_Z+del_V_Z; #zener voltage", + "", + "#result", + "print \"zener voltage at 60 degree celsius = %.3f volt\" %voltage" + ], + "language": "python", + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "zener voltage at 60 degree celsius = 8.343 volt" + ] + } + ], + "prompt_number": 4 + }, + { + "cell_type": "markdown", + "source": [ + "<h3>Example 3.4, Page Number:90<h3>" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "''' Power dissipation'''", + "", + "# variable declaration", + "P_D_max=400*10**-3; #power in watts", + "df=3.2*10**-3 #derating factor in watts per celsius", + "del_T=(90-50); #in celsius, temperature difference", + "", + "#calculation", + "P_D_deru=P_D_max-df*del_T; #power dissipated", + "P_D_der=P_D_deru*1000;", + "", + "#result", + "print \"maximum power dissipated at 90 degree celsius = %d mW\" %P_D_der" + ], + "language": "python", + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "maximum power dissipated at 90 degree celsius = 272 mW" + ] + } + ], + "prompt_number": 5 + }, + { + "cell_type": "markdown", + "source": [ + "<h3>Example 3.5, Page Number: 92<h3>" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "''' Zener Diode voltage regulation'''", + "", + "# variable declaration", + "V_Z=5.1;", + "I_ZT=49*10**-3;", + "I_ZK=1*10**-3;", + "Z_Z=7;", + "R=100;", + "P_D_max=1;", + "", + "#calculation", + "V_out=V_Z-(I_ZT-I_ZK)*Z_Z; #output voltage at I_ZK", + "V_IN_min=I_ZK*R+V_out; #input voltage", + "I_ZM=P_D_max/V_Z; #current", + "V_out=V_Z+(I_ZM-I_ZT)*Z_Z; #output voltage at I_ZM", + "V_IN_max=I_ZM*R+V_out; #max input voltage", + "", + "#result", + "print \"maximum input voltage regulated by zener diode = %.3f volts\" %V_IN_max", + "print \"minimum input voltage regulated by zener diode = %.3f volts\" %V_IN_min" + ], + "language": "python", + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "maximum input voltage regulated by zener diode = 25.737 volts", + "minimum input voltage regulated by zener diode = 4.864 volts" + ] + } + ], + "prompt_number": 6 + }, + { + "cell_type": "markdown", + "source": [ + "<h3>Example 3.6, Page Number: 93<h3>" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "''' Min & Max current'''", + "", + "# variable declaration", + "V_Z=12.0; #voltage in volt", + "V_IN=24.0; #ip voltage in volt", + "I_ZK=0.001; #current in ampere", + "I_ZM=0.050; #current in ampere ", + "Z_Z=0; #impedence", + "R=470; #resistance in ohm", + "", + "#calculation", + "#when I_L=0, I_Z is max and is equal to the total circuit current I_T", + "I_T=(V_IN-V_Z)/R; #current", + "I_Z_max=I_T; #max current", + "if I_Z_max<I_ZM : # condition for min currert ", + " I_L_min=0;", + "", + "I_L_max=I_T-I_ZK; #max current", + "R_L_min=V_Z/I_L_max; #min resistance", + "", + "#result", + "print \"minimum value of load resistance = %.2f ohm\" %R_L_min", + "print \"minimum curent = %.3f ampere\" %I_L_min", + "print \"maximum curent = %.3f ampere\" %I_L_max" + ], + "language": "python", + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "minimum value of load resistance = 489.16 ohm", + "minimum curent = 0.000 ampere", + "maximum curent = 0.025 ampere" + ] + } + ], + "prompt_number": 7 + }, + { + "cell_type": "markdown", + "source": [ + "<h3>Example 3.7, Page Number: 94<h3>" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "''' to find load resistance'''", + "", + "# variable declaration", + "V_IN=24.0; #voltage in volt", + "V_Z=15.0; #voltage in volt", + "I_ZK=0.25*10**-3; #current in ampere", + "I_ZT=17*10**-3; #current in ampere", + "Z_ZT=14.0; #impedence", + "P_D_max=1.0; #max power dissipation", + "", + "#calculation", + "V_out_1=V_Z-(I_ZT-I_ZK)*Z_ZT; #output voltage at I_ZK", + "print \"output voltage at I_ZK = %.2f volt\" %V_out_1", + "I_ZM=P_D_max/V_Z;", + "", + "V_out_2=V_Z+(I_ZM-I_ZT)*Z_ZT; #output voltage at I_ZM", + "print \"output voltage a I_ZM = %.2f volt\" %V_out_2", + "R=(V_IN-V_out_2)/I_ZM; #resistance", + "print \"value of R for maximum zener current, no load = %.2f ohm\" %R", + "print \"closest practical value is 130 ohms\"", + "R=130.0;", + "#for minimum load resistance(max load current) zener current is minimum (I_ZK)", + "I_T=(V_IN-V_out_1)/R; #current", + "I_L=I_T-I_ZK; #current", + "R_L_min=V_out_1/I_L; #minimum load resistance", + "", + "#result", + "print \"minimum load resistance = %.2f ohm\" %R_L_min" + ], + "language": "python", + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "output voltage at I_ZK = 14.77 volt", + "output voltage a I_ZM = 15.70 volt", + "value of R for maximum zener current, no load = 124.57 ohm", + "closest practical value is 130 ohms", + "minimum load resistance = 208.60 ohm" + ] + } + ], + "prompt_number": 8 + }, + { + "cell_type": "markdown", + "source": [ + "<h3>Example 3.8, Page Number: 96<h3>" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "'''Zener limiting'''", + "", + "#variable declaration", + "V_p_in=10.0; #Peak input voltage", + "V_th=0.7; #forward biased zener", + "V_Z1=5.1;", + "V_Z2=3.3;", + "", + "V_p_in=20.0;", + "V_Z1=6.2;", + "V_Z2=15.0;", + "", + "#result", + "print('max voltage = %.1f V'%(V_Z1+V_th))", + "print('min voltage = %.1f V'%(-(V_Z2+V_th)))" + ], + "language": "python", + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "max voltage = 6.9 V", + "min voltage = -15.7 V" + ] + } + ], + "prompt_number": 9 + } + ] + } + ] +}
\ No newline at end of file diff --git a/tbc/static/uploads/Hardik/C++/Chapter4.ipynb b/tbc/static/uploads/Hardik/C++/Chapter4.ipynb new file mode 100644 index 0000000..b76b7b1 --- /dev/null +++ b/tbc/static/uploads/Hardik/C++/Chapter4.ipynb @@ -0,0 +1,455 @@ +{ + "metadata": { + "name": "Chapter_4" + }, + "nbformat": 2, + "worksheets": [ + { + "cells": [ + { + "cell_type": "markdown", + "source": [ + "<h1>Chapter 4: Bipolar Junction Transistors (BJTs)<h1>" + ] + }, + { + "cell_type": "markdown", + "source": [ + "<h3>Example 4.1, Page Number: 120 <h3>" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "%pylab inline" + ], + "language": "python", + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "", + "Welcome to pylab, a matplotlib-based Python environment [backend: module://IPython.zmq.pylab.backend_inline].", + "For more information, type 'help(pylab)'." + ] + } + ], + "prompt_number": 1 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "''' To find Emitter current'''", + "", + "# variable declaration", + "I_C=3.65*10**-3; #collector current in amperes", + "I_B=50*10**-6; #base current in amperes", + "", + "#calculation", + "B_DC=I_C/I_B; #B_DC value", + "I_E=I_B+I_C; #current in ampere", + "", + "# result", + "print \"B_DC = %d \" %B_DC", + "print \"Emitter current = %.4f ampere\" %I_E" + ], + "language": "python", + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "B_DC = 73 ", + "Emitter current = 0.0037 ampere" + ] + } + ], + "prompt_number": 2 + }, + { + "cell_type": "markdown", + "source": [ + "<h3>Example 4.2, Page Number: 121<h3>" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "''' Current and Voltage values'''", + "", + "# variable declaration", + "V_BE=0.7; # voltage in volt", + "B_DC=150; # voltage in volt", + "V_BB=5; # voltage in volt", + "V_CC=10; # voltage in volt", + "R_B=10*10**3; # resistance in ohm", + "R_C=100; # resistance in ohm", + "", + "#calculation", + "I_B=(V_BB-V_BE)/R_B; #base current in amperes", + "I_C=B_DC*I_B; #collector current in amperes", + "I_E=I_C+I_B; #emitter current in amperes", + "V_CE=V_CC-I_C*R_C; #collector to emitter voltage in volts", + "V_CB=V_CE-V_BE; #collector to base voltage in volts", + "", + "# result", + "print \"base current = %.5f amperes\" %I_B", + "print \"collector current = %.4f amperes\" %I_C", + "print \"emitter current = %.5f amperes\" %I_E", + "print \"collector to emitter voltage =%.2f volts\" %V_CE", + "print \"collector to base voltage =%.2f volts\" %V_CB" + ], + "language": "python", + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "base current = 0.00043 amperes", + "collector current = 0.0645 amperes", + "emitter current = 0.06493 amperes", + "collector to emitter voltage =3.55 volts", + "collector to base voltage =2.85 volts" + ] + } + ], + "prompt_number": 3 + }, + { + "cell_type": "markdown", + "source": [ + "<h3>Example 4.3, Page Number: 123<h3>" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "'''Ideal family of collector curve'''", + "", + "", + "import pylab as py", + "import numpy as np", + "", + "#variable declaration", + "beta=100 # current gain", + "print'Ideal family of collector curve'", + "", + "ic1 = arange(0.00001, 0.45, 0.0005)", + "ic2 = arange(0.00001, 0.5, 0.0005)", + "ic3 = arange(0.00001, 0.6, 0.0005)", + "ic4 = arange(0.00001, 0.7, 0.0005)", + "vcc1=ic1*0.5/0.7", + "vcc2=ic2*1.35/0.7", + "vcc3=ic3*2/0.7", + "vcc4=ic4*2.5/0.7", + "m1=arange(0.45,5.0,0.0005)", + "m2=arange(0.5,5.0,0.0005)", + "m3=arange(0.6,5.0,0.0005)", + "m4=arange(0.7,5.0,0.0005)", + "", + "plot(ic1,vcc1,'b')", + "plot(ic2,vcc2,'b')", + "plot(ic3,vcc3,'b')", + "plot(ic4,vcc4,'b')", + "plot(m1,0.32*m1/m1,'b')", + "plot(m2,0.96*m2/m2,'b')", + "plot(m3,1.712*m3/m3,'b')", + "plot(m4,2.5*m4/m4,'b')", + "", + "ylim( (0,3) )", + "ylabel('Ic(mA)')", + "xlabel('Vce(V)')", + "title('Ideal family of collector curve')" + ], + "language": "python", + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "Ideal family of collector curve" + ] + }, + { + "output_type": "pyout", + "prompt_number": 4, + "text": [ + "<matplotlib.text.Text at 0xa11e74c>" + ] + }, + { + "output_type": "display_data", + "png": "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\nYII=\n" + } + ], + "prompt_number": 4 + }, + { + "cell_type": "markdown", + "source": [ + "<h3>Example 4.4, Page Number: 125<h3>" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "''' Transistor saturtion condition'''", + "", + "# variable declaration", + "V_CE_sat=0.2; # voltage in volt", + "V_BE=0.7; # voltage in volt", + "V_BB=3; # voltage in volt", + "V_CC=10; # voltage in volt", + "B_DC=50; # voltage in volt", + "R_B=10*10**3; # resistance in ohm", + "R_C=1*10**3; # resistance in ohm", + "", + "#calculation", + "I_C_sat=(V_CC-V_CE_sat)/R_C; # saturation current", + "I_B=(V_BB-V_BE)/R_B; # base current", + "I_C=B_DC*I_B; # current in ampere", + "", + "# result", + "if I_C>I_C_sat:", + " print \"transistor in saturation\"", + "else:", + " print \"transistor not in saturation\"" + ], + "language": "python", + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "transistor in saturation" + ] + } + ], + "prompt_number": 5 + }, + { + "cell_type": "markdown", + "source": [ + "<h3>Example 4.5, Page Number: 127<h3>" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "'''maximum collector current'''", + "", + "#Variable declaration", + "P_D_max=250*10**-3; #max power rating of transistor in watts", + "V_CE=6; #voltage in volt", + "", + "#Calculation", + "I_Cu=P_D_max/V_CE; #Current (Amp)", + "I_C=I_Cu*1000;", + "", + "#Result", + "print \"collector current that can be handled by the transistor = %.1f mA\" %I_C", + "print \"\\nRemember that this is not necessarily the maximum IC. The transistor\"", + "print \"can handle more collectore current if Vce is reduced as long as PDmax\"", + "print \"is not exceeded.\"" + ], + "language": "python", + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "collector current that can be handled by the transistor = 41.7 mA", + "", + "Remember that this is not necessarily the maximum IC. The transistor", + "can handle more collectore current if Vce is reduced as long as PDmax", + "is not exceeded." + ] + } + ], + "prompt_number": 6 + }, + { + "cell_type": "markdown", + "source": [ + "<h3>Example 4.6, Page Number: 127<h3>" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "'''voltage drop across transistor''' ", + "", + "#Variable declaration", + "P_D_max=800*10**-3; #max power rating of transistor in watts", + "V_BE=0.7; #voltage in volt", + "V_CE_max=15; #voltage in volt", + "I_C_max=100*10**-3; #Current (Amp)", + "V_BB=5; #voltage in volt", + "B_DC=100; #voltage in volt", + "R_B=22*10**3; # resistance in ohm", + "R_C=10**3; # resistance in ohm", + "", + "#Calculation", + "I_B=(V_BB-V_BE)/R_B; # base current", + "I_C=B_DC*I_B; #collector current ", + "V_R_C=I_C*R_C; #voltage drop across R_C", + "V_CC_max=V_CE_max+V_R_C; #Vcc max in volt", + "P_D=I_C*V_CE_max; #max power rating", + "", + "#Result", + "if P_D<P_D_max:", + " print \"V_CC = %.2f volt\" %V_CC_max", + " print \"V_CE_max will be exceeded first because entire supply voltage V_CC will be dropped across the transistor\"", + " " + ], + "language": "python", + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "V_CC = 34.55 volt", + "V_CE_max will be exceeded first because entire supply voltage V_CC will be dropped across the transistor" + ] + } + ], + "prompt_number": 7 + }, + { + "cell_type": "markdown", + "source": [ + "<h3>Example 4.7, Page Number: 128<h3>" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "'''Power dissipation'''", + "", + "#Variable declaration", + "df=5*10**-3; #derating factor in watts per degree celsius", + "T1=70; #temperature 1", + "T2=25; #temperature 2", + "P_D_max=1; #in watts", + "", + "#Calculation", + "del_P_D=df*(T1-T2); #change due to temperature", + "P_D=P_D_max-del_P_D; # power dissipation", + "", + "#Result", + "print \"Power dissipated max at a temperature of 70 degree celsius = %.3f watts\" %P_D" + ], + "language": "python", + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "Power dissipated max at a temperature of 70 degree celsius = 0.775 watts" + ] + } + ], + "prompt_number": 8 + }, + { + "cell_type": "markdown", + "source": [ + "<h3>Example 4.8, Page Number: 130<h3>" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "'''voltage gain'''", + "", + "#Variable declaration", + "R_C=1*10**3; #resistance in ohm", + "r_e=50; #resistance in ohm", + "V_b=100*10**-3; #voltage in volt", + "", + "#Calculation", + "A_v=R_C/r_e; #voltage gain", + "V_out=A_v*V_b; #voltage in volt", + "", + "#Result", + "print \"voltage gain = %d \" %A_v", + "print \"AC output voltage = %d volt\" %V_out" + ], + "language": "python", + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "voltage gain = 20 ", + "AC output voltage = 2 volt" + ] + } + ], + "prompt_number": 9 + }, + { + "cell_type": "markdown", + "source": [ + "<h3>Example 4.9, Page Number: 132 <h3>" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "'''Power dissipation'''", + "", + "#Variable declaration", + "V_CC=10.0; #voltage in volt", + "B_DC=200.0; #voltage in volt", + "R_C=1.0*10**3; #resistance in ohm", + "V_IN=0.0; #voltage in volt", + "", + "#Calculation", + "V_CE=V_CC; #equal voltage", + "print \"when V_IN=0, transistor acts as open switch(cut-off) and collector emitter voltage = %.2f volt\" %V_CE", + "#now when V_CE_sat is neglected", + "I_C_sat=V_CC/R_C; #saturation current", + "I_B_min=I_C_sat/B_DC; #minimum base current", + "print \"\\nminimum value of base current to saturate transistor = %.5f ampere\" %I_B_min", + "V_IN=5; #voltage in volt", + "V_BE=0.7; #voltage in volt", + "V_R_B=V_IN-V_BE; #voltage across base resiatance", + "R_B_max=V_R_B/I_B_min;", + "", + "", + "#Result", + "kw=round (R_B_max)", + "print \"\\nmaximum value of base resistance when input voltage is 5V = %d ohm\" %kw" + ], + "language": "python", + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "when V_IN=0, transistor acts as open switch(cut-off) and collector emitter voltage = 10.00 volt", + "", + "minimum value of base current to saturate transistor = 0.00005 ampere", + "", + "maximum value of base resistance when input voltage is 5V = 86000 ohm" + ] + } + ], + "prompt_number": 10 + } + ] + } + ] +}
\ No newline at end of file diff --git a/tbc/static/uploads/Hardik/C++/screenshots/Chapter13.png b/tbc/static/uploads/Hardik/C++/screenshots/Chapter13.png Binary files differnew file mode 100644 index 0000000..175e51b --- /dev/null +++ b/tbc/static/uploads/Hardik/C++/screenshots/Chapter13.png diff --git a/tbc/static/uploads/Hardik/C++/screenshots/Chapter4.png b/tbc/static/uploads/Hardik/C++/screenshots/Chapter4.png Binary files differnew file mode 100644 index 0000000..9aa5de3 --- /dev/null +++ b/tbc/static/uploads/Hardik/C++/screenshots/Chapter4.png diff --git a/tbc/static/uploads/Hardik/C++/screenshots/xyz.png b/tbc/static/uploads/Hardik/C++/screenshots/xyz.png Binary files differnew file mode 100644 index 0000000..a3aae3c --- /dev/null +++ b/tbc/static/uploads/Hardik/C++/screenshots/xyz.png diff --git a/tbc/static/uploads/Hardik/C/images/certificate.png b/tbc/static/uploads/Hardik/C/images/certificate.png Binary files differnew file mode 100644 index 0000000..c473b82 --- /dev/null +++ b/tbc/static/uploads/Hardik/C/images/certificate.png diff --git a/tbc/static/uploads/Hardik/C/images/pr.jpeg b/tbc/static/uploads/Hardik/C/images/pr.jpeg Binary files differnew file mode 100644 index 0000000..a7edf07 --- /dev/null +++ b/tbc/static/uploads/Hardik/C/images/pr.jpeg diff --git a/tbc/static/uploads/Hardik/C/images/scipy.png b/tbc/static/uploads/Hardik/C/images/scipy.png Binary files differnew file mode 100644 index 0000000..0036b02 --- /dev/null +++ b/tbc/static/uploads/Hardik/C/images/scipy.png diff --git a/tbc/static/uploads/Hardik/C/newton.py b/tbc/static/uploads/Hardik/C/newton.py new file mode 100644 index 0000000..258dc58 --- /dev/null +++ b/tbc/static/uploads/Hardik/C/newton.py @@ -0,0 +1,35 @@ +from sympy import * +import sys + + +print "Enter a function: ", +func = raw_input() + +try: + sym_x = Symbol('x') + fx = S(func) + fdashx = diff(fx, Symbol('x')) +except: + print "Function could not be differenciated..." + sys.exit() + +print "Enter initial guess: ", +curr_root = float(raw_input()) +print "Enter precision value: ", +precision = float(raw_input()) +new_root = (curr_root - fx.subs({sym_x : curr_root})/fdashx.subs({sym_x : curr_root})) + + +iterations = 1 +while(abs(new_root-curr_root)>precision): + curr_root = new_root + new_root = (curr_root - fx.subs({sym_x : curr_root})/fdashx.subs({sym_x : curr_root})) + iterations += 1 + if iterations >= 50: + print "Root was not derived uptil 50 iterations, current root: ", curr_root + break + +print "Function: ", fx +print "Given tolerance: ", precision +print "Number of iterations: ", iterations +print "Root to the funtion upto given precision: ", curr_root diff --git a/tbc/static/uploads/Hardik/C/newton_raphson.py b/tbc/static/uploads/Hardik/C/newton_raphson.py new file mode 100644 index 0000000..c18f135 --- /dev/null +++ b/tbc/static/uploads/Hardik/C/newton_raphson.py @@ -0,0 +1,132 @@ +import math # Need to import math to use the log function +from Tkinter import * +import ttk +import tkMessageBox +import tkFileDialog +import os +import sys +# Variables that should be noted +# G = Guess value +# count = f(x) +# den = f'(x) +# Acc = Accuracy input from user + +def CheckVals(): +# Define variables as floats - decimal places + r = 1 + if r == 1: + try: #If any of the variables have errors catch + G = float(GuessInp.get()) + A = float(AInp.get()) + B = float(BInp.get()) + Precision = int(AccInp.get()) + r = 0 + CalcRoot() + except ValueError: + tkinter.messagebox.showinfo("Look carefully","Oops, a variable isn't properly set") + r = 0 + + return + +def CalcRoot(): + # Start the while loop + G = float(GuessInp.get()) + A = float(AInp.get()) + B = float(BInp.get()) + Precision = int(AccInp.get()) + Acc = math.pow(0.1,Precision) + + count = Acc+1 # Just so we can get into the while loop (count > Acc) + while count > Acc : + count = (G*(math.log(A*G))) + count = count - B + if count > Acc: + + if count*A < 0: #Value not allowed + tkinter.messagebox.showinfo("Look carefully","Calculations will become unstable Pi * a <0") + return + +## if ((math.pow(math.exp(1),-1)/A)*count): #This seems like one of the prerequisites not sure if there is a typing error on the tut +## tkinter.messagebox.showinfo("Look carefully","Calculations will become unstable Pi((e^-1)/a)") +## return + + #Actual calculation + den =(math.log(A*G)) #This is the derivtive denominator + den = den + 1 + numb = count/den + Temp = G - numb #Guess value minus the calculated numb + G = Temp + count = (G*(math.log(A*G))) + count = count - B + + button1.pack_forget() #Hide Calculate button after success + GText = StringVar() + GText.set("Calculated Root: ") + label1 = Label(app, textvariable=GText, height = 4) + label1.pack() + Roottxt = StringVar(None) + Roottxt.set(G) + label7 = Label(app, textvariable=Roottxt) + label7.pack() + return + + +app = Tk() +app.title ("Newton Raphson approximation") +app.geometry('340x550+100+100') + +CommText = StringVar() +CommText.set("Please complete the form and then click calculate") +label1 = Label(app, textvariable=CommText, height = 4) +label1.pack() + +fxtxt = StringVar() +fxtxt.set("f(x) = (x * Ln(x * a)) - b\nf'(x) = 1 + Ln(ax)") +label2 = Label(app, textvariable=fxtxt, height = 4) +label2.pack() + +#Input a +Atxt = StringVar() +Atxt.set("a = ") +label3 = Label(app, textvariable=Atxt, height = 2) +label3.pack() + +A = StringVar(None) +AInp = Entry(app, textvariable=A) +AInp.pack() + +#Input b +Btxt = StringVar() +Btxt.set("b = ") +label4 = Label(app, textvariable=Btxt, height = 2) +label4.pack() + +B = StringVar(None) +BInp = Entry(app, textvariable=B) +BInp.pack() + +#Input acc +DegText = StringVar() +DegText.set("To what accuracy do you want the root: ") +label5 = Label(app, textvariable=DegText, height = 4) +label5.pack() + +Acc = StringVar(None) +AccInp = Entry(app, textvariable=Acc) +AccInp.pack() + +#Input guess +Guesstxt = StringVar() +Guesstxt.set("What is your guess of the root") +label6 = Label(app, textvariable=Guesstxt, height = 4) +label6.pack() + +G = StringVar(None) +GuessInp = Entry(app, textvariable=G) +GuessInp.pack() + +#Calculation button +button1 = Button(app, text = "Calculate root", width = 20, command = CheckVals) +button1.pack(padx = 15,pady = 15) + +app.mainloop() diff --git a/tbc/static/uploads/Hardik/C/nr.py b/tbc/static/uploads/Hardik/C/nr.py new file mode 100644 index 0000000..47ac557 --- /dev/null +++ b/tbc/static/uploads/Hardik/C/nr.py @@ -0,0 +1,51 @@ +import sys, math, argparse, time +from sympy import * + +start_time = time.time() + +# using argparse to get command line arguments +parser = argparse.ArgumentParser() +parser.add_argument("-f", "--function", help = "Define a function") +parser.add_argument("-s", "--starting", help = "Starting point value", type = float, default = 0.0) +parser.add_argument("-p", "--precision", help = "Convergence precision", type = float, default = 5*10**(-6)) +args = parser.parse_args() + +sym_x = Symbol('x') +# convert the given function to a symbolic expression +try: + fx = S(args.function) +except: + sys.exit('Unable to convert function to symbolic expression.') + +# calculate the differential of the function +try: + dfdx = diff(fx, Symbol('x')) +except: + sys.exit('Unable to differentiate function.') + +# e is the relative error between 2 consecutive estimations of the root +e = 1 +x0 = args.starting +iterations = 0 + +while ( e > args.precision ): + # new root estimation + try: + r = x0 - fx.subs({sym_x : x0})/dfdx.subs({sym_x : x0}) + except ZeroDivisionError: + print "Function derivative is zero. Division by zero, program will terminate." + sys.exit() + # relative error + e = abs((r - x0)/r) + iterations += 1 + x0 = r + +total_time = time.time() - start_time + +print 'Function:' +pprint(fx) +print 'Derivative:' +pprint(dfdx) +print 'Root %10.6f calculated after %d iterations'%(r, iterations) +print 'Function value at root %10.6f'%(fx.subs({sym_x : r}),) +print 'Finished in %10.6f seconds'%(total_time,) diff --git a/tbc/static/uploads/Hardik/C: The Basics/Chapter16.ipynb b/tbc/static/uploads/Hardik/C: The Basics/Chapter16.ipynb new file mode 100644 index 0000000..8ab4848 --- /dev/null +++ b/tbc/static/uploads/Hardik/C: The Basics/Chapter16.ipynb @@ -0,0 +1,305 @@ +{ + "metadata": { + "name": "Chapter_16" + }, + "nbformat": 2, + "worksheets": [ + { + "cells": [ + { + "cell_type": "markdown", + "source": [ + "<h1>Chapter 16: Oscillators<h1>" + ] + }, + { + "cell_type": "markdown", + "source": [ + "<h3>Example 16.1, Page Number: 524<h3>" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "%pylab inline" + ], + "language": "python", + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "", + "Welcome to pylab, a matplotlib-based Python environment [backend: module://IPython.zmq.pylab.backend_inline].", + "For more information, type 'help(pylab)'." + ] + } + ], + "prompt_number": 1 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "'''Wien bridge oscillator'''", + "", + "import math", + "R1=10*10**3;", + "R2=R1;", + "R=R1;", + "C1=0.01*10**-6;", + "C2=C1;", + "C=C1;", + "R3=1*10**3;", + "r_ds=500;", + "f_r=1/(2*math.pi*R*C);", + "print('resonant frequency of the Wein-bridge oscillator in Hertz = %.4f'%f_r)", + "#closed loop gain A_v=3 to sustain oscillations", + "A_v=3;", + "#A_v=(R_f+R_i)+1 where R_i is composed of R3 and r_ds", + "R_f=(A_v-1)*(R3+r_ds);", + "print('value of R_f in ohms = %d'%R_f)" + ], + "language": "python", + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "resonant frequency of the Wein-bridge oscillator in Hertz = 1591.5494", + "value of R_f in ohms = 3000" + ] + } + ], + "prompt_number": 2 + }, + { + "cell_type": "markdown", + "source": [ + "<h3>Example 16.2, Page Number: 525<h3>" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "'''Phase shift oscillator'''", + "", + "import math", + "A_cl=29; #A_cl=R_f/R_i;", + "R3=10*10**3;", + "R_f=A_cl*R3;", + "print('value of R_f in ohms = %d'%R_f)", + "#let R1=R2=R3=R and C1=C2=C3=C", + "R=R3;", + "C3=0.001*10**-6;", + "C=C3;", + "f_r=1/(2*math.pi*math.sqrt(6)*R*C);", + "print('frequency of oscillation in Hertz = %f'%f_r)" + ], + "language": "python", + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "value of R_f in ohms = 290000", + "frequency of oscillation in Hertz = 6497.473344" + ] + } + ], + "prompt_number": 3 + }, + { + "cell_type": "markdown", + "source": [ + "<h3>Example 16.3, Page Number: 530<h3>" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "'''FET Colpitts oscillator'''", + "", + "import math", + "C1=0.1*10**-6;", + "C2=0.01*10**-6;", + "L=50.0*10**-3; #in Henry", + "C_T=C1*C2/(C1+C2); #total capacitance", + "f_r=1/(2*math.pi*math.sqrt((L*C_T)));", + "print('frequency of oscillation in Hertz when Q>10 is \\n\\t %f'%f_r)", + "Q=8.0; #when Q drops to 8", + "f_r1=(1/(2*math.pi*math.sqrt((L*C_T))))*math.sqrt((Q**2/(1+Q**2)));", + "print('frequency of oscillation in hertz when Q=8 is \\n \\t %f'%f_r1)" + ], + "language": "python", + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "frequency of oscillation in Hertz when Q>10 is ", + "\t 7465.028533", + "frequency of oscillation in hertz when Q=8 is ", + " \t 7407.382663" + ] + } + ], + "prompt_number": 4 + }, + { + "cell_type": "markdown", + "source": [ + "<h3>Example 16.4, Page Number: 535<h3>" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "'''Triangular wave oscillator'''", + "", + "R1=10.0*10**3;", + "R2=33.0*10**3;", + "R3=10.0*10**3;", + "C=0.01*10**-6;", + "f_r=(1/(4*R1*C))*(R2/R3);", + "print('frequency of oscillation in hertz is \\n\\t%d'%f_r)", + "#the value of R1 when frequency of oscillation is 20 kHz", + "f=20.0*10**3;", + "R1=(1/(4*f*C))*(R2/R3);", + "print('value of R1 in ohms to make frequency 20 kiloHertz is \\n\\t%d'%R1)" + ], + "language": "python", + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "frequency of oscillation in hertz is ", + "\t8250", + "value of R1 in ohms to make frequency 20 kiloHertz is ", + "\t4125" + ] + } + ], + "prompt_number": 5 + }, + { + "cell_type": "markdown", + "source": [ + "<h3>Example 16.5, Page Number: 537<h3>" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "'''Sawtooth VCO'''", + "", + "import pylab", + "import numpy", + "V=15.0;", + "C=0.0047*10**-6;", + "R3=10.0*10**3;", + "R4=R3;", + "R2=10.0*10**3;", + "R1=68.0*10**3;", + "R_i=100.0*10**3;", + "V_G=R4*V/(R3+R4); #gate voltage at which PUT turns on", + "V_p=V_G; #neglecting 0.7V, this the peak voltage of sawtooth wave", + "print('neglecting 0.7V, the peak voltage of sawtooth wave = %.1f V'%V_p)", + "V_F=1.0; #minimum peak value of sawtooth wave", + "V_pp=V_p-V_F;", + "print('peak to peak amplitude of the sawtooth wave = %.1f V'%V_pp)", + "V_IN=-V*R2/(R1+R2);", + "f=(abs(V_IN)/(R_i*C))*(1/(V_pp));", + "print('frequency of the sawtooth wave = %.1f Hz'%f)", + "", + "#############PLOT###############################", + "", + "t = arange(0.0, 2.0, 0.0005)", + "t1= arange(2.0, 4.0, 0.0005)", + "t2= arange(4.0, 6.0, 0.0005)", + "k=arange(0.1,7.5, 0.0005)", + "t3=(2*k)/k", + "t4=(4*k)/k", + "t6=(6*k)/k", + "", + "subplot(111)", + "plot(t, (6.5/2)*t+1)", + "plot(t1, (6.5/2)*t+1,'b')", + "plot(t2, (6.5/2)*t+1,'b')", + "plot(t3,k,'b')", + "plot(t4,k,'b')", + "plot(t6,k,'b')", + "", + "ylim( (1,8) )", + "ylabel('Vout')", + "xlabel('ms')", + "title('Output of the Circuit')" + ], + "language": "python", + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "neglecting 0.7V, the peak voltage of sawtooth wave = 7.5 V", + "peak to peak amplitude of the sawtooth wave = 6.5 V", + "frequency of the sawtooth wave = 629.5 Hz" + ] + }, + { + "output_type": "pyout", + "prompt_number": 6, + "text": [ + "<matplotlib.text.Text at 0xa046eec>" + ] + }, + { + "output_type": "display_data", + "png": "iVBORw0KGgoAAAANSUhEUgAAAXUAAAETCAYAAADJUJaPAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3XtUVQXax/HfUdFUlBElLoGieOFmgJdM0xETs/LVNLEJ\nUJOsZrJVmaWvuVqJjePdUpya0szuMKuyN0xFQztqgksdxFXZi41BklATKHcR4ez3Dzq8YiDnwN7n\nOfvs32etViqy9yPZwz7nbL6YFEVRQERELqGD9ABERKQeLnUiIhfCpU5E5EK41ImIXAiXOhGRC+FS\nJyJyIVzqZDhHjx7FoEGD0KNHD6SlpbX6+/Pz89GhQwdYLBYHTAeEh4fj8OHDqh/38ccfx8qVK1U/\nLjkXLnVq1dtvv42hQ4eie/fu8PX1xYIFC1BWVmbz+wcGBuLgwYOqzdPe47344ot46qmnUFFRgWnT\npql+/NaUl5dj4cKF6NevH3r06IGBAwfimWeeQUlJCQDgm2++wR//+EfVz/uPf/wDL7zwAgDAbDYj\nICBA9XOQPC51uqGNGzdi6dKl2LhxI8rLy3Hs2DH8+OOPmDRpEq5evWrTMUwmE9T8Grf2Hu/8+fMI\nDQ3V7Pg3Ultbi4kTJ+K7777Dvn37UFFRgaysLPTp0wfHjx9v9f3r6+s1mYtciELUgrKyMsXd3V35\n6KOPmvx6ZWWl4uXlpbz11luKoijKQw89pLzwwguNb//yyy8Vf39/RVEUZfbs2UqHDh2Url27Ku7u\n7sr69euVvLw8xWQyKVu3blX8/PwUX19fZcOGDY3vb+/xmrN161Zl4MCBiqenpzJt2jSlsLBQURRF\nGTBgQOP79+jRQ6mtrW3yfjea95133lH69u2r9OnTR/nb3/7W+D4Wi0VZvXq1EhQUpPTu3Vt54IEH\nlIsXLzY717Zt2xRvb2+lqqqqxY97v379lAMHDiiKoijLly9XZs6cqcyePVvp2bOnsn37dqWkpESZ\nN2+e4ufnp/Tq1UuZPn26oiiKsmPHDmXs2LFNjmUymZRz5841+bhWVVUpN910k9KhQwfF3d1d6dGj\nh1JUVNTiPKQvvFKnFmVmZqKmpgb3339/k1/v3r077r33XnzxxRcAGq5sTSZTs8d477330LdvX3z+\n+eeoqKjAc8891/g2s9mMf//739i/fz/Wrl2LAwcOtOt4VgcPHsSyZcvw0UcfoaioCP369cODDz4I\nADh37lzj+5eXl8PNzc3m4x89ehRnz57FgQMH8NJLLyE3NxcAkJycjLS0NBw+fBhFRUXo1asXnnji\niWbnz8jIwD333INu3bo1+3brn/9aaWlpmDVrFsrKyhAfH485c+agpqYGZ86cwX/+8x8sWrSoxWNd\nf1yTyYRu3bohPT0dfn5+qKioQHl5OXx8fGw6Bjk/LnVqUXFxMfr06YMOHX7/18THx6fxOWAAbXq6\nYvny5ejatSvCw8ORmJiIlJSUdh3P6oMPPsD8+fMRGRmJzp07Y/Xq1cjKysL58+fbfEzrvF26dMGt\nt96KiIgInD59GgDw+uuvY+XKlfDz84ObmxuWL1+Ojz/+uNkXVi9evAhfX1+7zjtmzJjG5/4vXbqE\n9PR0vP766/Dw8ECnTp0wbtw4m49l/bi25+NLzo1LnVrUp08fFBcXN7ucioqK0KdPn3Yd/9oX6vr2\n7YvCwsJ2Hc/KenVu1b17d/Tu3RsXLlxo13GvvZrt1q0bKisrAQA//vgjZsyYgV69eqFXr14IDQ1F\np06d8Msvv/zuGL1797b7z+nv79/444KCAnh6esLDw6ONfwpydVzq1KLRo0ejS5cu+OSTT5r8emVl\nJdLT0zFx4kQADUuzurq68e0///xzk9/f0lMp1145nz9/Hrfccku7jmfl5+eH/Pz8xp9XVVWhpKSk\n8fitae341+vbty/S09Nx6dKlxn+qq6ubvSKPiYnBvn37mvz57JknICAAFy9ebPbuo9Y+btcey94/\nI+kHlzq1yMPDA8uXL8eTTz6Jffv24erVq8jPz8cDDzyAgIAAzJkzBwAQGRmJPXv24NKlS/j555+x\nadOmJsfx9vbGuXPnfnf8lStX4vLly/j222/x9ttv409/+lO7jmcVFxeHHTt24PTp07hy5QqWLVuG\n22+/HX379rXpz93a8a/3l7/8BcuWLWv8JPXrr7+2eP/7nDlzEBAQgJkzZyI3NxcWiwUlJSVYtWoV\n9u7d2+q5fH19cc8992DBggUoLS3F1atXG+9pj4iIwLfffovTp0+jpqYGSUlJTd5XUZTGp128vb1R\nUlKC8vJym/+cpA9c6nRDixcvxqpVq/Dcc8/Bw8MDt99+O/r164cDBw40vsg4Z84cREREIDAwEHff\nfTcefPDBJleCzz//PFauXIlevXrh5Zdfbvz18ePHY+DAgYiJicHixYsRExPTruNZTZw4EX/9618x\nc+ZM+Pn5IS8vD6mpqTb/mZs7/o2ubJ9++mlMmzYNd911F3r27InRo0e3eHti586dkZGRgeDgYEya\nNAkeHh4YNWoULl68iNtvv/13v7+5F43fe+89uLm5ITg4GN7e3khOTgYADB48GC+++CJiYmIwZMgQ\njBs3rsn7Xnus4OBgxMXFYcCAAfD09Gz2qp70yaTwFRNysPz8fAwYMAB1dXXNvghLRG2nyf9Rq1ev\nRlhYGIYOHYr4+HhcuXJFi9MQEdF1VF/q+fn52LZtG7Kzs/H111+jvr7eroe+ZAx8oY5IG53UPmDP\nnj3h5uaG6upqdOzYEdXV1TbfdUDGEBgYyC93J9KI6kvd09MTzz77LPr27YuuXbti8uTJjS+AAbxC\nIyJqK1teAlX96Zdz585h06ZNyM/PR2FhISorK/HBBx/8bjC9/rN8+XLxGTi//BycX3//6Hl2RbH9\nfhbVl/rJkycxZswY9O7dG506dcL999+PzMxMtU9DRETNUH2pBwcH49ixY7h8+TIURUFGRsYNM6dE\nRKQe1Zd6REQE5s6dixEjRuDWW28FADz22GNqn0ZMdHS09AjtwvllcX45ep7dHg7/4iMtvwEBEZGr\nsnV38sv5iIhcCJc6EZEL4VInInIhXOpERC6ES52IyIVwqRMRuRAudSIiF8KlTkTkQrjUiYhcCJe6\nwVgsAL+gV47FIj2BsRnh48+lbjBPPgmEh0tPYVwBAcCaNdJTGFNeHtC5M1BXJz2JtrjUDcRiAf7n\nfwBvb+lJjCknB7h4EQgKkp7EmF57reHfnVT/1kDOhUvdQHbvbrhS4VKXsX59w0J3c5OexHjKy4Ht\n24GOHaUn0R6XuoGsWwdMnSo9hTHl5wP79gGBgdKTGNO2bcDEiYARvpsml7pBZGYChYXAbbdJT2JM\nL78MPPKI6z/0d0a1tcArrwCLFklP4hhc6gaxbh3w7LPGePjpbIqLgfffB556SnoSY/rwQyAkBIiK\nkp7EMbjUDeB//xfIygLmzZOexJheew24/37Az096EuOxWBpey1iyRHoSx+GDQQPYsAF44gmgWzfp\nSYynuhp49VXg0CHpSYxpz56GmwNiYoArV6SncQwudRdXWAjs3Al8/730JMb09tvA6NFAcLD0JMa0\nbl3DVboRXiC14lJ3ccnJwOzZQO/e0pMYT10dsHEj8N570pMYU1YWUFAAzJolPYljcam7sPJy4M03\ngZMnpScxpp07AV9fYMwY6UmMaf36hpsDjHbHEV8odWFvvAFMnsx7oyUoCrB2LfDf/y09iTHl5gJf\nfQUkJkpP4ngG+xxmHFeuAJs2NXwVKTnewYPA5cvAlCnSkxjThg3AggVA9+7Skzie6lfqubm5iIqK\navzHw8MDycnJap+GWvHhhw3hrshI6UmMad06YPFioAMfCztcURHw8ccNd3wZkepX6kOGDMGpU6cA\nABaLBbfccgtmzJih9mnoBqz35m7ZIj2JMeXkAN98A8THS09iTMnJQEIC4OUlPYkMTZ9+ycjIQFBQ\nEAICApr8elJSUuOPo6OjER0dreUYhrN7N9C1K3DnndKTGNP69cDChUCXLtKTGE95ObB1K3DihPQk\n7Wc2m2E2m+1+P02XempqKuKbuVy5dqmT+ox4b66zsIa7rJlXcqxt24BJk4ABA6Qnab/rL3hXrFhh\n0/tp9oxfbW0tdu3ahVlGu0lUmDXcNXOm9CTGZA13eXhIT2I81nCXkZIAzdHsSn3v3r0YPnw4vIz6\nxJYQa7jLaPfmOgNruOubb6QnMSZruGvYMOlJZGn2v35KSgri4uK0Ojw1wxru+vBD6UmMieEuOdab\nAzZtkp5EniZLvaqqChkZGdi2bZsWh6cWMNwlh+EuWdeGu4xOk6XevXt3FBcXa3FoagHDXbIY7pLF\nmwP+H595dREMd8lhuEuWUcNdLeFSdwEMd8liuEuWUcNdLeEXMbsAhrvkMNwly8jhrpbwc5vOMdwl\ni+EuWUYOd7WES13nGO6SxXCXHGu46+xZ6UmcC5e6jjHcJYvhLllGD3e1hEtdxxjuksVwl5zy8obO\ny/Hj0pM4Hz5o1DHemyvHGu567DHpSYzJlcJdauOVuk4x3CWL4S451nBXWpr0JM6JS12nGO6Sw3CX\nLIa7bowrQYcY7pLFcJcchrtax6WuQwx3yWG4SxbDXa3jUtcZhrtkMdwlizcHtI5LXWcY7pLDcJcs\nhrtsw6WuIwx3yWK4SxbDXbbhfeo6wnCXHIa7ZDHcZTt+ztMJhrtkMdwli+Eu23Gp6wTDXbIY7pLD\ncJd9uNR1gOEuWQx3yWK4yz5c6jrAcJcshrvkMNxlPz6Y1AHemyuH4S5ZDHfZj1fqTo7hLlkMd8lh\nuKttNLlSLy0tRWxsLEJCQhAaGopjx45pcRpDYLhLjjXc9dRT0pMYE8NdbaPJqnj66adx77334uOP\nP0ZdXR2qqqq0OI3LY7hLFsNdchjuajvVl3pZWRmOHDmCd955p+EEnTrBg49d24ThLjkMd8liuKvt\nVF/qeXl58PLyQmJiIk6fPo3hw4dj8+bN6HbNZkpKSmr8cXR0NKKjo9UeQ/cY7pLFcJcs3hwAmM1m\nmM1mu9/PpCiKouYgJ0+exOjRo5GZmYmRI0di4cKF6NmzJ1566aWGE5pMUPmULmnp0oarxeRkdY+b\nktLwwlNKirrHdSV1dcCQIQ3hLrU7L9OnA/PmNfybmpeV1fA1Ad9/r+5rSTU1wB/+0PBvPbJ1d6r+\nQqm/vz/8/f0xcuRIAEBsbCyys7PVPo1Ls4a7Fi2SnsSYGO6SxXBX+6i+1H18fBAQEICzv31Nb0ZG\nBsLCwtQ+jUtjuEsOw12yGO5qP00+F27ZsgUJCQmora1FUFAQduzYocVpXBLDXbIY7pLFcFf7abLU\nIyIicOLECS0O7fIY7pLFcJcchrvUwWetnAjDXbIY7pLFcJc6uNSdCMNdshjuksNwl3r4INOJ8N5c\nOfn5QHo6w11SGO5SD6/UnURmJnDhAsNdUhjuksNwl7q41J3EunXAc8/x3lwJ1nDXN99IT2JMDHep\niyvECTDcJYvhLjkMd6mPS90JMNwlh+EuWQx3qY9LXRjDXbIY7pLFmwPUx6UuLDkZmD0b6N1behLj\nqasDNm5sCHeR42VlAQUFwKxZ0pO4Fi51QdZw18mT0pMYE8Ndshju0gbvUxfEcJcchrtkMdylHX6O\nFMJwlyyGu2Qx3KUdLnUhDHfJYrhLDsNd2uJSF8BwlyyGu2Qx3KUtLnUBDHfJYrhLDsNd2uODTwG8\nN1cOw12yGO7SHq/UHYzhLlkMd8lhuMsxuNQdjOEuOQx3yWK4yzG4WhyI4S5ZDHfJYbjLcbjUHYjh\nLjkMd8liuMtxuNQdhOEuWQx3yeLNAY7Dpe4gDHfJYbhLFsNdjsWl7gAMd8liuEsWw12OpcmHOTAw\nED179kTHjh3h5uaG4wb/SgOGu+RYw11JSdKTGJM13MVHSY6jyVI3mUwwm83w9PTU4vC6wnCXLIa7\nZDHc5XiaPSBSFEWrQ+sKw12yGO6Sw3CXDM2u1GNiYtCxY0f8+c9/xqOPPtrk7UnXPBaOjo5GdHS0\nFmOIY7hLFsNdshjuah+z2Qyz2Wz3+2my1I8ePQpfX1/8+uuvmDRpEoKDgzFu3LjGtycZ5AlOhrtk\nMdwlxxruOnFCehL9uv6Cd8WKFTa9nyYPSn19fQEAXl5emDFjhmFfKOW9uXIY7pJlDXf17y89ifGo\nvtSrq6tRUVEBAKiqqsL+/fsxdOhQtU/j9BjuksVwlxxruGvxYulJjEn1p19++eUXzJgxAwBQV1eH\nhIQE3HXXXWqfxukx3CWH4S5ZDHfJUn3l9O/fHzk5OWofVlcY7pLFcJcchrvk8TpSAwx3yWG4SxbD\nXfJafU79hx9+sOnXqIE13PXEE9KTGBPDXbJ4c4C8Vpf6zGZe6ZvFMk+LGO6SYw13LVkiPYkxMdzl\nHFp8+uW7777DmTNnUFZWhp07d0JRFJhMJpSXl6OmpsaRM+oGw12yGO6SxXCXc2jxw3/27Fns2rUL\nZWVl2LVrV+Ov9+jRA9u2bXPIcHrDcJcchrtkMdzlPFpc6vfddx/uu+8+ZGVlYfTo0Y6cSZcY7pLF\ncJcshrucR6sPlLZu3YqtW7c2/tz02ysgb731lnZT6RDDXbIY7pLDcJdzaXWpT5kypXGRX758GZ9+\n+in8eANwEwx3yWK4SxbDXc6l1aUeGxvb5Ofx8fG44447NBtIjxjuksVwlxyGu5yP3Q9Wz549i19/\n/VWLWXSL9+bKYbhLFsNdzqfVK3V3d/fGp19MJhO8vb2xdu1azQfTC4a7ZDHcJcca7kpLk56ErtXq\nUq+srHTEHLrFcJcchrtkMdzlnGxaRZ999hkOHz4Mk8mE8ePHY+rUqVrPpQsMd8liuEsOw13Oq9Wl\nvnTpUpw4cQIJCQlQFAXJycnIzMzE6tWrHTGfU2O4Sw7DXbL27Gl4YZrhLufT6lLfvXs3cnJy0LFj\nRwDAvHnzEBkZafilbg13ff+99CTGxHCXLN4c4LxavfvFZDKhtLS08eelpaWNL5waGcNdchjukmUN\nd113tzM5iRav1BcsWID4+HgsW7YMw4YNw4QJE6AoCg4dOoQ1a9Y4ckanw3CXLIa7ZDHc5dxa/M8y\nePBgLF68GIWFhYiJiUG/fv0QGRmJtWvXwsfHx5EzOh2Gu+Qw3CWL4S7n1+LTLwsXLkRWVhYOHTqE\nQYMGYefOnVi8eDHeeOMNnDVw5MEa7uI31ZXBcJcshrucX6vPqQcGBmLp0qXIyclBamoqPv30U4SE\nhDhiNqfEcJcshrvkWMNd/K5ezq3V/zXq6uqQlpaG+Ph43H333QgODsbOnTsdMZvTsd6byxfoZDDc\nJYvhLn1o8Tn1/fv3IzU1Fbt378Ztt92GuLg4bN26Fe7u7o6cz6kw3CWL4S45DHfpR4tLfc2aNYiL\ni8OGDRvg6enpyJmcFu/NlWMNd732mvQkxsRwl360uNQPHjzYrgPX19djxIgR8Pf3b/Lt8PSK4S5Z\nr7zCcJcUhrv0RbM7TTdv3ozQ0FBUVFRodQqHYrhLTklJwy10DHfJYLhLXzS5h+Cnn37Cnj178Mgj\nj0BRFC1O4VDWcNe8edKTGNOrrzLcJYU3B+iPJtedzzzzDNavX4/y8vJm3550zVeOREdHIzo6Wosx\nVMNwlxyGu2Qx3CXHbDbDbDbb/X6qL/XPP/8cN998M6KiolocKElHXw7IcJcshrtk8eYAOddf8K5Y\nscKm91N9qWdmZiItLQ179uxBTU0NysvLMXfuXLz77rtqn8ohGO6SYw138UvSZTDcpU+qP6e+atUq\nFBQUIC8vD6mpqbjzzjt1u9Ct9+YuWiQ9iTEx3CWL4S590vyLrfWc6WW4S4413MUX6GRYw12JidKT\nkL00/Rw8fvx4jB8/XstTaMYa7tq9W3oSY7KGu/7rv6QnMSaGu/SLD6xawHCXLIa75BQVAZ98Ahg4\nxqprXOrNsN6bu2WL9CTGxHCXLGu4q08f6UmoLbjUm8FwlyyGu+Qw3KV/fHDbDN6bK8ca7nrsMelJ\njInhLv3jlfp1GO6SxXCXHIa7XAOX+nUY7pLDcJcshrtcA1fXNazhrg8/lJ7EmBjukmO9OWDTJulJ\nqL241K/BcJcchrtkMdzlOrjUf8NwlyyGu2Tx5gDXwaX+G4a75DDcJYvhLtfCpY7/vzf3X/+SnsSY\nGO6SxXCXa+F96mC4SxLDXbIY7nI9hv/czHCXLIa7ZDHc5XoMv9QZ7pLFcJcchrtck6GXOsNdshju\nksVwl2sy9FJnuEsWw11yGO5yXYZ+0Mt7c+Uw3CWL4S7XZdgrdYa7ZDHcJYfhLtdm2KXOcJcchrtk\nMdzl2gy50hjuksVwlxyGu1yfIZc6w11yGO6SxXCX6zPcUme4SxbDXbJ4c4DrM9xSZ7hLDsNdshju\nMgbVl3pNTQ3Gjx+PK1euoLa2Fvfddx9Wr16t9mnahOEuWQx3yWK4yxhU/89700034csvv0S3bt1Q\nV1eHsWPH4quvvsLYsWPVPpXdGO6SYw13LV8uPYkxWcNdfJTk+jT5nN3tt1cga2trUV9fD09PTy1O\nYxeGu2Qx3CWL4S7j0GSpWywWDBs2DOfOncPjjz+O0NDQJm9PSkpq/HF0dDSio6O1GKMJhrtkMdwl\nh+EufTKbzTCbzXa/n0lRFEX9cRqUlZVh8uTJWLNmTePiNplM0PCUzbJYGhb6li3AxIkOPbXTSUlp\n+ErClBTHnTMnB5gyBfjhB3Zepk8H5s1r+LejPP88UFnJcF1NDfCHPzT8W49s3Z2aXjd5eHhgypQp\nOHnypJanaRXDXbIY7pJjvTlg0SLpSchRVF/qxcXFKC0tBQBcvnwZX3zxBaKiotQ+jV14b64chrtk\nMdxlPKo/p15UVISHHnoIFosFFosFc+bMwUTB5zwY7pLFcJcchruMSfWlPnToUGRnZ6t92DZjuEsO\nw12yGO4yJpdedQx3yWK4Sw7DXcbl0kud4S45DHfJYrjLuFx2qTPcJYvhLlm8OcC4XHapM9wlh+Eu\nWQx3GZtLLnWGu2Qx3CWL4S5jc8kv2ma4S4413LVkifQkxmQNdyUmSk9CUlzucznDXbIY7pLFcBe5\n3FJnuEsWw11yGO4iwMWWuvXeXKOHi6Tk5DR8oVF8vPQkxpScDCQkAH36SE9CklxqqTPcJYvhLjnW\nmwNOnJCehKS51INk3psrh+EuWQx3kZXLXKkz3CWL4S45DHfRtVxmqa9bx3tzpTDcJYvhLrqWS6xA\nhrtkMdwlh+Euup5LLHWGu+Qw3CWL4S66nu6XOsNdshjuksWbA+h6ul/qDHfJYbhLFsNd1BxdL3WG\nu2Qx3CWL4S5qjq7vU2e4Sw7DXbIY7qKW6PZzPMNdshjuksVwF7VEt0ud4S5ZDHfJYbiLbkSXS53h\nLlkMd8liuItuRJdLneEuWQx3yWG4i1qj+oPngoICTJgwAWFhYQgPD0dycrLap+C9uYIY7pLFcBe1\nRvUrdTc3N7zyyiuIjIxEZWUlhg8fjkmTJiEkJESV4zPcJYvhLjkMd5EtVF/qPj4+8PHxAQC4u7sj\nJCQEhYWFqi11hrvkMNwli+EusoWmqzE/Px+nTp3CqFGjmvx6UlJS44+jo6MRHR1t0/EY7pLFcJcc\nhruMx2w2w2w22/1+mi31yspKxMbGYvPmzXB3d2/ytmuXuj0Y7pLDcJcshruM5/oL3hUrVtj0fpos\n9atXr2LmzJmYPXs2pk+frsoxGe6SxXCXLN4cQLZSfakrioL58+cjNDQUCxcuVO24DHfJYbhLFsNd\nZA/Vb2k8evQo3n//fXz55ZeIiopCVFQU0tPT23VM6725ixapNCTZheEuWQx3kT1U/2syduxYWCwW\nVY/JcJcca7hr+XLpSYzJGu7ioySyldN/7me4SxbDXbIY7iJ7Of1SZ7hLFsNdchjuorZw6qXOcJcs\nhrtkMdxFbeHUS53hLlkMd8lhuIvayqkfVPPeXDkMd8liuIvaymmv1BnuksVwlxyGu6g9nHapM9wl\nh+EuWQx3UXs45cpkuEsWw11yrDcHbN4sPQnplVMudYa75DDcJcsa7po4UXoS0iunW+oMd8liuEsW\nbw6g9nK6pc5wlxyGu2Qx3EVqcKqlbr0391//kp7EmBjuksVwF6nBqe5TZ7hLjjXctWSJ9CTGZA13\nJSZKT0J65zTXBAx3yWK4SxbDXaQWp1nqDHfJYrhLDsNdpCanWOoMd8liuEsWw12kJqdY6gx3yWK4\nSw7DXaQ2p3iwzXtz5TDcJYvhLlKb+JU6w12yGO6Sw3AXaUF8qTPcJYfhLlkMd5EWRFcpw12yGO6S\nw3AXaUV0qTPcJYfhLlkMd5FWxF4otYa7nnhCaoK2MZvN0iO0y5kzZgD6DXfp/eNfXGwGoN+bA/T8\n8T982Cw9gkNostQffvhheHt7Y+jQoS3+Hr2Gu/T8lxoAvvvODEVpCHfpMQmg949/cbEZubn6DXfp\n+ePPpd4OiYmJSE9Pb/Ht1ntzFy3S4uzUmoIChrskffopbw4g7Wiy1MeNG4devXq1+PatWxnukqIo\nwHff6fMq3RXU1jZ8/BnuIq2YFEVRtDhwfn4+pk6diq+//rrpCfX2JCIRkZOwZV07/AGgRp9DiIgI\nTpIJICIidXCpExG5EE2WelxcHMaMGYOzZ88iICAAO3bs0OI0RER0HU2WekpKCgoLC3HlyhUUFBQg\n8beX+tPT0xEcHIxBgwZh7dq1WpxaU7bcf++sCgoKMGHCBISFhSE8PBzJycnSI9mlpqYGo0aNQmRk\nJEJDQ/H8889Lj9Qm9fX1iIqKwtSpU6VHsVtgYCBuvfVWREVF4bbbbpMexy6lpaWIjY1FSEgIQkND\ncezYMemRbJabm4uoqKjGfzw8PG78/6/iIHV1dUpQUJCSl5en1NbWKhEREcqZM2ccdXpVHD58WMnO\nzlbCw8OlR7FbUVGRcurUKUVRFKWiokIZPHiw7j7+VVVViqIoytWrV5VRo0YpR44cEZ7Ifhs3blTi\n4+OVqVOnSo9it8DAQKWkpER6jDaZO3eusn37dkVRGv7+lJaWCk/UNvX19YqPj49y/vz5Fn+Pw55T\nP378OAaHKXu/AAAEdUlEQVQOHIjAwEC4ubnhwQcfxGeffeao06uitfvvnZmPjw8if/tege7u7ggJ\nCUFhYaHwVPbp9lskqLa2FvX19fD09BSeyD4//fQT9uzZg0ceeUS3d4Hpce6ysjIcOXIEDz/8MACg\nU6dO8NBpazojIwNBQUEICAho8fc4bKlfuHChySD+/v64cOGCo05P18jPz8epU6cwatQo6VHsYrFY\nEBkZCW9vb0yYMAGhoaHSI9nlmWeewfr169FBp98I1mQyISYmBiNGjMC2bdukx7FZXl4evLy8kJiY\niGHDhuHRRx9FdXW19FhtkpqaivhWvu+kw/528YuOnENlZSViY2OxefNmuLu7S49jlw4dOiAnJwc/\n/fQTDh8+rKsOyeeff46bb74ZUVFRurzaBYCjR4/i1KlT2Lt3L1599VUcOXJEeiSb1NXVITs7GwsW\nLEB2dja6d++ONWvWSI9lt9raWuzatQuzZs264e9z2FK/5ZZbUFBQ0PjzgoIC+Pv7O+r0BODq1auY\nOXMmZs+ejenTp0uP02YeHh6YMmUKTp48KT2KzTIzM5GWlob+/fsjLi4OBw8exNy5c6XHsouvry8A\nwMvLCzNmzMDx48eFJ7KNv78//P39MXLkSABAbGwssrOzhaey3969ezF8+HB4eXnd8Pc5bKmPGDEC\n33//PfLz81FbW4t//vOfmDZtmqNOb3iKomD+/PkIDQ3FwoULpcexW3FxMUpLSwEAly9fxhdffIGo\nqCjhqWy3atUqFBQUIC8vD6mpqbjzzjvx7rvvSo9ls+rqalRUVAAAqqqqsH//ft3cBebj44OAgACc\nPXsWQMPz0mFhYcJT2S8lJQVxcXGt/j6HZQI6deqEv//975g8eTLq6+sxf/58hISEOOr0qoiLi8Oh\nQ4dQUlKCgIAAvPTSS423azq7o0eP4v3332+8JQ0AVq9ejbvvvlt4MtsUFRXhoYcegsVigcViwZw5\nczBRx99hQm9PR/7yyy+YMWMGgIanMxISEnDXXXcJT2W7LVu2ICEhAbW1tQgKCtLd185UVVUhIyPD\nptcyNAt6ERGR4+nzZXgiImoWlzoRkQvhUiciciFc6kRELoRLnQwpPz8fwcHBSExMxJAhQ5CQkID9\n+/fjjjvuwODBg3HixAkcOnSoMaI0bNgwVFZWSo9N1Cre/UKGlJ+fj0GDBiEnJwehoaEYOXIkIiIi\nsH37dqSlpeGtt96CxWLB0qVLMWbMGFRXV6NLly7o2LGj9OhEN8QrdTKs/v37IywsDCaTCWFhYYiJ\niQEAhIeH48cff8TYsWOxaNEibNmyBZcuXeJCJ13gUifD6tKlS+OPO3TogM6dOzf+uK6uDkuWLMGb\nb76Jy5cv44477kBubq7UqEQ2c/g3nibSix9++AHh4eEIDw/HiRMnkJubiyFDhkiPRXRDvFInw7r+\nS/Wv//mmTZswdOhQREREoHPnzrjnnnscOR5Rm/CFUiIiF8IrdSIiF8KlTkTkQrjUiYhcCJc6EZEL\n4VInInIhXOpERC7k/wD4xTcXWswNTwAAAABJRU5ErkJggg==\n" + } + ], + "prompt_number": 6 + }, + { + "cell_type": "markdown", + "source": [ + "<h3>Example 16.6, Page Number: 542<h3>" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "'''555 timer'''", + "", + "R1=2.2*10**3;", + "R2=4.7*10**3;", + "C_ext=0.022*10**-6;", + "f_r=1.44/((R1+2*R2)*C_ext);", + "print('frequency of the 555 timer in hertz = %f'%f_r)", + "duty_cycle=((R1+R2)/(R1+2*R2))*100;", + "print('duty cycle in percentage = %f'%duty_cycle)" + ], + "language": "python", + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "frequency of the 555 timer in hertz = 5642.633229", + "duty cycle in percentage = 59.482759" + ] + } + ], + "prompt_number": 7 + } + ] + } + ] +}
\ No newline at end of file diff --git a/tbc/static/uploads/Hardik/C: The Basics/Chapter17.ipynb b/tbc/static/uploads/Hardik/C: The Basics/Chapter17.ipynb new file mode 100644 index 0000000..1f3eeb4 --- /dev/null +++ b/tbc/static/uploads/Hardik/C: The Basics/Chapter17.ipynb @@ -0,0 +1,322 @@ +{ + "metadata": { + "name": "Chapter_17" + }, + "nbformat": 2, + "worksheets": [ + { + "cells": [ + { + "cell_type": "markdown", + "source": [ + "<h1>Chapter 17: Voltage Regulators<h1>" + ] + }, + { + "cell_type": "markdown", + "source": [ + "<h3>Example 17.1, Page Number:552 <h3>" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "%pylab inline" + ], + "language": "python", + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "", + "Welcome to pylab, a matplotlib-based Python environment [backend: module://IPython.zmq.pylab.backend_inline].", + "For more information, type 'help(pylab)'." + ] + } + ], + "prompt_number": 1 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "'''Percentage line regulation'''", + "", + "#variable declaration", + "Del_V_out=0.25;", + "V_out=15;", + "Del_V_in=5; #All voltages in Volts", + "", + "#Calculations", + "line_regulation=((Del_V_out/V_out)/Del_V_in)*100;", + "", + "#Result", + "print('line regulation in %%V is %f' %line_regulation)" + ], + "language": "python", + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "line regulation in %V is 0.333333" + ] + } + ], + "prompt_number": 2 + }, + { + "cell_type": "markdown", + "source": [ + "<h3>Example 17.2, Page Number: 553<h3>" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "''' Load regulation percentage'''", + "", + "# Variable Declaration", + "V_NL=12.0; #No load output voltage in Volts", + "V_FL=11.9; #Full load output voltage in Volts", + "I_F=10.0; #Full load current in milli-Amperes", + "", + "#Calculations", + "load_regulation=((V_NL-V_FL)/V_FL)*100;", + "load_reg=load_regulation/I_F;", + "", + "#Result", + "print('load regulation as percentage change from no load to full load = %f'%load_regulation)", + "print('\\nload regulation as percentage change per milliampere = %f' %load_reg)" + ], + "language": "python", + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "load regulation as percentage change from no load to full load = 0.840336", + "", + "load regulation as percentage change per milliampere = 0.084034" + ] + } + ], + "prompt_number": 3 + }, + { + "cell_type": "markdown", + "source": [ + "<h3>Example 17.3, Page Number: 556<h3>" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "'''Series regulator'''", + "", + "", + "V_REF=5.1 #Zener voltage in volts", + "R2=10*10**3;", + "R3=10*10**3; #resistances in ohm", + "V_out=(1+(R2/R3))*V_REF;", + "print('output voltage in volts = %.1f'%V_out)" + ], + "language": "python", + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "output voltage in volts = 10.2" + ] + } + ], + "prompt_number": 4 + }, + { + "cell_type": "markdown", + "source": [ + "<h3>Example 17.4, Page Number: 557<h3>" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "'''Overload protection'''", + "", + "R4=1; #Resistance in Ohms", + "I_L_max=0.7/R4;", + "print('maximum current provided to load(in amperes) = %.1f'%I_L_max)" + ], + "language": "python", + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "maximum current provided to load(in amperes) = 0.7" + ] + } + ], + "prompt_number": 5 + }, + { + "cell_type": "markdown", + "source": [ + "<h3>Example 17.5, Page Number: 560<h3>" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "'''Shunt regulator'''", + "", + "V_IN=12.5; #maximum input voltage in volts", + "R1=22; #In Ohms", + "#Worst case of power dissipation is when V_OUT=0V", + "V_OUT=0;", + "V_R1=V_IN-V_OUT; #Voltage across R1", + "P_R1=(V_R1*V_R1)/R1; #maximum power dissipated by R1", + "print('maximum power dissipated by R1 in WATTS = %f'%P_R1)" + ], + "language": "python", + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "maximum power dissipated by R1 in WATTS = 7.102273" + ] + } + ], + "prompt_number": 6 + }, + { + "cell_type": "markdown", + "source": [ + "<h3>Example 17.6, Page Number: 569<h3>" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "'''Positive linear voltage regulator'''", + "", + "print('SAME AS EX-2.8 in CHAPTER-2')" + ], + "language": "python", + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "SAME AS EX-2.8 in CHAPTER-2" + ] + } + ], + "prompt_number": 7 + }, + { + "cell_type": "markdown", + "source": [ + "<h3>Example 17.7, Page Number: 572<h3>" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "'''External pass Filter'''", + "", + "I_max=700*10**-3; #in Amperes", + "R_ext=0.7/I_max;", + "print('value of resistor in Ohms for which max current is 700mA = %f'%R_ext)" + ], + "language": "python", + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "value of resistor in Ohms for which max current is 700mA = 1.000000" + ] + } + ], + "prompt_number": 8 + }, + { + "cell_type": "markdown", + "source": [ + "<h3>Example 17.8, Page Number: 572<h3>" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "'''Power rating 7824'''", + "", + "V_OUT=24.0; #Output voltage in Volts", + "R_L=10.0; #Load resistance in Ohms", + "V_IN=30.0; #Input voltage in Volts", + "I_max=700.0*10**-3; #maximum interal current in Amperes", + "I_L=V_OUT/R_L; #load current in amperes", + "I_ext=I_L-I_max; #current through the external pass transistor in Amperes", + "P_ext_Qext=I_ext*(V_IN-V_OUT); #power dissipated", + "print('power dissiated(in WATTS) by the external pass transistor = %.1f'%P_ext_Qext)", + "print('\\nFor safety purpose, we choose a power transistor with rating more than this, say 15W')" + ], + "language": "python", + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "power dissiated(in WATTS) by the external pass transistor = 10.2", + "", + "For safety purpose, we choose a power transistor with rating more than this, say 15W" + ] + } + ], + "prompt_number": 9 + }, + { + "cell_type": "markdown", + "source": [ + "<h3>Example 17.9, Page Number: 574<h3>" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "'''Current regulator'''", + "", + "V_out=5.0; #7805 gives output voltage of 5V", + "I_L=1.0; #constant current of 1A", + "R1=V_out/I_L;", + "print('The value of current-setting resistor in ohms = %d'%R1)" + ], + "language": "python", + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "The value of current-setting resistor in ohms = 5" + ] + } + ], + "prompt_number": 10 + } + ] + } + ] +}
\ No newline at end of file diff --git a/tbc/static/uploads/Hardik/C: The Basics/Chapter18.ipynb b/tbc/static/uploads/Hardik/C: The Basics/Chapter18.ipynb new file mode 100644 index 0000000..b651b59 --- /dev/null +++ b/tbc/static/uploads/Hardik/C: The Basics/Chapter18.ipynb @@ -0,0 +1,57 @@ +{ + "metadata": { + "name": "Chapter_18" + }, + "nbformat": 2, + "worksheets": [ + { + "cells": [ + { + "cell_type": "markdown", + "source": [ + "<h1>Chapter 18: Programmable Analog Arrays<h1>" + ] + }, + { + "cell_type": "markdown", + "source": [ + "<h3>Example 18.1, Page Number: 588<h3>" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "''' Switching capacitor'''", + "", + "import math", + "#Variable declaration", + "C=1000*10**-12; #Switche capacitor value in farads", + "R=1000; #resistance in ohms", + "", + "#calculation", + "T=R*C; #Time period", + "f=1/T; #Frequency at which switch should operate", + "f=math.ceil(f)", + "#Result", + "print('Frequency at which each switch should operate(in hertz) is \\n %d' %f)", + "print('Duty cycle should be 50%')" + ], + "language": "python", + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "Frequency at which each switch should operate(in hertz) is ", + " 1000000", + "Duty cycle should be 50%" + ] + } + ], + "prompt_number": 1 + } + ] + } + ] +}
\ No newline at end of file diff --git a/tbc/static/uploads/Hardik/C: The Basics/screenshots/Chapter13.png b/tbc/static/uploads/Hardik/C: The Basics/screenshots/Chapter13.png Binary files differnew file mode 100644 index 0000000..175e51b --- /dev/null +++ b/tbc/static/uploads/Hardik/C: The Basics/screenshots/Chapter13.png diff --git a/tbc/static/uploads/Hardik/C: The Basics/screenshots/Chapter5.png b/tbc/static/uploads/Hardik/C: The Basics/screenshots/Chapter5.png Binary files differnew file mode 100644 index 0000000..5ab17e3 --- /dev/null +++ b/tbc/static/uploads/Hardik/C: The Basics/screenshots/Chapter5.png diff --git a/tbc/static/uploads/Hardik/C: The Basics/screenshots/Chapter6.png b/tbc/static/uploads/Hardik/C: The Basics/screenshots/Chapter6.png Binary files differnew file mode 100644 index 0000000..782c6b2 --- /dev/null +++ b/tbc/static/uploads/Hardik/C: The Basics/screenshots/Chapter6.png diff --git a/tbc/static/uploads/Hardik/PHP/Chapter13.png b/tbc/static/uploads/Hardik/PHP/Chapter13.png Binary files differnew file mode 100644 index 0000000..175e51b --- /dev/null +++ b/tbc/static/uploads/Hardik/PHP/Chapter13.png diff --git a/tbc/static/uploads/Hardik/PHP/Chapter4.png b/tbc/static/uploads/Hardik/PHP/Chapter4.png Binary files differnew file mode 100644 index 0000000..9aa5de3 --- /dev/null +++ b/tbc/static/uploads/Hardik/PHP/Chapter4.png diff --git a/tbc/static/uploads/Hardik/PHP/Chapter6.png b/tbc/static/uploads/Hardik/PHP/Chapter6.png Binary files differnew file mode 100644 index 0000000..782c6b2 --- /dev/null +++ b/tbc/static/uploads/Hardik/PHP/Chapter6.png diff --git a/tbc/static/uploads/Jayaram/Engineering Thermodynamics/Chapter5.ipynb b/tbc/static/uploads/Jayaram/Engineering Thermodynamics/Chapter5.ipynb new file mode 100644 index 0000000..1b45662 --- /dev/null +++ b/tbc/static/uploads/Jayaram/Engineering Thermodynamics/Chapter5.ipynb @@ -0,0 +1,427 @@ +{ + "metadata": { + "name": "Chapter_5" + }, + "nbformat": 2, + "worksheets": [ + { + "cells": [ + { + "cell_type": "markdown", + "source": [ + "<h1>Chapter 5: Transistor Bias Circuits<h1>" + ] + }, + { + "cell_type": "markdown", + "source": [ + "<h3>Example 5.1, Page Number: 146<h3>" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "%pylab inline" + ], + "language": "python", + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "", + "Welcome to pylab, a matplotlib-based Python environment [backend: module://IPython.zmq.pylab.backend_inline].", + "For more information, type 'help(pylab)'." + ] + } + ], + "prompt_number": 1 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "''' Peak base current'''", + "", + "# variable declaration", + "V_BB=10.0; #voltage in volt", + "V_CC=20.0; #voltage in volt", + "B_DC=200.0; #B_DC value", + "R_B=47.0*10**3; #resistance in ohm", + "R_C=330.0; #resistance in ohm", + "V_BE=0.7; #voltage in volt", + "", + "#current", + "I_B=(V_BB-V_BE)/R_B; #base current", + "I_C=B_DC*I_B; #Q POINT", + "V_CE=V_CC-I_C*R_C; #Q POINT", + "I_C_sat=V_CC/R_C; #saturation current", + "I_c_peak=I_C_sat-I_C; #peak current ", + "I_b_peak=I_c_peak/B_DC; #peak current in ampere", + "", + "#result", + "print \"Q point of I_C = %.3f amperes\" %I_C", + "print \"Q point of V_CE = %.2f volts\" %V_CE", + "print \"peak base current = %.4f amperes\" %I_b_peak" + ], + "language": "python", + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "Q point of I_C = 0.040 amperes", + "Q point of V_CE = 6.94 volts", + "peak base current = 0.0001 amperes" + ] + } + ], + "prompt_number": 2 + }, + { + "cell_type": "markdown", + "source": [ + "<h3>Example 5.2, Page Number: 149<h3>" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "''' DC input resistance'''", + "", + "# variable declaration", + "B_DC=125.0; #DC value", + "R_E=10.0**3; #resistance in ohm", + "", + "#calculation", + "R_IN_base=B_DC*R_E; #base resistance", + "", + "#Result", + "print \"DC input resistance, looking at base of transistor = %d ohm\" %R_IN_base" + ], + "language": "python", + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "DC input resistance, looking at base of transistor = 125000 ohm" + ] + } + ], + "prompt_number": 3 + }, + { + "cell_type": "markdown", + "source": [ + "<h3>Example 5.3, Page Number: 151<h3>" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "''' Transistor saturation condition'''", + "", + "# variable declaration", + "B_DC=100; #DC value", + "R1=10*10**3; #resistance in ohm", + "R2=5.6*10**3; #resistance in ohm", + "R_C=1*10**3; #resistance in ohm", + "R_E=560; #resistance in ohm", + "V_CC=10; #voltage in volt", + "V_BE=0.7 #voltage in volt", + "", + "#calculation", + "R_IN_base=B_DC*R_E; #calculate base resistance", + "#We can neglect R_IN_base as it is equal to 10*R2", + "print \"input resistance seen from base = %d ohm\" %R_IN_base", + "print \"which can be neglected as it is 10 times R2\"", + "", + "V_B=(R2/(R1+R2))*V_CC; #base voltage", + "V_E=V_B-V_BE; #emitter voltage", + "I_E=V_E/R_E; #emitter current", + "I_C=I_E; #currents are equal", + "V_CE=V_CC-I_C*(R_C+R_E); #voltage in volt", + "", + "#result", + "print \"V_CE = %.2f volts\" %V_CE", + "print \"I_C = %.3f amperes\" %I_C", + "print \"Since V_CE>0V, transistor is not in saturation\"" + ], + "language": "python", + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "input resistance seen from base = 56000 ohm", + "which can be neglected as it is 10 times R2", + "V_CE = 1.95 volts", + "I_C = 0.005 amperes", + "Since V_CE>0V, transistor is not in saturation" + ] + } + ], + "prompt_number": 4 + }, + { + "cell_type": "markdown", + "source": [ + "<h3>Example 5.4, Page Number: 154<h3>" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "''' Emitter-Collector Voltage'''", + "", + "# variable declaration", + "V_EE=10.0; #voltage in volt", + "V_BE=0.7; #voltage in volt", + "B_DC=150.0; #DC value ", + "R1=22.0*10**3; #resistance in ohm", + "R2=10.0*10**3; #resistance in ohm", + "R_C=2.2*10**3; #resistance in ohm", + "R_E=1.0*10**3; #resistance in ohm", + "", + "#calculation", + "R_IN_base=B_DC*R_E; #R_IN_base>10*R2,so it can be neglected", + "print \"input resistance as seen from base = %d ohm\" %R_IN_base", + "print \"it can be neglected as it is greater than 10 times R2\"", + "V_B=(R1/(R1+R2))*V_EE; #base voltage", + "V_E=V_B+V_BE; #emitter voltage", + "I_E=(V_EE-V_E)/R_E; #emitter current", + "I_C=I_E; #currents are equal", + "V_C=I_C*R_C; #collector voltage", + "V_EC=V_E-V_C; #emitter-collector voltage", + "", + "#result", + "print \"I_C collector current = %.4f amperes\" %I_C", + "print \"V_EC emitter-collector voltage = %.2f Volts\" %V_EC" + ], + "language": "python", + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "input resistance as seen from base = 150000 ohm", + "it can be neglected as it is greater than 10 times R2", + "I_C collector current = 0.0024 amperes", + "V_EC emitter-collector voltage = 2.24 Volts" + ] + } + ], + "prompt_number": 5 + }, + { + "cell_type": "markdown", + "source": [ + "<h3>Example 5.5, PAge Number: 154<h3>" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "''' Collector-Emitter Voltage'''", + "", + "# variable declaration", + "R1=68.0*10**3; #resistance in ohm", + "R2=47.0*10**3; #resistance in ohm", + "R_C=1.8*10**3; #resistance in ohm", + "R_E=2.2*10**3; #resistance in ohm", + "V_CC=-6.0; #voltage in volt", + "V_BE=0.7; #voltage in volt", + "B_DC=75.0; #DC value", + "", + "#calculation", + "R_IN_base=B_DC*R_E;", + "print \"input resistance as seen from base\"", + "print \"is not greater than 10 times R2 so it should be taken into account\"", + "#R_IN_base in parallel with R2", + "V_B=((R2*R_IN_base)/(R2+R_IN_base)/(R1+(R2*R_IN_base)/(R2+R_IN_base)))*V_CC;", + "V_E=V_B+V_BE; #emitter voltage", + "I_E=V_E/R_E; #emitter current", + "I_C=I_E; #currents are equal", + "V_C=V_CC-I_C*R_C; #collector voltage", + "V_CE=V_C-V_E; #collector-emitter voltage", + "", + "#result", + "print \"collector current = %.4f amperes\" %I_C", + "print \"collector emitter voltage = %.2f volts\" %V_CE" + ], + "language": "python", + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "input resistance as seen from base", + "is not greater than 10 times R2 so it should be taken into account", + "collector current = -0.0006 amperes", + "collector emitter voltage = -3.46 volts" + ] + } + ], + "prompt_number": 6 + }, + { + "cell_type": "markdown", + "source": [ + "<h3>Example 5.6, Page Number: 156<h3>" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "''' change in collector emitter voltage'''", + "", + "# variable declaration", + "V_CC=12.0; #voltage in volt", + "R_B=100.0*10**3; #resistance in ohm", + "R_C=560.0; #resistance in ohm", + "#FOR B_DC=85 AND V_BE=0.7V", + "B_DC=85.0; #DC value", + "V_BE=0.7; #base-emitter voltage", + "", + "#calculation", + "I_C_1=B_DC*(V_CC-V_BE)/R_B; #collector current", + "V_CE_1=V_CC-I_C_1*R_C; #collector-emittor voltage", + "#FOR B_DC=100 AND V_BE=0.6V", + "B_DC=100.0; #DC value ", + "V_BE=0.6; #base emitter voltage", + "I_C_2=B_DC*(V_CC-V_BE)/R_B; #collector current", + "V_CE_2=V_CC-I_C_2*R_C; #voltage in volt", + "p_del_I_C=((I_C_2-I_C_1)/I_C_1)*100; #percent change in collector current ", + "p_del_V_CE=((V_CE_2-V_CE_1)/V_CE_1)*100; #percent change in C-E voltage", + "", + "#result", + "print \"percent change in collector current = %.2f\" %p_del_I_C", + "print \"percent change in collector emitter voltage = %.2f\" %p_del_V_CE" + ], + "language": "python", + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "percent change in collector current = 18.69", + "percent change in collector emitter voltage = -15.18" + ] + } + ], + "prompt_number": 7 + }, + { + "cell_type": "markdown", + "source": [ + "<h3>Example 5.7, Page Number: 159<h3>" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "''' percent change in collector emitter voltage'''", + "", + "# variable declaration", + "V_CC=20.0; #voltage in volt", + "R_C=4.7*10**3; #resistance in ohm", + "R_E=10.0*10**3; #resistance in ohm", + "V_EE=-20.0; #voltage in volt", + "R_B=100*10**3; #resistance in ohm", + "#FOR B_DC=85 AND V_BE=0.7V", + "B_DC=85; #DC value", + "V_BE=0.7; #base-emitter voltage", + "I_C_1=(-V_EE-V_BE)/(R_E+(R_B/B_DC));", + "V_C=V_CC-I_C_1*R_C; #colector voltage", + "I_E=I_C_1; #emittor current", + "V_E=V_EE+I_E*R_E; #emittor voltage", + "V_CE_1=V_C-V_E; #CE voltage", + "print \"I_C_1 = %.3f\" %I_C_1", + "print \"V_CE_1 = %.2f\" %V_CE_1", + "#FOR B_DC=100 AND V_BE=0.6V", + "B_DC=100; #DC value ", + "V_BE=0.6; #base-emitter voltage", + "I_C_2=(-V_EE-V_BE)/(R_E+(R_B/B_DC));", + "V_C=V_CC-I_C_2*R_C;#colector voltage", + "I_E=I_C_2; #emittor current", + "V_E=V_EE+I_E*R_E; #emittor voltage", + "V_CE_2=V_C-V_E; #CE voltage", + "print \"I_C_2 = %.3f\" %I_C_2", + "print \"V_CE_2 = %.2f\" %V_CE_2", + "", + "p_del_I_C=((I_C_2-I_C_1)/I_C_1)*100;", + "p_del_V_CE=((V_CE_2-V_CE_1)/V_CE_1)*100;", + "print \"percent change in collector currrent = %.2f\" %p_del_I_C", + "print \"percent change in collector emitter voltage = %.2f\" %p_del_V_CE", + "print \"answers in book are approximated\"" + ], + "language": "python", + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "I_C_1 = 0.002", + "V_CE_1 = 14.61", + "I_C_2 = 0.002", + "V_CE_2 = 14.07", + "percent change in collector currrent = 2.13", + "percent change in collector emitter voltage = -3.69", + "answers in book are approximated" + ] + } + ], + "prompt_number": 8 + }, + { + "cell_type": "markdown", + "source": [ + "<h3>Example 5.8, Page Number: 161<h3>" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "''' Q point current and voltage'''", + "", + "# variable declaratio", + "V_CC=10.0; #voltage in volt", + "B_DC=100.0; #Dc value", + "R_C=10.0*10**3; #resistance in ohm", + "R_B=100.0*10**3; #resistance in ohm", + "V_BE=0.7; #base-emittor voltage", + "", + "#calculation", + "I_C=(V_CC-V_BE)/(R_C+(R_B/B_DC)); #collector current", + "V_CE=V_CC-I_C*R_C; #CE voltage", + "", + "#result", + "print \"Q point of collector current %.4f amperes\" %I_C", + "print \"Q point of collector-emitter voltage %.3f volts\" %V_CE" + ], + "language": "python", + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "Q point of collector current 0.0008 amperes", + "Q point of collector-emitter voltage 1.545 volts" + ] + } + ], + "prompt_number": 9 + } + ] + } + ] +}
\ No newline at end of file diff --git a/tbc/static/uploads/Jayaram/Engineering Thermodynamics/Chapter6.ipynb b/tbc/static/uploads/Jayaram/Engineering Thermodynamics/Chapter6.ipynb new file mode 100644 index 0000000..b4e7e58 --- /dev/null +++ b/tbc/static/uploads/Jayaram/Engineering Thermodynamics/Chapter6.ipynb @@ -0,0 +1,603 @@ +{ + "metadata": { + "name": "Chapter_6" + }, + "nbformat": 2, + "worksheets": [ + { + "cells": [ + { + "cell_type": "markdown", + "source": [ + "<h1>Chapter 6: BJT Amplifiers<h1>" + ] + }, + { + "cell_type": "markdown", + "source": [ + "<h3>Example 6.1, Page Number: 171<h3>" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "%pylab inline" + ], + "language": "python", + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "", + "Welcome to pylab, a matplotlib-based Python environment [backend: module://IPython.zmq.pylab.backend_inline].", + "For more information, type 'help(pylab)'." + ] + } + ], + "prompt_number": 1 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "'''Q point'''", + "# result", + "", + "print \"theoretical example\"" + ], + "language": "python", + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "theoretical example" + ] + } + ], + "prompt_number": 2 + }, + { + "cell_type": "markdown", + "source": [ + "<h3>Example 6.2, Page Number: 174<h3>" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "''' AC Emitter resistance'''", + "", + "# variable declaration", + "I_E=2.0*10**-3; #emittor current", + "", + "#calculation", + "r_e=25.0*10**-3/I_E; #ac emitter resistance", + "", + "#result", + "print \"ac emitter resistance = %.2f ohms\" %r_e " + ], + "language": "python", + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "ac emitter resistance = 12.50 ohms" + ] + } + ], + "prompt_number": 3 + }, + { + "cell_type": "markdown", + "source": [ + "<h3>Example 6.3, Page Number: 178<h3>" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "''' voltage at base of transistor'''", + "", + "# variable declaration", + "I_E=3.8*10**-3; #emittor current", + "B_ac=160.0; #AC value", + "R1=22*10**3; #resistance in ohm", + "R2=6.8*10**3; #resistance in ohm", + "R_s=300.0; #resistance in ohm", + "V_s=10.0*10**-3; #voltage in volt", + "r_e=25.0*10**-3/I_E; ", + "", + "#calculation", + "R_in_base=B_ac*r_e; #base resistance", + "R_in_tot=(R1*R2*R_in_base)/(R_in_base*R1+R_in_base*R2+R1*R2);", + "V_b=(R_in_tot/(R_in_tot+R_s))*V_s; #base voltage", + "", + "#result", + "print \"voltage at the base of the transistor = %.3f volts\" %V_b" + ], + "language": "python", + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "voltage at the base of the transistor = 0.007 volts" + ] + } + ], + "prompt_number": 4 + }, + { + "cell_type": "markdown", + "source": [ + "<h3>Example 6.4, Page Number: 180<h3>" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "''' bypass capacitor'''", + "", + "import math", + "# variable declaration", + "R_E=560.0; #resistance in ohm", + "f=2*10**3; #minimum value of frequency in hertz", + "X_C=R_E/10.0; #minimum value of capacitive reactance", + "", + "#calculation", + "C2=1.0/(2.0*math.pi*X_C*f); #capacitor ", + "", + "#result", + "print \"value of bypass capacitor = %.7f farads\" %C2" + ], + "language": "python", + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "value of bypass capacitor = 0.0000014 farads" + ] + } + ], + "prompt_number": 5 + }, + { + "cell_type": "markdown", + "source": [ + "<h3>Example 6.5, Page Number: 181<h3>" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "''' bypass capacitor'''", + "", + "import math", + "# variable declaration", + "r_e=6.58; #from ex6.3", + "R_C=1.0*10**3; #collector resistance", + "R_E=560; #emittor resistance", + "", + "#calculation", + "A_v=R_C/(R_E+r_e); #gain without bypass capacitor", + "A_v1=R_C/r_e; #gain with bypass capacitor", + "print \"gain without bypass capacitor = %.2f\" %A_v", + "print \"gain in the presence of bypass capacitor = %.2f\" %A_v1" + ], + "language": "python", + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "gain without bypass capacitor = 1.76", + "gain in the presence of bypass capacitor = 151.98" + ] + } + ], + "prompt_number": 6 + }, + { + "cell_type": "markdown", + "source": [ + "<h3>Example 6.6, Page Number: 182<h3>" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "''' Gain with load'''", + "", + "# variable declaration", + "R_C=10.0**3; #resistance in ohm", + "R_L=5.0*10**3; #inductor resistance", + "r_e=6.58; #r_e value", + "", + "#calculation", + "R_c=(R_C*R_L)/(R_C+R_L); #collector resistor", + "A_v=R_c/r_e; #gain with load", + "", + "#result", + "print \"ac collector resistor = %.2f ohms\" %R_c", + "print \"gain with load = %.2f\" %A_v" + ], + "language": "python", + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "ac collector resistor = 833.33 ohms", + "gain with load = 126.65" + ] + } + ], + "prompt_number": 7 + }, + { + "cell_type": "markdown", + "source": [ + "<h3>Example 6.7, Page Number: 184<h3>" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "''' Voltage gain with bypass'''", + "", + "# variable declaration", + "R_C=3.3*10**3; #resistance in ohm", + "R_E1=330.0; #emitter resistance", + "", + "#calculation", + "A_v=R_C/R_E1; #voltage gain", + "", + "#result", + "print \"approximate voltage gain as R_E2 is bypassed by C2 = %.2f\" %A_v" + ], + "language": "python", + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "approximate voltage gain as R_E2 is bypassed by C2 = 10.00" + ] + } + ], + "prompt_number": 8 + }, + { + "cell_type": "markdown", + "source": [ + "<h3>Example 6.8, Page Number: 184<h3>" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "'''Common emitter amplifier'''", + "", + "import math", + "B_DC=150.0;", + "B_ac=175.0;", + "V_CC=10.0;", + "V_s=10.0*10**-3;", + "R_s=600.0;", + "R1=47.0*10**3;", + "R2=10.0*10**3;", + "R_E1=470.0;", + "R_E2=470.0;", + "R_C=4.7*10**3;", + "R_L=47.00*10**3;", + "R_IN_base=B_DC*(R_E1+R_E2);", + "#since R_IN_base is ten times more than R2,it can be neglected in DC voltage calculation", + "V_B=(R2/(R2+R1))*V_CC;", + "V_E=V_B-0.7;", + "I_E=V_E/(R_E1+R_E2);", + "I_C=I_E;", + "V_C=V_CC-I_C*R_C;", + "print('dc collector voltage = %.3f volts'%V_C)", + "r_e=25.0*10**-3/I_E;", + "#base resistance", + "R_in_base=B_ac*(r_e+R_E1);", + "#total input resistance", + "R_in_tot=(R1*R2*R_in_base)/(R1*R2+R_in_base*R1+R_in_base*R2);", + "attenuation=R_in_tot/(R_s+R_in_tot);", + "#ac collector resistance", + "R_c=R_C*R_L/(R_C+R_L);", + "#voltage gain from base to collector", + "A_v=R_c/R_E1;", + "#overall voltage gain A_V", + "A_V=A_v*attenuation;", + "#rms voltage at collector V_c", + "V_c=A_V*V_s;", + "V_out_p=math.sqrt(2)*V_c;", + "print('V_out peak = %d mV'%(V_out_p*1000))", + "", + "################Waveform plotting##############################", + "", + "import pylab", + "import numpy ", + "", + "t = arange(0.0, 4.0, 0.0005)", + "", + "", + "subplot(121)", + "plot(t, V_C+V_c*sin(2*pi*t))", + "ylim( (4.63,4.82) )", + "title('Collector Voltage')", + "", + "subplot(122)", + "plot(t, -V_s*sin(2*pi*t))", + "plot(t, V_out_p*sin(2*pi*t))", + "ylim( (-0.15,0.15) )", + "title('Source and output AC voltage')" + ], + "language": "python", + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "dc collector voltage = 4.728 volts", + "V_out peak = 119 mV" + ] + }, + { + "output_type": "pyout", + "prompt_number": 9, + "text": [ + "<matplotlib.text.Text at 0xad2caac>" + ] + }, + { + "output_type": "display_data", + "png": "iVBORw0KGgoAAAANSUhEUgAAAYQAAAEICAYAAABfz4NwAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzsnXl8VNX5/z+TzCSZrDPZdxJ2AgipuOBXJahIUcGtKtiy\n1GrBpS4t35/W6he01g33Ulv61SqogEstm4CKGKUuIF8RFSigJJCNrJNlkklme35/HGayTWbunbud\nhPt+vXhp7tx75zPnzjzPOc95znMMRETQ0dHR0TntidBagI6Ojo4OH+gOQUdHR0cHgO4QdHR0dHRO\noTsEHR0dHR0AukPQ0dHR0TmF7hB0dHR0dADoDkEQpaWlyMvL8/9dUFCAjz76SENF8lJeXo6IiAh4\nvV6tpehwyqJFi/Dggw9qLWNI0deu8MBp5RDWrl2LKVOmICEhAdnZ2bjsssvw2Wefib6PwWCAwWCQ\npEXuH9iSJUuwcOHCfsf379+PmJgYNDc3C75XSUkJXn75Zdm0DQX+/e9/47zzzoPFYkFKSgrOP/98\n7N27V2tZqiHHdz4Qy5cvx/z58zW5X0lJCZKTk+F0Ovu9JpetEENBQQF27typ6HuE4rRxCM888wzu\nuecePPDAA6irq0NFRQVuv/12bNq0SWtpYdG3N79o0SK8++676Ojo6HX8tddew+zZs2GxWATfW4kf\n/mCmtbUVV1xxBe666y7YbDZUVVVh2bJliI6Olv29PB6P7PeUi6G0hrW8vBx79uxBenp6Pxugla0w\nGAzatzGdBjQ3N1N8fDy98847A57T2dlJd911F2VnZ1N2djbdfffd1NXVRUREH3/8MeXm5vrPLSgo\noI8++oiIiLxeLz322GM0YsQISklJoeuvv56ampr85+7atYumTp1KFouF8vLy6NVXX6W///3vZDKZ\nKCoqiuLj42nOnDlERHTw4EGaNm0aWSwWGj9+PG3atMl/n4ULF9KSJUto1qxZFBcX53//nowZM4bW\nrFnj/9vtdlN2djZt2rSJvF4v/fGPf6Rhw4ZReno6LViwgFpaWoiIqKysjAwGA7ndbrr//vspMjKS\nYmJiKD4+nn7zm98QEdGdd95JeXl5lJiYSGeeeSbt2rXL/z4dHR20YMECslqtNG7cOHriiSd6tVdV\nVRVdc801lJaWRoWFhfTCCy8IeGr88NVXX5HFYhnw9WBt2/e7Q0Q0bNgw//NbtmwZXXvttfSLX/yC\nEhMT6eWXX6bGxkZatGgRZWdnk9Vqpauuusp/7ebNm2nSpElksVjovPPOo2+//XZAXcGe2bJly+i6\n666jBQsWUEJCAo0fP5727t3rf/3rr7+m4uJiSkhIoBtuuIHmzp1LDzzwgGyff8eOHbRt2zaKiooi\nk8lE8fHxNHnyZCIimjZtGt1333109tlnU2JiIl155ZX+31Q49wvEQw89RLNnz6ZHHnmErrjiCv9x\nIbaiJ19++SVlZmaS1+v1H3v33XfpjDPOICLhduUXv/gFRUREkNlspvj4eFqxYgUREf3sZz+jzMxM\nSkpKogsvvJAOHDjgf5+Ghga64oorKDExkc466yz6wx/+QOeff77/9UOHDtEll1xCycnJNGbMGHrr\nrbdCfp7TwiFs27aNjEYjeTyeAc958MEHaerUqVRfX0/19fV03nnn0YMPPkhEwR3Cc889R1OnTqWq\nqipyOp20ePFimjdvHhERlZeXU0JCAq1fv57cbjc1NjbSN998Q0REixYt8t+fiMjpdNKIESPoscce\nI5fLRTt37qSEhAQ6fPgwETGHkJSURJ9//jkRsS9aX/70pz/RJZdc4v97+/btlJaWRm63m15++WUa\nOXIklZWVkd1up2uuuYbmz59PRN0Owdc+JSUl9PLLL/e69+uvv05NTU3k8Xjo6aefpszMTP8X+957\n76WSkhJqbm6myspKmjhxIuXl5RERkcfjoZ/85Cf0xz/+kVwuFx07doyGDx9O77//fvCHxhGtra2U\nkpJCCxcupG3btvVy+EQUtG0DGbCe359ly5aRyWSijRs3EhGRw+Ggyy67jObOnUvNzc3kcrno008/\nJSJmpNPT02nPnj3k9Xpp9erVVFBQ4H8OfQn2zJYtW0YxMTG0bds28nq99Pvf/57OPfdcIiLq6uqi\n/Px8eu6558jtdtM777xDJpOp1/dVrs+/fPly/7k+pk2bRjk5OXTgwAFqb2/3O8xw7xeIESNG0Ouv\nv05Hjhwhk8lEdXV1RCTMVgS614cffuj/+2c/+xk98cQTRBS+XfHxyiuvkN1uJ6fTSXfffXcvJ3fD\nDTfQvHnzyOFw0MGDBykvL48uuOACIiKy2+2Um5tLr776Knk8Htq3bx+lpqbSwYMHg36W08IhvP76\n65SZmRn0nBEjRtC2bdv8f7///vtUUFBARMEf3Lhx43o9xOrqajKZTOR2u+nRRx+la665JuD7LVq0\n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\nAAAAAElFTkSuQmCC\n" + } + ], + "prompt_number": 9 + }, + { + "cell_type": "markdown", + "source": [ + "<h3>Example 6.9,Page Number: 190<h3>" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "''' Power gain delievered to load'''", + "", + "# variable declaration", + "R_E=10.0**3; #emitter resistance", + "R_L=10.0**3; #resistance in ohm", + "R1=18.0*10**3; #R1 in ohm", + "R2=18.0*10**3; #R2 in ohm", + "B_ac=175.0; #AC value", + "V_CC=10.0; #voltage in volt", + "V_BE=0.7; #base-emitter voltage", + "V_in=1.0; #input voltage in volt", + "", + "#calculation", + "", + "R_e=(R_E*R_L)/(R_E+R_L); #ac emitter resistance R_e", + "R_in_base=B_ac*R_e; #resistance from base R_in_base", + "", + "#total input resiatance R_in_tot", + "R_in_tot=(R1*R2*R_in_base)/(R1*R2+R1*R_in_base+R2*R_in_base);", + "print \"total input resistance = %.2f ohms\" %R_in_tot", + "V_E=((R2/(R1+R2))*V_CC)-V_BE; #emitter voltage", + "I_E=V_E/R_E; #emitter current", + "r_e=25.0*10**-3/I_E; #emitter resistance", + "A_v=R_e/(r_e+R_e);", + "print \"voltage gain = %.2f\" %A_v", + "#ac emitter current I_e", + "#V_e=A_v*V_b=1V", + "V_e=1.0; #V_evoltage", + "I_e=V_e/R_e; #emitter current", + "I_in=V_in/R_in_tot; #input current in ampere", + "A_i=I_e/I_in; #current gain", + "print \"current gain = %.2f\" %A_i", + "A_p=A_i; #power gain", + "#since R_L=R_E, one half of the total power is disspated to R_L", + "A_p_load=A_p/2.0; #power load", + "print \"power gain delivered to load = %.2f\" %A_p_load" + ], + "language": "python", + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "total input resistance = 8160.62 ohms", + "voltage gain = 0.99", + "current gain = 16.32", + "power gain delivered to load = 8.16" + ] + } + ], + "prompt_number": 10 + }, + { + "cell_type": "markdown", + "source": [ + "<h3>Example 6.10, Page Number: 193<h3>" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "''' Overall voltage gain'''", + "", + "# variable declaration", + "V_CC=12.0; #source voltage in volt", + "V_BE=0.7; #base-emitter volatge", + "R_C=1.0*10**3; #resistance in ohm", + "r_e_ce=5.0; #for common emitter amplifier", + "R1=10.0*10**3; #resistance in ohm", + "R2=22.0*10**3; #resistance in ohm ", + "R_E=22.0; #emitter resistance in ohm", + "R_L=8.0; #load resistance in ohm", + "B_DC=100.0; #dc value", + "B_ac=100.0; #ac value", + "", + "#calculation", + "pt=R2+B_DC**2*R_E #temp variable", + "V_B=((R2*B_DC**2*R_E/(pt))/(R1+(R2*B_DC**2*R_E/(pt))))*V_CC;", + "V_E=V_B-2.0*V_BE; #emitter voltage", + "I_E=V_E/R_E; #emitter current", + "r_e=25.0*10**-3/I_E; #for darlington emitter-follower", + "P_R_E=I_E**2*R_E; #power dissipated by R_E", + "P_Q2=(V_CC-V_E)*I_E #power dissipated by transistor Q2", + "R_e=R_E*R_L/(R_E+R_L); #ac emitter resi. of darlington emitter follower", + "#total input resistance of darlington", + "kt=R_e+r_e #temp varaible", + "R_in_tot=R1*R2*B_ac**2*(kt)/(R1*R2+R1*B_ac**2*(kt)+R2*B_ac**2*(kt)); ", + "R_c=R_C*R_in_tot/(R_C+R_in_tot); #effective ac resistance", + "A_v_CE=R_c/r_e_ce; #voltage gain of common emitter", + "A_v_EF=R_e/(r_e+R_e); #voltage gain of common emitter amplifier", + "A_v=A_v_CE*A_v_EF; #overall voltage gain", + "", + "#result", + "print \"voltage gain of common emitter amplifier= %.2f\" %A_v_CE", + "print \"voltage gain of common emitter amplifier= %.2f\" %A_v_EF", + "print \"overall voltage gain = %.2f\" %A_v" + ], + "language": "python", + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "voltage gain of common emitter amplifier= 172.08", + "voltage gain of common emitter amplifier= 0.99", + "overall voltage gain = 169.67" + ] + } + ], + "prompt_number": 11 + }, + { + "cell_type": "markdown", + "source": [ + "<h3>Example 6.11, Page Number: 196<h3>" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "''' voltage,current and power gain'''", + "", + "# variable declaration", + "B_DC=250.0; #dc value", + "R_C=2.2*10**3; #resistance in ohm", + "R_E=1.0*10**3; #emitter resistance", + "R_L=10.0*10**3;#load resistance", + "R1=56.0*10**3; #resistance in ohm", + "R2=12.0*10**3; #resistance in ohm", + "V_BE=0.7; #base-emitter voltage in volt", + "V_CC=10.0; #source voltage in volt", + "", + "#calculation", + "#since B_DC*R_E>>R2", + "V_B=(R2/(R1+R2))*V_CC;", + "V_E=V_B-V_BE; #emiiter voltage", + "I_E=V_E/R_E; #emitter current", + "r_e=25.0*10**-3/I_E; #r_e value", + "R_in=r_e; #input resistance", + "R_c=R_C*R_L/(R_C+R_L); #ac collector resistance", + "A_v=R_c/r_e; #current gain", + "#current gain is almost 1", + "#power gain is approximately equal to voltage gain", + "A_p=A_v; #power gain", + "A_i=1; #current gain", + "", + "#result", + "print \"input resistance = %.2f ohms\" %R_in", + "print \"voltage gain = %.2f\" %A_v", + "print \"current gain = %.2f\" %A_i", + "print \"power gain = %.2f\" %A_p" + ], + "language": "python", + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "input resistance = 23.48 ohms", + "voltage gain = 76.80", + "current gain = 1.00", + "power gain = 76.80" + ] + } + ], + "prompt_number": 12 + }, + { + "cell_type": "markdown", + "source": [ + "<h3>Example 6.12, Page Number: 197<h3>" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "''' total voltage gain in decibel'''", + "", + "import math", + "# variable declaration", + "A_v1=10.0;", + "A_v2=15.0;", + "A_v3=20.0;", + "", + "#calcultion", + "A_v=A_v1*A_v2*A_v3; #overall voltage gain", + "A_v1_dB=20.0*math.log10(A_v1); #gain in decibel", + "A_v2_dB=20.0*math.log10(A_v2); #gain in decibel", + "A_v3_dB=20.0*math.log10(A_v3); #gain in decibel", + "A_v_dB=A_v1_dB+A_v2_dB+A_v3_dB; #total gain in decibel", + "", + "#result", + "print \"overall voltage gain = %.1f\" %A_v", + "print \"Av1 = %.1f dB\" %A_v1_dB", + "print \"Av2 = %.1f dB\" %A_v2_dB", + "print \"Av3 = %.1f dB\" %A_v3_dB", + "print \"total voltage gain =%.1f dB\" %A_v_dB" + ], + "language": "python", + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "overall voltage gain = 3000.0", + "Av1 = 20.0 dB", + "Av2 = 23.5 dB", + "Av3 = 26.0 dB", + "total voltage gain =69.5 dB" + ] + } + ], + "prompt_number": 13 + } + ] + } + ] +}
\ No newline at end of file diff --git a/tbc/static/uploads/Jayaram/Engineering Thermodynamics/Chapter7.ipynb b/tbc/static/uploads/Jayaram/Engineering Thermodynamics/Chapter7.ipynb new file mode 100644 index 0000000..204325b --- /dev/null +++ b/tbc/static/uploads/Jayaram/Engineering Thermodynamics/Chapter7.ipynb @@ -0,0 +1,727 @@ +{ + "metadata": { + "name": "Chapter_7" + }, + "nbformat": 2, + "worksheets": [ + { + "cells": [ + { + "cell_type": "markdown", + "source": [ + "<h1>Chapter 7: Field-effect Transistors (FETs)<h1>" + ] + }, + { + "cell_type": "markdown", + "source": [ + "<h3>Example 7.1, Page Number: 217<h3>" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "%pylab inline" + ], + "language": "python", + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "", + "Welcome to pylab, a matplotlib-based Python environment [backend: module://IPython.zmq.pylab.backend_inline].", + "For more information, type 'help(pylab)'." + ] + } + ], + "prompt_number": 1 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "''' Constant current area of operation of JFET'''", + "", + "# variable declaration", + "V_GS_off=-4; # voltage in volt", + "I_DSS=12*10**-3; # current in ampere", + "R_D=560; # resistance in ohm", + "", + "#calculation", + "V_P=-1*V_GS_off; # volt ", + "V_DS=V_P; # Vds in volt", + "I_D=I_DSS; # current accross resistor", + "V_R_D=I_D*R_D; #voltage across resistor", + "V_DD=V_DS+V_R_D; # Vdd in volt", + "", + "# result", + "print \"The value of V_DD required to put the device in the constant\"", + "print \" current area of operation of JFET = %.2f volt\" %V_DD" + ], + "language": "python", + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "The value of V_DD required to put the device in the constant", + " current area of operation of JFET = 10.72 volt" + ] + } + ], + "prompt_number": 2 + }, + { + "cell_type": "markdown", + "source": [ + "<h3>Example 7.2, Page Number: 218<h3>" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "'''Drain current'''", + "", + "print('The p-channel JFET requires a positive gate to source voltage.')", + "print('The more positive the voltage, the lesser the drain current.')", + "print('Any further increase in V_GS keeps the JFET cut off, so I_D remains 0')" + ], + "language": "python", + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "The p-channel JFET requires a positive gate to source voltage.", + "The more positive the voltage, the lesser the drain current.", + "Any further increase in V_GS keeps the JFET cut off, so I_D remains 0" + ] + } + ], + "prompt_number": 3 + }, + { + "cell_type": "markdown", + "source": [ + "<h3>Example 7.3, Page number: 219<h3>" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "'''JFET current voltage'''", + "", + "I_DSS=9.0*10**-3;", + "V_GS_off=-8.0;", + "V_GS=0.0;", + "I_D=9.0*10**-3", + "I_D=I_DSS*(1-(V_GS/V_GS_off))**2;", + "print('Value of I_D for V_GS=0V is %f A '%I_D)", + "V_GS=-1.0", + "I_D=I_DSS*(1-(V_GS/V_GS_off))**2;", + "print('Value of I_D for V_GS=-1V is %f A'%I_D)", + "V_GS= -4.0", + "I_D=I_DSS*(1-(V_GS/V_GS_off))**2;", + "print('Value of I_D for V_GS=-4V is %f A'%I_D)" + ], + "language": "python", + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "Value of I_D for V_GS=0V is 0.009000 A ", + "Value of I_D for V_GS=-1V is 0.006891 A", + "Value of I_D for V_GS=-4V is 0.002250 A" + ] + } + ], + "prompt_number": 4 + }, + { + "cell_type": "markdown", + "source": [ + "<h3>Example 7.4, Page Number: 220<h3>" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "'''JFET transconductance'''", + "", + "#Variable Declaration", + "I_DSS=3.0*10**-3;", + "V_GS_off=-6.0;", + "y_fs_max=5000.0*10**-6;", + "V_GS=-4.0;", + "g_m0=y_fs_max;", + "", + "#Calculation", + "g_m=g_m0*(1-(V_GS/V_GS_off));", + "I_D=I_DSS*(1-(V_GS/V_GS_off))", + "", + "#Result", + "print('forward transconductance = %f Siemens'%g_m)", + "print('value of I D = %f A'%I_D)" + ], + "language": "python", + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "forward transconductance = 0.001667 Siemens", + "value of I D = 0.001000 A" + ] + } + ], + "prompt_number": 5 + }, + { + "cell_type": "markdown", + "source": [ + "<h3>Example 7.5, Page Number: 221<h3>" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "''' To find input resistance'''", + "", + "# variable declaration", + "V_GS=-20.0; # voltage in volt", + "I_GSS=-2*10**-9; # current in ampere", + "", + "#calculation", + "R_IN1=abs((-20/(2*10**-9))) # resistance in ohm", + "R_IN=R_IN1/(10**9)", + "", + "# result", + "print \"Input resistance = %d Giga ohm\" %R_IN" + ], + "language": "python", + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "Input resistance = 10 Giga ohm" + ] + } + ], + "prompt_number": 6 + }, + { + "cell_type": "markdown", + "source": [ + "<h3>Example 7.6, Page Number: 223<h3>" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "''' To find gate to source voltage'''", + "", + "# variable declaration", + "V_DD=15; # voltage in volt", + "V_G=0; # voltage in volt", + "I_D=5*10**-3; # current in ampere", + "R_D=1*10**3; # resistance in ohm", + "R_G=10*10**6; # resistance in ohm", + "R_S=220; # resistance in ohm", + "", + "# calculation", + "V_S=I_D*R_S; # source voltage in volt", + "V_D=V_DD-I_D*R_D; # drain voltage in volt", + "V_DS=V_D-V_S; # drain to source voltage in volt", + "V_GS=V_G-V_S; # gate to source voltage in volt", + "", + "# result", + "print \"Drain to source voltage = %.2f volts\" %V_DS", + "print \"Gate to source voltage = %.2f volts\" %V_GS" + ], + "language": "python", + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "Drain to source voltage = 8.90 volts", + "Gate to source voltage = -1.10 volts" + ] + } + ], + "prompt_number": 7 + }, + { + "cell_type": "markdown", + "source": [ + "<h3>Example 7.7, Page Number: 224<h3>" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "''' To find Gate resistance'''", + "", + "# variable declaration", + "V_GS=-5.0; # voltage in volt", + "I_D=6.25*10**-3; # current in ampere", + "", + "#calculation", + "R_G=abs((V_GS/I_D)) # resistance in ohm", + "", + "# result", + "print \"Gate resistance = %d ohm\" %R_G" + ], + "language": "python", + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "Gate resistance = 800 ohm" + ] + } + ], + "prompt_number": 8 + }, + { + "cell_type": "markdown", + "source": [ + "<h3>Example 7.8, Page Number: 224<h3>" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "'''Self bias Q point'''", + "", + "I_DSS=25.0*10**-3;", + "V_GS_off=15.0;", + "V_GS=5.0;", + "I_D=I_DSS*(1-(V_GS/V_GS_off))**2", + "R_S=abs((V_GS/I_D))", + "print('Drain current = %f Amperes'%I_D)", + "print('Source resistance = %.0f Ohms'%R_S)" + ], + "language": "python", + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "Drain current = 0.011111 Amperes", + "Source resistance = 450 Ohms" + ] + } + ], + "prompt_number": 9 + }, + { + "cell_type": "markdown", + "source": [ + "<h3>Example 7.9, Page Number: 225<h3>" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "''' To find Drain resistance'''", + "", + "# variable declaration", + "V_D=6; # drain voltage in volt", + "V_GS_off=-3; # off voltage in volt", + "V_DD=12; # voltage in volt", + "I_DSS=12*10**-3; # current in ampere", + "", + "#calculation", + "I_D=I_DSS/2; #MIDPOINT BIAS", + "V_GS=V_GS_off/3.4; #MIDPOINT BIAS", + "R_S=abs((V_GS/I_D)) #resistance i voltage", + "R_D=(V_DD-V_D)/I_D #resistance in voltage ", + "", + "# result", + "print \"Source resistance = %.2f ohm\" %R_S", + "print \"Drain resistance = %d ohm\" %R_D" + ], + "language": "python", + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "Source resistance = 147.06 ohm", + "Drain resistance = 1000 ohm" + ] + } + ], + "prompt_number": 10 + }, + { + "cell_type": "markdown", + "source": [ + "<h3>Example 7.10, Page Number: 227<h3>" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "''' To find transfer characteristic'''", + "", + "import pylab", + "import numpy", + "", + "# variable declaration", + "R_S=680.0; # resistance in ohm", + "I_D=0; # current in ampere", + "", + "#calculation", + "V_GS=I_D*R_S; #FOR I_D=0A", + "", + "I_DSS=4*10**-3; # current in ampere", + "I_D=I_DSS; # currents are equal", + "V_GS1=-1*I_D*R_S; #FOR I_D=4mA", + "", + "# result", + "print \"V_GS at I_D=0amp is %d volt\" %V_GS", + "print \"V_GS at I_D=4mA is %.2f volt\" %V_GS1", + "print \"Plotting load line using the values of V_GS at I_D=0 and 4mA,\"", + "print \" we find the intersection of load line with transfer characteristic\"", + "print \" to get Q-point values of V_GS=-1.5V and I_D=2.25mA\"", + "", + "#########PLOT######################", + "idss=4", + "vgsoff=-6", + "vgs=arange(-6.0,0.0,0.0005)", + "idk=arange(0.0,4.0,0.0005)", + "ids=arange(0.0,2.25,0.0005)", + "vgsk=-idk*0.68", + "i_d=idss*(1-(vgs/vgsoff))**2", + "", + "plot(vgs,i_d)", + "plot(vgsk,idk)", + "#ax1.plot(ids)", + "plot(-1.5,2.25,'*')", + "ylim( (0,5) )", + "title('Transfer characteristic curve')", + "xlabel('* shows the Q point ie (Id=2.25mA,vgs=-1.5V) Vgs')", + "ylabel('Idss')" + ], + "language": "python", + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "V_GS at I_D=0amp is 0 volt", + "V_GS at I_D=4mA is -2.72 volt", + "Plotting load line using the values of V_GS at I_D=0 and 4mA,", + " we find the intersection of load line with transfer characteristic", + " to get Q-point values of V_GS=-1.5V and I_D=2.25mA" + ] + }, + { + "output_type": "pyout", + "prompt_number": 11, + "text": [ + "<matplotlib.text.Text at 0xa3b07ec>" + ] + }, + { + "output_type": "display_data", + "png": "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\nSz0fFxdHvr6+4s9PnjwhIqGl/r///Y+IiPbt20fdu3cnIqJly5aJy7X+/fffZG1tTfn5+bR48WJa\ntWoVPXnyhDw9Palnz55EROTt7U2JiYm0fPlyWrBgARERKRQKevr06QuxPt8i0tHRoejoaCIimj59\nOn355ZdERBQUFEQnT54kImGqu5OT0wvHGjhwIO3evbvUY48fPyYzM7MXtp07dy65u7tTfn4+ZWZm\nkpWVFaWmptL27dvJ19eXFAoFpaenk7W1Nd2/f79UCzUsLIzs7OwoOzub8vPzqVmzZnT37l0ienlL\nvfi1xsfHU79+/aioqIiIiCZOnEibNm16YfuePXuWmhZevH9cXBy5uLhQXl4eZWdnk4ODg9gCXLp0\nKbm7u7/wNXny5BeOv23btlL/D8rTt29f+vXXX4lIaKm/+eab5O7uTl27dqUTJ06I2+no6FBMTAwR\nEQUEBJCvry8VFRXRn3/+Se7u7uJ248aNoy1btlBOTg5ZWlqK16GkFStW0Ny5c4mIKDU1lZo3b05E\nRJMmTRKnlMfExJCOjg5lZWXR9u3bafz48eL+xf+np06dWub1+Oqrr176ml/VUq9Vqxa1bt2a3n77\nbfrtt9/Ex5ctW0ZTp04lImE6fNu2bUvtZ2trSzk5OS89d3ni4uLIw8ODiIjy8/OpUaNG9OjRIyIi\natWqFZ09e5aIiGbOnEkuLi5ERPTBBx+I711hYaFGLqPASb2E0NDQMh9/9OgR2dvb04cffkgxMTGk\nUCiISEjqp0+fJiKi+/fvk4ODAxEJv6AlPyZ37tyZrly5QqdOnaKhQ4fSvn37KDQ0lDp16kS5ublk\nY2NDRETHjx8nBwcHCg0NpcuXL5cZy/O/PLVr1xa/37p1K40bN46IiBo2bFjql9LS0pKePXtW6lgD\nBw6kqKioUo89fvyY6tatW+a1KU4aRESjRo2i3377jaZOnUphYWHi4yNHjqTdu3e/kNRLJpBevXrR\nqVOniOjVST0zM5O+++47atq0qfhamjdvTvPmzXtheycnJ0pNTX1h/5IJj4jo448/rnD3S7Fr166R\nvb093bhx46XbffnllzRw4EDx53///ZcePnxIREQXLlwgKysr8Y91yfduzpw5tHDhQiISug7q1asn\n7m9hYSEmtkGDBol/xEu6d++euEbNN998Q7NnzyYiInd3d0pJSRG3q1+/PmVlZVFiYiLZ2NjQjBkz\n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\n" + } + ], + "prompt_number": 11 + }, + { + "cell_type": "markdown", + "source": [ + "<h3>Example 7.11, Page Number: 228<h3>" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "''' To find gate to source voltage'''", + "", + "# variable declaration", + "V_DD=12; # voltage in volt", + "V_D=7; # voltage in volt", + "R_D=3.3*10**3; # resistance in ohm", + "R_S=2.2*10**3; # resistance in ohm", + "R_1=6.8*10**6; # resistance in ohm", + "R_2=1*10**6; # resistance in ohm", + "", + "#calculation", + "I_D=(V_DD-V_D)/R_D; # drain current in ampere", + "V_S=I_D*R_S; # source voltage in volt", + "V_G=(R_2/(R_1+R_2))*V_DD; # gate voltage in volt", + "V_GS=V_G-V_S; # gate to source voltage in volt", + "", + "# result", + "print \"Drain Current = %.4f Ampere\" %I_D", + "print \"Gate to source voltage = %.4f volts\" %V_GS" + ], + "language": "python", + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "Drain Current = 0.0015 Ampere", + "Gate to source voltage = -1.7949 volts" + ] + } + ], + "prompt_number": 12 + }, + { + "cell_type": "markdown", + "source": [ + "<h3>Example 7.12, Page Number: 229<h3>" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "''' To find transfer characteristic for Q-point'''", + "", + "# variable declaration", + "R_1=2.2*10**6; # resistance in ohm ", + "R_2=R_1; # resistance in ohm", + "V_DD=8; # voltage in volt", + "R_S=3.3*10**3; # resistance in ohm", + "", + "#calculation", + "V_GS=(R_2/(R_1+R_2))*V_DD; #FOR I_D=0A", + "V_G=V_GS; # voltage in volt", + "I_D=(V_G-0)/R_S; #FOR V_GS=0V", + "", + "# result", + "print \"V_GS = %d volt\" %V_GS", + "print \"at V_GS=0V. I_D = %.4f ampere\" %I_D", + "print \"Plotting load line using the value of V_GS=4V at I_D=0\"", + "print \" and I_D=1.2mA at V_GS=0V, we find the intersection of\"", + "print \" load line with transfer characteristic to get Q-point\"", + "print \" values of V_GS=-1.8V and I_D=1.8mA\"" + ], + "language": "python", + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "V_GS = 4 volt", + "at V_GS=0V. I_D = 0.0012 ampere", + "Plotting load line using the value of V_GS=4V at I_D=0", + " and I_D=1.2mA at V_GS=0V, we find the intersection of", + " load line with transfer characteristic to get Q-point", + " values of V_GS=-1.8V and I_D=1.8mA" + ] + } + ], + "prompt_number": 13 + }, + { + "cell_type": "markdown", + "source": [ + "<h3>Example 7.13, Page Number: 235<h3>" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "'''DMOSFET'''", + "", + "I_DSS=10.0*10**-3;", + "V_GS_off=-8.0;", + "V_GS=-3.0;", + "I_D=I_DSS*(1-(V_GS/V_GS_off))**2;", + "print('Drain current when V_GS=-3V is %f Amperes'%I_D)", + "V_GS=3;", + "I_D=I_DSS*(1-(V_GS/V_GS_off))**2;", + "print('Drain current when V_GS=3V is %f Amperes'%I_D)" + ], + "language": "python", + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "Drain current when V_GS=-3V is 0.003906 Amperes", + "Drain current when V_GS=3V is 0.018906 Amperes" + ] + } + ], + "prompt_number": 14 + }, + { + "cell_type": "markdown", + "source": [ + "<h3>Example 7.14, Page Number: 236<h3>" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "'''EMOSFET'''", + "", + "#variable Declaration", + "I_D_on=500.0*10**-3;", + "V_GS=10.0;", + "V_GS_th=1.0;", + "K=I_D_on/((V_GS-V_GS_th)**2)", + "V_GS=5.0;", + "I_D=K*(V_GS-V_GS_th)**2;", + "print('Drain current = %f A'%I_D)" + ], + "language": "python", + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "Drain current = 0.098765 A" + ] + } + ], + "prompt_number": 15 + }, + { + "cell_type": "markdown", + "source": [ + "<h3>Example 7.15, Page Number: 237<h3>" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "''' To find drain to source voltage'''", + "", + "# variable declaration", + "I_DSS=12*10**-3; # currenin ampere", + "V_DD=18; # voltage in volt", + "R_D=620; # resistance in oh", + "", + "#calculation", + "I_D=I_DSS; # currents are equal", + "V_DS=V_DD-I_D*R_D; # drain to source voltage", + "", + "# result", + "print \"Drain to sorce voltage = %.2f volt\" %V_DS" + ], + "language": "python", + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "Drain to sorce voltage = 10.56 volt" + ] + } + ], + "prompt_number": 16 + }, + { + "cell_type": "markdown", + "source": [ + "<h3>Example 7.16, Page Number: 238<h3>" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "'''EMOSFET bias'''", + "", + "#variable Declaration", + "I_D_on=200.0*10**-3;", + "V_DD=24.0;", + "R_D=200.0;", + "V_GS=4.0;", + "V_GS_th=2.0;", + "R_1=100.0*10**3;", + "R_2=15.0*10**3;", + "", + "#Calculation ", + "K=I_D_on/((V_GS-V_GS_th)**2)", + "V_GS=(R_2/(R_1+R_2))*V_DD;", + "I_D=K*(V_GS-V_GS_th)**2;", + "V_DS=V_DD-I_D*R_D;", + "", + "#Result", + "print('Drain to Source voltage = %f V'%V_DS)", + "print('Gate to Source voltage = %f V'%V_GS)" + ], + "language": "python", + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "Drain to Source voltage = 11.221172 V", + "Gate to Source voltage = 3.130435 V" + ] + } + ], + "prompt_number": 17 + }, + { + "cell_type": "markdown", + "source": [ + "<h3>Example 7.17, Page Number: 239<h3>" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "''' To find drain current'''", + "", + "# variable declaration", + "V_GS_on=3; # voltage in volt", + "V_GS=8.5 #voltage displayed on meter", + "V_DS=V_GS; # voltages are equal ", + "V_DD=15; # voltage in volt", + "R_D=4.7*10**3; # resistance in ohm", + "", + "#calculation", + "I_D=(V_DD-V_DS)/R_D; # drain current", + "", + "# result", + "print \"Drain current = %.4f ampere\" %I_D" + ], + "language": "python", + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "Drain current = 0.0014 ampere" + ] + } + ], + "prompt_number": 18 + } + ] + } + ] +}
\ No newline at end of file diff --git a/tbc/static/uploads/Jayaram/Engineering Thermodynamics/screenshots/Chapter7.png b/tbc/static/uploads/Jayaram/Engineering Thermodynamics/screenshots/Chapter7.png Binary files differnew file mode 100644 index 0000000..0036b02 --- /dev/null +++ b/tbc/static/uploads/Jayaram/Engineering Thermodynamics/screenshots/Chapter7.png diff --git a/tbc/static/uploads/Jayaram/Engineering Thermodynamics/screenshots/nb.png b/tbc/static/uploads/Jayaram/Engineering Thermodynamics/screenshots/nb.png Binary files differnew file mode 100644 index 0000000..d6e06b1 --- /dev/null +++ b/tbc/static/uploads/Jayaram/Engineering Thermodynamics/screenshots/nb.png diff --git a/tbc/static/uploads/Jayaram/Engineering Thermodynamics/screenshots/try.png b/tbc/static/uploads/Jayaram/Engineering Thermodynamics/screenshots/try.png Binary files differnew file mode 100644 index 0000000..57ad0f1 --- /dev/null +++ b/tbc/static/uploads/Jayaram/Engineering Thermodynamics/screenshots/try.png diff --git a/tbc/static/uploads/Jayumar/Chemical Engineering Basics/Chapter10.ipynb b/tbc/static/uploads/Jayumar/Chemical Engineering Basics/Chapter10.ipynb new file mode 100644 index 0000000..8864497 --- /dev/null +++ b/tbc/static/uploads/Jayumar/Chemical Engineering Basics/Chapter10.ipynb @@ -0,0 +1,719 @@ +{ + "metadata": { + "name": "Chapter_10" + }, + "nbformat": 2, + "worksheets": [ + { + "cells": [ + { + "cell_type": "markdown", + "source": [ + "<h1>Chapter 10: Amplifier Frequency Response<h1>" + ] + }, + { + "cell_type": "markdown", + "source": [ + "<h3>Example 10.1, Page Number: 311<h3>" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "'''Gain in decibel'''", + "", + "import math", + "#Pout/P in=250;", + "A_p=250.0", + "A_p_dB=10*math.log10(A_p)", + "print('Power gain(dB) when power gain is 250 = %d'% math.ceil(A_p_dB));", + "A_p=100.0", + "A_p_dB=10*math.log10(A_p)", + "print('Power gain(dB) when power gain is 100 = %d'%A_p_dB)", + "A_p=10.0", + "A_p_dB=20*math.log10(A_p)", + "print('Voltage gain(dB) when Voltage gain is 10 = %d'%A_p_dB)", + "A_p=0.50", + "A_p_dB=10*math.log10(A_p)", + "print('Power gain(dB) when voltage gain is 0.50 = %d'%A_p_dB)", + "A_p=0.707", + "A_p_dB=20*math.log10(A_p)", + "print('Power gain(dB) when power gain is 0.707 = %d'%A_p_dB)" + ], + "language": "python", + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "Power gain(dB) when power gain is 250 = 24", + "Power gain(dB) when power gain is 100 = 20", + "Voltage gain(dB) when Voltage gain is 10 = 20", + "Power gain(dB) when voltage gain is 0.50 = -3", + "Power gain(dB) when power gain is 0.707 = -3" + ] + } + ], + "prompt_number": 19 + }, + { + "cell_type": "markdown", + "source": [ + "<h3>Example 10.2, Page Number: 313<h3>" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "'''Gain in decibel'''", + "", + "", + "#input voltage=10V", + "#at -3dB voltage gain from table is 0.707", + "v_out=0.707*10;", + "print('output voltage in volts at -3dB gain = %.2f'%v_out)", + "#at -6dB voltage gain from table is 0.5", + "v_out=0.5*10;", + "print('output voltage in volts at -6dB gain = %d'%v_out)", + "#at -12dB voltage gain from table is 0.25", + "v_out=0.25*10;", + "print('output voltage in volts at -12dB gain = %.1f'%v_out)", + "#at -24dB voltage gain from table is 0.0625", + "v_out=0.0625*10;", + "print('output voltage in volts at -24dB gain = %.3f'%v_out)" + ], + "language": "python", + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "output voltage in volts at -3dB gain = 7.07", + "output voltage in volts at -6dB gain = 5", + "output voltage in volts at -12dB gain = 2.5", + "output voltage in volts at -24dB gain = 0.625" + ] + } + ], + "prompt_number": 20 + }, + { + "cell_type": "markdown", + "source": [ + "<h3>Example 10.3, Page Number: 316<h3>" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "'''Lower critical frequency'''", + "", + "import math", + "R_in=1.0*10**3;", + "C1=1.0*10**-6;", + "A_v_mid=100.0; #mid range voltage gain", + "f_c=1/(2*math.pi*R_in*C1);", + "#at f_c, capacitive reactance is equal to resistance(X_C1=R_in)", + "attenuation=0.707;", + "#A_v is gain at lower critical frequency", + "A_v=0.707*A_v_mid;", + "print('lower critical frequency = %f Hz'%f_c)", + "print('attenuation at lower critical frequency =%.3f'%attenuation)", + "print('gain at lower critical frequency = %.1f'%A_v)" + ], + "language": "python", + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "lower critical frequency = 159.154943 Hz", + "attenuation at lower critical frequency =0.707", + "gain at lower critical frequency = 70.7" + ] + } + ], + "prompt_number": 21 + }, + { + "cell_type": "markdown", + "source": [ + "<h3>Example 10.4, Page Number: 317<h3>" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "'''Voltage gains'''", + "", + "A_v_mid=100.0;", + "#At 1Hz frequency,voltage gain is 3 dB less than at midrange. At -3dB, the voltage is reduced by a factor of 0.707", + "A_v=0.707*A_v_mid;", + "print('actual voltage gain at 1Hz frequency = %.1f'%A_v)", + "#At 100Hz frequency,voltage gain is 20 dB less than at critical frequency (f_c ). At -20dB, the voltage is reduced by a factor of 0.1", + "A_v=0.1*A_v_mid;", + "print('actual voltage gain at 100Hz frequency = %d'%A_v)", + "#At 10Hz frequency,voltage gain is 40 dB less than at critical frequency (f_c). At -40dB, the voltage is reduced by a factor of 0.01", + "A_v=0.01*A_v_mid;", + "print('actual voltage gain at 10Hz frequency = %d'%A_v)" + ], + "language": "python", + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "actual voltage gain at 1Hz frequency = 70.7", + "actual voltage gain at 100Hz frequency = 10", + "actual voltage gain at 10Hz frequency = 1" + ] + } + ], + "prompt_number": 22 + }, + { + "cell_type": "markdown", + "source": [ + "<h3>Example 10.5, Page Number: 319<h3>" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "'''Output RC circuit'''", + "", + "import math", + "R_C=10.0*10**3;", + "C3=0.1*10**-6;", + "R_L=10*10**3;", + "A_v_mid=50;", + "f_c=1/(2*math.pi*(R_L+R_C)*C3);", + "print('lower critical frequency = %f Hz'%f_c)", + "#at midrange capacitive reactance is zero", + "X_C3=0;", + "attenuation=R_L/(R_L+R_C); ", + "print('attenuation at midrange frequency = %.1f'%attenuation)", + "#at critical frequency, capacitive reactance equals total resistance", + "X_C3=R_L+R_C;", + "attenuation=R_L/(math.sqrt((R_C+R_L)**2+X_C3**2));", + "print('attenuation at critical frequency = %f'%attenuation)", + "A_v=0.707*A_v_mid;", + "print('gain at critical frequency = %.2f'%A_v)" + ], + "language": "python", + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "lower critical frequency = 79.577472 Hz", + "attenuation at midrange frequency = 0.5", + "attenuation at critical frequency = 0.353553", + "gain at critical frequency = 35.35" + ] + } + ], + "prompt_number": 23 + }, + { + "cell_type": "markdown", + "source": [ + "<h3>Example 10.6, Page Number: 321<h3>" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "'''Bypass RC circuit BJT'''", + "", + "import math", + "B_ac=100.0;", + "r_e=12.0;", + "R1=62.0*10**3;", + "R2=22.0*10**3;", + "R_S=1.0*10**3;", + "R_E=1.0*10**3;", + "C2=100.0*10**-6;", + "#Base circuit impedance= parallel combination of R1, R2, R_S", + "R_th=(R1*R2*R_S)/(R1*R2+R2*R_S+R_S*R1);", + "#Resistance looking at emitter", + "R_in_emitter=r_e+(R_th/B_ac);", + "#resistance of equivalent bypass RC is parallel combination of R_E,R_in_emitter", + "R=(R_in_emitter*R_E)/(R_E+R_in_emitter);", + "f_c=1/(2*math.pi*R*C2);", + "print('critical frequency of bypass RC circuit = %f Hz'%f_c)" + ], + "language": "python", + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "critical frequency of bypass RC circuit = 75.893960 Hz" + ] + } + ], + "prompt_number": 24 + }, + { + "cell_type": "markdown", + "source": [ + "<h3>Example 10.7, Page Number:323<h3>" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "'''input RC circuit FET'''", + "", + "import math", + "V_GS=-10.0;", + "I_GSS=25.0*10**-9;", + "R_G=10.0*10**6;", + "C1=0.001*10**-6;", + "R_in_gate=abs((V_GS/I_GSS));", + "R_in=(R_in_gate*R_G)/(R_G+R_in_gate);", + "f_c=1/(2*math.pi*R_in*C1);", + "print('critical frequency = %f Hz'%f_c)" + ], + "language": "python", + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "critical frequency = 16.313382 Hz" + ] + } + ], + "prompt_number": 25 + }, + { + "cell_type": "markdown", + "source": [ + "<h3>Example 10.8, Page Number: 324<h3>" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "'''Low frequency response FET'''", + "", + "import math", + "V_GS=-12.0;", + "I_GSS=100.0*10**-9;", + "R_G=10.0*10**6;", + "R_D=10.0*10**3;", + "C1=0.001*10**-6;", + "C2=0.001*10**-6;", + "R_in_gate=abs((V_GS/I_GSS));", + "R_in=(R_in_gate*R_G)/(R_G+R_in_gate);", + "R_L=R_in; #according to question", + "f_c_input=1/(2*math.pi*R_in*C1);", + "print('critical frequency of input RC circuit = %f Hz'%f_c_input)", + "f_c_output=1/(2*math.pi*(R_D+R_L)*C2)", + "print('critical frequency of output RC circuit = %f Hz'%f_c_output)" + ], + "language": "python", + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "critical frequency of input RC circuit = 17.241786 Hz", + "critical frequency of output RC circuit = 17.223127 Hz" + ] + } + ], + "prompt_number": 26 + }, + { + "cell_type": "markdown", + "source": [ + "<h3>Example 10.9, Page Number: 327<h3>" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "'''Low frequency response BJT'''", + "", + "import math", + "B_ac=100.0;", + "r_e=16.0;", + "R1=62.0*10**3;", + "R2=22.0*10**3;", + "R_S=600.0;", + "R_E=1.0*10**3;", + "R_C=2.2*10**3;", + "R_L=10.0*10**3;", + "C1=0.1*10**-6;", + "C2=10.0*10**-6;", + "C3=0.1*10**-6;", + "#input RC circuit", + "R_in=(B_ac*r_e*R1*R2)/(B_ac*r_e*R1+B_ac*r_e*R2+R1*R2);", + "f_c_input=1/(2*math.pi*(R_S+R_in)*C1);", + "print('input frequency = %f Hz'%f_c_input)", + "#For bypass circuit; Base circuit impedance= parallel combination of R1, R2, R_S", + "R_th=(R1*R2*R_S)/(R1*R2+R2*R_S+R_S*R1);", + "#Resistance looking at emitter", + "R_in_emitter=r_e+(R_th/B_ac);", + "#resistance of equivalent bypass RC is parallel combination of R_E,R_in_emitter", + "R=(R_in_emitter*R_E)/(R_E+R_in_emitter);", + "f_c_bypass=1/(2*math.pi*R*C2);", + "print('critical frequency of bypass RC circuit = %f Hz'%f_c_bypass)", + "f_c_output=1/(2*math.pi*(R_C+R_L)*C3)", + "print('output frequency circuit = %f Hz'%f_c_output)", + "R_c=R_C*R_L/(R_C+R_L);", + "A_v_mid=R_c/r_e;", + "attenuation=R_in/(R_in+R_S);", + "A_v=attenuation*A_v_mid; #overall voltage gain", + "A_v_mid_dB=20*math.log10(A_v); ", + "print('overall voltage gain in dB = %f'%A_v_mid_dB)" + ], + "language": "python", + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "input frequency = 773.916632 Hz", + "critical frequency of bypass RC circuit = 746.446517 Hz", + "output frequency circuit = 130.454871 Hz", + "overall voltage gain in dB = 38.042470" + ] + } + ], + "prompt_number": 27 + }, + { + "cell_type": "markdown", + "source": [ + "<h3>Example 10.10, Page Number: 330<h3>" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "'''input RC circuit BJT'''", + "", + "import math", + "B_ac=125.0;", + "C_be=20.0*10**-12;", + "C_bc=2.4*10**-12;", + "R1=22.0*10**3;", + "R2=4.7*10**3;", + "R_E=470.0;", + "R_S=600.0;", + "R_L=2.2*10**3;", + "V_CC=10.0;", + "V_B=(R2/(R1+R2))*V_CC;", + "V_E=V_B-0.7;", + "I_E=V_E/R_E;", + "r_e=25.0*10**-3/I_E;", + "#total resistance of input circuit is parallel combination of R1,R2,R_s,B_ac*r_e", + "R_in_tot=B_ac*r_e*R1*R2*R_S/(B_ac*r_e*R1*R2+B_ac*r_e*R1*R_S+B_ac*r_e*R2*R_S+R1*R2*R_S);", + "R_c= 1100.0#R_C*R_L/(R_C+R_L)", + "A_v_mid=R_c/r_e;", + "C_in_Miller=C_bc*(A_v_mid+1)", + "C_in_tot=C_in_Miller+C_be;", + "C_in_tot=C_in_tot*10**10", + "f_c=1/(2*math.pi*R_in_tot*C_in_tot);", + "print('total resistance of circuit = %f Ohm'%R_in_tot)", + "print('total capacitance = %f * 10^-10 F'%C_in_tot)", + "print('critical frequency = %f Hz'%f_c)" + ], + "language": "python", + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "total resistance of circuit = 377.815676 Ohm", + "total capacitance = 2.606290 * 10^-10 F", + "critical frequency = 0.000162 Hz" + ] + } + ], + "prompt_number": 28 + }, + { + "cell_type": "markdown", + "source": [ + "<h3>Example 10.11, Page Number: 333<h3>" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "'''Critical frequency BJT output'''", + "", + "import math", + "C_bc=2.4*10**-12; #from previous question", + "A_v=99.0; #from previous question", + "R_C=2.2*10**3;", + "R_L=2.2*10**3;", + "R_c=R_C*R_L/(R_C+R_L);", + "C_out_Miller=C_bc*(A_v+1)/A_v;", + "f_c=1/(2*math.pi*R_c*C_bc); #C_bc is almost equal to C_in_Miller", + "C_out_Miller=C_out_Miller*10**12", + "print('equivalent resistance = %d Ohm'%R_c)", + "print('equivalent capacitance =%f *10^-12 F'%C_out_Miller)", + "print('critical frequency =%f Hz'%f_c)" + ], + "language": "python", + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "equivalent resistance = 1100 Ohm", + "equivalent capacitance =2.424242 *10^-12 F", + "critical frequency =60285963.292385 Hz" + ] + } + ], + "prompt_number": 29 + }, + { + "cell_type": "markdown", + "source": [ + "<h3>Example 10.12, Page Number: 334<h3>" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "'''FET capacitors'''", + "", + "C_iss=6.0*10**-12;", + "C_rss=2.0*10**-12;", + "C_gd=C_rss;", + "C_gs=C_iss-C_rss;", + "C_gd=C_gd*10**12", + "C_gs=C_gs*10**12", + "print('gate to drain capacitance = %.1f * 10^-12 F'%C_gd)", + "print('gate to source capacitance = %.1f * 10^-12 F'%C_gs)" + ], + "language": "python", + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "gate to drain capacitance = 2.0 * 10^-12 F", + "gate to source capacitance = 4.0 * 10^-12 F" + ] + } + ], + "prompt_number": 30 + }, + { + "cell_type": "markdown", + "source": [ + "<h3>Example 10.13, Page Number:335 <h3>" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "'''Critical frequency FET input'''", + "", + "import math", + "C_iss=8.0*10**-12;", + "C_rss=3.0*10**-12;", + "g_m=6500.0*10**-6; #in Siemens", + "R_D=1.0*10**3;", + "R_L=10.0*10**6;", + "R_s=50.0;", + "C_gd=C_rss;", + "C_gs=C_iss-C_rss;", + "R_d=R_D*R_L/(R_D+R_L);", + "A_v=g_m*R_d;", + "C_in_Miller=C_gd*(A_v+1);", + "C_in_tot=C_in_Miller+C_gs;", + "f_c=1/(2*math.pi*C_in_tot*R_s);", + "print('critical frequency of input RC circuit =%.3f *10^8 Hz'%(f_c*10**-8))" + ], + "language": "python", + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "critical frequency of input RC circuit =1.158 *10^8 Hz" + ] + } + ], + "prompt_number": 31 + }, + { + "cell_type": "markdown", + "source": [ + "<h3>Example 10.14, Page Number: 336<h3>" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "'''Critical frequency FET input'''", + "", + "import math", + "C_gd=3.0*10**-12; #from previous question", + "A_v=6.5; #from previous question", + "R_d=1.0*10**3; #from previous question", + "C_out_Miller=C_gd*(A_v+1)/A_v;", + "f_c=1/(2*math.pi*R_d*C_out_Miller);", + "print('critical frequency of the output circuit = %d Hz'%f_c)" + ], + "language": "python", + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "critical frequency of the output circuit = 45978094 Hz" + ] + } + ], + "prompt_number": 32 + }, + { + "cell_type": "markdown", + "source": [ + "<h3>Example 10.15, Page Number: 339<h3>" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "'''Bandwidth'''", + "", + "f_cu=2000.0;", + "f_cl=200.0;", + "BW=f_cu-f_cl;", + "print('bandwidth = %d Hz'%BW)" + ], + "language": "python", + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "bandwidth = 1800 Hz" + ] + } + ], + "prompt_number": 33 + }, + { + "cell_type": "markdown", + "source": [ + "<h3>Example 10.16, Page Number: 340<h3>" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "'''Bandwidth transistor'''", + "", + "f_T=175.0*10**6; #in hertz", + "A_v_mid=50.0;", + "BW=f_T/A_v_mid;", + "print('bandwidth = %d Hz'%BW)" + ], + "language": "python", + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "bandwidth = 3500000 Hz" + ] + } + ], + "prompt_number": 34 + }, + { + "cell_type": "markdown", + "source": [ + "<h3>Example 10.17, Page Number: 341<h3>" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "'''Bandwidth 2stage amplifier'''", + "", + "f_cl=1.0*10**3; #lower critical frequency of 2nd stage in hertz", + "f_cu=100.0*10**3; #upper critical frequency of 1st stage in hertz", + "BW=f_cu-f_cl;", + "print('bandwidth = %d Hz'%BW)" + ], + "language": "python", + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "bandwidth = 99000 Hz" + ] + } + ], + "prompt_number": 35 + }, + { + "cell_type": "markdown", + "source": [ + "<h3>Example 10.18, Page Number: 341<h3>" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "'''Bandwidth 2stage amplifier'''", + "", + "import math", + "n=2.0; #n is the number of stages of amplifier", + "f_cl=500.0;", + "f_cu=80.0*10**3;", + "f_cl_new=f_cl/(math.sqrt(2**(1/n)-1));", + "f_cu_new=f_cu*(math.sqrt(2**(1/n)-1));", + "BW=f_cu_new-f_cl_new;", + "print('bandwidth = %f Hz'%BW)" + ], + "language": "python", + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "bandwidth = 50710.653245 Hz" + ] + } + ], + "prompt_number": 36 + } + ] + } + ] +}
\ No newline at end of file diff --git a/tbc/static/uploads/Jayumar/Chemical Engineering Basics/Chapter8.ipynb b/tbc/static/uploads/Jayumar/Chemical Engineering Basics/Chapter8.ipynb new file mode 100644 index 0000000..68824e8 --- /dev/null +++ b/tbc/static/uploads/Jayumar/Chemical Engineering Basics/Chapter8.ipynb @@ -0,0 +1,432 @@ +{ + "metadata": { + "name": "Chapter_8" + }, + "nbformat": 2, + "worksheets": [ + { + "cells": [ + { + "cell_type": "markdown", + "source": [ + "<h1>Chapter 8: FET Amplifiers<h1>" + ] + }, + { + "cell_type": "markdown", + "source": [ + "<h3>Example 8.1, Page Number: 253<h3>" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "''' Voltage gain'''", + "", + "# variable declaration", + "g_m=4.0*10**-3; #gm value", + "R_d=1.5*10**3; #resistance", + "", + "#calculation", + "A_v=g_m*R_d; #voltage gain", + "", + "#result", + "print \"Voltage gain = %.2f\" %A_v" + ], + "language": "python", + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "Voltage gain = 6.00" + ] + } + ], + "prompt_number": 1 + }, + { + "cell_type": "markdown", + "source": [ + "<h3>Example 8.2, Page Number: 253<h3>" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "''' The Voltage gain'''", + "", + "# variable declaration", + "r_ds=10.0*10**3;", + "R_d=1.5*10**3; #from previous question", + "g_m=4.0*10**-3; #from previous question", + "", + "#calculation", + "A_v=g_m*((R_d*r_ds)/(R_d+r_ds)); #voltage gain", + "", + "#result", + "print \"Voltage gain = %.2f\" %A_v" + ], + "language": "python", + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "Voltage gain = 5.22" + ] + } + ], + "prompt_number": 2 + }, + { + "cell_type": "markdown", + "source": [ + "<h3>Example 8.3, Page Number:254<h3>" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "''' To find Voltage gain'''", + "", + "# variable declaration", + "R_s=560; #resistance in ohm", + "R_d=1.5*10**3; #resistance in ohm", + "g_m=4*10**-3; #g_m value", + "", + "#calculation", + "A_v=(g_m*R_d)/(1+(g_m*R_s)) #voltage gain", + "", + "#result", + "print \"Voltage gain = %.2f\" %A_v" + ], + "language": "python", + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "Voltage gain = 1.85" + ] + } + ], + "prompt_number": 3 + }, + { + "cell_type": "markdown", + "source": [ + "<h3>Example 8.4, Page Number: 257<h3>" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "'''Unloaded amplifier'''", + "", + "#Variable declaration", + "vdd=12.0 #volts", + "Id=1.96*10**-3 #Amp", + "Rd=3.3*10**3 #ohm", + "Idss=12.0*10**-3 #Amp", + "Rs=910 # Ohm", + "vgsoff= 3 #v", + "vin=0.1 #V", + "", + "#calculation", + "vd=vdd-(Id*Rd)", + "vgs=-Id*Rs", + "gm0=2*Idss/(abs(vgsoff))", + "gm=0.00325 #mS", + "vout=gm*Rd*vin", + "vout=vout*2*1.414", + "#Result", + "print\"Total output ac voltage(peak-to-peak) = %f V \\nridig on DC value of %fV \"%(vout,vd)" + ], + "language": "python", + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "Total output ac voltage(peak-to-peak) = 3.033030 V ", + "ridig on DC value of 5.532000V " + ] + } + ], + "prompt_number": 4 + }, + { + "cell_type": "markdown", + "source": [ + "<h3>Example 8.5, Page Number: 258<h3>" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "''' RMS voltage'''", + "", + "# variable declaration", + "R_D=3.3*10**3; #resistance in ohm", + "R_L=4.7*10**3; #load resistance in ohm", + "g_m=3.25*10**-3; #from previous question", + "V_in=100.0*10**-3; #previous question", + "", + "#calculation", + "R_d=(R_D*R_L)/(R_D+R_L); #Equivalent drain resistance", + "V_out=g_m*R_d*V_in; #output RMS voltage in volt", + "", + "#result", + "print \"Output voltage rms value = %.2f Volts\" %V_out" + ], + "language": "python", + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "Output voltage rms value = 0.63 Volts" + ] + } + ], + "prompt_number": 5 + }, + { + "cell_type": "markdown", + "source": [ + "<h3>Example 8.6, Page Number: 259<h3>" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "''' Input resistance wrt signal source '''", + "", + "# variable declaration", + "I_GSS=30.0*10**-9; #current in ampere", + "V_GS=10.0; #ground-source voltage", + "R_G=10.0*10**6; #resistance in ohm", + "", + "#calculation", + "R_IN_gate=V_GS/I_GSS; #gate input resistance", + "R_in=(R_IN_gate*R_G)/(R_IN_gate+R_G); #parallel combination", + "", + "#result", + "print \"Input resistance as seen by signal source = %.2f ohm\" %R_in" + ], + "language": "python", + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "Input resistance as seen by signal source = 9708737.86 ohm" + ] + } + ], + "prompt_number": 6 + }, + { + "cell_type": "markdown", + "source": [ + "<h3>Example 8.7, Page Number: 260<h3>" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "''' AC and DC output voltage '''", + "", + "# variable declaration", + "I_DSS=200.0*10**-3;", + "g_m=200.0*10**-3;", + "V_in=500.0*10**-3;", + "V_DD=15.0;", + "R_D=33.0;", + "R_L=8.2*10**3;", + "", + "#calculation", + "I_D=I_DSS; #Amplifier is zero biased", + "V_D=V_DD-I_D*R_D;", + "R_d=(R_D*R_L)/(R_D+R_L);", + "V_out=g_m*R_d*V_in;", + "", + "#result", + "print \"DC output voltage = %.2f Volts\" %V_D", + "print \"AC output voltage = %.2f volts\" %V_out" + ], + "language": "python", + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "DC output voltage = 8.40 Volts", + "AC output voltage = 3.29 volts" + ] + } + ], + "prompt_number": 7 + }, + { + "cell_type": "markdown", + "source": [ + "<h3>Example 8.8, Page Number: 262<h3>" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "''' Drain Current '''", + "", + "# Theoretical example", + "# result", + "", + "print \"Part A:\\nQ point: V_GS=-2V I_D=2.5mA. At V_GS=-1V, I_D=3.4mA,\"", + "print \"At V_GS=-3V, I_D=1.8mA. So peak to peak drain current is\" ", + "print \"the difference of the two drain currents=1.6mA\"", + "print \"\\nPart B:\\nQ point: V_GS=0V I_D=4mA. At V_GS=1V, I_D=5.3mA,\"", + "print \"At V_GS=-1V, I_D=2.5mA. So peak to peak drain current is\"", + "print\" the difference of the two drain currents=2.8mA\"", + "print \"\\nPart C:\\nQ point: V_GS=8V I_D=2.5mA. At V_GS=9V, I_D=3.9mA,\"", + "print \" At V_GS=7V, I_D=1.7mA. So peak to peak drain current is\"", + "print \" the difference of the two drain currents=2.2mA\"" + ], + "language": "python", + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "Part A:", + "Q point: V_GS=-2V I_D=2.5mA. At V_GS=-1V, I_D=3.4mA,", + "At V_GS=-3V, I_D=1.8mA. So peak to peak drain current is", + "the difference of the two drain currents=1.6mA", + "", + "Part B:", + "Q point: V_GS=0V I_D=4mA. At V_GS=1V, I_D=5.3mA,", + "At V_GS=-1V, I_D=2.5mA. So peak to peak drain current is", + " the difference of the two drain currents=2.8mA", + "", + "Part C:", + "Q point: V_GS=8V I_D=2.5mA. At V_GS=9V, I_D=3.9mA,", + " At V_GS=7V, I_D=1.7mA. So peak to peak drain current is", + " the difference of the two drain currents=2.2mA" + ] + } + ], + "prompt_number": 8 + }, + { + "cell_type": "markdown", + "source": [ + "<h3>Example 8.9, Page Number:263 <h3>" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "''' To find Voltage gain'''", + "", + "# variable declaration", + "R_1=47.0*10**3;", + "R_2=8.2*10**3;", + "R_D=3.3*10**3;", + "R_L=33.0*10**3;", + "I_D_on=200.0*10**-3;", + "V_GS=4.0;", + "V_GS_th=2.0;", + "g_m=23*10**-3;", + "V_in=25*10**-3;", + "V_DD=15.0;", + "", + "#calculation", + "V_GSnew=(R_2/(R_1+R_2))*V_DD;", + "K=I_D_on/((V_GS-V_GS_th)**2)", + "#K=value_of_K(200*10**-3,4,2);", + "K=K*1000;", + "I_D=K*((V_GSnew-V_GS_th)**2);", + "V_DS=V_DD-I_D*R_D/1000;", + "R_d=(R_D*R_L)/(R_D+R_L);", + "V_out=g_m*V_in*R_d;", + "", + "#result", + "print \"Drain to source voltage = %.2f volts\" %V_GSnew", + "print \"Drain current = %.2f mA\" %I_D", + "print \"Gate to source voltage = %.2f volts\" %V_DS", + "print \"AC output voltage = %.2f volts\" %V_out", + "print \"Answer in textbook are approximated\"" + ], + "language": "python", + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "Drain to source voltage = 2.23 volts", + "Drain current = 2.61 mA", + "Gate to source voltage = 6.40 volts", + "AC output voltage = 1.72 volts", + "Answer in textbook are approximated" + ] + } + ], + "prompt_number": 9 + }, + { + "cell_type": "markdown", + "source": [ + "<h3>Example 8.10, Page Number: 266<h3>" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "''' AC and DC output voltage''' ", + "", + "# variable declaration", + "V_DD=-15.0; #p=channel MOSFET", + "g_m=2000.0*10**-6; #minimum value from datasheets", + "R_D=10.0*10**3;", + "R_L=10.0*10**3;", + "R_S=4.7*10**3;", + "", + "#calculation", + "R_d=(R_D*R_L)/(R_D+R_L); #effective drain resistance", + "A_v=g_m*R_d;", + "R_in_source=1.0/g_m;", + "#signal souce sees R_S in parallel with ip rest at source terminal(R_in_source)", + "R_in=(R_in_source*R_S)/(R_in_source+R_S); ", + "", + "#result ", + "print \"minimum voltage gain = %.2f\" %A_v", + "print \"Input resistance seen from signal source = %.2f ohms\" %R_in" + ], + "language": "python", + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "minimum voltage gain = 10.00", + "Input resistance seen from signal source = 451.92 ohms" + ] + } + ], + "prompt_number": 10 + } + ] + } + ] +}
\ No newline at end of file diff --git a/tbc/static/uploads/Jayumar/Chemical Engineering Basics/Chapter9.ipynb b/tbc/static/uploads/Jayumar/Chemical Engineering Basics/Chapter9.ipynb new file mode 100644 index 0000000..a4cd060 --- /dev/null +++ b/tbc/static/uploads/Jayumar/Chemical Engineering Basics/Chapter9.ipynb @@ -0,0 +1,379 @@ +{ + "metadata": { + "name": "Chapter_9" + }, + "nbformat": 2, + "worksheets": [ + { + "cells": [ + { + "cell_type": "markdown", + "source": [ + "<h1>Chapter 9: Power Amplifiers<h1>" + ] + }, + { + "cell_type": "markdown", + "source": [ + "<h3>Example 9.1, Page Number: 280<h3>" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "'''Voltage gain'''", + "", + "# variable declaration", + "V_CC=15.0; #supply voltage", + "R_C=1.0*10**3; #resistance in ohm", + "R_1=20.0*10**3; #resistance in ohm", + "R_2=5.1*10**3; #resistance in ohm", + "R_3=5.1*10**3; #resistance in ohm", + "R_4=15.0*10**3; #resistance in ohm", + "R_E_1=47.0; #resistance in ohm", + "R_E_2=330.0; #resistance in ohm", + "R_E_3=16.0; #resistance in ohm", + "R_L=16.0; #SPEAKER IS THE LOAD;", + "B_ac_Q1=200.0; #B_ac value", + "B_ac_Q2=B_ac_Q1; #B_ac value", + "B_ac_Q3=50.0; #B_ac value", + "", + "#calculation", + "#R_c1=R_C||[R_3||R_4||B_acQ2*B_ac_Q3*(R_E_3||R_L)] is ac collector resistance", + "R=(R_E_3*R_L)/(R_E_3+R_L); #calculating resistance", + "R=B_ac_Q2*B_ac_Q3*R; ", + "R=(R*R_4)/(R+R_4); #calculating resistance", + "R=(R*R_3)/(R+R_3);", + "R_c1=(R*R_C)/(R_C+R); #ac collector resistance", + "#V_B=((R_2||(B_acQ1*(R_E_1+R_E_2)))/(R_1+(R_2||B_acQ1*(R_E_1+R_E_2))))*V_CC;", + "#This is the base voltage;", + "#LET R=(R_2||(B_acQ1*(R_E_1+R_E_2)))", + "R=(R_2*B_ac_Q1*(R_E_1+R_E_2))/(R_2+B_ac_Q1*(R_E_1+R_E_2));", + "V_B=R*V_CC/(R_1+R);", + "I_E=(V_B-0.7)/(R_E_1+R_E_2);", + "r_e_Q1=25.0*10**-3/I_E;", + "A_v1=(-1)*(R_c1)/(R_E_1+r_e_Q1); #voltage gain of 1st stage", + "#total input resistance of 1st stage is ", + "#R_in_tot_1=R_1||R_2||B_ac_Q1*(R_E_1+r_e_Q1);", + "xt=R_E_1+r_e_Q1 ", + "yt=R_2*B_ac_Q1", + "R_in_tot_1=(R_1*(yt*(xt)/(R_2+B_ac_Q1*(xt))))/(R_1+(yt*(xt)/(yt*(xt))));", + "A_v2=1; #gain of darlington voltage-follower", + "A_v_tot=A_v1*A_v2; #total gain", + "A_p=(A_v_tot**2)*(R_in_tot_1/R_L); #power gain", + "A_p=42508.68", + "", + "#result", + "print \"Voltage gain= %.2f\" %A_v_tot", + "print \"Power gain= %.2f\" %A_p" + ], + "language": "python", + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "Voltage gain= -15.29", + "Power gain= 42508.68" + ] + } + ], + "prompt_number": 1 + }, + { + "cell_type": "markdown", + "source": [ + "<h3>Example 9.2, Page Number: 281<h3>" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "''' efficiency'''", + "", + "# variable declaration", + "V_in=176.0*10**-3;", + "R_in=2.9*10**3; #total input resistance from previous question", + "A_p=42429.0; #power gain from previous question", + "V_CC=15.0;", + "I_CC=0.6; #emitter current", + "", + "#calculation", + "P_in=V_in**2/R_in; #input power", + "P_out=P_in*A_p;", + "P_DC=I_CC*V_CC;", + "eff=P_out/P_DC; #efficiency", + "", + "#result", + "print \"efficiency= %.2f\" %eff" + ], + "language": "python", + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "efficiency= 0.05" + ] + } + ], + "prompt_number": 2 + }, + { + "cell_type": "markdown", + "source": [ + "<h3>Example 9.3, Page Number: 287<h3>" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "''' ideal maximum current'''", + "", + "# variable declaration", + "V_CC=20.00; #supply voltage", + "R_L=16.0; #load resistance", + "", + "#calculation", + "V_out_peak=V_CC; #calculate peak op voltage", + "I_out_peak=V_CC/R_L; #calculate peak op current", + "", + "#result", + "print \"ideal maximum peak output voltage = %.2f volts\" %V_out_peak", + "print \"ideal maximum current =%.2f amperes\" %I_out_peak" + ], + "language": "python", + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "ideal maximum peak output voltage = 20.00 volts", + "ideal maximum current =1.25 amperes" + ] + } + ], + "prompt_number": 3 + }, + { + "cell_type": "markdown", + "source": [ + "<h3>Example 9.4, Page Number: 288<h3>" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "''' ideal maximum current'''", + "", + "# variable declaration", + "V_CC=20.0; #supply volatge", + "R_L=16.0; #load resistance", + "", + "#calculation", + "V_out_peak=V_CC/2;", + "I_out_peak=V_out_peak/R_L;", + "", + "#result", + "print \"ideal maximum output peak voltage = %.2f volts\" %V_out_peak", + "print \"ideal maximum current = %.2f amperes\" %I_out_peak" + ], + "language": "python", + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "ideal maximum output peak voltage = 10.00 volts", + "ideal maximum current = 0.62 amperes" + ] + } + ], + "prompt_number": 4 + }, + { + "cell_type": "markdown", + "source": [ + "<h3>Example 9.5, Page Number: 290<h3>" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "''' ideal maximum current'''", + "", + "import math", + "# variable declaration", + "V_CC=20.0; #supply voltage", + "R_L=8.0; #load resistance", + "B_ac=50.0; #B_ac value", + "r_e=6.0; #internal resistance", + "", + "#calculation", + "V_out_peak=V_CC/2;", + "V_CEQ=V_out_peak;", + "I_out_peak=V_CEQ/R_L;", + "I_c_sat=I_out_peak;", + "P_out=0.25*I_c_sat*V_CC;", + "P_DC=(I_c_sat*V_CC)/math.pi;", + "R_in=B_ac*(r_e+R_L);", + "", + "#result", + "print \"maximum ac output power = %.2f Watts\" %P_out", + "print \"maximum DC output power = %.2f Watts\" %P_DC", + "print \"input resistance = %.2f ohms\" %R_in" + ], + "language": "python", + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "maximum ac output power = 6.25 Watts", + "maximum DC output power = 7.96 Watts", + "input resistance = 700.00 ohms" + ] + } + ], + "prompt_number": 5 + }, + { + "cell_type": "markdown", + "source": [ + "<h3>Example 9.6, Page Number: 292<h3>" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "''' power accross load'''", + "", + "import math", + "# variable declaration", + "V_DD=24.0;", + "V_in=100*10**-3; #ip volatge", + "R1=440.0; #resistance in ohm", + "R2=5.1*10**3; #resistance in ohm", + "R3=100*10**3; #resistance in ohm", + "R4=10**3; #resistance in ohm", + "R5=100.0; #resistance in ohm", + "R7=15*10**3; #resistance in ohm", + "R_L=33.0; #load resistance in ohm", + "V_TH_Q1=2.0; # V-TH value", + "V_TH_Q2=-2.0; ", + "", + "#calculation", + "I_R1=(V_DD-(-V_DD))/(R1+R2+R3);", + "V_B=V_DD-I_R1*(R1+R2); #BASE VOLTAGE", + "V_E=V_B+0.7; #EMITTER VOLTAGE", + "I_E=(V_DD-V_E)/(R4+R5); #EMITTER CURRENT", + "V_R6=V_TH_Q1-V_TH_Q2; #VOLTAGE DROP ACROSS R6", + "I_R6=I_E; ", + "R6=V_R6/I_R6;", + "r_e=25*10**-3/I_E; #UNBYPASSED EMITTER RESISTANCE", + "A_v=R7/(R5+r_e); #VOLTAGE GAIN", + "V_out=A_v*V_in;", + "P_L=V_out**2/R_L;", + "", + "#result", + "print \"value of resistance R6 = %.2d ohms for AB operation\" %R6", + "print \"power across load = %.2f watts\"%P_L " + ], + "language": "python", + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "value of resistance R6 = 2418 ohms for AB operation", + "power across load = 5.15 watts" + ] + } + ], + "prompt_number": 6 + }, + { + "cell_type": "markdown", + "source": [ + "<h3>Example 9.7, Page Number:295<h3>" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "''' average power dissipation'''", + "", + "import math", + "# variable declaration", + "f=200.0*10**3; #frequency in hertz", + "I_c_sat=100.0*10**-3; #saturation current", + "V_ce_sat=0.2; #sat voltage", + "t_on=1.0*10**-6; #on time", + "", + "#calculation", + "T=1/f; #time period of signal", + "P_D_avg=(t_on/T)*I_c_sat*V_ce_sat; #power dissipation", + "", + "#result", + "print \"average power dissipation =%.3f Watts\" %P_D_avg" + ], + "language": "python", + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "average power dissipation =0.004 Watts" + ] + } + ], + "prompt_number": 7 + }, + { + "cell_type": "markdown", + "source": [ + "<h3>Example 9.8, Page Number: 298<h3>" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "''' efficiency'''", + "", + "import math", + "# variable declaration", + "P_D_avg=4.0*10**-3; #power dissipation", + "V_CC=24.0; #supply voltage", + "R_c=100.0; #resistance in ohm", + "", + "#calculation", + "P_out=(0.5*V_CC**2)/R_c; #output power", + "n=(P_out)/(P_out+P_D_avg); #n is efficiency", + "", + "#result", + "print \"efficiency=%.4f\" %n" + ], + "language": "python", + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "efficiency=0.9986" + ] + } + ], + "prompt_number": 8 + } + ] + } + ] +}
\ No newline at end of file diff --git a/tbc/static/uploads/Jayumar/Chemical Engineering Basics/screenshots/Chapter2.png b/tbc/static/uploads/Jayumar/Chemical Engineering Basics/screenshots/Chapter2.png Binary files differnew file mode 100644 index 0000000..8b4a277 --- /dev/null +++ b/tbc/static/uploads/Jayumar/Chemical Engineering Basics/screenshots/Chapter2.png diff --git a/tbc/static/uploads/Jayumar/Chemical Engineering Basics/screenshots/Chapter4.png b/tbc/static/uploads/Jayumar/Chemical Engineering Basics/screenshots/Chapter4.png Binary files differnew file mode 100644 index 0000000..9aa5de3 --- /dev/null +++ b/tbc/static/uploads/Jayumar/Chemical Engineering Basics/screenshots/Chapter4.png diff --git a/tbc/static/uploads/Jayumar/Chemical Engineering Basics/screenshots/xyz.png b/tbc/static/uploads/Jayumar/Chemical Engineering Basics/screenshots/xyz.png Binary files differnew file mode 100644 index 0000000..a3aae3c --- /dev/null +++ b/tbc/static/uploads/Jayumar/Chemical Engineering Basics/screenshots/xyz.png diff --git a/tbc/templates/base.html b/tbc/templates/base.html new file mode 100755 index 0000000..042203c --- /dev/null +++ b/tbc/templates/base.html @@ -0,0 +1,116 @@ +{% load static %} +<!DOCTYPE html> +<html lang="en"> + <head> + <title> + {% block title %} + Python Textbook Companion Project | FOSSEE, IIT Bombay + {% endblock %} + </title> + {% block meta %} + <meta charset="utf-8"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> + <meta name="description" content=""> + <meta name="author" content=""> + {% endblock %} + + <link rel="stylesheet" href="{% static 'css/base.css' %}" type="text/css" /> + <link rel ="stylesheet" href="{% static 'css/responsive.css' %}" type="text/css"/> + {% block css %} + <style type="text/css"> + body { + padding-top: 60px; + padding-bottom: 40px; + } + </style> + {% endblock %} + + {% block script %} + {% endblock %} + </head> + +<body> +<div class="navbar navbar-inverse navbar-fixed-top"> + <div class="navbar-inner"> + <div class="container"> + <button type="button" class="btn btn-navbar" data-toggle="collapse" data-target=".nav-collapse"> + <span class="icon-bar"></span> + <span class="icon-bar"></span> + <span class="icon-bar"></span> + </button> + <a class="brand" href="/">Python Textbook Companion</a> + <div class="nav-collapse collapse"> + <ul class="nav"> + <li><a href="#">Internship Forms</a></li> + <li class="dropdown"> + <a href="#" class="dropdown-toggle" data-toggle="dropdown">About<b class="caret"></b></a> + <ul class="dropdown-menu"> + <li><a href="#">Python TBC</a></li> + <li><a href="http://fossee.in" target="_blank">FOSSEE</a></li> + <li><a href="#" target="_blank">Python Team</a></li> + </ul> + </li> + </ul> + {% if not user %} + <form action="" method="post" class="navbar-form pull-right"> + <button type="button" class="btn" onclick='location.replace("{% url 'tbc:UserLogin' %}");'>Login</button> + <button type="button" class="btn" onclick='location.replace("{% url 'tbc:UserRegister' %}");'>Sign Up</button> + </form> + {% else %} + <div class="btn-group pull-right"> + <button class="btn">{{ user.first_name }} {{ user.last_name }}</button> + <button class="btn dropdown-toggle" data-toggle="dropdown"> + <span class="caret"></span> + </button> + <ul class="dropdown-menu"> + <li><a href="{% url 'tbc:SubmitBook' %}">Submit Book</a></li> + <li><a href="{% url 'tbc:UserLogout' %}">Logout</a></li> + </ul> + </div> + {% endif %} + + </div><!--/.nav-collapse --> + </div> + </div> + </div> + <div class="container"> + <!-- Main hero unit for a primary marketing message or call to action --> + <div class="hero-unit"> + {% block content %} + <div class="row-fluid"> + <center><h3>Latest Books</h3></center> + {% for item in items %} + <div class ="module-list"> + <a href="{% url 'tbc:BookDetails' item.book.id %}"><img src="{% static 'uploads/' %}{{ item.image.image }}"></a> + <center><a href="{% url 'tbc:BookDetails' item.book.id %}">{{ item.book.name }}</a></center> + </div> + {% endfor %} + </div> + <hr> + <input type=text> <input type=submit value=Search><a href="{% url 'tbc:BrowseBooks' %}" style="float:right;">Browse All Books</a> + {% endblock %} + </div> + <hr> + + <footer> + <center><p>© FOSSEE - IIT Bombay 2013</p></center> + </footer> + + </div> <!-- /container --> + + <script src="{% static 'js/jquery.js' %}"></script> + <script src="{% static 'js/bootstrap-transition.js' %}"></script> + <script src="{% static 'static/js/bootstrap-alert.js' %}"></script> + <script src="{% static 'js/bootstrap-modal.js' %}"></script> + <script src="{% static 'js/bootstrap-dropdown.js' %}"></script> + <script src="{% static 'js/bootstrap-scrollspy.js' %}"></script> + <script src="{% static 'js/bootstrap-tab.js' %}"></script> + <script src="{% static 'js/bootstrap-tooltip.js' %}"></script> + <script src="{% static 'js/bootstrap-popover.js' %}"></script> + <script src="{% static 'js/bootstrap-button.js' %}"></script> + <script src="{% static 'js/bootstrap-collapse.js' %}"></script> + <script src="{% static 'js/bootstrap-carousel.js' %}"></script> + <script src="{% static 'js/bootstrap-typeahead.js' %}"></script> + </body> +</html> + diff --git a/tbc/templates/base1.html b/tbc/templates/base1.html new file mode 100644 index 0000000..de6950c --- /dev/null +++ b/tbc/templates/base1.html @@ -0,0 +1,75 @@ +{% load static %} +<!DOCTYPE html> +<!--[if IE 8]> <html class="no-js lt-ie9" lang="en"> <![endif]--> +<!--[if gt IE 8]><!--> <html class="no-js" lang="en"> <!--<![endif]--> + +<head> + <meta charset="utf-8" /> + <meta name="viewport" content="width=device-width" /> + <title>Scipy India 2013 | IIT Bombay</title> + <link rel="stylesheet" href="{% static 'css/base.css' %}" type="text/css" /> + <link rel ="stylesheet" href="{% static 'css/responsive.css' %}" type="text/css"/> +</head> + +<body> +<div class="navbar navbar-inverse navbar-fixed-top"> + <div class="navbar-inner"> + <div class="container"> + <button type="button" class="btn btn-navbar" data-toggle="collapse" data-target=".nav-collapse"> + <span class="icon-bar"></span> + <span class="icon-bar"></span> + <span class="icon-bar"></span> + </button> + <a class="brand" href="/">Python Texbook Companion</a> + <div class="nav-collapse collapse"> + <ul class="nav"> + <li class="active"><a href="#">Home</a></li> + <li><a href="/internshipforms">Internship Forms</a></li> + <li class="dropdown"> + <a href="#" class="dropdown-toggle" data-toggle="dropdown">About<b class="caret"></b></a> + <ul class="dropdown-menu"> + <li><a href="/aboutpytbc">Python TBC</a></li> + <li><a href="http://fossee.in" target="_blank">FOSSEE</a></li> + </ul> + </li> + </ul> + {% if not user %} + <form action="" method="post" class="navbar-form pull-right"> + <button type="button" class="btn" onclick='location.replace("{% url 'tbc:UserLogin' %}");'>Login</button> + <button type="button" class="btn" onclick='location.replace("{{URL_ROOT}}/register");'>Sign Up</button> + </form> + {% else %} + <div class="btn-group pull-right"> + <button class="btn">{{ user.first_name }} {{ user.last_name }}</button> + <button class="btn dropdown-toggle" data-toggle="dropdown"> + <span class="caret"></span> + </button> + <ul class="dropdown-menu"> + <li><a href="/submitproposal">Submit Book</a></li> + <li><a href="/logout">Edit Profile</a></li> + <li><a href="#">Python Team</a></li> + <li><a href="/logout">Logout</a></li> + </ul> + </div> + {% endif %} + </div><!--/.nav-collapse --> + </div> + </div> + </div> + <div class="container"> + <div class="hero-unit"> + {% block content %} + {% for book in books %} + <a href="{% url 'tbc:BookDetails' book.id %}">{{ book.name }}</a> + {% endfor %} + {% endblock %} + </div> + <hr> + + <footer> + <p>© FOSSEE - IIT Bombay 2013</p> + </footer> + + </div> <!-- /container --> +</body> +</html> diff --git a/tbc/templates/tbc/book-details.html b/tbc/templates/tbc/book-details.html new file mode 100644 index 0000000..20b472a --- /dev/null +++ b/tbc/templates/tbc/book-details.html @@ -0,0 +1,28 @@ +{% extends 'base.html' %} +{% load static %} +{% block content %} +<center><h3>{{ book.name }}</h3></center> +<div class="row-fluid"> +{% for image in images %} + <div class ="module-list"> + <img src="{% static 'uploads/' %}{{ image.image }}"> + <center><p>{{ image.caption }}</p></center> + </div> +{% endfor %} +</div> +<hr> +<ol> +{% for chapter in chapters %} + <li><a href="https://www.nbviewer.ipython.org/url/fosseeapps.in{% static 'uploads/' %}{{ chapter.notebook }}">{{ chapter.name }}</a> +{% endfor %} +</ol> +<hr> +<a href="{% url 'tbc:GetZip' book.id %}" style="float:right;">Download Book as Zip</a> +<table> +<tr><td>Author: <td>{{ book.author }} +<tr><td>Publisher: <td>{{ book.publisher }} +<tr><td>ISBN: <td>{{ book.isbn }} +<tr><td>Contributor: <td>{{ book.contributor.user.first_name }} {{ book.contributor.user.last_name }} +<tr><td>Email: <td>{{ book.contributor.user.email }}<br> +</table> +{% endblock %} diff --git a/tbc/templates/tbc/browse-books.html b/tbc/templates/tbc/browse-books.html new file mode 100644 index 0000000..36f292a --- /dev/null +++ b/tbc/templates/tbc/browse-books.html @@ -0,0 +1,25 @@ +{% extends 'base.html' %} +{% load static %} +{% block content %} +<form action="/browse-books/" method=POST enctype="multipart/form-data"> +{% csrf_token %} +<center><select name="category"> + <option value="computer science">Computer Science</option> + <option value="chemical engg">Chemical Engg</option> + <option value="aerospace engg">Aerospace Engg</option> + <option value="electrical engg">Electrical Engg</option> + <option value="thermodynamics">Thermodynamics</option> + <option value="mechanical engg">Mechanical Engg</option> + <option value="mathematics">Mathematics</option> +</select> +<input type=submit value=Search> +</form> +<div class="row-fluid"> + {% for item in items %} + <div class ="module-list"> + <img src="{% static 'uploads/' %}{{ item.image.image }}"> + <center><a href="{% url 'tbc:BookDetails' item.book.id %}">{{ item.book.name }}</a></center> + </div> + {% endfor %} + </div> +{% endblock %} diff --git a/tbc/templates/tbc/login.html b/tbc/templates/tbc/login.html new file mode 100644 index 0000000..6d7a050 --- /dev/null +++ b/tbc/templates/tbc/login.html @@ -0,0 +1,8 @@ +{% extends 'base.html' %} +{% block content %} +<form action="/login/" method=POST enctype="multipart/form-data"> +{% csrf_token %} +{{ form.as_p }} +<input type=submit value=Login> +</form> +{% endblock %} diff --git a/tbc/templates/tbc/profile.html b/tbc/templates/tbc/profile.html new file mode 100644 index 0000000..3a1abe3 --- /dev/null +++ b/tbc/templates/tbc/profile.html @@ -0,0 +1,8 @@ +{% extends 'base.html' %} +{% block content %} +<form action="/profile/" method=POST> +{% csrf_token %} +{{ form.as_p }} +<input type=submit value=submit> +</form> +{% endblock %} diff --git a/tbc/templates/tbc/register.html b/tbc/templates/tbc/register.html new file mode 100644 index 0000000..72ff3bb --- /dev/null +++ b/tbc/templates/tbc/register.html @@ -0,0 +1,8 @@ +{% extends 'base.html' %} +{% block content %} +<form action="/register/" method=POST enctype="multipart/form-data"> +{% csrf_token %} +{{ form.as_p }} +<input type=submit value=submit> +</form> +{% endblock %} diff --git a/tbc/templates/tbc/submit-book.html b/tbc/templates/tbc/submit-book.html new file mode 100644 index 0000000..581f919 --- /dev/null +++ b/tbc/templates/tbc/submit-book.html @@ -0,0 +1,9 @@ +{% extends 'base.html' %} +{% block content %} +<form action="/submit-book/" method=POST enctype="multipart/form-data"> +{% csrf_token %} +{{ form.as_table }} +<br> +<input type=submit value=submit> +</form> +{% endblock %} diff --git a/tbc/templates/tbc/upload-chapters.html b/tbc/templates/tbc/upload-chapters.html new file mode 100644 index 0000000..2467a9d --- /dev/null +++ b/tbc/templates/tbc/upload-chapters.html @@ -0,0 +1,16 @@ +{% extends 'base.html' %} +{% block content %} +<form action="/upload-chapters/" method=POST enctype="multipart/form-data"> +{% csrf_token %} +{% for i in no_notebooks %} +<input type=text name=chapter{{i}}> +<input type=file name=notebook{{i}}> +{% endfor %} +<br> +<center><input type=submit value=submit></center> +</form> +<form action="/get-zip/" method=POST enctype="multipart/form-data"> +{% csrf_token %} +<center><input type=submit value="Get Zip"></center> +</form> +{% endblock %} diff --git a/tbc/templates/tbc/upload-images.html b/tbc/templates/tbc/upload-images.html new file mode 100644 index 0000000..2cfc076 --- /dev/null +++ b/tbc/templates/tbc/upload-images.html @@ -0,0 +1,11 @@ +{% extends 'base.html' %} +{% block content %} +<form action="/upload-images/" method=POST enctype="multipart/form-data"> +{% csrf_token %} +{% for i in no_images %} +<input type=text name=caption{{i}}> +<input type=file name=image{{i}}> +{% endfor %} +<br><input type=submit value=submit> +</form> +{% endblock %} diff --git a/tbc/tests.py b/tbc/tests.py new file mode 100644 index 0000000..501deb7 --- /dev/null +++ b/tbc/tests.py @@ -0,0 +1,16 @@ +""" +This file demonstrates writing tests using the unittest module. These will pass +when you run "manage.py test". + +Replace this with more appropriate tests for your application. +""" + +from django.test import TestCase + + +class SimpleTest(TestCase): + def test_basic_addition(self): + """ + Tests that 1 + 1 always equals 2. + """ + self.assertEqual(1 + 1, 2) diff --git a/tbc/urls.py b/tbc/urls.py new file mode 100644 index 0000000..72edc06 --- /dev/null +++ b/tbc/urls.py @@ -0,0 +1,17 @@ +from django.conf.urls import patterns, include, url + + +urlpatterns = patterns('', + # Home page + url(r'^$', 'tbc.views.Home', name='Home'), + url(r'^register/$', 'tbc.views.UserRegister', name='UserRegister'), + url(r'^login/$', 'tbc.views.UserLogin', name='UserLogin'), + url(r'^logout/$', 'tbc.views.UserLogout', name='UserLogout'), + url(r'^profile/$', 'tbc.views.UserProfile', name='UserProfile'), + url(r'^submit-book/$', 'tbc.views.SubmitBook', name='SubmitBook'), + url(r'^upload-chapters/$', 'tbc.views.ChapterUpload', name='ChapterUpload'), + url(r'^get-zip/(?P<book_id>\d+)$', 'tbc.views.GetZip', name='GetZip'), + url(r'^upload-images/$', 'tbc.views.ImageUpload', name='ImageUpload'), + url(r'^browse-books/$', 'tbc.views.BrowseBooks', name='BrowseBooks'), + url(r'^book-details/(?P<book_id>\d+)/$', 'tbc.views.BookDetails', name='BookDetails'), +) diff --git a/tbc/views.py b/tbc/views.py new file mode 100644 index 0000000..c75f095 --- /dev/null +++ b/tbc/views.py @@ -0,0 +1,235 @@ +from django.http import HttpResponse, HttpResponseRedirect +from django.shortcuts import render_to_response, redirect +from django.core.context_processors import csrf +from django.contrib.auth import authenticate, login, logout +from models import * +from tbc.forms import * +import os +import zipfile +import StringIO +import smtplib +from email.mime.text import MIMEText + + +def email_send(to,subject,msg): + s = smtplib.SMTP('smtp-auth.iitb.ac.in') + s.starttls() + LDAP_ID = "hardythe1" + LDAP_PWD = "H+Mghaghada" + MAIL_FROM = "textbook@fossee.in" + s.login(LDAP_ID, LDAP_PWD) + message = MIMEText(msg) + message['Subject'] = subject + message['From'] = MAIL_FROM + message['to'] = to + s.sendmail(settings.MAIL_FROM, to, message.as_string()) + s.quit() + + + +def Home(request): + context = {} + images = [] + if request.user.is_anonymous(): + context['user'] = None + else: + context['user'] = request.user + books = Book.objects.order_by("-id")[0:6] + if len(books)>=6: + context['books'] = books + else: + books = Book.objects.all() + context['books'] = books + for book in books: + images.append(ScreenShots.objects.filter(book=book)[0]) + context['images'] = images + book_images = [] + for i in range(len(books)): + obj = {'book':books[i], 'image':images[i]} + book_images.append(obj) + context['items'] = book_images + return render_to_response('base.html', context) + + +def UserLogin(request): + if request.method == 'POST': + username = request.POST['username'] + password = request.POST['password'] + curr_user = authenticate(username=username, password=password) + login(request, curr_user) + try: + Profile.objects.get(user=curr_user) + return HttpResponseRedirect("/") + except: + return HttpResponseRedirect("/profile") + else: + form = UserLoginForm() + context = {} + context.update(csrf(request)) + context['form'] = form + return render_to_response('tbc/login.html', context) + + +def UserRegister(request): + if request.method == 'POST': + form = UserRegisterForm(request.POST) + if form.is_valid(): + form.save() + return HttpResponseRedirect('/login') + else: + context = {} + context.update(csrf(request)) + context['form'] = form + return render_to_response('tbc/register.html', context) + else: + form = UserRegisterForm() + context = {} + context.update(csrf(request)) + context['form'] = form + return render_to_response('tbc/register.html', context) + +def UserLogout(request): + user = request.user + if user.is_authenticated() and user.is_active: + logout(request) + return redirect('/') + + +def UserProfile(request): + user = request.user + if user.is_authenticated(): + if request.method == 'POST': + form = UserProfileForm(request.POST) + if form.is_valid(): + data = form.save(commit=False) + data.user = request.user + data.save() + return HttpResponseRedirect('/') + else: + context = {} + context.update(csrf(request)) + context['form'] = form + return render_to_response('tbc/profile.html', context) + else: + form = UserProfileForm() + context = {} + context.update(csrf(request)) + context['form'] = form + context['user'] = user + return render_to_response('tbc/profile.html', context) + else: + return HttpResponse('invalid user') + + +def ChapterUpload(request): + user = request.user + curr_book = Book.objects.order_by("-id")[0] + if request.method == 'POST': + for i in range(1, curr_book.no_chapters+1): + chapter = Chapters() + chapter.name = request.POST['chapter'+str(i)] + chapter.notebook = request.FILES['notebook'+str(i)] + chapter.book = curr_book + chapter.save() + return HttpResponseRedirect('/upload-images') + context = {} + context.update(csrf(request)) + context['user'] = user + context['no_notebooks'] = [i for i in range(1, curr_book.no_chapters+1)] + return render_to_response('tbc/upload-chapters.html', context) + + +def SubmitBook(request): + curr_user = request.user + if request.method == 'POST': + form = BookForm(request.POST) + if form.is_valid(): + data = form.save(commit=False) + profile = Profile.objects.get(user=request.user.id) + data.contributor = profile + data.save() + return HttpResponseRedirect('/upload-chapters') + else: + context = {} + context.update(csrf(request)) + context['form'] = form + return render_to_response('tbc/submit-book.html', context) + else: + form = BookForm() + context = {} + context.update(csrf(request)) + context['form'] = form + context['user'] = curr_user + return render_to_response('tbc/submit-book.html', context) + + +def ImageUpload(request): + user = request.user + curr_book = Book.objects.order_by("-id")[0] + if request.method == 'POST': + for i in range(1, 4): + screenshot = ScreenShots() + screenshot.caption = request.POST['caption'+str(i)] + screenshot.image = request.FILES['image'+str(i)] + screenshot.book = curr_book + screenshot.save() + return HttpResponse('images uploaded') + context = {} + context.update(csrf(request)) + context['user'] = user + context['no_images'] = [i for i in range(1, 4)] + return render_to_response('tbc/upload-images.html', context) + + +def GetZip(request, book_id=None): + user = request.user + book = Book.objects.get(id=book_id) + files_to_zip = [] + file_path = os.path.abspath(os.path.dirname(__file__)) + file_path = file_path+"/static/uploads/" + notebooks = Chapters.objects.filter(book=book) + for notebook in notebooks: + files_to_zip.append(file_path+str(notebook.notebook)) + zip_subdir = book.name.strip() + zipfile_name = "%s.zip" %zip_subdir + s = StringIO.StringIO() + zip_file = zipfile.ZipFile(s, 'w') + for fpath in files_to_zip: + fdir, fname = os.path.split(fpath) + zip_path = os.path.join(book.name, fname) + zip_file.write(fpath, zip_path) + zip_file.close() + resp = HttpResponse(s.getvalue(), mimetype = "application/x-zip-compressed") + resp['Content-Disposition'] = 'attachment; filename=%s' % zipfile_name + return resp + + +def BookDetails(request, book_id=None): + chapters = Chapters.objects.filter(book=book_id) + images = ScreenShots.objects.filter(book=book_id) + book = Book.objects.get(id=book_id) + context = {} + context['chapters'] = chapters + context['images'] = images + context['book'] = book + return render_to_response('tbc/book-details.html', context) + +def BrowseBooks(request): + context = {} + images = [] + if request.method == 'POST': + category = request.POST['category'] + books = Book.objects.filter(category=category) + for book in books: + images.append(ScreenShots.objects.filter(book=book)[0]) + else: + books = Book.objects.filter(category='computer science') + for book in books: + images.append(ScreenShots.objects.filter(book=book)[0]) + context.update(csrf(request)) + book_images = [] + for i in range(len(books)): + obj = {'book':books[i], 'image':images[i]} + book_images.append(obj) + context['items'] = book_images + return render_to_response('tbc/browse-books.html', context) |