diff --git a/.gitattributes b/.gitattributes deleted file mode 100644 index 412eeda..0000000 --- a/.gitattributes +++ /dev/null @@ -1,22 +0,0 @@ -# Auto detect text files and perform LF normalization -* text=auto - -# Custom for Visual Studio -*.cs diff=csharp -*.sln merge=union -*.csproj merge=union -*.vbproj merge=union -*.fsproj merge=union -*.dbproj merge=union - -# Standard to msysgit -*.doc diff=astextplain -*.DOC diff=astextplain -*.docx diff=astextplain -*.DOCX diff=astextplain -*.dot diff=astextplain -*.DOT diff=astextplain -*.pdf diff=astextplain -*.PDF diff=astextplain -*.rtf diff=astextplain -*.RTF diff=astextplain diff --git a/.gitignore b/.gitignore deleted file mode 100644 index b9d6bd9..0000000 --- a/.gitignore +++ /dev/null @@ -1,215 +0,0 @@ -################# -## Eclipse -################# - -*.pydevproject -.project -.metadata -bin/ -tmp/ -*.tmp -*.bak -*.swp -*~.nib -local.properties -.classpath -.settings/ -.loadpath - -# External tool builders -.externalToolBuilders/ - -# Locally stored "Eclipse launch configurations" -*.launch - -# CDT-specific -.cproject - -# PDT-specific -.buildpath - - -################# -## Visual Studio -################# - -## Ignore Visual Studio temporary files, build results, and -## files generated by popular Visual Studio add-ons. - -# User-specific files -*.suo -*.user -*.sln.docstates - -# Build results - -[Dd]ebug/ -[Rr]elease/ -x64/ -build/ -[Bb]in/ -[Oo]bj/ - -# MSTest test Results -[Tt]est[Rr]esult*/ -[Bb]uild[Ll]og.* - -*_i.c -*_p.c -*.ilk -*.meta -*.obj -*.pch -*.pdb -*.pgc -*.pgd -*.rsp -*.sbr -*.tlb -*.tli -*.tlh -*.tmp -*.tmp_proj -*.log -*.vspscc -*.vssscc -.builds -*.pidb -*.log -*.scc - -# Visual C++ cache files -ipch/ -*.aps -*.ncb -*.opensdf -*.sdf -*.cachefile - -# Visual Studio profiler -*.psess -*.vsp -*.vspx - -# Guidance Automation Toolkit -*.gpState - -# ReSharper is a .NET coding add-in -_ReSharper*/ -*.[Rr]e[Ss]harper - -# TeamCity is a build add-in -_TeamCity* - -# DotCover is a Code Coverage Tool -*.dotCover - -# NCrunch -*.ncrunch* -.*crunch*.local.xml - -# Installshield output folder -[Ee]xpress/ - -# DocProject is a documentation generator add-in -DocProject/buildhelp/ -DocProject/Help/*.HxT -DocProject/Help/*.HxC -DocProject/Help/*.hhc -DocProject/Help/*.hhk -DocProject/Help/*.hhp -DocProject/Help/Html2 -DocProject/Help/html - -# Click-Once directory -publish/ - -# Publish Web Output -*.Publish.xml -*.pubxml - -# NuGet Packages Directory -## TODO: If you have NuGet Package Restore enabled, uncomment the next line -#packages/ - -# Windows Azure Build Output -csx -*.build.csdef - -# Windows Store app package directory -AppPackages/ - -# Others -sql/ -*.Cache -ClientBin/ -[Ss]tyle[Cc]op.* -~$* -*~ -*.dbmdl -*.[Pp]ublish.xml -*.pfx -*.publishsettings - -# RIA/Silverlight projects -Generated_Code/ - -# Backup & report files from converting an old project file to a newer -# Visual Studio version. Backup files are not needed, because we have git ;-) -_UpgradeReport_Files/ -Backup*/ -UpgradeLog*.XML -UpgradeLog*.htm - -# SQL Server files -App_Data/*.mdf -App_Data/*.ldf - -############# -## Windows detritus -############# - -# Windows image file caches -Thumbs.db -ehthumbs.db - -# Folder config file -Desktop.ini - -# Recycle Bin used on file shares -$RECYCLE.BIN/ - -# Mac crap -.DS_Store - - -############# -## Python -############# - -*.py[co] - -# Packages -*.egg -*.egg-info -dist/ -build/ -eggs/ -parts/ -var/ -sdist/ -develop-eggs/ -.installed.cfg - -# Installer logs -pip-log.txt - -# Unit test / coverage reports -.coverage -.tox - -#Translations -*.mo - -#Mr Developer -.mr.developer.cfg diff --git a/Javascript Libraries - AngularJS Project.pdf b/Javascript Libraries - AngularJS Project.pdf deleted file mode 100644 index ae80465..0000000 Binary files a/Javascript Libraries - AngularJS Project.pdf and /dev/null differ diff --git a/README.md b/README.md deleted file mode 100644 index 0094916..0000000 --- a/README.md +++ /dev/null @@ -1,26 +0,0 @@ -# Angular Javascript Libraries Project — Demo Application using Angular JS - -This project is a sample application demonstrating a more fully developed realistic single page -angular application. - -## How to use - -Clone the repository and run - - -### Running the application - -open your command line to the root directory of the repository. run server.sh. - -If you are on a windows machine, install the bash shell. Optionally you may run server.bat. Note that -after you start your server, you must change directory back to the root of the project. - -Then navigate your browser to `http://localhost:8000/` to see the app running in -your browser. The port may be configured in the scripts/web-server.js file near the top. - -### Server - -The server is a simple node server that just writes and reads files from the disk in a restful manner. This keeps the entire project -self-contained, but it puts some limitations because the server has no logic whatsoever. - -For more information on AngularJS please check out http://angularjs.org/ diff --git a/app/css/app-default-style.css b/app/css/app-default-style.css deleted file mode 100644 index 6ee2abe..0000000 --- a/app/css/app-default-style.css +++ /dev/null @@ -1,9467 +0,0 @@ -@charset "utf-8"; - -/* CSS Document */ - -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; - 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 { - max-width:100%; - height:auto; - border:0; - -ms-interpolation-mode:bicubic -} -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,input[type="button"],input[type="reset"],input[type="submit"] { - cursor:pointer; - -webkit-appearance:button -} -input[type="search"] { - -webkit-appearance:textfield; - -webkit-box-sizing:content-box; - -moz-box-sizing:content-box; - box-sizing:content-box -} -input[type="search"]::-webkit-search-decoration,input[type="search"]::-webkit-search-cancel-button { - -webkit-appearance:none -} -textarea { - overflow:auto; - vertical-align:top -} -body { - margin:0; - font-family:"Helvetica Neue",Helvetica,Arial,sans-serif; - font-size:13px; - line-height:18px; - color:#333; - background-color:#fff -} -a { - color:rgba(0,109,204,0.7); - text-decoration:none -} -a:hover { - color:#006dcc; - text-decoration:underline -} -.row { - margin-left:-20px; - width:960px; - *zoom:1 -} -.row:before,.row:after { - display:table; - content:"" -} -.row:after { - clear:both -} -[class*="span"] { - float:left; - margin-left:20px -} -.span1 { - width:40px -} -.span2 { - width:100px -} -.span3 { - width:160px -} -.span4 { - width:220px -} -.span5 { - width:280px -} -.span6 { - width:340px -} -.span7 { - width:400px -} -.span8 { - width:460px -} -.span9 { - width:520px -} -.span10 { - width:580px -} -.span11 { - width:640px -} -.span12 { - width:700px -} -.span13 { - width:760px -} -.span14 { - width:820px -} -.span15 { - width:880px -} -.span16,.container { - width:940px -} -.offset1 { - margin-left:80px -} -.offset2 { - margin-left:140px -} -.offset3 { - margin-left:200px -} -.offset4 { - margin-left:260px -} -.offset5 { - margin-left:320px -} -.offset6 { - margin-left:380px -} -.offset7 { - margin-left:440px -} -.offset8 { - margin-left:500px -} -.offset9 { - margin-left:560px -} -.offset10 { - margin-left:620px -} -.offset11 { - margin-left:680px -} -.offset12 { - margin-left:740px -} -.offset13 { - margin-left:800px -} -.offset14 { - margin-left:860px -} -.offset15 { - margin-left:920px -} -.row-fluid { - width:100%; - *zoom:1 -} -.row-fluid:before,.row-fluid:after { - display:table; - content:"" -} -.row-fluid:after { - clear:both -} -.row-fluid>[class*="span"] { - float:left; - margin-left:2.127659574% -} -.row-fluid>[class*="span"]:first-child { - margin-left:0 -} -.row-fluid .span1 { - width:6.382978723% -} -.row-fluid .span2 { - width:14.89361702% -} -.row-fluid .span3 { - width:23.404255317% -} -.row-fluid .span4 { - width:31.914893614% -} -.row-fluid .span5 { - width:40.425531911% -} -.row-fluid .span6 { - width:48.93617020799999% -} -.row-fluid .span7 { - width:57.446808505% -} -.row-fluid .span8 { - width:65.95744680199999% -} -.row-fluid .span9 { - width:74.468085099% -} -.row-fluid .span10 { - width:82.97872339599999% -} -.row-fluid .span11 { - width:91.489361693% -} -.row-fluid .span12 { - width:99.99999998999999% -} -.row-fluid .span13 { - width:108.510638287% -} -.row-fluid .span14 { - width:117.02127658399999% -} -.row-fluid .span15 { - width:125.531914881% -} -.row-fluid .span16 { - width:134.042553178% -} -.container { - width:940px; - margin-left:auto; - margin-right:auto; - *zoom:1 -} -.container:before,.container:after { - display:table; - content:"" -} -.container:after { - clear:both -} -.container-fluid { - padding-left:20px; - padding-right:20px; - *zoom:1 -} -.container-fluid:before,.container-fluid:after { - display:table; - content:"" -} -.container-fluid:after { - clear:both -} -p { - margin:0 0 9px; - font-family:"Helvetica Neue",Helvetica,Arial,sans-serif; - font-size:13px; - line-height:18px -} -p small { - font-size:11px; - color:#999 -} -.lead { - margin-bottom:18px; - font-size:20px; - font-weight:200; - line-height:27px -} -h1,h2,h3,h4,h5,h6 { - margin:0; - font-weight:bold; - color:#333; - text-rendering:optimizelegibility -} -h1 small,h2 small,h3 small,h4 small,h5 small,h6 small { - font-weight:normal; - color:#999 -} -h1 { - font-size:30px; - line-height:36px -} -h1 small { - font-size:18px -} -h2 { - font-size:24px; - line-height:36px -} -h2 small { - font-size:18px -} -h3 { - line-height:27px; - font-size:18px -} -h3 small { - font-size:14px -} -h4,h5,h6 { - line-height:18px -} -h4 { - font-size:14px -} -h4 small { - font-size:12px -} -h5 { - font-size:12px -} -h6 { - font-size:11px; - color:#999; - text-transform:uppercase -} -.page-header { - padding-bottom:17px; - margin:18px 0; - border-bottom:1px solid #eee -} -.page-header h1 { - line-height:1 -} -ul,ol { - padding:0; - margin:0 0 9px 25px -} -ul ul,ul ol,ol ol,ol ul { - margin-bottom:0 -} -ul { - list-style:disc -} -ol { - list-style:decimal -} -li { - line-height:18px -} -ul.unstyled { - margin-left:0; - list-style:none -} -dl { - margin-bottom:18px -} -dt,dd { - line-height:18px -} -dt { - font-weight:bold -} -dd { - margin-left:9px -} -hr { - margin:18px 0; - border:0; - border-top:1px solid #e5e5e5; - border-bottom:1px solid #fff -} -strong { - font-weight:bold -} -em { - font-style:italic -} -.muted { - color:#999 -} -abbr { - font-size:90%; - text-transform:uppercase; - border-bottom:1px dotted #ddd; - cursor:help -} -blockquote { - padding:0 0 0 15px; - margin:0 0 18px; - border-left:5px solid #eee -} -blockquote p { - margin-bottom:0; - font-size:16px; - font-weight:300; - line-height:22px -} -blockquote small { - display:block; - line-height:18px; - color:#999 -} -blockquote small:before { - content:'\2014 \00A0' -} -blockquote.pull-right { - float:right; - padding-left:0; - padding-right:15px; - border-left:0; - border-right:5px solid #eee -} -blockquote.pull-right p,blockquote.pull-right small { - text-align:right -} -q:before,q:after,blockquote:before,blockquote:after { - content:"" -} -address { - display:block; - margin-bottom:18px; - line-height:18px; - font-style:normal -} -small { - font-size:100% -} -cite { - font-style:normal -} -code,pre { - padding:0 3px 2px; - font-family:Menlo,Monaco,"Courier New",monospace; - font-size:12px; - color:#333; - -webkit-border-radius:3px; - -moz-border-radius:3px; - border-radius:3px -} -code { - padding:3px 4px; - color:#d14; - background-color:#f7f7f9; - border:1px solid #e1e1e8 -} -pre { - display:block; - padding:8px; - margin:0 0 9px; - font-size:12px; - line-height:18px; - background-color:#e4e4e0; - border:1px solid #ccc; - border:1px solid rgba(0,0,0,0.15); - -webkit-border-radius:4px; - -moz-border-radius:4px; - border-radius:4px; - white-space:pre; - white-space:pre-wrap; - word-break:break-all -} -pre.prettyprint { - margin-bottom:18px -} -pre code { - padding:0; - background-color:transparent -} -form { - margin:0 0 18px -} -fieldset { - padding:0; - margin:0; - border:0 -} -legend { - display:block; - width:100%; - padding:0; - margin-bottom:27px; - font-size:19.5px; - line-height:36px; - color:#333; - border:0; - border-bottom:1px solid #eee -} -label,input,button,select,textarea { - font-family:"Helvetica Neue",Helvetica,Arial,sans-serif; - font-size:13px; - font-weight:normal; - line-height:18px -} -label { - display:block; - margin-bottom:5px; - color:#333 -} -input,textarea,select,.uneditable-input { - display:inline-block; - width:210px; - height:18px; - padding:4px; - margin-bottom:9px; - font-size:13px; - line-height:18px; - color:#555; - border:1px solid #ccc; - -webkit-border-radius:3px; - -moz-border-radius:3px; - border-radius:3px -} -.uneditable-textarea { - width:auto; - height:auto -} -label input,label textarea,label select { - display:block -} -input[type="image"],input[type="checkbox"],input[type="radio"] { - width:auto; - height:auto; - padding:0; - margin:3px 0; - *margin-top:0; - line-height:normal; - border:0; - cursor:pointer; - -webkit-border-radius:0; - -moz-border-radius:0; - border-radius:0 -} -input[type="file"] { - padding:initial; - line-height:initial; - border:initial; - background-color:#fff; - background-color:initial; - -webkit-box-shadow:none; - -moz-box-shadow:none; - box-shadow:none -} -input[type="button"],input[type="reset"],input[type="submit"] { - width:auto; - height:auto -} -select,input[type="file"] { - height:28px; - *margin-top:4px; - line-height:28px -} -select { - width:220px; - background-color:#fff -} -select[multiple],select[size] { - height:auto -} -input[type="image"] { - -webkit-box-shadow:none; - -moz-box-shadow:none; - box-shadow:none -} -textarea { - height:auto -} -input[type="hidden"] { - display:none -} -.radio,.checkbox { - padding-left:18px -} -.radio input[type="radio"],.checkbox input[type="checkbox"] { - float:left; - margin-left:-18px -} -.controls>.radio:first-child,.controls>.checkbox:first-child { - padding-top:5px -} -.radio.inline,.checkbox.inline { - display:inline-block; - margin-bottom:0; - vertical-align:middle -} -.radio.inline+.radio.inline,.checkbox.inline+.checkbox.inline { - margin-left:10px -} -.controls>.radio.inline:first-child,.controls>.checkbox.inline:first-child { - padding-top:0 -} -input,textarea { - -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 .2s,box-shadow linear .2s; - -moz-transition:border linear .2s,box-shadow linear .2s; - -ms-transition:border linear .2s,box-shadow linear .2s; - -o-transition:border linear .2s,box-shadow linear .2s; - transition:border linear .2s,box-shadow linear .2s -} -input:focus,textarea:focus { - border-color:rgba(82,168,236,0.8); - -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); - outline:0; - outline:thin dotted \9 -} -input[type="file"]:focus,input[type="checkbox"]:focus,select:focus { - -webkit-box-shadow:none; - -moz-box-shadow:none; - box-shadow:none; - outline:thin dotted; - outline:5px auto -webkit-focus-ring-color; - outline-offset:-2px -} -.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 { - float:none; - margin-left:0 -} -input.span1,textarea.span1,.uneditable-input.span1 { - width:30px -} -input.span2,textarea.span2,.uneditable-input.span2 { - width:90px -} -input.span3,textarea.span3,.uneditable-input.span3 { - width:150px -} -input.span4,textarea.span4,.uneditable-input.span4 { - width:210px -} -input.span5,textarea.span5,.uneditable-input.span5 { - width:270px -} -input.span6,textarea.span6,.uneditable-input.span6 { - width:330px -} -input.span7,textarea.span7,.uneditable-input.span7 { - width:390px -} -input.span8,textarea.span8,.uneditable-input.span8 { - width:450px -} -input.span9,textarea.span9,.uneditable-input.span9 { - width:510px -} -input.span10,textarea.span10,.uneditable-input.span10 { - width:570px -} -input.span11,textarea.span11,.uneditable-input.span11 { - width:630px -} -input.span12,textarea.span12,.uneditable-input.span12 { - width:690px -} -input.span13,textarea.span13,.uneditable-input.span13 { - width:750px -} -input.span14,textarea.span14,.uneditable-input.span14 { - width:810px -} -input.span15,textarea.span15,.uneditable-input.span15 { - width:870px -} -input.span16,textarea.span16,.uneditable-input.span16 { - width:930px -} -input[disabled],select[disabled],textarea[disabled],input[readonly],select[readonly],textarea[readonly] { - background-color:#e4e4e0; - border-color:#ddd; - cursor:not-allowed -} -.control-group.warning>label,.control-group.warning .help-block,.control-group.warning .help-inline { - color:#c09853 -} -.control-group.warning input,.control-group.warning select,.control-group.warning textarea { - color:#c09853; - border-color:#c09853 -} -.control-group.warning input:focus,.control-group.warning select:focus,.control-group.warning textarea:focus { - border-color:#a47e3c; - -webkit-box-shadow:0 0 6px #dbc59e; - -moz-box-shadow:0 0 6px #dbc59e; - box-shadow: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>label,.control-group.error .help-block,.control-group.error .help-inline { - color:#b94a48 -} -.control-group.error input,.control-group.error select,.control-group.error textarea { - color:#b94a48; - border-color:#b94a48 -} -.control-group.error input:focus,.control-group.error select:focus,.control-group.error textarea:focus { - border-color:#953b39; - -webkit-box-shadow:0 0 6px #d59392; - -moz-box-shadow:0 0 6px #d59392; - box-shadow: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>label,.control-group.success .help-block,.control-group.success .help-inline { - color:#468847 -} -.control-group.success input,.control-group.success select,.control-group.success textarea { - color:#468847; - border-color:#468847 -} -.control-group.success input:focus,.control-group.success select:focus,.control-group.success textarea:focus { - border-color:#356635; - -webkit-box-shadow:0 0 6px #7aba7b; - -moz-box-shadow:0 0 6px #7aba7b; - box-shadow: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 -} -input:focus:required:invalid,textarea:focus:required:invalid,select:focus:required:invalid { - color:#b94a48; - border-color:#ee5f5b -} -input:focus:required:invalid:focus,textarea:focus:required:invalid:focus,select:focus:required: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:17px 20px 18px; - margin-top:18px; - margin-bottom:18px; - background-color:#e4e4e0; - border-top:1px solid #ddd -} -.uneditable-input { - display:block; - background-color:#fff; - border-color:#eee; - -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); - cursor:not-allowed -} -:-moz-placeholder { - color:#999 -} -::-webkit-input-placeholder { - color:#999 -} -.help-block { - margin-top:5px; - margin-bottom:0; - color:#999 -} -.help-inline { - display:inline-block; - *display:inline; - *zoom:1; - margin-bottom:9px; - vertical-align:middle; - padding-left:5px -} -.input-prepend,.input-append { - margin-bottom:5px; - *zoom:1 -} -.input-prepend:before,.input-append:before,.input-prepend:after,.input-append:after { - display:table; - content:"" -} -.input-prepend:after,.input-append:after { - clear:both -} -.input-prepend input,.input-append input,.input-prepend .uneditable-input,.input-append .uneditable-input { - -webkit-border-radius:0 3px 3px 0; - -moz-border-radius:0 3px 3px 0; - border-radius:0 3px 3px 0 -} -.input-prepend input:focus,.input-append input:focus,.input-prepend .uneditable-input:focus,.input-append .uneditable-input:focus { - position:relative; - z-index:2 -} -.input-prepend .uneditable-input,.input-append .uneditable-input { - border-left-color:#ccc -} -.input-prepend .add-on,.input-append .add-on { - float:left; - display:block; - width:auto; - min-width:16px; - height:18px; - margin-right:-1px; - padding:4px 5px; - font-weight:normal; - line-height:18px; - color:#999; - text-align:center; - text-shadow:0 1px 0 #fff; - background-color:#e4e4e0; - border:1px solid #ccc; - -webkit-border-radius:3px 0 0 3px; - -moz-border-radius:3px 0 0 3px; - border-radius:3px 0 0 3px -} -.input-prepend .active,.input-append .active { - background-color:#a9dba9; - border-color:#46a546 -} -.input-prepend .add-on { - *margin-top:1px -} -.input-append input,.input-append .uneditable-input { - float:left; - -webkit-border-radius:3px 0 0 3px; - -moz-border-radius:3px 0 0 3px; - border-radius:3px 0 0 3px -} -.input-append .uneditable-input { - border-right-color:#ccc -} -.input-append .add-on { - margin-right:0; - margin-left:-1px; - -webkit-border-radius:0 3px 3px 0; - -moz-border-radius:0 3px 3px 0; - border-radius:0 3px 3px 0 -} -.input-append input:first-child { - *margin-left:-160px -} -.input-append input:first-child+.add-on { - *margin-left:-21px -} -.search-query { - padding-left:14px; - padding-right:14px; - margin-bottom:0; - -webkit-border-radius:14px; - -moz-border-radius:14px; - border-radius: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 { - display:inline-block; - margin-bottom:0 -} -.form-search label,.form-inline label,.form-search .input-append,.form-inline .input-append,.form-search .input-prepend,.form-inline .input-prepend { - display:inline-block -} -.form-search .input-append .add-on,.form-inline .input-prepend .add-on,.form-search .input-append .add-on,.form-inline .input-prepend .add-on { - vertical-align:middle -} -.control-group { - margin-bottom:9px -} -.form-horizontal legend+.control-group { - margin-top:18px; - -webkit-margin-top-collapse:separate -} -.form-horizontal .control-group { - margin-bottom:18px; - *zoom:1 -} -.form-horizontal .control-group:before,.form-horizontal .control-group:after { - display:table; - content:"" -} -.form-horizontal .control-group:after { - clear:both -} -.form-horizontal .control-group>label { - float:left; - width:140px; - padding-top:5px; - text-align:right -} -.form-horizontal .controls { - margin-left:160px -} -.form-horizontal .form-actions { - padding-left:160px -} -table { - max-width:100%; - border-collapse:collapse; - border-spacing:0 -} -.table { - width:100%; - margin-bottom:18px -} -.table th,.table td { - padding:8px; - line-height:18px; - text-align:left; - border-top:1px solid #ddd -} -.table th { - font-weight:bold; - vertical-align:bottom -} -.table td { - vertical-align:top -} -.table thead:first-child tr th,.table thead:first-child tr td { - border-top:0 -} -.table tbody+tbody { - border-top:2px solid #ddd -} -.table-condensed th,.table-condensed td { - padding:4px 5px -} -.table-bordered { - border:1px solid #ddd; - border-collapse:separate; - *border-collapse:collapsed; - -webkit-border-radius:4px; - -moz-border-radius:4px; - border-radius:4px -} -.table-bordered th+th,.table-bordered td+td,.table-bordered th+td,.table-bordered td+th { - border-left:1px solid #ddd -} -.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 { - -webkit-border-radius:4px 0 0 0; - -moz-border-radius:4px 0 0 0; - border-radius:4px 0 0 0 -} -.table-bordered thead:first-child tr:first-child th:last-child,.table-bordered tbody:first-child tr:first-child td:last-child { - -webkit-border-radius:0 4px 0 0; - -moz-border-radius:0 4px 0 0; - border-radius:0 4px 0 0 -} -.table-bordered thead:last-child tr:last-child th:first-child,.table-bordered tbody:last-child tr:last-child td:first-child { - -webkit-border-radius:0 0 0 4px; - -moz-border-radius:0 0 0 4px; - border-radius:0 0 0 4px -} -.table-bordered thead:last-child tr:last-child th:last-child,.table-bordered tbody:last-child tr:last-child td:last-child { - -webkit-border-radius:0 0 4px 0; - -moz-border-radius:0 0 4px 0; - border-radius:0 0 4px 0 -} -.table-striped tbody tr:nth-child(odd) td,.table-striped tbody tr:nth-child(odd) th { - background-color:#f9f9f9 -} -table .span1 { - float:none; - width:24px; - margin-left:0 -} -table .span2 { - float:none; - width:84px; - margin-left:0 -} -table .span3 { - float:none; - width:144px; - margin-left:0 -} -table .span4 { - float:none; - width:204px; - margin-left:0 -} -table .span5 { - float:none; - width:264px; - margin-left:0 -} -table .span6 { - float:none; - width:324px; - margin-left:0 -} -table .span7 { - float:none; - width:384px; - margin-left:0 -} -table .span8 { - float:none; - width:444px; - margin-left:0 -} -table .span9 { - float:none; - width:504px; - margin-left:0 -} -table .span10 { - float:none; - width:564px; - margin-left:0 -} -table .span11 { - float:none; - width:624px; - margin-left:0 -} -table .span12 { - float:none; - width:684px; - margin-left:0 -} -[class^="icon-"] { - display:inline-block; - width:14px; - height:14px; - vertical-align:text-top; - background-image:url(../img/glyphicons-halflings.png); - background-position:14px 14px; - background-repeat:no-repeat; - *margin-right:.3em -} -[class^="icon-"]:last-child { - *margin-left:0 -} -.icon-white { - 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 { - 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 { - background-position:-384px -120px -} -.icon-folder-open { - 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 -} -.dropdown { - position:relative -} -.dropdown-toggle { - *margin-bottom:-3px -} -.dropdown-toggle:active,.open .dropdown-toggle { - outline:0 -} -.caret { - display:inline-block; - width:0; - height:0; - text-indent:-99999px; - *text-indent:0; - vertical-align:top; - border-left:4px solid transparent; - border-right:4px solid transparent; - border-top:4px solid #000; - opacity:.3; - filter:alpha(opacity=30); - content:"\2193" -} -.dropdown .caret { - margin-top:8px; - margin-left:2px -} -.dropdown:hover .caret,.open.dropdown .caret { - opacity:1; - filter:alpha(opacity=100) -} -.dropdown-menu { - position:absolute; - top:100%; - left:0; - z-index:1000; - float:left; - display:none; - min-width:160px; - max-width:220px; - _width:160px; - padding:4px 0; - margin:0; - list-style:none; - background-color:#fff; - border-color:#ccc; - border-color:rgba(0,0,0,0.2); - border-style:solid; - border-width:1px; - -webkit-border-radius:0 0 5px 5px; - -moz-border-radius:0 0 5px 5px; - border-radius:0 0 5px 5px; - -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; - *border-right-width:2px; - *border-bottom-width:2px -} -.dropdown-menu.bottom-up { - top:auto; - bottom:100%; - margin-bottom:2px -} -.dropdown-menu .divider { - height:1px; - margin:5px 1px; - overflow:hidden; - background-color:#e5e5e5; - border-bottom:1px solid #fff; - *width:100%; - *margin:-5px 0 5px -} -.dropdown-menu a { - display:block; - padding:3px 15px; - clear:both; - font-weight:normal; - line-height:18px; - color:#555; - white-space:nowrap -} -.dropdown-menu li>a:hover,.dropdown-menu .active>a,.dropdown-menu .active>a:hover { - color:#fff; - text-decoration:none; - background-color:rgba(0,109,204,0.7) -} -.dropdown.open { - *z-index:1000 -} -.dropdown.open .dropdown-toggle { - color:#fff; - background:#ccc; - background:rgba(0,0,0,0.3) -} -.dropdown.open .dropdown-menu { - display:block -} -.typeahead { - margin-top:2px; - -webkit-border-radius:4px; - -moz-border-radius:4px; - border-radius:4px -} -.well { - position:relative; - overflow:hidden; - min-height:20px; - padding:19px; - margin-bottom:20px; - background-color:white; - -webkit-border-radius:2px; - -moz-border-radius:2px; - border-radius:2px; - -webkit-box-shadow:0 1px 1px rgba(0,0,0,0.1); - -moz-box-shadow:0 1px 1px rgba(0,0,0,0.1); - box-shadow:0 1px 1px rgba(0,0,0,0.1) -} -.well blockquote { - border-color:#ddd; - border-color:rgba(0,0,0,0.15) -} -.fade { - -webkit-transition:opacity .15s linear; - -moz-transition:opacity .15s linear; - -ms-transition:opacity .15s linear; - -o-transition:opacity .15s linear; - transition:opacity .15s linear; - opacity:0 -} -.fade.in { - opacity:1 -} -.collapse { - -webkit-transition:height .35s ease; - -moz-transition:height .35s ease; - -ms-transition:height .35s ease; - -o-transition:height .35s ease; - transition:height .35s ease; - position:relative; - overflow:hidden; - height:0 -} -.collapse.in { - height:auto -} -.close { - float:right; - font-size:20px; - font-weight:bold; - line-height:18px; - color:#000; - text-shadow:0 1px 0 #fff; - opacity:.2; - filter:alpha(opacity=20) -} -.close:hover { - color:#000; - text-decoration:none; - opacity:.4; - filter:alpha(opacity=40); - cursor:pointer -} -.btn { - display:inline-block; - padding:4px 10px 4px; - font-size:13px; - line-height:18px; - color:#333; - text-align:center; - text-shadow:0 1px 1px rgba(255,255,255,0.75); - border:none; - -webkit-border-radius:3px; - -moz-border-radius:3px; - border-radius:3px; - -webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.6),0 1px 1px rgba(0,0,0,0.2); - -moz-box-shadow:inset 0 1px 0 rgba(255,255,255,0.6),0 1px 1px rgba(0,0,0,0.2); - box-shadow:inset 0 1px 0 rgba(255,255,255,0.6),0 1px 1px rgba(0,0,0,0.2); - cursor:pointer; - background-color:rgba(255,255,255,0.65); - *margin-left:.3em -} -.btn:first-child { - *margin-left:0 -} -.btn:hover { - color:#333; - text-decoration:none; - background-color:#fff; - background-position:0 -15px; - -webkit-transition:background-color .1s linear; - -moz-transition:background-color .1s linear; - -ms-transition:background-color .1s linear; - -o-transition:background-color .1s linear; - transition:background-color .1s linear -} -.btn:focus { - outline:thin dotted; - outline:5px auto -webkit-focus-ring-color; - outline-offset:-2px -} -.btn.active,.btn:active { - background-image:none; - - -webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.15),0 1px 0 rgba(255,255,255,0.6); - -moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.15),0 1px 0 rgba(255,255,255,0.6); - box-shadow:inset 0 1px 2px rgba(0,0,0,0.15),0 1px 0 rgba(255,255,255,0.6); - background-color:rgba(0,0,0,0.07); - color:rgba(0,0,0,0.5); - outline:0; - cursor:default -} -.btn.disabled,.btn[disabled] { - cursor:default; - background-image:none; - background-color:#e6e6e6; - opacity:.65; - filter:alpha(opacity=65); - -webkit-box-shadow:none; - -moz-box-shadow:none; - box-shadow:none -} -.btn-large { - padding:9px 14px; - font-size:15px; - line-height:normal; - -webkit-border-radius:3px; - -moz-border-radius:3px; - border-radius:3px -} -.btn-large .icon { - margin-top:1px -} -.btn-small { - padding:5px 9px; - font-size:11px; - line-height:16px -} -.btn-small .icon { - margin-top:-1px -} -.btn-primary,.btn-primary:hover,.btn-warning,.btn-warning:hover,.btn-danger,.btn-danger:hover,.btn-success,.btn-success:hover,.btn-info,.btn-info:hover { - text-shadow:0 -1px 0 rgba(0,0,0,0.25); - color:#fff -} -.btn-primary.active,.btn-warning.active,.btn-danger.active,.btn-success.active,.btn-info.active { - color:rgba(255,255,255,0.75) -} -.btn-primary { - background-color:rgba(0,109,204,0.7) -} -.btn-primary:hover { - background-color:rgba(0,109,204,0.9) -} -.btn-warning { - background-color:#faa732; - background-image:-moz-linear-gradient(top,#fbb450,#f89406); - background-image:-ms-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(top,#fbb450,#f89406); - background-repeat:repeat-x; - filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fbb450',endColorstr='#f89406',GradientType=0); - 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(enabled = false) -} -.btn-warning:hover,.btn-warning:active,.btn-warning.active,.btn-warning.disabled,.btn-warning[disabled] { - background-color:#f89406 -} -.btn-warning:active,.btn-warning.active { - background-color:#c67605 \9 -} -.btn-danger { - background-color:#da4f49; - background-image:-moz-linear-gradient(top,#ee5f5b,#bd362f); - background-image:-ms-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(top,#ee5f5b,#bd362f); - background-repeat:repeat-x; - filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ee5f5b',endColorstr='#bd362f',GradientType=0); - 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(enabled = false) -} -.btn-danger:hover,.btn-danger:active,.btn-danger.active,.btn-danger.disabled,.btn-danger[disabled] { - background-color:#bd362f -} -.btn-danger:active,.btn-danger.active { - background-color:#942a25 \9 -} -.btn-success { - background-color:#5bb75b; - background-image:-moz-linear-gradient(top,#62c462,#51a351); - background-image:-ms-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(top,#62c462,#51a351); - background-repeat:repeat-x; - filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#62c462',endColorstr='#51a351',GradientType=0); - 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(enabled = false) -} -.btn-success:hover,.btn-success:active,.btn-success.active,.btn-success.disabled,.btn-success[disabled] { - background-color:#51a351 -} -.btn-success:active,.btn-success.active { - background-color:#408140 \9 -} -.btn-info { - background-color:#49afcd; - background-image:-moz-linear-gradient(top,#5bc0de,#2f96b4); - background-image:-ms-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(top,#5bc0de,#2f96b4); - background-repeat:repeat-x; - filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#5bc0de',endColorstr='#2f96b4',GradientType=0); - 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(enabled = false) -} -.btn-info:hover,.btn-info:active,.btn-info.active,.btn-info.disabled,.btn-info[disabled] { - background-color:#2f96b4 -} -.btn-info:active,.btn-info.active { - background-color:#24748c \9 -} -button.btn,input[type="submit"].btn { - *padding-top:2px; - *padding-bottom:2px -} -button.btn::-moz-focus-inner,input[type="submit"].btn::-moz-focus-inner { - padding:0; - border:0 -} -button.btn.large,input[type="submit"].btn.large { - *padding-top:7px; - *padding-bottom:7px -} -button.btn.small,input[type="submit"].btn.small { - *padding-top:3px; - *padding-bottom:3px -} -.btn-group { - position:relative; - *zoom:1; - *margin-left:.3em -} -.btn-group:before,.btn-group:after { - display:table; - content:"" -} -.btn-group:after { - clear:both -} -.btn-group:first-child { - *margin-left:0 -} -.btn-group+.btn-group { - margin-left:5px -} -.btn-toolbar { - margin-top:9px; - margin-bottom:9px -} -.btn-toolbar .btn-group { - display:inline-block; - *display:inline; - *zoom:1 -} -.btn-group .btn { - position:relative; - float:left; - margin-left:1px; - -webkit-border-radius:0; - -moz-border-radius:0; - border-radius:0 -} -.btn-group .btn:first-child { - margin-left:0; - -webkit-border-top-left-radius:3px; - -moz-border-radius-topleft:3px; - border-top-left-radius:3px; - -webkit-border-bottom-left-radius:3px; - -moz-border-radius-bottomleft:3px; - border-bottom-left-radius:3px -} -.btn-group .btn:last-child,.btn-group .dropdown-toggle { - -webkit-border-top-right-radius:3px; - -moz-border-radius-topright:3px; - border-top-right-radius:3px; - -webkit-border-bottom-right-radius:3px; - -moz-border-radius-bottomright:3px; - border-bottom-right-radius:3px -} -.btn-group .btn.large:first-child { - margin-left:0; - -webkit-border-top-left-radius:3px; - -moz-border-radius-topleft:3px; - border-top-left-radius:3px; - -webkit-border-bottom-left-radius:3px; - -moz-border-radius-bottomleft:3px; - border-bottom-left-radius:3px -} -.btn-group .btn.large:last-child,.btn-group .large.dropdown-toggle { - -webkit-border-top-right-radius:3px; - -moz-border-radius-topright:3px; - border-top-right-radius:3px; - -webkit-border-bottom-right-radius:3px; - -moz-border-radius-bottomright:3px; - border-bottom-right-radius:3px -} -.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 .dropdown-toggle { - padding-left:8px; - padding-right: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); - *padding-top:5px; - *padding-bottom:5px -} -.btn-group.open { - *z-index:1000 -} -.btn-group.open .dropdown-menu { - display:block; - margin-top:1px; - -webkit-border-radius:5px; - -moz-border-radius:5px; - border-radius:5px -} -.btn-group.open .dropdown-toggle { - background-image:none; - -webkit-box-shadow:inset 0 1px 6px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05); - -moz-box-shadow:inset 0 1px 6px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05); - box-shadow:inset 0 1px 6px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05) -} -.btn .caret { - margin-top:7px; - margin-left:0 -} -.btn:hover .caret,.open.btn-group .caret { - opacity:1; - filter:alpha(opacity=100) -} -.btn-primary .caret,.btn-danger .caret,.btn-info .caret,.btn-success .caret { - border-top-color:#fff; - opacity:.75; - filter:alpha(opacity=75) -} -.btn-small .caret { - margin-top:4px -} -.alert { - padding:8px 35px 8px 14px; - margin-bottom:18px; - 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-heading { - color:#c09853 -} -.alert .close { - position:relative; - top:-2px; - right:-21px; - line-height:18px -} -.alert-success { - background-color:#dff0d8; - border-color:#d6e9c6 -} -.alert-success,.alert-success .alert-heading { - color:#468847 -} -.alert-danger,.alert-error { - background-color:#f2dede; - border-color:#eed3d7 -} -.alert-danger,.alert-error,.alert-danger .alert-heading,.alert-error .alert-heading { - color:#b94a48 -} -.alert-info { - background-color:#d9edf7; - border-color:#bce8f1 -} -.alert-info,.alert-info .alert-heading { - 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-left:0; - margin-bottom:18px; - list-style:none -} -.nav>li>a { - display:block -} -.nav>li>a:hover { - text-decoration:none; - background-color:#eee -} -.nav-list { - padding-left:14px; - padding-right:14px; - margin-bottom:0 -} -.nav-list>li>a,.nav-list .nav-header { - display:block; - padding:3px 15px; - margin-left:-15px; - margin-right:-15px; - text-shadow:0 1px 0 rgba(255,255,255,0.5) -} -.nav-list .nav-header { - font-size:11px; - font-weight:bold; - line-height:18px; - color:#999; - text-transform:uppercase -} -.nav-list>li+.nav-header { - margin-top:9px -} -.nav-list .active>a,.nav-list .active>a:hover { - color:#fff; - text-shadow:0 -1px 0 rgba(0,0,0,0.2); - background-color:rgba(0,109,204,0.7) -} -.nav-list [class^="icon-"] { - margin-right:2px -} -.nav-tabs,.nav-pills { - *zoom:1 -} -.nav-tabs:before,.nav-pills:before,.nav-tabs:after,.nav-pills:after { - display:table; - 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:9px; - padding-bottom:9px; - 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 { - border-color:#eee #eeeeee #ddd -} -.nav-tabs>.active>a,.nav-tabs>.active>a:hover { - color:#555; - background-color:#f7f6f0; - border:1px solid #ddd; - border-bottom-color:transparent; - cursor:default -} -.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 { - color:#fff; - background-color:rgba(0,109,204,0.7) -} -.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-radius:4px 4px 0 0; - -moz-border-radius:4px 4px 0 0; - border-radius:4px 4px 0 0 -} -.nav-tabs.nav-stacked>li:last-child>a { - -webkit-border-radius:0 0 4px 4px; - -moz-border-radius:0 0 4px 4px; - border-radius:0 0 4px 4px -} -.nav-tabs.nav-stacked>li>a:hover { - border-color:#ddd; - z-index:2 -} -.nav-pills.nav-stacked>li>a { - margin-bottom:3px -} -.nav-pills.nav-stacked>li:last-child>a { - margin-bottom:1px -} -.nav-tabs .dropdown-menu,.nav-pills .dropdown-menu { - margin-top:1px; - border-width:1px -} -.nav-pills .dropdown-menu { - -webkit-border-radius:4px; - -moz-border-radius:4px; - border-radius:4px -} -.nav-tabs .dropdown-toggle .caret,.nav-pills .dropdown-toggle .caret { - border-top-color:rgba(0,109,204,0.7); - margin-top:6px -} -.nav-tabs .dropdown-toggle:hover .caret,.nav-pills .dropdown-toggle:hover .caret { - border-top-color:#006dcc -} -.nav-tabs .active .dropdown-toggle .caret,.nav-pills .active .dropdown-toggle .caret { - border-top-color:#333 -} -.nav>.dropdown.active>a:hover { - color:#000; - cursor:pointer -} -.nav-tabs .open .dropdown-toggle,.nav-pills .open .dropdown-toggle,.nav>.open.active>a:hover { - color:#fff; - background-color:#999; - border-color:#999 -} -.nav .open .caret,.nav .open.active .caret,.nav .open a:hover .caret { - border-top-color:#fff; - opacity:1; - filter:alpha(opacity=100) -} -.tabs-stacked .open>a:hover { - border-color:#999 -} -.tabbable { - *zoom:1 -} -.tabbable:before,.tabbable:after { - display:table; - content:"" -} -.tabbable:after { - clear:both -} -.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 { - border-bottom-color:transparent; - border-top-color:#ddd -} -.tabs-below .nav-tabs .active>a,.tabs-below .nav-tabs .active>a:hover { - 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 { - border-color:#eee #dddddd #eee #eeeeee -} -.tabs-left .nav-tabs .active>a,.tabs-left .nav-tabs .active>a:hover { - border-color:#ddd transparent #ddd #ddd; - *border-right-color:#fff -} -.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 { - border-color:#eee #eeeeee #eee #dddddd -} -.tabs-right .nav-tabs .active>a,.tabs-right .nav-tabs .active>a:hover { - border-color:#ddd #ddd #ddd transparent; - *border-left-color:#fff -} -.navbar { - overflow:visible; - margin-bottom:18px -} -.navbar-inner { - padding-left:20px; - padding-right:20px; - background-color:#2c2c2c; - background-image:-moz-linear-gradient(top,#333,#222); - background-image:-ms-linear-gradient(top,#333,#222); - background-image:-webkit-gradient(linear,0 0,0 100%,from(#333),to(#222)); - background-image:-webkit-linear-gradient(top,#333,#222); - background-image:-o-linear-gradient(top,#333,#222); - background-image:linear-gradient(top,#333,#222); - background-repeat:repeat-x; - filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#333333',endColorstr='#222222',GradientType=0); - -webkit-border-radius:4px; - -moz-border-radius:4px; - border-radius:4px; - -webkit-box-shadow:0 1px 3px rgba(0,0,0,0.25),inset 0 -1px 0 rgba(0,0,0,0.1); - -moz-box-shadow:0 1px 3px rgba(0,0,0,0.25),inset 0 -1px 0 rgba(0,0,0,0.1); - box-shadow:0 1px 3px rgba(0,0,0,0.25),inset 0 -1px 0 rgba(0,0,0,0.1) -} -.btn-navbar { - display:none; - float:right; - padding:7px 10px; - margin-left:5px; - margin-right:5px; - background-color:#2c2c2c; - background-image:-moz-linear-gradient(top,#333,#222); - background-image:-ms-linear-gradient(top,#333,#222); - background-image:-webkit-gradient(linear,0 0,0 100%,from(#333),to(#222)); - background-image:-webkit-linear-gradient(top,#333,#222); - background-image:-o-linear-gradient(top,#333,#222); - background-image:linear-gradient(top,#333,#222); - background-repeat:repeat-x; - filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#333333',endColorstr='#222222',GradientType=0); - border-color:#222 #222222 #000; - 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(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) -} -.btn-navbar:hover,.btn-navbar:active,.btn-navbar.active,.btn-navbar.disabled,.btn-navbar[disabled] { - background-color:#222 -} -.btn-navbar:active,.btn-navbar.active { - background-color:#080808 \9 -} -.btn-navbar .icon-bar { - display:block; - width:18px; - height:2px; - background-color:#e4e4e0; - -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 -} -.nav-collapse.collapse { - height:auto -} -.navbar .brand:hover { - text-decoration:none -} -.navbar .brand { - float:left; - display:block; - padding:8px 20px 12px; - margin-left:-20px; - font-size:20px; - font-weight:200; - line-height:1; -} -.navbar .brand span.title { - border-radius: 3px; - color: #7A7A7A; - display: inline-block; - font-size: 14px; - font-weight: 700; - line-height: 1; - margin-left: -5px; - padding: 5px; - text-transform: uppercase; - vertical-align: top; -} -.navbar .brand:hover span.title{ - color: #D03737; - text-decoration: none; -} -.navbar .navbar-text { - margin-bottom:0; - line-height:40px; - color:#999 -} -.navbar .navbar-text a:hover { - color:#fff; - background-color:transparent -} -.navbar .btn,.navbar .btn-group { - margin-top:5px -} -.navbar .btn-group .btn { - margin-top:0 -} -.navbar-form { - margin-bottom:0; - *zoom:1 -} -.navbar-form:before,.navbar-form:after { - display:table; - content:"" -} -.navbar-form:after { - clear:both -} -.navbar-form input,.navbar-form select { - display:inline-block; - margin-top:5px; - margin-bottom:0 -} -.navbar-form .radio,.navbar-form .checkbox { - margin-top:5px -} -.navbar-form input[type="image"],.navbar-form input[type="checkbox"],.navbar-form input[type="radio"] { - margin-top:3px -} -.navbar-search { - position:relative; - float:left; - margin-top:6px; - margin-bottom:0 -} -.navbar-search .search-query { - padding:4px 9px; - font-family:"Helvetica Neue",Helvetica,Arial,sans-serif; - font-size:13px; - font-weight:normal; - line-height:1; - color:#fff; - color:rgba(255,255,255,0.75); - background:#666; - background:rgba(255,255,255,0.3); - border:1px solid #111; - -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; - -ms-transition:none; - -o-transition:none; - transition:none -} -.navbar-search .search-query :-moz-placeholder { - color:#eee -} -.navbar-search .search-query ::-webkit-input-placeholder { - color:#eee -} -.navbar-search .search-query:hover { - color:#fff; - background-color:#999; - background-color:rgba(255,255,255,0.5) -} -.navbar-search .search-query:focus,.navbar-search .search-query.focused { - padding:5px 10px; - color:#333; - text-shadow:0 1px 0 #fff; - background-color:#fff; - border: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); - outline:0 -} -.navbar-fixed-top { - position:fixed; - top:0; - right:0; - left:0; - z-index:1030 -} -.navbar-fixed-top .navbar-inner { - padding-left:0; - padding-right:0; - -webkit-border-radius:0; - -moz-border-radius:0; - border-radius:0 -} -.navbar .nav { - position:relative; - left:0; - display:block; - float:left; - margin:0 10px 0 0 -} -.navbar .nav.pull-right { - float:right -} -.navbar .nav>li { - display:block; - float:left -} -.navbar .nav>li>a { - float:none; - padding:10px 10px 11px; - line-height:19px; - color:#999; - text-decoration:none; - text-shadow:0 -1px 0 rgba(0,0,0,0.25) -} -.navbar .nav>li>a:hover { - background-color:transparent; - color:#fff; - text-decoration:none -} -.navbar .nav .active>a,.navbar .nav .active>a:hover { - color:#fff; - text-decoration:none; - background-color:#222; - background-color:rgba(0,0,0,0.5) -} -.navbar .divider-vertical { - height:40px; - width:1px; - margin:0 9px; - overflow:hidden; - background-color:#222; - border-right:1px solid #333 -} -.navbar .nav.pull-right { - margin-left:10px; - margin-right:0 -} -.navbar .dropdown-menu { - margin-top:1px; - -webkit-border-radius:4px; - -moz-border-radius:4px; - border-radius:4px -} -.navbar .dropdown-menu:before { - content:''; - display:inline-block; - border-left:7px solid transparent; - border-right:7px solid transparent; - border-bottom:7px solid #ccc; - border-bottom-color:rgba(0,0,0,0.2); - position:absolute; - top:-7px; - left:9px -} -.navbar .dropdown-menu:after { - content:''; - display:inline-block; - border-left:6px solid transparent; - border-right:6px solid transparent; - border-bottom:6px solid #fff; - position:absolute; - top:-6px; - left:10px -} -.navbar .nav .dropdown-toggle .caret,.navbar .nav .open.dropdown .caret { - border-top-color:#fff -} -.navbar .nav .active .caret { - opacity:1; - filter:alpha(opacity=100) -} -.navbar .nav .open>.dropdown-toggle,.navbar .nav .active>.dropdown-toggle,.navbar .nav .open.active>.dropdown-toggle { - background-color:transparent -} -.navbar .nav .active>.dropdown-toggle:hover { - color:#fff -} -.navbar .nav.pull-right .dropdown-menu { - left:auto; - right:0 -} -.navbar .nav.pull-right .dropdown-menu:before { - left:auto; - right:12px -} -.navbar .nav.pull-right .dropdown-menu:after { - left:auto; - right:13px -} -.breadcrumb { - padding:7px 14px; - margin:0 0 18px; - background-color:#fbfbfb; - background-image:-moz-linear-gradient(top,#fff,#f5f5f5); - background-image:-ms-linear-gradient(top,#fff,#f5f5f5); - background-image:-webkit-gradient(linear,0 0,0 100%,from(#fff),to(#f5f5f5)); - background-image:-webkit-linear-gradient(top,#fff,#f5f5f5); - background-image:-o-linear-gradient(top,#fff,#f5f5f5); - background-image:linear-gradient(top,#fff,#f5f5f5); - background-repeat:repeat-x; - filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff',endColorstr='#f5f5f5',GradientType=0); - border:1px solid #ddd; - -webkit-border-radius:3px; - -moz-border-radius:3px; - border-radius:3px; - -webkit-box-shadow:inset 0 1px 0 #fff; - -moz-box-shadow:inset 0 1px 0 #fff; - box-shadow:inset 0 1px 0 #fff -} -.breadcrumb li { - display:inline; - text-shadow:0 1px 0 #fff -} -.breadcrumb .divider { - padding:0 5px; - color:#999 -} -.breadcrumb .active a { - color:#333 -} -.pagination { - height:36px; - margin:18px 0 -} -.pagination ul { - display:inline-block; - *display:inline; - *zoom:1; - margin-left:0; - margin-bottom:0; - -webkit-border-radius:3px; - -moz-border-radius:3px; - border-radius:3px; - -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 li { - display:inline -} -.pagination a { - float:left; - padding:0 14px; - line-height:34px; - text-decoration:none; - border:1px solid #ddd; - border-left-width:0 -} -.pagination a:hover,.pagination .active a { - background-color:#e4e4e0 -} -.pagination .active a { - color:#999; - cursor:default -} -.pagination .disabled a,.pagination .disabled a:hover { - color:#999; - background-color:transparent; - cursor:default -} -.pagination li:first-child a { - border-left-width:1px; - -webkit-border-radius:3px 0 0 3px; - -moz-border-radius:3px 0 0 3px; - border-radius:3px 0 0 3px -} -.pagination li:last-child a { - -webkit-border-radius:0 3px 3px 0; - -moz-border-radius:0 3px 3px 0; - border-radius:0 3px 3px 0 -} -.pagination-centered { - text-align:center -} -.pagination-right { - text-align:right -} -.pager { - margin-left:0; - margin-bottom:18px; - list-style:none; - text-align:center; - *zoom:1 -} -.pager:before,.pager:after { - display:table; - content:"" -} -.pager:after { - clear:both -} -.pager li { - display:inline -} -.pager a { - 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 a:hover { - text-decoration:none; - background-color:#e4e4e0 -} -.pager .next a { - float:right -} -.pager .previous a { - float:left -} -.modal-open .dropdown-menu { - z-index:2050 -} -.modal-open .dropdown.open { - *z-index:2050 -} -.modal-open .popover { - z-index:2060 -} -.modal-open .tooltip { - z-index:2070 -} -.modal-backdrop { - position:fixed; - top:0; - right:0; - bottom:0; - left:0; - z-index:1040; - background-color:#000 -} -.modal-backdrop.fade { - opacity:0 -} -.modal-backdrop,.modal-backdrop.fade.in { - opacity:.8; - filter:alpha(opacity=80) -} -.modal { - position:fixed; - top:50%; - left:50%; - z-index:1050; - max-height:500px; - overflow:auto; - width:560px; - margin:-250px 0 0 -280px; - background-color:#fff; - 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; - -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 { - -webkit-transition:opacity .3s linear,top .3s ease-out; - -moz-transition:opacity .3s linear,top .3s ease-out; - -ms-transition:opacity .3s linear,top .3s ease-out; - -o-transition:opacity .3s linear,top .3s ease-out; - transition:opacity .3s linear,top .3s ease-out; - top:-25% -} -.modal.fade.in { - top:50% -} -.modal-header { - padding:9px 15px; - border-bottom:1px solid #eee -} -.modal-header .close { - margin-top:2px -} -.modal-body { - padding:15px -} -.modal-footer { - padding:14px 15px 15px; - margin-bottom:0; - background-color:#e4e4e0; - 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; - -webkit-box-shadow:inset 0 1px 0 #fff; - -moz-box-shadow:inset 0 1px 0 #fff; - box-shadow:inset 0 1px 0 #fff; - *zoom:1 -} -.modal-footer:before,.modal-footer:after { - display:table; - content:"" -} -.modal-footer:after { - clear:both -} -.modal-footer .btn { - float:right; - margin-left:5px; - margin-bottom:0 -} -.tooltip { - position:absolute; - z-index:1020; - display:block; - visibility:visible; - padding:5px; - font-size:11px; - opacity:0; - filter:alpha(opacity=0) -} -.tooltip.in { - opacity:.8; - filter:alpha(opacity=80) -} -.tooltip.top { - margin-top:-2px -} -.tooltip.right { - margin-left:2px -} -.tooltip.bottom { - margin-top:2px -} -.tooltip.left { - margin-left:-2px -} -.tooltip.top .tooltip-arrow { - bottom:0; - left:50%; - margin-left:-5px; - border-left:5px solid transparent; - border-right:5px solid transparent; - border-top:5px solid #000 -} -.tooltip.left .tooltip-arrow { - top:50%; - right:0; - margin-top:-5px; - border-top:5px solid transparent; - border-bottom:5px solid transparent; - border-left:5px solid #000 -} -.tooltip.bottom .tooltip-arrow { - top:0; - left:50%; - margin-left:-5px; - border-left:5px solid transparent; - border-right:5px solid transparent; - border-bottom:5px solid #000 -} -.tooltip.right .tooltip-arrow { - top:50%; - left:0; - margin-top:-5px; - border-top:5px solid transparent; - border-bottom:5px solid transparent; - border-right:5px solid #000 -} -.tooltip-inner { - max-width:200px; - padding:3px 8px; - color:#fff; - text-align:center; - text-decoration:none; - background-color:#000; - -webkit-border-radius:4px; - -moz-border-radius:4px; - border-radius:4px -} -.tooltip-arrow { - position:absolute; - width:0; - height:0 -} -.popover { - position:absolute; - top:0; - left:0; - z-index:1010; - display:none; - padding:5px -} -.popover.top { - margin-top:-5px -} -.popover.right { - margin-left:5px -} -.popover.bottom { - margin-top:5px -} -.popover.left { - margin-left:-5px -} -.popover.top .arrow { - bottom:0; - left:50%; - margin-left:-5px; - border-left:5px solid transparent; - border-right:5px solid transparent; - border-top:5px solid #000 -} -.popover.right .arrow { - top:50%; - left:0; - margin-top:-5px; - border-top:5px solid transparent; - border-bottom:5px solid transparent; - border-right:5px solid #000 -} -.popover.bottom .arrow { - top:0; - left:50%; - margin-left:-5px; - border-left:5px solid transparent; - border-right:5px solid transparent; - border-bottom:5px solid #000 -} -.popover.left .arrow { - top:50%; - right:0; - margin-top:-5px; - border-top:5px solid transparent; - border-bottom:5px solid transparent; - border-left:5px solid #000 -} -.popover .arrow { - position:absolute; - width:0; - height:0 -} -.popover-inner { - padding:3px; - width:280px; - overflow:hidden; - background:#000; - background:rgba(0,0,0,0.8); - -webkit-border-radius:6px; - -moz-border-radius:6px; - border-radius:6px; - -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) -} -.popover-title { - padding:9px 15px; - line-height:1; - background-color:#e4e4e0; - border-bottom:1px solid #eee; - -webkit-border-radius:3px 3px 0 0; - -moz-border-radius:3px 3px 0 0; - border-radius:3px 3px 0 0 -} -.popover-content { - padding:14px; - background-color:#fff; - -webkit-border-radius:0 0 3px 3px; - -moz-border-radius:0 0 3px 3px; - border-radius:0 0 3px 3px; - -webkit-background-clip:padding-box; - -moz-background-clip:padding-box; - background-clip:padding-box -} -.popover-content p,.popover-content ul,.popover-content ol { - margin-bottom:0 -} -.thumbnails { - margin-left:-20px; - list-style:none; - *zoom:1 -} -.thumbnails:before,.thumbnails:after { - display:table; - content:"" -} -.thumbnails:after { - clear:both -} -.thumbnails>li { - float:left; - margin:0 0 18px 20px -} -.thumbnail { - display:block; - padding:4px; - line-height:1; - border:1px solid #ddd; - -webkit-border-radius:4px; - -moz-border-radius:4px; - border-radius:4px; - -webkit-box-shadow:0 1px 1px rgba(0,0,0,0.075); - -moz-box-shadow:0 1px 1px rgba(0,0,0,0.075); - box-shadow:0 1px 1px rgba(0,0,0,0.075) -} -a.thumbnail:hover { - border-color:rgba(0,109,204,0.7); - -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-left:auto; - margin-right:auto -} -.thumbnail .caption { - padding:9px -} -.label { - padding:1px 3px 2px; - font-size:9.75px; - font-weight:bold; - color:#fff; - text-transform:uppercase; - background-color:#999; - -webkit-border-radius:3px; - -moz-border-radius:3px; - border-radius:3px -} -.label-important { - background-color:#b94a48 -} -.label-warning { - background-color:#f89406 -} -.label-success { - background-color:#468847 -} -.label-info { - background-color:#3a87ad -} -@-webkit-keyframes progress-bar-stripes { - from { - background-position:0 0 - } - to { - background-position:40px 0 - } - -} -@-moz-keyframes progress-bar-stripes { - from { - background-position:0 0 - } - to { - background-position:40px 0 - } - -} -@keyframes progress-bar-stripes { - from { - background-position:0 0 - } - to { - background-position:40px 0 - } - -} -.progress { - overflow:hidden; - height:18px; - margin-bottom:18px; - background-color:#f7f7f7; - background-image:-moz-linear-gradient(top,#f5f5f5,#f9f9f9); - background-image:-ms-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(top,#f5f5f5,#f9f9f9); - background-repeat:repeat-x; - filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#f5f5f5',endColorstr='#f9f9f9',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); - -webkit-border-radius:4px; - -moz-border-radius:4px; - border-radius:4px -} -.progress .bar { - width:0; - height:18px; - color:#fff; - font-size:12px; - 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:-ms-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(top,#149bdf,#0480be); - background-repeat:repeat-x; - filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#149bdf',endColorstr='#0480be',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 .6s ease; - -moz-transition:width .6s ease; - -ms-transition:width .6s ease; - -o-transition:width .6s ease; - transition:width .6s ease -} -.progress-striped .bar { - 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:-ms-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; - animation:progress-bar-stripes 2s linear infinite -} -.progress-danger .bar { - background-color:#dd514c; - background-image:-moz-linear-gradient(top,#ee5f5b,#c43c35); - background-image:-ms-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(top,#ee5f5b,#c43c35); - background-repeat:repeat-x; - filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ee5f5b',endColorstr='#c43c35',GradientType=0) -} -.progress-danger.progress-striped .bar { - 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:-ms-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 { - background-color:#5eb95e; - background-image:-moz-linear-gradient(top,#62c462,#57a957); - background-image:-ms-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(top,#62c462,#57a957); - background-repeat:repeat-x; - filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#62c462',endColorstr='#57a957',GradientType=0) -} -.progress-success.progress-striped .bar { - 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:-ms-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 { - background-color:#4bb1cf; - background-image:-moz-linear-gradient(top,#5bc0de,#339bb9); - background-image:-ms-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(top,#5bc0de,#339bb9); - background-repeat:repeat-x; - filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#5bc0de',endColorstr='#339bb9',GradientType=0) -} -.progress-info.progress-striped .bar { - 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:-ms-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:18px -} -.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-inner { - padding:9px 15px; - border-top:1px solid #e5e5e5 -} -.carousel { - position:relative; - margin-bottom:18px; - line-height:1 -} -.carousel-inner { - overflow:hidden; - width:100%; - position:relative -} -.carousel .item { - display:none; - position:relative; - -webkit-transition:.6s ease-in-out left; - -moz-transition:.6s ease-in-out left; - -ms-transition:.6s ease-in-out left; - -o-transition:.6s ease-in-out left; - transition:.6s ease-in-out left -} -.carousel .item>img { - display:block; - line-height:1 -} -.carousel .active,.carousel .next,.carousel .prev { - display:block -} -.carousel .active { - left:0 -} -.carousel .next,.carousel .prev { - position:absolute; - top:0; - width:100% -} -.carousel .next { - left:100% -} -.carousel .prev { - left:-100% -} -.carousel .next.left,.carousel .prev.right { - left:0 -} -.carousel .active.left { - left:-100% -} -.carousel .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:#fff; - text-align:center; - background:#222; - border:3px solid #fff; - -webkit-border-radius:23px; - -moz-border-radius:23px; - border-radius:23px; - opacity:.5; - filter:alpha(opacity=50) -} -.carousel-control.right { - left:auto; - right:15px -} -.carousel-control:hover { - color:#fff; - text-decoration:none; - opacity:.9; - filter:alpha(opacity=90) -} -.carousel-caption { - position:absolute; - left:0; - right:0; - bottom:0; - padding:10px 15px 5px; - background:#333; - background:rgba(0,0,0,0.75) -} -.carousel-caption h4,.carousel-caption p { - color:#fff -} -.hero-unit { - padding:60px; - margin-bottom:30px; - background-color:#e4e4e0; - -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 -} -.hero-unit p { - font-size:18px; - font-weight:200; - line-height:27px -} -.pull-right { - float:right -} -.pull-left { - float:left -} -.hide { - display:none -} -.show { - display:block -} -.invisible { - visibility:hidden -} -.span-one-third { - width:300px -} -.span-two-thirds { - width:620px -} -.offset-one-third { - margin-left:340px -} -.offset-two-thirds { - margin-left:660px -} -.label-notice { - background-color:#62cffc -} -.form-horizontal .control-group>.field_with_errors>label { - float:left; - width:140px; - padding-top:5px; - text-align:right -} -.border-box { - box-sizing:border-box; - -moz-box-sizing:border-box; - -webkit-box-sizing:border-box -} -#modal-signin,#modal-signup { - width:230px; - margin:-120px 0 0 -120px -} -#modal-signin a:hover,#modal-signup a:hover { - text-decoration:none -} -html,body { - height:100% -} -#wrapper,.wrapper { - min-height:100%; - height:auto!important; - height:100%; - padding-bottom:18px; - margin-bottom:-258px; - box-sizing:border-box; - -moz-box-sizing:border-box; - -webkit-box-sizing:border-box -} -.bg-blue { - background: url(../img/bg-blue.jpg) no-repeat center center fixed; - -webkit-background-size: cover; - -moz-background-size: cover; - -o-background-size: cover; - background-size: cover; -} -.bg-bookpage { - background: url(../img/bg_booklet.png) 0 0 no-repeat;; - -webkit-background-size: cover; - -moz-background-size: cover; - -o-background-size: cover; - background-size: cover; -} - -.push { - height:258px -} -.footer { - position:relative; - z-index:2; - margin-top:36px; - border-top:1px solid whitesmoke; - padding:35px 0 36px; - font-size:13px; - background:white; - height:150px -} -.footer h3 small { - font-size:13px -} -.btn { - box-shadow:inset 0 1px 0 rgba(255,255,255,0.8),0 1px 1px rgba(0,0,0,0.25); - background-image:-webkit-linear-gradient(top,transparent,rgba(0,0,0,0.05)); - background-image:-moz-linear-gradient(top,transparent,rgba(0,0,0,0.05)) -} -.btn:hover { - background-position:0 0; - -webkit-transition:none -} -.btn-group .btn-primary { - padding-bottom:2px -} -.btn-primary { - background-color:#48A1EE; - -webkit-box-shadow:inset 0 1px 0 #8ec5f5,0 1px 1px rgba(0,0,0,0.3); - -moz-box-shadow:inset 0 1px 0 #8ec5f5,0 1px 1px rgba(0,0,0,0.3); - box-shadow:inset 0 1px 0 #8ec5f5,0 1px 1px rgba(0,0,0,0.3); - background-image:-webkit-linear-gradient(top,transparent,rgba(0,0,0,0.15)); - background-image:-moz-linear-gradient(top,transparent,rgba(0,0,0,0.15)); - border:1px solid #147cd6; - box-sizing:border-box -} -.btn-primary:hover { - background-color:#5fadf0; - border:1px solid #48A1EE -} -.btn-success { - background-color:#5BB75B; - -webkit-box-shadow:inset 0 1px 0 #90ce90,0 1px 1px rgba(0,0,0,0.3); - -moz-box-shadow:inset 0 1px 0 #90ce90,0 1px 1px rgba(0,0,0,0.3); - box-shadow:inset 0 1px 0 #90ce90,0 1px 1px rgba(0,0,0,0.3); - background-image:-webkit-linear-gradient(top,transparent,rgba(0,0,0,0.15)); - background-image:-moz-linear-gradient(top,transparent,rgba(0,0,0,0.15)); - border:1px solid #3c893c; - box-sizing:border-box; - padding-bottom:2px -} -.btn-success.btn-large { - padding-bottom:9px -} -.btn-success:hover { - background-color:#6dbf6d; - border:1px solid #5BB75B -} -.follow-button { - position:relative; - display:inline-block; - height:26px -} -.follow-button .button-overlay { - visibility:hidden; - position:absolute; - top:0; - left:0; - width:100%; - height:26px; - opacity:.6; - background-color:whiteSmoke; - z-index:10 -} -.follow-button .button-overlay img { - position:absolute; - top:50%; - margin-top:-5px; - left:50%; - margin-left:-8px -} -.follow-button .bundle-follow-button,.follow-button .user-follow-button { - height:26px -} -table td .follow-button { - margin-left:auto -} -table td .follow-button .button-overlay { - right:0; - left:auto -} -#account-header { - margin-bottom:18px; - float:left; - width:100% -} -.account-right-container { - overflow:hidden -} -.account-info-avatar { - position:relative; - float:left; - height:100px; - width:100px; - -webkit-border-radius:2px; - -moz-border-radius:2px; - border-radius:2px -} -.account-info-avatar:after { - border:1px solid rgba(0,0,0,0.1); - bottom:0; - content:''; - left:0; - position:absolute; - right:0; - top:0 -} -.account-info-avatar .account-info-avatar-edit { - display:none; - position:absolute; - right:0; - top:0; - padding:2px 4px; - background-color:rgba(0,0,0,0.8); - border-bottom-left-radius:4px; - z-index:2 -} -.account-info-avatar .account-info-avatar-edit i { - opacity:.5; - filter:alpha(opacity=50) -} -.account-info-avatar .account-info-avatar-edit:hover { - cursor:pointer -} -.account-info-avatar .account-info-avatar-edit:hover i { - opacity:1; - filter:alpha(opacity=100) -} -.account-info-avatar:hover .account-info-avatar-edit { - display:block -} -#account-info #account-info-text { - float:left; - padding:0 20px; - max-width:50% -} -#account-info #account-info-twitter { - background:url(../img/social_sprite.png) 0 -24px no-repeat -} -#account-info #account-info-facebook { - background:url(../img/social_sprite.png) 0 0 no-repeat -} -#account-info-social { - float:left; - margin-top:4.5px -} -#account-info-social .btn-social { - padding:4px 10px 4px; - background-color:white; - -webkit-border-radius:2px; - -moz-border-radius:2px; - border-radius:2px; - -webkit-box-shadow:0 1px 1px rgba(0,0,0,0.1); - -moz-box-shadow:0 1px 1px rgba(0,0,0,0.1); - box-shadow:0 1px 1px rgba(0,0,0,0.1) -} -#account-info-social .btn-social:hover { - text-decoration:none; - -webkit-box-shadow:none; - -moz-box-shadow:none; - box-shadow:none -} -#account-info-social li { - float:left; - margin-right:9px; - list-style-type:none -} -.user-badge { - padding:1px 3px 2px; - font-size:9.75px; - font-weight:bold; - color:#fff; - text-transform:uppercase; - background-color:#999; - -webkit-border-radius:3px; - -moz-border-radius:3px; - border-radius:3px; - vertical-align:top -} -.user-staff { - background-color:#d03737 -} -.user-beta { - background-color:#98CD94 -} -.user-premium,.label.label-premium { - background-color:#46ADCB -} -.user-event-partner { - background-color:#f89406 -} -.account-bundles { - margin-left:240px -} -.account-bundles .bundle .bundle-inner { - height:160px -} -.account-bundles .bundle .bundle-clip-link { - height:160px -} -.btn-create-bundle { - margin-left:13px; - margin-bottom:18px -} -.bundles-groups { - overflow:hidden; - margin-bottom:36px -} -.bundles-groups h3 { - margin:0 0 18px 20px -} -.all-bundles { - margin-left:20px - -} -.all-bundles h3 { - margin-left:0 -} -.bundles-group { - float:left; - width:100%; - clear:none; - display:table; - border-top:1px solid #DDD; - padding:18px 0 0 -} -.bundles-group .bundles-group-letter { - display:table-cell; - width:72px; - vertical-align:top; - color:#999; - font-size:27px; - font-weight:bold; - text-shadow:0 2px 0 whitesmoke; - padding-top:9px -} -.bundles-group .bundles-group-container { - display:table-cell -} -.bundles-group .bundles-group-container .bundles-group-bundle { - position:relative; - float:left; - width:100%; - clear:none; - margin-bottom:18px -} -.bundles-group .bundles-group-container .bundles-group-bundle .bundles-group-bundle-cover { - float:left -} -.bundles-group .bundles-group-container .bundles-group-bundle .bundles-group-bundle-cover .bundles-group-bundle-photo { - width:56px; - height:56px; - position:relative -} -.bundles-group .bundles-group-container .bundles-group-bundle .bundles-group-bundle-cover .bundles-group-bundle-photo a { - display:block -} -.bundles-group .bundles-group-container .bundles-group-bundle .bundles-group-bundle-cover .bundles-group-bundle-photo:after { - content:''; - position:absolute; - top:0; - bottom:0; - left:0; - right:0; - border:1px solid rgba(0,0,0,0.1) -} -.bundles-group .bundles-group-container .bundles-group-bundle .bundles-group-data-container { - margin-left:72px -} -.bundles-group .bundles-group-container .bundles-group-bundle .bundles-group-bundle-title { - line-height:27px; - font-size:18px; - font-weight:300; - margin-bottom:9px -} -.bundles-group .bundles-group-container .bundles-group-bundle .bundles-group-bundle-title a,.bundles-group .bundles-group-container .bundles-group-bundle .bundles-group-bundle-title a:hover { - color:#333 -} -.bundles-group .bundles-group-container .bundles-group-bundle .bundles-group-bundle-data { - height:18px; - margin-bottom:0; - background:transparent; - font-size:11px; - line-height:14px; - color:#999 -} -.bundles-group .bundles-group-container .bundles-group-bundle .bundles-group-bundle-data i,.bundles-group .bundles-group-container .bundles-group-bundle .bundles-group-bundle-data img { - opacity:.25; - filter:alpha(opacity=25); - vertical-align:text-bottom -} -#account-settings .tab-content,#account-settings .tab-content>form { - float:left -} -#new_user.form-horizontal .control-group>label,#edit_user.form-horizontal .control-group>label,#new_user.form-horizontal .control-group>.field_with_errors>label,#edit_user.form-horizontal .control-group>.field_with_errors>label { - width:100px -} -#new_user.form-horizontal .controls,#edit_user.form-horizontal .controls { - margin-left:120px -} -#new_user.form-horizontal .form-actions,#edit_user.form-horizontal .form-actions { - padding-left:120px -} -.field_with_errors>label { - color:#d03737 -} -.field_with_errors input,.field_with_errors textarea,.field_with_errors select { - border-color:#d03737 -} -#new_user .control-group label { - font-size:19.5px; - line-height:27px -} -#new_user .control-group input,#new_user .control-group textarea,#new_user .control-group select,#new_user .control-group .uneditable-input { - font-size:19.5px; - line-height:27px; - height:27px -} -#user_description { - resize:vertical -} -#photo-selection { - margin-bottom:27px -} -#photo-selection #photo-selection-original { - position:relative; - float:left; - clear:both; - margin-top:18px; - width:155px; - height:155px -} -#photo-selection #photo-selection-original:after { - border:1px solid rgba(0,0,0,0.1); - bottom:0; - content:''; - left:0; - position:absolute; - right:0; - top:0 -} -#photo-selection #photo-selection-edit { - float:left; - margin-top:9px -} -#photo-selection #photo-selection-edit .photo-selection-avatar-container { - position:relative; - float:left; - margin:0 4px; - width:45px; - height:45px -} -#photo-selection #photo-selection-edit .photo-selection-avatar-container a:hover { - cursor:pointer -} -#photo-selection #photo-selection-edit .photo-selection-avatar,#photo-selection #photo-selection-edit .photo-selection-connect-service { - width:45px; - height:45px -} -#photo-selection #photo-selection-edit .photo-selection-avatar-container .photo-selection-avatar:hover { - border:2px solid black; - margin:-2px; - cursor:pointer -} -#photo-selection #photo-selection-edit .photo-selection-avatar-container .photo-selection-avatar.active { - border:2px solid #d03737; - margin:-2px -} -#photo-selection #photo-selection-edit .photo-selection-avatar-source { - position:absolute; - left:0; - bottom:1px; - border:0 -} -#social-profiles p { - float:left; - clear:both; - margin:18px 0 0 0 -} -.cancel_link { - float:right; - clear:none; - padding:7px -} -#account-bundles { - float:left -} -.showgrid { - margin-top:30px -} -.bundle { - position:relative; - height:234px; - margin-bottom:27px; - overflow:hidden -} -.bundle:after { - border:1px solid rgba(0,0,0,0.1); - bottom:0; - content:''; - left:0; - position:absolute; - right:0; - top:0; - background:rgba(0,0,0,0) -} -.bundle:hover:after { - background:rgba(0,0,0,0.6); - content:'' -} -.bundle .tile-category { - display:none; - position:absolute; - bottom:54px; - padding:12px 12px 6px 12px; - color:#ccc; - text-transform:uppercase; - z-index:1; - font-size:11px; - letter-spacing:1px -} -.bundle:hover .tile-category { - display:block -} -.bundle .tile-link { - position:relative; - display:block; - width:100%; - height:100%; - z-index:1 -} -.bundle .tile-actions { - position:absolute; - padding:0 4.5px; - right:0; - bottom:0; - z-index:2 -} -.bundle .tile-actions i { - margin:9px 0 -} -.bundle .tile-header { - position:absolute; - box-sizing:border-box; - -moz-box-sizing:border-box; - -webkit-box-sizing:border-box; - overflow:hidden; - padding:9px; - bottom:0; - width:100%; - z-index:3; - background:rgba(0,0,0,0.6); - height:54px; - text-shadow:1px 1px 1px rgba(0,0,0,0.1); - border-top:1px solid rgba(255,255,255,0) -} -.bundle .tile-header .tile-header-inner { - float:left; - width:100% -} -.bundle:hover .tile-header { - background:none; - border-color:rgba(255,255,255,0.2) -} -.bundle h3 { - color:white; - font-weight:300; - font-size:16px; - margin:0; - line-height:18px; - overflow:hidden; - height:36px; - text-overflow:ellipsis; - word-wrap:break-word -} -.bundle:hover h3 { - height:18px; - overflow:hidden; - white-space:nowrap -} -.bundle:hover a { - text-decoration:none -} -.bundle p { - display:none; - margin:0; - font-size:11px; - font-style:normal; - color:rgba(255,255,255,0.85); - letter-spacing:1px -} -.bundle:hover p { - display:block -} -.bundle .tile-collaboration { - display:none; - position:absolute; - right:0; - top:0; - z-index:3; - padding:9px -} -.bundle .tile-collaboration .tile-collaborator { - position:relative; - line-height:0; - float:right; - margin:0 0 4.5px 4.5px; - background:transparent -} -.bundle .tile-collaboration .tile-collaborator .tile-avatar-owner:after,.bundle .tile-collaboration .tile-collaborator .tile-avatar-collaborator:after { - content:''; - position:absolute; - top:0; - bottom:0; - left:0; - right:0; - border:1px solid #555 -} -.bundle .tile-collaboration .tile-collaborator .tile-avatar-owner { - width:49.5px; - height:49.5px -} -.bundle .tile-collaboration .tile-collaborator .tile-avatar-collaborator { - width:22.5px; - height:22.5px -} -.bundle:hover .tile-collaboration { - display:block -} -#bundle-background { - background:#F1F5F7; - position:fixed; - top:0; - left:0; - right:0; - bottom:0; - z-index:-3; - background-repeat:no-repeat; - background-position:50% 50% -} -.controls-left-container { - float:left; - width:67% -} -.controls-right-container { - float:left; - width:33% -} -.bundle-left-container { - float:left; - width:30% -} -.bundle-middle-container { - float:left; - width:40% -} -.bundle-right-container { - float:left; - width:30% -} -.chart-thumbnail { - margin: 0 0 12px 0; -} -.chart-thumbnail img { - display: block; -} -.chart-thumbnail .description h2 { - color: #565656; - font-size: 24px; - font-family: 'Segoe UI Light', 'Helvetica Neue Light', 'Segoe UI', 'Helvetica Neue', 'Trebuchet MS', Verdana; - font-weight: 200; -} -.shortcut-side { - position: relative; - cursor: pointer; - float: left; - padding: 18px; - text-align: center; -} -#bundle-info { - position:relative; - float:left; - clear:both; - width:100% -} -#bundle-info #bundle-category { - margin-bottom:0 -} -#bundle-info #bundle-category a { - font-weight:700; - color:#7a7a7a; - -webkit-font-smoothing:antialiased; - font-size:11px; - text-transform:uppercase; - padding:3px; - border-radius:3px; - line-height:1 -} -#bundle-info #bundle-category a:hover { - color:#d03737; - text-decoration:none -} -#bundle-info:hover #bundle-category a { - background:rgba(0,0,0,0.05) -} -#bundle-info #bundle-title { - font-family:Roboto,"Helvetica Neue",Helvetica,Arial,sans-serif; - display:inline-block; - font-size:36px; - line-height:48px; - font-weight:300; - margin-bottom:9px -} -#bundle-info #bundle-description { - font-size:16px; - font-weight:normal; - line-height:18px; - text-shadow:rgba(255,255,255,0.6) 0 1px 0; - color:rgba(0,0,0,0.6) -} -#bundle-controls { - float:left; - clear:both; - width:100%; - margin:18px 0 -} -#bundle-controls #bundle-controls-clips { - font-size:14px -} -#bundle-controls #bundle-controls-clips .btn-group { - float:left; - margin-right:18px; - margin-left:0 -} -#bundle-controls #bundle-add-clip { - position:relative; - width:100%; - float:right -} -#bundle-controls #bundle-add-clip form { - float:right -} -#bundle-controls #bundle-add-clip #url { - border:0; - -webkit-border-radius:2px 0 0 2px; - -moz-border-radius:2px 0 0 2px; - border-radius:2px 0 0 2px; - width:193px; - height:22px; - background:rgba(0,0,0,0.05) -} -#bundle-controls #bundle-add-clip .error { - position:absolute; - bottom:-25px; - right:0; - width:274px; - text-align:left; - color:#d03737 -} -#bundle-controls .bundle-stats-spark { - padding:1px 0 1px 1px; - width:13px; - height:12px -} -#bundle-controls .bundle-stats-spark * { - display:inline-block; - width:2px; - margin-right:1px; - background-color:#555 -} -#bundle-controls .bundle-stats-spark .bar-1 { - height:1px -} -#bundle-controls .bundle-stats-spark .bar-2 { - height:2px -} -#bundle-controls .bundle-stats-spark .bar-3 { - height:3px -} -#bundle-controls .bundle-stats-spark .bar-4 { - height:4px -} -#bundle-controls .bundle-stats-spark .bar-5 { - height:5px -} -#bundle-controls .bundle-stats-spark .bar-6 { - height:6px -} -#bundle-controls .bundle-stats-spark .bar-7 { - height:7px -} -#bundle-controls .bundle-stats-spark .bar-8 { - height:8px -} -#bundle-controls .bundle-stats-spark .bar-9 { - height:9px -} -#bundle-controls .bundle-stats-spark .bar-10 { - height:10px -} -#bundle-controls .bundle-stats-spark .bar-11 { - height:11px -} -#bundle-controls .bundle-stats-spark .bar-12 { - height:12px -} -#bundle-staff-picked { - position:absolute; - left:-48px; - top:39px -} -.bundle-empty>.bundle-empty-help { - position:absolute; - right:200px; - width:628px; - font-size:18px; - color:#d03737; - text-align:center -} -.bundle-empty>.bundle-empty-help img { - margin-bottom:36px; - margin-left:28px -} -.bundle-empty h3 { - margin:18px 0; - font-size:28px; - text-align:center -} -.bundle-empty h4,.bundle-empty p { - margin:9px 0 -} -.bundle-empty .well img { - padding:5px; - margin:0 10px; - border:1px solid #eee -} -.bundle-info-container { - -webkit-border-radius:2px; - -moz-border-radius:2px; - border-radius:2px; - -webkit-box-shadow:0 1px 1px rgba(0,0,0,0.1); - -moz-box-shadow:0 1px 1px rgba(0,0,0,0.1); - box-shadow:0 1px 1px rgba(0,0,0,0.1); - overflow:hidden; - background:white; - float:right; - width:300px -} -.bundle-info-container .bundle-info-img-container { - overflow:hidden; - float:left; - width:90px; - height:90px; - position:relative -} -.bundle-info-container .bundle-info-img-container a,.bundle-info-container .bundle-info-img-container a div { - width:100%; - height:100% -} -.bundle-info-container .bundle-info-img-container div { - -webkit-border-radius:2px 0 0 2px; - -moz-border-radius:2px 0 0 2px; - border-radius:2px 0 0 2px -} -.bundle-info-container .bundle-authors { - margin-left:90px; - height:36px; - padding:9px -} -.bundle-info-container .bundle-stats { - overflow:hidden; - height:35px; - border-top:1px solid rgba(0,0,0,0.1); - -webkit-border-radius:0 0 2px 2px; - -moz-border-radius:0 0 2px 2px; - border-radius:0 0 2px 2px; - padding:0 -} -.bundle-info-container .bundle-stats li { - float:left; - padding:9px; - border-left:1px solid rgba(0,0,0,0.1) -} -.bundle-info-container .bundle-stats li a { - color:#333 -} -.bundle-info-container .bundle-stats li a:hover { - text-decoration:none -} -.bundle-info-container .bundle-stats li img { - max-width:inherit -} -#bundle-stats .breadcrumb { - display:inline-block -} -#bundle-stats #bundle-stats-container { - padding:36px 60px; - box-sizing:border-box; - -moz-box-sizing:border-box; - -webkit-box-sizing:border-box; - background-color:white; - box-shadow:0 1px 1px rgba(0,0,0,0.1); - margin-bottom:18px -} -#bundle-stats h1 { - text-align:center; - font-size:39px; - line-height:45px -} -#bundle-stats h1 small { - font-size:26px -} -#bundle-stats h2 { - text-align:center; - font-size:26px; - margin-bottom:36px -} -#bundle-stats hr { - margin:36px 0 -} -#bundle-stats #bundle-stats-clips { - text-align:center -} -#bundle-stats #bundle-stats-clips,#bundle-stats #bundle-stats-clips p { - font-size:36px; - line-height:36px -} -#bundle-stats #bundle-stats-clips #bundle-stats-clips-types { - overflow:hidden; - margin-left:-20px; - margin-top:18px; - font-size:26px; - line-height:36px -} -#bundle-stats #bundle-weekly-chart { - text-align:center; - margin-bottom:36px; - height:250px -} -#bundle-stats table.table-condensed td,#bundle-stats table.table-condensed th { - font-size:15px; - line-height:15px; - text-align:right; - width:100px -} -#bundle-stats table.table-condensed thead th { - border-top:0; - border-bottom:1px solid lightgray; - font-weight:normal; - color:#999 -} -#bundle-stats table.table-condensed tfoot td { - border-top:1px solid lightgray; - font-weight:bold; - font-size:15px; - line-height:18px; - color:#333 -} -#bundle-stats table.table-condensed .day-column { - text-align:left; - width:80px; - color:#999 -} -#bundle-stats #bundle-stats-followers { - max-height:536px; - overflow:auto -} -#bundle-stats #bundle-stats-followers .follow-table { - margin:0 -} -#bundle-embed-code .span12 { - padding:36px 60px; - box-sizing:border-box; - -moz-box-sizing:border-box; - -webkit-box-sizing:border-box; - background-color:white; - box-shadow:0 1px 1px rgba(0,0,0,0.1) -} -#bundle-embed-code .label { - vertical-align:middle -} -#bundle-embed-code .disabled-option { - opacity:.5; - filter:alpha(opacity=50) -} -#bundle-embed-code #embed-code-text { - width:100%; - height:150px -} -#bundle-embed-code #bundle-embed-code-info { - box-sizing:border-box; - -moz-box-sizing:border-box; - -webkit-box-sizing:border-box; - padding-left:40px -} -#bundle-create #bundle-form input,#bundle-edit #bundle-form input,.modal #bundle-form input,#bundle-create #bundle-form textarea,#bundle-edit #bundle-form textarea,.modal #bundle-form textarea,#bundle-create #bundle-form .uneditable-input,#bundle-edit #bundle-form .uneditable-input,.modal #bundle-form .uneditable-input { - margin-bottom:18px -} -#bundle-create #bundle-form select,#bundle-edit #bundle-form select,.modal #bundle-form select,#bundle-create #bundle-form input[type="checkbox"],#bundle-edit #bundle-form input[type="checkbox"],.modal #bundle-form input[type="checkbox"] { - margin-bottom:0 -} -#bundle-create #bundle-form label,#bundle-edit #bundle-form label,.modal #bundle-form label { - font-size:16px -} -#bundle-create #bundle-form label.disabled,#bundle-edit #bundle-form label.disabled,.modal #bundle-form label.disabled { - color:gray -} -#bundle-create #bundle-form #bundle_title,#bundle-edit #bundle-form #bundle_title,.modal #bundle-form #bundle_title,#bundle-create #bundle-form #bundle_description,#bundle-edit #bundle-form #bundle_description,.modal #bundle-form #bundle_description { - width:100% -} -#bundle-create #bundle-form #bundle_title,#bundle-edit #bundle-form #bundle_title,.modal #bundle-form #bundle_title { - font-size:26px; - line-height:36px; - height:36px -} -#bundle-create #bundle-form #bundle_description,#bundle-edit #bundle-form #bundle_description,.modal #bundle-form #bundle_description { - font-size:19.5px; - line-height:27px; - height:120px; - resize:none -} -#bundle-create #bundle-form .help-block,#bundle-edit #bundle-form .help-block,.modal #bundle-form .help-block { - margin-bottom:18px -} -#bundle-create #bundle-form .help-block.indent,#bundle-edit #bundle-form .help-block.indent,.modal #bundle-form .help-block.indent { - margin-left:6px -} -#bundle-create #bundle-form .form-actions,#bundle-edit #bundle-form .form-actions,.modal #bundle-form .form-actions { - padding-left:0 -} -#bundle-create #bundle-form-cover label,#bundle-edit #bundle-form-cover label,.modal #bundle-form-cover label { - font-size:16px; - margin-bottom:5px -} -#bundle-create #bundle-form-cover .bundle-cover,#bundle-edit #bundle-form-cover .bundle-cover,.modal #bundle-form-cover .bundle-cover { - position:relative; - height:216px; - margin-bottom:18px; - display:none -} -#bundle-create #bundle-form-cover .bundle-cover.selected,#bundle-edit #bundle-form-cover .bundle-cover.selected,.modal #bundle-form-cover .bundle-cover.selected { - display:block -} -#bundle-create #bundle-form-cover .bundle-cover:after,#bundle-edit #bundle-form-cover .bundle-cover:after,.modal #bundle-form-cover .bundle-cover:after { - border:1px solid rgba(0,0,0,0.1); - bottom:0; - content:''; - left:0; - position:absolute; - right:0; - top:0; - background:rgba(0,0,0,0) -} -#bundle-edit { - margin-left:-20px -} -#bundle-edit .cancel-link { - margin-left:18px; - vertical-align:super -} -.modal #bundle_title,.modal #bundle_description { - width:90%!important -} -.modal #bundle_title { - font-size:19.5px!important; - line-height:27px!important; - height:27px!important -} -.modal #bundle_description { - font-size:13px!important; - line-height:18px!important; - height:40px!important -} -.modal .btn { - margin-bottom:0!important -} -.page-header.bundle-form { - border-bottom:1px solid rgba(0,0,0,0.1); - position:relative; - padding-bottom:5px -} -.page-header.bundle-form a.btn-danger { - position:absolute; - right:0; - top:0 -} -#bundle-clips { - clear:both; - position:relative; - margin-bottom:18px -} -#bundle-clips #pagination { - overflow:auto -} -#bundle-clips-list { - float:left; - width:auto -} -#bundle-clips-list.bundle-clips-list-grid { - margin-right:-30px -} -.clip { - -webkit-border-radius: 2px; - -moz-border-radius: 2px; - border-radius: 2px; - position: relative; - float: left; - list-style: none; - border: 1px solid #e4e4e0; - border-color: #d3d3d3; - background: #f8f8f8; - color: #333; - box-shadow: 1px 1px 0 rgba(0,0,2,0.08); -} -.clip-title{ - color: rgba(0, 109, 204, 0.7); -} -.clip .clip-remove { - display:none; - position:absolute; - z-index:20; - top:9px; - right:9px; - width:14px; - height:14px; - -webkit-border-radius:20px; - -moz-border-radius:20px; - border-radius:20px; - line-height:0; - padding:1px; - opacity:.5; - filter:alpha(opacity=50) -} -.clip .clip-remove:hover { - opacity:1; - filter:alpha(opacity=100) -} -.clip .clip-remove input { - margin:0; - padding:0; - border:0; - width:100%; - height:100%; - background-color:transparent; - cursor:pointer; - box-shadow:none -} -.clip:hover { - box-shadow:0 0 5px 1px rgba(0,0,0,0.1); - -webkit-transition:linear .25s; - -moz-transition:linear .25s; - transition:linear .25s -} -.clip:hover .clip-remove { - display:block -} -.clip .clip-title,.clip .clip-author-name { - font-size:18px; - line-height:27px; - max-height:54px; - word-wrap:break-word; - white-space:normal; - overflow:hidden -} -.clip .clip-provider,.clip .clip-author-username { - font-size:13px; - color:#999 -} -.clip .clip-provider { - line-height:27px -} -.clip .clip-author-username { - line-height:18px; - margin-bottom:18px -} -.clip .clip-selection,.clip .clip-description { - word-wrap:break-word; - font-size:14px; - line-height:18px -} -.clip .clip-selection h1,.clip .clip-description h1,.clip .clip-selection h2,.clip .clip-description h2,.clip .clip-selection h3,.clip .clip-description h3,.clip .clip-selection h4,.clip .clip-description h4,.clip .clip-selection h5,.clip .clip-description h5,.clip .clip-selection h6,.clip .clip-description h6 { - font-size:14px; - line-height:18px; - margin:0 -} -.clip .clip-selection h1,.clip .clip-description h1 { - font-style:bold -} -.clip .clip-selection h2,.clip .clip-description h2,.clip .clip-selection h3,.clip .clip-description h3,.clip .clip-selection h4,.clip .clip-description h4,.clip .clip-selection h5,.clip .clip-description h5,.clip .clip-selection h6,.clip .clip-description h6 { - font-style:italic -} -.clip .clip-selection p,.clip .clip-description p { - font-size:14px; - line-height:18px; - white-space:normal; - margin:0; - font-weight:normal -} -.clip .clip-selection { - font-style:italic; - border-color:rgba(208,55,55,0.25); - border-width:3px; - padding:0 0 0 9px -} -.clip .clip-favicon { - vertical-align:text-bottom; - margin-right:2px -} -.clip .clip-footer { - font-size:12px; - color:#999; - vertical-align:middle -} -.clip .clip-footer a { - color:#999 -} -.clip .clip-footer .clip-footer-element { - display:inline-block; - margin-left:2px; - vertical-align:middle -} -.clip .clip-footer .clip-footer-element:before { - margin-right:2px; - content:"·"; - font-weight:bold -} -.clip .clip-footer .clip-footer-element.hide { - display:none -} -.clip .clip-footer .clip-favicon-container,.clip .clip-footer .clip-source { - margin-left:0 -} -.clip .clip-footer .clip-favicon-container:before,.clip .clip-footer .clip-source:before { - margin-right:0; - content:none -} -.clip .clip-footer .clip-date { - color:#999; - overflow:hidden -} -.clip .clip-footer .clip-source { - overflow:hidden; - white-space:nowrap; - text-overflow:ellipsis; - font-weight:bold -} -.clip .clip-footer .clip-source img { - vertical-align:-4px -} -.clip .clip-social-actions,.clip-theater .clip-social-actions { - display:inline-block -} -.clip .clip-likes-caption.liked,.clip-theater .clip-likes-caption.liked { - color:#d03737 -} -.clip .clip-like form,.clip-theater .clip-like form,.clip .clip-reclip form,.clip-theater .clip-reclip form,.clip .clip-like form>div,.clip-theater .clip-like form>div,.clip .clip-reclip form>div,.clip-theater .clip-reclip form>div { - display:inline -} -.clip .clip-like-link,.clip-theater .clip-like-link,.clip a.clip-like-link,.clip-theater a.clip-like-link,.clip a.clip-reclip-link,.clip-theater a.clip-reclip-link { - display:inline; - color:rgba(0,109,204,0.7); - text-align:left; - background:none; - margin:0; - padding:0; - border:none; - background:none; - box-shadow:none; - cursor:pointer; - vertical-align:top; - font-size:12px -} -.clip .clip-like-link:hover,.clip-theater .clip-like-link:hover,.clip a.clip-like-link:hover,.clip-theater a.clip-like-link:hover,.clip a.clip-reclip-link:hover,.clip-theater a.clip-reclip-link:hover { - text-decoration:underline -} -.clip.clip-grid { - width:300px; - height:234px; - margin:15px 30px 15px 0; - box-sizing:border-box; - -moz-box-sizing:border-box; - -webkit-box-sizing:border-box -} -.clip.clip-grid .clip-content { - position:absolute; - top:18px; - right:18px; - left:18px; - bottom:54px; - overflow:hidden -} -.clip.clip-grid .clip-content .clip-content-header { - height:72px -} -.clip.clip-grid.clip-html .clip-selection,.clip.clip-grid.clip-status .clip-selection,.clip.clip-grid.clip-html .clip-description,.clip.clip-grid.clip-status .clip-description { - word-wrap:break-word; - font-size:14px; - line-height:18px -} -.clip.clip-grid.clip-html .clip-selection h1,.clip.clip-grid.clip-status .clip-selection h1,.clip.clip-grid.clip-html .clip-description h1,.clip.clip-grid.clip-status .clip-description h1,.clip.clip-grid.clip-html .clip-selection h2,.clip.clip-grid.clip-status .clip-selection h2,.clip.clip-grid.clip-html .clip-description h2,.clip.clip-grid.clip-status .clip-description h2,.clip.clip-grid.clip-html .clip-selection h3,.clip.clip-grid.clip-status .clip-selection h3,.clip.clip-grid.clip-html .clip-description h3,.clip.clip-grid.clip-status .clip-description h3,.clip.clip-grid.clip-html .clip-selection h4,.clip.clip-grid.clip-status .clip-selection h4,.clip.clip-grid.clip-html .clip-description h4,.clip.clip-grid.clip-status .clip-description h4,.clip.clip-grid.clip-html .clip-selection h5,.clip.clip-grid.clip-status .clip-selection h5,.clip.clip-grid.clip-html .clip-description h5,.clip.clip-grid.clip-status .clip-description h5,.clip.clip-grid.clip-html .clip-selection h6,.clip.clip-grid.clip-status .clip-selection h6,.clip.clip-grid.clip-html .clip-description h6,.clip.clip-grid.clip-status .clip-description h6 { - font-size:14px; - line-height:18px; - margin:0 -} -.clip.clip-grid.clip-html .clip-selection h1,.clip.clip-grid.clip-status .clip-selection h1,.clip.clip-grid.clip-html .clip-description h1,.clip.clip-grid.clip-status .clip-description h1,.clip.clip-grid.clip-html .clip-selection h2,.clip.clip-grid.clip-status .clip-selection h2,.clip.clip-grid.clip-html .clip-description h2,.clip.clip-grid.clip-status .clip-description h2 { - font-weight:bold -} -.clip.clip-grid.clip-html .clip-selection h3,.clip.clip-grid.clip-status .clip-selection h3,.clip.clip-grid.clip-html .clip-description h3,.clip.clip-grid.clip-status .clip-description h3,.clip.clip-grid.clip-html .clip-selection h4,.clip.clip-grid.clip-status .clip-selection h4,.clip.clip-grid.clip-html .clip-description h4,.clip.clip-grid.clip-status .clip-description h4,.clip.clip-grid.clip-html .clip-selection h5,.clip.clip-grid.clip-status .clip-selection h5,.clip.clip-grid.clip-html .clip-description h5,.clip.clip-grid.clip-status .clip-description h5,.clip.clip-grid.clip-html .clip-selection h6,.clip.clip-grid.clip-status .clip-selection h6,.clip.clip-grid.clip-html .clip-description h6,.clip.clip-grid.clip-status .clip-description h6 { - font-weight:normal; - font-style:italic -} -.clip.clip-grid.clip-html .clip-selection p,.clip.clip-grid.clip-status .clip-selection p,.clip.clip-grid.clip-html .clip-description p,.clip.clip-grid.clip-status .clip-description p { - font-size:14px; - line-height:18px; - white-space:normal; - margin:0; - font-weight:normal -} -.clip.clip-grid.clip-photo .clip-content { - position:absolute; - top:0; - right:0; - left:0; - bottom:0 -} -.clip.clip-grid.clip-photo .clip-content .dotdotdot,.clip.clip-grid.clip-photo .clip-content .clip-photo-img { - -webkit-border-radius:3px; - -moz-border-radius:3px; - border-radius:3px; - width:100%!important; - height:100%!important -} -.clip.clip-grid.clip-video .clip-content,.clip.clip-grid.clip-rich .clip-content { - position:absolute; - top:0; - right:0; - left:0; - bottom:36px -} -.clip.clip-grid.clip-video .clip-thumbnail,.clip.clip-grid.clip-rich .clip-thumbnail { - -webkit-box-shadow:inset 0 1px 0 rgba(0,0,0,0.1),inset 0 -1px 0 rgba(0,0,0,0.1); - -moz-box-shadow:inset 0 1px 0 rgba(0,0,0,0.1),inset 0 -1px 0 rgba(0,0,0,0.1); - box-shadow:inset 0 1px 0 rgba(0,0,0,0.1),inset 0 -1px 0 rgba(0,0,0,0.1); - background:rgba(0,0,0,0.1); - position:relative; - width:100%; - height:90px; - cursor:pointer -} -.clip.clip-grid.clip-video .clip-title,.clip.clip-grid.clip-rich .clip-title { - margin:18px 18px 0 18px -} -.clip.clip-grid.clip-video .clip-provider,.clip.clip-grid.clip-rich .clip-provider { - margin:0 18px -} -.clip.clip-grid.clip-status .clip-content .clip-author-avatar { - float:left -} -.clip.clip-grid.clip-status .clip-content .clip-author-avatar img { - -webkit-border-radius:24px; - -moz-border-radius:24px; - border-radius:24px -} -.clip.clip-grid.clip-status .clip-content .clip-author { - margin-left:57px -} -.clip.clip-grid.clip-status .clip-content .clip-author .clip-author-name,.clip.clip-grid.clip-status .clip-content .clip-author .clip-author-username { - overflow:hidden; - break-word:no-wrap; - text-overflow:ellipsis -} -.clip.clip-grid.clip-status .clip-content .clip-description { - line-height:22.5px -} -.clip.clip-grid .clip-media-play { - display:block; - z-index:2; - position:absolute; - top:50%; - left:50%; - width:40px; - height:40px; - margin:-23px 0 0 -23px; - text-align:center; - cursor:pointer!important; - opacity:.9; - filter:alpha(opacity=90); - -webkit-border-radius:40px; - -moz-border-radius:40px; - border-radius:40px; - border:2px solid white; - background:rgba(0,0,0,0.3) -} -.clip.clip-grid .clip-media-play i { - margin-top:11px -} -.clip.clip-grid .clip-thumbnail:hover .clip-media-play,.clip.clip-grid.clip-photo:hover .clip-media-play { - background:rgba(0,0,0,0.8) -} -.clip.clip-grid.clip-photo:hover .clip-media-play { - visibility:visible -} -.clip.clip-grid.clip-photo .clip-media-play { - visibility:hidden -} -.clip.clip-grid .clip-footer { - -webkit-border-radius:3px; - -moz-border-radius:3px; - border-radius:3px; - position:absolute; - padding:18px; - right:0; - left:0; - bottom:0; - height:18px -} -.clip.clip-grid .clip-footer .clip-source { - max-width:88px -} -.clip.clip-grid.clip-photo .clip-footer { - text-shadow:1px 1px 1px rgba(0,0,0,0.2); - color:rgba(255,255,255,0.8); - background:url(../img/clip_footer.png) repeat-x bottom left -} -.clip.clip-grid.clip-photo .clip-footer .clip-footer-element a,.clip.clip-grid.clip-photo .clip-footer .clip-footer-element a:hover { - color:white -} -.clip.clip-grid.clip-photo .clip-footer .clip-footer-element.clip-date { - color:white; - font-weight:normal -} -.clip.clip-grid.clip-photo .clip-footer .clip-like-link,.clip.clip-grid.clip-photo .clip-footer a.clip-reclip-link,.clip.clip-grid.clip-photo .clip-footer a.clip-reclip-link:hover { - color:white; - text-shadow:1px 1px 1px rgba(0,0,0,0.2) -} -.clip.clip-grid.clip-photo .clip-footer a.clip-likers-link,.clip.clip-grid.clip-photo .clip-footer a.clip-reclips-link { - color:rgba(255,255,255,0.8) -} -.clip.clip-grid .clip-note { - position:absolute; - right:0; - bottom:0; - width:35px; - height:35px; - background:url(../img/clip_note_corner.png) no-repeat -} -.clip.clip-grid .clip-social-actions { - display:none -} -.clip.clip-grid:hover .clip-date,.clip.clip-grid:hover .clip-likes-short { - display:none -} -.clip.clip-grid:hover .clip-social-actions { - display:inline-block -} -.clip.clip-timeline { - box-sizing:border-box; - -moz-box-sizing:border-box; - -webkit-box-sizing:border-box; - width:100%; - margin-left:0; - margin-right:0; - padding:18px 18px 17px 18px; - margin-bottom:18px; - -webkit-border-radius:0; - -moz-border-radius:0; - border-radius:0 -} -.clip.clip-timeline .clip-thumbnail { - float:right; - width:72px; - height:72px; - border:1px solid #eee; - margin-left:18px -} -.clip.clip-timeline .clip-title { - line-height:24px; - max-height:48px; - margin-bottom:4px; - overflow:hidden; - text-overflow:ellipsis -} -.clip.clip-timeline .clip-description,.clip.clip-timeline .clip-selection { - max-height:36px; - margin-bottom:9px; - overflow:hidden; - text-overflow:ellipsis -} -.clip.clip-timeline .clip-note { - box-sizing:border-box; - -moz-box-sizing:border-box; - -webkit-box-sizing:border-box; - margin-top:18px; - margin-bottom:0; - border-bottom:1px solid #eee; - padding:9px 9px 0 9px; - background-color:lightyellow; - overflow:hidden; - hyphens:auto; - -o-hyphens:auto; - -moz-hyphens:auto; - -webkit-hyphens:auto; - word-wrap:break-word -} -.clip.clip-timeline .clip-note p { - margin-bottom:9px -} -#new-clip label,#edit-clip label { - font-size:16.25px; - line-height:27px -} -#new-clip,#edit-clip,#new-clip input,#edit-clip input,#new-clip .btn,#edit-clip .btn { - font-size:19.5px; - line-height:27px -} -#new-clip input[type=text],#edit-clip input[type=text],#new-clip input[type=url],#edit-clip input[type=url],#new-clip select,#edit-clip select { - box-sizing:border-box; - -moz-box-sizing:border-box; - -webkit-box-sizing:border-box; - padding:0 9px; - height:36px -} -#new-clip textarea,#edit-clip textarea { - box-sizing:border-box; - -moz-box-sizing:border-box; - -webkit-box-sizing:border-box; - padding:9px; - resize:none -} -#new-clip p,#edit-clip p { - margin-bottom:18px -} -#new-clip .back-link,#edit-clip .back-link { - margin-left:18px -} -#new-clip #bundle-selection,#edit-clip #bundle-selection { - overflow:auto; - margin-bottom:27px -} -#new-clip #create-bundle-button,#edit-clip #create-bundle-button { - float:right; - width:140px; - padding:6px 0; - margin-right:10px -} -#new-clip .tzSelect .selectBox,#edit-clip .tzSelect .selectBox { - box-sizing:border-box; - -moz-box-sizing:border-box; - -webkit-box-sizing:border-box; - width:100%; - font-size:19.5px; - height:40px; - line-height:30px; - color:#555; - text-shadow:none; - font-weight:bold; - padding-left:10px; - padding-right:10px -} -#new-clip .tzSelect .dropDown,#edit-clip .tzSelect .dropDown { - width:96%; - margin-top:0; - padding:2%; - border:1px solid rgba(0,0,0,0.0980392); - background-color:#f5f5f5; - -webkit-box-shadow:inset 0 3px 2px rgba(0,0,0,0.05),inset 0 -3px 2px rgba(0,0,0,0.05); - -moz-box-shadow:inset 0 3px 2px rgba(0,0,0,0.05),inset 0 -3px 2px rgba(0,0,0,0.05); - box-shadow:inset 0 3px 2px rgba(0,0,0,0.05),inset 0 -3px 2px rgba(0,0,0,0.05) -} -#new-clip .tzSelect .dropDown li,#edit-clip .tzSelect .dropDown li { - font-size:13px -} -#new-clip .tzSelect .dropDown li:hover,#edit-clip .tzSelect .dropDown li:hover { - background:rgba(255,255,255,0.8) -} -#new-clip .tzSelect .dropDown li .text_container,#edit-clip .tzSelect .dropDown li .text_container { - width:80%; - font-size:19.5px; - line-height:26px; - overflow:inherit -} -#new-clip .bundles-empty,#edit-clip .bundles-empty { - float:left -} -body.theater-mode { - overflow:hidden -} -#theater { - z-index:500; - top:0; - right:0; - left:0; - bottom:0; - position:fixed; - overflow-x:auto; - overflow-y:scroll; - background:black; - background-color:rgba(0,0,0,0.8) -} -#theater #theater-outer-container { - display:table; - width:100%; - height:100% -} -#theater #theater-middle-container { - position:relative; - text-align:center; - vertical-align:top; - width:100%; - height:100% -} -#theater #theater-inner-container { - z-index:2; - position:relative; - width:970px; - margin:36px auto -} -#theater #theater-overlay { - z-index:0; - position:fixed; - top:0; - left:0; - right:17px; - bottom:0 -} -#theater .theater-content { - position:relative; - float:left; - width:100%; - text-align:left; - background:white; - overflow:auto -} -#theater .theater-content .theater-content-container { - position:relative; - width:640px; - margin:36px auto 54px; - word-break:break-word -} -#theater .theater-content .theater-scroll-to-top { - display:none; - position:absolute; - bottom:0; - right:0; - padding:9px 18px; - color:#999; - font-size:12px -} -#theater .close { - position:absolute; - top:36px; - right:36px; - z-index:1 -} -.theater-scroll-to-top { - display:none -} -.clip-theater[class*="span"] { - float:none; - margin-left:0 -} -.clip-theater h1 { - margin-bottom:9px -} -.clip-theater h1 a,.clip-theater h1 a:hover { - color:#333; - text-decoration:none -} -.clip-theater .theater-sidebar { - position:absolute; - top:36px; - left:36px; - z-index:1; - text-align:left -} -.clip-theater .theater-sidebar>ul { - display:inline-block -} -.clip-theater .theater-sidebar>ul>li { - margin-bottom:9px -} -.clip-theater .theater-sidebar>ul>li>i,.clip-theater .theater-sidebar>ul>li>a { - opacity:.5; - filter:alpha(opacity=50); - color:black -} -.clip-theater .theater-sidebar>ul>li:hover>i,.clip-theater .theater-sidebar>ul>li:hover>a { - opacity:1; - filter:alpha(opacity=100); - text-decoration:none -} -.clip-theater .theater-sidebar .clip-options .dropdown-toggle,.clip-theater .theater-sidebar .clip-options .dropdown-toggle:active,.clip-theater .theater-sidebar .clip-options .dropdown-toggle:hover { - color:black; - background-color:transparent -} -.clip-theater .clip-metadata { - overflow:hidden; - font-size:11px; - height:16px; - padding:3px 0 4px 0; - border-top:1px solid #eee; - border-bottom:1px solid #eee; - margin-bottom:18px; - color:#555 -} -.clip-theater .clip-metadata img { - vertical-align:top; - margin-right:2px -} -.clip-theater .clip-footer-element { - display:inline-block; - margin-left:2px; - vertical-align:middle -} -.clip-theater .clip-footer-element:before { - margin-right:2px; - content:"·"; - font-weight:bold; - font-size:11px -} -.clip-theater .clip-footer-element.hide { - display:none -} -.clip-theater .clip-footer-element a { - cursor:pointer -} -.clip-theater .clip-like-link,.clip-theater a.clip-like-link,.clip-theater a.clip-reclip-link { - font-size:11px -} -.clip-theater a.clip-date,.clip-theater a.clip-likers-link,.clip-theater a.clip-reclips-link { - color:#555 -} -.clip-theater .clip-note-edit { - float:right; - cursor:pointer -} -.clip-theater .clip-note { - word-break:break-word -} -.clip-theater .clip-note.edit .clip-note-text { - display:none -} -.clip-theater .clip-note.edit .clip-note-form { - display:block; - -webkit-border-radius:2px; - -moz-border-radius:2px; - border-radius:2px -} -.clip-theater .clip-note .clip-note-text,.clip-theater .clip-note .clip-note-form { - box-sizing:border-box; - -moz-box-sizing:border-box; - -webkit-box-sizing:border-box; - width:100%; - margin-bottom:18px; - border-bottom:1px solid #eee; - background-color:#eee; - padding:9px 9px 0 9px -} -.clip-theater .clip-note .clip-note-form { - display:none; - padding-bottom:37px -} -.clip-theater .clip-note .clip-note-form textarea { - width:100%; - height:72px; - resize:vertical; - margin-bottom:18px; - box-sizing:border-box; - background:lightYellow; - padding:9px -} -.clip-theater .clip-note .clip-note-form .clip-note-delete { - float:left -} -.clip-theater .clip-note .clip-note-form .clip-note-save,.clip-theater .clip-note .clip-note-form .clip-note-cancel { - display:inline-block; - float:right; - margin-right:18px -} -.clip-theater .clip-note .clip-note-form .clip-note-cancel { - margin:4.5px 9px; - font-size:11px -} -.clip-theater .clip-content,.clip-theater .clip-content h3,.clip-theater .clip-content h4,.clip-theater .clip-content h5,.clip-theater .clip-content h6,.clip-theater .clip-content a,.clip-theater .clip-content em,.clip-theater .clip-content strong,.clip-theater .clip-content b,.clip-theater .clip-content i,.clip-theater .clip-content ul,.clip-theater .clip-content li,.clip-theater .clip-content dl,.clip-theater .clip-content dt,.clip-theater .clip-content dd,.clip-theater .clip-content span,.clip-theater .clip-content p,.clip-theater .clip-content blockquote,.clip-theater .clip-content table,.clip-theater .clip-content tr,.clip-theater .clip-content th,.clip-theater .clip-content td,.clip-theater .clip-content pre { - font-size:18px; - line-height:30.599999999999998px; - font-family:Georgia,"Times New Roman",serif -} -.clip-theater .clip-content ul { - list-style-type:disc; - margin:20px 0; - padding-left:40px -} -.clip-theater .clip-content p,.clip-theater .clip-content blockquote { - margin-bottom:27px -} -.clip-theater .clip-content p img,.clip-theater .clip-content blockquote img { - clear:both; - float:none -} -.clip-theater .clip-content img { - display:block; - padding:3px; - border:1px solid rgba(0,0,0,0.1); - margin:18px auto -} -.clip-theater .clip-content blockquote.clip-description { - border-left:0; - padding-left:0 -} -.clip-theater .clip-content .clip-object { - margin-bottom:36px; - max-width:100%; - overflow:auto -} -.clip-theater .clip-content .clip-object img { - max-width:98%; - margin-bottom:0 -} -.clip-theater .clip-content .clip-object iframe { - border:0!important -} -.clip-theater .clip-content .clip-object-author { - color:#555 -} -.clip-theater .clip-content .clip-object-author,.clip-theater .clip-content .clip-object-author a { - margin-top:-36px; - text-align:center; - font-size:11px -} -.clip-theater .clip-content .clip-object-action { - margin:18px 0; - text-align:center; - font-size:15px -} -.clip-theater.clip-video .clip-object { - height:378px; - overflow:visible -} -.clip-theater.clip-status .twitter-tweet-rendered { - width:100%!important; - max-width:100%!important -} -.clip-theater.clip-status .twitter-tweet-rendered .twt-border { - max-width:100%!important -} -.clip-theater.clip-iTunes .clip-content { - height:800px -} -.clip-theater.clip-iTunes .clip-content .clip-object { - overflow:hidden; - height:100% -} -.clip-theater.clip-iTunes .clip-content .clip-object iframe { - height:100%!important -} -.clip-theater.clip-Vine .clip-content .clip-object { - height:100%!important -} -.clip-theater.clip-Vine .clip-content .clip-object iframe { - height:640px!important -} -.clip-theater.clip-Scribd .clip-content .clip-object { - height:100%!important -} -.clip-theater.clip-Scribd .clip-content .clip-object iframe { - height:420px!important -} -#theater .clip-theater-load-more .theater-content { - height:400px; - text-align:center; - background:none -} -#theater .clip-theater-load-more .theater-content .theater-loader { - margin-top:165px -} -#theater-next,#theater-previous { - z-index:1; - position:fixed; - top:40%; - width:10%; - height:15%; - cursor:pointer; - opacity:.5; - filter:alpha(opacity=50) -} -#theater-next:hover,#theater-previous:hover { - opacity:.8; - filter:alpha(opacity=80) -} -#theater-next { - right:0; - background:transparent url(../img/theater_right.png) 50% 50% no-repeat; - margin-right:20px -} -#theater-previous { - left:0; - background:transparent url(../img/theater_left.png) 45% 50% no-repeat -} -.single-clip-options-container { - display:none -} -.single-clip-containter { - position:relative; - padding-bottom:36px -} -.single-clip-containter .breadcrumb { - float:left -} -.single-clip-containter .theater-sidebar { - display:none -} -.single-clip-containter .theater-content { - position:relative; - overflow:hidden; - min-height:20px; - padding:19px; - margin-bottom:20px; - background-color:white; - -webkit-border-radius:2px; - -moz-border-radius:2px; - border-radius:2px; - -webkit-box-shadow:0 1px 1px rgba(0,0,0,0.1); - -moz-box-shadow:0 1px 1px rgba(0,0,0,0.1); - box-shadow:0 1px 1px rgba(0,0,0,0.1); - clear:both -} -.single-clip-containter .theater-content blockquote { - border-color:#ddd; - border-color:rgba(0,0,0,0.15) -} -.single-clip-containter .theater-content .theater-content-container { - width:640px; - margin:0 auto -} -.single-clip-containter .single-clip-options-container { - float:right; - margin-top:8px; - display:block -} -.single-clip-containter .influads,.single-clip-containter .bundlr-ad { - margin-top:52px -} -#search #search-dropdown li:hover a { - color:#555; - background-color:white -} -#search #search-dropdown li.hover a { - color:white; - text-decoration:none; - background-color:#08C -} -#search #search-dropdown .no-results,#search #search-dropdown .no-chars { - padding:0 6px -} -#search input[type="submit"] { - position:absolute; - z-index:10; - right:10px; - width:14px!important; - height:14px!important; - margin-top:8px; - background:url(../img/search.png) no-repeat; - cursor:pointer; - border:none; - background-color:rgba(0,0,0,0) -} -#search input[type="submit"]:disabled { - cursor:text; - opacity:.5; - filter:alpha(opacity=50) -} -#search input[type="submit"]:enabled { - opacity:.7; - filter:alpha(opacity=70) -} -#search input[type="submit"]:enabled:hover { - opacity:.9; - filter:alpha(opacity=90) -} -#search.navbar-search input.search-query { - line-height:1.2; - border:0; - height:20px; - width:180px; - padding-right:29px -} -#search.navbar-search input.search-query :-moz-placeholder { - color:#eee -} -#search.navbar-search input.search-query ::-webkit-input-placeholder { - color:#eee -} -#search.navbar-search input.search-query:focus { - padding:4px 9px; - padding-right:29px; - background-color:#f4f4f4; - -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) -} -#search-results { - overflow:auto -} -#search-results #search-results-header { - margin:72px 0; - text-align:center -} -#search-results #search-results-header h1 { - font-size:54px; - line-height:54px; - margin-bottom:18px; - color:#d03737 -} -#search-results #search-results-header p { - font-size:18px; - color:#555 -} -#search-results h2 { - line-height:27px; - font-size:18px; - margin-bottom:18px -} -#search-results h2 small { - font-size:13px -} -#search-results>ul>p { - font-size:16px; - margin-left:40px -} -.search-results-list { - margin-left:-10px -} -.search-results-user { - margin-bottom:9px; - list-style:none -} -.search-results-user .search-results-user-avatar { - position:absolute; - float:left; - width:45px; - height:45px; - -webkit-border-radius:2px; - -moz-border-radius:2px; - border-radius:2px -} -.search-results-user .search-results-user-avatar:after { - border:1px solid #eee; - bottom:0; - content:''; - left:0; - position:absolute; - right:0; - top:0 -} -.search-results-user .search-results-user-text { - width:100%; - height:45px; - line-height:27px; - padding-top:9px; - padding-left:54px; - font-size:16px; - box-sizing:border-box; - -moz-box-sizing:border-box; - -webkit-box-sizing:border-box -} -.search-results-user .search-results-user-text a { - display:inline-block; - height:27px; - overflow:hidden -} -.form-search.form-search-large { - margin-top:18px; - margin-bottom:36px -} -.form-search.form-search-large .input-append { - display:inline -} -.form-search.form-search-large .input-append input,.form-search.form-search-large .input-append button,.form-search.form-search-large .input-append select { - font-size:18px -} -.form-search.form-search-large .input-append input,.form-search.form-search-large .input-append select { - height:36px -} -.form-search.form-search-large .input-append input { - -webkit-border-radius:32px 0 0 32px; - -moz-border-radius:32px 0 0 32px; - border-radius:32px 0 0 32px; - border-right:0 -} -.form-search.form-search-large .input-append select { - width:134px; - height:46px; - border-left:0; - border-radius:0; - -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) -} -.form-search.form-search-large .input-append button { - width:146px; - height:45px -} -.bundle-result { - margin-bottom:18px; - background:white; - -webkit-box-shadow:0 1px 1px rgba(0,0,0,0.25); - -moz-box-shadow:0 1px 1px rgba(0,0,0,0.25); - box-shadow:0 1px 1px rgba(0,0,0,0.25); - -webkit-border-radius:3px; - -moz-border-radius:3px; - border-radius:3px -} -.bundle-result>h3 { - font-size:20px; - line-height:18px; - padding:18px -} -.bundle-result>ul { - overflow:auto; - border-top:1px solid #eee -} -.bundle-result .bundle-result-helper { - color:#555; - font-size:11px; - padding:18px -} -.bundle-result .clip { - border:0; - padding-left:36px; - padding-right:36px -} -.bundle-result .clip:hover { - background:rgba(237,240,243,0.5) -} -input.search-query { - padding-right:14px; - padding-right:4px \9; - padding-left:14px; - padding-left:4px \9; - margin-bottom:0; - -webkit-border-radius:15px; - -moz-border-radius:15px; - border-radius:15px; - line-height:1.2 -} -.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-search textarea,.form-search select,.form-search .help-inline,.form-search .uneditable-input,.form-search .input-prepend,.form-search .input-append { - display:inline-block; - *display:inline; - *zoom:1; - margin-bottom:0; - vertical-align:middle -} -.form-search .hide { - display:none -} -.form-search .input-append { - margin-bottom: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-append,.input-prepend { - margin-bottom:5px; - font-size:0; - white-space:nowrap -} -.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; - font-size:13px; - vertical-align:top; - -webkit-border-radius:0 32px 32px 0; - -moz-border-radius:0 32px 32px 0; - border-radius:0 32px 32px 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:18px; - min-width:16px; - padding:4px 5px; - font-size:13px; - font-weight:normal; - line-height:18px; - text-align:center; - text-shadow:0 1px 0 #fff; - background-color:#eee; - border:1px solid #ccc -} -.input-append .add-on,.input-prepend .add-on,.input-append .btn,.input-prepend .btn { - 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:32px 0 0 32px; - -moz-border-radius:32px 0 0 32px; - border-radius:32px 0 0 32px -} -.input-append input,.input-append select,.input-append .uneditable-input { - -webkit-border-radius:32px 0 0 32px; - -moz-border-radius:32px 0 0 32px; - border-radius:32px 0 0 32px -} -.input-append .add-on,.input-append .btn { - margin-left:-1px -} -.input-append .add-on:last-child,.input-append .btn:last-child { - -webkit-border-radius:0 32px 32px 0; - -moz-border-radius:0 32px 32px 0; - border-radius:0 32px 32px 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 .add-on:first-child,.input-prepend.input-append .btn:first-child { - margin-right:-1px; - -webkit-border-radius:32px 0 0 32px; - -moz-border-radius:32px 0 0 32px; - border-radius:32px 0 0 32px -} -.input-prepend.input-append .add-on:last-child,.input-prepend.input-append .btn:last-child { - margin-left:-1px; - -webkit-border-radius:0 32px 32px 0; - -moz-border-radius:0 32px 32px 0; - border-radius:0 32px 32px 0 -} -#search-container { - position:relative; - text-align:center -} -#search-container .search-query { - float:none -} -#search-container #scope { - margin-top:18px -} -#search-container #scope li { - display:inline-block -} -#search-container #scope li:first-child { - margin-right:12px -} -#search-container #scope li input { - vertical-align:-1px -} -#stream-events p.info { - margin:36px 0; - text-align:center; - line-height:36px -} -#stream-events p.info,#stream-events p.info .btn-large { - font-size:18px -} -.event { - position:relative; - float:left; - clear:both; - width:100%; - margin-bottom:36px -} -.event.new .event-time .datetime { - color:#d03737 -} -.event .event-side { - position:absolute; - top:0; - left:0; - width:36px; - padding-right:9px -} -.event .event-side .event-actor-image { - position:relative; - width:36px; - height:36px -} -.event .event-side .event-actor-image:after { - position:absolute; - border:1px solid #eee; - top:0; - bottom:0; - left:0; - right:0; - content:'' -} -.event .event-contents { - box-sizing:border-box; - -moz-box-sizing:border-box; - -webkit-box-sizing:border-box; - width:100%; - min-height:54px; - padding-left:63px -} -.event .event-contents .event-contents-inner { - -webkit-border-radius:2px; - -moz-border-radius:2px; - border-radius:2px; - background:white; - position:relative; - float:left; - width:100%; - padding:9px 0; - box-shadow:0 1px 1px rgba(0,0,0,0.1); - border-top:0 -} -.event .event-contents .event-contents-inner:after,.event .event-contents .event-contents-inner:before { - right:100%; - border:solid transparent; - content:" "; - height:0; - width:0; - position:absolute; - pointer-events:none -} -.event .event-contents .event-contents-inner:after { - border-right-color:white; - border-width:12px; - top:24px; - margin-top:-16px -} -.event .event-contents .event-contents-inner:before { - border-right-color:rgba(0,0,0,0.05); - border-width:13px; - top:26px; - margin-top:-18px -} -.event .event-contents .event-actor-name { - margin-left:18px; - font-size:15px; - font-weight:bold; - display:inline-block -} -.event .event-contents .event-phrase { - display:inline-block -} -.event .event-contents .event-objects { - float:left; - clear:both; - width:100%; - margin-top:18px -} -.event .event-contents .event-objects .event-object { - float:left; - clear:both; - width:100%; - padding:0; - border:0; - margin-bottom:18px -} -.event .event-contents .event-objects .event-object .clip { - -webkit-border-radius:0; - -moz-border-radius:0; - border-radius:0 -} -.event .event-contents .event-objects .event-object .clip-timeline { - border:0; - border-bottom:1px solid rgba(0,0,0,0.1) - -} -.event .event-contents .event-objects .event-object .event-object-image { - float:left; - margin-left:18px; - margin-right:18px -} -.event .event-contents .event-objects .event-object .event-object-info { - float:left; - clear:right -} -.event .event-contents .event-objects .event-object .event-object-info>a { - display:block; - font-weight:bold -} -.event .event-contents .event-objects .event-object .event-object-info>span { - display:block -} -.event .event-contents .event-objects .event-object .event-object-info .event-object-actions { - float:left; - clear:right; - margin-top:9px -} -.event .event-contents .event-objects .event-object.event-object-bundle .event-object-image { - width:108px; - height:90px; - padding:5px; - border:5px solid white; - -webkit-border-radius:5px; - -moz-border-radius:5px; - border-radius:5px; - -webkit-box-shadow:0 1px 3px rgba(0,0,0,0.25); - -moz-box-shadow:0 1px 3px rgba(0,0,0,0.25); - box-shadow:0 1px 3px rgba(0,0,0,0.25) -} -.event .event-contents .event-objects .event-object.event-object-bundle .event-object-info { - max-width:400px; - overflow:hidden -} -.event .event-contents .event-objects .event-object.event-object-user { - clear:none; - width:33%; - height:36px -} -.event .event-contents .event-objects .event-object.event-object-user .event-object-image { - position:relative; - width:36px; - height:36px; - margin-right:9px -} -.event .event-contents .event-objects .event-object.event-object-user .event-object-image:after { - border:1px solid #eee; - bottom:0; - content:''; - left:0; - position:absolute; - right:0; - top:0 -} -.event .event-contents .event-objects .event-object.event-object-user .event-object-info { - margin-top:9px; - width:65%; - height:18px -} -.event .event-contents .event-objects .event-object.event-object-user .event-object-info span { - position:absolute!important -} -.event .event-contents .event-objects .event-object.event-object-clip { - margin-bottom:0 -} -.event .event-contents .event-objects .event-objects-show-more { - box-sizing:border-box; - -moz-box-sizing:border-box; - -webkit-box-sizing:border-box; - float:left; - clear:both; - width:100%; - padding:9px 18px; - margin-bottom:18px -} -.event .event-contents .event-objects .event-objects-show-more:hover { - background-color:whitesmoke -} -.event .event-contents .event-time { - float:left; - clear:both; - width:100%; - margin:9px 0 0 18px; - font-size:11px; - color:#999 -} -#activity-stream-pagination { - float:left; - clear:both; - margin-top:18px; - width:100%; - text-align:center -} -.follow-table { - text-align:left -} -.follow-table td { - vertical-align:middle -} -.follow-table .subscription-item-photo { - position:relative; - width:50px; - height:50px -} -.follow-table .subscription-item-photo:after { - border:1px solid #eee; - bottom:0; - content:''; - left:0; - position:absolute; - right:0; - top:0 -} -.follow-table .actions-cell { - text-align:right -} -#find-friends ul#find-friends-services { - float:left; - clear:both; - width:100%; - margin-bottom:18px -} -#find-friends ul#find-friends-services li { - float:left; - width:32%; - text-align:center -} -#find-friends ul#find-friends-services li small { - font-size:10px; - color:gray -} -.user-popover-info { - width:100%; - min-height:54px; - cursor:auto -} -.user-popover-info .user-popover-avatar { - position:relative; - float:left; - height:54px; - width:54px; - margin-right:18px -} -.user-popover-info .user-popover-avatar:after { - position:absolute; - border:1px solid #eee; - top:0; - bottom:0; - left:0; - right:0; - content:'' -} -.user-popover-info p { - color:#333; - font-size:13px; - font-weight:normal; - line-height:18px; - margin-bottom:9px -} -.user-popover-info .user-follow-button { - margin-bottom:0 -} -.user-popover-info .follow-button { - display:inline-block -} -.clip.clip-timeline-activity:hover { - -webkit-box-shadow:none; - -moz-box-shadow:none; - box-shadow:none -} -.clip.clip-timeline-activity .clip-title { - height:auto!important; - max-height:48px; - margin-bottom:9px -} -.clip.clip-timeline-activity .clip-description { - height:auto!important; - max-height:90px -} -.clip.clip-timeline-activity.clip-photo .clip-image-container { - position:relative; - max-height:600px; - overflow:hidden; - float:left; - margin-bottom:9px -} -.clip.clip-timeline-activity.clip-photo .clip-image-container img { - display:block -} -.clip.clip-timeline-activity.clip-photo .clip-image-container:after { - content:''; - position:absolute; - top:0; - bottom:0; - left:0; - right:0; - border:1px solid rgba(0,0,0,0.1) -} -.clip.clip-timeline-activity.clip-photo .clip-title { - clear:both -} -#stream-new-activities-count { - vertical-align:top -} -#stream-sidebar { - padding-top:65px; - margin-left:40px; - width:200px -} -#stream-sidebar .stream-bundles-button { - display:block; - height:72px; - line-height:72px; - margin-bottom:36px; - -webkit-border-radius:2px; - -moz-border-radius:2px; - border-radius:2px; - color:white; - background:#d03737; - box-shadow:0 3px 1px rgba(0,0,0,0.1); - text-shadow:0 -1px 1px rgba(0,0,0,0.1); - font-size:18px; - font-weight:bold; - text-align:center -} -#stream-sidebar .stream-bundles-button:hover { - text-decoration:none; - background:#D14B4B -} -#stream-sidebar .stream-suggestions { - -webkit-border-radius:2px; - -moz-border-radius:2px; - border-radius:2px; - background:white; - box-shadow:0 1px 1px rgba(0,0,0,0.1); - margin-bottom:18px -} -#stream-sidebar .stream-suggestions h4 { - padding:9px; - border-bottom:1px solid rgba(0,0,0,0.1) -} -#stream-sidebar .stream-suggestions .stream-suggestion { - box-sizing:border-box; - -moz-box-sizing:border-box; - -webkit-box-sizing:border-box; - position:relative; - width:100%; - overflow:auto; - padding:9px; - border-bottom:1px solid rgba(0,0,0,0.1) -} -#stream-sidebar .stream-suggestions .stream-suggestion .stream-suggestion-image { - position:absolute; - top:9px; - left:9px; - width:54px; - height:54px -} -#stream-sidebar .stream-suggestions .stream-suggestion.stream-suggestion-bundle .stream-suggestion-image { - width:72px; - height:72px -} -#stream-sidebar .stream-suggestions .stream-suggestion .stream-suggestion-info { - margin-left:63px; - margin-right:9px -} -#stream-sidebar .stream-suggestions .stream-suggestion .stream-suggestion-info h5 { - height:18px; - text-overflow:ellipsis; - overflow:hidden -} -#stream-sidebar .stream-suggestions .stream-suggestion .stream-suggestion-info a:hover { - text-decoration:none -} -#stream-sidebar .stream-suggestions .stream-suggestion .stream-suggestion-info .follow-button { - margin-top:9px -} -#stream-sidebar .stream-suggestions .stream-suggestion.stream-suggestion-bundle .stream-suggestion-info { - margin-left:81px -} -#stream-sidebar .stream-suggestions .stream-suggestion.stream-suggestion-bundle .stream-suggestion-info h5 { - height:36px -} -#stream-sidebar .stream-suggestions .stream-suggestion .stream-suggestion-remove { - display:none; - position:absolute; - z-index:20; - top:25px; - right:9px; - width:14px; - height:14px; - background:rgba(255,255,255,0.9); - -webkit-border-radius:20px; - -moz-border-radius:20px; - border-radius:20px; - line-height:0; - padding:1px; - opacity:.3; - filter:alpha(opacity=30) -} -#stream-sidebar .stream-suggestions .stream-suggestion .stream-suggestion-remove:hover { - opacity:1; - filter:alpha(opacity=100) -} -#stream-sidebar .stream-suggestions .stream-suggestion .stream-suggestion-remove input { - margin:0; - padding:0; - border:0; - width:100%; - height:100%; - background-color:transparent; - cursor:pointer; - box-shadow:none -} -#stream-sidebar .stream-suggestions .stream-suggestion:hover .stream-suggestion-remove { - display:block -} -#stream-sidebar .stream-suggestions .stream-suggestion.stream-suggestion-bundle .stream-suggestion-remove { - top:34px -} -#stream-sidebar .stream-suggestions .stream-suggestions-footer { - padding:9px -} -#stream-sidebar .stream-sidebar-microcopy { - text-align:center; - margin:36px 0; - opacity:.5; - filter:alpha(opacity=50) -} -#stream-suggestions-page { - -webkit-border-radius:2px; - -moz-border-radius:2px; - border-radius:2px; - background:white; - box-shadow:0 1px 1px rgba(0,0,0,0.1) -} -#stream-suggestions-page #stream-suggestions-page-header { - border-bottom:1px solid rgba(0,0,0,0.1); - padding:18px -} -#stream-suggestions-page #stream-suggestions-page-header .btn-large { - float:right -} -#stream-suggestions-page #stream-suggestions-page-sidebar { - box-sizing:border-box; - -moz-box-sizing:border-box; - -webkit-box-sizing:border-box; - border-right:2px solid rgba(0,0,0,0.1) -} -#stream-suggestions-page #stream-suggestions-page-sidebar li { - border-bottom:1px solid rgba(0,0,0,0.1) -} -#stream-suggestions-page #stream-suggestions-page-sidebar li a { - box-sizing:border-box; - -moz-box-sizing:border-box; - -webkit-box-sizing:border-box; - display:inline-block; - width:100%; - padding:18px 18px 18px; - font-size:16px -} -#stream-suggestions-page #stream-suggestions-page-sidebar li a:hover { - background:#e4e4e0; - text-decoration:none -} -#stream-suggestions-page #stream-suggestions-page-sidebar li a.active { - background-color:#e4e4e0 -} -#stream-suggestions-page #stream-suggestions-page-sidebar li:last-child { - border:none -} -#stream-suggestions-page .span12 { - margin:10px -} -#stream-suggestions-page .span12 table { - position:relative; - margin-bottom:0 -} -#stream-suggestions-page .span12 table th,#stream-suggestions-page .span12 table td { - border-top:1px solid rgba(0,0,0,0.01) -} -#stream-suggestions-page .span12 table tr:first-child td { - border:none -} -#stream-suggestions-page .span12 img.loading { - position:absolute; - top:225px; - right:50% -} -#stream-intro { - box-sizing:border-box; - -moz-box-sizing:border-box; - -webkit-box-sizing:border-box; - position:relative; - margin-bottom:36px; - padding:27px 108px; - border-radius:2px; - background:white; - box-shadow:0 1px 1px rgba(0,0,0,0.1) -} -#stream-intro p { - font-size:18px; - line-height:27px; - margin-bottom:0 -} -#stream-intro .close { - font-size:54px; - vertical-align:middle; - position:absolute; - top:45px; - right:18px -} -#stream-intro img { - position:absolute; - top:24px; - left:36px -} -div.block-message-actions { - margin-top:18px; - margin-right:0; - text-align:right -} -#subscription-page li { - list-style:disc; - margin-left:40px -} -#subscription-edit { - width:700px; - margin:0 auto -} -#credit-card-notice p { - font-size:16px; - line-height:21px -} -#transactions { - min-height:300px -} -.premium-plan-container { - box-sizing:border-box; - -moz-box-sizing:border-box; - -webkit-box-sizing:border-box; - *zoom:1; - width:722px; - margin:0 auto; - z-index:0; - position:relative; - -webkit-box-shadow:50px 50px 90px rgba(0,0,0,0.1); - -moz-box-shadow:50px 50px 90px rgba(0,0,0,0.1); - box-shadow:50px 50px 90px rgba(0,0,0,0.1) -} -.premium-plan-container:before,.premium-plan-container:after { - display:table; - content:"" -} -.premium-plan-container:after { - clear:both -} -.premium-plan-container h2 { - font-size:26px; - font-weight:200; - line-height:27px -} -.premium-plan-container .btn-primary { - float:right; - padding:17px 20px; - font-size:24px -} -.premium-plan-hero { - background:white; - text-align:center; - padding:54px 36px 36px; - -webkit-border-radius:2px 2px 0 0; - -moz-border-radius:2px 2px 0 0; - border-radius:2px 2px 0 0 -} -.premium-plan-hero h1 { - font-size:39px; - font-weight:lighter; - line-height:36px; - margin-bottom:18px -} -.premium-plan-hero h2 { - color:#999; - line-height:36px -} -.premium-plan-ribbon { - position:relative; - width:657px; - height:54px; - padding:36px; - background:#d03737; - -webkit-box-shadow:1px 0 0 rgba(0,0,0,0.1),-1px 0 0 rgba(0,0,0,0.1); - -moz-box-shadow:1px 0 0 rgba(0,0,0,0.1),-1px 0 0 rgba(0,0,0,0.1); - box-shadow:1px 0 0 rgba(0,0,0,0.1),-1px 0 0 rgba(0,0,0,0.1) -} -.premium-plan-ribbon:after { - content:""; - position:absolute; - width:0; - height:0; - color:#DA4545; - border-color:#DA4545; - border-right:15px solid transparent; - border-bottom:16px solid; - right:0; - top:-16px; - z-index:-1 -} -.premium-plan-ribbon h2 { - float:left; - color:white; - margin-top:12px -} -.premium-plan-ribbon .premium-plan-ribbon-call { - float:left; - width:280px -} -.premium-plan-ribbon .premium-plan-coupon small { - float:left; - margin-top:9px; - color:white -} -.premium-plan-block { - box-sizing:border-box; - -moz-box-sizing:border-box; - -webkit-box-sizing:border-box; - overflow:hidden; - margin-bottom:1px; - width:722px; - padding:36px; - background:white -} -.premium-plan-block h2 { - margin-bottom:36px -} -.premium-plan-block p { - font-size:16px; - line-height:1.4; - color:#555 -} -.premium-plan-block .premium-inner-text { - margin-left:390px; - margin-top:40px -} -.premium-plan-block .premium-image-left { - margin:0 0 -45px -50px; - float:left -} -.premium-plan-block.premium-stats img { - float:right; - margin-right:-110px; - margin-bottom:-40px; - margin-top:-80px -} -.premium-plan-block.premium-stats .premium-inner-text { - float:none; - margin:0; - margin-top:60px -} -.premium-plan-block.premium-embed img { - float:right; - margin-right:-50px; - margin-bottom:-100px; - margin-left:20px -} -.premium-plan-block.premium-embed .premium-inner-text { - float:none; - margin:0; - margin-top:60px -} -.premium-plan-block.customer-support { - background:url(../img/bundle_of_three_premium.jpg) no-repeat no-repeat -140px -80px; - height:270px; - text-align:right; - padding-top:60px -} -.premium-plan-block.customer-support h2 { - color:white -} -.premium-plan-block.customer-support p { - color:rgba(255,255,255,0.8) -} -.premium-plan-block-small { - box-sizing:border-box; - -moz-box-sizing:border-box; - -webkit-box-sizing:border-box; - float:left; - width:360.5px; - background:white; - overflow:hidden; - padding:36px; - height:198px; - border-bottom:1px -} -.premium-plan-block-small h2 { - margin-bottom:18px -} -.premium-plan-block-small p { - font-size:16px; - line-height:1.4; - color:#666 -} -.premium-plan-last-call { - background:#d03737; - height:54px; - padding:36px; - clear:both; - -webkit-border-radius:0 0 2px 2px; - -moz-border-radius:0 0 2px 2px; - border-radius:0 0 2px 2px -} -.premium-plan-last-call h2 { - float:left; - margin-top:18px; - width:280px; - color:white -} -.premium-plan-social-proof .premium-plan-user { - float:left; - width:20%; - text-align:center; - box-sizing:border-box; - -moz-box-sizing:border-box; - -webkit-box-sizing:border-box -} -.premium-plan-social-proof .premium-plan-user .premium-plan-user-avatar { - height:94px; - margin:0 18px 9px -} -.premium-plan-social-proof .premium-plan-user p { - font-size:14px -} -#modal-upgrade-private,#modal-upgrade-stats { - width:700px; - margin-left:-350px; - max-height:550px -} -#modal-upgrade-private .modal-body .premium-plan-block,#modal-upgrade-stats .modal-body .premium-plan-block { - width:auto; - padding-top:0; - padding-bottom:18px; - margin-bottom:36px -} -#modal-upgrade-private .modal-body .premium-plan-block .premium-inner-text,#modal-upgrade-stats .modal-body .premium-plan-block .premium-inner-text { - margin-top:50px; - margin-left:300px -} -#modal-upgrade-private .modal-body .premium-plan-block .premium-inner-text h3,#modal-upgrade-stats .modal-body .premium-plan-block .premium-inner-text h3 { - font-size:19.5px; - font-weight:200; - line-height:27px; - margin-bottom:27px -} -#modal-upgrade-private .modal-body .premium-plan-block.premium-stats img,#modal-upgrade-stats .modal-body .premium-plan-block.premium-stats img { - margin-top:-68px -} -#modal-upgrade-private .modal-body .premium-plan-block.premium-stats .premium-inner-text,#modal-upgrade-stats .modal-body .premium-plan-block.premium-stats .premium-inner-text { - margin-left:0 -} -#modal-upgrade-private .modal-body>p,#modal-upgrade-stats .modal-body>p { - font-size:16px; - line-height:1.4; - color:#555; - text-align:center; - margin:27px 0 0 0 -} -#modal-upgrade-private .modal-body .btn-primary,#modal-upgrade-stats .modal-body .btn-primary { - font-size:18px -} -.premium-plan-social-proof { - margin-top:48px; - overflow:hidden; - background:white; - border-radius:3px; - padding:12px -} -.premium-plan-social-proof .premium-plan-user { - float:left; - width:180px; - text-align:center; - box-sizing:border-box; - -moz-box-sizing:border-box; - -webkit-box-sizing:border-box -} -.premium-plan-social-proof .premium-plan-user .premium-plan-user-avatar { - display:inline-block; - width:120px; - height:120px; - border-radius:3px -} -.premium-plan-social-proof .premium-plan-user p { - font-size:14px -} -.premium-plan-social-proof h4 { - margin-bottom:12px -} -.premium-plan-social-proof a { - display:inline-block -} -.features li { - padding:10px 20px 0; - text-align:left -} -.features { - padding-bottom:10px; - background:white -} -.features li:last-child { - border:none -} -.features .premium { - font-weight:bold -} -.price-plan { - position:relative; - width:30%; - float:left; - border:solid 1px rgba(0,0,0,0.05); - box-sizing:border-box; - -moz-box-sizing:border-box; - border-radius:3px -} -.price-plan.premium { - width:35%; - margin:0 15px; - padding:15px; - top:-15px; - border-color:#d03737 -} -.price { - height:150px; - background:#4d4d4a; - position:relative -} -.price-plan-standard .inside { - padding-left:6px -} -.price-plan .inside { - font-weight:100; - color:#fff; - text-align:center; - line-height:120px; - font-size:48px -} -.price-plan .price a { - position:absolute; - bottom:20px; - left:50%; - width:200px; - margin-left:-100px -} -.pricing-table { - width:100% -} -.pricing-table h1 { - text-align:left; - font-size:48px; - font-weight:200; - line-height:2 -} -.pricing-table th,.pricing-table td { - padding:6px 6px; - line-height:20px; - text-align:left; - vertical-align:middle; - border-top:1px solid rgba(0,0,0,0.03); - font-size:16px; - text-align:center; - text-rendering:optimizeLegibility; - -webkit-font-smoothing:antialiased -} -.pricing-table thead:first-child tr:first-child th,.pricing-table thead:first-child tr:first-child td { - border-top:0; - line-height:2; - font-size:21px -} -.pricing-table td:first-child { - text-align:left; - width:50% -} -.pricing-table td:nth-child(2) { - background:rgba(77,77,74,0.05) -} -.pricing-table tr:last-child td:nth-child(2) { - border-radius:0 0 3px 3px -} -.pricing-table th:nth-child(2) { - background:#4d4d4a; - color:white; - border-radius:3px 3px 0 0 -} -.pricing-table tr h3 { - font-weight:normal; - line-height:1.4 -} -.pricing-table tr p { - color:#7a7a7a; - font-size:14px -} -.pricing-table .fa-check { - color:#5BB75B -} -.pricing-table .fa-times { - color:#d03737 -} -.pricing-action-wrapper { - padding:12px; - -webkit-box-sizing:border-box; - box-sizing:border-box; - -moz-box-sizing:border-box -} -.elements { - float:left; - clear:both; - width:100%; - overflow-y:auto; - max-height:240px; - margin-bottom:15px -} -.elements ul { - float:left; - clear:both; - width:100% -} -.elements ul li { - float:left; - clear:both; - width:100%; - border-bottom:1px solid #eee; - padding:7px 0 -} -.elements ul li:first-child { - padding-top:0 -} -.elements ul li:last-child { - padding-bottom:0; - border:0 -} -.elements ul .element-photo { - float:left; - margin-right:7px -} -.elements ul .element-photo img { - width:36px; - height:36px -} -.elements ul .element-info { - float:left; - padding:9px 0 -} -.elements ul .element-info .label { - vertical-align:top -} -.elements ul .element-actions { - float:right; - margin-right:7px; - padding-top:3px -} -.elements ul .element-actions * { - display:inline-block -} -.elements ul .element-actions .btn.btn-small { - width:inherit -} -#modal-followers .elements,#modal-collaborators .elements,#modal-clip-likers .elements,#modal-clip-reclips .elements { - width:100%; - text-align:center -} -#modal-followers .element-info,#modal-collaborators .element-info,#modal-clip-likers .element-info,#modal-clip-reclips .element-info { - font-size:26px; - line-height:36px; - padding:0 -} -#modal-collaborators .nav-pills { - margin-left:auto; - margin-right:auto; - width:40% -} -#modal-collaborators .elements-form form { - border-bottom:1px solid #eee; - margin-bottom:7px -} -#modal-collaborators .elements-form form li { - padding:9px 0; - font-size:13px; - line-height:18px; - cursor:pointer; - width:220px -} -#modal-collaborators .elements-form form li img { - width:18px; - height:18px; - margin-right:9px -} -#modal-collaborators .elements-form form li:hover { - background-color:whitesmoke -} -#modal-collaborators .form-actions { - background-color:transparent; - padding-top:0; - border:none -} -#modal-collaborators .elements ul li { - line-height:0 -} -#modal-collaborators .elements .element-photo img { - height:33px -} -#modal-clip-reclips .element-info { - font-size:19.5px; - line-height:36px; - padding:0 -} -#modal-clip-reclip .modal-body { - padding:18px 36px -} -#modal-clip-reclip form p { - overflow:auto -} -#modal-clip-reclip form label { - font-size:16px; - line-height:36px -} -#modal-clip-reclip form label input[type=checkbox] { - margin-top:11px -} -#modal-clip-reclip form label small { - font-size:12px; - color:#999 -} -#modal-clip-reclip form input[type=submit] { - font-size:16px; - line-height:18px -} -#modal-clip-reclip .tzSelect .dropDown { - max-height:160px -} -#account-settings .form-horizontal fieldset:first-child { - float:left; - margin-bottom:18px -} -#invite-friends label,#invite-friends input,#invite-friends textarea { - font-size:16px; - line-height:27px -} -#invite-friends textarea { - resize:both -} -.invite-email-form { - margin-top:18px -} -.invite-email-form textarea { - resize:none -} -.tabs-controls-widget { - width:100% -} -.dropbox-account-widget { - overflow:hidden; - width:100%; - box-sizing:border-box; - -moz-box-sizing:border-box; - -webkit-box-sizing:border-box; - padding-bottom:6px -} -.sync-status .fa-check-circle,.sync-status .fa-refresh { - display:none -} -.sync-status .fa-refresh { - -webkit-animation:rotating 2s linear infinite; - font-size:14px; - color:#d03737 -} -.sync-status .fa-check-circle { - color:#5BB75B; - font-size:14px -} -.sync-status .fa-dropbox { - font-size:14px -} -.sync-status .sync-status-label { - color:#999; - font-size:12px; - padding-left:5px -} -.sync-status .sync-status-label.last-synced { - display:none -} -.sync-status .sync-status-label.syncing { - display:none -} -.sync-status .sync-status-label.waiting { - display:none -} -.sync-status.connected .sync-status-label.start-syncing { - display:none -} -.sync-status.connected+#force_sync { - display:none -} -.sync-status.connected.archiving,.sync-status.connected.archived,.sync-status.connected.waiting { - padding:10px; - border:1px solid rgba(0,0,0,0.05); - border-radius:3px -} -.sync-status.connected.waiting .sync-status-label.waiting { - display:inline-block -} -.sync-status.connected.archiving .sync-status-label.start-syncing,.sync-status.connected.archived .sync-status-label.start-syncing { - display:none -} -.sync-status.connected.archiving .sync-status-label.last-synced,.sync-status.connected.archived .sync-status-label.last-synced { - display:none -} -.sync-status.connected.archiving .sync-status-label.waiting,.sync-status.connected.archived .sync-status-label.waiting { - display:none -} -.sync-status.connected.archived .fa-check-circle { - display:inline-block -} -.sync-status.connected.archived .fa-refresh { - display:none -} -.sync-status.connected.archived .sync-status-label.last-synced { - display:inline-block -} -.sync-status.connected.archived+#force_sync { - display:inline-block -} -.sync-status.connected.archiving .fa-refresh { - display:inline-block -} -.sync-status.connected.archiving .fa-check-circle { - display:none -} -.sync-status.connected.archiving .sync-status-label.last-synced { - display:none -} -.sync-status.connected.archiving .sync-status-label.syncing { - display:inline-block -} -.stop-syncing-container { - border-top:1px solid rgba(0,0,0,0.05); - padding-top:10px -} -#account-settings .dropbox-account-widget { - box-sizing:border-box; - padding:20px 0; - margin-bottom:10px -} -#account-settings .sync-status { - float:left -} -#account-settings .sync-status.connected.archiving,#account-settings .sync-status.connected.archived,#account-settings .sync-status.connected.waiting { - padding:20px; - border:1px solid rgba(0,0,0,0.05); - border-radius:3px; - background:white -} -#force_sync { - padding:20px; - display:inline-block -} -@-webkit-keyframes rotating { - from { - -webkit-transform:rotate(0deg) - } - to { - -webkit-transform:rotate(360deg) - } - -} -#explore h2 { - margin-top:9px; - margin-bottom:24px; - border-bottom:1px solid #eee -} -#explore h2 span>a { - float:right; - font-size:12px -} -#explore #explore-staff-picked { - margin-bottom:18px -} -#explore #explore-staff-picked ul { - margin-left:-20px -} -#explore #explore-featured-user { - background-color:#e4e4e0; - margin:-1px -1px -1px 19px; - border:1px solid #eee; - border:1px solid rgba(0,0,0,0.05); - -webkit-border-radius:3px; - -moz-border-radius:3px; - border-radius:3px -} -#explore #explore-featured-user h2,#explore #explore-featured-user ul { - margin-right:19px; - margin-left:19px -} -#explore #explore-featured-user li { - background:white -} -#explore #explore-featured-user li div.explore-user-avatar { - height:176px -} -#explore .explore-user { - margin-bottom:18px; - -webkit-border-radius:3px; - -moz-border-radius:3px; - border-radius:3px; - -webkit-box-shadow:0 1px 3px rgba(0,0,0,0.25); - -moz-box-shadow:0 1px 3px rgba(0,0,0,0.25); - box-shadow:0 1px 3px rgba(0,0,0,0.25) -} -#explore .explore-user div.explore-user-avatar { - width:100%; - height:150px; - border-radius:3px -} -#explore .explore-user div.explore-user-text { - width:90%; - margin:0 auto -} -#explore .explore-user div.explore-user-text h3 { - height:27px; - overflow-y:hidden -} -#explore .category-preview { - margin-top:18px -} -#explore .category-preview ul.row { - margin-left:-15px -} -#explore .page-header { - margin-top:54px -} -.subnav { - z-index:25!important; - width:100%; - height:36px; - background-color:#eee; - background-repeat:repeat-x; - background-image:-moz-linear-gradient(top,#f5f5f5 0,#eee 100%); - background-image:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#f5f5f5),color-stop(100%,#eee)); - background-image:-webkit-linear-gradient(top,#f5f5f5 0,#eee 100%); - background-image:-ms-linear-gradient(top,#f5f5f5 0,#eee 100%); - background-image:-o-linear-gradient(top,#f5f5f5 0,#eee 100%); - filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#f5f5f5',endColorstr='#eeeeee',GradientType=0); - background-image:linear-gradient(top,#f5f5f5 0,#eee 100%); - border:1px solid #e5e5e5; - -webkit-border-radius:4px; - -moz-border-radius:4px; - border-radius:4px -} -.subnav .nav { - margin-bottom:0 -} -.subnav .nav>li>a { - margin:0; - padding-top:11px; - padding-bottom:11px; - border-left:1px solid #e4e4e0; - border-right:1px solid #e5e5e5; - -webkit-border-radius:0; - -moz-border-radius:0; - border-radius:0 -} -.subnav .nav>.active>a,.subnav .nav>.active>a:hover { - padding-left:13px; - color:#777; - background-color:#e9e9e9; - border-right-color:#ddd; - border-left:0; - -webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.05); - -moz-box-shadow:inset 0 3px 5px rgba(0,0,0,0.05); - box-shadow:inset 0 3px 5px rgba(0,0,0,0.05) -} -.subnav .nav>.active>a .caret,.subnav .nav>.active>a:hover .caret { - border-top-color:#777 -} -.subnav .nav>li:first-child>a,.subnav .nav>li:first-child>a:hover { - border-left:0; - padding-left:12px; - -webkit-border-radius:4px 0 0 4px; - -moz-border-radius:4px 0 0 4px; - border-radius:4px 0 0 4px -} -.subnav .nav>li:last-child>a { - border-right:0 -} -.subnav .dropdown-menu { - -webkit-border-radius:0 0 4px 4px; - -moz-border-radius:0 0 4px 4px; - border-radius:0 0 4px 4px -} -@media(min-width:980px) { - .subnav-fixed { - position:fixed; - top:40px; - left:0; - right:0; - z-index:1020; - border-color:#d5d5d5; - border-width:0 0 1px; - -webkit-border-radius:0; - -moz-border-radius:0; - border-radius:0; - -webkit-box-shadow:inset 0 1px 0 #fff,0 1px 5px rgba(0,0,0,0.1); - -moz-box-shadow:inset 0 1px 0 #fff,0 1px 5px rgba(0,0,0,0.1); - box-shadow:inset 0 1px 0 #fff,0 1px 5px rgba(0,0,0,0.1); - filter:progid:DXImageTransform.Microsoft.gradient(enabled=false) - } - .subnav-fixed .nav { - width:938px; - margin:0 auto; - padding:0 1px - } - .subnav .nav>li:first-child>a,.subnav .nav>li:first-child>a:hover { - -webkit-border-radius:0; - -moz-border-radius:0; - border-radius:0 - } - -} -.users_suggestions,.bundles_suggestions { - padding:20px; - margin:20px 0; - border-radius:3px; - background:white -} -#signup { - padding-top:36px; - text-align:center; - color:#7a7a7a; - font-size:16px -} -#signup p { - font-size:16px -} -#signup .logo { - width:120px -} -#signup #signup-head h1 { - font-weight:300; - margin-bottom:5px; - font-size:28px; - margin-top:10px -} -#signup #signup-contents .form-actions,#signup #signup-contents .signup-actions { - background:none; - border:none; - margin:0; - padding-top:9px -} -#signup #signup-contents .form-horizontal .form-actions { - padding-top:0 -} -#signup #signup-contents .signup-actions { - float:left; - clear:both; - width:100%; - margin:27px 0; - text-align:center -} -#signup #signup-contents table.follow-table { - margin-bottom:0 -} -#signup #signup-contents table.follow-table td { - vertical-align:middle -} -#signup #signup-contents .signup-form,#signup #signup-contents .signup-clip-step { - border-radius:3px; - border:1px solid rgba(0,0,0,0.1); - background:white; - margin:36px 0; - padding:36px 60px; - text-align:left -} -#signup #signup-contents .signup-clip-step { - padding:18px 72px 36px -} -#signup #signup-contents .signup-clip-step h2 { - margin:18px 0 9px; - font-size:18px; - text-align:center -} -#signup #signup-contents .signup-clip-step .input-large { - font-size:16px; - height:45px; - width:60%; - padding:9px; - box-sizing:border-box; - -moz-box-sizing:border-box; - -webkit-box-sizing:border-box -} -#signup #signup-contents .signup-clip-step .help-inline { - width:36%; - margin-left:2%; - padding:0; - color:#999 -} -#signup #new_user fieldset { - float:left -} -#signup #new_user .form-actions { - float:left; - margin-top:18px; - margin-bottom:36px -} -#signup .btn-xlarge { - padding:9px 14px; - font-size:15px; - line-height:normal; - -webkit-border-radius:3px; - -moz-border-radius:3px; - border-radius:3px; - font-size:26px -} -#signup .skip-step { - margin-left:18px -} -.alert.signup-notes { - padding-right:14px -} -.alert.signup-notes p,.alert.signup-notes p+p { - margin-top:9px -} -.alert.signup-notes p:first-child { - margin-top:0 -} -.alert.signup-notes li { - list-style:disc; - margin-left:18px -} -.alert.signup-notes .bundlr { - color:#d03737 -} -.pick-plan { - float:left; - overflow:hidden; - background:white; - border-radius:3px; - padding:20px; - text-align:left; - border:1px solid rgba(0,0,0,0.1); - width:calc(50% - 60px); - margin:20px 30px; - box-sizing:border-box; - -moz-box-sizing:border-box; - -webkit-box-sizing:border-box -} -.pick-plan .fa-plus { - color:#5BB75B -} -.pick-plan.basic .btn { - border:1px solid rgba(0,0,0,0.1) -} -.pick-plan-single { - width:calc(100% - 120px); - margin:20px 60px; - padding:20px 60px -} -.choose { - box-sizing:border-box; - -moz-box-sizing:border-box; - -webkit-box-sizing:border-box -} -.choose ul { - overflow:hidden; - padding:20px 0; - border-radius:3px; - margin-bottom:10px -} -.choose li { - font-size:16px; - font-weight:normal; - line-height:1.4; - margin-top:10px; - margin-bottom:10px; - cursor:help; - color:black -} -.choose li:first-child { - margin-top:0 -} -.choose li:last-child { - margin-bottom:0 -} -.choose-statement { - box-sizing:border-box; - -moz-box-sizing:border-box; - -webkit-box-sizing:border-box -} -.choose-statement h2 { - margin-bottom:10px -} -.choose-statement h2 span { - color:#5BB75B -} -.choose-statement .btn { - margin-top:40px; - display:inline-block -} -.choose-statement a { - display:block -} -#import-page #data_import_file { - width:auto; - margin-right:18px -} -#import-page .service-logo { - float:left -} -#import-page .import-instructions { - background:white -} -#import-page .import-instructions>li { - padding:18px; - border-bottom:1px solid whitesmoke -} -#import-page .import-instructions h4 { - padding:18px -} -#import-page .download-instructions-wrapper { - margin-left:66px -} -.import-block { - position:relative; - width:100%; - float:left; - box-sizing:border-box; - -moz-box-sizing:border-box; - -webkit-box-sizing:border-box; - margin:18px 0; - background-color:white; - box-shadow:0 1px 1px rgba(0,0,0,0.1) -} -.import-block .remove-import-block { - position:absolute; - top:10px; - right:10px; - font-size:28px; - color:dimgrey -} -.import-block .remove-import-block:hover { - text-decoration:none; - color:#08c -} -.import-block .import-block-bundle { - padding:18px -} -.import-block .import-block-bundle h3 { - float:left -} -.import-block .import-block-tags { - padding:18px; - background-color:#FCFCFC; - min-height:72px; - border-bottom:1px solid #EFEFFF -} -.import-block .import-block-tags .import-block-tag { - -webkit-border-radius:3px; - -moz-border-radius:3px; - border-radius:3px; - display:inline-block; - padding:4.5px; - background-color:#EFEFFF; - margin:0 4.5px 4.5px 0 -} -.import-block .import-block-tags .import-block-tag .import-block-tag-remove { - margin-left:4.5px -} -.import-block .import-block-tags .import-block-tag .import-block-tag-remove:hover { - text-decoration:none -} -.import-block-select-bundle select { - width:100% -} -.import-block-new-bundle input,.import-block-new-bundle textarea { - width:100%; - box-sizing:border-box; - -moz-box-sizing:border-box; - -webkit-box-sizing:border-box; - padding:18px -} -.import-block-new-bundle input[type="checkbox"] { - width:auto -} -.import-block-new-bundle label { - display:inline-block -} -.helper-text { - position:absolute; - left:50%; - margin-left:-75px; - margin-top:30px; - color:rgba(0,0,0,0.3) -} -#import-tags .import-tags-table { - margin-top:18px; - height:180px; - overflow-y:auto -} -#import-tags .import-tags-table tr { - cursor:pointer -} -#import-tags .import-tags-table tr:hover { - background-color:white -} -.import_to { - float:right; - padding:8px 0 -} -#submit-import { - margin-top:18px; - float:left -} -#add-import-block { - box-sizing:border-box; - -moz-box-sizing:border-box; - -webkit-box-sizing:border-box; - border:3px dotted white; - padding:100px 0; - text-align:center -} -#add-import-block:hover { - background:rgba(0,109,204,0.1) -} -#import-filter-tags { - width:100%; - box-sizing:border-box; - -moz-box-sizing:border-box; - -webkit-box-sizing:border-box; - padding:18px -} -#events-page { - font-weight:normal; - margin:0 auto; - padding:0; - text-rendering:optimizeLegibility; - -webkit-font-smoothing:antialiased; - background-color:#f2f2f2; - color:rgba(0,0,0,0.5) -} -#events-page,#events-page h1,#events-page h2,#events-page h3,#events-page h4,#events-page h5,#events-page h6,#events-page p { - font-family:Roboto,"Helvetica Neue",Helvetica,Arial,sans-serif -} -#events-page h1,#events-page h2 { - color:#222; - font-weight:300; - line-height:1.45 -} -#events-page h3,#events-page h4,#events-page h5,#events-page h6 { - color:#222; - font-weight:400; - line-height:1.45 -} -#events-page h1 { - font-size:72px; - letter-spacing:-2px -} -#events-page h2 { - font-size:31.5px -} -#events-page h2 span { - font-size:28px; - display:block; - color:rgba(0,0,0,0.5) -} -#events-page h3 { - font-size:24.5px -} -#events-page h4 { - font-size:17.5px -} -#events-page.wrapper { - min-width:960px; - max-width:1280px; - position:relative; - background-color:white; - z-index:0; - margin:0 auto; - box-shadow:0 0 4px rgba(0,0,0,0.3) -} -#events-page .section-title { - text-align:center -} -#events-page .header { - position:relative; - box-shadow:inset 0 1px 0 rgba(0,0,0,0.06); - background:#ea0033; - padding:50px 0; - text-align:center -} -#events-page .header h1,#events-page .header h2,#events-page .header h3,#events-page .header h4,#events-page .header p { - color:white -} -#events-page .header p { - margin:36px 0 0; - font-size:14px -} -#events-page .how { - box-shadow:inset 0 1px 0 rgba(0,0,0,0.06); - padding-top:40px -} -#events-page .how .how-step { - position:relative; - padding:50px 0; - overflow:hidden; - box-shadow:inset 0 1px 0 rgba(0,0,0,0.06) -} -#events-page .how .how-step.bundle-this { - box-shadow:inset 0 50px 50px white; - background:#fff url(../img/bg_sites.png); - background-repeat:repeat-y; - background-position:-200px 0; - -webkit-animation:bgscroll 10s infinite linear; - -moz-animation:bgscroll 10s infinite linear; - -ms-animation:bgscroll 10s infinite linear; - -o-animation:bgscroll 10s infinite linear; - animation:bgscroll 10s infinite linear -} -#events-page .how .how-step.bundle-this .bundle-this-screenshot { - text-align:center -} -#events-page .how .how-step.bundle-this .bundle-this-screenshot img { - height:250px -} -#events-page .how .how-step.bundle-example { - background:#edf0f3 url(../img/bundle.jpg); - box-shadow:inset 0 1px 0 rgba(0,0,0,0.06); - background-repeat:repeat-y; - background-position:right; - background-size:525px; - -webkit-animation:bgscroll-bundle 1s ease-out; - -moz-animation:bgscroll-bundle 1s ease-out; - -ms-animation:bgscroll-bundle 1s ease-out; - -o-animation:bgscroll-bundle 1s ease-out; - animation:bgscroll-bundle 1s ease-out; - -webkit-animation-fill-mode:forwards; - -moz-animation-fill-mode:forwards; - -ms-animation-fill-mode:forwards; - -o-animation-fill-mode:forwards; - animation-fill-mode:forwards; - -webkit-animation-play-state:paused; - -moz-animation-play-state:paused; - -ms-animation-play-state:paused; - -o-animation-play-state:paused; - animation-play-state:paused -} -#events-page .how .how-step.bundle-share { - background:#fff url(../img/share.png); - background-repeat:no-repeat; - background-position:50px 50%; - background-size:45% -} -#events-page .how .how-step .span6 { - box-sizing:border-box; - -moz-box-sizing:border-box; - -webkit-box-sizing:border-box; - padding:50px 25px -} -#events-page .how .how-step .span6 p { - font-size:18px; - line-height:1.4; - margin-top:20px -} -#events-page .how .how-step .step-number { - background:#ea0033; - border-radius:50%; - display:inline-block; - font-size:48px; - color:white; - width:60px; - height:60px; - text-align:center; - line-height:60px; - margin-bottom:10px -} -#events-page .social-proof { - background-image:-webkit-linear-gradient(left,#fff,#edf0f3,#fff); - background-image:-moz-linear-gradient(left,#fff,#edf0f3,#fff); - background-image:-ms-linear-gradient(left,#fff,#edf0f3,#fff); - background-image:linear-gradient(left,#fff,#edf0f3,#fff); - text-align:center; - padding:50px 0 -} -#events-page .social-proof .event-partners { - margin:50px 0 -} -#events-page .social-proof .event-partners .event-partner { - box-sizing:border-box; - -moz-box-sizing:border-box; - -webkit-box-sizing:border-box; - display:inline-block; - padding:15px 15px; - border-radius:3px; - height:110px; - line-height:80px; - text-align:center -} -#events-page .social-proof .event-partners .event-partner.last { - background:none; - font-size:28px; - font-weight:bold; - color:rgba(0,0,0,0.3) -} -#events-page .social-proof .event-partners .event-partner a { - display:inline-block -} -#events-page .social-proof .event-partners .event-partner img { - vertical-align:middle -} -#events-page .event-features { - overflow:hidden; - padding-top:50px; - background-image:-webkit-linear-gradient(top,#fff,#edf0f3); - background-image:-moz-linear-gradient(top,#fff,#edf0f3); - background-image:-ms-linear-gradient(top,#fff,#edf0f3); - background-image:linear-gradient(top,#fff,#edf0f3) -} -#events-page .event-features .container { - padding-bottom:0 -} -#events-page .event-features .img-wrapper { - background-repeat:no-repeat; - background-position:50% top; - width:100%; - height:480px; - background-size:100%; - border:1px solid #ccc; - border-bottom:0; - border-radius:5px 5px 0 0; - margin-top:50px -} -#events-page .event-features .img-wrapper.embed-bg { - background-image:url(../img/feature-embed.png) -} -#events-page .event-features .img-wrapper.stats-bg { - background-image:url(../img/feature-stats.png) -} -#events-page .event-features .img-wrapper.collaborate-bg { - background-image:url(../img/feature-collaborators.png) -} -#events-page .event-features-copy { - position:relative; - box-shadow:0 -1px 4px rgba(0,0,0,0.06) -} -#events-page .event-features-copy .event-feature { - box-sizing:border-box; - -moz-box-sizing:border-box; - -webkit-box-sizing:border-box; - margin-top:13px; - margin-bottom:12px; - padding:12px 25px 13px 25px; - border-radius:3px; - -webkit-transition:all .1s linear -} -#events-page .event-features-copy .event-feature:hover,#events-page .event-features-copy .event-feature.selected { - background:#edf0f3; - cursor:pointer; - -webkit-transition:all .1s linear -} -#events-page .event-apply { - text-align:center; - padding:50px 0 -} -#events-page .event-apply .section-title { - margin-bottom:50px -} -#events-page .btn.btn-apply { - background-color:#ea0033; - background-image:none; - color:white; - box-shadow:none; - text-shadow:none; - border:none; - padding:25px; - font-size:24px; - display:block; - width:300px; - text-align:center; - margin:0 auto 25px; - border-radius:35px; - position:relative; - box-shadow:1px 2px 1px rgba(0,0,0,0.1) -} -#events-page .btn.btn-apply:hover { - background-color:#d1002d -} -#events-page .fade-break { - background-image:-moz-linear-gradient(left,rgba(204,204,204,0) 0,#ccc 40%,#ccc 60%,rgba(204,204,204,0) 100%); - background-image:-webkit-linear-gradient(left,rgba(204,204,204,0) 0,#ccc 40%,#ccc 60%,rgba(204,204,204,0) 100%); - background-image:-ms-linear-gradient(left,rgba(204,204,204,0) 0,#ccc 40%,#ccc 60%,rgba(204,204,204,0) 100%); - background-image:linear-gradient(left,rgba(204,204,204,0) 0,#ccc 40%,#ccc 60%,rgba(204,204,204,0) 100%); - display:block; - height:1px; - margin:0 auto; - position:relative; - width:95% -} -#events-page .fade-break:after { - background-image:-moz-linear-gradient(left,rgba(255,255,255,0) 0,#fff 40%,#fff 60%,rgba(255,255,255,0) 100%); - background-image:-webkit-linear-gradient(left,rgba(255,255,255,0) 0,#fff 40%,#fff 60%,rgba(255,255,255,0) 100%); - background-image:-ms-linear-gradient(left,rgba(255,255,255,0) 0,#fff 40%,#fff 60%,rgba(255,255,255,0) 100%); - background-image:linear-gradient(left,rgba(255,255,255,0) 0,#fff 40%,#fff 60%,rgba(255,255,255,0) 100%); - height:1px; - bottom:-1px; - left:0; - right:0 -} -#events-page .fade-break:after,#events-page .fade-break:before { - content:''; - display:block; - position:absolute -} -@-webkit-keyframes bgscroll { - from { - background-position:-100px 0 - } - to { - background-position:-100px -426px - } - -} -@-moz-keyframes bgscroll { - from { - background-position:-100px 0 - } - to { - background-position:-100px -426px - } - -} -@-ms-keyframes bgscroll { - from { - background-position:-100px 0 - } - to { - background-position:-100px -426px - } - -} -@-o-keyframes bgscroll { - from { - background-position:-100px 0 - } - to { - background-position:-100px -426px - } - -} -#modal-become-partner .help-inline { - color:gray -} -.btn-flat { - border:1px solid transparent; - padding:10px; - border-radius:30px; - color:#d03737; - font-size:28px; - font-weight:200; - -webkit-font-smoothing:antialiased; - -webkit-transition:all linear .2s; - -moz-transition:all linear .2s; - transition:all linear .2s; - display:inline-block -} -.btn-flat:hover { - text-decoration:none; - color:#d03737; - border:1px solid #d03737 -} -.feature.offline { - margin-bottom:72px -} -.feature.offline,.feature.offline h1,.feature.offline h2,.feature.offline h3,.feature.offline h4,.feature.offline h5,.feature.offline h6,.feature.offline p { - font-family:Roboto,"Helvetica Neue",Helvetica,Arial,sans-serif -} -.feature.offline hgroup { - text-align:center; - padding:20px 0 -} -.feature.offline h1 { - font-weight:200; - margin-bottom:20px; - font-size:48px -} -.feature.offline h1 span { - color:#d03737 -} -.feature.offline h2 { - font-size:28px; - line-height:1.4; - color:#7a7a7a; - font-weight:200; - -webkit-font-smoothing:antialiased -} -.feature.offline .video-wrapper { - width:1014px; - left:-40px; - position:relative; - position:relative; - margin:0 auto; - height:500px; - overflow:hidden; - border-bottom:1px solid rgba(255,255,255,0.25) -} -.feature.offline .video-wrapper video { - position:relative; - z-index:-1; - background:#f7f6f0 -} -.feature.offline .video-wrapper:after { - content:''; - box-shadow:inset 0 0 35px 30px #f7f6f0; - position:absolute; - left:0; - right:0; - bottom:-50px; - top:0 -} -.feature.offline .feature-faq { - margin-top:60px; - overflow:hidden -} -.feature.offline .faq-entry { - width:50%; - height:144px; - float:left; - box-sizing:border-box; - -moz-box-sizing:border-box -} -.feature.offline .faq-entry h3 { - font-weight:normal; - line-height:1.4; - margin-bottom:10px -} -.feature.offline .faq-entry p { - color:#7a7a7a; - font-size:14px -} -.feature.offline .faq-entry:nth-child(odd) { - padding-right:20px -} -.feature.offline .faq-entry:nth-child(even) { - padding-left:20px -} -.bundlr-use-cases { - list-style-type:none; - font-size:14px; - width:50%; - float:left; - border-right:1px solid rgba(0,0,0,0.1) -} -.bundlr-use-cases li { - font-weight:normal; - line-height:1.4; - margin-bottom:10px; - font-size:14px -} -.bundlr-use-cases a { - color:#7a7a7a -} -.bundlr-use-cases a:hover { - color:#d03737; - text-decoration:none -} -.bundlr-use-cases i { - font-size:14px; - color:#d03737; - margin-right:5px -} -#view-all-features { - list-style-type:none; - margin-top:20px -} -#view-all-features p { - font-weight:normal; - line-height:1.4; - margin-bottom:10px; - font-size:12px; - color:#7a7a7a; - margin-left:20px -} -.call-to-action { - text-align:center; - margin-top:9px; - margin-bottom:9px -} -footer { - position:relative; - background:white; - border-radius:30px; - padding:30px; - overflow:hidden -} -footer h4 { - font-weight:normal; - line-height:1.4; - margin-bottom:10px; - font-size:18px -} -footer .call-to-action { - position:absolute; - height:220px; - top:50%; - right:0; - left:50%; - margin-top:-110px; - text-align:center; - padding:20px -} -footer .call-to-action .trackrecord { - font-size:28px; - line-height:1.4; - color:#7a7a7a; - font-weight:200; - -webkit-font-smoothing:antialiased; - margin-bottom:40px -} -footer .call-to-action .trackrecord span { - color:black -} -.custom-background { - position:fixed; - bottom:0; - top:0; - left:0; - right:0; - z-index:-1 -} -.vrazon { - background:#fff url(../img/vrazon_background.png) no-repeat; - background-position:110% 0 -} -#custom-logo { - float:left; - width:220px; - height:150px; - text-align:center -} -#custom-logo img { - width:80% -} -.custom-header #account-header { - margin-bottom:0 -} -.custom-header #account-info #account-info-text { - padding:0 0 0 50px; - max-width:30% -} -.custom-header #custom-type { - width:130px; - margin-bottom:20px -} -.custom-ewbc-2012-izmir-turkey h1,.custom-ewbc-2011 h1,.custom-european-wine-bloggers-conference h1,.custom-ewbc-stories h1,.custom-sites-and-sounds-of-turkey h1 { - color:#d03737 -} -.custom-ewbc-2012-izmir-turkey:before,.custom-ewbc-2011:before,.custom-european-wine-bloggers-conference:before,.custom-ewbc-stories:before,.custom-sites-and-sounds-of-turkey:before { - content:''; - background:url(../img/ewbc_logo.png) no-repeat; - height:140px; - width:60px; - position:absolute; - margin-left:-80px; - margin-top:5px -} -.custom-ewbc-2013-rioja-spain h1 { - color:#d03737 -} -.custom-ewbc-2013-rioja-spain:before { - content:''; - background:url(../img/ewbc_2013.png) no-repeat; - height:89px; - width:88px; - position:absolute; - margin-left:-105px; - margin-top:5px -} -.custom-2011-accesszone h1,.custom-access-zone h1 { - color:#592971 -} -.custom-2011-accesszone:before,.custom-access-zone:before { - content:''; - background:url(../img/access_logo.png) no-repeat; - height:140px; - width:101px; - position:absolute; - margin-left:-90px; - margin-top:5px -} -#homepage,.apps { - -} -#homepage figure,.apps figure { - margin:0; - display:inline-block; - box-sizing:border-box; - text-align:center; - position:relative; - float:left; - width:50% -} -#homepage .clearfix,.apps .clearfix { - *zoom:1 -} -#homepage .clearfix:before,.apps .clearfix:before,#homepage .clearfix:after,.apps .clearfix:after { - display:table; - content:""; - line-height:0 -} -#homepage .clearfix:after,.apps .clearfix:after { - clear:both -} -#homepage.no-android,.apps.no-android { - padding-top:0 -} -#homepage.no-android figure,.apps.no-android figure { - width:45% -} -#homepage.no-android .android,.apps.no-android .android,#homepage.no-android .btn-android,.apps.no-android .btn-android { - visibility:hidden -} -#homepage.no-android header,.apps.no-android header { - margin-top:20px -} -#homepage.no-android .iphone,.apps.no-android .iphone { - bottom:auto; - top:20px -} -#homepage .button,.apps .button { - display:inline-block -} -#homepage .bundlr-logo,.apps .bundlr-logo { - width:72px; - height:72px; - float:left -} -#homepage header h1,.apps header h1 { - padding:18px; - font-weight:300; - margin-left:72px; - font-size:28px -} -#homepage header p,.apps header p { - margin-bottom:0; - font-size:15px; - line-height:21px; - font-weight:400; - color:rgba(0,0,0,0.5) -} -#homepage.apps,.apps.apps { - overflow:hidden; - padding-top:40px -} -#homepage .iphone,.apps .iphone { - position:absolute; - bottom:0; - right:0; - box-shadow:rgba(0,0,0,0.1) 0 3px 10px; - display:block -} -#homepage .android,.apps .android { - position:static; - margin:0 auto; - box-shadow:rgba(0,0,0,0.1) 0 3px 10px; - display:block; - margin-right:100px -} -#homepage header,.apps header { - width:400px; - position:relative; - height:398px; - margin-top:35px; - float:left; - padding-left:42px -} -#homepage .tour-logo,.apps .tour-logo { - font-size:0; - line-height:0; - display:inline-block; - overflow:hidden; - position:relative; - top:-4px -} -#homepage .tour-logo--android,.apps .tour-logo--android { - background-image:url(../img/mobile-apps/android_logo.png); - width:15px; - height:18px; - display:inline-block -} -#homepage .tour-logo--apple,.apps .tour-logo--apple { - background-image:url(../img/mobile-apps/apple_logo.png); - width:15px; - height:18px; - display:inline-block -} -#homepage header .features,.apps header .features { - margin:25px 0 25px 0 -} -#homepage header .features li,.apps header .features li { - margin:0; - list-style-type:none; - float:left; - cursor:pointer; - display:block; - width:100%; - padding:20px 0; - position:relative; - -webkit-transition:all ease-out .2s; - -ms-transition:all ease-out .2s; - -moz-transition:all ease-out .2s; - transition:all ease-out .2s -} -#homepage header .features li:hover,.apps header .features li:hover { - padding-left:10px; - -webkit-transition:all ease-out .2s; - -moz-transition:all ease-out .2s; - -ms-transition:all ease-out .2s; - transition:all ease-out .2s -} -#homepage header .features li:hover:before,.apps header .features li:hover:before { - content:''; - position:absolute; - top:20px; - bottom:20px; - left:0; - width:2px; - background:#d03737 -} -#homepage .download-options,.apps .download-options { - margin:0; - overflow:hidden -} -#homepage .download-options a,.apps .download-options a { - position:relative; - color:rgba(0,0,0,0.6); - display:block; - font-weight:bold; - border:1px solid rgba(0,0,0,0.15); - border-bottom:2px solid rgba(0,0,0,0.15); - border-radius:3px; - padding:20px 15px 10px 15px; - line-height:13px; - width:127px; - vertical-align:bottom; - font-size:13px; - text-rendering:optimizeLegibility; - -webkit-font-smoothing:antialiased -} -#homepage .download-options a:hover,.apps .download-options a:hover { - text-decoration:none; - color:#d03737 -} -#homepage .download-options a:hover .tour-logo,.apps .download-options a:hover .tour-logo { - opacity:1; - -webkit-transition:all ease-out .1s; - -moz-transition:all ease-out .1s; - -ms-transition:all ease-out .1s; - transition:all ease-out .1s -} -#homepage .download-options a:active,.apps .download-options a:active { - border-bottom-width:1px; - -webkit-transform:translate(0,1px); - -ms-transform:translate(0,1px); - -moz-transform:translate(0,1px); - transform:translate(0,1px) -} -#homepage .download-options a:before,.apps .download-options a:before { - content:'Download the app for'; - font-size:11px; - position:absolute; - font-weight:400; - top:10px; - left:39px; - white-space:nowrap -} -#homepage .download-options li,.apps .download-options li { - float:left; - list-style-type:none; - margin-right:30px -} -#homepage .download-options li .tour-logo,.apps .download-options li .tour-logo { - margin-right:10px; - opacity:.5; - -webkit-transition:opacity ease-out .1s; - -moz-transition:opacity ease-out .1s; - -ms-transition:opacity ease-out .1s; - transition:opacity ease-out .1s -} -#homepage header h4,.apps header h4 { - font-weight:300; - font-size:20px; - margin-top:0; - margin-bottom:12px -} -#homepage .android .image-wrapper ul,.apps .android .image-wrapper ul { - width:762px; - height:413px; - margin:0; - -webkit-transition:all ease-out .2s; - -moz-transition:all ease-out .2s; - -ms-transition:all ease-out .2s; - transition:all ease-out .2s; - -webkit-transition-delay:.05s; - -moz-transition-delay:.05s; - -ms-transition-delay:.05s; - transition-delay:.05s -} -#homepage .android .image-wrapper ul li,.apps .android .image-wrapper ul li { - float:left; - width:254px -} -#homepage .android .image-wrapper ul.feature-1,.apps .android .image-wrapper ul.feature-1 { - transform:translate(0); - -webkit-transform:translate(0); - -moz-transform:translate(0); - -ms-transform:translate(0) -} -#homepage .android .image-wrapper ul.feature-2,.apps .android .image-wrapper ul.feature-2 { - -webkit-transform:translate(-254px); - -moz-transform:translate(-254px); - -ms-transform:translate(-254px); - transform:translate(-254px) -} -#homepage .android .image-wrapper ul.feature-3,.apps .android .image-wrapper ul.feature-3 { - -webkit-transform:translate(-508px); - -moz-transform:translate(-508px); - -ms-transform:translate(-508px); - transform:translate(-508px) -} -#homepage .iphone .image-wrapper ul,.apps .iphone .image-wrapper ul { - width:603px; - height:289px; - margin:0; - -webkit-transition:all ease-out .2s; - -moz-transition:all ease-out .2s; - -ms-transition:all ease-out .2s; - transition:all ease-out .2s -} -#homepage .iphone .image-wrapper ul li,.apps .iphone .image-wrapper ul li { - float:left; - width:201px -} -#homepage .iphone .image-wrapper ul.feature-1,.apps .iphone .image-wrapper ul.feature-1 { - -webkit-transform:translate(0); - -moz-transform:translate(0); - -ms-transform:translate(0); - transform:translate(0) -} -#homepage .iphone .image-wrapper ul.feature-2,.apps .iphone .image-wrapper ul.feature-2 { - -webkit-transform:translate(-201px); - -moz-transform:translate(-201px); - -ms-transform:translate(-201px); - transform:translate(-201px) -} -#homepage .iphone .image-wrapper ul.feature-3,.apps .iphone .image-wrapper ul.feature-3 { - -webkit-transform:translate(-402px); - -moz-transform:translate(-402px); - -ms-transform:translate(-402px); - transform:translate(-402px) -} -#homepage .iphone,.apps .iphone { - display:block; - width:228px; - height:476px; - border-radius:28px; - overflow:hidden; - background-color:#fff -} -#homepage .iphone-camera,.apps .iphone-camera { - height:1.9%; - width:4%; - border-radius:100%; - margin:6% auto 4%; - background-color:#181818 -} -#homepage .iphone-sensor,.apps .iphone-sensor { - display:inline-block; - height:1.5%; - width:3.1%; - border-radius:100%; - float:left; - background-color:#181818; - position:relative; - left:35%; - top:1px -} -#homepage .iphone-earpiece,.apps .iphone-earpiece { - position:relative; - width:18.4%; - margin:1% auto 6.5%; - height:1.7%; - border-radius:15px -} -#homepage .iphone-earpiece:after,.apps .iphone-earpiece:after { - content:""; - display:table -} -#homepage .iphone-content,.apps .iphone-content { - position:relative; - width:88%; - height:75%; - margin:0 auto; - overflow:hidden; - background-color:#222 -} -#homepage .iphone-home,.apps .iphone-home { - width:18.4%; - height:8.75%; - margin:5.3% auto 0; - background-color:#dfdfdf; - border-radius:100%; - border-radius:999px; - -webkit-border-radius:999px; - border-radius:999px -} -#homepage .iphone--dark,.apps .iphone--dark { - background-color:#383838 -} -#homepage .iphone--dark .iphone-home,.apps .iphone--dark .iphone-home { - background-color:#181818 -} -#homepage .iphone--dark .iphone-earpiece,.apps .iphone--dark .iphone-earpiece { - background-color:#181818 -} -#homepage .iphone--light,.apps .iphone--light { - background-color:#efede8 -} -#homepage .iphone--light .iphone-home,.apps .iphone--light .iphone-home { - background-color:#c7c7c7 -} -#homepage .iphone--light .iphone-camera,.apps .iphone--light .iphone-camera { - background-color:#aaa -} -#homepage .iphone--light .iphone-sensor,.apps .iphone--light .iphone-sensor { - background-color:#aaa -} -#homepage .iphone--light .iphone-earpiece,.apps .iphone--light .iphone-earpiece { - background-color:#aaa -} -#homepage .iphone--small,.apps .iphone--small { - width:152px; - height:320px; - border-radius:18px -} -#homepage .iphone--large,.apps .iphone--large { - width:360px; - height:750px; - border-radius:40px -} -#homepage .iphone--large .iphone-home,.apps .iphone--large .iphone-home { - margin-top:6%; - width:15.6%; - height:7.4% -} -#homepage .iphone--large .iphone-content,.apps .iphone--large .iphone-content { - width:88.889%; - height:75.8% -} -#homepage .touch .sitefilter-profile--customer .browser-content,.apps .touch .sitefilter-profile--customer .browser-content,#homepage .touch .designs-details--mobiledemo .iphone-content,.apps .touch .designs-details--mobiledemo .iphone-content,#homepage .touch .designs-details--browserdemo .browser-content,.apps .touch .designs-details--browserdemo .browser-content { - overflow:auto!important; - -webkit-overflow-scrolling:touch!important -} -#homepage .iphone-content,.apps .iphone-content { - -webkit-backface-visibility:hidden -} -#homepage .android,.apps .android { - display:block; - width:270px; - height:510px; - border-radius:28px; - overflow:hidden; - background-color:#fff -} -#homepage .android-camera,.apps .android-camera { - height:3%; - width:6%; - border-radius:100%; - margin:8% auto 1.5% 85%; - background-color:#181818 -} -#homepage .android-sensor,.apps .android-sensor { - display:inline-block; - height:1.5%; - width:3.0%; - border-radius:100%; - float:left; - background-color:#181818; - position:relative; - left:15%; - top:4.5% -} -#homepage .android-sensor-right,.apps .android-sensor-right { - margin-left:1% -} -#homepage .android-content,.apps .android-content { - position:relative; - width:100%; - height:85%; - margin:0; - overflow:hidden; - background-color:#1d1d1d -} -#homepage .android-content .image-wrapper,.apps .android-content .image-wrapper { - width:94%; - height:90%; - overflow:hidden; - margin:3% auto 0; - box-sizing:border-box; - border-radius:5px; - border:2px solid #000 -} -#homepage .adroid-button:before,.apps .adroid-button:before { - visibility:hidden; - display:block; - content:'\2715'; - color:#383838; - font-size:110%; - position:absolute; - bottom:2%; - left:25% -} -#homepage .android-button-right.adroid-button:before,.apps .android-button-right.adroid-button:before { - content:'\25CB'; - left:auto; - right:25%; - font-size:220% -} -#homepage .android--dark,.apps .android--dark { - background-color:#383838 -} -#homepage .android--dark .android-sensor-right,.apps .android--dark .android-sensor-right { - background-color:#181818 -} -#homepage .android--light,.apps .android--light { - background-color:#e3e3e3 -} -#homepage .android--light .android-camera,.apps .android--light .android-camera { - background-color:#aaa -} -#homepage .android--light .android-sensor,.apps .android--light .android-sensor { - background-color:#aaa -} -#homepage .android--light .android-sensor-right,.apps .android--light .android-sensor-right { - background-color:#aaa -} -#homepage .android--small,.apps .android--small { - width:152px; - height:304px; - border-radius:18px -} -#homepage .android--small .adroid-button:before,.apps .android--small .adroid-button:before { - font-size:145%; - bottom:3% -} -#homepage .android--small .android-button-right.adroid-button:before,.apps .android--small .android-button-right.adroid-button:before { - font-size:290% -} -#homepage .android--large,.apps .android--large { - width:360px; - height:720px; - border-radius:40px -} -#homepage .android--large .adroid-button:before,.apps .android--large .adroid-button:before { - font-size:60%; - bottom:0 -} -#homepage .android--large .android-button-right.adroid-button:before,.apps .android--large .android-button-right.adroid-button:before { - font-size:120% -} -#homepage .touch .sitefilter-profile--customer .browser-content,.apps .touch .sitefilter-profile--customer .browser-content,#homepage .touch .designs-details--mobiledemo .android-content,.apps .touch .designs-details--mobiledemo .android-content,#homepage .touch .designs-details--browserdemo .browser-content,.apps .touch .designs-details--browserdemo .browser-content { - overflow:auto!important; - -webkit-overflow-scrolling:touch!important -} -#homepage .android-content,.apps .android-content { - -webkit-backface-visibility:hidden -} -#homepage .button.button--app-store,.apps .button.button--app-store { - background-color:#222; - background-image:url(../img/apple-app-store-button-2x.png); - background-size:100%; - background-position:50%; - background-repeat:no-repeat; - width:148px; - height:42px; - padding:0; - border-radius:4px -} -#homepage .button.button--app-store:hover,.apps .button.button--app-store:hover { - background-color:#444; - background-image:url(../img/apple-app-store-button-2x.png); - background-size:100%; - background-position:50%; - background-repeat:no-repeat -} -#homepage .button.button--play-store,.apps .button.button--play-store { - background-color:#222; - background-image:url(../img/play-store-button.png); - background-size:100%; - background-position:50%; - background-repeat:no-repeat; - width:148px; - height:42px; - padding:0; - border-radius:4px -} -#homepage .button.button--play-store:hover,.apps .button.button--play-store:hover { - background-color:#444; - background-image:url(../img/play-store-button.png); - background-size:100%; - background-position:50%; - background-repeat:no-repeat -} -#wrapper { - position:relative; - width:960px; - margin-right:auto; - margin-left:auto; - padding-top:72px -} -#wrapper.has-signup-overlay { - padding-top:126px -} -div.rss-button { - width:13px; - height:13px; - background:url(../img/rss_big.png) -13px 0 no-repeat; - margin-right:5px; - margin-top:5px -} -.item-action:hover .rss-button,.rss-button:hover { - background:url(../img/rss_big.png) 0 0 no-repeat -} -.about h1 { - padding:10px; - font-size:32px; - font-weight:bold; - line-height:36px; - -webkit-border-radius:5px; - -moz-border-radius:5px; - border-radius:5px -} -.about h2 { - font-size:18px; - font-weight:bold; - line-height:22px; - margin-top:20px -} -.about .wrapper-element { - display:table; - margin-bottom:50px; - position:relative -} -.about .wrapper-element p,.about .wrapper-element li { - font-size:14px; - line-height:18px -} -.about .about-example img { - position:absolute; - top:-50px; - right:20px -} -.about .about-team { - vertical-align:middle -} -.about .about-team ul { - margin-bottom:30px -} -.about .about-team ul li { - margin-bottom:10px -} -.about dt { - margin:20px 0 5px 0; - font-size:22px; - line-height:28px; - font-weight:bold -} -.about dd { - margin:0; - font-size:14px; - line-height:18px -} -#referral-message { - float:left; - width:100%; - clear:both; - text-align:center -} -.share-balloon { - position:absolute; - z-index:200; - background-color:white; - border:1px solid lightgray; - -webkit-border-radius:5px; - -moz-border-radius:5px; - border-radius:5px; - text-align:left; - min-width:230px -} -.share-balloon .share-container { - padding:12px -} -.share-balloon .addthis_toolbox a { - display:inline-block; - margin:2px -} -.share-balloon .addthis_toolbox a.addthis_button_google_plusone { - position:relative -} -.share-balloon .addthis_toolbox a.addthis_button_google_plusone.up { - top:-6px -} -.share-balloon .addthis_toolbox a.addthis_button_google_plusone.down { - top:6px -} -.share-balloon .addthis_toolbox a.post-tumblr { - width:32px; - height:32px; - background:url(../img/share_tumblr.png) -} -.share-balloon form { - margin-bottom:0 -} -.share-balloon textarea,.share-balloon input[type=text] { - cursor:auto; - width:190px -} -.infinite-scroll-pagination { - float:left; - padding-bottom:18px; - width:100%; - text-align:center -} -#discount { - display:none; - text-align:center; - padding:6px; - border-bottom:1px solid rgba(208,55,55,0.1); - font-weight:200; - font-size:14px; - background:#fff2f2 -} -#discount a:hover { - text-decoration:none -} -#discount .btn { - margin-top:0; - vertical-align:2px -} -#login-page { - text-align:center -} -#login-page h1 { - font-size:42px -} -#login-page h1 small { - font-size:26px -} -body { - background-color:#f7f6f0 -} -form { - margin-bottom:0 -} -ul { - list-style-type:none; - margin:0; - padding:0 -} -dl dt { - font-size:16px; - line-height:36px -} -dl dd { - margin-bottom:18px -} -.page-header { - margin-top:0 -} -.tabs-left { - display:inline-block -} -.tabs-left .tabs-controls { - margin:0 18px 0 0 -} -.tabs-left .tabs-controls .tabs-controls-widget { - float:left; - clear:both; - margin-bottom:36px; - overflow:visible -} -.tabs-left .tabs-controls .tabs-controls-widget h4 { - font-size:16px; - margin-bottom:9px -} -.tabs-left .tabs-controls .tabs-controls-widget ul { - width:180px -} -.tabs-left .tabs-controls .tabs-controls-widget li { - padding:4.5px 0 -} -.tabs-left .tabs-controls .tabs-controls-widget li i,.tabs-left .tabs-controls .tabs-controls-widget li img { - opacity:.8; - filter:alpha(opacity=80) -} -.tabs-left .tabs-controls .tabs-controls-widget .progress { - height:9px; - margin-bottom:9px -} -.tabs-left .tabs-controls .tabs-controls-widget .close { - margin:-12px -12px 0 0 -} -.tabs-left .nav { - width:100%; - margin-bottom:36px -} -.tabs-left .nav li a { - font-size:16px; - line-height:23px px -} -.tabs-left .nav li a:hover { - background-color:white -} -.tabs-left .nav li.active a,.tabs-left .nav li.active a:hover { - background-color:white; - border-color:transparent transparent #ddd rgba(222,222,222,0.5) -} -.tabs-left .nav li .tab-number { - float:right; - font-size:14px -} -.pager li.disabled a { - color:#999 -} -.pager li.disabled a:hover { - background-color:white; - cursor:default -} -.popover,.popover.top,.popover.right,.popover.left,.popover.bottom { - cursor:auto; - margin:0 -} -.btn-container { - position:relative; - display:inline-block; - float:left -} -.breadcrumb { - display:inline-block -} -#topbar { - z-index:400 -} -#topbar .navbar-inner { - z-index:30; - background:white; - -webkit-box-shadow:0 1px 1px rgba(0,0,0,0.1); - -moz-box-shadow:0 1px 1px rgba(0,0,0,0.1); - box-shadow:0 1px 1px rgba(0,0,0,0.1); - zoom:1; - filter:progid:DXImageTransform.Microsoft.Shadow(color='#CCCCCC',Direction=135,Strength=3) -} -#topbar .navbar-inner .nav>li>a { - text-shadow:none; - color:rgba(0,109,204,0.7); - font-size:15px -} -#topbar .navbar-inner .nav>li>a:hover { - color:#006dcc -} -#topbar .navbar-inner .nav>li>a .label { - vertical-align:top -} -#topbar .navbar-inner .divider-vertical { - background-color:#f5f5f5; - background-image:-moz-linear-gradient(top,#fff,#e5e5e5); - background-image:-ms-linear-gradient(top,#fff,#e5e5e5); - background-image:-webkit-gradient(linear,0 0,0 100%,from(#fff),to(#e5e5e5)); - background-image:-webkit-linear-gradient(top,#fff,#e5e5e5); - background-image:-o-linear-gradient(top,#fff,#e5e5e5); - background-image:linear-gradient(top,#fff,#e5e5e5); - background-repeat:repeat-x; - filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff',endColorstr='#e5e5e5',GradientType=0); - 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); - border:0 -} -#topbar .navbar-inner .navbar-search .search-query { - border-color:#eee; - color:#333; - text-shadow:none; - background:whitesmoke -} -#topbar .navbar-inner .navbar-search input::-webkit-input-placeholder { - color:#999 -} -#topbar .navbar-inner .navbar-search input:-moz-placeholder { - color:#999 -} -#topbar .brand { - padding-left:8px; - padding-bottom:7px -} -#topbar .brand #logo { - max-width:inherit; - width:80px; - height:22px -} -#topbar #account-dropdown { - position:relative; - margin-left:32px -} -#topbar #account-dropdown #topbar-avatar { - position:absolute; - left:-24px; - top:7px; - width:27px; - height:27px -} -#topbar #account-dropdown #topbar-avatar:after { - border:1px solid #eee; - bottom:0; - content:''; - left:0; - position:absolute; - right:0; - top:0 -} -#topbar #account-dropdown .notification-badge { - vertical-align:text-top; - line-height:13px; - position:absolute; - left:-30px; - bottom:4px; - border:1px solid white -} -#topbar #account-dropdown .notification-badge .notification-counter { - display:block; - padding:1px 4px; - -webkit-border-radius:0; - -moz-border-radius:0; - border-radius:0 -} -#topbar #account-dropdown .caret { - border-top-color:black -} -#topbar .dropdown-menu { - top:95%; - right:-6px -} -#topbar #activity-button,#topbar #collaboration-requests-button { - width:170px -} -#topbar #topbar-dropdown-activity-counter,#topbar #topbar-dropdown-collab-req-counter { - position:absolute; - display:inline-block; - right:15px; - font-weight:bold -} -#topbar .scroll-to-top { - position:absolute; - top:10px; - right:-50px; - padding:2px 4px; - background-color:#999; - -webkit-border-radius:4.5px; - -moz-border-radius:4.5px; - border-radius:4.5px; - opacity:.3; - filter:alpha(opacity=30) -} -#topbar .scroll-to-top:hover { - opacity:.8; - filter:alpha(opacity=80) -} -.tooltip.bottom { - z-index:1040!important -} -#signup-overlay { - position:fixed; - z-index:401; - top:41px; - left:0; - right:0; - text-align:center; - opacity:.9; - filter:alpha(opacity=90); - height:45px; - color:#eee; - background-color:#333; - font-size:17px; - -webkit-box-shadow:0 1px 1px rgba(0,0,0,0.1); - -moz-box-shadow:0 1px 1px rgba(0,0,0,0.1); - box-shadow:0 1px 1px rgba(0,0,0,0.1); - padding-top:9px; - padding-right:27px -} -#signup-overlay span { - margin-left:9px; - margin-top:4px -} -#signup-overlay .btn { - margin:0 9px -} -#signup-overlay .close { - position:absolute; - right:18px; - top:18px; - color:white; - font-size:25px; - text-shadow:0 1px 0 black; - opacity:.5; - filter:alpha(opacity=50) -} -#signup-overlay .close:hover { - opacity:.8; - filter:alpha(opacity=80) -} -#bundle-followers input { - -webkit-box-shadow:none; - -moz-box-shadow:none; - box-shadow:none -} -#account-bundles { - margin-top:20px -} -#account-bundles .bundle:hover { - cursor:pointer -} -.alert .dismiss { - float:right; - font-size:20px; - font-weight:bold; - line-height:18px; - color:#000; - text-shadow:0 1px 0 #fff; - opacity:.2; - filter:alpha(opacity=20); - position:relative; - top:-2px; - right:-21px; - line-height:18px -} -.alert .dismiss:hover { - color:#000; - text-decoration:none; - opacity:.4; - filter:alpha(opacity=40); - cursor:pointer -} -.errors,.flash-notice,.flash-html-notice { - padding:8px 35px 8px 14px; - margin-bottom:18px; - 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; - color:#c09853; - background-color:#f2dede; - border-color:#eed3d7; - color:#b94a48 -} -.errors .dismiss,.flash-notice .dismiss,.flash-html-notice .dismiss { - position:relative; - top:-2px; - right:-21px; - line-height:18px; - position:relative; - top:-2px; - right:-21px; - line-height:18px -} -.errors .close,.flash-notice .close,.flash-html-notice .close { - position:relative; - top:-2px; - right:-21px; - line-height:18px -} -.errors { - background-color:#f2dede; - border-color:#eed3d7; - color:#b94a48 -} -.flash-notice,.flash-html-notice { - background-color:#d9edf7; - border-color:#bce8f1; - color:#3a87ad -} -#referral-links { - text-align:center -} -#referral-links a { - display:inline-block -} -.info-stats { - float:right -} -.info-stats li { - float:right; - text-align:right; - padding-left:10px; - margin-left:10px; - border-left:1px solid darkgrey -} -.info-stats li.last { - padding-left:0; - margin-left:0; - border-left:none -} -.controls-actions { - clear:right; - float:right; - text-align:right -} -.controls-actions form { - display:inline-block -} -.controls-actions form input { - margin-bottom:0; - vertical-align:baseline -} -.controls-actions>ul li { - display:inline-block; - margin-left:15px -} -.pagination { - float:left; - clear:both; - width:100% -} -.pagination>div { - display:table; - margin:0 auto; - vertical-align:middle -} -#browser-button-tutorial,#browser-button-tutorial h3,#browser-button-tutorial li,#browser-button-tutorial .btn { - font-size:16px; - line-height:21px -} -#browser-button-tutorial li { - margin:9px -} -#browser-button-tutorial li { - list-style:decimal outside none -} -#browser-button-tutorial li img { - vertical-align:middle -} -#browser-button-tutorial li img.with-margin { - margin:9px 10px; - padding:9px; - border:1px solid #eee -} -#browser-button-tutorial small { - font-size:13px; - color:#999 -} -.help-tooltip { - position:absolute; - z-index:20 -} -.help-activity { - top:315px; - left:-110px; - width:116px; - height:55px; - background:url(../img/help_activity.png) -} -.help-bundles { - top:150px; - left:450px; - width:86px; - height:54px; - background:url(../img/help_bundles.png) -} -.help-find-friends { - top:660px; - left:-105px; - width:98px; - height:77px; - background:url(../img/help_find_friends.png) -} -.help-share { - top:180px; - left:965px; - width:85px; - height:83px; - background:url(../img/help_share.png) -} -.help-bundles-area { - z-index:-1; - top:230px; - left:240px; - width:720px; - height:320px; - border:2px dashed #d03737; - -webkit-border-radius:5px; - -moz-border-radius:5px; - border-radius:5px -} -.empty-notice,.empty-notice p { - color:#555; - font-size:16px; - line-height:21px -} -.influads { - padding-top:28px; - clear:both -} -.influads .help { - float:right; - font-size:13px; - font-weight:bolder; - line-height:18px; - color:black; - text-shadow:0 1px 0 white; - margin:-23px -12px 0 0; - opacity:.2; - filter:alpha(opacity=20) -} -.influads .help:hover { - opacity:.4; - filter:alpha(opacity=40); - text-decoration:none -} -#overview h1 { - text-align:center -} -#overview .row { - margin-left:-10px -} -#overview .features { - background:white; - -webkit-border-radius:5px; - -moz-border-radius:5px; - border-radius:5px; - -webkit-box-shadow:0 1px 3px rgba(0,0,0,0.25); - -moz-box-shadow:0 1px 3px rgba(0,0,0,0.25); - box-shadow:0 1px 3px rgba(0,0,0,0.25); - background-color:#fbfbfb; - background-image:-moz-linear-gradient(top,#fff,#f5f5f5); - background-image:-ms-linear-gradient(top,#fff,#f5f5f5); - background-image:-webkit-gradient(linear,0 0,0 100%,from(#fff),to(#f5f5f5)); - background-image:-webkit-linear-gradient(top,#fff,#f5f5f5); - background-image:-o-linear-gradient(top,#fff,#f5f5f5); - background-image:linear-gradient(top,#fff,#f5f5f5); - background-repeat:repeat-x; - filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff',endColorstr='#f5f5f5',GradientType=0); - height:270px; - margin-bottom:36px -} -#overview .features h3 { - width:90%; - margin:0 auto 5px -} -#overview .features p { - width:90%; - margin:0 auto 10px -} -#overview .features .label { - vertical-align:top; - margin-left:6px -} -#overview .features.colaboration .thumb { - background:url(../img/features-colaboration.png) no-repeat; - height:160px; - width:100%; - margin:0 auto; - background-position:50% -} -#overview .features.clip-content .thumb { - background:url(../img/features-clip.png) no-repeat; - height:160px; - width:100%; - margin:0 auto; - background-position:-10px -} -#overview .features.private .thumb { - background:url(../img/features-private.png) no-repeat; - height:160px; - width:100%; - margin:0 auto; - background-position:50% -} -#overview .features.share .thumb { - background:url(../img/features-share.png) no-repeat; - height:160px; - width:100%; - margin:0 auto; - background-position:50% -} -#overview .features.visualize .thumb { - background:url(../img/features-visualize.png) no-repeat; - height:180px; - width:100%; - margin:0 auto; - background-position:50% -10% -} -#overview .signup-wrapper { - text-align:center -} -#background-overlay { - position:fixed; - height:100%; - width:100% -} -.report-link { - display:block; - margin-top:6px; - opacity:.4; - position:relative; - margin-right:18px; - text-align:left -} -.report-link:hover { - opacity:.8 -} -.report-link i { - display:inline-block -} -.report-link i.icon-flag { - width:12px; - height:12px -} -.report-link i.icon-rem { - font-size:12px; - position:absolute; - top:5px; - left:7px; - color:black -} -#modal-report-options .modal-body { - overflow:hidden -} -#modal-report-options input[type="radio"] { - margin-right:2px -} -#modal-report-options textarea { - width:204px; - height:46px; - margin-bottom:0 -} -#modal-report-options #report-form { - width:80%; - margin:auto -} -#modal-report-options #report-form div { - -webkit-box-sizing:border-box; - -moz-box-sizing:border-box; - box-sizing:border-box -} -#modal-report-options #report-form div.left { - float:left; - width:211px; - border-right:solid 1px #AAA -} -#modal-report-options #report-form div.left label { - display:inline -} -#modal-report-options #report-form div.right { - float:left; - width:212px; - padding-left:10px -} -#modal-report-options .btn.disabled { - border:solid 1px #AAA -} -#modal-report-options .btn.disabled:active { - color:#333 -} -@media only screen and (max-device-width:768px) and (max-device-width:1024px) { - -} -@media only screen and (max-device-width:480px) { - body #topbar { - position:static; - width:980px; - margin-bottom:0 - } - body #wrapper { - margin-top:0 - } - -} -.img_container { - position:relative; - margin-left:5px; - width:30px; - height:30px; - float:left; - -moz-border-radius:3px; - -webkit-border-radius:3px; - border-radius:3px -} -.img_container:before { - content:''; - position:absolute; - top:0; - left:0; - bottom:0; - right:0; - border:1px solid rgba(0,0,0,0.05); - border-radius:3px; - -moz-border-radius:3px -} -.text_container { - position:relative; - float:left; - padding-left:6px; - width:149px; - height:100%; - overflow:hidden; - font-size:11px; - line-height:1.2; - padding-right:24px; - box-sizing:border-box; - -moz-box-sizing:border-box -} -.tzSelect { - position:relative; - float:left -} -.tzSelect .selectBox { - position:relative; - width:135px; - height:25px; - text-shadow:1px 1px 0 #EEE; - color:#666; - border:1px solid #ddd; - padding-left:5px; - padding-right:15px; - padding-top:5px; - cursor:pointer; - font-weight:bold; - -webkit-border-radius:5px; - -moz-border-radius:5px; - border-radius:5px; - overflow-x:hidden; - overflow-y:hidden; - background:url(../img/arrow-down.gif) no-repeat; - background-position:right -} -.selectBox span { - 140px -} -.tzSelect .selectBox:hover { - background:url(../img/arrow-down.gif) no-repeat right,-webkit-gradient(linear,0 0,0 bottom,from(#fff),to(#f1f0f0)); - background:url(../img/arrow-down.gif) no-repeat right,-moz-linear-gradient(#fff,#f1f0f0); - background:url(../img/arrow-down.gif) no-repeat right,-o-linear-gradient(#fff,#f1f0f0); - background:url(../img/arrow-down.gif) no-repeat right,linear-gradient(#fff,#f1f0f0) -} -.tzSelect .selectBox.expanded { - background:url(../img/arrow-up.gif) no-repeat right,-webkit-gradient(linear,0 0,0 bottom,from(#fff),to(#f1f0f0)); - background:url(../img/arrow-up.gif) no-repeat right,-moz-linear-gradient(#fff,#f1f0f0); - background:url(../img/arrow-up.gif) no-repeat right,-o-linear-gradient(#fff,#f1f0f0); - background:url(../img/arrow-up.gif) no-repeat right,linear-gradient(#fff,#f1f0f0) -} -.tzSelect .dropDown { - width:205px; - list-style:none; - overflow:auto; - max-height:220px; - border-top:1px solid #EEE; - margin-top:5px; - left:-5px; - position:relative -} -.tzSelect li { - color:#555; - text-shadow:none; - width:100%; - padding-top:7px; - padding-bottom:7px; - cursor:pointer; - position:relative; - float:left; - clear:both; -li:first-child { - margin-top:5px -} - -} -.tzSelect li:hover { - background:white -} -.tzSelect li i { - color:#999; - display:block; - font-size:12px -} -#smartbanner { - position:absolute; - left:0; - top:-82px; - border-bottom:1px solid #e8e8e8; - width:100%; - height:78px; - font-family:'Helvetica Neue',sans-serif; - background:-webkit-linear-gradient(top,#f4f4f4 0,#cdcdcd 100%); - background-image:-ms-linear-gradient(top,#F4F4F4 0,#CDCDCD 100%); - background-image:-moz-linear-gradient(top,#F4F4F4 0,#CDCDCD 100%); - box-shadow:0 1px 2px rgba(0,0,0,0.5); - z-index:9998; - -webkit-font-smoothing:antialiased; - overflow:hidden; - -webkit-text-size-adjust:none -} -#smartbanner .sb-container { - margin:0 auto -} -#smartbanner .sb-close { - position:absolute; - left:5px; - top:5px; - display:block; - border:2px solid #fff; - width:14px; - height:14px; - font-family:'ArialRoundedMTBold',Arial; - font-size:15px; - line-height:15px; - text-align:center; - color:#fff; - background:#070707; - text-decoration:none; - text-shadow:none; - border-radius:14px; - box-shadow:0 2px 3px rgba(0,0,0,0.4); - -webkit-font-smoothing:subpixel-antialiased -} -#smartbanner .sb-close:active { - font-size:13px; - color:#aaa -} -#smartbanner .sb-icon { - position:absolute; - left:30px; - top:10px; - display:block; - width:57px; - height:57px; - background:rgba(0,0,0,0.6); - background-size:cover; - border-radius:10px; - box-shadow:0 1px 3px rgba(0,0,0,0.3) -} -#smartbanner.no-icon .sb-icon { - display:none -} -#smartbanner .sb-info { - position:absolute; - left:98px; - top:18px; - width:44%; - font-size:11px; - line-height:1.2em; - font-weight:bold; - color:#6a6a6a; - text-shadow:0 1px 0 rgba(255,255,255,0.8) -} -#smartbanner #smartbanner.no-icon .sb-info { - left:34px -} -#smartbanner .sb-info strong { - display:block; - font-size:13px; - color:#4d4d4d; - line-height:18px -} -#smartbanner .sb-info>span { - display:block -} -#smartbanner .sb-info em { - font-style:normal; - text-transform:uppercase -} -#smartbanner .sb-button { - position:absolute; - right:20px; - top:24px; - border:1px solid #bfbfbf; - padding:0 10px; - min-width:10%; - height:24px; - font-size:14px; - line-height:24px; - text-align:center; - font-weight:bold; - color:#6a6a6a; - background:-webkit-linear-gradient(top,#efefef 0,#dcdcdc 100%); - text-transform:uppercase; - text-decoration:none; - text-shadow:0 1px 0 rgba(255,255,255,0.8); - border-radius:3px; - box-shadow:0 1px 0 rgba(255,255,255,0.6),0 1px 0 rgba(255,255,255,0.7) inset -} -#smartbanner .sb-button:active,#smartbanner .sb-button:hover { - background:-webkit-linear-gradient(top,#dcdcdc 0,#efefef 100%) -} -#smartbanner .sb-icon.gloss:after { - content:''; - position:absolute; - left:0; - top:-1px; - border-top:1px solid rgba(255,255,255,0.8); - width:100%; - height:50%; - background:-webkit-linear-gradient(top,rgba(255,255,255,0.7) 0,rgba(255,255,255,0.2) 100%); - border-radius:10px 10px 12px 12px -} -#smartbanner.android { - border-color:#212228; - background:#3d3d3d url(../img/dark_background_stripes.gif); - border-top:5px solid #88B131; - box-shadow:none -} -#smartbanner.android .sb-close { - border:0; - width:17px; - height:17px; - line-height:17px; - color:#b1b1b3; - background:#1c1e21; - text-shadow:0 1px 1px #000; - box-shadow:0 1px 2px rgba(0,0,0,0.8) inset,0 1px 1px rgba(255,255,255,0.3) -} -#smartbanner.android .sb-close:active { - color:#eee -} -#smartbanner.android .sb-info { - color:#ccc; - text-shadow:0 1px 2px #000 -} -#smartbanner.android .sb-info strong { - color:#fff -} -#smartbanner.android .sb-button { - min-width:12%; - border:1px solid #DDDCDC; - padding:1px; - color:#d1d1d1; - background:none; - border-radius:0; - box-shadow:none -} -#smartbanner.android .sb-button span { - text-align:center; - display:block; - padding:0 10px; - background-color:#42B6C9; - background-image:-webkit-gradient(linear,0 0,0 100%,from(#42B6C9),to(#39A9BB)); - background-image:-moz-linear-gradient(top,#42B6C9,#39A9BB); - text-transform:none; - text-shadow:none; - box-shadow:none -} -#smartbanner.android .sb-button:active,#smartbanner.android .sb-button:hover { - background:none -} -#smartbanner.android .sb-button:active span,#smartbanner.android .sb-button:hover span { - background:#2AC7E1 -} -#smartbanner.windows .sb-icon { - border-radius:0 -} -.nav-button-mid { - background-position: 0 500px; - background-repeat: no-repeat; - display: block; - height: 40px; - margin-right: 5px; - margin-left: 100px; -} -.nav-sprite { - background-image: url("../img/cart.png"); -} - -.nav-button-outer-open .nav-button-inner { - background-position: right -220px; -} -.nav-button-inner { - background-position: 0 500px; - background-repeat: no-repeat; - display: block; - height: 40px; - padding: 0 5px; - position: relative; -} -#nav-cart .nav-button-title { - left: 42px; - position: absolute; -} -.nav-button-title.nav-button-line1 { - position: absolute; - top: 7px; -} -#nav-cart .nav-button-line2 { - font-size: 14px; - font-weight: bold; - line-height: 16px; -} - -#nav-cart .nav-button-line2 { - font-size: 14px; - font-weight: bold; - line-height: 16px; -} -#nav-cart .nav-button-title { - bottom: 8px; - left: 42px; - position: absolute; -} -.nav-button-title { - color: #2E3741; - display: block; - font-family: "arial","sans-serif"; - font-size: 12px; - line-height: 14px; - margin-bottom: -2px; - overflow: hidden; - text-decoration: none; - white-space: nowrap; -} - - -.nav-cart-button { - background-position: -5px -3px; - display: block; - height: 30px; - left: 2px; - overflow: hidden; - position: absolute; - top: 8px; - width: 42px; -} - -#nav-cart .nav-cart-0 { - font-size: 16px; - left: 18px; - top: 6px; - width: 19px; -} -#nav-cart-count { - color: #E47911; - font-family: "arial","sans-serif"; - font-weight: bold; - line-height: 16px; - position: absolute; - text-align: center; - width: 20px; -} -.tool-category-label { - font-size: 14px; - line-height: 27px; - color: #464646; - overflow: hidden; - white-space: normal; - padding: 5px; - font-weight: bold; - display: block; -} -.tool-category { - border-radius: 0 0 2px 2px; - border: 1px solid rgba(0, 0, 0, 0.1); - height: auto; - padding: 10px; - float: left; - margin-right: 10px; -} \ No newline at end of file diff --git a/app/css/bootstrap.min.css b/app/css/bootstrap.min.css deleted file mode 100644 index b72e9cc..0000000 --- a/app/css/bootstrap.min.css +++ /dev/null @@ -1,9 +0,0 @@ -/*! - * Bootstrap v2.3.1 - * - * Copyright 2012 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 @twitter 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:31px;-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:auto;max-width:100%;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:.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:21px;color:#c8c8c8;background-color:#272b30}a{color:#fff;text-decoration:none}a:hover,a:focus{color:#fff;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:31px;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 10.5px}.lead{margin-bottom:21px;font-size:21px;font-weight:200;line-height:31.5px}small{font-size:85%}strong{font-weight:bold}em{font-style:italic}cite{font-style:normal}.muted{color:#7a8288}a.muted:hover,a.muted:focus{color:#62686d}.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:10.5px 0;font-family:inherit;font-weight:bold;line-height:21px;color:inherit;text-rendering:optimizelegibility}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{font-weight:normal;line-height:1;color:#7a8288}h1,h2,h3{line-height:42px}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:9.5px;margin:21px 0 31.5px;border-bottom:1px solid #bbbfc2}ul,ol{padding:0;margin:0 0 10.5px 25px}ul ul,ul ol,ol ol,ol ul{margin-bottom:0}li{line-height:21px}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:21px}dt,dd{line-height:21px}dt{font-weight:bold}dd{margin-left:10.5px}.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:21px 0;border:0;border-top:1px solid #1c1e22;border-bottom:1px solid #fff}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #7a8288}abbr.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:0 0 0 15px;margin:0 0 21px;border-left:5px solid #bbbfc2}blockquote p{margin-bottom:0;font-size:17.5px;font-weight:300;line-height:1.25}blockquote small{display:block;line-height:21px;color:#7a8288}blockquote small:before{content:'\2014 \00A0'}blockquote.pull-right{float:right;padding-right:15px;padding-left:0;border-right:5px solid #bbbfc2;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:21px;font-style:normal;line-height:21px}code,pre{padding:0 3px 2px;font-family:Menlo,Monaco,Consolas,"Courier New",monospace;font-size:12px;color:#3a3f44;-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:10px;margin:0 0 10.5px;font-size:13px;line-height:21px;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:21px}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 21px}fieldset{padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:21px;font-size:21px;line-height:42px;color:#3a3f44;border:0;border-bottom:1px solid #e5e5e5}legend small{font-size:15.75px;color:#7a8288}label,input,button,select,textarea{font-size:14px;font-weight:normal;line-height:21px}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:21px;padding:4px 6px;margin-bottom:10.5px;font-size:14px;line-height:21px;color:#52575c;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:#fff;border:1px solid #ccc;-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 .2s,box-shadow linear .2s;-moz-transition:border linear .2s,box-shadow linear .2s;-o-transition:border linear .2s,box-shadow linear .2s;transition:border linear .2s,box-shadow linear .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;-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:31px;*margin-top:4px;line-height:31px}select{width:220px;background-color:#fff;border:1px solid #ccc}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:#7a8288;cursor:not-allowed;background-color:#fcfcfc;border-color:#ccc;-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:#7a8288}input:-ms-input-placeholder,textarea:-ms-input-placeholder{color:#7a8288}input::-webkit-input-placeholder,textarea::-webkit-input-placeholder{color:#7a8288}.radio,.checkbox{min-height:21px;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:#bbbfc2}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:20px 20px 21px;margin-top:21px;margin-bottom:21px;background-color:#202328;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:#eee}.help-block{display:block;margin-bottom:10.5px}.help-inline{display:inline-block;*display:inline;padding-left:5px;vertical-align:middle;*zoom:1}.input-append,.input-prepend{display:inline-block;margin-bottom:10.5px;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:21px;min-width:16px;padding:4px 5px;font-size:14px;font-weight:normal;line-height:21px;text-align:center;text-shadow:0 1px 0 #fff;background-color:#bbbfc2;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:#d1eed1;border-color:#62c462}.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;margin-bottom:0;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.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:10.5px}legend+.control-group{margin-top:21px;-webkit-margin-top-collapse:separate}.form-horizontal .control-group{margin-bottom:21px;*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:10.5px}.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:21px}.table th,.table td{padding:8px;line-height:21px;text-align:left;vertical-align:top;border-top:1px solid #1c1e22}.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 #1c1e22}.table .table{background-color:#272b30}.table-condensed th,.table-condensed td{padding:4px 5px}.table-bordered{border:1px solid #1c1e22;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 #1c1e22}.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:#2e3236}.table-hover tbody tr:hover>td,.table-hover tbody tr:hover>th{background-color:#3a3f44}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}.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 #000;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:#3a3f44;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:9.5px 1px;*margin:-5px 0 5px;overflow:hidden;background-color:transparent;border-bottom:1px solid #1c1e22}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:normal;line-height:21px;color:#7a8288;white-space:nowrap}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus,.dropdown-submenu:hover>a,.dropdown-submenu:focus>a{color:#fff;text-decoration:none;background-color:#22262a;background-image:-moz-linear-gradient(top,#272b30,#1c1e22);background-image:-webkit-gradient(linear,0 0,0 100%,from(#272b30),to(#1c1e22));background-image:-webkit-linear-gradient(top,#272b30,#1c1e22);background-image:-o-linear-gradient(top,#272b30,#1c1e22);background-image:linear-gradient(to bottom,#272b30,#1c1e22);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff272b30',endColorstr='#ff1c1e22',GradientType=0)}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#fff;text-decoration:none;background-color:#22262a;background-image:-moz-linear-gradient(top,#272b30,#1c1e22);background-image:-webkit-gradient(linear,0 0,0 100%,from(#272b30),to(#1c1e22));background-image:-webkit-linear-gradient(top,#272b30,#1c1e22);background-image:-o-linear-gradient(top,#272b30,#1c1e22);background-image:linear-gradient(to bottom,#272b30,#1c1e22);background-repeat:repeat-x;outline:0;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff272b30',endColorstr='#ff1c1e22',GradientType=0)}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{color:#7a8288}.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}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px solid #000;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:#0b0c0d;border-style:solid;border-width:5px 0 5px 5px;content:" "}.dropdown-submenu:hover>a:after{border-left-color:#fff}.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:#202328;border:1px solid #101214;-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 .15s linear;-moz-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{position:relative;height:0;overflow:hidden;-webkit-transition:height .35s ease;-moz-transition:height .35s ease;-o-transition:height .35s ease;transition:height .35s ease}.collapse.in{height:auto}.close{float:right;font-size:20px;font-weight:bold;line-height:21px;color:#000;text-shadow:0 1px 0 #fff;opacity:.2;filter:alpha(opacity=20)}.close:hover,.close:focus{color:#000;text-decoration:none;cursor:pointer;opacity:.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:21px;color:#3a3f44;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,#fff,#e6e6e6);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fff),to(#e6e6e6));background-image:-webkit-linear-gradient(top,#fff,#e6e6e6);background-image:-o-linear-gradient(top,#fff,#e6e6e6);background-image:linear-gradient(to bottom,#fff,#e6e6e6);background-repeat:repeat-x;border:1px solid #ccc;*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:#3a3f44;background-color:#e6e6e6;*background-color:#d9d9d9}.btn:active,.btn.active{background-color:#ccc \9}.btn:first-child{*margin-left:0}.btn:hover,.btn:focus{color:#3a3f44;text-decoration:none;background-position:0 -15px;-webkit-transition:background-position .1s linear;-moz-transition:background-position .1s linear;-o-transition:background-position .1s linear;transition:background-position .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:.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:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#bbbec2;*background-color:#bbbdc2;background-image:-moz-linear-gradient(top,#bbbfc2,#bbbdc2);background-image:-webkit-gradient(linear,0 0,0 100%,from(#bbbfc2),to(#bbbdc2));background-image:-webkit-linear-gradient(top,#bbbfc2,#bbbdc2);background-image:-o-linear-gradient(top,#bbbfc2,#bbbdc2);background-image:linear-gradient(to bottom,#bbbfc2,#bbbdc2);background-repeat:repeat-x;border-color:#bbbdc2 #bbbdc2 #93969e;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='#ffbbbfc2',endColorstr='#ffbbbdc2',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:#fff;background-color:#bbbdc2;*background-color:#aeb0b6}.btn-primary:active,.btn-primary.active{background-color:#a0a3aa \9}.btn-warning{color:#fff;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:#fff;background-color:#f89406;*background-color:#df8505}.btn-warning:active,.btn-warning.active{background-color:#c67605 \9}.btn-danger{color:#fff;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:#fff;background-color:#bd362f;*background-color:#a9302a}.btn-danger:active,.btn-danger.active{background-color:#942a25 \9}.btn-success{color:#fff;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:#fff;background-color:#51a351;*background-color:#499249}.btn-success:active,.btn-success.active{background-color:#408140 \9}.btn-info{color:#fff;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:#fff;background-color:#2f96b4;*background-color:#2a85a0}.btn-info:active,.btn-info.active{background-color:#24748c \9}.btn-inverse{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#41454a;*background-color:#272b30;background-image:-moz-linear-gradient(top,#52575c,#272b30);background-image:-webkit-gradient(linear,0 0,0 100%,from(#52575c),to(#272b30));background-image:-webkit-linear-gradient(top,#52575c,#272b30);background-image:-o-linear-gradient(top,#52575c,#272b30);background-image:linear-gradient(to bottom,#52575c,#272b30);background-repeat:repeat-x;border-color:#272b30 #272b30 #050506;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='#ff52575c',endColorstr='#ff272b30',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:#fff;background-color:#272b30;*background-color:#1c1e22}.btn-inverse:active,.btn-inverse.active{background-color:#101214 \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:#fff;cursor:pointer;border-color:transparent;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-link:hover,.btn-link:focus{color:#fff;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover,.btn-link[disabled]:focus{color:#3a3f44;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:10.5px;margin-bottom:10.5px;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:#bbbdc2}.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:#272b30}.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:#fff;border-bottom-color:#fff}.btn-group-vertical{display:inline-block;*display:inline;*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:21px;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:21px}.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:21px;margin-left:0;list-style:none}.nav>li>a{display:block}.nav>li>a:hover,.nav>li>a:focus{text-decoration:none;background-color:#bbbfc2}.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:21px;color:#7a8288;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:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.2);background-color:#fff}.nav-list [class^="icon-"],.nav-list [class*=" icon-"]{margin-right:2px}.nav-list .divider{*width:100%;height:1px;margin:9.5px 1px;*margin:-5px 0 5px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #fff}.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:21px;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:#bbbfc2 #bbbfc2 #ddd}.nav-tabs>.active>a,.nav-tabs>.active>a:hover,.nav-tabs>.active>a:focus{color:#52575c;cursor:default;background-color:#272b30;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:#fff;background-color:#fff}.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:#fff;border-bottom-color:#fff}.nav .dropdown-toggle:hover .caret,.nav .dropdown-toggle:focus .caret{border-top-color:#fff;border-bottom-color:#fff}.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:#52575c;border-bottom-color:#52575c}.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:#fff;background-color:#7a8288;border-color:#7a8288}.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:#fff;border-bottom-color:#fff;opacity:1;filter:alpha(opacity=100)}.tabs-stacked .open>a:hover,.tabs-stacked .open>a:focus{border-color:#7a8288}.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:#bbbfc2 #ddd #bbbfc2 #bbbfc2}.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:#fff}.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:#bbbfc2 #bbbfc2 #bbbfc2 #ddd}.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:#fff}.nav>.disabled>a{color:#7a8288}.nav>.disabled>a:hover,.nav>.disabled>a:focus{text-decoration:none;cursor:default;background-color:transparent}.navbar{*position:relative;*z-index:2;margin-bottom:21px;overflow:visible}.navbar-inner{min-height:40px;padding-right:20px;padding-left:20px;background-color:#32373c;background-image:-moz-linear-gradient(top,#3a3f44,#272b30);background-image:-webkit-gradient(linear,0 0,0 100%,from(#3a3f44),to(#272b30));background-image:-webkit-linear-gradient(top,#3a3f44,#272b30);background-image:-o-linear-gradient(top,#3a3f44,#272b30);background-image:linear-gradient(to bottom,#3a3f44,#272b30);background-repeat:repeat-x;border:1px solid #0c0d0e;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3a3f44',endColorstr='#ff272b30',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:9.5px 20px 9.5px;margin-left:-20px;font-size:20px;font-weight:200;color:#bbbfc2;text-shadow:0 1px 0 #3a3f44}.navbar .brand:hover,.navbar .brand:focus{text-decoration:none}.navbar-text{margin-bottom:0;line-height:40px;color:#c8c8c8}.navbar-link{color:#c8c8c8}.navbar-link:hover,.navbar-link:focus{color:#fff}.navbar .divider-vertical{height:40px;margin:0 9px;border-right:1px solid #3a3f44;border-left:1px solid #272b30}.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:9.5px 15px 9.5px;color:#c8c8c8;text-decoration:none;text-shadow:0 1px 0 #3a3f44}.navbar .nav .dropdown-toggle .caret{margin-top:8px}.navbar .nav>li>a:focus,.navbar .nav>li>a:hover{color:#fff;text-decoration:none;background-color:#3a3f44}.navbar .nav>.active>a,.navbar .nav>.active>a:hover,.navbar .nav>.active>a:focus{color:#fff;text-decoration:none;background-color:#272b30;-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:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#272a2e;*background-color:#1c1e22;background-image:-moz-linear-gradient(top,#2e3236,#1c1e22);background-image:-webkit-gradient(linear,0 0,0 100%,from(#2e3236),to(#1c1e22));background-image:-webkit-linear-gradient(top,#2e3236,#1c1e22);background-image:-o-linear-gradient(top,#2e3236,#1c1e22);background-image:linear-gradient(to bottom,#2e3236,#1c1e22);background-repeat:repeat-x;border-color:#1c1e22 #1c1e22 #000;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='#ff2e3236',endColorstr='#ff1c1e22',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:#fff;background-color:#1c1e22;*background-color:#101214}.navbar .btn-navbar:active,.navbar .btn-navbar.active{background-color:#050506 \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 #3a3f44;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 #3a3f44;border-bottom:0}.navbar .nav li.dropdown>a:hover .caret,.navbar .nav li.dropdown>a:focus .caret{border-top-color:#fff;border-bottom-color:#fff}.navbar .nav li.dropdown.open>.dropdown-toggle,.navbar .nav li.dropdown.active>.dropdown-toggle,.navbar .nav li.dropdown.open.active>.dropdown-toggle{color:#fff;background-color:#272b30}.navbar .nav li.dropdown>.dropdown-toggle .caret{border-top-color:#c8c8c8;border-bottom-color:#c8c8c8}.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:#fff;border-bottom-color:#fff}.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:#1e2125;background-image:-moz-linear-gradient(top,#272b30,#101214);background-image:-webkit-gradient(linear,0 0,0 100%,from(#272b30),to(#101214));background-image:-webkit-linear-gradient(top,#272b30,#101214);background-image:-o-linear-gradient(top,#272b30,#101214);background-image:linear-gradient(to bottom,#272b30,#101214);background-repeat:repeat-x;border-color:#252525;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff272b30',endColorstr='#ff101214',GradientType=0)}.navbar-inverse .brand,.navbar-inverse .nav>li>a{color:#7a8288;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:#fff}.navbar-inverse .brand{color:#7a8288}.navbar-inverse .navbar-text{color:#7a8288}.navbar-inverse .nav>li>a:focus,.navbar-inverse .nav>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .nav .active>a,.navbar-inverse .nav .active>a:hover,.navbar-inverse .nav .active>a:focus{color:#fff;background-color:#101214}.navbar-inverse .navbar-link{color:#7a8288}.navbar-inverse .navbar-link:hover,.navbar-inverse .navbar-link:focus{color:#fff}.navbar-inverse .divider-vertical{border-right-color:#272b30;border-left-color:#101214}.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:#fff;background-color:#101214}.navbar-inverse .nav li.dropdown>a:hover .caret,.navbar-inverse .nav li.dropdown>a:focus .caret{border-top-color:#fff;border-bottom-color:#fff}.navbar-inverse .nav li.dropdown>.dropdown-toggle .caret{border-top-color:#7a8288;border-bottom-color:#7a8288}.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:#fff;border-bottom-color:#fff}.navbar-inverse .navbar-search .search-query{color:#fff;background-color:#49515a;border-color:#101214;-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:#ccc}.navbar-inverse .navbar-search .search-query:-ms-input-placeholder{color:#ccc}.navbar-inverse .navbar-search .search-query::-webkit-input-placeholder{color:#ccc}.navbar-inverse .navbar-search .search-query:focus,.navbar-inverse .navbar-search .search-query.focused{padding:5px 15px;color:#3a3f44;text-shadow:0 1px 0 #fff;background-color:#fff;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:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#121417;*background-color:#050506;background-image:-moz-linear-gradient(top,#1c1e22,#050506);background-image:-webkit-gradient(linear,0 0,0 100%,from(#1c1e22),to(#050506));background-image:-webkit-linear-gradient(top,#1c1e22,#050506);background-image:-o-linear-gradient(top,#1c1e22,#050506);background-image:linear-gradient(to bottom,#1c1e22,#050506);background-repeat:repeat-x;border-color:#050506 #050506 #000;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='#ff1c1e22',endColorstr='#ff050506',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:#fff;background-color:#050506;*background-color:#000}.navbar-inverse .btn-navbar:active,.navbar-inverse .btn-navbar.active{background-color:#000 \9}.breadcrumb{padding:8px 15px;margin:0 0 21px;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 #fff;*zoom:1}.breadcrumb>li>.divider{padding:0 5px;color:#ccc}.breadcrumb>.active{color:#7a8288}.pagination{margin:21px 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:21px;text-decoration:none;background-color:#fff;border:1px solid #ddd;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:#7a8288;cursor:default}.pagination ul>.disabled>span,.pagination ul>.disabled>a,.pagination ul>.disabled>a:hover,.pagination ul>.disabled>a:focus{color:#7a8288;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:21px 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:#7a8288;cursor:default;background-color:#fff}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop,.modal-backdrop.fade.in{opacity:.8;filter:alpha(opacity=80)}.modal{position:fixed;top:10%;left:50%;z-index:1050;width:560px;margin-left:-280px;background-color:#fff;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:0;-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 .3s linear,top .3s ease-out;-moz-transition:opacity .3s linear,top .3s ease-out;-o-transition:opacity .3s linear,top .3s ease-out;transition:opacity .3s linear,top .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 #fff;-moz-box-shadow:inset 0 1px 0 #fff;box-shadow:inset 0 1px 0 #fff}.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:.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:#fff;text-align:center;text-decoration:none;background-color:#3a3f44;-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:#3a3f44;border-width:5px 5px 0}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-right-color:#3a3f44;border-width:5px 5px 5px 0}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-left-color:#3a3f44;border-width:5px 0 5px 5px}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-bottom-color:#3a3f44;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:#3a3f44;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:#41474c;border-bottom:1px solid #353a3e;-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:#3a3f44;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:#3a3f44;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:#3a3f44;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:#3a3f44;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:21px;margin-left:20px}.thumbnail{display:block;padding:4px;line-height:21px;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 .2s ease-in-out;-moz-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}a.thumbnail:hover,a.thumbnail:focus{border-color:#fff;-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:#52575c}.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:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);white-space:nowrap;vertical-align:baseline;background-color:#7a8288}.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:#fff;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:#3a3f44}.label-inverse[href],.badge-inverse[href]{background-color:#232628}.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:21px;margin-bottom:21px;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:#fff;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 .6s ease;-moz-transition:width .6s ease;-o-transition:width .6s ease;transition:width .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:21px}.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:21px;line-height:1}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;-moz-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>img,.carousel-inner>.item>a>img{display:block;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:#fff;text-align:center;background:#272b30;border:3px solid #fff;-webkit-border-radius:23px;-moz-border-radius:23px;border-radius:23px;opacity:.5;filter:alpha(opacity=50)}.carousel-control.right{right:15px;left:auto}.carousel-control:hover,.carousel-control:focus{color:#fff;text-decoration:none;opacity:.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:#3a3f44;background:rgba(0,0,0,0.75)}.carousel-caption h4,.carousel-caption p{line-height:21px;color:#fff}.carousel-caption h4{margin:0 0 5px}.carousel-caption p{margin-bottom:0}.hero-unit{padding:60px;margin-bottom:30px;font-size:18px;font-weight:200;line-height:31.5px;color:inherit;background-color:#202328;-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:31.5px}.pull-right{float:right}.pull-left{float:left}.hide{display:none}.show{display:block}.invisible{visibility:hidden}.affix{position:fixed}h1,h2,h3,h4,h5,h6{text-shadow:-1px -1px 0 rgba(0,0,0,0.3)}code,pre{text-shadow:none;background-color:#f7f7f7;border:1px solid #1c1e22}legend,.page-header{border-bottom:1px solid #1c1e22}hr{border-bottom:0}.navbar .navbar-inner{background-color:#3a3f44;background-image:-webkit-gradient(linear,0 0,0 100%,from(#52575c),color-stop(70%,#3a3f44),to(#3a3f44));background-image:-webkit-linear-gradient(#52575c,#3a3f44 70%,#3a3f44);background-image:-moz-linear-gradient(top,#52575c,#3a3f44 70%,#3a3f44);background-image:-o-linear-gradient(#52575c,#3a3f44 70%,#3a3f44);background-image:linear-gradient(#52575c,#3a3f44 70%,#3a3f44);background-repeat:no-repeat;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff52575c',endColorstr='#ff3a3f44',GradientType=0)}.navbar .brand{font-weight:bold;text-shadow:1px 1px 1px rgba(0,0,0,0.3);border-right:1px solid #2e3134}.navbar .navbar-text{padding:0 15px;font-weight:bold}.navbar .nav>li>a{text-shadow:1px 1px 1px rgba(0,0,0,0.3);border-right:1px solid rgba(0,0,0,0.2);border-left:1px solid rgba(255,255,255,0.1)}.navbar .nav>li>a:hover{background-color:#3a3f44;background-image:-moz-linear-gradient(280deg,#272b30,#3a3f44);background-image:-webkit-linear-gradient(280deg,#272b30,#3a3f44);background-image:-o-linear-gradient(280deg,#272b30,#3a3f44);background-image:linear-gradient(280deg,#272b30,#3a3f44);background-repeat:repeat-x;border-right:1px solid transparent;border-left:1px solid transparent}.navbar .nav>li.active>a,.navbar .nav>li.active>a:hover{color:#bbbfc2;background-color:#3a3f44;background-color:#43494f;background-image:-moz-linear-gradient(280deg,#30353b,#43494f);background-image:-webkit-linear-gradient(280deg,#30353b,#43494f);background-image:-o-linear-gradient(280deg,#30353b,#43494f);background-image:linear-gradient(280deg,#30353b,#43494f);background-repeat:repeat-x;border-right:1px solid #2e3134}.navbar .navbar-search .search-query{border:1px solid #2e3134}.navbar .btn,.navbar .btn-group{margin:4px 0}.navbar .divider-vertical{background-color:transparent;border-right:0}.navbar .dropdown-menu::after{border-bottom:6px solid #3a3f44}.navbar-inverse .navbar-inner{background-color:#151719;background-image:-webkit-gradient(linear,0 0,0 100%,from(#202328),color-stop(70%,#151719),to(#151719));background-image:-webkit-linear-gradient(#202328,#151719 70%,#151719);background-image:-moz-linear-gradient(top,#202328,#151719 70%,#151719);background-image:-o-linear-gradient(#202328,#151719 70%,#151719);background-image:linear-gradient(#202328,#151719 70%,#151719);background-repeat:no-repeat;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff202328',endColorstr='#ff151719',GradientType=0)}.navbar-inverse .nav li>a{background-color:transparent;background-image:none}.navbar-inverse .nav li>a:hover,.navbar-inverse .nav li.active>a,.navbar-inverse .nav li.active>a:hover{background-color:#1c1e22;background-image:-moz-linear-gradient(280deg,#101214,#1c1e22);background-image:-webkit-linear-gradient(280deg,#101214,#1c1e22);background-image:-o-linear-gradient(280deg,#101214,#1c1e22);background-image:linear-gradient(280deg,#101214,#1c1e22);background-repeat:repeat-x}@media(max-width:979px){.navbar .nav-collapse .nav li>a,.navbar .nav-collapse .nav li>a:hover,.navbar .nav-collapse .nav .active>a,.navbar .nav-collapse .nav .active>a:hover{color:#bbbfc2;background-color:transparent;background-image:none;border:1px solid transparent;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.navbar .nav-collapse .nav li>a:hover,.navbar .nav-collapse .nav .active>a:hover{background-color:#272b30}.navbar .nav-collapse .navbar-form,.navbar .nav-collapse .navbar-search{border-color:transparent;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.navbar .nav-collapse .nav-header{color:#7a8288}.navbar-inverse .nav-collapse .nav li>a:hover,.navbar-inverse .nav-collapse .nav .active>a:hover{background-color:#272b30!important}}div.subnav{margin:0 1px;background-color:#3a3f44;background-image:-webkit-gradient(linear,0 0,0 100%,from(#52575c),color-stop(70%,#3a3f44),to(#3a3f44));background-image:-webkit-linear-gradient(#52575c,#3a3f44 70%,#3a3f44);background-image:-moz-linear-gradient(top,#52575c,#3a3f44 70%,#3a3f44);background-image:-o-linear-gradient(#52575c,#3a3f44 70%,#3a3f44);background-image:linear-gradient(#52575c,#3a3f44 70%,#3a3f44);background-repeat:no-repeat;border:1px solid transparent;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff52575c',endColorstr='#ff3a3f44',GradientType=0);-webkit-box-shadow:'0 1px 3px rgba(0, 0, 0, 0.25), inset 0 -1px 0 rgba(0, 0, 0, 0.1)';-moz-box-shadow:'0 1px 3px rgba(0, 0, 0, 0.25), inset 0 -1px 0 rgba(0, 0, 0, 0.1)';box-shadow:'0 1px 3px rgba(0, 0, 0, 0.25), inset 0 -1px 0 rgba(0, 0, 0, 0.1)'}div.subnav .nav>li>a{color:#bbbfc2;text-shadow:1px 1px 1px rgba(0,0,0,0.3);border-right:1px solid #2e3134;border-left:1px solid #52575c}div.subnav .nav>li>a:hover{color:#bbbfc2;background-color:#3a3f44;background-image:-moz-linear-gradient(280deg,#272b30,#3a3f44);background-image:-webkit-linear-gradient(280deg,#272b30,#3a3f44);background-image:-o-linear-gradient(280deg,#272b30,#3a3f44);background-image:linear-gradient(280deg,#272b30,#3a3f44);background-repeat:repeat-x;border-right:1px solid transparent;border-left:1px solid transparent}div.subnav .nav>li.active>a,div.subnav .nav>li.active>a:hover{color:#bbbfc2;background-color:#3a3f44;background-color:#43494f;background-image:-moz-linear-gradient(280deg,#30353b,#43494f);background-image:-webkit-linear-gradient(280deg,#30353b,#43494f);background-image:-o-linear-gradient(280deg,#30353b,#43494f);background-image:linear-gradient(280deg,#30353b,#43494f);background-repeat:repeat-x;border-right:1px solid #2e3134}div.subnav .nav>li:first-child>a,div.subnav .nav>li:first-child>a:hover{border-left:1px solid transparent}div.subnav .nav>li.active:last-child>a,div.subnav .nav>li:last-child>a:hover{border-right:1px solid #2e3134}div.subnav .open .dropdown-toggle{border-right:1px solid #2e3134;border-left:1px solid #52575c}div.subnav.subnav-fixed{top:40px;margin:0;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}div.subnav.subnav-fixed .nav>li.active:first-child>a,div.subnav.subnav-fixed .nav>li:first-child>a:hover{border-left:1px solid #2e3134}.nav .nav-header{text-shadow:-1px -1px 0 rgba(0,0,0,0.3)}.nav>li>a{font-weight:bold;color:#7a8288;text-shadow:1px 1px 1px rgba(0,0,0,0.3);background-color:#3a3f44;background-image:-webkit-gradient(linear,0 0,0 100%,from(#52575c),color-stop(70%,#3a3f44),to(#3a3f44));background-image:-webkit-linear-gradient(#52575c,#3a3f44 70%,#3a3f44);background-image:-moz-linear-gradient(top,#52575c,#3a3f44 70%,#3a3f44);background-image:-o-linear-gradient(#52575c,#3a3f44 70%,#3a3f44);background-image:linear-gradient(#52575c,#3a3f44 70%,#3a3f44);background-repeat:no-repeat;border:0;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff52575c',endColorstr='#ff3a3f44',GradientType=0);-webkit-box-shadow:'0 1px 3px rgba(0, 0, 0, 0.25), inset 0 -1px 0 rgba(0, 0, 0, 0.1)';-moz-box-shadow:'0 1px 3px rgba(0, 0, 0, 0.25), inset 0 -1px 0 rgba(0, 0, 0, 0.1)';box-shadow:'0 1px 3px rgba(0, 0, 0, 0.25), inset 0 -1px 0 rgba(0, 0, 0, 0.1)'}.nav li.active>a,.nav li.active>a:hover{color:#fff;background-color:transparent;border:0}.nav li>a:hover{color:#bbbfc2;background-color:transparent}.nav-list{background-color:#3a3f44;-webkit-box-shadow:1px 1px 1px rgba(0,0,0,0.4);-moz-box-shadow:1px 1px 1px rgba(0,0,0,0.4);box-shadow:1px 1px 1px rgba(0,0,0,0.4)}.nav-list li>a{text-shadow:-1px -1px 0 rgba(0,0,0,0.3);background-image:none}.nav-list .nav-header{color:#52575c;text-shadow:-1px -1px 0 rgba(0,0,0,0.3)}.nav-list .divider{background-color:transparent;border-bottom:1px solid #1c1e22}.nav-tabs{border-bottom:0}.tabs-below .nav-tabs{border-top:0}.tabs-left .nav-tabs{border-right:0}.tabs-right .nav-tabs{border-left:none}.nav-tabs.nav-stacked li>a,.nav-tabs.nav-stacked li>a:hover{background-image:none;border:1px solid #1c1e22}.nav-tabs.nav-stacked li>a:hover,.nav-tabs.nav-stacked .active>a,.nav-tabs.nav-stacked .active>a:hover{color:#fff;background-color:#202328}.breadcrumb{background-color:#3a3f44;background-image:-webkit-gradient(linear,0 0,0 100%,from(#52575c),color-stop(70%,#3a3f44),to(#3a3f44));background-image:-webkit-linear-gradient(#52575c,#3a3f44 70%,#3a3f44);background-image:-moz-linear-gradient(top,#52575c,#3a3f44 70%,#3a3f44);background-image:-o-linear-gradient(#52575c,#3a3f44 70%,#3a3f44);background-image:linear-gradient(#52575c,#3a3f44 70%,#3a3f44);background-repeat:no-repeat;border:1px solid transparent;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff52575c',endColorstr='#ff3a3f44',GradientType=0);-webkit-box-shadow:'0 1px 3px rgba(0, 0, 0, 0.25), inset 0 -1px 0 rgba(0, 0, 0, 0.1)';-moz-box-shadow:'0 1px 3px rgba(0, 0, 0, 0.25), inset 0 -1px 0 rgba(0, 0, 0, 0.1)';box-shadow:'0 1px 3px rgba(0, 0, 0, 0.25), inset 0 -1px 0 rgba(0, 0, 0, 0.1)'}.breadcrumb a{font-weight:bold;color:#bbbfc2}.breadcrumb li{font-weight:bold;color:#7a8288;text-shadow:1px 1px 1px rgba(0,0,0,0.3)}.pagination ul{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.pagination ul>li>a,.pagination ul>li>span{font-weight:bold;color:#bbbfc2;text-shadow:1px 1px 1px rgba(0,0,0,0.3);background-color:#3a3f44;background-image:-webkit-gradient(linear,0 0,0 100%,from(#52575c),color-stop(70%,#3a3f44),to(#3a3f44));background-image:-webkit-linear-gradient(#52575c,#3a3f44 70%,#3a3f44);background-image:-moz-linear-gradient(top,#52575c,#3a3f44 70%,#3a3f44);background-image:-o-linear-gradient(#52575c,#3a3f44 70%,#3a3f44);background-image:linear-gradient(#52575c,#3a3f44 70%,#3a3f44);background-repeat:no-repeat;border-top:0;border-right:1px solid #2e3134;border-bottom:0;border-left:1px solid #52575c;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff52575c',endColorstr='#ff3a3f44',GradientType=0);-webkit-box-shadow:'0 1px 3px rgba(0, 0, 0, 0.25), inset 0 -1px 0 rgba(0, 0, 0, 0.1)';-moz-box-shadow:'0 1px 3px rgba(0, 0, 0, 0.25), inset 0 -1px 0 rgba(0, 0, 0, 0.1)';box-shadow:'0 1px 3px rgba(0, 0, 0, 0.25), inset 0 -1px 0 rgba(0, 0, 0, 0.1)'}.pagination ul>li>a:hover,.pagination ul>li>span:hover{background-color:#3a3f44;background-image:-moz-linear-gradient(280deg,#272b30,#3a3f44);background-image:-webkit-linear-gradient(280deg,#272b30,#3a3f44);background-image:-o-linear-gradient(280deg,#272b30,#3a3f44);background-image:linear-gradient(280deg,#272b30,#3a3f44);background-repeat:repeat-x;border-left:1px solid transparent}.pagination ul>.active>a,.pagination ul>.active>a:hover,.pagination ul>.active>span,.pagination ul>.active>span:hover{color:#bbbfc2;background-color:#3a3f44;background-color:#43494f;background-image:-moz-linear-gradient(280deg,#30353b,#43494f);background-image:-webkit-linear-gradient(280deg,#30353b,#43494f);background-image:-o-linear-gradient(280deg,#30353b,#43494f);background-image:linear-gradient(280deg,#30353b,#43494f);background-repeat:repeat-x;border-left:1px solid transparent}.pagination ul>.disabled>a,.pagination ul>.disabled>a:hover,.pagination ul>.disabled>span,.pagination ul>.disabled>span:hover{background-color:#52575c;background-image:-webkit-gradient(linear,0 0,0 100%,from(#7a8288),color-stop(70%,#52575c),to(#52575c));background-image:-webkit-linear-gradient(#7a8288,#52575c 70%,#52575c);background-image:-moz-linear-gradient(top,#7a8288,#52575c 70%,#52575c);background-image:-o-linear-gradient(#7a8288,#52575c 70%,#52575c);background-image:linear-gradient(#7a8288,#52575c 70%,#52575c);background-repeat:no-repeat;border-top:0;border-right:1px solid #2e3134;border-bottom:0;border-left:1px solid #52575c;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff7a8288',endColorstr='#ff52575c',GradientType=0)}.pager li>a,.pager li>span{background-color:#3a3f44;background-image:-webkit-gradient(linear,0 0,0 100%,from(#52575c),color-stop(70%,#3a3f44),to(#3a3f44));background-image:-webkit-linear-gradient(#52575c,#3a3f44 70%,#3a3f44);background-image:-moz-linear-gradient(top,#52575c,#3a3f44 70%,#3a3f44);background-image:-o-linear-gradient(#52575c,#3a3f44 70%,#3a3f44);background-image:linear-gradient(#52575c,#3a3f44 70%,#3a3f44);background-repeat:no-repeat;border:1px solid transparent;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff52575c',endColorstr='#ff3a3f44',GradientType=0);-webkit-box-shadow:'0 1px 3px rgba(0, 0, 0, 0.25), inset 0 -1px 0 rgba(0, 0, 0, 0.1)';-moz-box-shadow:'0 1px 3px rgba(0, 0, 0, 0.25), inset 0 -1px 0 rgba(0, 0, 0, 0.1)';box-shadow:'0 1px 3px rgba(0, 0, 0, 0.25), inset 0 -1px 0 rgba(0, 0, 0, 0.1)'}.pager li>a:hover,.pager li>span:hover{background-color:#3a3f44;background-image:-moz-linear-gradient(280deg,#272b30,#3a3f44);background-image:-webkit-linear-gradient(280deg,#272b30,#3a3f44);background-image:-o-linear-gradient(280deg,#272b30,#3a3f44);background-image:linear-gradient(280deg,#272b30,#3a3f44);background-repeat:repeat-x;border:1px solid transparent}.pager .disabled a,.pager .disabled a:hover{background-color:transparent}.btn{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#484d51;*background-color:#3a3e41;background-image:-moz-linear-gradient(top,#52575c,#3a3e41);background-image:-webkit-gradient(linear,0 0,0 100%,from(#52575c),to(#3a3e41));background-image:-webkit-linear-gradient(top,#52575c,#3a3e41);background-image:-o-linear-gradient(top,#52575c,#3a3e41);background-image:linear-gradient(to bottom,#52575c,#3a3e41);background-repeat:repeat-x;border:1px solid #272b30;border-color:#3a3e41 #3a3e41 #161719;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff52575c',endColorstr='#ff3a3e41',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn:hover,.btn:focus,.btn:active,.btn.active,.btn.disabled,.btn[disabled]{color:#fff;background-color:#3a3e41;*background-color:#2e3134}.btn:active,.btn.active{background-color:#222426 \9}.btn,.btn:hover{font-weight:bold;color:#fff;text-shadow:-1px -1px 1px rgba(0,0,0,0.3)}.btn-primary{color:#fff;color:#3a3f44;text-shadow:0 -1px 0 rgba(0,0,0,0.25);text-shadow:1px 1px 1px rgba(255,255,255,0.3);background-color:#bbbec2;*background-color:#bbbdc2;background-image:-moz-linear-gradient(top,#bbbfc2,#bbbdc2);background-image:-webkit-gradient(linear,0 0,0 100%,from(#bbbfc2),to(#bbbdc2));background-image:-webkit-linear-gradient(top,#bbbfc2,#bbbdc2);background-image:-o-linear-gradient(top,#bbbfc2,#bbbdc2);background-image:linear-gradient(to bottom,#bbbfc2,#bbbdc2);background-repeat:repeat-x;border-color:#bbbdc2 #bbbdc2 #93959e;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='#ffbbbfc2',endColorstr='#ffbbbdc2',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:#fff;background-color:#bbbdc2;*background-color:#aeb0b6}.btn-primary:active,.btn-primary.active{background-color:#a0a2aa \9}.btn-warning{color:#fff;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:#fff;background-color:#f89406;*background-color:#df8505}.btn-warning:active,.btn-warning.active{background-color:#c67605 \9}.btn-danger{color:#fff;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:#fff;background-color:#bd362f;*background-color:#a9302a}.btn-danger:active,.btn-danger.active{background-color:#942a25 \9}.btn-success{color:#fff;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:#fff;background-color:#51a351;*background-color:#499249}.btn-success:active,.btn-success.active{background-color:#408140 \9}.btn-info{color:#fff;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:#fff;background-color:#2f96b4;*background-color:#2a85a0}.btn-info:active,.btn-info.active{background-color:#24748c \9}.btn-inverse{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#41454a;*background-color:#272b30;background-image:-moz-linear-gradient(top,#52575c,#272b30);background-image:-webkit-gradient(linear,0 0,0 100%,from(#52575c),to(#272b30));background-image:-webkit-linear-gradient(top,#52575c,#272b30);background-image:-o-linear-gradient(top,#52575c,#272b30);background-image:linear-gradient(to bottom,#52575c,#272b30);background-repeat:repeat-x;border-color:#272b30 #272b30 #050506;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='#ff52575c',endColorstr='#ff272b30',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:#fff;background-color:#272b30;*background-color:#1c1e22}.btn-inverse:active,.btn-inverse.active{background-color:#101214 \9}.caret{border-top-color:#fff}.table tbody tr.success td{background-color:#468847}.table tbody tr.error td{background-color:#b94a48}.table tbody tr.info td{background-color:#3a87ad}label,input,button,select,textarea,legend{color:#c8c8c8}legend,label{text-shadow:-1px -1px 0 rgba(0,0,0,0.3)}.input-prepend .add-on,.input-append .add-on{text-shadow:none;vertical-align:top;background-color:#52575c;border-top:1px solid #7a8288;border-right:1px solid #3a3f44;border-bottom:1px solid #3a3f44;border-left:1px solid #7a8288}.input-append .btn,.input-prepend .btn{padding:5px 14px;margin-top:-1px}.uneditable-input,input[disabled],select[disabled],textarea[disabled],input[readonly],select[readonly],textarea[readonly]{color:#bbbfc2}.form-actions{border-top:0}.dropdown-menu{-webkit-box-shadow:0 5px 5px rgba(0,0,0,0.2);-moz-box-shadow:0 5px 5px rgba(0,0,0,0.2);box-shadow:0 5px 5px rgba(0,0,0,0.2)}.dropdown.open .dropdown-toggle{color:#bbbfc2;background-color:#3a3f44}.dropdown-submenu>a::after{border-left-color:#fff}.label,.alert{color:rgba(255,255,255,0.9);text-shadow:-1px -1px 0 rgba(0,0,0,0.3);-webkit-box-shadow:1px 1px 1px rgba(0,0,0,0.3);-moz-box-shadow:1px 1px 1px rgba(0,0,0,0.3);box-shadow:1px 1px 1px rgba(0,0,0,0.3)}.alert{background-color:#f89406;border-color:#f89406}.alert .alert-heading{color:rgba(255,255,255,0.9);text-shadow:-1px -1px 0 rgba(0,0,0,0.4)}.alert-success{background-color:#468847;border-color:#468847}.alert-error{background-color:#b94a48;border-color:#b94a48}.alert-info{background-color:#3a87ad;border-color:#3a87ad}.well,.hero-unit{-webkit-box-shadow:inset 1px 1px 1px rgba(0,0,0,0.5);-moz-box-shadow:inset 1px 1px 1px rgba(0,0,0,0.5);box-shadow:inset 1px 1px 1px rgba(0,0,0,0.5)}.thumbnail,a.thumbnail:hover{border:1px solid #1c1e22}.progress{background-color:#202328;background-image:-moz-linear-gradient(top,#202328,#202328);background-image:-webkit-gradient(linear,0 0,0 100%,from(#202328),to(#202328));background-image:-webkit-linear-gradient(top,#202328,#202328);background-image:-o-linear-gradient(top,#202328,#202328);background-image:linear-gradient(to bottom,#202328,#202328);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff202328',endColorstr='#ff202328',GradientType=0);-webkit-box-shadow:inset 1px 1px 1px rgba(0,0,0,0.5);-moz-box-shadow:inset 1px 1px 1px rgba(0,0,0,0.5);box-shadow:inset 1px 1px 1px rgba(0,0,0,0.5)}.footer{border-top:1px solid #1c1e22}.footer p{color:#c8c8c8}.modal{background-color:#2e3236}.modal-header{border-bottom:0}.modal-body{border-bottom:1px solid #1c1e22}.modal-footer{background-color:#272b30;border-top:0;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}@media(max-width:979px){.navbar .brand{border-right:0}}@media(max-width:768px){div.subnav .nav>li+li>a{border-top:1px solid transparent}}.pull-right{float:right}.pull-left{float:left}.hide{display:none}.show{display:block}.invisible{visibility:hidden}.affix{position:fixed} \ No newline at end of file diff --git a/app/data/cart/users/1/557kx.json b/app/data/cart/users/1/557kx.json deleted file mode 100644 index 777a0bc..0000000 --- a/app/data/cart/users/1/557kx.json +++ /dev/null @@ -1 +0,0 @@ -{"name":"BackboneJS","description":"A JavaScript library with MVP.","author":"Jeremy Ashkenas","creationDate":"10/10/2013","size":"5","site":"http://backbonejs.org/","id":"557kx"} \ No newline at end of file diff --git a/app/data/cart/users/1/c8v0z.json b/app/data/cart/users/1/c8v0z.json deleted file mode 100644 index 26c4236..0000000 --- a/app/data/cart/users/1/c8v0z.json +++ /dev/null @@ -1 +0,0 @@ -{"name":"Ember","site":"http://emberjs.com/","description":"Ambitious web apps.","author":"Paul Cowan","creationDate":"01/01/2014","size":"1","id":"c8v0z"} \ No newline at end of file diff --git a/app/data/cart/users/1/cfrjh.json b/app/data/cart/users/1/cfrjh.json deleted file mode 100644 index a2a2ef5..0000000 --- a/app/data/cart/users/1/cfrjh.json +++ /dev/null @@ -1 +0,0 @@ -{"name":"Cappucino","site":"http://cappuccino.org/","description":"Objective-J.","author":"Cappuccino Core Team","creationDate":"12/01/2014","size":"2","id":"cfrjh"} \ No newline at end of file diff --git a/app/data/cart/users/1/dmz47.json b/app/data/cart/users/1/dmz47.json deleted file mode 100644 index d99a751..0000000 --- a/app/data/cart/users/1/dmz47.json +++ /dev/null @@ -1 +0,0 @@ -{"id":"dmz47","name":"AngularJS","description":"HTML enhanced for web apps!","site":"http://angularjs.org/","author":"Google Inc.","creationDate":"01/03/2001","size":"1"} \ No newline at end of file diff --git a/app/data/project/1abc3.json b/app/data/project/1abc3.json deleted file mode 100644 index ed3bca0..0000000 --- a/app/data/project/1abc3.json +++ /dev/null @@ -1 +0,0 @@ -{"id":"1abc3","name":"AngularJS","description":"HTML enhanced for web apps!","site":"http://angularjs.org/","author":"Google Inc.","creationDate":"01/03/2001","size":"1"} \ No newline at end of file diff --git a/app/data/project/2wrg6.json b/app/data/project/2wrg6.json deleted file mode 100644 index a3c2b96..0000000 --- a/app/data/project/2wrg6.json +++ /dev/null @@ -1 +0,0 @@ -{"name":"Ember","description":"Ambitious web apps.","author":"Yehuda Katz","site":"http://emberjs.com/","creationDate":"03/08/2011","size":"2","id":"2wrg6"} \ No newline at end of file diff --git a/app/data/project/h79t2.json b/app/data/project/h79t2.json deleted file mode 100644 index 14172e0..0000000 --- a/app/data/project/h79t2.json +++ /dev/null @@ -1 +0,0 @@ -{"name":"Batman","description":"JavaScript superhero","site":"http://batmanjs.org/","author":"Bhupal Lambodhar","creationDate":"01/05/1999","size":"4","id":"h79t2"} \ No newline at end of file diff --git a/app/data/project/k69nn.json b/app/data/project/k69nn.json deleted file mode 100644 index 2dbbb5f..0000000 --- a/app/data/project/k69nn.json +++ /dev/null @@ -1 +0,0 @@ -{"name":"Cappucino","description":"Objective-J.","site":"http://www.cappuccino-project.org/","author":"Community Developers","creationDate":"04/03/2000","size":"2","id":"k69nn"} \ No newline at end of file diff --git a/app/favicon.ico b/app/favicon.ico deleted file mode 100644 index 041b51e..0000000 Binary files a/app/favicon.ico and /dev/null differ diff --git a/app/img/__utm.gif b/app/img/__utm.gif deleted file mode 100644 index 07e48b8..0000000 Binary files a/app/img/__utm.gif and /dev/null differ diff --git a/app/img/ajax_loader_big.gif b/app/img/ajax_loader_big.gif deleted file mode 100644 index 739f648..0000000 Binary files a/app/img/ajax_loader_big.gif and /dev/null differ diff --git a/app/img/angularjs-logo.png b/app/img/angularjs-logo.png deleted file mode 100644 index dfb6a19..0000000 Binary files a/app/img/angularjs-logo.png and /dev/null differ diff --git a/app/img/avatar_background.png b/app/img/avatar_background.png deleted file mode 100644 index db4aafe..0000000 Binary files a/app/img/avatar_background.png and /dev/null differ diff --git a/app/img/avatar_background_full.png b/app/img/avatar_background_full.png deleted file mode 100644 index 8a7d59b..0000000 Binary files a/app/img/avatar_background_full.png and /dev/null differ diff --git a/app/img/bg-blue.jpg b/app/img/bg-blue.jpg deleted file mode 100644 index 5a67af5..0000000 Binary files a/app/img/bg-blue.jpg and /dev/null differ diff --git a/app/img/bg_booklet.png b/app/img/bg_booklet.png deleted file mode 100644 index 2962573..0000000 Binary files a/app/img/bg_booklet.png and /dev/null differ diff --git a/app/img/bg_bookpage_rt.png b/app/img/bg_bookpage_rt.png deleted file mode 100644 index 165df11..0000000 Binary files a/app/img/bg_bookpage_rt.png and /dev/null differ diff --git a/app/img/cart.png b/app/img/cart.png deleted file mode 100644 index bcdabda..0000000 Binary files a/app/img/cart.png and /dev/null differ diff --git a/app/img/chart.png b/app/img/chart.png deleted file mode 100644 index 94fd8dd..0000000 Binary files a/app/img/chart.png and /dev/null differ diff --git a/app/img/follow_icon.png b/app/img/follow_icon.png deleted file mode 100644 index 612f654..0000000 Binary files a/app/img/follow_icon.png and /dev/null differ diff --git a/app/img/glyphicons-halflings-white.png b/app/img/glyphicons-halflings-white.png deleted file mode 100644 index 3bf6484..0000000 Binary files a/app/img/glyphicons-halflings-white.png and /dev/null differ diff --git a/app/img/glyphicons-halflings.png b/app/img/glyphicons-halflings.png deleted file mode 100644 index a996999..0000000 Binary files a/app/img/glyphicons-halflings.png and /dev/null differ diff --git a/app/img/logo_small.png b/app/img/logo_small.png deleted file mode 100644 index 95833cb..0000000 Binary files a/app/img/logo_small.png and /dev/null differ diff --git a/app/img/profile.jpg b/app/img/profile.jpg deleted file mode 100644 index 83df89a..0000000 Binary files a/app/img/profile.jpg and /dev/null differ diff --git a/app/img/px.gif b/app/img/px.gif deleted file mode 100644 index 9884f47..0000000 Binary files a/app/img/px.gif and /dev/null differ diff --git a/app/img/scissor_icon.png b/app/img/scissor_icon.png deleted file mode 100644 index 3d29f1b..0000000 Binary files a/app/img/scissor_icon.png and /dev/null differ diff --git a/app/img/search.png b/app/img/search.png deleted file mode 100644 index 5edb568..0000000 Binary files a/app/img/search.png and /dev/null differ diff --git a/app/index.html b/app/index.html deleted file mode 100644 index 1254df0..0000000 --- a/app/index.html +++ /dev/null @@ -1,54 +0,0 @@ - - - - - Projects Application - - - - - -
- -
- - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/app/js/app.js b/app/js/app.js deleted file mode 100644 index f881f49..0000000 --- a/app/js/app.js +++ /dev/null @@ -1,37 +0,0 @@ -'use strict'; - -var projectsApp = angular.module('projectsApp', ['ngResource','ui.bootstrap', 'dx']) - .config(function ($routeProvider) { - $routeProvider.when('/newProject', - { - templateUrl:'templates/NewProject.html', - controller: 'NewProjectController' - }); - $routeProvider.when('/editProject/:projectId', - { - templateUrl:'templates/NewProject.html', - controller: 'EditProjectController' - }); - $routeProvider.when('/deleteProject/:projectId', - { - templateUrl:'templates/ProjectList.html', - controller: 'ProjectListController' - }); - $routeProvider.when('/projects', - { - templateUrl: 'templates/ProjectList.html', - controller: 'ProjectListController' - }); - $routeProvider.when('/cart', - { - templateUrl:'templates/ProjectsCart.html', - controller: 'ProjectsCartController' - }); - $routeProvider.when('/chart', - { - templateUrl:'templates/ProjectChart.html', - controller: 'ProjectChartController' - }); - $routeProvider.otherwise({redirectTo: '/projects'}); - }); - diff --git a/app/js/controllers/EditProjectController.js b/app/js/controllers/EditProjectController.js deleted file mode 100644 index db0ba39..0000000 --- a/app/js/controllers/EditProjectController.js +++ /dev/null @@ -1,32 +0,0 @@ -'use strict'; - -projectsApp.controller('EditProjectController', - function EditProjectController($scope, projectData, $location, $routeParams, $log) { - - $scope.project = {}; - $scope.editingProject = true; - - projectData.getProject($routeParams.projectId). - then(function(result){ - $scope.project = result; - $log.info(' success| project = ' + project); - }, function(status){ - $log.error('error status = ' + status); - }); - - $scope.saveProject = function (project, form) { - if(form.$valid) { - projectData.updateProject(project). - then(function(result){ - $log.info(' success| project = ' + result); - }, function(status){ - $log.error('error status = ' + status); - }); - $location.url('/projects'); - } - }; - $scope.cancelEdit = function () { - $location.url('/projects'); - }; - } -); \ No newline at end of file diff --git a/app/js/controllers/NewProjectController.js b/app/js/controllers/NewProjectController.js deleted file mode 100644 index f8fa0cc..0000000 --- a/app/js/controllers/NewProjectController.js +++ /dev/null @@ -1,23 +0,0 @@ -'use strict'; - -projectsApp.controller('NewProjectController', - function NewProjectController($scope, projectData, $location) { - - $scope.project = {}; - $scope.editingProject = false; - - $scope.saveProject = function (project, form) { - if(form.$valid) { - projectData.createProject(project); - $location.url('/projects'); - } - }; - - $scope.cancelEdit = function () { - $location.url('/projects'); - }; - - - } - -); \ No newline at end of file diff --git a/app/js/controllers/ProjectChartController.js b/app/js/controllers/ProjectChartController.js deleted file mode 100644 index efb6d55..0000000 --- a/app/js/controllers/ProjectChartController.js +++ /dev/null @@ -1,75 +0,0 @@ -'use strict'; - -projectsApp.controller('ProjectChartController', - function ProjectChartController($scope, $location) { - - $scope.chartOptions = { - - /* hard coding the data source at the moment - * -- In real time scenario we need to use inject the ProjectData service - * to this ProjectChartController and use the method getAllProjects() and - * transform the PROMISE object to PROJECTS data array.*/ - - dataSource : [{ - "id":"1abc3", - "name":"AngularJS", - "description":"HTML enhanced for web apps!", - "site":"http://angularjs.org/", - "author":"Google Inc.", - "creationDate":"01/03/2001","size":"1"}, - { - "name":"Cappucino", - "site":"http://cappuccino.org/", - "description":"Objective-J.", - "author":"Cappuccino Core Team", - "creationDate":"12/01/2014", - "size":"2", - "id":"lec5m"}, - { - "name":"BackboneJS", - "description":"A JavaScript library with MVP.", - "author":"Jeremy Ashkenas", - "creationDate":"10/10/2013", - "size":"5","site":"http://backbonejs.org/", - "id":"u54f1"}, - { - "name":"Ember", - "site":"http://emberjs.com/", - "description":"Ambitious web apps.", - "author":"Paul Cowan", - "creationDate":"01/01/2014", - "size":"1", - "id":"w3nwu"}], - title: "Javascript Libraries", - commonSeriesSettings: { - argumentField: "creationDate" - }, - series: [ - { valueField: "name", name: "javascript Library" } - ], - argumentAxis:{ - grid:{ - visible: true - } - }, - tooltip:{ - enabled: true - }, - legend: { - verticalAlignment: "bottom", - horizontalAlignment: "center" - }, - commonPaneSettings: { - border:{ - visible: true, - right: true - } - } - }; - - $scope.backToProjects = function(){ - $location.url('/projects'); - }; - } -); - diff --git a/app/js/controllers/ProjectListController.js b/app/js/controllers/ProjectListController.js deleted file mode 100644 index 1b079ed..0000000 --- a/app/js/controllers/ProjectListController.js +++ /dev/null @@ -1,154 +0,0 @@ -'use strict'; - -projectsApp.controller('ProjectListController', - function ProjectListController($scope, $location, projectData, cartData, $log) { - $scope.sorttype = 'Project Name'; - $scope.sortorder = "ASC"; - $scope.performsort = "name"; - $scope.reversesorting = false; - $scope.searchtype = 'Any'; - - - // booleans for controlling search input - $scope.searchAny = true; - $scope.searchName = false; - $scope.searchDesc = false; - $scope.searchAuthor = false; - $scope.searchCreationDate = false; - $scope.searchSize = false; - $scope.searchSite = false; - - $scope.setSortType = function(sortType){ - if(sortType === 'Project Name'){ - $scope.performsort = 'name'; - } else if(sortType === 'Description') { - $scope.performsort = 'description'; - } else if(sortType === 'Author') { - $scope.performsort = 'author'; - } else if(sortType === 'Creation Date') { - $scope.performsort = 'creationDate'; - } else if(sortType === 'File Size') { - $scope.performsort = 'size'; - } else if(sortType === 'Website') { - $scope.performsort = 'site'; - } - $scope.sorttype = sortType; - } - $scope.setSortOrder = function(sortOrder){ - if(sortOrder === 'ASC') { - $scope.reversesorting = false; - } else if(sortOrder === 'DESC') { - $scope.reversesorting = true; - } else if(sortOrder === 'NO') { - $scope.reversesorting = false; - } - $scope.sortorder = sortOrder; - } - - - $scope.setSearchType = function(searchBy) { - if(searchBy === 'Any'){ - $scope.searchAny = true; - $scope.searchName = false; - $scope.searchDesc = false; - $scope.searchAuthor = false; - $scope.searchCreationDate = false; - $scope.searchSize = false; - $scope.searchSite = false; - } else if(searchBy === 'Project Name'){ - $scope.searchAny = false; - $scope.searchName = true; - $scope.searchDesc = false; - $scope.searchAuthor = false; - $scope.searchCreationDate = false; - $scope.searchSize = false; - $scope.searchSite = false; - } else if(searchBy === 'Description') { - $scope.searchAny = false; - $scope.searchName = false; - $scope.searchDesc = true; - $scope.searchAuthor = false; - $scope.searchCreationDate = false; - $scope.searchSize = false; - $scope.searchSite = false; - } else if(searchBy === 'Author') { - $scope.searchAny = false; - $scope.searchName = false; - $scope.searchDesc = false; - $scope.searchAuthor = true; - $scope.searchCreationDate = false; - $scope.searchSize = false; - $scope.searchSite = false; - } else if(searchBy === 'Creation Date') { - $scope.searchAny = false; - $scope.searchName = false; - $scope.searchDesc = false; - $scope.searchAuthor = false; - $scope.searchCreationDate = true; - $scope.searchSize = false; - $scope.searchSite = false; - } else if(searchBy === 'File Size') { - $scope.searchAny = false; - $scope.searchName = false; - $scope.searchDesc = false; - $scope.searchAuthor = false; - $scope.searchCreationDate = false; - $scope.searchSize = true; - $scope.searchSite = false; - } else if(searchBy === 'Website') { - $scope.searchAny = false; - $scope.searchName = false; - $scope.searchDesc = false; - $scope.searchAuthor = false; - $scope.searchCreationDate = false; - $scope.searchSize = false; - $scope.searchSite = true; - } - $scope.searchtype = searchBy; - }; - - $scope.projects = projectData.getAllProjects(); - $scope.getAllProjects = function(){ - $scope.projects = projectData.getAllProjects(); - } - - $scope.deleteProject = function(projectId) { - projectData.remove(projectId). - then(function (result) { - console.log('SUCCESS', result); - }, function (reason) { - console.log('ERROR', reason); - } - ); - $location.url('/projects'); - }; - - $scope.items = cartData.getAllCartItems(); - - $scope.getAllCartItems = function(){ - $scope.items = cartData.getAllCartItems(); - } - - $scope.addToCart = function(item){ - console.log('item ='+item); - cartData.addItem(item, cartData.getAllCartItems()). - then(function(result){ - $scope.getAllCartItems(); - $log.info('SUCCESS', result); - },function(reason){ - console.log('ERROR', reason); - $log.error('ERROR', reason); - }); - $location.url('/projects1'); - }; - $scope.totalSize = function(){ - var total = 0; - angular.forEach($scope.items, function(item) { - total += parseInt(item.size); - }) - - return total; - }; - } -); - diff --git a/app/js/controllers/ProjectsCartController.js b/app/js/controllers/ProjectsCartController.js deleted file mode 100644 index 48b6151..0000000 --- a/app/js/controllers/ProjectsCartController.js +++ /dev/null @@ -1,49 +0,0 @@ - -'use strict'; - -projectsApp.controller('ProjectsCartController', - function ProjectsCartController($scope, cartData, $location, $routeParams, $log) { - - $scope.items = cartData.getAllCartItems(); - - $scope.removeItem = function(itemId) { - cartData.removeItem(itemId). - then(function (result) { - console.log('SUCCESS', result); - alert('SUCCESS'); - }, function (reason) { - console.log('ERROR', reason); - alert('ERROR'); - } - ); - $location.url('/cart'); - }; - - $scope.addItem = function (item){ - - cartData.addItem(item). - then(function (result) { - console.log('SUCCESS', result); - $log.info('SUCCESS', result); - }, function (reason) { - console.log('ERROR', reason); - $log.info('SUCCESS', reason); - }); - - }; - - $scope.totalSize = function(items) { - var total = 0; - angular.forEach(items, function(item) { - total += parseInt(item.size); - }) - return total; - }; - - $scope.backToProjects = function(){ - $location.url('/projects'); - }; - } - -); - diff --git a/app/js/directives.js b/app/js/directives.js deleted file mode 100644 index eb109ab..0000000 --- a/app/js/directives.js +++ /dev/null @@ -1,2 +0,0 @@ -'use strict'; - diff --git a/app/js/filters.js b/app/js/filters.js deleted file mode 100644 index ad9a93a..0000000 --- a/app/js/filters.js +++ /dev/null @@ -1 +0,0 @@ -'use strict'; diff --git a/app/js/services/CartData.js b/app/js/services/CartData.js deleted file mode 100644 index e474dfc..0000000 --- a/app/js/services/CartData.js +++ /dev/null @@ -1,66 +0,0 @@ -'use strict'; - -projectsApp.factory('cartData', function ($resource, $q, $log) { - var userId = 1; - var resource = $resource('/data/cart/users/1/' + ':id', {id: '@id'}), - randomString = function(length, chars) { - var result = ''; - for (var i = length; i > 0; --i) - result += chars[Math.round(Math.random() * (chars.length - 1))]; - return result; - }; - - var getCartItem = function (cartId) { - var deferred = $q.defer(); - resource.get({id: cartId}, - function(response){ - $log.info(response); - deferred.resolve(response); - }, - function(response){ - $log.error(response); - deferred.reject(response); - }); - return deferred.promise; - }; - var addItem = function (item) { - var deferred = $q.defer(); - item.id = randomString(5,"abcdefghijklmnopqrstuvwxyz0123456789"); - resource.save(item, - function(response){ - $log.info(response); - deferred.resolve(response); - }, - function(response){ - $log.error(response); - deferred.reject(response); - }); - return deferred.promise; - }; - var removeItem = function(itemId) { - var deferred = $q.defer(); - resource.remove({id: itemId}, - function(response){ - $log.info(response); - deferred.resolve(response); - }, - function(response){ - $log.error(response); - deferred.reject(response); - }); - return deferred.promise; - }; - var getAllCartItems = function(){ - return resource.query(); - }; - - - return { - getCartItem: getCartItem, - addItem: addItem, - removeItem: removeItem, - getAllCartItems: getAllCartItems - }; - - -}); \ No newline at end of file diff --git a/app/js/services/ProjectData.js b/app/js/services/ProjectData.js deleted file mode 100644 index 354916d..0000000 --- a/app/js/services/ProjectData.js +++ /dev/null @@ -1,75 +0,0 @@ -'use strict'; - -projectsApp.factory('projectData', function ($resource, $q, $log) { - var resource = $resource('/data/project/:id', {id: '@id'}), - randomString = function(length, chars) { - var result = ''; - for (var i = length; i > 0; --i) - result += chars[Math.round(Math.random() * (chars.length - 1))]; - return result; - }; - - - return { - getProject: function(projectId) { - var deferred = $q.defer(); - resource.get({id: projectId}, - function(project){ - $log.info(project); - deferred.resolve(project); - }, - function(response){ - $log.error(response); - deferred.reject(response); - }); - return deferred.promise; - }, - createProject: function(project) { - var deferred = $q.defer(); - project.id = randomString(5,"abcdefghijklmnopqrstuvwxyz0123456789"); - resource.save(project, - function(response){ - $log.info(project); - deferred.resolve(response); - }, - function(response){ - $log.error(response); - deferred.reject(response); - }); - return deferred.promise; - }, - updateProject: function(project) { - var deferred = $q.defer(); - resource.save(project, - function(response){ - $log.info(project); - deferred.resolve(response); - }, - function(response){ - $log.error(response); - deferred.reject(response); - }); - return deferred.promise; - }, - remove: function(projectId) { - var deferred = $q.defer(); - resource.remove({id: projectId}, - function(project){ - $log.info(project); - deferred.resolve(project); - }, - function(response){ - $log.error(response); - deferred.reject(response); - }); - return deferred.promise; - }, - getAllProjects: function(){ - return resource.query(); - } - }; -}); - - - - diff --git a/app/lib/angular/angular-cookies.js b/app/lib/angular/angular-cookies.js deleted file mode 100644 index fbf0acb..0000000 --- a/app/lib/angular/angular-cookies.js +++ /dev/null @@ -1,183 +0,0 @@ -/** - * @license AngularJS v1.0.5 - * (c) 2010-2012 Google, Inc. http://angularjs.org - * License: MIT - */ -(function(window, angular, undefined) { -'use strict'; - -/** - * @ngdoc overview - * @name ngCookies - */ - - -angular.module('ngCookies', ['ng']). - /** - * @ngdoc object - * @name ngCookies.$cookies - * @requires $browser - * - * @description - * Provides read/write access to browser's cookies. - * - * Only a simple Object is exposed and by adding or removing properties to/from - * this object, new cookies are created/deleted at the end of current $eval. - * - * @example - - - - - - */ - factory('$cookies', ['$rootScope', '$browser', function ($rootScope, $browser) { - var cookies = {}, - lastCookies = {}, - lastBrowserCookies, - runEval = false, - copy = angular.copy, - isUndefined = angular.isUndefined; - - //creates a poller fn that copies all cookies from the $browser to service & inits the service - $browser.addPollFn(function() { - var currentCookies = $browser.cookies(); - if (lastBrowserCookies != currentCookies) { //relies on browser.cookies() impl - lastBrowserCookies = currentCookies; - copy(currentCookies, lastCookies); - copy(currentCookies, cookies); - if (runEval) $rootScope.$apply(); - } - })(); - - runEval = true; - - //at the end of each eval, push cookies - //TODO: this should happen before the "delayed" watches fire, because if some cookies are not - // strings or browser refuses to store some cookies, we update the model in the push fn. - $rootScope.$watch(push); - - return cookies; - - - /** - * Pushes all the cookies from the service to the browser and verifies if all cookies were stored. - */ - function push() { - var name, - value, - browserCookies, - updated; - - //delete any cookies deleted in $cookies - for (name in lastCookies) { - if (isUndefined(cookies[name])) { - $browser.cookies(name, undefined); - } - } - - //update all cookies updated in $cookies - for(name in cookies) { - value = cookies[name]; - if (!angular.isString(value)) { - if (angular.isDefined(lastCookies[name])) { - cookies[name] = lastCookies[name]; - } else { - delete cookies[name]; - } - } else if (value !== lastCookies[name]) { - $browser.cookies(name, value); - updated = true; - } - } - - //verify what was actually stored - if (updated){ - updated = false; - browserCookies = $browser.cookies(); - - for (name in cookies) { - if (cookies[name] !== browserCookies[name]) { - //delete or reset all cookies that the browser dropped from $cookies - if (isUndefined(browserCookies[name])) { - delete cookies[name]; - } else { - cookies[name] = browserCookies[name]; - } - updated = true; - } - } - } - } - }]). - - - /** - * @ngdoc object - * @name ngCookies.$cookieStore - * @requires $cookies - * - * @description - * Provides a key-value (string-object) storage, that is backed by session cookies. - * Objects put or retrieved from this storage are automatically serialized or - * deserialized by angular's toJson/fromJson. - * @example - */ - factory('$cookieStore', ['$cookies', function($cookies) { - - return { - /** - * @ngdoc method - * @name ngCookies.$cookieStore#get - * @methodOf ngCookies.$cookieStore - * - * @description - * Returns the value of given cookie key - * - * @param {string} key Id to use for lookup. - * @returns {Object} Deserialized cookie value. - */ - get: function(key) { - return angular.fromJson($cookies[key]); - }, - - /** - * @ngdoc method - * @name ngCookies.$cookieStore#put - * @methodOf ngCookies.$cookieStore - * - * @description - * Sets a value for given cookie key - * - * @param {string} key Id for the `value`. - * @param {Object} value Value to be stored. - */ - put: function(key, value) { - $cookies[key] = angular.toJson(value); - }, - - /** - * @ngdoc method - * @name ngCookies.$cookieStore#remove - * @methodOf ngCookies.$cookieStore - * - * @description - * Remove given cookie - * - * @param {string} key Id of the key-value pair to delete. - */ - remove: function(key) { - delete $cookies[key]; - } - }; - - }]); - -})(window, window.angular); diff --git a/app/lib/angular/angular-cookies.min.js b/app/lib/angular/angular-cookies.min.js deleted file mode 100644 index bd82c75..0000000 --- a/app/lib/angular/angular-cookies.min.js +++ /dev/null @@ -1,7 +0,0 @@ -/* - AngularJS v1.0.5 - (c) 2010-2012 Google, Inc. http://angularjs.org - License: MIT -*/ -(function(m,f,l){'use strict';f.module("ngCookies",["ng"]).factory("$cookies",["$rootScope","$browser",function(d,c){var b={},g={},h,i=!1,j=f.copy,k=f.isUndefined;c.addPollFn(function(){var a=c.cookies();h!=a&&(h=a,j(a,g),j(a,b),i&&d.$apply())})();i=!0;d.$watch(function(){var a,e,d;for(a in g)k(b[a])&&c.cookies(a,l);for(a in b)e=b[a],f.isString(e)?e!==g[a]&&(c.cookies(a,e),d=!0):f.isDefined(g[a])?b[a]=g[a]:delete b[a];if(d)for(a in e=c.cookies(),b)b[a]!==e[a]&&(k(e[a])?delete b[a]:b[a]=e[a])});return b}]).factory("$cookieStore", -["$cookies",function(d){return{get:function(c){return f.fromJson(d[c])},put:function(c,b){d[c]=f.toJson(b)},remove:function(c){delete d[c]}}}])})(window,window.angular); diff --git a/app/lib/angular/angular-loader.js b/app/lib/angular/angular-loader.js deleted file mode 100644 index c4325dc..0000000 --- a/app/lib/angular/angular-loader.js +++ /dev/null @@ -1,276 +0,0 @@ -/** - * @license AngularJS v1.0.5 - * (c) 2010-2012 Google, Inc. http://angularjs.org - * License: MIT - */ - -( - -/** - * @ngdoc interface - * @name angular.Module - * @description - * - * Interface for configuring angular {@link angular.module modules}. - */ - -function setupModuleLoader(window) { - - function ensure(obj, name, factory) { - return obj[name] || (obj[name] = factory()); - } - - return ensure(ensure(window, 'angular', Object), 'module', function() { - /** @type {Object.} */ - var modules = {}; - - /** - * @ngdoc function - * @name angular.module - * @description - * - * The `angular.module` is a global place for creating and registering Angular modules. All - * modules (angular core or 3rd party) that should be available to an application must be - * registered using this mechanism. - * - * - * # Module - * - * A module is a collocation of services, directives, filters, and configuration information. Module - * is used to configure the {@link AUTO.$injector $injector}. - * - *
-     * // Create a new module
-     * var myModule = angular.module('myModule', []);
-     *
-     * // register a new service
-     * myModule.value('appName', 'MyCoolApp');
-     *
-     * // configure existing services inside initialization blocks.
-     * myModule.config(function($locationProvider) {
-'use strict';
-     *   // Configure existing providers
-     *   $locationProvider.hashPrefix('!');
-     * });
-     * 
- * - * Then you can create an injector and load your modules like this: - * - *
-     * var injector = angular.injector(['ng', 'MyModule'])
-     * 
- * - * However it's more likely that you'll just use - * {@link ng.directive:ngApp ngApp} or - * {@link angular.bootstrap} to simplify this process for you. - * - * @param {!string} name The name of the module to create or retrieve. - * @param {Array.=} requires If specified then new module is being created. If unspecified then the - * the module is being retrieved for further configuration. - * @param {Function} configFn Optional configuration function for the module. Same as - * {@link angular.Module#config Module#config()}. - * @returns {module} new module with the {@link angular.Module} api. - */ - return function module(name, requires, configFn) { - if (requires && modules.hasOwnProperty(name)) { - modules[name] = null; - } - return ensure(modules, name, function() { - if (!requires) { - throw Error('No module: ' + name); - } - - /** @type {!Array.>} */ - var invokeQueue = []; - - /** @type {!Array.} */ - var runBlocks = []; - - var config = invokeLater('$injector', 'invoke'); - - /** @type {angular.Module} */ - var moduleInstance = { - // Private state - _invokeQueue: invokeQueue, - _runBlocks: runBlocks, - - /** - * @ngdoc property - * @name angular.Module#requires - * @propertyOf angular.Module - * @returns {Array.} List of module names which must be loaded before this module. - * @description - * Holds the list of modules which the injector will load before the current module is loaded. - */ - requires: requires, - - /** - * @ngdoc property - * @name angular.Module#name - * @propertyOf angular.Module - * @returns {string} Name of the module. - * @description - */ - name: name, - - - /** - * @ngdoc method - * @name angular.Module#provider - * @methodOf angular.Module - * @param {string} name service name - * @param {Function} providerType Construction function for creating new instance of the service. - * @description - * See {@link AUTO.$provide#provider $provide.provider()}. - */ - provider: invokeLater('$provide', 'provider'), - - /** - * @ngdoc method - * @name angular.Module#factory - * @methodOf angular.Module - * @param {string} name service name - * @param {Function} providerFunction Function for creating new instance of the service. - * @description - * See {@link AUTO.$provide#factory $provide.factory()}. - */ - factory: invokeLater('$provide', 'factory'), - - /** - * @ngdoc method - * @name angular.Module#service - * @methodOf angular.Module - * @param {string} name service name - * @param {Function} constructor A constructor function that will be instantiated. - * @description - * See {@link AUTO.$provide#service $provide.service()}. - */ - service: invokeLater('$provide', 'service'), - - /** - * @ngdoc method - * @name angular.Module#value - * @methodOf angular.Module - * @param {string} name service name - * @param {*} object Service instance object. - * @description - * See {@link AUTO.$provide#value $provide.value()}. - */ - value: invokeLater('$provide', 'value'), - - /** - * @ngdoc method - * @name angular.Module#constant - * @methodOf angular.Module - * @param {string} name constant name - * @param {*} object Constant value. - * @description - * Because the constant are fixed, they get applied before other provide methods. - * See {@link AUTO.$provide#constant $provide.constant()}. - */ - constant: invokeLater('$provide', 'constant', 'unshift'), - - /** - * @ngdoc method - * @name angular.Module#filter - * @methodOf angular.Module - * @param {string} name Filter name. - * @param {Function} filterFactory Factory function for creating new instance of filter. - * @description - * See {@link ng.$filterProvider#register $filterProvider.register()}. - */ - filter: invokeLater('$filterProvider', 'register'), - - /** - * @ngdoc method - * @name angular.Module#controller - * @methodOf angular.Module - * @param {string} name Controller name. - * @param {Function} constructor Controller constructor function. - * @description - * See {@link ng.$controllerProvider#register $controllerProvider.register()}. - */ - controller: invokeLater('$controllerProvider', 'register'), - - /** - * @ngdoc method - * @name angular.Module#directive - * @methodOf angular.Module - * @param {string} name directive name - * @param {Function} directiveFactory Factory function for creating new instance of - * directives. - * @description - * See {@link ng.$compileProvider#directive $compileProvider.directive()}. - */ - directive: invokeLater('$compileProvider', 'directive'), - - /** - * @ngdoc method - * @name angular.Module#config - * @methodOf angular.Module - * @param {Function} configFn Execute this function on module load. Useful for service - * configuration. - * @description - * Use this method to register work which needs to be performed on module loading. - */ - config: config, - - /** - * @ngdoc method - * @name angular.Module#run - * @methodOf angular.Module - * @param {Function} initializationFn Execute this function after injector creation. - * Useful for application initialization. - * @description - * Use this method to register work which should be performed when the injector is done - * loading all modules. - */ - run: function(block) { - runBlocks.push(block); - return this; - } - }; - - if (configFn) { - config(configFn); - } - - return moduleInstance; - - /** - * @param {string} provider - * @param {string} method - * @param {String=} insertMethod - * @returns {angular.Module} - */ - function invokeLater(provider, method, insertMethod) { - return function() { - invokeQueue[insertMethod || 'push']([provider, method, arguments]); - return moduleInstance; - } - } - }); - }; - }); - -} -)(window); - -/** - * Closure compiler type information - * - * @typedef { { - * requires: !Array., - * invokeQueue: !Array.>, - * - * service: function(string, Function):angular.Module, - * factory: function(string, Function):angular.Module, - * value: function(string, *):angular.Module, - * - * filter: function(string, Function):angular.Module, - * - * init: function(Function):angular.Module - * } } - */ -angular.Module; - diff --git a/app/lib/angular/angular-loader.min.js b/app/lib/angular/angular-loader.min.js deleted file mode 100644 index a264fbe..0000000 --- a/app/lib/angular/angular-loader.min.js +++ /dev/null @@ -1,7 +0,0 @@ -/* - AngularJS v1.0.5 - (c) 2010-2012 Google, Inc. http://angularjs.org - License: MIT -*/ -(function(i){'use strict';function d(c,b,e){return c[b]||(c[b]=e())}return d(d(i,"angular",Object),"module",function(){var c={};return function(b,e,f){e&&c.hasOwnProperty(b)&&(c[b]=null);return d(c,b,function(){function a(a,b,d){return function(){c[d||"push"]([a,b,arguments]);return g}}if(!e)throw Error("No module: "+b);var c=[],d=[],h=a("$injector","invoke"),g={_invokeQueue:c,_runBlocks:d,requires:e,name:b,provider:a("$provide","provider"),factory:a("$provide","factory"),service:a("$provide","service"), -value:a("$provide","value"),constant:a("$provide","constant","unshift"),filter:a("$filterProvider","register"),controller:a("$controllerProvider","register"),directive:a("$compileProvider","directive"),config:h,run:function(a){d.push(a);return this}};f&&h(f);return g})}})})(window); diff --git a/app/lib/angular/angular-locale_es.js b/app/lib/angular/angular-locale_es.js deleted file mode 100644 index 5ba8e74..0000000 --- a/app/lib/angular/angular-locale_es.js +++ /dev/null @@ -1,4 +0,0 @@ -angular.module("ngLocale", [], ["$provide", function($provide) { -var PLURAL_CATEGORY = {ZERO: "zero", ONE: "one", TWO: "two", FEW: "few", MANY: "many", OTHER: "other"}; -$provide.value("$locale", {"DATETIME_FORMATS":{"MONTH":["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"],"SHORTMONTH":["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic"],"DAY":["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],"SHORTDAY":["dom","lun","mar","mié","jue","vie","sáb"],"AMPMS":["a.m.","p.m."],"medium":"dd/MM/yyyy HH:mm:ss","short":"dd/MM/yy HH:mm","fullDate":"EEEE d 'de' MMMM 'de' y","longDate":"d 'de' MMMM 'de' y","mediumDate":"dd/MM/yyyy","shortDate":"dd/MM/yy","mediumTime":"HH:mm:ss","shortTime":"HH:mm"},"NUMBER_FORMATS":{"DECIMAL_SEP":",","GROUP_SEP":".","PATTERNS":[{"minInt":1,"minFrac":0,"macFrac":0,"posPre":"","posSuf":"","negPre":"-","negSuf":"","gSize":3,"lgSize":3,"maxFrac":3},{"minInt":1,"minFrac":2,"macFrac":0,"posPre":"\u00A4 ","posSuf":"","negPre":"\u00A4 -","negSuf":"","gSize":3,"lgSize":3,"maxFrac":2}],"CURRENCY_SYM":"€"},"pluralCat":function (n) { if (n == 1) { return PLURAL_CATEGORY.ONE; } return PLURAL_CATEGORY.OTHER;},"id":"es"}); -}]); \ No newline at end of file diff --git a/app/lib/angular/angular-resource.js b/app/lib/angular/angular-resource.js deleted file mode 100644 index 975f1bc..0000000 --- a/app/lib/angular/angular-resource.js +++ /dev/null @@ -1,445 +0,0 @@ -/** - * @license AngularJS v1.0.5 - * (c) 2010-2012 Google, Inc. http://angularjs.org - * License: MIT - */ -(function(window, angular, undefined) { -'use strict'; - -/** - * @ngdoc overview - * @name ngResource - * @description - */ - -/** - * @ngdoc object - * @name ngResource.$resource - * @requires $http - * - * @description - * A factory which creates a resource object that lets you interact with - * [RESTful](http://en.wikipedia.org/wiki/Representational_State_Transfer) server-side data sources. - * - * The returned resource object has action methods which provide high-level behaviors without - * the need to interact with the low level {@link ng.$http $http} service. - * - * @param {string} url A parameterized URL template with parameters prefixed by `:` as in - * `/users/:username`. If you are using a URL with a port number (e.g. - * `http://example.com:8080/api`), you'll need to escape the colon character before the port - * number, like this: `$resource('http://example.com\\:8080/api')`. - * - * @param {Object=} paramDefaults Default values for `url` parameters. These can be overridden in - * `actions` methods. - * - * Each key value in the parameter object is first bound to url template if present and then any - * excess keys are appended to the url search query after the `?`. - * - * Given a template `/path/:verb` and parameter `{verb:'greet', salutation:'Hello'}` results in - * URL `/path/greet?salutation=Hello`. - * - * If the parameter value is prefixed with `@` then the value of that parameter is extracted from - * the data object (useful for non-GET operations). - * - * @param {Object.=} actions Hash with declaration of custom action that should extend the - * default set of resource actions. The declaration should be created in the following format: - * - * {action1: {method:?, params:?, isArray:?}, - * action2: {method:?, params:?, isArray:?}, - * ...} - * - * Where: - * - * - `action` – {string} – The name of action. This name becomes the name of the method on your - * resource object. - * - `method` – {string} – HTTP request method. Valid methods are: `GET`, `POST`, `PUT`, `DELETE`, - * and `JSONP` - * - `params` – {object=} – Optional set of pre-bound parameters for this action. - * - isArray – {boolean=} – If true then the returned object for this action is an array, see - * `returns` section. - * - * @returns {Object} A resource "class" object with methods for the default set of resource actions - * optionally extended with custom `actions`. The default set contains these actions: - * - * { 'get': {method:'GET'}, - * 'save': {method:'POST'}, - * 'query': {method:'GET', isArray:true}, - * 'remove': {method:'DELETE'}, - * 'delete': {method:'DELETE'} }; - * - * Calling these methods invoke an {@link ng.$http} with the specified http method, - * destination and parameters. When the data is returned from the server then the object is an - * instance of the resource class. The actions `save`, `remove` and `delete` are available on it - * as methods with the `$` prefix. This allows you to easily perform CRUD operations (create, - * read, update, delete) on server-side data like this: - *
-        var User = $resource('/users/:userId', {userId:'@id'});
-        var users = User.get({userId:123}, function() {
-          users.abc = true;
-          users.$save();
-        });
-     
- * - * It is important to realize that invoking a $resource object method immediately returns an - * empty reference (object or array depending on `isArray`). Once the data is returned from the - * server the existing reference is populated with the actual data. This is a useful trick since - * usually the resource is assigned to a model which is then rendered by the view. Having an empty - * object results in no rendering, once the data arrives from the server then the object is - * populated with the data and the view automatically re-renders itself showing the new data. This - * means that in most case one never has to write a callback function for the action methods. - * - * The action methods on the class object or instance object can be invoked with the following - * parameters: - * - * - HTTP GET "class" actions: `Resource.action([parameters], [success], [error])` - * - non-GET "class" actions: `Resource.action([parameters], postData, [success], [error])` - * - non-GET instance actions: `instance.$action([parameters], [success], [error])` - * - * - * @example - * - * # Credit card resource - * - *
-     // Define CreditCard class
-     var CreditCard = $resource('/users/:userId/card/:cardId',
-      {userId:123, cardId:'@id'}, {
-       charge: {method:'POST', params:{charge:true}}
-      });
-
-     // We can retrieve a collection from the server
-     var cards = CreditCard.query(function() {
-       // GET: /users/123/card
-       // server returns: [ {id:456, number:'1234', name:'Smith'} ];
-
-       var card = cards[0];
-       // each item is an instance of CreditCard
-       expect(card instanceof CreditCard).toEqual(true);
-       card.name = "J. Smith";
-       // non GET methods are mapped onto the instances
-       card.$save();
-       // POST: /users/123/card/456 {id:456, number:'1234', name:'J. Smith'}
-       // server returns: {id:456, number:'1234', name: 'J. Smith'};
-
-       // our custom method is mapped as well.
-       card.$charge({amount:9.99});
-       // POST: /users/123/card/456?amount=9.99&charge=true {id:456, number:'1234', name:'J. Smith'}
-     });
-
-     // we can create an instance as well
-     var newCard = new CreditCard({number:'0123'});
-     newCard.name = "Mike Smith";
-     newCard.$save();
-     // POST: /users/123/card {number:'0123', name:'Mike Smith'}
-     // server returns: {id:789, number:'01234', name: 'Mike Smith'};
-     expect(newCard.id).toEqual(789);
- * 
- * - * The object returned from this function execution is a resource "class" which has "static" method - * for each action in the definition. - * - * Calling these methods invoke `$http` on the `url` template with the given `method` and `params`. - * When the data is returned from the server then the object is an instance of the resource type and - * all of the non-GET methods are available with `$` prefix. This allows you to easily support CRUD - * operations (create, read, update, delete) on server-side data. - -
-     var User = $resource('/users/:userId', {userId:'@id'});
-     var users = User.get({userId:123}, function() {
-       users.abc = true;
-       users.$save();
-     });
-   
- * - * It's worth noting that the success callback for `get`, `query` and other method gets passed - * in the response that came from the server as well as $http header getter function, so one - * could rewrite the above example and get access to http headers as: - * -
-     var User = $resource('/users/:userId', {userId:'@id'});
-     User.get({userId:123}, function(u, getResponseHeaders){
-       u.abc = true;
-       u.$save(function(u, putResponseHeaders) {
-         //u => saved users object
-         //putResponseHeaders => $http header getter
-       });
-     });
-   
- - * # Buzz client - - Let's look at what a buzz client created with the `$resource` service looks like: - - - - -
- - -
-
-

- - {{item.actor.name}} - Expand replies: {{item.links.replies[0].count}} -

- {{item.object.content | html}} -
- - {{reply.actor.name}}: {{reply.content | html}} -
-
-
-
- - -
- */ -angular.module('ngResource', ['ng']). - factory('$resource', ['$http', '$parse', function($http, $parse) { - var DEFAULT_ACTIONS = { - 'get': {method:'GET'}, - 'save': {method:'POST'}, - 'query': {method:'GET', isArray:true}, - 'remove': {method:'DELETE'}, - 'delete': {method:'DELETE'} - }; - var noop = angular.noop, - forEach = angular.forEach, - extend = angular.extend, - copy = angular.copy, - isFunction = angular.isFunction, - getter = function(obj, path) { - return $parse(path)(obj); - }; - - /** - * We need our custom method because encodeURIComponent is too aggressive and doesn't follow - * http://www.ietf.org/rfc/rfc3986.txt with regards to the character set (pchar) allowed in path - * segments: - * segment = *pchar - * pchar = unreserved / pct-encoded / sub-delims / ":" / "@" - * pct-encoded = "%" HEXDIG HEXDIG - * unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~" - * sub-delims = "!" / "$" / "&" / "'" / "(" / ")" - * / "*" / "+" / "," / ";" / "=" - */ - function encodeUriSegment(val) { - return encodeUriQuery(val, true). - replace(/%26/gi, '&'). - replace(/%3D/gi, '='). - replace(/%2B/gi, '+'); - } - - - /** - * This method is intended for encoding *key* or *value* parts of query component. We need a custom - * method becuase encodeURIComponent is too agressive and encodes stuff that doesn't have to be - * encoded per http://tools.ietf.org/html/rfc3986: - * query = *( pchar / "/" / "?" ) - * pchar = unreserved / pct-encoded / sub-delims / ":" / "@" - * unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~" - * pct-encoded = "%" HEXDIG HEXDIG - * sub-delims = "!" / "$" / "&" / "'" / "(" / ")" - * / "*" / "+" / "," / ";" / "=" - */ - function encodeUriQuery(val, pctEncodeSpaces) { - return encodeURIComponent(val). - replace(/%40/gi, '@'). - replace(/%3A/gi, ':'). - replace(/%24/g, '$'). - replace(/%2C/gi, ','). - replace((pctEncodeSpaces ? null : /%20/g), '+'); - } - - function Route(template, defaults) { - this.template = template = template + '#'; - this.defaults = defaults || {}; - var urlParams = this.urlParams = {}; - forEach(template.split(/\W/), function(param){ - if (param && (new RegExp("(^|[^\\\\]):" + param + "\\W").test(template))) { - urlParams[param] = true; - } - }); - this.template = template.replace(/\\:/g, ':'); - } - - Route.prototype = { - url: function(params) { - var self = this, - url = this.template, - val, - encodedVal; - - params = params || {}; - forEach(this.urlParams, function(_, urlParam){ - val = params.hasOwnProperty(urlParam) ? params[urlParam] : self.defaults[urlParam]; - if (angular.isDefined(val) && val !== null) { - encodedVal = encodeUriSegment(val); - url = url.replace(new RegExp(":" + urlParam + "(\\W)", "g"), encodedVal + "$1"); - } else { - url = url.replace(new RegExp("(\/?):" + urlParam + "(\\W)", "g"), function(match, - leadingSlashes, tail) { - if (tail.charAt(0) == '/') { - return tail; - } else { - return leadingSlashes + tail; - } - }); - } - }); - url = url.replace(/\/?#$/, ''); - var query = []; - forEach(params, function(value, key){ - if (!self.urlParams[key]) { - query.push(encodeUriQuery(key) + '=' + encodeUriQuery(value)); - } - }); - query.sort(); - url = url.replace(/\/*$/, ''); - return url + (query.length ? '?' + query.join('&') : ''); - } - }; - - - function ResourceFactory(url, paramDefaults, actions) { - var route = new Route(url); - - actions = extend({}, DEFAULT_ACTIONS, actions); - - function extractParams(data, actionParams){ - var ids = {}; - actionParams = extend({}, paramDefaults, actionParams); - forEach(actionParams, function(value, key){ - ids[key] = value.charAt && value.charAt(0) == '@' ? getter(data, value.substr(1)) : value; - }); - return ids; - } - - function Resource(value){ - copy(value || {}, this); - } - - forEach(actions, function(action, name) { - action.method = angular.uppercase(action.method); - var hasBody = action.method == 'POST' || action.method == 'PUT' || action.method == 'PATCH'; - Resource[name] = function(a1, a2, a3, a4) { - var params = {}; - var data; - var success = noop; - var error = null; - switch(arguments.length) { - case 4: - error = a4; - success = a3; - //fallthrough - case 3: - case 2: - if (isFunction(a2)) { - if (isFunction(a1)) { - success = a1; - error = a2; - break; - } - - success = a2; - error = a3; - //fallthrough - } else { - params = a1; - data = a2; - success = a3; - break; - } - case 1: - if (isFunction(a1)) success = a1; - else if (hasBody) data = a1; - else params = a1; - break; - case 0: break; - default: - throw "Expected between 0-4 arguments [params, data, success, error], got " + - arguments.length + " arguments."; - } - - var value = this instanceof Resource ? this : (action.isArray ? [] : new Resource(data)); - $http({ - method: action.method, - url: route.url(extend({}, extractParams(data, action.params || {}), params)), - data: data - }).then(function(response) { - var data = response.data; - - if (data) { - if (action.isArray) { - value.length = 0; - forEach(data, function(item) { - value.push(new Resource(item)); - }); - } else { - copy(data, value); - } - } - (success||noop)(value, response.headers); - }, error); - - return value; - }; - - - Resource.prototype['$' + name] = function(a1, a2, a3) { - var params = extractParams(this), - success = noop, - error; - - switch(arguments.length) { - case 3: params = a1; success = a2; error = a3; break; - case 2: - case 1: - if (isFunction(a1)) { - success = a1; - error = a2; - } else { - params = a1; - success = a2 || noop; - } - case 0: break; - default: - throw "Expected between 1-3 arguments [params, success, error], got " + - arguments.length + " arguments."; - } - var data = hasBody ? this : undefined; - Resource[name].call(this, params, data, success, error); - }; - }); - - Resource.bind = function(additionalParamDefaults){ - return ResourceFactory(url, extend({}, paramDefaults, additionalParamDefaults), actions); - }; - - return Resource; - } - - return ResourceFactory; - }]); - -})(window, window.angular); diff --git a/app/lib/angular/angular-resource.min.js b/app/lib/angular/angular-resource.min.js deleted file mode 100644 index f37559c..0000000 --- a/app/lib/angular/angular-resource.min.js +++ /dev/null @@ -1,10 +0,0 @@ -/* - AngularJS v1.0.5 - (c) 2010-2012 Google, Inc. http://angularjs.org - License: MIT -*/ -(function(C,d,w){'use strict';d.module("ngResource",["ng"]).factory("$resource",["$http","$parse",function(x,y){function s(b,e){return encodeURIComponent(b).replace(/%40/gi,"@").replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(e?null:/%20/g,"+")}function t(b,e){this.template=b+="#";this.defaults=e||{};var a=this.urlParams={};h(b.split(/\W/),function(f){f&&RegExp("(^|[^\\\\]):"+f+"\\W").test(b)&&(a[f]=!0)});this.template=b.replace(/\\:/g,":")}function u(b,e,a){function f(m,a){var b= -{},a=o({},e,a);h(a,function(a,z){var c;a.charAt&&a.charAt(0)=="@"?(c=a.substr(1),c=y(c)(m)):c=a;b[z]=c});return b}function g(a){v(a||{},this)}var k=new t(b),a=o({},A,a);h(a,function(a,b){a.method=d.uppercase(a.method);var e=a.method=="POST"||a.method=="PUT"||a.method=="PATCH";g[b]=function(b,c,d,B){var j={},i,l=p,q=null;switch(arguments.length){case 4:q=B,l=d;case 3:case 2:if(r(c)){if(r(b)){l=b;q=c;break}l=c;q=d}else{j=b;i=c;l=d;break}case 1:r(b)?l=b:e?i=b:j=b;break;case 0:break;default:throw"Expected between 0-4 arguments [params, data, success, error], got "+ -arguments.length+" arguments.";}var n=this instanceof g?this:a.isArray?[]:new g(i);x({method:a.method,url:k.url(o({},f(i,a.params||{}),j)),data:i}).then(function(b){var c=b.data;if(c)a.isArray?(n.length=0,h(c,function(a){n.push(new g(a))})):v(c,n);(l||p)(n,b.headers)},q);return n};g.prototype["$"+b]=function(a,d,h){var m=f(this),j=p,i;switch(arguments.length){case 3:m=a;j=d;i=h;break;case 2:case 1:r(a)?(j=a,i=d):(m=a,j=d||p);case 0:break;default:throw"Expected between 1-3 arguments [params, success, error], got "+ -arguments.length+" arguments.";}g[b].call(this,m,e?this:w,j,i)}});g.bind=function(d){return u(b,o({},e,d),a)};return g}var A={get:{method:"GET"},save:{method:"POST"},query:{method:"GET",isArray:!0},remove:{method:"DELETE"},"delete":{method:"DELETE"}},p=d.noop,h=d.forEach,o=d.extend,v=d.copy,r=d.isFunction;t.prototype={url:function(b){var e=this,a=this.template,f,g,b=b||{};h(this.urlParams,function(h,c){f=b.hasOwnProperty(c)?b[c]:e.defaults[c];d.isDefined(f)&&f!==null?(g=s(f,!0).replace(/%26/gi,"&").replace(/%3D/gi, -"=").replace(/%2B/gi,"+"),a=a.replace(RegExp(":"+c+"(\\W)","g"),g+"$1")):a=a.replace(RegExp("(/?):"+c+"(\\W)","g"),function(a,b,c){return c.charAt(0)=="/"?c:b+c})});var a=a.replace(/\/?#$/,""),k=[];h(b,function(a,b){e.urlParams[b]||k.push(s(b)+"="+s(a))});k.sort();a=a.replace(/\/*$/,"");return a+(k.length?"?"+k.join("&"):"")}};return u}])})(window,window.angular); diff --git a/app/lib/angular/angular-sanitize.js b/app/lib/angular/angular-sanitize.js deleted file mode 100644 index 39e72bf..0000000 --- a/app/lib/angular/angular-sanitize.js +++ /dev/null @@ -1,535 +0,0 @@ -/** - * @license AngularJS v1.0.5 - * (c) 2010-2012 Google, Inc. http://angularjs.org - * License: MIT - */ -(function(window, angular, undefined) { -'use strict'; - -/** - * @ngdoc overview - * @name ngSanitize - * @description - */ - -/* - * HTML Parser By Misko Hevery (misko@hevery.com) - * based on: HTML Parser By John Resig (ejohn.org) - * Original code by Erik Arvidsson, Mozilla Public License - * http://erik.eae.net/simplehtmlparser/simplehtmlparser.js - * - * // Use like so: - * htmlParser(htmlString, { - * start: function(tag, attrs, unary) {}, - * end: function(tag) {}, - * chars: function(text) {}, - * comment: function(text) {} - * }); - * - */ - - -/** - * @ngdoc service - * @name ngSanitize.$sanitize - * @function - * - * @description - * The input is sanitized by parsing the html into tokens. All safe tokens (from a whitelist) are - * then serialized back to properly escaped html string. This means that no unsafe input can make - * it into the returned string, however, since our parser is more strict than a typical browser - * parser, it's possible that some obscure input, which would be recognized as valid HTML by a - * browser, won't make it through the sanitizer. - * - * @param {string} html Html input. - * @returns {string} Sanitized html. - * - * @example - - - -
- Snippet: - - - - - - - - - - - - - - - - - - - - - -
FilterSourceRendered
html filter -
<div ng-bind-html="snippet">
</div>
-
-
-
no filter
<div ng-bind="snippet">
</div>
unsafe html filter
<div ng-bind-html-unsafe="snippet">
</div>
-
-
- - it('should sanitize the html snippet ', function() { - expect(using('#html-filter').element('div').html()). - toBe('

an html\nclick here\nsnippet

'); - }); - - it('should escape snippet without any filter', function() { - expect(using('#escaped-html').element('div').html()). - toBe("<p style=\"color:blue\">an html\n" + - "<em onmouseover=\"this.textContent='PWN3D!'\">click here</em>\n" + - "snippet</p>"); - }); - - it('should inline raw snippet if filtered as unsafe', function() { - expect(using('#html-unsafe-filter').element("div").html()). - toBe("

an html\n" + - "click here\n" + - "snippet

"); - }); - - it('should update', function() { - input('snippet').enter('new text'); - expect(using('#html-filter').binding('snippet')).toBe('new text'); - expect(using('#escaped-html').element('div').html()).toBe("new <b>text</b>"); - expect(using('#html-unsafe-filter').binding("snippet")).toBe('new text'); - }); -
-
- */ -var $sanitize = function(html) { - var buf = []; - htmlParser(html, htmlSanitizeWriter(buf)); - return buf.join(''); -}; - - -// Regular Expressions for parsing tags and attributes -var START_TAG_REGEXP = /^<\s*([\w:-]+)((?:\s+[\w:-]+(?:\s*=\s*(?:(?:"[^"]*")|(?:'[^']*')|[^>\s]+))?)*)\s*(\/?)\s*>/, - END_TAG_REGEXP = /^<\s*\/\s*([\w:-]+)[^>]*>/, - ATTR_REGEXP = /([\w:-]+)(?:\s*=\s*(?:(?:"((?:[^"])*)")|(?:'((?:[^'])*)')|([^>\s]+)))?/g, - BEGIN_TAG_REGEXP = /^/g, - CDATA_REGEXP = //g, - URI_REGEXP = /^((ftp|https?):\/\/|mailto:|#)/, - NON_ALPHANUMERIC_REGEXP = /([^\#-~| |!])/g; // Match everything outside of normal chars and " (quote character) - - -// Good source of info about elements and attributes -// http://dev.w3.org/html5/spec/Overview.html#semantics -// http://simon.html5.org/html-elements - -// Safe Void Elements - HTML5 -// http://dev.w3.org/html5/spec/Overview.html#void-elements -var voidElements = makeMap("area,br,col,hr,img,wbr"); - -// Elements that you can, intentionally, leave open (and which close themselves) -// http://dev.w3.org/html5/spec/Overview.html#optional-tags -var optionalEndTagBlockElements = makeMap("colgroup,dd,dt,li,p,tbody,td,tfoot,th,thead,tr"), - optionalEndTagInlineElements = makeMap("rp,rt"), - optionalEndTagElements = angular.extend({}, optionalEndTagInlineElements, optionalEndTagBlockElements); - -// Safe Block Elements - HTML5 -var blockElements = angular.extend({}, optionalEndTagBlockElements, makeMap("address,article,aside," + - "blockquote,caption,center,del,dir,div,dl,figure,figcaption,footer,h1,h2,h3,h4,h5,h6," + - "header,hgroup,hr,ins,map,menu,nav,ol,pre,script,section,table,ul")); - -// Inline Elements - HTML5 -var inlineElements = angular.extend({}, optionalEndTagInlineElements, makeMap("a,abbr,acronym,b,bdi,bdo," + - "big,br,cite,code,del,dfn,em,font,i,img,ins,kbd,label,map,mark,q,ruby,rp,rt,s,samp,small," + - "span,strike,strong,sub,sup,time,tt,u,var")); - - -// Special Elements (can contain anything) -var specialElements = makeMap("script,style"); - -var validElements = angular.extend({}, voidElements, blockElements, inlineElements, optionalEndTagElements); - -//Attributes that have href and hence need to be sanitized -var uriAttrs = makeMap("background,cite,href,longdesc,src,usemap"); -var validAttrs = angular.extend({}, uriAttrs, makeMap( - 'abbr,align,alt,axis,bgcolor,border,cellpadding,cellspacing,class,clear,'+ - 'color,cols,colspan,compact,coords,dir,face,headers,height,hreflang,hspace,'+ - 'ismap,lang,language,nohref,nowrap,rel,rev,rows,rowspan,rules,'+ - 'scope,scrolling,shape,span,start,summary,target,title,type,'+ - 'valign,value,vspace,width')); - -function makeMap(str) { - var obj = {}, items = str.split(','), i; - for (i = 0; i < items.length; i++) obj[items[i]] = true; - return obj; -} - - -/** - * @example - * htmlParser(htmlString, { - * start: function(tag, attrs, unary) {}, - * end: function(tag) {}, - * chars: function(text) {}, - * comment: function(text) {} - * }); - * - * @param {string} html string - * @param {object} handler - */ -function htmlParser( html, handler ) { - var index, chars, match, stack = [], last = html; - stack.last = function() { return stack[ stack.length - 1 ]; }; - - while ( html ) { - chars = true; - - // Make sure we're not in a script or style element - if ( !stack.last() || !specialElements[ stack.last() ] ) { - - // Comment - if ( html.indexOf(""); - - if ( index >= 0 ) { - if (handler.comment) handler.comment( html.substring( 4, index ) ); - html = html.substring( index + 3 ); - chars = false; - } - - // end tag - } else if ( BEGING_END_TAGE_REGEXP.test(html) ) { - match = html.match( END_TAG_REGEXP ); - - if ( match ) { - html = html.substring( match[0].length ); - match[0].replace( END_TAG_REGEXP, parseEndTag ); - chars = false; - } - - // start tag - } else if ( BEGIN_TAG_REGEXP.test(html) ) { - match = html.match( START_TAG_REGEXP ); - - if ( match ) { - html = html.substring( match[0].length ); - match[0].replace( START_TAG_REGEXP, parseStartTag ); - chars = false; - } - } - - if ( chars ) { - index = html.indexOf("<"); - - var text = index < 0 ? html : html.substring( 0, index ); - html = index < 0 ? "" : html.substring( index ); - - if (handler.chars) handler.chars( decodeEntities(text) ); - } - - } else { - html = html.replace(new RegExp("(.*)<\\s*\\/\\s*" + stack.last() + "[^>]*>", 'i'), function(all, text){ - text = text. - replace(COMMENT_REGEXP, "$1"). - replace(CDATA_REGEXP, "$1"); - - if (handler.chars) handler.chars( decodeEntities(text) ); - - return ""; - }); - - parseEndTag( "", stack.last() ); - } - - if ( html == last ) { - throw "Parse Error: " + html; - } - last = html; - } - - // Clean up any remaining tags - parseEndTag(); - - function parseStartTag( tag, tagName, rest, unary ) { - tagName = angular.lowercase(tagName); - if ( blockElements[ tagName ] ) { - while ( stack.last() && inlineElements[ stack.last() ] ) { - parseEndTag( "", stack.last() ); - } - } - - if ( optionalEndTagElements[ tagName ] && stack.last() == tagName ) { - parseEndTag( "", tagName ); - } - - unary = voidElements[ tagName ] || !!unary; - - if ( !unary ) - stack.push( tagName ); - - var attrs = {}; - - rest.replace(ATTR_REGEXP, function(match, name, doubleQuotedValue, singleQoutedValue, unqoutedValue) { - var value = doubleQuotedValue - || singleQoutedValue - || unqoutedValue - || ''; - - attrs[name] = decodeEntities(value); - }); - if (handler.start) handler.start( tagName, attrs, unary ); - } - - function parseEndTag( tag, tagName ) { - var pos = 0, i; - tagName = angular.lowercase(tagName); - if ( tagName ) - // Find the closest opened tag of the same type - for ( pos = stack.length - 1; pos >= 0; pos-- ) - if ( stack[ pos ] == tagName ) - break; - - if ( pos >= 0 ) { - // Close all the open elements, up the stack - for ( i = stack.length - 1; i >= pos; i-- ) - if (handler.end) handler.end( stack[ i ] ); - - // Remove the open elements from the stack - stack.length = pos; - } - } -} - -/** - * decodes all entities into regular string - * @param value - * @returns {string} A string with decoded entities. - */ -var hiddenPre=document.createElement("pre"); -function decodeEntities(value) { - hiddenPre.innerHTML=value.replace(//g, '>'); -} - -/** - * create an HTML/XML writer which writes to buffer - * @param {Array} buf use buf.jain('') to get out sanitized html string - * @returns {object} in the form of { - * start: function(tag, attrs, unary) {}, - * end: function(tag) {}, - * chars: function(text) {}, - * comment: function(text) {} - * } - */ -function htmlSanitizeWriter(buf){ - var ignore = false; - var out = angular.bind(buf, buf.push); - return { - start: function(tag, attrs, unary){ - tag = angular.lowercase(tag); - if (!ignore && specialElements[tag]) { - ignore = tag; - } - if (!ignore && validElements[tag] == true) { - out('<'); - out(tag); - angular.forEach(attrs, function(value, key){ - var lkey=angular.lowercase(key); - if (validAttrs[lkey]==true && (uriAttrs[lkey]!==true || value.match(URI_REGEXP))) { - out(' '); - out(key); - out('="'); - out(encodeEntities(value)); - out('"'); - } - }); - out(unary ? '/>' : '>'); - } - }, - end: function(tag){ - tag = angular.lowercase(tag); - if (!ignore && validElements[tag] == true) { - out(''); - } - if (tag == ignore) { - ignore = false; - } - }, - chars: function(chars){ - if (!ignore) { - out(encodeEntities(chars)); - } - } - }; -} - - -// define ngSanitize module and register $sanitize service -angular.module('ngSanitize', []).value('$sanitize', $sanitize); - -/** - * @ngdoc directive - * @name ngSanitize.directive:ngBindHtml - * - * @description - * Creates a binding that will sanitize the result of evaluating the `expression` with the - * {@link ngSanitize.$sanitize $sanitize} service and innerHTML the result into the current element. - * - * See {@link ngSanitize.$sanitize $sanitize} docs for examples. - * - * @element ANY - * @param {expression} ngBindHtml {@link guide/expression Expression} to evaluate. - */ -angular.module('ngSanitize').directive('ngBindHtml', ['$sanitize', function($sanitize) { - return function(scope, element, attr) { - element.addClass('ng-binding').data('$binding', attr.ngBindHtml); - scope.$watch(attr.ngBindHtml, function ngBindHtmlWatchAction(value) { - value = $sanitize(value); - element.html(value || ''); - }); - }; -}]); -/** - * @ngdoc filter - * @name ngSanitize.filter:linky - * @function - * - * @description - * Finds links in text input and turns them into html links. Supports http/https/ftp/mailto and - * plain email address links. - * - * @param {string} text Input text. - * @returns {string} Html-linkified text. - * - * @usage - - * - * @example - - - -
- Snippet: - - - - - - - - - - - - - - - - -
FilterSourceRendered
linky filter -
<div ng-bind-html="snippet | linky">
</div>
-
-
-
no filter
<div ng-bind="snippet">
</div>
- - - it('should linkify the snippet with urls', function() { - expect(using('#linky-filter').binding('snippet | linky')). - toBe('Pretty text with some links: ' + - 'http://angularjs.org/, ' + - 'us@somewhere.org, ' + - 'another@somewhere.org, ' + - 'and one more: ftp://127.0.0.1/.'); - }); - - it ('should not linkify snippet without the linky filter', function() { - expect(using('#escaped-html').binding('snippet')). - toBe("Pretty text with some links:\n" + - "http://angularjs.org/,\n" + - "mailto:us@somewhere.org,\n" + - "another@somewhere.org,\n" + - "and one more: ftp://127.0.0.1/."); - }); - - it('should update', function() { - input('snippet').enter('new http://link.'); - expect(using('#linky-filter').binding('snippet | linky')). - toBe('new http://link.'); - expect(using('#escaped-html').binding('snippet')).toBe('new http://link.'); - }); - - - */ -angular.module('ngSanitize').filter('linky', function() { - var LINKY_URL_REGEXP = /((ftp|https?):\/\/|(mailto:)?[A-Za-z0-9._%+-]+@)\S*[^\s\.\;\,\(\)\{\}\<\>]/, - MAILTO_REGEXP = /^mailto:/; - - return function(text) { - if (!text) return text; - var match; - var raw = text; - var html = []; - // TODO(vojta): use $sanitize instead - var writer = htmlSanitizeWriter(html); - var url; - var i; - while ((match = raw.match(LINKY_URL_REGEXP))) { - // We can not end in these as they are sometimes found at the end of the sentence - url = match[0]; - // if we did not match ftp/http/mailto then assume mailto - if (match[2] == match[3]) url = 'mailto:' + url; - i = match.index; - writer.chars(raw.substr(0, i)); - writer.start('a', {href:url}); - writer.chars(match[0].replace(MAILTO_REGEXP, '')); - writer.end('a'); - raw = raw.substring(i + match[0].length); - } - writer.chars(raw); - return html.join(''); - }; -}); - -})(window, window.angular); diff --git a/app/lib/angular/angular-sanitize.min.js b/app/lib/angular/angular-sanitize.min.js deleted file mode 100644 index 212a90a..0000000 --- a/app/lib/angular/angular-sanitize.min.js +++ /dev/null @@ -1,13 +0,0 @@ -/* - AngularJS v1.0.5 - (c) 2010-2012 Google, Inc. http://angularjs.org - License: MIT -*/ -(function(I,g){'use strict';function i(a){var d={},a=a.split(","),b;for(b=0;b=0;e--)if(f[e]==b)break;if(e>=0){for(c=f.length-1;c>=e;c--)d.end&&d.end(f[c]);f.length= -e}}var c,h,f=[],j=a;for(f.last=function(){return f[f.length-1]};a;){h=!0;if(!f.last()||!q[f.last()]){if(a.indexOf("<\!--")===0)c=a.indexOf("--\>"),c>=0&&(d.comment&&d.comment(a.substring(4,c)),a=a.substring(c+3),h=!1);else if(B.test(a)){if(c=a.match(r))a=a.substring(c[0].length),c[0].replace(r,e),h=!1}else if(C.test(a)&&(c=a.match(s)))a=a.substring(c[0].length),c[0].replace(s,b),h=!1;h&&(c=a.indexOf("<"),h=c<0?a:a.substring(0,c),a=c<0?"":a.substring(c),d.chars&&d.chars(k(h)))}else a=a.replace(RegExp("(.*)<\\s*\\/\\s*"+ -f.last()+"[^>]*>","i"),function(b,a){a=a.replace(D,"$1").replace(E,"$1");d.chars&&d.chars(k(a));return""}),e("",f.last());if(a==j)throw"Parse Error: "+a;j=a}e()}function k(a){l.innerHTML=a.replace(//g,">")}function u(a){var d=!1,b=g.bind(a,a.push);return{start:function(a,c,h){a=g.lowercase(a);!d&&q[a]&&(d=a);!d&&v[a]== -!0&&(b("<"),b(a),g.forEach(c,function(a,c){var e=g.lowercase(c);if(G[e]==!0&&(w[e]!==!0||a.match(H)))b(" "),b(c),b('="'),b(t(a)),b('"')}),b(h?"/>":">"))},end:function(a){a=g.lowercase(a);!d&&v[a]==!0&&(b(""));a==d&&(d=!1)},chars:function(a){d||b(t(a))}}}var s=/^<\s*([\w:-]+)((?:\s+[\w:-]+(?:\s*=\s*(?:(?:"[^"]*")|(?:'[^']*')|[^>\s]+))?)*)\s*(\/?)\s*>/,r=/^<\s*\/\s*([\w:-]+)[^>]*>/,A=/([\w:-]+)(?:\s*=\s*(?:(?:"((?:[^"])*)")|(?:'((?:[^'])*)')|([^>\s]+)))?/g,C=/^/g, -E=//g,H=/^((ftp|https?):\/\/|mailto:|#)/,F=/([^\#-~| |!])/g,p=i("area,br,col,hr,img,wbr"),x=i("colgroup,dd,dt,li,p,tbody,td,tfoot,th,thead,tr"),y=i("rp,rt"),o=g.extend({},y,x),m=g.extend({},x,i("address,article,aside,blockquote,caption,center,del,dir,div,dl,figure,figcaption,footer,h1,h2,h3,h4,h5,h6,header,hgroup,hr,ins,map,menu,nav,ol,pre,script,section,table,ul")),n=g.extend({},y,i("a,abbr,acronym,b,bdi,bdo,big,br,cite,code,del,dfn,em,font,i,img,ins,kbd,label,map,mark,q,ruby,rp,rt,s,samp,small,span,strike,strong,sub,sup,time,tt,u,var")), -q=i("script,style"),v=g.extend({},p,m,n,o),w=i("background,cite,href,longdesc,src,usemap"),G=g.extend({},w,i("abbr,align,alt,axis,bgcolor,border,cellpadding,cellspacing,class,clear,color,cols,colspan,compact,coords,dir,face,headers,height,hreflang,hspace,ismap,lang,language,nohref,nowrap,rel,rev,rows,rowspan,rules,scope,scrolling,shape,span,start,summary,target,title,type,valign,value,vspace,width")),l=document.createElement("pre");g.module("ngSanitize",[]).value("$sanitize",function(a){var d=[]; -z(a,u(d));return d.join("")});g.module("ngSanitize").directive("ngBindHtml",["$sanitize",function(a){return function(d,b,e){b.addClass("ng-binding").data("$binding",e.ngBindHtml);d.$watch(e.ngBindHtml,function(c){c=a(c);b.html(c||"")})}}]);g.module("ngSanitize").filter("linky",function(){var a=/((ftp|https?):\/\/|(mailto:)?[A-Za-z0-9._%+-]+@)\S*[^\s\.\;\,\(\)\{\}\<\>]/,d=/^mailto:/;return function(b){if(!b)return b;for(var e=b,c=[],h=u(c),f,g;b=e.match(a);)f=b[0],b[2]==b[3]&&(f="mailto:"+f),g=b.index, -h.chars(e.substr(0,g)),h.start("a",{href:f}),h.chars(b[0].replace(d,"")),h.end("a"),e=e.substring(g+b[0].length);h.chars(e);return c.join("")}})})(window,window.angular); diff --git a/app/lib/angular/angular.js b/app/lib/angular/angular.js deleted file mode 100644 index fe7f067..0000000 --- a/app/lib/angular/angular.js +++ /dev/null @@ -1,14733 +0,0 @@ -/** - * @license AngularJS v1.0.5 - * (c) 2010-2012 Google, Inc. http://angularjs.org - * License: MIT - */ -(function(window, document, undefined) { -'use strict'; - -//////////////////////////////////// - -/** - * @ngdoc function - * @name angular.lowercase - * @function - * - * @description Converts the specified string to lowercase. - * @param {string} string String to be converted to lowercase. - * @returns {string} Lowercased string. - */ -var lowercase = function(string){return isString(string) ? string.toLowerCase() : string;}; - - -/** - * @ngdoc function - * @name angular.uppercase - * @function - * - * @description Converts the specified string to uppercase. - * @param {string} string String to be converted to uppercase. - * @returns {string} Uppercased string. - */ -var uppercase = function(string){return isString(string) ? string.toUpperCase() : string;}; - - -var manualLowercase = function(s) { - return isString(s) - ? s.replace(/[A-Z]/g, function(ch) {return fromCharCode(ch.charCodeAt(0) | 32);}) - : s; -}; -var manualUppercase = function(s) { - return isString(s) - ? s.replace(/[a-z]/g, function(ch) {return fromCharCode(ch.charCodeAt(0) & ~32);}) - : s; -}; - - -// String#toLowerCase and String#toUpperCase don't produce correct results in browsers with Turkish -// locale, for this reason we need to detect this case and redefine lowercase/uppercase methods -// with correct but slower alternatives. -if ('i' !== 'I'.toLowerCase()) { - lowercase = manualLowercase; - uppercase = manualUppercase; -} - -function fromCharCode(code) {return String.fromCharCode(code);} - - -var /** holds major version number for IE or NaN for real browsers */ - msie = int((/msie (\d+)/.exec(lowercase(navigator.userAgent)) || [])[1]), - jqLite, // delay binding since jQuery could be loaded after us. - jQuery, // delay binding - slice = [].slice, - push = [].push, - toString = Object.prototype.toString, - - /** @name angular */ - angular = window.angular || (window.angular = {}), - angularModule, - nodeName_, - uid = ['0', '0', '0']; - -/** - * @ngdoc function - * @name angular.forEach - * @function - * - * @description - * Invokes the `iterator` function once for each item in `obj` collection, which can be either an - * object or an array. The `iterator` function is invoked with `iterator(value, key)`, where `value` - * is the value of an object property or an array element and `key` is the object property key or - * array element index. Specifying a `context` for the function is optional. - * - * Note: this function was previously known as `angular.foreach`. - * -
-     var values = {name: 'misko', gender: 'male'};
-     var log = [];
-     angular.forEach(values, function(value, key){
-       this.push(key + ': ' + value);
-     }, log);
-     expect(log).toEqual(['name: misko', 'gender:male']);
-   
- * - * @param {Object|Array} obj Object to iterate over. - * @param {Function} iterator Iterator function. - * @param {Object=} context Object to become context (`this`) for the iterator function. - * @returns {Object|Array} Reference to `obj`. - */ - - -/** - * @private - * @param {*} obj - * @return {boolean} Returns true if `obj` is an array or array-like object (NodeList, Arguments, ...) - */ -function isArrayLike(obj) { - if (!obj || (typeof obj.length !== 'number')) return false; - - // We have on object which has length property. Should we treat it as array? - if (typeof obj.hasOwnProperty != 'function' && - typeof obj.constructor != 'function') { - // This is here for IE8: it is a bogus object treat it as array; - return true; - } else { - return obj instanceof JQLite || // JQLite - (jQuery && obj instanceof jQuery) || // jQuery - toString.call(obj) !== '[object Object]' || // some browser native object - typeof obj.callee === 'function'; // arguments (on IE8 looks like regular obj) - } -} - - -function forEach(obj, iterator, context) { - var key; - if (obj) { - if (isFunction(obj)){ - for (key in obj) { - if (key != 'prototype' && key != 'length' && key != 'name' && obj.hasOwnProperty(key)) { - iterator.call(context, obj[key], key); - } - } - } else if (obj.forEach && obj.forEach !== forEach) { - obj.forEach(iterator, context); - } else if (isArrayLike(obj)) { - for (key = 0; key < obj.length; key++) - iterator.call(context, obj[key], key); - } else { - for (key in obj) { - if (obj.hasOwnProperty(key)) { - iterator.call(context, obj[key], key); - } - } - } - } - return obj; -} - -function sortedKeys(obj) { - var keys = []; - for (var key in obj) { - if (obj.hasOwnProperty(key)) { - keys.push(key); - } - } - return keys.sort(); -} - -function forEachSorted(obj, iterator, context) { - var keys = sortedKeys(obj); - for ( var i = 0; i < keys.length; i++) { - iterator.call(context, obj[keys[i]], keys[i]); - } - return keys; -} - - -/** - * when using forEach the params are value, key, but it is often useful to have key, value. - * @param {function(string, *)} iteratorFn - * @returns {function(*, string)} - */ -function reverseParams(iteratorFn) { - return function(value, key) { iteratorFn(key, value) }; -} - -/** - * A consistent way of creating unique IDs in angular. The ID is a sequence of alpha numeric - * characters such as '012ABC'. The reason why we are not using simply a number counter is that - * the number string gets longer over time, and it can also overflow, where as the nextId - * will grow much slower, it is a string, and it will never overflow. - * - * @returns an unique alpha-numeric string - */ -function nextUid() { - var index = uid.length; - var digit; - - while(index) { - index--; - digit = uid[index].charCodeAt(0); - if (digit == 57 /*'9'*/) { - uid[index] = 'A'; - return uid.join(''); - } - if (digit == 90 /*'Z'*/) { - uid[index] = '0'; - } else { - uid[index] = String.fromCharCode(digit + 1); - return uid.join(''); - } - } - uid.unshift('0'); - return uid.join(''); -} - -/** - * @ngdoc function - * @name angular.extend - * @function - * - * @description - * Extends the destination object `dst` by copying all of the properties from the `src` object(s) - * to `dst`. You can specify multiple `src` objects. - * - * @param {Object} dst Destination object. - * @param {...Object} src Source object(s). - */ -function extend(dst) { - forEach(arguments, function(obj){ - if (obj !== dst) { - forEach(obj, function(value, key){ - dst[key] = value; - }); - } - }); - return dst; -} - -function int(str) { - return parseInt(str, 10); -} - - -function inherit(parent, extra) { - return extend(new (extend(function() {}, {prototype:parent}))(), extra); -} - - -/** - * @ngdoc function - * @name angular.noop - * @function - * - * @description - * A function that performs no operations. This function can be useful when writing code in the - * functional style. -
-     function foo(callback) {
-       var result = calculateResult();
-       (callback || angular.noop)(result);
-     }
-   
- */ -function noop() {} -noop.$inject = []; - - -/** - * @ngdoc function - * @name angular.identity - * @function - * - * @description - * A function that returns its first argument. This function is useful when writing code in the - * functional style. - * -
-     function transformer(transformationFn, value) {
-       return (transformationFn || identity)(value);
-     };
-   
- */ -function identity($) {return $;} -identity.$inject = []; - - -function valueFn(value) {return function() {return value;};} - -/** - * @ngdoc function - * @name angular.isUndefined - * @function - * - * @description - * Determines if a reference is undefined. - * - * @param {*} value Reference to check. - * @returns {boolean} True if `value` is undefined. - */ -function isUndefined(value){return typeof value == 'undefined';} - - -/** - * @ngdoc function - * @name angular.isDefined - * @function - * - * @description - * Determines if a reference is defined. - * - * @param {*} value Reference to check. - * @returns {boolean} True if `value` is defined. - */ -function isDefined(value){return typeof value != 'undefined';} - - -/** - * @ngdoc function - * @name angular.isObject - * @function - * - * @description - * Determines if a reference is an `Object`. Unlike `typeof` in JavaScript, `null`s are not - * considered to be objects. - * - * @param {*} value Reference to check. - * @returns {boolean} True if `value` is an `Object` but not `null`. - */ -function isObject(value){return value != null && typeof value == 'object';} - - -/** - * @ngdoc function - * @name angular.isString - * @function - * - * @description - * Determines if a reference is a `String`. - * - * @param {*} value Reference to check. - * @returns {boolean} True if `value` is a `String`. - */ -function isString(value){return typeof value == 'string';} - - -/** - * @ngdoc function - * @name angular.isNumber - * @function - * - * @description - * Determines if a reference is a `Number`. - * - * @param {*} value Reference to check. - * @returns {boolean} True if `value` is a `Number`. - */ -function isNumber(value){return typeof value == 'number';} - - -/** - * @ngdoc function - * @name angular.isDate - * @function - * - * @description - * Determines if a value is a date. - * - * @param {*} value Reference to check. - * @returns {boolean} True if `value` is a `Date`. - */ -function isDate(value){ - return toString.apply(value) == '[object Date]'; -} - - -/** - * @ngdoc function - * @name angular.isArray - * @function - * - * @description - * Determines if a reference is an `Array`. - * - * @param {*} value Reference to check. - * @returns {boolean} True if `value` is an `Array`. - */ -function isArray(value) { - return toString.apply(value) == '[object Array]'; -} - - -/** - * @ngdoc function - * @name angular.isFunction - * @function - * - * @description - * Determines if a reference is a `Function`. - * - * @param {*} value Reference to check. - * @returns {boolean} True if `value` is a `Function`. - */ -function isFunction(value){return typeof value == 'function';} - - -/** - * Checks if `obj` is a window object. - * - * @private - * @param {*} obj Object to check - * @returns {boolean} True if `obj` is a window obj. - */ -function isWindow(obj) { - return obj && obj.document && obj.location && obj.alert && obj.setInterval; -} - - -function isScope(obj) { - return obj && obj.$evalAsync && obj.$watch; -} - - -function isFile(obj) { - return toString.apply(obj) === '[object File]'; -} - - -function isBoolean(value) { - return typeof value == 'boolean'; -} - - -function trim(value) { - return isString(value) ? value.replace(/^\s*/, '').replace(/\s*$/, '') : value; -} - -/** - * @ngdoc function - * @name angular.isElement - * @function - * - * @description - * Determines if a reference is a DOM element (or wrapped jQuery element). - * - * @param {*} value Reference to check. - * @returns {boolean} True if `value` is a DOM element (or wrapped jQuery element). - */ -function isElement(node) { - return node && - (node.nodeName // we are a direct element - || (node.bind && node.find)); // we have a bind and find method part of jQuery API -} - -/** - * @param str 'key1,key2,...' - * @returns {object} in the form of {key1:true, key2:true, ...} - */ -function makeMap(str){ - var obj = {}, items = str.split(","), i; - for ( i = 0; i < items.length; i++ ) - obj[ items[i] ] = true; - return obj; -} - - -if (msie < 9) { - nodeName_ = function(element) { - element = element.nodeName ? element : element[0]; - return (element.scopeName && element.scopeName != 'HTML') - ? uppercase(element.scopeName + ':' + element.nodeName) : element.nodeName; - }; -} else { - nodeName_ = function(element) { - return element.nodeName ? element.nodeName : element[0].nodeName; - }; -} - - -function map(obj, iterator, context) { - var results = []; - forEach(obj, function(value, index, list) { - results.push(iterator.call(context, value, index, list)); - }); - return results; -} - - -/** - * @description - * Determines the number of elements in an array, the number of properties an object has, or - * the length of a string. - * - * Note: This function is used to augment the Object type in Angular expressions. See - * {@link angular.Object} for more information about Angular arrays. - * - * @param {Object|Array|string} obj Object, array, or string to inspect. - * @param {boolean} [ownPropsOnly=false] Count only "own" properties in an object - * @returns {number} The size of `obj` or `0` if `obj` is neither an object nor an array. - */ -function size(obj, ownPropsOnly) { - var size = 0, key; - - if (isArray(obj) || isString(obj)) { - return obj.length; - } else if (isObject(obj)){ - for (key in obj) - if (!ownPropsOnly || obj.hasOwnProperty(key)) - size++; - } - - return size; -} - - -function includes(array, obj) { - return indexOf(array, obj) != -1; -} - -function indexOf(array, obj) { - if (array.indexOf) return array.indexOf(obj); - - for ( var i = 0; i < array.length; i++) { - if (obj === array[i]) return i; - } - return -1; -} - -function arrayRemove(array, value) { - var index = indexOf(array, value); - if (index >=0) - array.splice(index, 1); - return value; -} - -function isLeafNode (node) { - if (node) { - switch (node.nodeName) { - case "OPTION": - case "PRE": - case "TITLE": - return true; - } - } - return false; -} - -/** - * @ngdoc function - * @name angular.copy - * @function - * - * @description - * Creates a deep copy of `source`, which should be an object or an array. - * - * * If no destination is supplied, a copy of the object or array is created. - * * If a destination is provided, all of its elements (for array) or properties (for objects) - * are deleted and then all elements/properties from the source are copied to it. - * * If `source` is not an object or array, `source` is returned. - * - * Note: this function is used to augment the Object type in Angular expressions. See - * {@link ng.$filter} for more information about Angular arrays. - * - * @param {*} source The source that will be used to make a copy. - * Can be any type, including primitives, `null`, and `undefined`. - * @param {(Object|Array)=} destination Destination into which the source is copied. If - * provided, must be of the same type as `source`. - * @returns {*} The copy or updated `destination`, if `destination` was specified. - */ -function copy(source, destination){ - if (isWindow(source) || isScope(source)) throw Error("Can't copy Window or Scope"); - if (!destination) { - destination = source; - if (source) { - if (isArray(source)) { - destination = copy(source, []); - } else if (isDate(source)) { - destination = new Date(source.getTime()); - } else if (isObject(source)) { - destination = copy(source, {}); - } - } - } else { - if (source === destination) throw Error("Can't copy equivalent objects or arrays"); - if (isArray(source)) { - destination.length = 0; - for ( var i = 0; i < source.length; i++) { - destination.push(copy(source[i])); - } - } else { - forEach(destination, function(value, key){ - delete destination[key]; - }); - for ( var key in source) { - destination[key] = copy(source[key]); - } - } - } - return destination; -} - -/** - * Create a shallow copy of an object - */ -function shallowCopy(src, dst) { - dst = dst || {}; - - for(var key in src) { - if (src.hasOwnProperty(key) && key.substr(0, 2) !== '$$') { - dst[key] = src[key]; - } - } - - return dst; -} - - -/** - * @ngdoc function - * @name angular.equals - * @function - * - * @description - * Determines if two objects or two values are equivalent. Supports value types, arrays and - * objects. - * - * Two objects or values are considered equivalent if at least one of the following is true: - * - * * Both objects or values pass `===` comparison. - * * Both objects or values are of the same type and all of their properties pass `===` comparison. - * * Both values are NaN. (In JavasScript, NaN == NaN => false. But we consider two NaN as equal) - * - * During a property comparision, properties of `function` type and properties with names - * that begin with `$` are ignored. - * - * Scope and DOMWindow objects are being compared only be identify (`===`). - * - * @param {*} o1 Object or value to compare. - * @param {*} o2 Object or value to compare. - * @returns {boolean} True if arguments are equal. - */ -function equals(o1, o2) { - if (o1 === o2) return true; - if (o1 === null || o2 === null) return false; - if (o1 !== o1 && o2 !== o2) return true; // NaN === NaN - var t1 = typeof o1, t2 = typeof o2, length, key, keySet; - if (t1 == t2) { - if (t1 == 'object') { - if (isArray(o1)) { - if ((length = o1.length) == o2.length) { - for(key=0; key 2 ? sliceArgs(arguments, 2) : []; - if (isFunction(fn) && !(fn instanceof RegExp)) { - return curryArgs.length - ? function() { - return arguments.length - ? fn.apply(self, curryArgs.concat(slice.call(arguments, 0))) - : fn.apply(self, curryArgs); - } - : function() { - return arguments.length - ? fn.apply(self, arguments) - : fn.call(self); - }; - } else { - // in IE, native methods are not functions so they cannot be bound (note: they don't need to be) - return fn; - } -} - - -function toJsonReplacer(key, value) { - var val = value; - - if (/^\$+/.test(key)) { - val = undefined; - } else if (isWindow(value)) { - val = '$WINDOW'; - } else if (value && document === value) { - val = '$DOCUMENT'; - } else if (isScope(value)) { - val = '$SCOPE'; - } - - return val; -} - - -/** - * @ngdoc function - * @name angular.toJson - * @function - * - * @description - * Serializes input into a JSON-formatted string. - * - * @param {Object|Array|Date|string|number} obj Input to be serialized into JSON. - * @param {boolean=} pretty If set to true, the JSON output will contain newlines and whitespace. - * @returns {string} Jsonified string representing `obj`. - */ -function toJson(obj, pretty) { - return JSON.stringify(obj, toJsonReplacer, pretty ? ' ' : null); -} - - -/** - * @ngdoc function - * @name angular.fromJson - * @function - * - * @description - * Deserializes a JSON string. - * - * @param {string} json JSON string to deserialize. - * @returns {Object|Array|Date|string|number} Deserialized thingy. - */ -function fromJson(json) { - return isString(json) - ? JSON.parse(json) - : json; -} - - -function toBoolean(value) { - if (value && value.length !== 0) { - var v = lowercase("" + value); - value = !(v == 'f' || v == '0' || v == 'false' || v == 'no' || v == 'n' || v == '[]'); - } else { - value = false; - } - return value; -} - -/** - * @returns {string} Returns the string representation of the element. - */ -function startingTag(element) { - element = jqLite(element).clone(); - try { - // turns out IE does not let you set .html() on elements which - // are not allowed to have children. So we just ignore it. - element.html(''); - } catch(e) {} - // As Per DOM Standards - var TEXT_NODE = 3; - var elemHtml = jqLite('
').append(element).html(); - try { - return element[0].nodeType === TEXT_NODE ? lowercase(elemHtml) : - elemHtml. - match(/^(<[^>]+>)/)[1]. - replace(/^<([\w\-]+)/, function(match, nodeName) { return '<' + lowercase(nodeName); }); - } catch(e) { - return lowercase(elemHtml); - } - -} - - -///////////////////////////////////////////////// - -/** - * Parses an escaped url query string into key-value pairs. - * @returns Object.<(string|boolean)> - */ -function parseKeyValue(/**string*/keyValue) { - var obj = {}, key_value, key; - forEach((keyValue || "").split('&'), function(keyValue){ - if (keyValue) { - key_value = keyValue.split('='); - key = decodeURIComponent(key_value[0]); - obj[key] = isDefined(key_value[1]) ? decodeURIComponent(key_value[1]) : true; - } - }); - return obj; -} - -function toKeyValue(obj) { - var parts = []; - forEach(obj, function(value, key) { - parts.push(encodeUriQuery(key, true) + (value === true ? '' : '=' + encodeUriQuery(value, true))); - }); - return parts.length ? parts.join('&') : ''; -} - - -/** - * We need our custom method because encodeURIComponent is too agressive and doesn't follow - * http://www.ietf.org/rfc/rfc3986.txt with regards to the character set (pchar) allowed in path - * segments: - * segment = *pchar - * pchar = unreserved / pct-encoded / sub-delims / ":" / "@" - * pct-encoded = "%" HEXDIG HEXDIG - * unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~" - * sub-delims = "!" / "$" / "&" / "'" / "(" / ")" - * / "*" / "+" / "," / ";" / "=" - */ -function encodeUriSegment(val) { - return encodeUriQuery(val, true). - replace(/%26/gi, '&'). - replace(/%3D/gi, '='). - replace(/%2B/gi, '+'); -} - - -/** - * This method is intended for encoding *key* or *value* parts of query component. We need a custom - * method becuase encodeURIComponent is too agressive and encodes stuff that doesn't have to be - * encoded per http://tools.ietf.org/html/rfc3986: - * query = *( pchar / "/" / "?" ) - * pchar = unreserved / pct-encoded / sub-delims / ":" / "@" - * unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~" - * pct-encoded = "%" HEXDIG HEXDIG - * sub-delims = "!" / "$" / "&" / "'" / "(" / ")" - * / "*" / "+" / "," / ";" / "=" - */ -function encodeUriQuery(val, pctEncodeSpaces) { - return encodeURIComponent(val). - replace(/%40/gi, '@'). - replace(/%3A/gi, ':'). - replace(/%24/g, '$'). - replace(/%2C/gi, ','). - replace((pctEncodeSpaces ? null : /%20/g), '+'); -} - - -/** - * @ngdoc directive - * @name ng.directive:ngApp - * - * @element ANY - * @param {angular.Module} ngApp an optional application - * {@link angular.module module} name to load. - * - * @description - * - * Use this directive to auto-bootstrap on application. Only - * one directive can be used per HTML document. The directive - * designates the root of the application and is typically placed - * at the root of the page. - * - * In the example below if the `ngApp` directive would not be placed - * on the `html` element then the document would not be compiled - * and the `{{ 1+2 }}` would not be resolved to `3`. - * - * `ngApp` is the easiest way to bootstrap an application. - * - - - I can add: 1 + 2 = {{ 1+2 }} - - - * - */ -function angularInit(element, bootstrap) { - var elements = [element], - appElement, - module, - names = ['ng:app', 'ng-app', 'x-ng-app', 'data-ng-app'], - NG_APP_CLASS_REGEXP = /\sng[:\-]app(:\s*([\w\d_]+);?)?\s/; - - function append(element) { - element && elements.push(element); - } - - forEach(names, function(name) { - names[name] = true; - append(document.getElementById(name)); - name = name.replace(':', '\\:'); - if (element.querySelectorAll) { - forEach(element.querySelectorAll('.' + name), append); - forEach(element.querySelectorAll('.' + name + '\\:'), append); - forEach(element.querySelectorAll('[' + name + ']'), append); - } - }); - - forEach(elements, function(element) { - if (!appElement) { - var className = ' ' + element.className + ' '; - var match = NG_APP_CLASS_REGEXP.exec(className); - if (match) { - appElement = element; - module = (match[2] || '').replace(/\s+/g, ','); - } else { - forEach(element.attributes, function(attr) { - if (!appElement && names[attr.name]) { - appElement = element; - module = attr.value; - } - }); - } - } - }); - if (appElement) { - bootstrap(appElement, module ? [module] : []); - } -} - -/** - * @ngdoc function - * @name angular.bootstrap - * @description - * Use this function to manually start up angular application. - * - * See: {@link guide/bootstrap Bootstrap} - * - * @param {Element} element DOM element which is the root of angular application. - * @param {Array=} modules an array of module declarations. See: {@link angular.module modules} - * @returns {AUTO.$injector} Returns the newly created injector for this app. - */ -function bootstrap(element, modules) { - element = jqLite(element); - modules = modules || []; - modules.unshift(['$provide', function($provide) { - $provide.value('$rootElement', element); - }]); - modules.unshift('ng'); - var injector = createInjector(modules); - injector.invoke( - ['$rootScope', '$rootElement', '$compile', '$injector', function(scope, element, compile, injector){ - scope.$apply(function() { - element.data('$injector', injector); - compile(element)(scope); - }); - }] - ); - return injector; -} - -var SNAKE_CASE_REGEXP = /[A-Z]/g; -function snake_case(name, separator){ - separator = separator || '_'; - return name.replace(SNAKE_CASE_REGEXP, function(letter, pos) { - return (pos ? separator : '') + letter.toLowerCase(); - }); -} - -function bindJQuery() { - // bind to jQuery if present; - jQuery = window.jQuery; - // reset to jQuery or default to us. - if (jQuery) { - jqLite = jQuery; - extend(jQuery.fn, { - scope: JQLitePrototype.scope, - controller: JQLitePrototype.controller, - injector: JQLitePrototype.injector, - inheritedData: JQLitePrototype.inheritedData - }); - JQLitePatchJQueryRemove('remove', true); - JQLitePatchJQueryRemove('empty'); - JQLitePatchJQueryRemove('html'); - } else { - jqLite = JQLite; - } - angular.element = jqLite; -} - -/** - * throw error of the argument is falsy. - */ -function assertArg(arg, name, reason) { - if (!arg) { - throw new Error("Argument '" + (name || '?') + "' is " + (reason || "required")); - } - return arg; -} - -function assertArgFn(arg, name, acceptArrayAnnotation) { - if (acceptArrayAnnotation && isArray(arg)) { - arg = arg[arg.length - 1]; - } - - assertArg(isFunction(arg), name, 'not a function, got ' + - (arg && typeof arg == 'object' ? arg.constructor.name || 'Object' : typeof arg)); - return arg; -} - -/** - * @ngdoc interface - * @name angular.Module - * @description - * - * Interface for configuring angular {@link angular.module modules}. - */ - -function setupModuleLoader(window) { - - function ensure(obj, name, factory) { - return obj[name] || (obj[name] = factory()); - } - - return ensure(ensure(window, 'angular', Object), 'module', function() { - /** @type {Object.} */ - var modules = {}; - - /** - * @ngdoc function - * @name angular.module - * @description - * - * The `angular.module` is a global place for creating and registering Angular modules. All - * modules (angular core or 3rd party) that should be available to an application must be - * registered using this mechanism. - * - * - * # Module - * - * A module is a collocation of services, directives, filters, and configuration information. Module - * is used to configure the {@link AUTO.$injector $injector}. - * - *
-     * // Create a new module
-     * var myModule = angular.module('myModule', []);
-     *
-     * // register a new service
-     * myModule.value('appName', 'MyCoolApp');
-     *
-     * // configure existing services inside initialization blocks.
-     * myModule.config(function($locationProvider) {
-     *   // Configure existing providers
-     *   $locationProvider.hashPrefix('!');
-     * });
-     * 
- * - * Then you can create an injector and load your modules like this: - * - *
-     * var injector = angular.injector(['ng', 'MyModule'])
-     * 
- * - * However it's more likely that you'll just use - * {@link ng.directive:ngApp ngApp} or - * {@link angular.bootstrap} to simplify this process for you. - * - * @param {!string} name The name of the module to create or retrieve. - * @param {Array.=} requires If specified then new module is being created. If unspecified then the - * the module is being retrieved for further configuration. - * @param {Function} configFn Optional configuration function for the module. Same as - * {@link angular.Module#config Module#config()}. - * @returns {module} new module with the {@link angular.Module} api. - */ - return function module(name, requires, configFn) { - if (requires && modules.hasOwnProperty(name)) { - modules[name] = null; - } - return ensure(modules, name, function() { - if (!requires) { - throw Error('No module: ' + name); - } - - /** @type {!Array.>} */ - var invokeQueue = []; - - /** @type {!Array.} */ - var runBlocks = []; - - var config = invokeLater('$injector', 'invoke'); - - /** @type {angular.Module} */ - var moduleInstance = { - // Private state - _invokeQueue: invokeQueue, - _runBlocks: runBlocks, - - /** - * @ngdoc property - * @name angular.Module#requires - * @propertyOf angular.Module - * @returns {Array.} List of module names which must be loaded before this module. - * @description - * Holds the list of modules which the injector will load before the current module is loaded. - */ - requires: requires, - - /** - * @ngdoc property - * @name angular.Module#name - * @propertyOf angular.Module - * @returns {string} Name of the module. - * @description - */ - name: name, - - - /** - * @ngdoc method - * @name angular.Module#provider - * @methodOf angular.Module - * @param {string} name service name - * @param {Function} providerType Construction function for creating new instance of the service. - * @description - * See {@link AUTO.$provide#provider $provide.provider()}. - */ - provider: invokeLater('$provide', 'provider'), - - /** - * @ngdoc method - * @name angular.Module#factory - * @methodOf angular.Module - * @param {string} name service name - * @param {Function} providerFunction Function for creating new instance of the service. - * @description - * See {@link AUTO.$provide#factory $provide.factory()}. - */ - factory: invokeLater('$provide', 'factory'), - - /** - * @ngdoc method - * @name angular.Module#service - * @methodOf angular.Module - * @param {string} name service name - * @param {Function} constructor A constructor function that will be instantiated. - * @description - * See {@link AUTO.$provide#service $provide.service()}. - */ - service: invokeLater('$provide', 'service'), - - /** - * @ngdoc method - * @name angular.Module#value - * @methodOf angular.Module - * @param {string} name service name - * @param {*} object Service instance object. - * @description - * See {@link AUTO.$provide#value $provide.value()}. - */ - value: invokeLater('$provide', 'value'), - - /** - * @ngdoc method - * @name angular.Module#constant - * @methodOf angular.Module - * @param {string} name constant name - * @param {*} object Constant value. - * @description - * Because the constant are fixed, they get applied before other provide methods. - * See {@link AUTO.$provide#constant $provide.constant()}. - */ - constant: invokeLater('$provide', 'constant', 'unshift'), - - /** - * @ngdoc method - * @name angular.Module#filter - * @methodOf angular.Module - * @param {string} name Filter name. - * @param {Function} filterFactory Factory function for creating new instance of filter. - * @description - * See {@link ng.$filterProvider#register $filterProvider.register()}. - */ - filter: invokeLater('$filterProvider', 'register'), - - /** - * @ngdoc method - * @name angular.Module#controller - * @methodOf angular.Module - * @param {string} name Controller name. - * @param {Function} constructor Controller constructor function. - * @description - * See {@link ng.$controllerProvider#register $controllerProvider.register()}. - */ - controller: invokeLater('$controllerProvider', 'register'), - - /** - * @ngdoc method - * @name angular.Module#directive - * @methodOf angular.Module - * @param {string} name directive name - * @param {Function} directiveFactory Factory function for creating new instance of - * directives. - * @description - * See {@link ng.$compileProvider#directive $compileProvider.directive()}. - */ - directive: invokeLater('$compileProvider', 'directive'), - - /** - * @ngdoc method - * @name angular.Module#config - * @methodOf angular.Module - * @param {Function} configFn Execute this function on module load. Useful for service - * configuration. - * @description - * Use this method to register work which needs to be performed on module loading. - */ - config: config, - - /** - * @ngdoc method - * @name angular.Module#run - * @methodOf angular.Module - * @param {Function} initializationFn Execute this function after injector creation. - * Useful for application initialization. - * @description - * Use this method to register work which should be performed when the injector is done - * loading all modules. - */ - run: function(block) { - runBlocks.push(block); - return this; - } - }; - - if (configFn) { - config(configFn); - } - - return moduleInstance; - - /** - * @param {string} provider - * @param {string} method - * @param {String=} insertMethod - * @returns {angular.Module} - */ - function invokeLater(provider, method, insertMethod) { - return function() { - invokeQueue[insertMethod || 'push']([provider, method, arguments]); - return moduleInstance; - } - } - }); - }; - }); - -} - -/** - * @ngdoc property - * @name angular.version - * @description - * An object that contains information about the current AngularJS version. This object has the - * following properties: - * - * - `full` – `{string}` – Full version string, such as "0.9.18". - * - `major` – `{number}` – Major version number, such as "0". - * - `minor` – `{number}` – Minor version number, such as "9". - * - `dot` – `{number}` – Dot version number, such as "18". - * - `codeName` – `{string}` – Code name of the release, such as "jiggling-armfat". - */ -var version = { - full: '1.0.5', // all of these placeholder strings will be replaced by rake's - major: 1, // compile task - minor: 0, - dot: 5, - codeName: 'flatulent-propulsion' -}; - - -function publishExternalAPI(angular){ - extend(angular, { - 'bootstrap': bootstrap, - 'copy': copy, - 'extend': extend, - 'equals': equals, - 'element': jqLite, - 'forEach': forEach, - 'injector': createInjector, - 'noop':noop, - 'bind':bind, - 'toJson': toJson, - 'fromJson': fromJson, - 'identity':identity, - 'isUndefined': isUndefined, - 'isDefined': isDefined, - 'isString': isString, - 'isFunction': isFunction, - 'isObject': isObject, - 'isNumber': isNumber, - 'isElement': isElement, - 'isArray': isArray, - 'version': version, - 'isDate': isDate, - 'lowercase': lowercase, - 'uppercase': uppercase, - 'callbacks': {counter: 0} - }); - - angularModule = setupModuleLoader(window); - try { - angularModule('ngLocale'); - } catch (e) { - angularModule('ngLocale', []).provider('$locale', $LocaleProvider); - } - - angularModule('ng', ['ngLocale'], ['$provide', - function ngModule($provide) { - $provide.provider('$compile', $CompileProvider). - directive({ - a: htmlAnchorDirective, - input: inputDirective, - textarea: inputDirective, - form: formDirective, - script: scriptDirective, - select: selectDirective, - style: styleDirective, - option: optionDirective, - ngBind: ngBindDirective, - ngBindHtmlUnsafe: ngBindHtmlUnsafeDirective, - ngBindTemplate: ngBindTemplateDirective, - ngClass: ngClassDirective, - ngClassEven: ngClassEvenDirective, - ngClassOdd: ngClassOddDirective, - ngCsp: ngCspDirective, - ngCloak: ngCloakDirective, - ngController: ngControllerDirective, - ngForm: ngFormDirective, - ngHide: ngHideDirective, - ngInclude: ngIncludeDirective, - ngInit: ngInitDirective, - ngNonBindable: ngNonBindableDirective, - ngPluralize: ngPluralizeDirective, - ngRepeat: ngRepeatDirective, - ngShow: ngShowDirective, - ngSubmit: ngSubmitDirective, - ngStyle: ngStyleDirective, - ngSwitch: ngSwitchDirective, - ngSwitchWhen: ngSwitchWhenDirective, - ngSwitchDefault: ngSwitchDefaultDirective, - ngOptions: ngOptionsDirective, - ngView: ngViewDirective, - ngTransclude: ngTranscludeDirective, - ngModel: ngModelDirective, - ngList: ngListDirective, - ngChange: ngChangeDirective, - required: requiredDirective, - ngRequired: requiredDirective, - ngValue: ngValueDirective - }). - directive(ngAttributeAliasDirectives). - directive(ngEventDirectives); - $provide.provider({ - $anchorScroll: $AnchorScrollProvider, - $browser: $BrowserProvider, - $cacheFactory: $CacheFactoryProvider, - $controller: $ControllerProvider, - $document: $DocumentProvider, - $exceptionHandler: $ExceptionHandlerProvider, - $filter: $FilterProvider, - $interpolate: $InterpolateProvider, - $http: $HttpProvider, - $httpBackend: $HttpBackendProvider, - $location: $LocationProvider, - $log: $LogProvider, - $parse: $ParseProvider, - $route: $RouteProvider, - $routeParams: $RouteParamsProvider, - $rootScope: $RootScopeProvider, - $q: $QProvider, - $sniffer: $SnifferProvider, - $templateCache: $TemplateCacheProvider, - $timeout: $TimeoutProvider, - $window: $WindowProvider - }); - } - ]); -} - -////////////////////////////////// -//JQLite -////////////////////////////////// - -/** - * @ngdoc function - * @name angular.element - * @function - * - * @description - * Wraps a raw DOM element or HTML string as a [jQuery](http://jquery.com) element. - * `angular.element` can be either an alias for [jQuery](http://api.jquery.com/jQuery/) function, if - * jQuery is available, or a function that wraps the element or string in Angular's jQuery lite - * implementation (commonly referred to as jqLite). - * - * Real jQuery always takes precedence over jqLite, provided it was loaded before `DOMContentLoaded` - * project fired. - * - * jqLite is a tiny, API-compatible subset of jQuery that allows - * Angular to manipulate the DOM. jqLite implements only the most commonly needed functionality - * within a very small footprint, so only a subset of the jQuery API - methods, arguments and - * invocation styles - are supported. - * - * Note: All element references in Angular are always wrapped with jQuery or jqLite; they are never - * raw DOM references. - * - * ## Angular's jQuery lite provides the following methods: - * - * - [addClass()](http://api.jquery.com/addClass/) - * - [after()](http://api.jquery.com/after/) - * - [append()](http://api.jquery.com/append/) - * - [attr()](http://api.jquery.com/attr/) - * - [bind()](http://api.jquery.com/bind/) - * - [children()](http://api.jquery.com/children/) - * - [clone()](http://api.jquery.com/clone/) - * - [contents()](http://api.jquery.com/contents/) - * - [css()](http://api.jquery.com/css/) - * - [data()](http://api.jquery.com/data/) - * - [eq()](http://api.jquery.com/eq/) - * - [find()](http://api.jquery.com/find/) - Limited to lookups by tag name. - * - [hasClass()](http://api.jquery.com/hasClass/) - * - [html()](http://api.jquery.com/html/) - * - [next()](http://api.jquery.com/next/) - * - [parent()](http://api.jquery.com/parent/) - * - [prepend()](http://api.jquery.com/prepend/) - * - [prop()](http://api.jquery.com/prop/) - * - [ready()](http://api.jquery.com/ready/) - * - [remove()](http://api.jquery.com/remove/) - * - [removeAttr()](http://api.jquery.com/removeAttr/) - * - [removeClass()](http://api.jquery.com/removeClass/) - * - [removeData()](http://api.jquery.com/removeData/) - * - [replaceWith()](http://api.jquery.com/replaceWith/) - * - [text()](http://api.jquery.com/text/) - * - [toggleClass()](http://api.jquery.com/toggleClass/) - * - [triggerHandler()](http://api.jquery.com/triggerHandler/) - Doesn't pass native project objects to handlers. - * - [unbind()](http://api.jquery.com/unbind/) - * - [val()](http://api.jquery.com/val/) - * - [wrap()](http://api.jquery.com/wrap/) - * - * ## In addtion to the above, Angular provides additional methods to both jQuery and jQuery lite: - * - * - `controller(name)` - retrieves the controller of the current element or its parent. By default - * retrieves controller associated with the `ngController` directive. If `name` is provided as - * camelCase directive name, then the controller for this directive will be retrieved (e.g. - * `'ngModel'`). - * - `injector()` - retrieves the injector of the current element or its parent. - * - `scope()` - retrieves the {@link api/ng.$rootScope.Scope scope} of the current - * element or its parent. - * - `inheritedData()` - same as `data()`, but walks up the DOM until a value is found or the top - * parent element is reached. - * - * @param {string|DOMElement} element HTML string or DOMElement to be wrapped into jQuery. - * @returns {Object} jQuery object. - */ - -var jqCache = JQLite.cache = {}, - jqName = JQLite.expando = 'ng-' + new Date().getTime(), - jqId = 1, - addEventListenerFn = (window.document.addEventListener - ? function(element, type, fn) {element.addEventListener(type, fn, false);} - : function(element, type, fn) {element.attachEvent('on' + type, fn);}), - removeEventListenerFn = (window.document.removeEventListener - ? function(element, type, fn) {element.removeEventListener(type, fn, false); } - : function(element, type, fn) {element.detachEvent('on' + type, fn); }); - -function jqNextId() { return ++jqId; } - - -var SPECIAL_CHARS_REGEXP = /([\:\-\_]+(.))/g; -var MOZ_HACK_REGEXP = /^moz([A-Z])/; - -/** - * Converts snake_case to camelCase. - * Also there is special case for Moz prefix starting with upper case letter. - * @param name Name to normalize - */ -function camelCase(name) { - return name. - replace(SPECIAL_CHARS_REGEXP, function(_, separator, letter, offset) { - return offset ? letter.toUpperCase() : letter; - }). - replace(MOZ_HACK_REGEXP, 'Moz$1'); -} - -///////////////////////////////////////////// -// jQuery mutation patch -// -// In conjunction with bindJQuery intercepts all jQuery's DOM destruction apis and fires a -// $destroy project on all DOM nodes being removed. -// -///////////////////////////////////////////// - -function JQLitePatchJQueryRemove(name, dispatchThis) { - var originalJqFn = jQuery.fn[name]; - originalJqFn = originalJqFn.$original || originalJqFn; - removePatch.$original = originalJqFn; - jQuery.fn[name] = removePatch; - - function removePatch() { - var list = [this], - fireEvent = dispatchThis, - set, setIndex, setLength, - element, childIndex, childLength, children, - fns, events; - - while(list.length) { - set = list.shift(); - for(setIndex = 0, setLength = set.length; setIndex < setLength; setIndex++) { - element = jqLite(set[setIndex]); - if (fireEvent) { - element.triggerHandler('$destroy'); - } else { - fireEvent = !fireEvent; - } - for(childIndex = 0, childLength = (children = element.children()).length; - childIndex < childLength; - childIndex++) { - list.push(jQuery(children[childIndex])); - } - } - } - return originalJqFn.apply(this, arguments); - } -} - -///////////////////////////////////////////// -function JQLite(element) { - if (element instanceof JQLite) { - return element; - } - if (!(this instanceof JQLite)) { - if (isString(element) && element.charAt(0) != '<') { - throw Error('selectors not implemented'); - } - return new JQLite(element); - } - - if (isString(element)) { - var div = document.createElement('div'); - // Read about the NoScope elements here: - // http://msdn.microsoft.com/en-us/library/ms533897(VS.85).aspx - div.innerHTML = '
 
' + element; // IE insanity to make NoScope elements work! - div.removeChild(div.firstChild); // remove the superfluous div - JQLiteAddNodes(this, div.childNodes); - this.remove(); // detach the elements from the temporary DOM div. - } else { - JQLiteAddNodes(this, element); - } -} - -function JQLiteClone(element) { - return element.cloneNode(true); -} - -function JQLiteDealoc(element){ - JQLiteRemoveData(element); - for ( var i = 0, children = element.childNodes || []; i < children.length; i++) { - JQLiteDealoc(children[i]); - } -} - -function JQLiteUnbind(element, type, fn) { - var events = JQLiteExpandoStore(element, 'events'), - handle = JQLiteExpandoStore(element, 'handle'); - - if (!handle) return; //no listeners registered - - if (isUndefined(type)) { - forEach(events, function(eventHandler, type) { - removeEventListenerFn(element, type, eventHandler); - delete events[type]; - }); - } else { - if (isUndefined(fn)) { - removeEventListenerFn(element, type, events[type]); - delete events[type]; - } else { - arrayRemove(events[type], fn); - } - } -} - -function JQLiteRemoveData(element) { - var expandoId = element[jqName], - expandoStore = jqCache[expandoId]; - - if (expandoStore) { - if (expandoStore.handle) { - expandoStore.events.$destroy && expandoStore.handle({}, '$destroy'); - JQLiteUnbind(element); - } - delete jqCache[expandoId]; - element[jqName] = undefined; // ie does not allow deletion of attributes on elements. - } -} - -function JQLiteExpandoStore(element, key, value) { - var expandoId = element[jqName], - expandoStore = jqCache[expandoId || -1]; - - if (isDefined(value)) { - if (!expandoStore) { - element[jqName] = expandoId = jqNextId(); - expandoStore = jqCache[expandoId] = {}; - } - expandoStore[key] = value; - } else { - return expandoStore && expandoStore[key]; - } -} - -function JQLiteData(element, key, value) { - var data = JQLiteExpandoStore(element, 'data'), - isSetter = isDefined(value), - keyDefined = !isSetter && isDefined(key), - isSimpleGetter = keyDefined && !isObject(key); - - if (!data && !isSimpleGetter) { - JQLiteExpandoStore(element, 'data', data = {}); - } - - if (isSetter) { - data[key] = value; - } else { - if (keyDefined) { - if (isSimpleGetter) { - // don't create data in this case. - return data && data[key]; - } else { - extend(data, key); - } - } else { - return data; - } - } -} - -function JQLiteHasClass(element, selector) { - return ((" " + element.className + " ").replace(/[\n\t]/g, " "). - indexOf( " " + selector + " " ) > -1); -} - -function JQLiteRemoveClass(element, cssClasses) { - if (cssClasses) { - forEach(cssClasses.split(' '), function(cssClass) { - element.className = trim( - (" " + element.className + " ") - .replace(/[\n\t]/g, " ") - .replace(" " + trim(cssClass) + " ", " ") - ); - }); - } -} - -function JQLiteAddClass(element, cssClasses) { - if (cssClasses) { - forEach(cssClasses.split(' '), function(cssClass) { - if (!JQLiteHasClass(element, cssClass)) { - element.className = trim(element.className + ' ' + trim(cssClass)); - } - }); - } -} - -function JQLiteAddNodes(root, elements) { - if (elements) { - elements = (!elements.nodeName && isDefined(elements.length) && !isWindow(elements)) - ? elements - : [ elements ]; - for(var i=0; i < elements.length; i++) { - root.push(elements[i]); - } - } -} - -function JQLiteController(element, name) { - return JQLiteInheritedData(element, '$' + (name || 'ngController' ) + 'Controller'); -} - -function JQLiteInheritedData(element, name, value) { - element = jqLite(element); - - // if element is the document object work with the html element instead - // this makes $(document).scope() possible - if(element[0].nodeType == 9) { - element = element.find('html'); - } - - while (element.length) { - if (value = element.data(name)) return value; - element = element.parent(); - } -} - -////////////////////////////////////////// -// Functions which are declared directly. -////////////////////////////////////////// -var JQLitePrototype = JQLite.prototype = { - ready: function(fn) { - var fired = false; - - function trigger() { - if (fired) return; - fired = true; - fn(); - } - - this.bind('DOMContentLoaded', trigger); // works for modern browsers and IE9 - // we can not use jqLite since we are not done loading and jQuery could be loaded later. - JQLite(window).bind('load', trigger); // fallback to window.onload for others - }, - toString: function() { - var value = []; - forEach(this, function(e){ value.push('' + e);}); - return '[' + value.join(', ') + ']'; - }, - - eq: function(index) { - return (index >= 0) ? jqLite(this[index]) : jqLite(this[this.length + index]); - }, - - length: 0, - push: push, - sort: [].sort, - splice: [].splice -}; - -////////////////////////////////////////// -// Functions iterating getter/setters. -// these functions return self on setter and -// value on get. -////////////////////////////////////////// -var BOOLEAN_ATTR = {}; -forEach('multiple,selected,checked,disabled,readOnly,required'.split(','), function(value) { - BOOLEAN_ATTR[lowercase(value)] = value; -}); -var BOOLEAN_ELEMENTS = {}; -forEach('input,select,option,textarea,button,form'.split(','), function(value) { - BOOLEAN_ELEMENTS[uppercase(value)] = true; -}); - -function getBooleanAttrName(element, name) { - // check dom last since we will most likely fail on name - var booleanAttr = BOOLEAN_ATTR[name.toLowerCase()]; - - // booleanAttr is here twice to minimize DOM access - return booleanAttr && BOOLEAN_ELEMENTS[element.nodeName] && booleanAttr; -} - -forEach({ - data: JQLiteData, - inheritedData: JQLiteInheritedData, - - scope: function(element) { - return JQLiteInheritedData(element, '$scope'); - }, - - controller: JQLiteController , - - injector: function(element) { - return JQLiteInheritedData(element, '$injector'); - }, - - removeAttr: function(element,name) { - element.removeAttribute(name); - }, - - hasClass: JQLiteHasClass, - - css: function(element, name, value) { - name = camelCase(name); - - if (isDefined(value)) { - element.style[name] = value; - } else { - var val; - - if (msie <= 8) { - // this is some IE specific weirdness that jQuery 1.6.4 does not sure why - val = element.currentStyle && element.currentStyle[name]; - if (val === '') val = 'auto'; - } - - val = val || element.style[name]; - - if (msie <= 8) { - // jquery weirdness :-/ - val = (val === '') ? undefined : val; - } - - return val; - } - }, - - attr: function(element, name, value){ - var lowercasedName = lowercase(name); - if (BOOLEAN_ATTR[lowercasedName]) { - if (isDefined(value)) { - if (!!value) { - element[name] = true; - element.setAttribute(name, lowercasedName); - } else { - element[name] = false; - element.removeAttribute(lowercasedName); - } - } else { - return (element[name] || - (element.attributes.getNamedItem(name)|| noop).specified) - ? lowercasedName - : undefined; - } - } else if (isDefined(value)) { - element.setAttribute(name, value); - } else if (element.getAttribute) { - // the extra argument "2" is to get the right thing for a.href in IE, see jQuery code - // some elements (e.g. Document) don't have get attribute, so return undefined - var ret = element.getAttribute(name, 2); - // normalize non-existing attributes to undefined (as jQuery) - return ret === null ? undefined : ret; - } - }, - - prop: function(element, name, value) { - if (isDefined(value)) { - element[name] = value; - } else { - return element[name]; - } - }, - - text: extend((msie < 9) - ? function(element, value) { - if (element.nodeType == 1 /** Element */) { - if (isUndefined(value)) - return element.innerText; - element.innerText = value; - } else { - if (isUndefined(value)) - return element.nodeValue; - element.nodeValue = value; - } - } - : function(element, value) { - if (isUndefined(value)) { - return element.textContent; - } - element.textContent = value; - }, {$dv:''}), - - val: function(element, value) { - if (isUndefined(value)) { - return element.value; - } - element.value = value; - }, - - html: function(element, value) { - if (isUndefined(value)) { - return element.innerHTML; - } - for (var i = 0, childNodes = element.childNodes; i < childNodes.length; i++) { - JQLiteDealoc(childNodes[i]); - } - element.innerHTML = value; - } -}, function(fn, name){ - /** - * Properties: writes return selection, reads return first value - */ - JQLite.prototype[name] = function(arg1, arg2) { - var i, key; - - // JQLiteHasClass has only two arguments, but is a getter-only fn, so we need to special-case it - // in a way that survives minification. - if (((fn.length == 2 && (fn !== JQLiteHasClass && fn !== JQLiteController)) ? arg1 : arg2) === undefined) { - if (isObject(arg1)) { - - // we are a write, but the object properties are the key/values - for(i=0; i < this.length; i++) { - if (fn === JQLiteData) { - // data() takes the whole object in jQuery - fn(this[i], arg1); - } else { - for (key in arg1) { - fn(this[i], key, arg1[key]); - } - } - } - // return self for chaining - return this; - } else { - // we are a read, so read the first child. - if (this.length) - return fn(this[0], arg1, arg2); - } - } else { - // we are a write, so apply to all children - for(i=0; i < this.length; i++) { - fn(this[i], arg1, arg2); - } - // return self for chaining - return this; - } - return fn.$dv; - }; -}); - -function createEventHandler(element, events) { - var eventHandler = function (event, type) { - if (!event.preventDefault) { - event.preventDefault = function() { - event.returnValue = false; //ie - }; - } - - if (!event.stopPropagation) { - event.stopPropagation = function() { - event.cancelBubble = true; //ie - }; - } - - if (!event.target) { - event.target = event.srcElement || document; - } - - if (isUndefined(event.defaultPrevented)) { - var prevent = event.preventDefault; - event.preventDefault = function() { - event.defaultPrevented = true; - prevent.call(event); - }; - event.defaultPrevented = false; - } - - event.isDefaultPrevented = function() { - return event.defaultPrevented; - }; - - forEach(events[type || event.type], function(fn) { - fn.call(element, event); - }); - - // Remove monkey-patched methods (IE), - // as they would cause memory leaks in IE8. - if (msie <= 8) { - // IE7/8 does not allow to delete property on native object - event.preventDefault = null; - event.stopPropagation = null; - event.isDefaultPrevented = null; - } else { - // It shouldn't affect normal browsers (native methods are defined on prototype). - delete event.preventDefault; - delete event.stopPropagation; - delete event.isDefaultPrevented; - } - }; - eventHandler.elem = element; - return eventHandler; -} - -////////////////////////////////////////// -// Functions iterating traversal. -// These functions chain results into a single -// selector. -////////////////////////////////////////// -forEach({ - removeData: JQLiteRemoveData, - - dealoc: JQLiteDealoc, - - bind: function bindFn(element, type, fn){ - var events = JQLiteExpandoStore(element, 'events'), - handle = JQLiteExpandoStore(element, 'handle'); - - if (!events) JQLiteExpandoStore(element, 'events', events = {}); - if (!handle) JQLiteExpandoStore(element, 'handle', handle = createEventHandler(element, events)); - - forEach(type.split(' '), function(type){ - var eventFns = events[type]; - - if (!eventFns) { - if (type == 'mouseenter' || type == 'mouseleave') { - var counter = 0; - - events.mouseenter = []; - events.mouseleave = []; - - bindFn(element, 'mouseover', function(event) { - counter++; - if (counter == 1) { - handle(event, 'mouseenter'); - } - }); - bindFn(element, 'mouseout', function(event) { - counter --; - if (counter == 0) { - handle(event, 'mouseleave'); - } - }); - } else { - addEventListenerFn(element, type, handle); - events[type] = []; - } - eventFns = events[type] - } - eventFns.push(fn); - }); - }, - - unbind: JQLiteUnbind, - - replaceWith: function(element, replaceNode) { - var index, parent = element.parentNode; - JQLiteDealoc(element); - forEach(new JQLite(replaceNode), function(node){ - if (index) { - parent.insertBefore(node, index.nextSibling); - } else { - parent.replaceChild(node, element); - } - index = node; - }); - }, - - children: function(element) { - var children = []; - forEach(element.childNodes, function(element){ - if (element.nodeType === 1) - children.push(element); - }); - return children; - }, - - contents: function(element) { - return element.childNodes || []; - }, - - append: function(element, node) { - forEach(new JQLite(node), function(child){ - if (element.nodeType === 1) - element.appendChild(child); - }); - }, - - prepend: function(element, node) { - if (element.nodeType === 1) { - var index = element.firstChild; - forEach(new JQLite(node), function(child){ - if (index) { - element.insertBefore(child, index); - } else { - element.appendChild(child); - index = child; - } - }); - } - }, - - wrap: function(element, wrapNode) { - wrapNode = jqLite(wrapNode)[0]; - var parent = element.parentNode; - if (parent) { - parent.replaceChild(wrapNode, element); - } - wrapNode.appendChild(element); - }, - - remove: function(element) { - JQLiteDealoc(element); - var parent = element.parentNode; - if (parent) parent.removeChild(element); - }, - - after: function(element, newElement) { - var index = element, parent = element.parentNode; - forEach(new JQLite(newElement), function(node){ - parent.insertBefore(node, index.nextSibling); - index = node; - }); - }, - - addClass: JQLiteAddClass, - removeClass: JQLiteRemoveClass, - - toggleClass: function(element, selector, condition) { - if (isUndefined(condition)) { - condition = !JQLiteHasClass(element, selector); - } - (condition ? JQLiteAddClass : JQLiteRemoveClass)(element, selector); - }, - - parent: function(element) { - var parent = element.parentNode; - return parent && parent.nodeType !== 11 ? parent : null; - }, - - next: function(element) { - if (element.nextElementSibling) { - return element.nextElementSibling; - } - - // IE8 doesn't have nextElementSibling - var elm = element.nextSibling; - while (elm != null && elm.nodeType !== 1) { - elm = elm.nextSibling; - } - return elm; - }, - - find: function(element, selector) { - return element.getElementsByTagName(selector); - }, - - clone: JQLiteClone, - - triggerHandler: function(element, eventName) { - var eventFns = (JQLiteExpandoStore(element, 'events') || {})[eventName]; - - forEach(eventFns, function(fn) { - fn.call(element, null); - }); - } -}, function(fn, name){ - /** - * chaining functions - */ - JQLite.prototype[name] = function(arg1, arg2) { - var value; - for(var i=0; i < this.length; i++) { - if (value == undefined) { - value = fn(this[i], arg1, arg2); - if (value !== undefined) { - // any function which returns a value needs to be wrapped - value = jqLite(value); - } - } else { - JQLiteAddNodes(value, fn(this[i], arg1, arg2)); - } - } - return value == undefined ? this : value; - }; -}); - -/** - * Computes a hash of an 'obj'. - * Hash of a: - * string is string - * number is number as string - * object is either result of calling $$hashKey function on the object or uniquely generated id, - * that is also assigned to the $$hashKey property of the object. - * - * @param obj - * @returns {string} hash string such that the same input will have the same hash string. - * The resulting string key is in 'type:hashKey' format. - */ -function hashKey(obj) { - var objType = typeof obj, - key; - - if (objType == 'object' && obj !== null) { - if (typeof (key = obj.$$hashKey) == 'function') { - // must invoke on object to keep the right this - key = obj.$$hashKey(); - } else if (key === undefined) { - key = obj.$$hashKey = nextUid(); - } - } else { - key = obj; - } - - return objType + ':' + key; -} - -/** - * HashMap which can use objects as keys - */ -function HashMap(array){ - forEach(array, this.put, this); -} -HashMap.prototype = { - /** - * Store key value pair - * @param key key to store can be any type - * @param value value to store can be any type - */ - put: function(key, value) { - this[hashKey(key)] = value; - }, - - /** - * @param key - * @returns the value for the key - */ - get: function(key) { - return this[hashKey(key)]; - }, - - /** - * Remove the key/value pair - * @param key - */ - remove: function(key) { - var value = this[key = hashKey(key)]; - delete this[key]; - return value; - } -}; - -/** - * A map where multiple values can be added to the same key such that they form a queue. - * @returns {HashQueueMap} - */ -function HashQueueMap() {} -HashQueueMap.prototype = { - /** - * Same as array push, but using an array as the value for the hash - */ - push: function(key, value) { - var array = this[key = hashKey(key)]; - if (!array) { - this[key] = [value]; - } else { - array.push(value); - } - }, - - /** - * Same as array shift, but using an array as the value for the hash - */ - shift: function(key) { - var array = this[key = hashKey(key)]; - if (array) { - if (array.length == 1) { - delete this[key]; - return array[0]; - } else { - return array.shift(); - } - } - }, - - /** - * return the first item without deleting it - */ - peek: function(key) { - var array = this[hashKey(key)]; - if (array) { - return array[0]; - } - } -}; - -/** - * @ngdoc function - * @name angular.injector - * @function - * - * @description - * Creates an injector function that can be used for retrieving services as well as for - * dependency injection (see {@link guide/di dependency injection}). - * - - * @param {Array.} modules A list of module functions or their aliases. See - * {@link angular.module}. The `ng` module must be explicitly added. - * @returns {function()} Injector function. See {@link AUTO.$injector $injector}. - * - * @example - * Typical usage - *
- *   // create an injector
- *   var $injector = angular.injector(['ng']);
- *
- *   // use the injector to kick off your application
- *   // use the type inference to auto inject arguments, or use implicit injection
- *   $injector.invoke(function($rootScope, $compile, $document){
- *     $compile($document)($rootScope);
- *     $rootScope.$digest();
- *   });
- * 
- */ - - -/** - * @ngdoc overview - * @name AUTO - * @description - * - * Implicit module which gets automatically added to each {@link AUTO.$injector $injector}. - */ - -var FN_ARGS = /^function\s*[^\(]*\(\s*([^\)]*)\)/m; -var FN_ARG_SPLIT = /,/; -var FN_ARG = /^\s*(_?)(\S+?)\1\s*$/; -var STRIP_COMMENTS = /((\/\/.*$)|(\/\*[\s\S]*?\*\/))/mg; -function annotate(fn) { - var $inject, - fnText, - argDecl, - last; - - if (typeof fn == 'function') { - if (!($inject = fn.$inject)) { - $inject = []; - fnText = fn.toString().replace(STRIP_COMMENTS, ''); - argDecl = fnText.match(FN_ARGS); - forEach(argDecl[1].split(FN_ARG_SPLIT), function(arg){ - arg.replace(FN_ARG, function(all, underscore, name){ - $inject.push(name); - }); - }); - fn.$inject = $inject; - } - } else if (isArray(fn)) { - last = fn.length - 1; - assertArgFn(fn[last], 'fn') - $inject = fn.slice(0, last); - } else { - assertArgFn(fn, 'fn', true); - } - return $inject; -} - -/////////////////////////////////////// - -/** - * @ngdoc object - * @name AUTO.$injector - * @function - * - * @description - * - * `$injector` is used to retrieve object instances as defined by - * {@link AUTO.$provide provider}, instantiate types, invoke methods, - * and load modules. - * - * The following always holds true: - * - *
- *   var $injector = angular.injector();
- *   expect($injector.get('$injector')).toBe($injector);
- *   expect($injector.invoke(function($injector){
- *     return $injector;
- *   }).toBe($injector);
- * 
- * - * # Injection Function Annotation - * - * JavaScript does not have annotations, and annotations are needed for dependency injection. The - * following ways are all valid way of annotating function with injection arguments and are equivalent. - * - *
- *   // inferred (only works if code not minified/obfuscated)
- *   $inject.invoke(function(serviceA){});
- *
- *   // annotated
- *   function explicit(serviceA) {};
- *   explicit.$inject = ['serviceA'];
- *   $inject.invoke(explicit);
- *
- *   // inline
- *   $inject.invoke(['serviceA', function(serviceA){}]);
- * 
- * - * ## Inference - * - * In JavaScript calling `toString()` on a function returns the function definition. The definition can then be - * parsed and the function arguments can be extracted. *NOTE:* This does not work with minification, and obfuscation - * tools since these tools change the argument names. - * - * ## `$inject` Annotation - * By adding a `$inject` property onto a function the injection parameters can be specified. - * - * ## Inline - * As an array of injection names, where the last item in the array is the function to call. - */ - -/** - * @ngdoc method - * @name AUTO.$injector#get - * @methodOf AUTO.$injector - * - * @description - * Return an instance of the service. - * - * @param {string} name The name of the instance to retrieve. - * @return {*} The instance. - */ - -/** - * @ngdoc method - * @name AUTO.$injector#invoke - * @methodOf AUTO.$injector - * - * @description - * Invoke the method and supply the method arguments from the `$injector`. - * - * @param {!function} fn The function to invoke. The function arguments come form the function annotation. - * @param {Object=} self The `this` for the invoked method. - * @param {Object=} locals Optional object. If preset then any argument names are read from this object first, before - * the `$injector` is consulted. - * @returns {*} the value returned by the invoked `fn` function. - */ - -/** - * @ngdoc method - * @name AUTO.$injector#instantiate - * @methodOf AUTO.$injector - * @description - * Create a new instance of JS type. The method takes a constructor function invokes the new operator and supplies - * all of the arguments to the constructor function as specified by the constructor annotation. - * - * @param {function} Type Annotated constructor function. - * @param {Object=} locals Optional object. If preset then any argument names are read from this object first, before - * the `$injector` is consulted. - * @returns {Object} new instance of `Type`. - */ - -/** - * @ngdoc method - * @name AUTO.$injector#annotate - * @methodOf AUTO.$injector - * - * @description - * Returns an array of service names which the function is requesting for injection. This API is used by the injector - * to determine which services need to be injected into the function when the function is invoked. There are three - * ways in which the function can be annotated with the needed dependencies. - * - * # Argument names - * - * The simplest form is to extract the dependencies from the arguments of the function. This is done by converting - * the function into a string using `toString()` method and extracting the argument names. - *
- *   // Given
- *   function MyController($scope, $route) {
- *     // ...
- *   }
- *
- *   // Then
- *   expect(injector.annotate(MyController)).toEqual(['$scope', '$route']);
- * 
- * - * This method does not work with code minfication / obfuscation. For this reason the following annotation strategies - * are supported. - * - * # The `$inject` property - * - * If a function has an `$inject` property and its value is an array of strings, then the strings represent names of - * services to be injected into the function. - *
- *   // Given
- *   var MyController = function(obfuscatedScope, obfuscatedRoute) {
- *     // ...
- *   }
- *   // Define function dependencies
- *   MyController.$inject = ['$scope', '$route'];
- *
- *   // Then
- *   expect(injector.annotate(MyController)).toEqual(['$scope', '$route']);
- * 
- * - * # The array notation - * - * It is often desirable to inline Injected functions and that's when setting the `$inject` property is very - * inconvenient. In these situations using the array notation to specify the dependencies in a way that survives - * minification is a better choice: - * - *
- *   // We wish to write this (not minification / obfuscation safe)
- *   injector.invoke(function($compile, $rootScope) {
- *     // ...
- *   });
- *
- *   // We are forced to write break inlining
- *   var tmpFn = function(obfuscatedCompile, obfuscatedRootScope) {
- *     // ...
- *   };
- *   tmpFn.$inject = ['$compile', '$rootScope'];
- *   injector.invoke(tempFn);
- *
- *   // To better support inline function the inline annotation is supported
- *   injector.invoke(['$compile', '$rootScope', function(obfCompile, obfRootScope) {
- *     // ...
- *   }]);
- *
- *   // Therefore
- *   expect(injector.annotate(
- *      ['$compile', '$rootScope', function(obfus_$compile, obfus_$rootScope) {}])
- *    ).toEqual(['$compile', '$rootScope']);
- * 
- * - * @param {function|Array.} fn Function for which dependent service names need to be retrieved as described - * above. - * - * @returns {Array.} The names of the services which the function requires. - */ - - - - -/** - * @ngdoc object - * @name AUTO.$provide - * - * @description - * - * Use `$provide` to register new providers with the `$injector`. The providers are the factories for the instance. - * The providers share the same name as the instance they create with the `Provider` suffixed to them. - * - * A provider is an object with a `$get()` method. The injector calls the `$get` method to create a new instance of - * a service. The Provider can have additional methods which would allow for configuration of the provider. - * - *
- *   function GreetProvider() {
- *     var salutation = 'Hello';
- *
- *     this.salutation = function(text) {
- *       salutation = text;
- *     };
- *
- *     this.$get = function() {
- *       return function (name) {
- *         return salutation + ' ' + name + '!';
- *       };
- *     };
- *   }
- *
- *   describe('Greeter', function(){
- *
- *     beforeEach(module(function($provide) {
- *       $provide.provider('greet', GreetProvider);
- *     });
- *
- *     it('should greet', inject(function(greet) {
- *       expect(greet('angular')).toEqual('Hello angular!');
- *     }));
- *
- *     it('should allow configuration of salutation', function() {
- *       module(function(greetProvider) {
- *         greetProvider.salutation('Ahoj');
- *       });
- *       inject(function(greet) {
- *         expect(greet('angular')).toEqual('Ahoj angular!');
- *       });
- *     )};
- *
- *   });
- * 
- */ - -/** - * @ngdoc method - * @name AUTO.$provide#provider - * @methodOf AUTO.$provide - * @description - * - * Register a provider for a service. The providers can be retrieved and can have additional configuration methods. - * - * @param {string} name The name of the instance. NOTE: the provider will be available under `name + 'Provider'` key. - * @param {(Object|function())} provider If the provider is: - * - * - `Object`: then it should have a `$get` method. The `$get` method will be invoked using - * {@link AUTO.$injector#invoke $injector.invoke()} when an instance needs to be created. - * - `Constructor`: a new instance of the provider will be created using - * {@link AUTO.$injector#instantiate $injector.instantiate()}, then treated as `object`. - * - * @returns {Object} registered provider instance - */ - -/** - * @ngdoc method - * @name AUTO.$provide#factory - * @methodOf AUTO.$provide - * @description - * - * A short hand for configuring services if only `$get` method is required. - * - * @param {string} name The name of the instance. - * @param {function()} $getFn The $getFn for the instance creation. Internally this is a short hand for - * `$provide.provider(name, {$get: $getFn})`. - * @returns {Object} registered provider instance - */ - - -/** - * @ngdoc method - * @name AUTO.$provide#service - * @methodOf AUTO.$provide - * @description - * - * A short hand for registering service of given class. - * - * @param {string} name The name of the instance. - * @param {Function} constructor A class (constructor function) that will be instantiated. - * @returns {Object} registered provider instance - */ - - -/** - * @ngdoc method - * @name AUTO.$provide#value - * @methodOf AUTO.$provide - * @description - * - * A short hand for configuring services if the `$get` method is a constant. - * - * @param {string} name The name of the instance. - * @param {*} value The value. - * @returns {Object} registered provider instance - */ - - -/** - * @ngdoc method - * @name AUTO.$provide#constant - * @methodOf AUTO.$provide - * @description - * - * A constant value, but unlike {@link AUTO.$provide#value value} it can be injected - * into configuration function (other modules) and it is not interceptable by - * {@link AUTO.$provide#decorator decorator}. - * - * @param {string} name The name of the constant. - * @param {*} value The constant value. - * @returns {Object} registered instance - */ - - -/** - * @ngdoc method - * @name AUTO.$provide#decorator - * @methodOf AUTO.$provide - * @description - * - * Decoration of service, allows the decorator to intercept the service instance creation. The - * returned instance may be the original instance, or a new instance which delegates to the - * original instance. - * - * @param {string} name The name of the service to decorate. - * @param {function()} decorator This function will be invoked when the service needs to be - * instanciated. The function is called using the {@link AUTO.$injector#invoke - * injector.invoke} method and is therefore fully injectable. Local injection arguments: - * - * * `$delegate` - The original service instance, which can be monkey patched, configured, - * decorated or delegated to. - */ - - -function createInjector(modulesToLoad) { - var INSTANTIATING = {}, - providerSuffix = 'Provider', - path = [], - loadedModules = new HashMap(), - providerCache = { - $provide: { - provider: supportObject(provider), - factory: supportObject(factory), - service: supportObject(service), - value: supportObject(value), - constant: supportObject(constant), - decorator: decorator - } - }, - providerInjector = createInternalInjector(providerCache, function() { - throw Error("Unknown provider: " + path.join(' <- ')); - }), - instanceCache = {}, - instanceInjector = (instanceCache.$injector = - createInternalInjector(instanceCache, function(servicename) { - var provider = providerInjector.get(servicename + providerSuffix); - return instanceInjector.invoke(provider.$get, provider); - })); - - - forEach(loadModules(modulesToLoad), function(fn) { instanceInjector.invoke(fn || noop); }); - - return instanceInjector; - - //////////////////////////////////// - // $provider - //////////////////////////////////// - - function supportObject(delegate) { - return function(key, value) { - if (isObject(key)) { - forEach(key, reverseParams(delegate)); - } else { - return delegate(key, value); - } - } - } - - function provider(name, provider_) { - if (isFunction(provider_) || isArray(provider_)) { - provider_ = providerInjector.instantiate(provider_); - } - if (!provider_.$get) { - throw Error('Provider ' + name + ' must define $get factory method.'); - } - return providerCache[name + providerSuffix] = provider_; - } - - function factory(name, factoryFn) { return provider(name, { $get: factoryFn }); } - - function service(name, constructor) { - return factory(name, ['$injector', function($injector) { - return $injector.instantiate(constructor); - }]); - } - - function value(name, value) { return factory(name, valueFn(value)); } - - function constant(name, value) { - providerCache[name] = value; - instanceCache[name] = value; - } - - function decorator(serviceName, decorFn) { - var origProvider = providerInjector.get(serviceName + providerSuffix), - orig$get = origProvider.$get; - - origProvider.$get = function() { - var origInstance = instanceInjector.invoke(orig$get, origProvider); - return instanceInjector.invoke(decorFn, null, {$delegate: origInstance}); - }; - } - - //////////////////////////////////// - // Module Loading - //////////////////////////////////// - function loadModules(modulesToLoad){ - var runBlocks = []; - forEach(modulesToLoad, function(module) { - if (loadedModules.get(module)) return; - loadedModules.put(module, true); - if (isString(module)) { - var moduleFn = angularModule(module); - runBlocks = runBlocks.concat(loadModules(moduleFn.requires)).concat(moduleFn._runBlocks); - - try { - for(var invokeQueue = moduleFn._invokeQueue, i = 0, ii = invokeQueue.length; i < ii; i++) { - var invokeArgs = invokeQueue[i], - provider = invokeArgs[0] == '$injector' - ? providerInjector - : providerInjector.get(invokeArgs[0]); - - provider[invokeArgs[1]].apply(provider, invokeArgs[2]); - } - } catch (e) { - if (e.message) e.message += ' from ' + module; - throw e; - } - } else if (isFunction(module)) { - try { - runBlocks.push(providerInjector.invoke(module)); - } catch (e) { - if (e.message) e.message += ' from ' + module; - throw e; - } - } else if (isArray(module)) { - try { - runBlocks.push(providerInjector.invoke(module)); - } catch (e) { - if (e.message) e.message += ' from ' + String(module[module.length - 1]); - throw e; - } - } else { - assertArgFn(module, 'module'); - } - }); - return runBlocks; - } - - //////////////////////////////////// - // internal Injector - //////////////////////////////////// - - function createInternalInjector(cache, factory) { - - function getService(serviceName) { - if (typeof serviceName !== 'string') { - throw Error('Service name expected'); - } - if (cache.hasOwnProperty(serviceName)) { - if (cache[serviceName] === INSTANTIATING) { - throw Error('Circular dependency: ' + path.join(' <- ')); - } - return cache[serviceName]; - } else { - try { - path.unshift(serviceName); - cache[serviceName] = INSTANTIATING; - return cache[serviceName] = factory(serviceName); - } finally { - path.shift(); - } - } - } - - function invoke(fn, self, locals){ - var args = [], - $inject = annotate(fn), - length, i, - key; - - for(i = 0, length = $inject.length; i < length; i++) { - key = $inject[i]; - args.push( - locals && locals.hasOwnProperty(key) - ? locals[key] - : getService(key) - ); - } - if (!fn.$inject) { - // this means that we must be an array. - fn = fn[length]; - } - - - // Performance optimization: http://jsperf.com/apply-vs-call-vs-invoke - switch (self ? -1 : args.length) { - case 0: return fn(); - case 1: return fn(args[0]); - case 2: return fn(args[0], args[1]); - case 3: return fn(args[0], args[1], args[2]); - case 4: return fn(args[0], args[1], args[2], args[3]); - case 5: return fn(args[0], args[1], args[2], args[3], args[4]); - case 6: return fn(args[0], args[1], args[2], args[3], args[4], args[5]); - case 7: return fn(args[0], args[1], args[2], args[3], args[4], args[5], args[6]); - case 8: return fn(args[0], args[1], args[2], args[3], args[4], args[5], args[6], args[7]); - case 9: return fn(args[0], args[1], args[2], args[3], args[4], args[5], args[6], args[7], args[8]); - case 10: return fn(args[0], args[1], args[2], args[3], args[4], args[5], args[6], args[7], args[8], args[9]); - default: return fn.apply(self, args); - } - } - - function instantiate(Type, locals) { - var Constructor = function() {}, - instance, returnedValue; - - Constructor.prototype = (isArray(Type) ? Type[Type.length - 1] : Type).prototype; - instance = new Constructor(); - returnedValue = invoke(Type, instance, locals); - - return isObject(returnedValue) ? returnedValue : instance; - } - - return { - invoke: invoke, - instantiate: instantiate, - get: getService, - annotate: annotate - }; - } -} -/** - * @ngdoc function - * @name ng.$anchorScroll - * @requires $window - * @requires $location - * @requires $rootScope - * - * @description - * When called, it checks current value of `$location.hash()` and scroll to related element, - * according to rules specified in - * {@link http://dev.w3.org/html5/spec/Overview.html#the-indicated-part-of-the-document Html5 spec}. - * - * It also watches the `$location.hash()` and scroll whenever it changes to match any anchor. - * This can be disabled by calling `$anchorScrollProvider.disableAutoScrolling()`. - */ -function $AnchorScrollProvider() { - - var autoScrollingEnabled = true; - - this.disableAutoScrolling = function() { - autoScrollingEnabled = false; - }; - - this.$get = ['$window', '$location', '$rootScope', function($window, $location, $rootScope) { - var document = $window.document; - - // helper function to get first anchor from a NodeList - // can't use filter.filter, as it accepts only instances of Array - // and IE can't convert NodeList to an array using [].slice - // TODO(vojta): use filter if we change it to accept lists as well - function getFirstAnchor(list) { - var result = null; - forEach(list, function(element) { - if (!result && lowercase(element.nodeName) === 'a') result = element; - }); - return result; - } - - function scroll() { - var hash = $location.hash(), elm; - - // empty hash, scroll to the top of the page - if (!hash) $window.scrollTo(0, 0); - - // element with given id - else if ((elm = document.getElementById(hash))) elm.scrollIntoView(); - - // first anchor with given name :-D - else if ((elm = getFirstAnchor(document.getElementsByName(hash)))) elm.scrollIntoView(); - - // no element and hash == 'top', scroll to the top of the page - else if (hash === 'top') $window.scrollTo(0, 0); - } - - // does not scroll when users clicks on anchor link that is currently on - // (no url change, no $location.hash() change), browser native does scroll - if (autoScrollingEnabled) { - $rootScope.$watch(function autoScrollWatch() {return $location.hash();}, - function autoScrollWatchAction() { - $rootScope.$evalAsync(scroll); - }); - } - - return scroll; - }]; -} - -/** - * ! This is a private undocumented service ! - * - * @name ng.$browser - * @requires $log - * @description - * This object has two goals: - * - * - hide all the global state in the browser caused by the window object - * - abstract away all the browser specific features and inconsistencies - * - * For tests we provide {@link ngMock.$browser mock implementation} of the `$browser` - * service, which can be used for convenient testing of the application without the interaction with - * the real browser apis. - */ -/** - * @param {object} window The global window object. - * @param {object} document jQuery wrapped document. - * @param {function()} XHR XMLHttpRequest constructor. - * @param {object} $log console.log or an object with the same interface. - * @param {object} $sniffer $sniffer service - */ -function Browser(window, document, $log, $sniffer) { - var self = this, - rawDocument = document[0], - location = window.location, - history = window.history, - setTimeout = window.setTimeout, - clearTimeout = window.clearTimeout, - pendingDeferIds = {}; - - self.isMock = false; - - var outstandingRequestCount = 0; - var outstandingRequestCallbacks = []; - - // TODO(vojta): remove this temporary api - self.$$completeOutstandingRequest = completeOutstandingRequest; - self.$$incOutstandingRequestCount = function() { outstandingRequestCount++; }; - - /** - * Executes the `fn` function(supports currying) and decrements the `outstandingRequestCallbacks` - * counter. If the counter reaches 0, all the `outstandingRequestCallbacks` are executed. - */ - function completeOutstandingRequest(fn) { - try { - fn.apply(null, sliceArgs(arguments, 1)); - } finally { - outstandingRequestCount--; - if (outstandingRequestCount === 0) { - while(outstandingRequestCallbacks.length) { - try { - outstandingRequestCallbacks.pop()(); - } catch (e) { - $log.error(e); - } - } - } - } - } - - /** - * @private - * Note: this method is used only by scenario runner - * TODO(vojta): prefix this method with $$ ? - * @param {function()} callback Function that will be called when no outstanding request - */ - self.notifyWhenNoOutstandingRequests = function(callback) { - // force browser to execute all pollFns - this is needed so that cookies and other pollers fire - // at some deterministic time in respect to the test runner's actions. Leaving things up to the - // regular poller would result in flaky tests. - forEach(pollFns, function(pollFn){ pollFn(); }); - - if (outstandingRequestCount === 0) { - callback(); - } else { - outstandingRequestCallbacks.push(callback); - } - }; - - ////////////////////////////////////////////////////////////// - // Poll Watcher API - ////////////////////////////////////////////////////////////// - var pollFns = [], - pollTimeout; - - /** - * @name ng.$browser#addPollFn - * @methodOf ng.$browser - * - * @param {function()} fn Poll function to add - * - * @description - * Adds a function to the list of functions that poller periodically executes, - * and starts polling if not started yet. - * - * @returns {function()} the added function - */ - self.addPollFn = function(fn) { - if (isUndefined(pollTimeout)) startPoller(100, setTimeout); - pollFns.push(fn); - return fn; - }; - - /** - * @param {number} interval How often should browser call poll functions (ms) - * @param {function()} setTimeout Reference to a real or fake `setTimeout` function. - * - * @description - * Configures the poller to run in the specified intervals, using the specified - * setTimeout fn and kicks it off. - */ - function startPoller(interval, setTimeout) { - (function check() { - forEach(pollFns, function(pollFn){ pollFn(); }); - pollTimeout = setTimeout(check, interval); - })(); - } - - ////////////////////////////////////////////////////////////// - // URL API - ////////////////////////////////////////////////////////////// - - var lastBrowserUrl = location.href, - baseElement = document.find('base'); - - /** - * @name ng.$browser#url - * @methodOf ng.$browser - * - * @description - * GETTER: - * Without any argument, this method just returns current value of location.href. - * - * SETTER: - * With at least one argument, this method sets url to new value. - * If html5 history api supported, pushState/replaceState is used, otherwise - * location.href/location.replace is used. - * Returns its own instance to allow chaining - * - * NOTE: this api is intended for use only by the $location service. Please use the - * {@link ng.$location $location service} to change url. - * - * @param {string} url New url (when used as setter) - * @param {boolean=} replace Should new url replace current history record ? - */ - self.url = function(url, replace) { - // setter - if (url) { - if (lastBrowserUrl == url) return; - lastBrowserUrl = url; - if ($sniffer.history) { - if (replace) history.replaceState(null, '', url); - else { - history.pushState(null, '', url); - // Crazy Opera Bug: http://my.opera.com/community/forums/topic.dml?id=1185462 - baseElement.attr('href', baseElement.attr('href')); - } - } else { - if (replace) location.replace(url); - else location.href = url; - } - return self; - // getter - } else { - // the replacement is a workaround for https://bugzilla.mozilla.org/show_bug.cgi?id=407172 - return location.href.replace(/%27/g,"'"); - } - }; - - var urlChangeListeners = [], - urlChangeInit = false; - - function fireUrlChange() { - if (lastBrowserUrl == self.url()) return; - - lastBrowserUrl = self.url(); - forEach(urlChangeListeners, function(listener) { - listener(self.url()); - }); - } - - /** - * @name ng.$browser#onUrlChange - * @methodOf ng.$browser - * @TODO(vojta): refactor to use node's syntax for events - * - * @description - * Register callback function that will be called, when url changes. - * - * It's only called when the url is changed by outside of angular: - * - users types different url into address bar - * - users clicks on history (forward/back) button - * - users clicks on a link - * - * It's not called when url is changed by $browser.url() method - * - * The listener gets called with new url as parameter. - * - * NOTE: this api is intended for use only by the $location service. Please use the - * {@link ng.$location $location service} to monitor url changes in angular apps. - * - * @param {function(string)} listener Listener function to be called when url changes. - * @return {function(string)} Returns the registered listener fn - handy if the fn is anonymous. - */ - self.onUrlChange = function(callback) { - if (!urlChangeInit) { - // We listen on both (hashchange/popstate) when available, as some browsers (e.g. Opera) - // don't fire popstate when users change the address bar and don't fire hashchange when url - // changed by push/replaceState - - // html5 history api - popstate project - if ($sniffer.history) jqLite(window).bind('popstate', fireUrlChange); - // hashchange project - if ($sniffer.hashchange) jqLite(window).bind('hashchange', fireUrlChange); - // polling - else self.addPollFn(fireUrlChange); - - urlChangeInit = true; - } - - urlChangeListeners.push(callback); - return callback; - }; - - ////////////////////////////////////////////////////////////// - // Misc API - ////////////////////////////////////////////////////////////// - - /** - * Returns current - * (always relative - without domain) - * - * @returns {string=} - */ - self.baseHref = function() { - var href = baseElement.attr('href'); - return href ? href.replace(/^https?\:\/\/[^\/]*/, '') : ''; - }; - - ////////////////////////////////////////////////////////////// - // Cookies API - ////////////////////////////////////////////////////////////// - var lastCookies = {}; - var lastCookieString = ''; - var cookiePath = self.baseHref(); - - /** - * @name ng.$browser#cookies - * @methodOf ng.$browser - * - * @param {string=} name Cookie name - * @param {string=} value Cokkie value - * - * @description - * The cookies method provides a 'private' low level access to browser cookies. - * It is not meant to be used directly, use the $cookie service instead. - * - * The return values vary depending on the arguments that the method was called with as follows: - *
    - *
  • cookies() -> hash of all cookies, this is NOT a copy of the internal state, so do not modify it
  • - *
  • cookies(name, value) -> set name to value, if value is undefined delete the cookie
  • - *
  • cookies(name) -> the same as (name, undefined) == DELETES (no one calls it right now that way)
  • - *
- * - * @returns {Object} Hash of all cookies (if called without any parameter) - */ - self.cookies = function(name, value) { - var cookieLength, cookieArray, cookie, i, index; - - if (name) { - if (value === undefined) { - rawDocument.cookie = escape(name) + "=;path=" + cookiePath + ";expires=Thu, 01 Jan 1970 00:00:00 GMT"; - } else { - if (isString(value)) { - cookieLength = (rawDocument.cookie = escape(name) + '=' + escape(value) + ';path=' + cookiePath).length + 1; - - // per http://www.ietf.org/rfc/rfc2109.txt browser must allow at minimum: - // - 300 cookies - // - 20 cookies per unique domain - // - 4096 bytes per cookie - if (cookieLength > 4096) { - $log.warn("Cookie '"+ name +"' possibly not set or overflowed because it was too large ("+ - cookieLength + " > 4096 bytes)!"); - } - } - } - } else { - if (rawDocument.cookie !== lastCookieString) { - lastCookieString = rawDocument.cookie; - cookieArray = lastCookieString.split("; "); - lastCookies = {}; - - for (i = 0; i < cookieArray.length; i++) { - cookie = cookieArray[i]; - index = cookie.indexOf('='); - if (index > 0) { //ignore nameless cookies - lastCookies[unescape(cookie.substring(0, index))] = unescape(cookie.substring(index + 1)); - } - } - } - return lastCookies; - } - }; - - - /** - * @name ng.$browser#defer - * @methodOf ng.$browser - * @param {function()} fn A function, who's execution should be defered. - * @param {number=} [delay=0] of milliseconds to defer the function execution. - * @returns {*} DeferId that can be used to cancel the task via `$browser.defer.cancel()`. - * - * @description - * Executes a fn asynchroniously via `setTimeout(fn, delay)`. - * - * Unlike when calling `setTimeout` directly, in test this function is mocked and instead of using - * `setTimeout` in tests, the fns are queued in an array, which can be programmatically flushed - * via `$browser.defer.flush()`. - * - */ - self.defer = function(fn, delay) { - var timeoutId; - outstandingRequestCount++; - timeoutId = setTimeout(function() { - delete pendingDeferIds[timeoutId]; - completeOutstandingRequest(fn); - }, delay || 0); - pendingDeferIds[timeoutId] = true; - return timeoutId; - }; - - - /** - * @name ng.$browser#defer.cancel - * @methodOf ng.$browser.defer - * - * @description - * Cancels a defered task identified with `deferId`. - * - * @param {*} deferId Token returned by the `$browser.defer` function. - * @returns {boolean} Returns `true` if the task hasn't executed yet and was successfuly canceled. - */ - self.defer.cancel = function(deferId) { - if (pendingDeferIds[deferId]) { - delete pendingDeferIds[deferId]; - clearTimeout(deferId); - completeOutstandingRequest(noop); - return true; - } - return false; - }; - -} - -function $BrowserProvider(){ - this.$get = ['$window', '$log', '$sniffer', '$document', - function( $window, $log, $sniffer, $document){ - return new Browser($window, $document, $log, $sniffer); - }]; -} -/** - * @ngdoc object - * @name ng.$cacheFactory - * - * @description - * Factory that constructs cache objects. - * - * - * @param {string} cacheId Name or id of the newly created cache. - * @param {object=} options Options object that specifies the cache behavior. Properties: - * - * - `{number=}` `capacity` — turns the cache into LRU cache. - * - * @returns {object} Newly created cache object with the following set of methods: - * - * - `{object}` `info()` — Returns id, size, and options of cache. - * - `{void}` `put({string} key, {*} value)` — Puts a new key-value pair into the cache. - * - `{{*}}` `get({string} key)` — Returns cached value for `key` or undefined for cache miss. - * - `{void}` `remove({string} key)` — Removes a key-value pair from the cache. - * - `{void}` `removeAll()` — Removes all cached values. - * - `{void}` `destroy()` — Removes references to this cache from $cacheFactory. - * - */ -function $CacheFactoryProvider() { - - this.$get = function() { - var caches = {}; - - function cacheFactory(cacheId, options) { - if (cacheId in caches) { - throw Error('cacheId ' + cacheId + ' taken'); - } - - var size = 0, - stats = extend({}, options, {id: cacheId}), - data = {}, - capacity = (options && options.capacity) || Number.MAX_VALUE, - lruHash = {}, - freshEnd = null, - staleEnd = null; - - return caches[cacheId] = { - - put: function(key, value) { - var lruEntry = lruHash[key] || (lruHash[key] = {key: key}); - - refresh(lruEntry); - - if (isUndefined(value)) return; - if (!(key in data)) size++; - data[key] = value; - - if (size > capacity) { - this.remove(staleEnd.key); - } - }, - - - get: function(key) { - var lruEntry = lruHash[key]; - - if (!lruEntry) return; - - refresh(lruEntry); - - return data[key]; - }, - - - remove: function(key) { - var lruEntry = lruHash[key]; - - if (!lruEntry) return; - - if (lruEntry == freshEnd) freshEnd = lruEntry.p; - if (lruEntry == staleEnd) staleEnd = lruEntry.n; - link(lruEntry.n,lruEntry.p); - - delete lruHash[key]; - delete data[key]; - size--; - }, - - - removeAll: function() { - data = {}; - size = 0; - lruHash = {}; - freshEnd = staleEnd = null; - }, - - - destroy: function() { - data = null; - stats = null; - lruHash = null; - delete caches[cacheId]; - }, - - - info: function() { - return extend({}, stats, {size: size}); - } - }; - - - /** - * makes the `entry` the freshEnd of the LRU linked list - */ - function refresh(entry) { - if (entry != freshEnd) { - if (!staleEnd) { - staleEnd = entry; - } else if (staleEnd == entry) { - staleEnd = entry.n; - } - - link(entry.n, entry.p); - link(entry, freshEnd); - freshEnd = entry; - freshEnd.n = null; - } - } - - - /** - * bidirectionally links two entries of the LRU linked list - */ - function link(nextEntry, prevEntry) { - if (nextEntry != prevEntry) { - if (nextEntry) nextEntry.p = prevEntry; //p stands for previous, 'prev' didn't minify - if (prevEntry) prevEntry.n = nextEntry; //n stands for next, 'next' didn't minify - } - } - } - - - cacheFactory.info = function() { - var info = {}; - forEach(caches, function(cache, cacheId) { - info[cacheId] = cache.info(); - }); - return info; - }; - - - cacheFactory.get = function(cacheId) { - return caches[cacheId]; - }; - - - return cacheFactory; - }; -} - -/** - * @ngdoc object - * @name ng.$templateCache - * - * @description - * Cache used for storing html templates. - * - * See {@link ng.$cacheFactory $cacheFactory}. - * - */ -function $TemplateCacheProvider() { - this.$get = ['$cacheFactory', function($cacheFactory) { - return $cacheFactory('templates'); - }]; -} - -/* ! VARIABLE/FUNCTION NAMING CONVENTIONS THAT APPLY TO THIS FILE! - * - * DOM-related variables: - * - * - "node" - DOM Node - * - "element" - DOM Element or Node - * - "$node" or "$element" - jqLite-wrapped node or element - * - * - * Compiler related stuff: - * - * - "linkFn" - linking fn of a single directive - * - "nodeLinkFn" - function that aggregates all linking fns for a particular node - * - "childLinkFn" - function that aggregates all linking fns for child nodes of a particular node - * - "compositeLinkFn" - function that aggregates all linking fns for a compilation root (nodeList) - */ - - -var NON_ASSIGNABLE_MODEL_EXPRESSION = 'Non-assignable model expression: '; - - -/** - * @ngdoc function - * @name ng.$compile - * @function - * - * @description - * Compiles a piece of HTML string or DOM into a template and produces a template function, which - * can then be used to link {@link ng.$rootScope.Scope scope} and the template together. - * - * The compilation is a process of walking the DOM tree and trying to match DOM elements to - * {@link ng.$compileProvider#directive directives}. For each match it - * executes corresponding template function and collects the - * instance functions into a single template function which is then returned. - * - * The template function can then be used once to produce the view or as it is the case with - * {@link ng.directive:ngRepeat repeater} many-times, in which - * case each call results in a view that is a DOM clone of the original template. - * - - - -
-
-
-
-
-
- - it('should auto compile', function() { - expect(element('div[compile]').text()).toBe('Hello Angular'); - input('html').enter('{{name}}!'); - expect(element('div[compile]').text()).toBe('Angular!'); - }); - -
- - * - * - * @param {string|DOMElement} element Element or HTML string to compile into a template function. - * @param {function(angular.Scope[, cloneAttachFn]} transclude function available to directives. - * @param {number} maxPriority only apply directives lower then given priority (Only effects the - * root element(s), not their children) - * @returns {function(scope[, cloneAttachFn])} a link function which is used to bind template - * (a DOM element/tree) to a scope. Where: - * - * * `scope` - A {@link ng.$rootScope.Scope Scope} to bind to. - * * `cloneAttachFn` - If `cloneAttachFn` is provided, then the link function will clone the - * `template` and call the `cloneAttachFn` function allowing the caller to attach the - * cloned elements to the DOM document at the appropriate place. The `cloneAttachFn` is - * called as:
`cloneAttachFn(clonedElement, scope)` where: - * - * * `clonedElement` - is a clone of the original `element` passed into the compiler. - * * `scope` - is the current scope with which the linking function is working with. - * - * Calling the linking function returns the element of the template. It is either the original element - * passed in, or the clone of the element if the `cloneAttachFn` is provided. - * - * After linking the view is not updated until after a call to $digest which typically is done by - * Angular automatically. - * - * If you need access to the bound view, there are two ways to do it: - * - * - If you are not asking the linking function to clone the template, create the DOM element(s) - * before you send them to the compiler and keep this reference around. - *
- *     var element = $compile('

{{total}}

')(scope); - *
- * - * - if on the other hand, you need the element to be cloned, the view reference from the original - * example would not point to the clone, but rather to the original template that was cloned. In - * this case, you can access the clone via the cloneAttachFn: - *
- *     var templateHTML = angular.element('

{{total}}

'), - * scope = ....; - * - * var clonedElement = $compile(templateHTML)(scope, function(clonedElement, scope) { - * //attach the clone to DOM document at the right place - * }); - * - * //now we have reference to the cloned DOM via `clone` - *
- * - * - * For information on how the compiler works, see the - * {@link guide/compiler Angular HTML Compiler} section of the Developer Guide. - */ - - -/** - * @ngdoc service - * @name ng.$compileProvider - * @function - * - * @description - */ -$CompileProvider.$inject = ['$provide']; -function $CompileProvider($provide) { - var hasDirectives = {}, - Suffix = 'Directive', - COMMENT_DIRECTIVE_REGEXP = /^\s*directive\:\s*([\d\w\-_]+)\s+(.*)$/, - CLASS_DIRECTIVE_REGEXP = /(([\d\w\-_]+)(?:\:([^;]+))?;?)/, - MULTI_ROOT_TEMPLATE_ERROR = 'Template must have exactly one root element. was: ', - urlSanitizationWhitelist = /^\s*(https?|ftp|mailto):/; - - - /** - * @ngdoc function - * @name ng.$compileProvider#directive - * @methodOf ng.$compileProvider - * @function - * - * @description - * Register a new directives with the compiler. - * - * @param {string} name Name of the directive in camel-case. (ie ngBind which will match as - * ng-bind). - * @param {function} directiveFactory An injectable directive factroy function. See {@link guide/directive} for more - * info. - * @returns {ng.$compileProvider} Self for chaining. - */ - this.directive = function registerDirective(name, directiveFactory) { - if (isString(name)) { - assertArg(directiveFactory, 'directive'); - if (!hasDirectives.hasOwnProperty(name)) { - hasDirectives[name] = []; - $provide.factory(name + Suffix, ['$injector', '$exceptionHandler', - function($injector, $exceptionHandler) { - var directives = []; - forEach(hasDirectives[name], function(directiveFactory) { - try { - var directive = $injector.invoke(directiveFactory); - if (isFunction(directive)) { - directive = { compile: valueFn(directive) }; - } else if (!directive.compile && directive.link) { - directive.compile = valueFn(directive.link); - } - directive.priority = directive.priority || 0; - directive.name = directive.name || name; - directive.require = directive.require || (directive.controller && directive.name); - directive.restrict = directive.restrict || 'A'; - directives.push(directive); - } catch (e) { - $exceptionHandler(e); - } - }); - return directives; - }]); - } - hasDirectives[name].push(directiveFactory); - } else { - forEach(name, reverseParams(registerDirective)); - } - return this; - }; - - - /** - * @ngdoc function - * @name ng.$compileProvider#urlSanitizationWhitelist - * @methodOf ng.$compileProvider - * @function - * - * @description - * Retrieves or overrides the default regular expression that is used for whitelisting of safe - * urls during a[href] sanitization. - * - * The sanitization is a security measure aimed at prevent XSS attacks via html links. - * - * Any url about to be assigned to a[href] via data-binding is first normalized and turned into an - * absolute url. Afterwards the url is matched against the `urlSanitizationWhitelist` regular - * expression. If a match is found the original url is written into the dom. Otherwise the - * absolute url is prefixed with `'unsafe:'` string and only then it is written into the DOM. - * - * @param {RegExp=} regexp New regexp to whitelist urls with. - * @returns {RegExp|ng.$compileProvider} Current RegExp if called without value or self for - * chaining otherwise. - */ - this.urlSanitizationWhitelist = function(regexp) { - if (isDefined(regexp)) { - urlSanitizationWhitelist = regexp; - return this; - } - return urlSanitizationWhitelist; - }; - - - this.$get = [ - '$injector', '$interpolate', '$exceptionHandler', '$http', '$templateCache', '$parse', - '$controller', '$rootScope', '$document', - function($injector, $interpolate, $exceptionHandler, $http, $templateCache, $parse, - $controller, $rootScope, $document) { - - var Attributes = function(element, attr) { - this.$$element = element; - this.$attr = attr || {}; - }; - - Attributes.prototype = { - $normalize: directiveNormalize, - - - /** - * Set a normalized attribute on the element in a way such that all directives - * can share the attribute. This function properly handles boolean attributes. - * @param {string} key Normalized key. (ie ngAttribute) - * @param {string|boolean} value The value to set. If `null` attribute will be deleted. - * @param {boolean=} writeAttr If false, does not write the value to DOM element attribute. - * Defaults to true. - * @param {string=} attrName Optional none normalized name. Defaults to key. - */ - $set: function(key, value, writeAttr, attrName) { - var booleanKey = getBooleanAttrName(this.$$element[0], key), - $$observers = this.$$observers, - normalizedVal; - - if (booleanKey) { - this.$$element.prop(key, value); - attrName = booleanKey; - } - - this[key] = value; - - // translate normalized key to actual key - if (attrName) { - this.$attr[key] = attrName; - } else { - attrName = this.$attr[key]; - if (!attrName) { - this.$attr[key] = attrName = snake_case(key, '-'); - } - } - - - // sanitize a[href] values - if (nodeName_(this.$$element[0]) === 'A' && key === 'href') { - urlSanitizationNode.setAttribute('href', value); - - // href property always returns normalized absolute url, so we can match against that - normalizedVal = urlSanitizationNode.href; - if (!normalizedVal.match(urlSanitizationWhitelist)) { - this[key] = value = 'unsafe:' + normalizedVal; - } - } - - - if (writeAttr !== false) { - if (value === null || value === undefined) { - this.$$element.removeAttr(attrName); - } else { - this.$$element.attr(attrName, value); - } - } - - // fire observers - $$observers && forEach($$observers[key], function(fn) { - try { - fn(value); - } catch (e) { - $exceptionHandler(e); - } - }); - }, - - - /** - * Observe an interpolated attribute. - * The observer will never be called, if given attribute is not interpolated. - * - * @param {string} key Normalized key. (ie ngAttribute) . - * @param {function(*)} fn Function that will be called whenever the attribute value changes. - * @returns {function(*)} the `fn` Function passed in. - */ - $observe: function(key, fn) { - var attrs = this, - $$observers = (attrs.$$observers || (attrs.$$observers = {})), - listeners = ($$observers[key] || ($$observers[key] = [])); - - listeners.push(fn); - $rootScope.$evalAsync(function() { - if (!listeners.$$inter) { - // no one registered attribute interpolation function, so lets call it manually - fn(attrs[key]); - } - }); - return fn; - } - }; - - var urlSanitizationNode = $document[0].createElement('a'), - startSymbol = $interpolate.startSymbol(), - endSymbol = $interpolate.endSymbol(), - denormalizeTemplate = (startSymbol == '{{' || endSymbol == '}}') - ? identity - : function denormalizeTemplate(template) { - return template.replace(/\{\{/g, startSymbol).replace(/}}/g, endSymbol); - }; - - - return compile; - - //================================ - - function compile($compileNodes, transcludeFn, maxPriority) { - if (!($compileNodes instanceof jqLite)) { - // jquery always rewraps, where as we need to preserve the original selector so that we can modify it. - $compileNodes = jqLite($compileNodes); - } - // We can not compile top level text elements since text nodes can be merged and we will - // not be able to attach scope data to them, so we will wrap them in - forEach($compileNodes, function(node, index){ - if (node.nodeType == 3 /* text node */ && node.nodeValue.match(/\S+/) /* non-empty */ ) { - $compileNodes[index] = jqLite(node).wrap('').parent()[0]; - } - }); - var compositeLinkFn = compileNodes($compileNodes, transcludeFn, $compileNodes, maxPriority); - return function publicLinkFn(scope, cloneConnectFn){ - assertArg(scope, 'scope'); - // important!!: we must call our jqLite.clone() since the jQuery one is trying to be smart - // and sometimes changes the structure of the DOM. - var $linkNode = cloneConnectFn - ? JQLitePrototype.clone.call($compileNodes) // IMPORTANT!!! - : $compileNodes; - - // Attach scope only to non-text nodes. - for(var i = 0, ii = $linkNode.length; i - addDirective(directives, - directiveNormalize(nodeName_(node).toLowerCase()), 'E', maxPriority); - - // iterate over the attributes - for (var attr, name, nName, value, nAttrs = node.attributes, - j = 0, jj = nAttrs && nAttrs.length; j < jj; j++) { - attr = nAttrs[j]; - if (attr.specified) { - name = attr.name; - nName = directiveNormalize(name.toLowerCase()); - attrsMap[nName] = name; - attrs[nName] = value = trim((msie && name == 'href') - ? decodeURIComponent(node.getAttribute(name, 2)) - : attr.value); - if (getBooleanAttrName(node, nName)) { - attrs[nName] = true; // presence means true - } - addAttrInterpolateDirective(node, directives, value, nName); - addDirective(directives, nName, 'A', maxPriority); - } - } - - // use class as directive - className = node.className; - if (isString(className) && className !== '') { - while (match = CLASS_DIRECTIVE_REGEXP.exec(className)) { - nName = directiveNormalize(match[2]); - if (addDirective(directives, nName, 'C', maxPriority)) { - attrs[nName] = trim(match[3]); - } - className = className.substr(match.index + match[0].length); - } - } - break; - case 3: /* Text Node */ - addTextInterpolateDirective(directives, node.nodeValue); - break; - case 8: /* Comment */ - try { - match = COMMENT_DIRECTIVE_REGEXP.exec(node.nodeValue); - if (match) { - nName = directiveNormalize(match[1]); - if (addDirective(directives, nName, 'M', maxPriority)) { - attrs[nName] = trim(match[2]); - } - } - } catch (e) { - // turns out that under some circumstances IE9 throws errors when one attempts to read comment's node value. - // Just ignore it and continue. (Can't seem to reproduce in test case.) - } - break; - } - - directives.sort(byPriority); - return directives; - } - - - /** - * Once the directives have been collected their compile functions is executed. This method - * is responsible for inlining directive templates as well as terminating the application - * of the directives if the terminal directive has been reached.. - * - * @param {Array} directives Array of collected directives to execute their compile function. - * this needs to be pre-sorted by priority order. - * @param {Node} compileNode The raw DOM node to apply the compile functions to - * @param {Object} templateAttrs The shared attribute function - * @param {function(angular.Scope[, cloneAttachFn]} transcludeFn A linking function, where the - * scope argument is auto-generated to the new child of the transcluded parent scope. - * @param {DOMElement} $rootElement If we are working on the root of the compile tree then this - * argument has the root jqLite array so that we can replace widgets on it. - * @returns linkFn - */ - function applyDirectivesToNode(directives, compileNode, templateAttrs, transcludeFn, $rootElement) { - var terminalPriority = -Number.MAX_VALUE, - preLinkFns = [], - postLinkFns = [], - newScopeDirective = null, - newIsolateScopeDirective = null, - templateDirective = null, - $compileNode = templateAttrs.$$element = jqLite(compileNode), - directive, - directiveName, - $template, - transcludeDirective, - childTranscludeFn = transcludeFn, - controllerDirectives, - linkFn, - directiveValue; - - // executes all directives on the current element - for(var i = 0, ii = directives.length; i < ii; i++) { - directive = directives[i]; - $template = undefined; - - if (terminalPriority > directive.priority) { - break; // prevent further processing of directives - } - - if (directiveValue = directive.scope) { - assertNoDuplicate('isolated scope', newIsolateScopeDirective, directive, $compileNode); - if (isObject(directiveValue)) { - safeAddClass($compileNode, 'ng-isolate-scope'); - newIsolateScopeDirective = directive; - } - safeAddClass($compileNode, 'ng-scope'); - newScopeDirective = newScopeDirective || directive; - } - - directiveName = directive.name; - - if (directiveValue = directive.controller) { - controllerDirectives = controllerDirectives || {}; - assertNoDuplicate("'" + directiveName + "' controller", - controllerDirectives[directiveName], directive, $compileNode); - controllerDirectives[directiveName] = directive; - } - - if (directiveValue = directive.transclude) { - assertNoDuplicate('transclusion', transcludeDirective, directive, $compileNode); - transcludeDirective = directive; - terminalPriority = directive.priority; - if (directiveValue == 'element') { - $template = jqLite(compileNode); - $compileNode = templateAttrs.$$element = - jqLite(document.createComment(' ' + directiveName + ': ' + templateAttrs[directiveName] + ' ')); - compileNode = $compileNode[0]; - replaceWith($rootElement, jqLite($template[0]), compileNode); - childTranscludeFn = compile($template, transcludeFn, terminalPriority); - } else { - $template = jqLite(JQLiteClone(compileNode)).contents(); - $compileNode.html(''); // clear contents - childTranscludeFn = compile($template, transcludeFn); - } - } - - if ((directiveValue = directive.template)) { - assertNoDuplicate('template', templateDirective, directive, $compileNode); - templateDirective = directive; - directiveValue = denormalizeTemplate(directiveValue); - - if (directive.replace) { - $template = jqLite('
' + - trim(directiveValue) + - '
').contents(); - compileNode = $template[0]; - - if ($template.length != 1 || compileNode.nodeType !== 1) { - throw new Error(MULTI_ROOT_TEMPLATE_ERROR + directiveValue); - } - - replaceWith($rootElement, $compileNode, compileNode); - - var newTemplateAttrs = {$attr: {}}; - - // combine directives from the original node and from the template: - // - take the array of directives for this element - // - split it into two parts, those that were already applied and those that weren't - // - collect directives from the template, add them to the second group and sort them - // - append the second group with new directives to the first group - directives = directives.concat( - collectDirectives( - compileNode, - directives.splice(i + 1, directives.length - (i + 1)), - newTemplateAttrs - ) - ); - mergeTemplateAttributes(templateAttrs, newTemplateAttrs); - - ii = directives.length; - } else { - $compileNode.html(directiveValue); - } - } - - if (directive.templateUrl) { - assertNoDuplicate('template', templateDirective, directive, $compileNode); - templateDirective = directive; - nodeLinkFn = compileTemplateUrl(directives.splice(i, directives.length - i), - nodeLinkFn, $compileNode, templateAttrs, $rootElement, directive.replace, - childTranscludeFn); - ii = directives.length; - } else if (directive.compile) { - try { - linkFn = directive.compile($compileNode, templateAttrs, childTranscludeFn); - if (isFunction(linkFn)) { - addLinkFns(null, linkFn); - } else if (linkFn) { - addLinkFns(linkFn.pre, linkFn.post); - } - } catch (e) { - $exceptionHandler(e, startingTag($compileNode)); - } - } - - if (directive.terminal) { - nodeLinkFn.terminal = true; - terminalPriority = Math.max(terminalPriority, directive.priority); - } - - } - - nodeLinkFn.scope = newScopeDirective && newScopeDirective.scope; - nodeLinkFn.transclude = transcludeDirective && childTranscludeFn; - - // might be normal or delayed nodeLinkFn depending on if templateUrl is present - return nodeLinkFn; - - //////////////////// - - function addLinkFns(pre, post) { - if (pre) { - pre.require = directive.require; - preLinkFns.push(pre); - } - if (post) { - post.require = directive.require; - postLinkFns.push(post); - } - } - - - function getControllers(require, $element) { - var value, retrievalMethod = 'data', optional = false; - if (isString(require)) { - while((value = require.charAt(0)) == '^' || value == '?') { - require = require.substr(1); - if (value == '^') { - retrievalMethod = 'inheritedData'; - } - optional = optional || value == '?'; - } - value = $element[retrievalMethod]('$' + require + 'Controller'); - if (!value && !optional) { - throw Error("No controller: " + require); - } - return value; - } else if (isArray(require)) { - value = []; - forEach(require, function(require) { - value.push(getControllers(require, $element)); - }); - } - return value; - } - - - function nodeLinkFn(childLinkFn, scope, linkNode, $rootElement, boundTranscludeFn) { - var attrs, $element, i, ii, linkFn, controller; - - if (compileNode === linkNode) { - attrs = templateAttrs; - } else { - attrs = shallowCopy(templateAttrs, new Attributes(jqLite(linkNode), templateAttrs.$attr)); - } - $element = attrs.$$element; - - if (newIsolateScopeDirective) { - var LOCAL_REGEXP = /^\s*([@=&])\s*(\w*)\s*$/; - - var parentScope = scope.$parent || scope; - - forEach(newIsolateScopeDirective.scope, function(definiton, scopeName) { - var match = definiton.match(LOCAL_REGEXP) || [], - attrName = match[2]|| scopeName, - mode = match[1], // @, =, or & - lastValue, - parentGet, parentSet; - - scope.$$isolateBindings[scopeName] = mode + attrName; - - switch (mode) { - - case '@': { - attrs.$observe(attrName, function(value) { - scope[scopeName] = value; - }); - attrs.$$observers[attrName].$$scope = parentScope; - break; - } - - case '=': { - parentGet = $parse(attrs[attrName]); - parentSet = parentGet.assign || function() { - // reset the change, or we will throw this exception on every $digest - lastValue = scope[scopeName] = parentGet(parentScope); - throw Error(NON_ASSIGNABLE_MODEL_EXPRESSION + attrs[attrName] + - ' (directive: ' + newIsolateScopeDirective.name + ')'); - }; - lastValue = scope[scopeName] = parentGet(parentScope); - scope.$watch(function parentValueWatch() { - var parentValue = parentGet(parentScope); - - if (parentValue !== scope[scopeName]) { - // we are out of sync and need to copy - if (parentValue !== lastValue) { - // parent changed and it has precedence - lastValue = scope[scopeName] = parentValue; - } else { - // if the parent can be assigned then do so - parentSet(parentScope, parentValue = lastValue = scope[scopeName]); - } - } - return parentValue; - }); - break; - } - - case '&': { - parentGet = $parse(attrs[attrName]); - scope[scopeName] = function(locals) { - return parentGet(parentScope, locals); - } - break; - } - - default: { - throw Error('Invalid isolate scope definition for directive ' + - newIsolateScopeDirective.name + ': ' + definiton); - } - } - }); - } - - if (controllerDirectives) { - forEach(controllerDirectives, function(directive) { - var locals = { - $scope: scope, - $element: $element, - $attrs: attrs, - $transclude: boundTranscludeFn - }; - - controller = directive.controller; - if (controller == '@') { - controller = attrs[directive.name]; - } - - $element.data( - '$' + directive.name + 'Controller', - $controller(controller, locals)); - }); - } - - // PRELINKING - for(i = 0, ii = preLinkFns.length; i < ii; i++) { - try { - linkFn = preLinkFns[i]; - linkFn(scope, $element, attrs, - linkFn.require && getControllers(linkFn.require, $element)); - } catch (e) { - $exceptionHandler(e, startingTag($element)); - } - } - - // RECURSION - childLinkFn && childLinkFn(scope, linkNode.childNodes, undefined, boundTranscludeFn); - - // POSTLINKING - for(i = 0, ii = postLinkFns.length; i < ii; i++) { - try { - linkFn = postLinkFns[i]; - linkFn(scope, $element, attrs, - linkFn.require && getControllers(linkFn.require, $element)); - } catch (e) { - $exceptionHandler(e, startingTag($element)); - } - } - } - } - - - /** - * looks up the directive and decorates it with exception handling and proper parameters. We - * call this the boundDirective. - * - * @param {string} name name of the directive to look up. - * @param {string} location The directive must be found in specific format. - * String containing any of theses characters: - * - * * `E`: element name - * * `A': attribute - * * `C`: class - * * `M`: comment - * @returns true if directive was added. - */ - function addDirective(tDirectives, name, location, maxPriority) { - var match = false; - if (hasDirectives.hasOwnProperty(name)) { - for(var directive, directives = $injector.get(name + Suffix), - i = 0, ii = directives.length; i directive.priority) && - directive.restrict.indexOf(location) != -1) { - tDirectives.push(directive); - match = true; - } - } catch(e) { $exceptionHandler(e); } - } - } - return match; - } - - - /** - * When the element is replaced with HTML template then the new attributes - * on the template need to be merged with the existing attributes in the DOM. - * The desired effect is to have both of the attributes present. - * - * @param {object} dst destination attributes (original DOM) - * @param {object} src source attributes (from the directive template) - */ - function mergeTemplateAttributes(dst, src) { - var srcAttr = src.$attr, - dstAttr = dst.$attr, - $element = dst.$$element; - - // reapply the old attributes to the new element - forEach(dst, function(value, key) { - if (key.charAt(0) != '$') { - if (src[key]) { - value += (key === 'style' ? ';' : ' ') + src[key]; - } - dst.$set(key, value, true, srcAttr[key]); - } - }); - - // copy the new attributes on the old attrs object - forEach(src, function(value, key) { - if (key == 'class') { - safeAddClass($element, value); - dst['class'] = (dst['class'] ? dst['class'] + ' ' : '') + value; - } else if (key == 'style') { - $element.attr('style', $element.attr('style') + ';' + value); - } else if (key.charAt(0) != '$' && !dst.hasOwnProperty(key)) { - dst[key] = value; - dstAttr[key] = srcAttr[key]; - } - }); - } - - - function compileTemplateUrl(directives, beforeTemplateNodeLinkFn, $compileNode, tAttrs, - $rootElement, replace, childTranscludeFn) { - var linkQueue = [], - afterTemplateNodeLinkFn, - afterTemplateChildLinkFn, - beforeTemplateCompileNode = $compileNode[0], - origAsyncDirective = directives.shift(), - // The fact that we have to copy and patch the directive seems wrong! - derivedSyncDirective = extend({}, origAsyncDirective, { - controller: null, templateUrl: null, transclude: null, scope: null - }); - - $compileNode.html(''); - - $http.get(origAsyncDirective.templateUrl, {cache: $templateCache}). - success(function(content) { - var compileNode, tempTemplateAttrs, $template; - - content = denormalizeTemplate(content); - - if (replace) { - $template = jqLite('
' + trim(content) + '
').contents(); - compileNode = $template[0]; - - if ($template.length != 1 || compileNode.nodeType !== 1) { - throw new Error(MULTI_ROOT_TEMPLATE_ERROR + content); - } - - tempTemplateAttrs = {$attr: {}}; - replaceWith($rootElement, $compileNode, compileNode); - collectDirectives(compileNode, directives, tempTemplateAttrs); - mergeTemplateAttributes(tAttrs, tempTemplateAttrs); - } else { - compileNode = beforeTemplateCompileNode; - $compileNode.html(content); - } - - directives.unshift(derivedSyncDirective); - afterTemplateNodeLinkFn = applyDirectivesToNode(directives, compileNode, tAttrs, childTranscludeFn); - afterTemplateChildLinkFn = compileNodes($compileNode.contents(), childTranscludeFn); - - - while(linkQueue.length) { - var controller = linkQueue.pop(), - linkRootElement = linkQueue.pop(), - beforeTemplateLinkNode = linkQueue.pop(), - scope = linkQueue.pop(), - linkNode = compileNode; - - if (beforeTemplateLinkNode !== beforeTemplateCompileNode) { - // it was cloned therefore we have to clone as well. - linkNode = JQLiteClone(compileNode); - replaceWith(linkRootElement, jqLite(beforeTemplateLinkNode), linkNode); - } - - afterTemplateNodeLinkFn(function() { - beforeTemplateNodeLinkFn(afterTemplateChildLinkFn, scope, linkNode, $rootElement, controller); - }, scope, linkNode, $rootElement, controller); - } - linkQueue = null; - }). - error(function(response, code, headers, config) { - throw Error('Failed to load template: ' + config.url); - }); - - return function delayedNodeLinkFn(ignoreChildLinkFn, scope, node, rootElement, controller) { - if (linkQueue) { - linkQueue.push(scope); - linkQueue.push(node); - linkQueue.push(rootElement); - linkQueue.push(controller); - } else { - afterTemplateNodeLinkFn(function() { - beforeTemplateNodeLinkFn(afterTemplateChildLinkFn, scope, node, rootElement, controller); - }, scope, node, rootElement, controller); - } - }; - } - - - /** - * Sorting function for bound directives. - */ - function byPriority(a, b) { - return b.priority - a.priority; - } - - - function assertNoDuplicate(what, previousDirective, directive, element) { - if (previousDirective) { - throw Error('Multiple directives [' + previousDirective.name + ', ' + - directive.name + '] asking for ' + what + ' on: ' + startingTag(element)); - } - } - - - function addTextInterpolateDirective(directives, text) { - var interpolateFn = $interpolate(text, true); - if (interpolateFn) { - directives.push({ - priority: 0, - compile: valueFn(function textInterpolateLinkFn(scope, node) { - var parent = node.parent(), - bindings = parent.data('$binding') || []; - bindings.push(interpolateFn); - safeAddClass(parent.data('$binding', bindings), 'ng-binding'); - scope.$watch(interpolateFn, function interpolateFnWatchAction(value) { - node[0].nodeValue = value; - }); - }) - }); - } - } - - - function addAttrInterpolateDirective(node, directives, value, name) { - var interpolateFn = $interpolate(value, true); - - // no interpolation found -> ignore - if (!interpolateFn) return; - - - directives.push({ - priority: 100, - compile: valueFn(function attrInterpolateLinkFn(scope, element, attr) { - var $$observers = (attr.$$observers || (attr.$$observers = {})); - - if (name === 'class') { - // we need to interpolate classes again, in the case the element was replaced - // and therefore the two class attrs got merged - we want to interpolate the result - interpolateFn = $interpolate(attr[name], true); - } - - attr[name] = undefined; - ($$observers[name] || ($$observers[name] = [])).$$inter = true; - (attr.$$observers && attr.$$observers[name].$$scope || scope). - $watch(interpolateFn, function interpolateFnWatchAction(value) { - attr.$set(name, value); - }); - }) - }); - } - - - /** - * This is a special jqLite.replaceWith, which can replace items which - * have no parents, provided that the containing jqLite collection is provided. - * - * @param {JqLite=} $rootElement The root of the compile tree. Used so that we can replace nodes - * in the root of the tree. - * @param {JqLite} $element The jqLite element which we are going to replace. We keep the shell, - * but replace its DOM node reference. - * @param {Node} newNode The new DOM node. - */ - function replaceWith($rootElement, $element, newNode) { - var oldNode = $element[0], - parent = oldNode.parentNode, - i, ii; - - if ($rootElement) { - for(i = 0, ii = $rootElement.length; i < ii; i++) { - if ($rootElement[i] == oldNode) { - $rootElement[i] = newNode; - break; - } - } - } - - if (parent) { - parent.replaceChild(newNode, oldNode); - } - - newNode[jqLite.expando] = oldNode[jqLite.expando]; - $element[0] = newNode; - } - }]; -} - -var PREFIX_REGEXP = /^(x[\:\-_]|data[\:\-_])/i; -/** - * Converts all accepted directives format into proper directive name. - * All of these will become 'myDirective': - * my:DiRective - * my-directive - * x-my-directive - * data-my:directive - * - * Also there is special case for Moz prefix starting with upper case letter. - * @param name Name to normalize - */ -function directiveNormalize(name) { - return camelCase(name.replace(PREFIX_REGEXP, '')); -} - -/** - * @ngdoc object - * @name ng.$compile.directive.Attributes - * @description - * - * A shared object between directive compile / linking functions which contains normalized DOM element - * attributes. The the values reflect current binding state `{{ }}`. The normalization is needed - * since all of these are treated as equivalent in Angular: - * - * - */ - -/** - * @ngdoc property - * @name ng.$compile.directive.Attributes#$attr - * @propertyOf ng.$compile.directive.Attributes - * @returns {object} A map of DOM element attribute names to the normalized name. This is - * needed to do reverse lookup from normalized name back to actual name. - */ - - -/** - * @ngdoc function - * @name ng.$compile.directive.Attributes#$set - * @methodOf ng.$compile.directive.Attributes - * @function - * - * @description - * Set DOM element attribute value. - * - * - * @param {string} name Normalized element attribute name of the property to modify. The name is - * revers translated using the {@link ng.$compile.directive.Attributes#$attr $attr} - * property to the original name. - * @param {string} value Value to set the attribute to. - */ - - - -/** - * Closure compiler type information - */ - -function nodesetLinkingFn( - /* angular.Scope */ scope, - /* NodeList */ nodeList, - /* Element */ rootElement, - /* function(Function) */ boundTranscludeFn -){} - -function directiveLinkingFn( - /* nodesetLinkingFn */ nodesetLinkingFn, - /* angular.Scope */ scope, - /* Node */ node, - /* Element */ rootElement, - /* function(Function) */ boundTranscludeFn -){} - -/** - * @ngdoc object - * @name ng.$controllerProvider - * @description - * The {@link ng.$controller $controller service} is used by Angular to create new - * controllers. - * - * This provider allows controller registration via the - * {@link ng.$controllerProvider#register register} method. - */ -function $ControllerProvider() { - var controllers = {}; - - - /** - * @ngdoc function - * @name ng.$controllerProvider#register - * @methodOf ng.$controllerProvider - * @param {string} name Controller name - * @param {Function|Array} constructor Controller constructor fn (optionally decorated with DI - * annotations in the array notation). - */ - this.register = function(name, constructor) { - if (isObject(name)) { - extend(controllers, name) - } else { - controllers[name] = constructor; - } - }; - - - this.$get = ['$injector', '$window', function($injector, $window) { - - /** - * @ngdoc function - * @name ng.$controller - * @requires $injector - * - * @param {Function|string} constructor If called with a function then it's considered to be the - * controller constructor function. Otherwise it's considered to be a string which is used - * to retrieve the controller constructor using the following steps: - * - * * check if a controller with given name is registered via `$controllerProvider` - * * check if evaluating the string on the current scope returns a constructor - * * check `window[constructor]` on the global `window` object - * - * @param {Object} locals Injection locals for Controller. - * @return {Object} Instance of given controller. - * - * @description - * `$controller` service is responsible for instantiating controllers. - * - * It's just simple call to {@link AUTO.$injector $injector}, but extracted into - * a service, so that one can override this service with {@link https://gist.github.com/1649788 - * BC version}. - */ - return function(constructor, locals) { - if(isString(constructor)) { - var name = constructor; - constructor = controllers.hasOwnProperty(name) - ? controllers[name] - : getter(locals.$scope, name, true) || getter($window, name, true); - - assertArgFn(constructor, name, true); - } - - return $injector.instantiate(constructor, locals); - }; - }]; -} - -/** - * @ngdoc object - * @name ng.$document - * @requires $window - * - * @description - * A {@link angular.element jQuery (lite)}-wrapped reference to the browser's `window.document` - * element. - */ -function $DocumentProvider(){ - this.$get = ['$window', function(window){ - return jqLite(window.document); - }]; -} - -/** - * @ngdoc function - * @name ng.$exceptionHandler - * @requires $log - * - * @description - * Any uncaught exception in angular expressions is delegated to this service. - * The default implementation simply delegates to `$log.error` which logs it into - * the browser console. - * - * In unit tests, if `angular-mocks.js` is loaded, this service is overridden by - * {@link ngMock.$exceptionHandler mock $exceptionHandler} which aids in testing. - * - * @param {Error} exception Exception associated with the error. - * @param {string=} cause optional information about the context in which - * the error was thrown. - * - */ -function $ExceptionHandlerProvider() { - this.$get = ['$log', function($log){ - return function(exception, cause) { - $log.error.apply($log, arguments); - }; - }]; -} - -/** - * @ngdoc object - * @name ng.$interpolateProvider - * @function - * - * @description - * - * Used for configuring the interpolation markup. Defaults to `{{` and `}}`. - */ -function $InterpolateProvider() { - var startSymbol = '{{'; - var endSymbol = '}}'; - - /** - * @ngdoc method - * @name ng.$interpolateProvider#startSymbol - * @methodOf ng.$interpolateProvider - * @description - * Symbol to denote start of expression in the interpolated string. Defaults to `{{`. - * - * @param {string=} value new value to set the starting symbol to. - * @returns {string|self} Returns the symbol when used as getter and self if used as setter. - */ - this.startSymbol = function(value){ - if (value) { - startSymbol = value; - return this; - } else { - return startSymbol; - } - }; - - /** - * @ngdoc method - * @name ng.$interpolateProvider#endSymbol - * @methodOf ng.$interpolateProvider - * @description - * Symbol to denote the end of expression in the interpolated string. Defaults to `}}`. - * - * @param {string=} value new value to set the ending symbol to. - * @returns {string|self} Returns the symbol when used as getter and self if used as setter. - */ - this.endSymbol = function(value){ - if (value) { - endSymbol = value; - return this; - } else { - return endSymbol; - } - }; - - - this.$get = ['$parse', function($parse) { - var startSymbolLength = startSymbol.length, - endSymbolLength = endSymbol.length; - - /** - * @ngdoc function - * @name ng.$interpolate - * @function - * - * @requires $parse - * - * @description - * - * Compiles a string with markup into an interpolation function. This service is used by the - * HTML {@link ng.$compile $compile} service for data binding. See - * {@link ng.$interpolateProvider $interpolateProvider} for configuring the - * interpolation markup. - * - * -
-         var $interpolate = ...; // injected
-         var exp = $interpolate('Hello {{name}}!');
-         expect(exp({name:'Angular'}).toEqual('Hello Angular!');
-       
- * - * - * @param {string} text The text with markup to interpolate. - * @param {boolean=} mustHaveExpression if set to true then the interpolation string must have - * embedded expression in order to return an interpolation function. Strings with no - * embedded expression will return null for the interpolation function. - * @returns {function(context)} an interpolation function which is used to compute the interpolated - * string. The function has these parameters: - * - * * `context`: an object against which any expressions embedded in the strings are evaluated - * against. - * - */ - function $interpolate(text, mustHaveExpression) { - var startIndex, - endIndex, - index = 0, - parts = [], - length = text.length, - hasInterpolation = false, - fn, - exp, - concat = []; - - while(index < length) { - if ( ((startIndex = text.indexOf(startSymbol, index)) != -1) && - ((endIndex = text.indexOf(endSymbol, startIndex + startSymbolLength)) != -1) ) { - (index != startIndex) && parts.push(text.substring(index, startIndex)); - parts.push(fn = $parse(exp = text.substring(startIndex + startSymbolLength, endIndex))); - fn.exp = exp; - index = endIndex + endSymbolLength; - hasInterpolation = true; - } else { - // we did not find anything, so we have to add the remainder to the parts array - (index != length) && parts.push(text.substring(index)); - index = length; - } - } - - if (!(length = parts.length)) { - // we added, nothing, must have been an empty string. - parts.push(''); - length = 1; - } - - if (!mustHaveExpression || hasInterpolation) { - concat.length = length; - fn = function(context) { - for(var i = 0, ii = length, part; i html5 url - } else { - return composeProtocolHostPort(match.protocol, match.host, match.port) + - pathPrefixFromBase(basePath) + match.hash.substr(hashPrefix.length); - } -} - - -function convertToHashbangUrl(url, basePath, hashPrefix) { - var match = matchUrl(url); - - // already hashbang url - if (decodeURIComponent(match.path) == basePath) { - return url; - // convert html5 url -> hashbang url - } else { - var search = match.search && '?' + match.search || '', - hash = match.hash && '#' + match.hash || '', - pathPrefix = pathPrefixFromBase(basePath), - path = match.path.substr(pathPrefix.length); - - if (match.path.indexOf(pathPrefix) !== 0) { - throw Error('Invalid url "' + url + '", missing path prefix "' + pathPrefix + '" !'); - } - - return composeProtocolHostPort(match.protocol, match.host, match.port) + basePath + - '#' + hashPrefix + path + search + hash; - } -} - - -/** - * LocationUrl represents an url - * This object is exposed as $location service when HTML5 mode is enabled and supported - * - * @constructor - * @param {string} url HTML5 url - * @param {string} pathPrefix - */ -function LocationUrl(url, pathPrefix, appBaseUrl) { - pathPrefix = pathPrefix || ''; - - /** - * Parse given html5 (regular) url string into properties - * @param {string} newAbsoluteUrl HTML5 url - * @private - */ - this.$$parse = function(newAbsoluteUrl) { - var match = matchUrl(newAbsoluteUrl, this); - - if (match.path.indexOf(pathPrefix) !== 0) { - throw Error('Invalid url "' + newAbsoluteUrl + '", missing path prefix "' + pathPrefix + '" !'); - } - - this.$$path = decodeURIComponent(match.path.substr(pathPrefix.length)); - this.$$search = parseKeyValue(match.search); - this.$$hash = match.hash && decodeURIComponent(match.hash) || ''; - - this.$$compose(); - }; - - /** - * Compose url and update `absUrl` property - * @private - */ - this.$$compose = function() { - var search = toKeyValue(this.$$search), - hash = this.$$hash ? '#' + encodeUriSegment(this.$$hash) : ''; - - this.$$url = encodePath(this.$$path) + (search ? '?' + search : '') + hash; - this.$$absUrl = composeProtocolHostPort(this.$$protocol, this.$$host, this.$$port) + - pathPrefix + this.$$url; - }; - - - this.$$rewriteAppUrl = function(absoluteLinkUrl) { - if(absoluteLinkUrl.indexOf(appBaseUrl) == 0) { - return absoluteLinkUrl; - } - } - - - this.$$parse(url); -} - - -/** - * LocationHashbangUrl represents url - * This object is exposed as $location service when html5 history api is disabled or not supported - * - * @constructor - * @param {string} url Legacy url - * @param {string} hashPrefix Prefix for hash part (containing path and search) - */ -function LocationHashbangUrl(url, hashPrefix, appBaseUrl) { - var basePath; - - /** - * Parse given hashbang url into properties - * @param {string} url Hashbang url - * @private - */ - this.$$parse = function(url) { - var match = matchUrl(url, this); - - - if (match.hash && match.hash.indexOf(hashPrefix) !== 0) { - throw Error('Invalid url "' + url + '", missing hash prefix "' + hashPrefix + '" !'); - } - - basePath = match.path + (match.search ? '?' + match.search : ''); - match = HASH_MATCH.exec((match.hash || '').substr(hashPrefix.length)); - if (match[1]) { - this.$$path = (match[1].charAt(0) == '/' ? '' : '/') + decodeURIComponent(match[1]); - } else { - this.$$path = ''; - } - - this.$$search = parseKeyValue(match[3]); - this.$$hash = match[5] && decodeURIComponent(match[5]) || ''; - - this.$$compose(); - }; - - /** - * Compose hashbang url and update `absUrl` property - * @private - */ - this.$$compose = function() { - var search = toKeyValue(this.$$search), - hash = this.$$hash ? '#' + encodeUriSegment(this.$$hash) : ''; - - this.$$url = encodePath(this.$$path) + (search ? '?' + search : '') + hash; - this.$$absUrl = composeProtocolHostPort(this.$$protocol, this.$$host, this.$$port) + - basePath + (this.$$url ? '#' + hashPrefix + this.$$url : ''); - }; - - this.$$rewriteAppUrl = function(absoluteLinkUrl) { - if(absoluteLinkUrl.indexOf(appBaseUrl) == 0) { - return absoluteLinkUrl; - } - } - - - this.$$parse(url); -} - - -LocationUrl.prototype = { - - /** - * Has any change been replacing ? - * @private - */ - $$replace: false, - - /** - * @ngdoc method - * @name ng.$location#absUrl - * @methodOf ng.$location - * - * @description - * This method is getter only. - * - * Return full url representation with all segments encoded according to rules specified in - * {@link http://www.ietf.org/rfc/rfc3986.txt RFC 3986}. - * - * @return {string} full url - */ - absUrl: locationGetter('$$absUrl'), - - /** - * @ngdoc method - * @name ng.$location#url - * @methodOf ng.$location - * - * @description - * This method is getter / setter. - * - * Return url (e.g. `/path?a=b#hash`) when called without any parameter. - * - * Change path, search and hash, when called with parameter and return `$location`. - * - * @param {string=} url New url without base prefix (e.g. `/path?a=b#hash`) - * @return {string} url - */ - url: function(url, replace) { - if (isUndefined(url)) - return this.$$url; - - var match = PATH_MATCH.exec(url); - if (match[1]) this.path(decodeURIComponent(match[1])); - if (match[2] || match[1]) this.search(match[3] || ''); - this.hash(match[5] || '', replace); - - return this; - }, - - /** - * @ngdoc method - * @name ng.$location#protocol - * @methodOf ng.$location - * - * @description - * This method is getter only. - * - * Return protocol of current url. - * - * @return {string} protocol of current url - */ - protocol: locationGetter('$$protocol'), - - /** - * @ngdoc method - * @name ng.$location#host - * @methodOf ng.$location - * - * @description - * This method is getter only. - * - * Return host of current url. - * - * @return {string} host of current url. - */ - host: locationGetter('$$host'), - - /** - * @ngdoc method - * @name ng.$location#port - * @methodOf ng.$location - * - * @description - * This method is getter only. - * - * Return port of current url. - * - * @return {Number} port - */ - port: locationGetter('$$port'), - - /** - * @ngdoc method - * @name ng.$location#path - * @methodOf ng.$location - * - * @description - * This method is getter / setter. - * - * Return path of current url when called without any parameter. - * - * Change path when called with parameter and return `$location`. - * - * Note: Path should always begin with forward slash (/), this method will add the forward slash - * if it is missing. - * - * @param {string=} path New path - * @return {string} path - */ - path: locationGetterSetter('$$path', function(path) { - return path.charAt(0) == '/' ? path : '/' + path; - }), - - /** - * @ngdoc method - * @name ng.$location#search - * @methodOf ng.$location - * - * @description - * This method is getter / setter. - * - * Return search part (as object) of current url when called without any parameter. - * - * Change search part when called with parameter and return `$location`. - * - * @param {string|object=} search New search params - string or hash object - * @param {string=} paramValue If `search` is a string, then `paramValue` will override only a - * single search parameter. If the value is `null`, the parameter will be deleted. - * - * @return {string} search - */ - search: function(search, paramValue) { - if (isUndefined(search)) - return this.$$search; - - if (isDefined(paramValue)) { - if (paramValue === null) { - delete this.$$search[search]; - } else { - this.$$search[search] = paramValue; - } - } else { - this.$$search = isString(search) ? parseKeyValue(search) : search; - } - - this.$$compose(); - return this; - }, - - /** - * @ngdoc method - * @name ng.$location#hash - * @methodOf ng.$location - * - * @description - * This method is getter / setter. - * - * Return hash fragment when called without any parameter. - * - * Change hash fragment when called with parameter and return `$location`. - * - * @param {string=} hash New hash fragment - * @return {string} hash - */ - hash: locationGetterSetter('$$hash', identity), - - /** - * @ngdoc method - * @name ng.$location#replace - * @methodOf ng.$location - * - * @description - * If called, all changes to $location during current `$digest` will be replacing current history - * record, instead of adding new one. - */ - replace: function() { - this.$$replace = true; - return this; - } -}; - -LocationHashbangUrl.prototype = inherit(LocationUrl.prototype); - -function LocationHashbangInHtml5Url(url, hashPrefix, appBaseUrl, baseExtra) { - LocationHashbangUrl.apply(this, arguments); - - - this.$$rewriteAppUrl = function(absoluteLinkUrl) { - if (absoluteLinkUrl.indexOf(appBaseUrl) == 0) { - return appBaseUrl + baseExtra + '#' + hashPrefix + absoluteLinkUrl.substr(appBaseUrl.length); - } - } -} - -LocationHashbangInHtml5Url.prototype = inherit(LocationHashbangUrl.prototype); - -function locationGetter(property) { - return function() { - return this[property]; - }; -} - - -function locationGetterSetter(property, preprocess) { - return function(value) { - if (isUndefined(value)) - return this[property]; - - this[property] = preprocess(value); - this.$$compose(); - - return this; - }; -} - - -/** - * @ngdoc object - * @name ng.$location - * - * @requires $browser - * @requires $sniffer - * @requires $rootElement - * - * @description - * The $location service parses the URL in the browser address bar (based on the - * {@link https://developer.mozilla.org/en/window.location window.location}) and makes the URL - * available to your application. Changes to the URL in the address bar are reflected into - * $location service and changes to $location are reflected into the browser address bar. - * - * **The $location service:** - * - * - Exposes the current URL in the browser address bar, so you can - * - Watch and observe the URL. - * - Change the URL. - * - Synchronizes the URL with the browser when the users - * - Changes the address bar. - * - Clicks the back or forward button (or clicks a History link). - * - Clicks on a link. - * - Represents the URL object as a set of methods (protocol, host, port, path, search, hash). - * - * For more information see {@link guide/dev_guide.services.$location Developer Guide: Angular - * Services: Using $location} - */ - -/** - * @ngdoc object - * @name ng.$locationProvider - * @description - * Use the `$locationProvider` to configure how the application deep linking paths are stored. - */ -function $LocationProvider(){ - var hashPrefix = '', - html5Mode = false; - - /** - * @ngdoc property - * @name ng.$locationProvider#hashPrefix - * @methodOf ng.$locationProvider - * @description - * @param {string=} prefix Prefix for hash part (containing path and search) - * @returns {*} current value if used as getter or itself (chaining) if used as setter - */ - this.hashPrefix = function(prefix) { - if (isDefined(prefix)) { - hashPrefix = prefix; - return this; - } else { - return hashPrefix; - } - }; - - /** - * @ngdoc property - * @name ng.$locationProvider#html5Mode - * @methodOf ng.$locationProvider - * @description - * @param {string=} mode Use HTML5 strategy if available. - * @returns {*} current value if used as getter or itself (chaining) if used as setter - */ - this.html5Mode = function(mode) { - if (isDefined(mode)) { - html5Mode = mode; - return this; - } else { - return html5Mode; - } - }; - - this.$get = ['$rootScope', '$browser', '$sniffer', '$rootElement', - function( $rootScope, $browser, $sniffer, $rootElement) { - var $location, - basePath, - pathPrefix, - initUrl = $browser.url(), - initUrlParts = matchUrl(initUrl), - appBaseUrl; - - if (html5Mode) { - basePath = $browser.baseHref() || '/'; - pathPrefix = pathPrefixFromBase(basePath); - appBaseUrl = - composeProtocolHostPort(initUrlParts.protocol, initUrlParts.host, initUrlParts.port) + - pathPrefix + '/'; - - if ($sniffer.history) { - $location = new LocationUrl( - convertToHtml5Url(initUrl, basePath, hashPrefix), - pathPrefix, appBaseUrl); - } else { - $location = new LocationHashbangInHtml5Url( - convertToHashbangUrl(initUrl, basePath, hashPrefix), - hashPrefix, appBaseUrl, basePath.substr(pathPrefix.length + 1)); - } - } else { - appBaseUrl = - composeProtocolHostPort(initUrlParts.protocol, initUrlParts.host, initUrlParts.port) + - (initUrlParts.path || '') + - (initUrlParts.search ? ('?' + initUrlParts.search) : '') + - '#' + hashPrefix + '/'; - - $location = new LocationHashbangUrl(initUrl, hashPrefix, appBaseUrl); - } - - $rootElement.bind('click', function(event) { - // TODO(vojta): rewrite link when opening in new tab/window (in legacy browser) - // currently we open nice url link and redirect then - - if (event.ctrlKey || event.metaKey || event.which == 2) return; - - var elm = jqLite(event.target); - - // traverse the DOM up to find first A tag - while (lowercase(elm[0].nodeName) !== 'a') { - // ignore rewriting if no A tag (reached root element, or no parent - removed from document) - if (elm[0] === $rootElement[0] || !(elm = elm.parent())[0]) return; - } - - var absHref = elm.prop('href'), - rewrittenUrl = $location.$$rewriteAppUrl(absHref); - - if (absHref && !elm.attr('target') && rewrittenUrl) { - // update location manually - $location.$$parse(rewrittenUrl); - $rootScope.$apply(); - event.preventDefault(); - // hack to work around FF6 bug 684208 when scenario runner clicks on links - window.angular['ff-684208-preventDefault'] = true; - } - }); - - - // rewrite hashbang url <> html5 url - if ($location.absUrl() != initUrl) { - $browser.url($location.absUrl(), true); - } - - // update $location when $browser url changes - $browser.onUrlChange(function(newUrl) { - if ($location.absUrl() != newUrl) { - $rootScope.$evalAsync(function() { - var oldUrl = $location.absUrl(); - - $location.$$parse(newUrl); - afterLocationChange(oldUrl); - }); - if (!$rootScope.$$phase) $rootScope.$digest(); - } - }); - - // update browser - var changeCounter = 0; - $rootScope.$watch(function $locationWatch() { - var oldUrl = $browser.url(); - var currentReplace = $location.$$replace; - - if (!changeCounter || oldUrl != $location.absUrl()) { - changeCounter++; - $rootScope.$evalAsync(function() { - if ($rootScope.$broadcast('$locationChangeStart', $location.absUrl(), oldUrl). - defaultPrevented) { - $location.$$parse(oldUrl); - } else { - $browser.url($location.absUrl(), currentReplace); - afterLocationChange(oldUrl); - } - }); - } - $location.$$replace = false; - - return changeCounter; - }); - - return $location; - - function afterLocationChange(oldUrl) { - $rootScope.$broadcast('$locationChangeSuccess', $location.absUrl(), oldUrl); - } -}]; -} - -/** - * @ngdoc object - * @name ng.$log - * @requires $window - * - * @description - * Simple service for logging. Default implementation writes the message - * into the browser's console (if present). - * - * The main purpose of this service is to simplify debugging and troubleshooting. - * - * @example - - - function LogCtrl($scope, $log) { - $scope.$log = $log; - $scope.message = 'Hello World!'; - } - - -
-

Reload this page with open console, enter text and hit the log button...

- Message: - - - - - -
-
-
- */ - -function $LogProvider(){ - this.$get = ['$window', function($window){ - return { - /** - * @ngdoc method - * @name ng.$log#log - * @methodOf ng.$log - * - * @description - * Write a log message - */ - log: consoleLog('log'), - - /** - * @ngdoc method - * @name ng.$log#warn - * @methodOf ng.$log - * - * @description - * Write a warning message - */ - warn: consoleLog('warn'), - - /** - * @ngdoc method - * @name ng.$log#info - * @methodOf ng.$log - * - * @description - * Write an information message - */ - info: consoleLog('info'), - - /** - * @ngdoc method - * @name ng.$log#error - * @methodOf ng.$log - * - * @description - * Write an error message - */ - error: consoleLog('error') - }; - - function formatError(arg) { - if (arg instanceof Error) { - if (arg.stack) { - arg = (arg.message && arg.stack.indexOf(arg.message) === -1) - ? 'Error: ' + arg.message + '\n' + arg.stack - : arg.stack; - } else if (arg.sourceURL) { - arg = arg.message + '\n' + arg.sourceURL + ':' + arg.line; - } - } - return arg; - } - - function consoleLog(type) { - var console = $window.console || {}, - logFn = console[type] || console.log || noop; - - if (logFn.apply) { - return function() { - var args = []; - forEach(arguments, function(arg) { - args.push(formatError(arg)); - }); - return logFn.apply(console, args); - }; - } - - // we are IE which either doesn't have window.console => this is noop and we do nothing, - // or we are IE where console.log doesn't have apply so we log at least first 2 args - return function(arg1, arg2) { - logFn(arg1, arg2); - } - } - }]; -} - -var OPERATORS = { - 'null':function(){return null;}, - 'true':function(){return true;}, - 'false':function(){return false;}, - undefined:noop, - '+':function(self, locals, a,b){ - a=a(self, locals); b=b(self, locals); - if (isDefined(a)) { - if (isDefined(b)) { - return a + b; - } - return a; - } - return isDefined(b)?b:undefined;}, - '-':function(self, locals, a,b){a=a(self, locals); b=b(self, locals); return (isDefined(a)?a:0)-(isDefined(b)?b:0);}, - '*':function(self, locals, a,b){return a(self, locals)*b(self, locals);}, - '/':function(self, locals, a,b){return a(self, locals)/b(self, locals);}, - '%':function(self, locals, a,b){return a(self, locals)%b(self, locals);}, - '^':function(self, locals, a,b){return a(self, locals)^b(self, locals);}, - '=':noop, - '==':function(self, locals, a,b){return a(self, locals)==b(self, locals);}, - '!=':function(self, locals, a,b){return a(self, locals)!=b(self, locals);}, - '<':function(self, locals, a,b){return a(self, locals)':function(self, locals, a,b){return a(self, locals)>b(self, locals);}, - '<=':function(self, locals, a,b){return a(self, locals)<=b(self, locals);}, - '>=':function(self, locals, a,b){return a(self, locals)>=b(self, locals);}, - '&&':function(self, locals, a,b){return a(self, locals)&&b(self, locals);}, - '||':function(self, locals, a,b){return a(self, locals)||b(self, locals);}, - '&':function(self, locals, a,b){return a(self, locals)&b(self, locals);}, -// '|':function(self, locals, a,b){return a|b;}, - '|':function(self, locals, a,b){return b(self, locals)(self, locals, a(self, locals));}, - '!':function(self, locals, a){return !a(self, locals);} -}; -var ESCAPE = {"n":"\n", "f":"\f", "r":"\r", "t":"\t", "v":"\v", "'":"'", '"':'"'}; - -function lex(text, csp){ - var tokens = [], - token, - index = 0, - json = [], - ch, - lastCh = ':'; // can start regexp - - while (index < text.length) { - ch = text.charAt(index); - if (is('"\'')) { - readString(ch); - } else if (isNumber(ch) || is('.') && isNumber(peek())) { - readNumber(); - } else if (isIdent(ch)) { - readIdent(); - // identifiers can only be if the preceding char was a { or , - if (was('{,') && json[0]=='{' && - (token=tokens[tokens.length-1])) { - token.json = token.text.indexOf('.') == -1; - } - } else if (is('(){}[].,;:')) { - tokens.push({ - index:index, - text:ch, - json:(was(':[,') && is('{[')) || is('}]:,') - }); - if (is('{[')) json.unshift(ch); - if (is('}]')) json.shift(); - index++; - } else if (isWhitespace(ch)) { - index++; - continue; - } else { - var ch2 = ch + peek(), - fn = OPERATORS[ch], - fn2 = OPERATORS[ch2]; - if (fn2) { - tokens.push({index:index, text:ch2, fn:fn2}); - index += 2; - } else if (fn) { - tokens.push({index:index, text:ch, fn:fn, json: was('[,:') && is('+-')}); - index += 1; - } else { - throwError("Unexpected next character ", index, index+1); - } - } - lastCh = ch; - } - return tokens; - - function is(chars) { - return chars.indexOf(ch) != -1; - } - - function was(chars) { - return chars.indexOf(lastCh) != -1; - } - - function peek() { - return index + 1 < text.length ? text.charAt(index + 1) : false; - } - function isNumber(ch) { - return '0' <= ch && ch <= '9'; - } - function isWhitespace(ch) { - return ch == ' ' || ch == '\r' || ch == '\t' || - ch == '\n' || ch == '\v' || ch == '\u00A0'; // IE treats non-breaking space as \u00A0 - } - function isIdent(ch) { - return 'a' <= ch && ch <= 'z' || - 'A' <= ch && ch <= 'Z' || - '_' == ch || ch == '$'; - } - function isExpOperator(ch) { - return ch == '-' || ch == '+' || isNumber(ch); - } - - function throwError(error, start, end) { - end = end || index; - throw Error("Lexer Error: " + error + " at column" + - (isDefined(start) - ? "s " + start + "-" + index + " [" + text.substring(start, end) + "]" - : " " + end) + - " in expression [" + text + "]."); - } - - function readNumber() { - var number = ""; - var start = index; - while (index < text.length) { - var ch = lowercase(text.charAt(index)); - if (ch == '.' || isNumber(ch)) { - number += ch; - } else { - var peekCh = peek(); - if (ch == 'e' && isExpOperator(peekCh)) { - number += ch; - } else if (isExpOperator(ch) && - peekCh && isNumber(peekCh) && - number.charAt(number.length - 1) == 'e') { - number += ch; - } else if (isExpOperator(ch) && - (!peekCh || !isNumber(peekCh)) && - number.charAt(number.length - 1) == 'e') { - throwError('Invalid exponent'); - } else { - break; - } - } - index++; - } - number = 1 * number; - tokens.push({index:start, text:number, json:true, - fn:function() {return number;}}); - } - function readIdent() { - var ident = "", - start = index, - lastDot, peekIndex, methodName; - - while (index < text.length) { - var ch = text.charAt(index); - if (ch == '.' || isIdent(ch) || isNumber(ch)) { - if (ch == '.') lastDot = index; - ident += ch; - } else { - break; - } - index++; - } - - //check if this is not a method invocation and if it is back out to last dot - if (lastDot) { - peekIndex = index; - while(peekIndex < text.length) { - var ch = text.charAt(peekIndex); - if (ch == '(') { - methodName = ident.substr(lastDot - start + 1); - ident = ident.substr(0, lastDot - start); - index = peekIndex; - break; - } - if(isWhitespace(ch)) { - peekIndex++; - } else { - break; - } - } - } - - - var token = { - index:start, - text:ident - }; - - if (OPERATORS.hasOwnProperty(ident)) { - token.fn = token.json = OPERATORS[ident]; - } else { - var getter = getterFn(ident, csp); - token.fn = extend(function(self, locals) { - return (getter(self, locals)); - }, { - assign: function(self, value) { - return setter(self, ident, value); - } - }); - } - - tokens.push(token); - - if (methodName) { - tokens.push({ - index:lastDot, - text: '.', - json: false - }); - tokens.push({ - index: lastDot + 1, - text: methodName, - json: false - }); - } - } - - function readString(quote) { - var start = index; - index++; - var string = ""; - var rawString = quote; - var escape = false; - while (index < text.length) { - var ch = text.charAt(index); - rawString += ch; - if (escape) { - if (ch == 'u') { - var hex = text.substring(index + 1, index + 5); - if (!hex.match(/[\da-f]{4}/i)) - throwError( "Invalid unicode escape [\\u" + hex + "]"); - index += 4; - string += String.fromCharCode(parseInt(hex, 16)); - } else { - var rep = ESCAPE[ch]; - if (rep) { - string += rep; - } else { - string += ch; - } - } - escape = false; - } else if (ch == '\\') { - escape = true; - } else if (ch == quote) { - index++; - tokens.push({ - index:start, - text:rawString, - string:string, - json:true, - fn:function() { return string; } - }); - return; - } else { - string += ch; - } - index++; - } - throwError("Unterminated quote", start); - } -} - -///////////////////////////////////////// - -function parser(text, json, $filter, csp){ - var ZERO = valueFn(0), - value, - tokens = lex(text, csp), - assignment = _assignment, - functionCall = _functionCall, - fieldAccess = _fieldAccess, - objectIndex = _objectIndex, - filterChain = _filterChain; - - if(json){ - // The extra level of aliasing is here, just in case the lexer misses something, so that - // we prevent any accidental execution in JSON. - assignment = logicalOR; - functionCall = - fieldAccess = - objectIndex = - filterChain = - function() { throwError("is not valid json", {text:text, index:0}); }; - value = primary(); - } else { - value = statements(); - } - if (tokens.length !== 0) { - throwError("is an unexpected token", tokens[0]); - } - return value; - - /////////////////////////////////// - function throwError(msg, token) { - throw Error("Syntax Error: Token '" + token.text + - "' " + msg + " at column " + - (token.index + 1) + " of the expression [" + - text + "] starting at [" + text.substring(token.index) + "]."); - } - - function peekToken() { - if (tokens.length === 0) - throw Error("Unexpected end of expression: " + text); - return tokens[0]; - } - - function peek(e1, e2, e3, e4) { - if (tokens.length > 0) { - var token = tokens[0]; - var t = token.text; - if (t==e1 || t==e2 || t==e3 || t==e4 || - (!e1 && !e2 && !e3 && !e4)) { - return token; - } - } - return false; - } - - function expect(e1, e2, e3, e4){ - var token = peek(e1, e2, e3, e4); - if (token) { - if (json && !token.json) { - throwError("is not valid json", token); - } - tokens.shift(); - return token; - } - return false; - } - - function consume(e1){ - if (!expect(e1)) { - throwError("is unexpected, expecting [" + e1 + "]", peek()); - } - } - - function unaryFn(fn, right) { - return function(self, locals) { - return fn(self, locals, right); - }; - } - - function binaryFn(left, fn, right) { - return function(self, locals) { - return fn(self, locals, left, right); - }; - } - - function statements() { - var statements = []; - while(true) { - if (tokens.length > 0 && !peek('}', ')', ';', ']')) - statements.push(filterChain()); - if (!expect(';')) { - // optimize for the common case where there is only one statement. - // TODO(size): maybe we should not support multiple statements? - return statements.length == 1 - ? statements[0] - : function(self, locals){ - var value; - for ( var i = 0; i < statements.length; i++) { - var statement = statements[i]; - if (statement) - value = statement(self, locals); - } - return value; - }; - } - } - } - - function _filterChain() { - var left = expression(); - var token; - while(true) { - if ((token = expect('|'))) { - left = binaryFn(left, token.fn, filter()); - } else { - return left; - } - } - } - - function filter() { - var token = expect(); - var fn = $filter(token.text); - var argsFn = []; - while(true) { - if ((token = expect(':'))) { - argsFn.push(expression()); - } else { - var fnInvoke = function(self, locals, input){ - var args = [input]; - for ( var i = 0; i < argsFn.length; i++) { - args.push(argsFn[i](self, locals)); - } - return fn.apply(self, args); - }; - return function() { - return fnInvoke; - }; - } - } - } - - function expression() { - return assignment(); - } - - function _assignment() { - var left = logicalOR(); - var right; - var token; - if ((token = expect('='))) { - if (!left.assign) { - throwError("implies assignment but [" + - text.substring(0, token.index) + "] can not be assigned to", token); - } - right = logicalOR(); - return function(self, locals){ - return left.assign(self, right(self, locals), locals); - }; - } else { - return left; - } - } - - function logicalOR() { - var left = logicalAND(); - var token; - while(true) { - if ((token = expect('||'))) { - left = binaryFn(left, token.fn, logicalAND()); - } else { - return left; - } - } - } - - function logicalAND() { - var left = equality(); - var token; - if ((token = expect('&&'))) { - left = binaryFn(left, token.fn, logicalAND()); - } - return left; - } - - function equality() { - var left = relational(); - var token; - if ((token = expect('==','!='))) { - left = binaryFn(left, token.fn, equality()); - } - return left; - } - - function relational() { - var left = additive(); - var token; - if ((token = expect('<', '>', '<=', '>='))) { - left = binaryFn(left, token.fn, relational()); - } - return left; - } - - function additive() { - var left = multiplicative(); - var token; - while ((token = expect('+','-'))) { - left = binaryFn(left, token.fn, multiplicative()); - } - return left; - } - - function multiplicative() { - var left = unary(); - var token; - while ((token = expect('*','/','%'))) { - left = binaryFn(left, token.fn, unary()); - } - return left; - } - - function unary() { - var token; - if (expect('+')) { - return primary(); - } else if ((token = expect('-'))) { - return binaryFn(ZERO, token.fn, unary()); - } else if ((token = expect('!'))) { - return unaryFn(token.fn, unary()); - } else { - return primary(); - } - } - - - function primary() { - var primary; - if (expect('(')) { - primary = filterChain(); - consume(')'); - } else if (expect('[')) { - primary = arrayDeclaration(); - } else if (expect('{')) { - primary = object(); - } else { - var token = expect(); - primary = token.fn; - if (!primary) { - throwError("not a primary expression", token); - } - } - - var next, context; - while ((next = expect('(', '[', '.'))) { - if (next.text === '(') { - primary = functionCall(primary, context); - context = null; - } else if (next.text === '[') { - context = primary; - primary = objectIndex(primary); - } else if (next.text === '.') { - context = primary; - primary = fieldAccess(primary); - } else { - throwError("IMPOSSIBLE"); - } - } - return primary; - } - - function _fieldAccess(object) { - var field = expect().text; - var getter = getterFn(field, csp); - return extend( - function(self, locals) { - return getter(object(self, locals), locals); - }, - { - assign:function(self, value, locals) { - return setter(object(self, locals), field, value); - } - } - ); - } - - function _objectIndex(obj) { - var indexFn = expression(); - consume(']'); - return extend( - function(self, locals){ - var o = obj(self, locals), - i = indexFn(self, locals), - v, p; - - if (!o) return undefined; - v = o[i]; - if (v && v.then) { - p = v; - if (!('$$v' in v)) { - p.$$v = undefined; - p.then(function(val) { p.$$v = val; }); - } - v = v.$$v; - } - return v; - }, { - assign:function(self, value, locals){ - return obj(self, locals)[indexFn(self, locals)] = value; - } - }); - } - - function _functionCall(fn, contextGetter) { - var argsFn = []; - if (peekToken().text != ')') { - do { - argsFn.push(expression()); - } while (expect(',')); - } - consume(')'); - return function(self, locals){ - var args = [], - context = contextGetter ? contextGetter(self, locals) : self; - - for ( var i = 0; i < argsFn.length; i++) { - args.push(argsFn[i](self, locals)); - } - var fnPtr = fn(self, locals) || noop; - // IE stupidity! - return fnPtr.apply - ? fnPtr.apply(context, args) - : fnPtr(args[0], args[1], args[2], args[3], args[4]); - }; - } - - // This is used with json array declaration - function arrayDeclaration () { - var elementFns = []; - if (peekToken().text != ']') { - do { - elementFns.push(expression()); - } while (expect(',')); - } - consume(']'); - return function(self, locals){ - var array = []; - for ( var i = 0; i < elementFns.length; i++) { - array.push(elementFns[i](self, locals)); - } - return array; - }; - } - - function object () { - var keyValues = []; - if (peekToken().text != '}') { - do { - var token = expect(), - key = token.string || token.text; - consume(":"); - var value = expression(); - keyValues.push({key:key, value:value}); - } while (expect(',')); - } - consume('}'); - return function(self, locals){ - var object = {}; - for ( var i = 0; i < keyValues.length; i++) { - var keyValue = keyValues[i]; - var value = keyValue.value(self, locals); - object[keyValue.key] = value; - } - return object; - }; - } -} - -////////////////////////////////////////////////// -// Parser helper functions -////////////////////////////////////////////////// - -function setter(obj, path, setValue) { - var element = path.split('.'); - for (var i = 0; element.length > 1; i++) { - var key = element.shift(); - var propertyObj = obj[key]; - if (!propertyObj) { - propertyObj = {}; - obj[key] = propertyObj; - } - obj = propertyObj; - } - obj[element.shift()] = setValue; - return setValue; -} - -/** - * Return the value accesible from the object by path. Any undefined traversals are ignored - * @param {Object} obj starting object - * @param {string} path path to traverse - * @param {boolean=true} bindFnToScope - * @returns value as accesbile by path - */ -//TODO(misko): this function needs to be removed -function getter(obj, path, bindFnToScope) { - if (!path) return obj; - var keys = path.split('.'); - var key; - var lastInstance = obj; - var len = keys.length; - - for (var i = 0; i < len; i++) { - key = keys[i]; - if (obj) { - obj = (lastInstance = obj)[key]; - } - } - if (!bindFnToScope && isFunction(obj)) { - return bind(lastInstance, obj); - } - return obj; -} - -var getterFnCache = {}; - -/** - * Implementation of the "Black Hole" variant from: - * - http://jsperf.com/angularjs-parse-getter/4 - * - http://jsperf.com/path-evaluation-simplified/7 - */ -function cspSafeGetterFn(key0, key1, key2, key3, key4) { - return function(scope, locals) { - var pathVal = (locals && locals.hasOwnProperty(key0)) ? locals : scope, - promise; - - if (pathVal === null || pathVal === undefined) return pathVal; - - pathVal = pathVal[key0]; - if (pathVal && pathVal.then) { - if (!("$$v" in pathVal)) { - promise = pathVal; - promise.$$v = undefined; - promise.then(function(val) { promise.$$v = val; }); - } - pathVal = pathVal.$$v; - } - if (!key1 || pathVal === null || pathVal === undefined) return pathVal; - - pathVal = pathVal[key1]; - if (pathVal && pathVal.then) { - if (!("$$v" in pathVal)) { - promise = pathVal; - promise.$$v = undefined; - promise.then(function(val) { promise.$$v = val; }); - } - pathVal = pathVal.$$v; - } - if (!key2 || pathVal === null || pathVal === undefined) return pathVal; - - pathVal = pathVal[key2]; - if (pathVal && pathVal.then) { - if (!("$$v" in pathVal)) { - promise = pathVal; - promise.$$v = undefined; - promise.then(function(val) { promise.$$v = val; }); - } - pathVal = pathVal.$$v; - } - if (!key3 || pathVal === null || pathVal === undefined) return pathVal; - - pathVal = pathVal[key3]; - if (pathVal && pathVal.then) { - if (!("$$v" in pathVal)) { - promise = pathVal; - promise.$$v = undefined; - promise.then(function(val) { promise.$$v = val; }); - } - pathVal = pathVal.$$v; - } - if (!key4 || pathVal === null || pathVal === undefined) return pathVal; - - pathVal = pathVal[key4]; - if (pathVal && pathVal.then) { - if (!("$$v" in pathVal)) { - promise = pathVal; - promise.$$v = undefined; - promise.then(function(val) { promise.$$v = val; }); - } - pathVal = pathVal.$$v; - } - return pathVal; - }; -}; - -function getterFn(path, csp) { - if (getterFnCache.hasOwnProperty(path)) { - return getterFnCache[path]; - } - - var pathKeys = path.split('.'), - pathKeysLength = pathKeys.length, - fn; - - if (csp) { - fn = (pathKeysLength < 6) - ? cspSafeGetterFn(pathKeys[0], pathKeys[1], pathKeys[2], pathKeys[3], pathKeys[4]) - : function(scope, locals) { - var i = 0, val - do { - val = cspSafeGetterFn( - pathKeys[i++], pathKeys[i++], pathKeys[i++], pathKeys[i++], pathKeys[i++] - )(scope, locals); - - locals = undefined; // clear after first iteration - scope = val; - } while (i < pathKeysLength); - return val; - } - } else { - var code = 'var l, fn, p;\n'; - forEach(pathKeys, function(key, index) { - code += 'if(s === null || s === undefined) return s;\n' + - 'l=s;\n' + - 's='+ (index - // we simply dereference 's' on any .dot notation - ? 's' - // but if we are first then we check locals first, and if so read it first - : '((k&&k.hasOwnProperty("' + key + '"))?k:s)') + '["' + key + '"]' + ';\n' + - 'if (s && s.then) {\n' + - ' if (!("$$v" in s)) {\n' + - ' p=s;\n' + - ' p.$$v = undefined;\n' + - ' p.then(function(v) {p.$$v=v;});\n' + - '}\n' + - ' s=s.$$v\n' + - '}\n'; - }); - code += 'return s;'; - fn = Function('s', 'k', code); // s=scope, k=locals - fn.toString = function() { return code; }; - } - - return getterFnCache[path] = fn; -} - -/////////////////////////////////// - -/** - * @ngdoc function - * @name ng.$parse - * @function - * - * @description - * - * Converts Angular {@link guide/expression expression} into a function. - * - *
- *   var getter = $parse('users.name');
- *   var setter = getter.assign;
- *   var context = {users:{name:'angular'}};
- *   var locals = {users:{name:'local'}};
- *
- *   expect(getter(context)).toEqual('angular');
- *   setter(context, 'newValue');
- *   expect(context.users.name).toEqual('newValue');
- *   expect(getter(context, locals)).toEqual('local');
- * 
- * - * - * @param {string} expression String expression to compile. - * @returns {function(context, locals)} a function which represents the compiled expression: - * - * * `context` – `{object}` – an object against which any expressions embedded in the strings - * are evaluated against (tipically a scope object). - * * `locals` – `{object=}` – local variables context object, useful for overriding values in - * `context`. - * - * The return function also has an `assign` property, if the expression is assignable, which - * allows one to set values to expressions. - * - */ -function $ParseProvider() { - var cache = {}; - this.$get = ['$filter', '$sniffer', function($filter, $sniffer) { - return function(exp) { - switch(typeof exp) { - case 'string': - return cache.hasOwnProperty(exp) - ? cache[exp] - : cache[exp] = parser(exp, false, $filter, $sniffer.csp); - case 'function': - return exp; - default: - return noop; - } - }; - }]; -} - -/** - * @ngdoc service - * @name ng.$q - * @requires $rootScope - * - * @description - * A promise/deferred implementation inspired by [Kris Kowal's Q](https://github.com/kriskowal/q). - * - * [The CommonJS Promise proposal](http://wiki.commonjs.org/wiki/Promises) describes a promise as an - * interface for interacting with an object that represents the result of an action that is - * performed asynchronously, and may or may not be finished at any given point in time. - * - * From the perspective of dealing with error handling, deferred and promise APIs are to - * asynchronous programming what `try`, `catch` and `throw` keywords are to synchronous programming. - * - *
- *   // for the purpose of this example let's assume that variables `$q` and `scope` are
- *   // available in the current lexical scope (they could have been injected or passed in).
- *
- *   function asyncGreet(name) {
- *     var deferred = $q.defer();
- *
- *     setTimeout(function() {
- *       // since this fn executes async in a future turn of the project loop, we need to wrap
- *       // our code into an $apply call so that the model changes are properly observed.
- *       scope.$apply(function() {
- *         if (okToGreet(name)) {
- *           deferred.resolve('Hello, ' + name + '!');
- *         } else {
- *           deferred.reject('Greeting ' + name + ' is not allowed.');
- *         }
- *       });
- *     }, 1000);
- *
- *     return deferred.promise;
- *   }
- *
- *   var promise = asyncGreet('Robin Hood');
- *   promise.then(function(greeting) {
- *     alert('Success: ' + greeting);
- *   }, function(reason) {
- *     alert('Failed: ' + reason);
- *   });
- * 
- * - * At first it might not be obvious why this extra complexity is worth the trouble. The payoff - * comes in the way of - * [guarantees that promise and deferred APIs make](https://github.com/kriskowal/uncommonjs/blob/master/promises/specification.md). - * - * Additionally the promise api allows for composition that is very hard to do with the - * traditional callback ([CPS](http://en.wikipedia.org/wiki/Continuation-passing_style)) approach. - * For more on this please see the [Q documentation](https://github.com/kriskowal/q) especially the - * section on serial or parallel joining of promises. - * - * - * # The Deferred API - * - * A new instance of deferred is constructed by calling `$q.defer()`. - * - * The purpose of the deferred object is to expose the associated Promise instance as well as APIs - * that can be used for signaling the successful or unsuccessful completion of the task. - * - * **Methods** - * - * - `resolve(value)` – resolves the derived promise with the `value`. If the value is a rejection - * constructed via `$q.reject`, the promise will be rejected instead. - * - `reject(reason)` – rejects the derived promise with the `reason`. This is equivalent to - * resolving it with a rejection constructed via `$q.reject`. - * - * **Properties** - * - * - promise – `{Promise}` – promise object associated with this deferred. - * - * - * # The Promise API - * - * A new promise instance is created when a deferred instance is created and can be retrieved by - * calling `deferred.promise`. - * - * The purpose of the promise object is to allow for interested parties to get access to the result - * of the deferred task when it completes. - * - * **Methods** - * - * - `then(successCallback, errorCallback)` – regardless of when the promise was or will be resolved - * or rejected calls one of the success or error callbacks asynchronously as soon as the result - * is available. The callbacks are called with a single argument the result or rejection reason. - * - * This method *returns a new promise* which is resolved or rejected via the return value of the - * `successCallback` or `errorCallback`. - * - * - * # Chaining promises - * - * Because calling `then` api of a promise returns a new derived promise, it is easily possible - * to create a chain of promises: - * - *
- *   promiseB = promiseA.then(function(result) {
- *     return result + 1;
- *   });
- *
- *   // promiseB will be resolved immediately after promiseA is resolved and its value will be
- *   // the result of promiseA incremented by 1
- * 
- * - * It is possible to create chains of any length and since a promise can be resolved with another - * promise (which will defer its resolution further), it is possible to pause/defer resolution of - * the promises at any point in the chain. This makes it possible to implement powerful apis like - * $http's response interceptors. - * - * - * # Differences between Kris Kowal's Q and $q - * - * There are three main differences: - * - * - $q is integrated with the {@link ng.$rootScope.Scope} Scope model observation - * mechanism in angular, which means faster propagation of resolution or rejection into your - * models and avoiding unnecessary browser repaints, which would result in flickering UI. - * - $q promises are recognized by the templating engine in angular, which means that in templates - * you can treat promises attached to a scope as if they were the resulting values. - * - Q has many more features that $q, but that comes at a cost of bytes. $q is tiny, but contains - * all the important functionality needed for common async tasks. - * - * # Testing - * - *
- *    it('should simulate promise', inject(function($q, $rootScope) {
- *      var deferred = $q.defer();
- *      var promise = deferred.promise;
- *      var resolvedValue;
- * 
- *      promise.then(function(value) { resolvedValue = value; });
- *      expect(resolvedValue).toBeUndefined();
- * 
- *      // Simulate resolving of promise
- *      deferred.resolve(123);
- *      // Note that the 'then' function does not get called synchronously.
- *      // This is because we want the promise API to always be async, whether or not
- *      // it got called synchronously or asynchronously.
- *      expect(resolvedValue).toBeUndefined();
- * 
- *      // Propagate promise resolution to 'then' functions using $apply().
- *      $rootScope.$apply();
- *      expect(resolvedValue).toEqual(123);
- *    });
- *  
- */ -function $QProvider() { - - this.$get = ['$rootScope', '$exceptionHandler', function($rootScope, $exceptionHandler) { - return qFactory(function(callback) { - $rootScope.$evalAsync(callback); - }, $exceptionHandler); - }]; -} - - -/** - * Constructs a promise manager. - * - * @param {function(function)} nextTick Function for executing functions in the next turn. - * @param {function(...*)} exceptionHandler Function into which unexpected exceptions are passed for - * debugging purposes. - * @returns {object} Promise manager. - */ -function qFactory(nextTick, exceptionHandler) { - - /** - * @ngdoc - * @name ng.$q#defer - * @methodOf ng.$q - * @description - * Creates a `Deferred` object which represents a task which will finish in the future. - * - * @returns {Deferred} Returns a new instance of deferred. - */ - var defer = function() { - var pending = [], - value, deferred; - - deferred = { - - resolve: function(val) { - if (pending) { - var callbacks = pending; - pending = undefined; - value = ref(val); - - if (callbacks.length) { - nextTick(function() { - var callback; - for (var i = 0, ii = callbacks.length; i < ii; i++) { - callback = callbacks[i]; - value.then(callback[0], callback[1]); - } - }); - } - } - }, - - - reject: function(reason) { - deferred.resolve(reject(reason)); - }, - - - promise: { - then: function(callback, errback) { - var result = defer(); - - var wrappedCallback = function(value) { - try { - result.resolve((callback || defaultCallback)(value)); - } catch(e) { - exceptionHandler(e); - result.reject(e); - } - }; - - var wrappedErrback = function(reason) { - try { - result.resolve((errback || defaultErrback)(reason)); - } catch(e) { - exceptionHandler(e); - result.reject(e); - } - }; - - if (pending) { - pending.push([wrappedCallback, wrappedErrback]); - } else { - value.then(wrappedCallback, wrappedErrback); - } - - return result.promise; - } - } - }; - - return deferred; - }; - - - var ref = function(value) { - if (value && value.then) return value; - return { - then: function(callback) { - var result = defer(); - nextTick(function() { - result.resolve(callback(value)); - }); - return result.promise; - } - }; - }; - - - /** - * @ngdoc - * @name ng.$q#reject - * @methodOf ng.$q - * @description - * Creates a promise that is resolved as rejected with the specified `reason`. This api should be - * used to forward rejection in a chain of promises. If you are dealing with the last promise in - * a promise chain, you don't need to worry about it. - * - * When comparing deferreds/promises to the familiar behavior of try/catch/throw, think of - * `reject` as the `throw` keyword in JavaScript. This also means that if you "catch" an error via - * a promise error callback and you want to forward the error to the promise derived from the - * current promise, you have to "rethrow" the error by returning a rejection constructed via - * `reject`. - * - *
-   *   promiseB = promiseA.then(function(result) {
-   *     // success: do something and resolve promiseB
-   *     //          with the old or a new result
-   *     return result;
-   *   }, function(reason) {
-   *     // error: handle the error if possible and
-   *     //        resolve promiseB with newPromiseOrValue,
-   *     //        otherwise forward the rejection to promiseB
-   *     if (canHandle(reason)) {
-   *      // handle the error and recover
-   *      return newPromiseOrValue;
-   *     }
-   *     return $q.reject(reason);
-   *   });
-   * 
- * - * @param {*} reason Constant, message, exception or an object representing the rejection reason. - * @returns {Promise} Returns a promise that was already resolved as rejected with the `reason`. - */ - var reject = function(reason) { - return { - then: function(callback, errback) { - var result = defer(); - nextTick(function() { - result.resolve((errback || defaultErrback)(reason)); - }); - return result.promise; - } - }; - }; - - - /** - * @ngdoc - * @name ng.$q#when - * @methodOf ng.$q - * @description - * Wraps an object that might be a value or a (3rd party) then-able promise into a $q promise. - * This is useful when you are dealing with an object that might or might not be a promise, or if - * the promise comes from a source that can't be trusted. - * - * @param {*} value Value or a promise - * @returns {Promise} Returns a single promise that will be resolved with an array of values, - * each value corresponding to the promise at the same index in the `promises` array. If any of - * the promises is resolved with a rejection, this resulting promise will be resolved with the - * same rejection. - */ - var when = function(value, callback, errback) { - var result = defer(), - done; - - var wrappedCallback = function(value) { - try { - return (callback || defaultCallback)(value); - } catch (e) { - exceptionHandler(e); - return reject(e); - } - }; - - var wrappedErrback = function(reason) { - try { - return (errback || defaultErrback)(reason); - } catch (e) { - exceptionHandler(e); - return reject(e); - } - }; - - nextTick(function() { - ref(value).then(function(value) { - if (done) return; - done = true; - result.resolve(ref(value).then(wrappedCallback, wrappedErrback)); - }, function(reason) { - if (done) return; - done = true; - result.resolve(wrappedErrback(reason)); - }); - }); - - return result.promise; - }; - - - function defaultCallback(value) { - return value; - } - - - function defaultErrback(reason) { - return reject(reason); - } - - - /** - * @ngdoc - * @name ng.$q#all - * @methodOf ng.$q - * @description - * Combines multiple promises into a single promise that is resolved when all of the input - * promises are resolved. - * - * @param {Array.} promises An array of promises. - * @returns {Promise} Returns a single promise that will be resolved with an array of values, - * each value corresponding to the promise at the same index in the `promises` array. If any of - * the promises is resolved with a rejection, this resulting promise will be resolved with the - * same rejection. - */ - function all(promises) { - var deferred = defer(), - counter = promises.length, - results = []; - - if (counter) { - forEach(promises, function(promise, index) { - ref(promise).then(function(value) { - if (index in results) return; - results[index] = value; - if (!(--counter)) deferred.resolve(results); - }, function(reason) { - if (index in results) return; - deferred.reject(reason); - }); - }); - } else { - deferred.resolve(results); - } - - return deferred.promise; - } - - return { - defer: defer, - reject: reject, - when: when, - all: all - }; -} - -/** - * @ngdoc object - * @name ng.$routeProvider - * @function - * - * @description - * - * Used for configuring routes. See {@link ng.$route $route} for an example. - */ -function $RouteProvider(){ - var routes = {}; - - /** - * @ngdoc method - * @name ng.$routeProvider#when - * @methodOf ng.$routeProvider - * - * @param {string} path Route path (matched against `$location.path`). If `$location.path` - * contains redundant trailing slash or is missing one, the route will still match and the - * `$location.path` will be updated to add or drop the trailing slash to exactly match the - * route definition. - * - * `path` can contain named groups starting with a colon (`:name`). All characters up to the - * next slash are matched and stored in `$routeParams` under the given `name` when the route - * matches. - * - * @param {Object} route Mapping information to be assigned to `$route.current` on route - * match. - * - * Object properties: - * - * - `controller` – `{(string|function()=}` – Controller fn that should be associated with newly - * created scope or the name of a {@link angular.Module#controller registered controller} - * if passed as a string. - * - `template` – `{string=}` – html template as a string that should be used by - * {@link ng.directive:ngView ngView} or - * {@link ng.directive:ngInclude ngInclude} directives. - * this property takes precedence over `templateUrl`. - * - `templateUrl` – `{string=}` – path to an html template that should be used by - * {@link ng.directive:ngView ngView}. - * - `resolve` - `{Object.=}` - An optional map of dependencies which should - * be injected into the controller. If any of these dependencies are promises, they will be - * resolved and converted to a value before the controller is instantiated and the - * `$routeChangeSuccess` project is fired. The map object is: - * - * - `key` – `{string}`: a name of a dependency to be injected into the controller. - * - `factory` - `{string|function}`: If `string` then it is an alias for a service. - * Otherwise if function, then it is {@link api/AUTO.$injector#invoke injected} - * and the return value is treated as the dependency. If the result is a promise, it is resolved - * before its value is injected into the controller. - * - * - `redirectTo` – {(string|function())=} – value to update - * {@link ng.$location $location} path with and trigger route redirection. - * - * If `redirectTo` is a function, it will be called with the following parameters: - * - * - `{Object.}` - route parameters extracted from the current - * `$location.path()` by applying the current route templateUrl. - * - `{string}` - current `$location.path()` - * - `{Object}` - current `$location.search()` - * - * The custom `redirectTo` function is expected to return a string which will be used - * to update `$location.path()` and `$location.search()`. - * - * - `[reloadOnSearch=true]` - {boolean=} - reload route when only $location.search() - * changes. - * - * If the option is set to `false` and url in the browser changes, then - * `$routeUpdate` project is broadcasted on the root scope. - * - * @returns {Object} self - * - * @description - * Adds a new route definition to the `$route` service. - */ - this.when = function(path, route) { - routes[path] = extend({reloadOnSearch: true}, route); - - // create redirection for trailing slashes - if (path) { - var redirectPath = (path[path.length-1] == '/') - ? path.substr(0, path.length-1) - : path +'/'; - - routes[redirectPath] = {redirectTo: path}; - } - - return this; - }; - - /** - * @ngdoc method - * @name ng.$routeProvider#otherwise - * @methodOf ng.$routeProvider - * - * @description - * Sets route definition that will be used on route change when no other route definition - * is matched. - * - * @param {Object} params Mapping information to be assigned to `$route.current`. - * @returns {Object} self - */ - this.otherwise = function(params) { - this.when(null, params); - return this; - }; - - - this.$get = ['$rootScope', '$location', '$routeParams', '$q', '$injector', '$http', '$templateCache', - function( $rootScope, $location, $routeParams, $q, $injector, $http, $templateCache) { - - /** - * @ngdoc object - * @name ng.$route - * @requires $location - * @requires $routeParams - * - * @property {Object} current Reference to the current route definition. - * The route definition contains: - * - * - `controller`: The controller constructor as define in route definition. - * - `locals`: A map of locals which is used by {@link ng.$controller $controller} service for - * controller instantiation. The `locals` contain - * the resolved values of the `resolve` map. Additionally the `locals` also contain: - * - * - `$scope` - The current route scope. - * - `$template` - The current route template HTML. - * - * @property {Array.} routes Array of all configured routes. - * - * @description - * Is used for deep-linking URLs to controllers and views (HTML partials). - * It watches `$location.url()` and tries to map the path to an existing route definition. - * - * You can define routes through {@link ng.$routeProvider $routeProvider}'s API. - * - * The `$route` service is typically used in conjunction with {@link ng.directive:ngView ngView} - * directive and the {@link ng.$routeParams $routeParams} service. - * - * @example - This example shows how changing the URL hash causes the `$route` to match a route against the - URL, and the `ngView` pulls in the partial. - - Note that this example is using {@link ng.directive:script inlined templates} - to get it working on jsfiddle as well. - - - -
- Choose: - Moby | - Moby: Ch1 | - Gatsby | - Gatsby: Ch4 | - Scarlet Letter
- -
-
- -
$location.path() = {{$location.path()}}
-
$route.current.templateUrl = {{$route.current.templateUrl}}
-
$route.current.params = {{$route.current.params}}
-
$route.current.scope.name = {{$route.current.scope.name}}
-
$routeParams = {{$routeParams}}
-
-
- - - controller: {{name}}
- Book Id: {{params.bookId}}
-
- - - controller: {{name}}
- Book Id: {{params.bookId}}
- Chapter Id: {{params.chapterId}} -
- - - angular.module('ngView', [], function($routeProvider, $locationProvider) { - $routeProvider.when('/Book/:bookId', { - templateUrl: 'book.html', - controller: BookCntl, - resolve: { - // I will cause a 1 second delay - delay: function($q, $timeout) { - var delay = $q.defer(); - $timeout(delay.resolve, 1000); - return delay.promise; - } - } - }); - $routeProvider.when('/Book/:bookId/ch/:chapterId', { - templateUrl: 'chapter.html', - controller: ChapterCntl - }); - - // configure html5 to get links working on jsfiddle - $locationProvider.html5Mode(true); - }); - - function MainCntl($scope, $route, $routeParams, $location) { - $scope.$route = $route; - $scope.$location = $location; - $scope.$routeParams = $routeParams; - } - - function BookCntl($scope, $routeParams) { - $scope.name = "BookCntl"; - $scope.params = $routeParams; - } - - function ChapterCntl($scope, $routeParams) { - $scope.name = "ChapterCntl"; - $scope.params = $routeParams; - } - - - - it('should load and compile correct template', function() { - element('a:contains("Moby: Ch1")').click(); - var content = element('.doc-example-live [ng-view]').text(); - expect(content).toMatch(/controller\: ChapterCntl/); - expect(content).toMatch(/Book Id\: Moby/); - expect(content).toMatch(/Chapter Id\: 1/); - - element('a:contains("Scarlet")').click(); - sleep(2); // promises are not part of scenario waiting - content = element('.doc-example-live [ng-view]').text(); - expect(content).toMatch(/controller\: BookCntl/); - expect(content).toMatch(/Book Id\: Scarlet/); - }); - -
- */ - - /** - * @ngdoc project - * @name ng.$route#$routeChangeStart - * @eventOf ng.$route - * @eventType broadcast on root scope - * @description - * Broadcasted before a route change. At this point the route services starts - * resolving all of the dependencies needed for the route change to occurs. - * Typically this involves fetching the view template as well as any dependencies - * defined in `resolve` route property. Once all of the dependencies are resolved - * `$routeChangeSuccess` is fired. - * - * @param {Route} next Future route information. - * @param {Route} current Current route information. - */ - - /** - * @ngdoc project - * @name ng.$route#$routeChangeSuccess - * @eventOf ng.$route - * @eventType broadcast on root scope - * @description - * Broadcasted after a route dependencies are resolved. - * {@link ng.directive:ngView ngView} listens for the directive - * to instantiate the controller and render the view. - * - * @param {Route} current Current route information. - * @param {Route} previous Previous route information. - */ - - /** - * @ngdoc project - * @name ng.$route#$routeChangeError - * @eventOf ng.$route - * @eventType broadcast on root scope - * @description - * Broadcasted if any of the resolve promises are rejected. - * - * @param {Route} current Current route information. - * @param {Route} previous Previous route information. - * @param {Route} rejection Rejection of the promise. Usually the error of the failed promise. - */ - - /** - * @ngdoc project - * @name ng.$route#$routeUpdate - * @eventOf ng.$route - * @eventType broadcast on root scope - * @description - * - * The `reloadOnSearch` property has been set to false, and we are reusing the same - * instance of the Controller. - */ - - var forceReload = false, - $route = { - routes: routes, - - /** - * @ngdoc method - * @name ng.$route#reload - * @methodOf ng.$route - * - * @description - * Causes `$route` service to reload the current route even if - * {@link ng.$location $location} hasn't changed. - * - * As a result of that, {@link ng.directive:ngView ngView} - * creates new scope, reinstantiates the controller. - */ - reload: function() { - forceReload = true; - $rootScope.$evalAsync(updateRoute); - } - }; - - $rootScope.$on('$locationChangeSuccess', updateRoute); - - return $route; - - ///////////////////////////////////////////////////// - - /** - * @param on {string} current url - * @param when {string} route when template to match the url against - * @return {?Object} - */ - function switchRouteMatcher(on, when) { - // TODO(i): this code is convoluted and inefficient, we should construct the route matching - // regex only once and then reuse it - - // Escape regexp special characters. - when = '^' + when.replace(/[-\/\\^$*+?.()|[\]{}]/g, "\\$&") + '$'; - var regex = '', - params = [], - dst = {}; - - var re = /:(\w+)/g, - paramMatch, - lastMatchedIndex = 0; - - while ((paramMatch = re.exec(when)) !== null) { - // Find each :param in `when` and replace it with a capturing group. - // Append all other sections of when unchanged. - regex += when.slice(lastMatchedIndex, paramMatch.index); - regex += '([^\\/]*)'; - params.push(paramMatch[1]); - lastMatchedIndex = re.lastIndex; - } - // Append trailing path part. - regex += when.substr(lastMatchedIndex); - - var match = on.match(new RegExp(regex)); - if (match) { - forEach(params, function(name, index) { - dst[name] = match[index + 1]; - }); - } - return match ? dst : null; - } - - function updateRoute() { - var next = parseRoute(), - last = $route.current; - - if (next && last && next.$route === last.$route - && equals(next.pathParams, last.pathParams) && !next.reloadOnSearch && !forceReload) { - last.params = next.params; - copy(last.params, $routeParams); - $rootScope.$broadcast('$routeUpdate', last); - } else if (next || last) { - forceReload = false; - $rootScope.$broadcast('$routeChangeStart', next, last); - $route.current = next; - if (next) { - if (next.redirectTo) { - if (isString(next.redirectTo)) { - $location.path(interpolate(next.redirectTo, next.params)).search(next.params) - .replace(); - } else { - $location.url(next.redirectTo(next.pathParams, $location.path(), $location.search())) - .replace(); - } - } - } - - $q.when(next). - then(function() { - if (next) { - var keys = [], - values = [], - template; - - forEach(next.resolve || {}, function(value, key) { - keys.push(key); - values.push(isString(value) ? $injector.get(value) : $injector.invoke(value)); - }); - if (isDefined(template = next.template)) { - } else if (isDefined(template = next.templateUrl)) { - template = $http.get(template, {cache: $templateCache}). - then(function(response) { return response.data; }); - } - if (isDefined(template)) { - keys.push('$template'); - values.push(template); - } - return $q.all(values).then(function(values) { - var locals = {}; - forEach(values, function(value, index) { - locals[keys[index]] = value; - }); - return locals; - }); - } - }). - // after route change - then(function(locals) { - if (next == $route.current) { - if (next) { - next.locals = locals; - copy(next.params, $routeParams); - } - $rootScope.$broadcast('$routeChangeSuccess', next, last); - } - }, function(error) { - if (next == $route.current) { - $rootScope.$broadcast('$routeChangeError', next, last, error); - } - }); - } - } - - - /** - * @returns the current active route, by matching it against the URL - */ - function parseRoute() { - // Match a route - var params, match; - forEach(routes, function(route, path) { - if (!match && (params = switchRouteMatcher($location.path(), path))) { - match = inherit(route, { - params: extend({}, $location.search(), params), - pathParams: params}); - match.$route = route; - } - }); - // No route matched; fallback to "otherwise" route - return match || routes[null] && inherit(routes[null], {params: {}, pathParams:{}}); - } - - /** - * @returns interpolation of the redirect path with the parametrs - */ - function interpolate(string, params) { - var result = []; - forEach((string||'').split(':'), function(segment, i) { - if (i == 0) { - result.push(segment); - } else { - var segmentMatch = segment.match(/(\w+)(.*)/); - var key = segmentMatch[1]; - result.push(params[key]); - result.push(segmentMatch[2] || ''); - delete params[key]; - } - }); - return result.join(''); - } - }]; -} - -/** - * @ngdoc object - * @name ng.$routeParams - * @requires $route - * - * @description - * Current set of route parameters. The route parameters are a combination of the - * {@link ng.$location $location} `search()`, and `path()`. The `path` parameters - * are extracted when the {@link ng.$route $route} path is matched. - * - * In case of parameter name collision, `path` params take precedence over `search` params. - * - * The service guarantees that the identity of the `$routeParams` object will remain unchanged - * (but its properties will likely change) even when a route change occurs. - * - * @example - *
- *  // Given:
- *  // URL: http://server.com/index.html#/Chapter/1/Section/2?search=moby
- *  // Route: /Chapter/:chapterId/Section/:sectionId
- *  //
- *  // Then
- *  $routeParams ==> {chapterId:1, sectionId:2, search:'moby'}
- * 
- */ -function $RouteParamsProvider() { - this.$get = valueFn({}); -} - -/** - * DESIGN NOTES - * - * The design decisions behind the scope ware heavily favored for speed and memory consumption. - * - * The typical use of scope is to watch the expressions, which most of the time return the same - * value as last time so we optimize the operation. - * - * Closures construction is expensive from speed as well as memory: - * - no closures, instead ups prototypical inheritance for API - * - Internal state needs to be stored on scope directly, which means that private state is - * exposed as $$____ properties - * - * Loop operations are optimized by using while(count--) { ... } - * - this means that in order to keep the same order of execution as addition we have to add - * items to the array at the begging (shift) instead of at the end (push) - * - * Child scopes are created and removed often - * - Using array would be slow since inserts in meddle are expensive so we use linked list - * - * There are few watches then a lot of observers. This is why you don't want the observer to be - * implemented in the same way as watch. Watch requires return of initialization function which - * are expensive to construct. - */ - - -/** - * @ngdoc object - * @name ng.$rootScopeProvider - * @description - * - * Provider for the $rootScope service. - */ - -/** - * @ngdoc function - * @name ng.$rootScopeProvider#digestTtl - * @methodOf ng.$rootScopeProvider - * @description - * - * Sets the number of digest iteration the scope should attempt to execute before giving up and - * assuming that the model is unstable. - * - * The current default is 10 iterations. - * - * @param {number} limit The number of digest iterations. - */ - - -/** - * @ngdoc object - * @name ng.$rootScope - * @description - * - * Every application has a single root {@link ng.$rootScope.Scope scope}. - * All other scopes are child scopes of the root scope. Scopes provide mechanism for watching the model and provide - * project processing life-cycle. See {@link guide/scope developer guide on scopes}. - */ -function $RootScopeProvider(){ - var TTL = 10; - - this.digestTtl = function(value) { - if (arguments.length) { - TTL = value; - } - return TTL; - }; - - this.$get = ['$injector', '$exceptionHandler', '$parse', - function( $injector, $exceptionHandler, $parse) { - - /** - * @ngdoc function - * @name ng.$rootScope.Scope - * - * @description - * A root scope can be retrieved using the {@link ng.$rootScope $rootScope} key from the - * {@link AUTO.$injector $injector}. Child scopes are created using the - * {@link ng.$rootScope.Scope#$new $new()} method. (Most scopes are created automatically when - * compiled HTML template is executed.) - * - * Here is a simple scope snippet to show how you can interact with the scope. - *
-        angular.injector(['ng']).invoke(function($rootScope) {
-           var scope = $rootScope.$new();
-           scope.salutation = 'Hello';
-           scope.name = 'World';
-
-           expect(scope.greeting).toEqual(undefined);
-
-           scope.$watch('name', function() {
-             scope.greeting = scope.salutation + ' ' + scope.name + '!';
-           }); // initialize the watch
-
-           expect(scope.greeting).toEqual(undefined);
-           scope.name = 'Misko';
-           // still old value, since watches have not been called yet
-           expect(scope.greeting).toEqual(undefined);
-
-           scope.$digest(); // fire all  the watches
-           expect(scope.greeting).toEqual('Hello Misko!');
-        });
-     * 
- * - * # Inheritance - * A scope can inherit from a parent scope, as in this example: - *
-         var parent = $rootScope;
-         var child = parent.$new();
-
-         parent.salutation = "Hello";
-         child.name = "World";
-         expect(child.salutation).toEqual('Hello');
-
-         child.salutation = "Welcome";
-         expect(child.salutation).toEqual('Welcome');
-         expect(parent.salutation).toEqual('Hello');
-     * 
- * - * - * @param {Object.=} providers Map of service factory which need to be provided - * for the current scope. Defaults to {@link ng}. - * @param {Object.=} instanceCache Provides pre-instantiated services which should - * append/override services provided by `providers`. This is handy when unit-testing and having - * the need to override a default service. - * @returns {Object} Newly created scope. - * - */ - function Scope() { - this.$id = nextUid(); - this.$$phase = this.$parent = this.$$watchers = - this.$$nextSibling = this.$$prevSibling = - this.$$childHead = this.$$childTail = null; - this['this'] = this.$root = this; - this.$$destroyed = false; - this.$$asyncQueue = []; - this.$$listeners = {}; - this.$$isolateBindings = {}; - } - - /** - * @ngdoc property - * @name ng.$rootScope.Scope#$id - * @propertyOf ng.$rootScope.Scope - * @returns {number} Unique scope ID (monotonically increasing alphanumeric sequence) useful for - * debugging. - */ - - - Scope.prototype = { - /** - * @ngdoc function - * @name ng.$rootScope.Scope#$new - * @methodOf ng.$rootScope.Scope - * @function - * - * @description - * Creates a new child {@link ng.$rootScope.Scope scope}. - * - * The parent scope will propagate the {@link ng.$rootScope.Scope#$digest $digest()} and - * {@link ng.$rootScope.Scope#$digest $digest()} events. The scope can be removed from the scope - * hierarchy using {@link ng.$rootScope.Scope#$destroy $destroy()}. - * - * {@link ng.$rootScope.Scope#$destroy $destroy()} must be called on a scope when it is desired for - * the scope and its child scopes to be permanently detached from the parent and thus stop - * participating in model change detection and listener notification by invoking. - * - * @param {boolean} isolate if true then the scope does not prototypically inherit from the - * parent scope. The scope is isolated, as it can not see parent scope properties. - * When creating widgets it is useful for the widget to not accidentally read parent - * state. - * - * @returns {Object} The newly created child scope. - * - */ - $new: function(isolate) { - var Child, - child; - - if (isFunction(isolate)) { - // TODO: remove at some point - throw Error('API-CHANGE: Use $controller to instantiate controllers.'); - } - if (isolate) { - child = new Scope(); - child.$root = this.$root; - } else { - Child = function() {}; // should be anonymous; This is so that when the minifier munges - // the name it does not become random set of chars. These will then show up as class - // name in the debugger. - Child.prototype = this; - child = new Child(); - child.$id = nextUid(); - } - child['this'] = child; - child.$$listeners = {}; - child.$parent = this; - child.$$asyncQueue = []; - child.$$watchers = child.$$nextSibling = child.$$childHead = child.$$childTail = null; - child.$$prevSibling = this.$$childTail; - if (this.$$childHead) { - this.$$childTail.$$nextSibling = child; - this.$$childTail = child; - } else { - this.$$childHead = this.$$childTail = child; - } - return child; - }, - - /** - * @ngdoc function - * @name ng.$rootScope.Scope#$watch - * @methodOf ng.$rootScope.Scope - * @function - * - * @description - * Registers a `listener` callback to be executed whenever the `watchExpression` changes. - * - * - The `watchExpression` is called on every call to {@link ng.$rootScope.Scope#$digest $digest()} and - * should return the value which will be watched. (Since {@link ng.$rootScope.Scope#$digest $digest()} - * reruns when it detects changes the `watchExpression` can execute multiple times per - * {@link ng.$rootScope.Scope#$digest $digest()} and should be idempotent.) - * - The `listener` is called only when the value from the current `watchExpression` and the - * previous call to `watchExpression` are not equal (with the exception of the initial run, - * see below). The inequality is determined according to - * {@link angular.equals} function. To save the value of the object for later comparison, the - * {@link angular.copy} function is used. It also means that watching complex options will - * have adverse memory and performance implications. - * - The watch `listener` may change the model, which may trigger other `listener`s to fire. This - * is achieved by rerunning the watchers until no changes are detected. The rerun iteration - * limit is 10 to prevent an infinite loop deadlock. - * - * - * If you want to be notified whenever {@link ng.$rootScope.Scope#$digest $digest} is called, - * you can register a `watchExpression` function with no `listener`. (Since `watchExpression` - * can execute multiple times per {@link ng.$rootScope.Scope#$digest $digest} cycle when a change is - * detected, be prepared for multiple calls to your listener.) - * - * After a watcher is registered with the scope, the `listener` fn is called asynchronously - * (via {@link ng.$rootScope.Scope#$evalAsync $evalAsync}) to initialize the - * watcher. In rare cases, this is undesirable because the listener is called when the result - * of `watchExpression` didn't change. To detect this scenario within the `listener` fn, you - * can compare the `newVal` and `oldVal`. If these two values are identical (`===`) then the - * listener was called due to initialization. - * - * - * # Example - *
-           // let's assume that scope was dependency injected as the $rootScope
-           var scope = $rootScope;
-           scope.name = 'misko';
-           scope.counter = 0;
-
-           expect(scope.counter).toEqual(0);
-           scope.$watch('name', function(newValue, oldValue) { scope.counter = scope.counter + 1; });
-           expect(scope.counter).toEqual(0);
-
-           scope.$digest();
-           // no variable change
-           expect(scope.counter).toEqual(0);
-
-           scope.name = 'adam';
-           scope.$digest();
-           expect(scope.counter).toEqual(1);
-       * 
- * - * - * - * @param {(function()|string)} watchExpression Expression that is evaluated on each - * {@link ng.$rootScope.Scope#$digest $digest} cycle. A change in the return value triggers a - * call to the `listener`. - * - * - `string`: Evaluated as {@link guide/expression expression} - * - `function(scope)`: called with current `scope` as a parameter. - * @param {(function()|string)=} listener Callback called whenever the return value of - * the `watchExpression` changes. - * - * - `string`: Evaluated as {@link guide/expression expression} - * - `function(newValue, oldValue, scope)`: called with current and previous values as parameters. - * - * @param {boolean=} objectEquality Compare object for equality rather than for reference. - * @returns {function()} Returns a deregistration function for this listener. - */ - $watch: function(watchExp, listener, objectEquality) { - var scope = this, - get = compileToFn(watchExp, 'watch'), - array = scope.$$watchers, - watcher = { - fn: listener, - last: initWatchVal, - get: get, - exp: watchExp, - eq: !!objectEquality - }; - - // in the case users pass string, we need to compile it, do we really need this ? - if (!isFunction(listener)) { - var listenFn = compileToFn(listener || noop, 'listener'); - watcher.fn = function(newVal, oldVal, scope) {listenFn(scope);}; - } - - if (!array) { - array = scope.$$watchers = []; - } - // we use unshift since we use a while loop in $digest for speed. - // the while loop reads in reverse order. - array.unshift(watcher); - - return function() { - arrayRemove(array, watcher); - }; - }, - - /** - * @ngdoc function - * @name ng.$rootScope.Scope#$digest - * @methodOf ng.$rootScope.Scope - * @function - * - * @description - * Process all of the {@link ng.$rootScope.Scope#$watch watchers} of the current scope and its children. - * Because a {@link ng.$rootScope.Scope#$watch watcher}'s listener can change the model, the - * `$digest()` keeps calling the {@link ng.$rootScope.Scope#$watch watchers} until no more listeners are - * firing. This means that it is possible to get into an infinite loop. This function will throw - * `'Maximum iteration limit exceeded.'` if the number of iterations exceeds 10. - * - * Usually you don't call `$digest()` directly in - * {@link ng.directive:ngController controllers} or in - * {@link ng.$compileProvider#directive directives}. - * Instead a call to {@link ng.$rootScope.Scope#$apply $apply()} (typically from within a - * {@link ng.$compileProvider#directive directives}) will force a `$digest()`. - * - * If you want to be notified whenever `$digest()` is called, - * you can register a `watchExpression` function with {@link ng.$rootScope.Scope#$watch $watch()} - * with no `listener`. - * - * You may have a need to call `$digest()` from within unit-tests, to simulate the scope - * life-cycle. - * - * # Example - *
-           var scope = ...;
-           scope.name = 'misko';
-           scope.counter = 0;
-
-           expect(scope.counter).toEqual(0);
-           scope.$watch('name', function(newValue, oldValue) {
-             scope.counter = scope.counter + 1;
-           });
-           expect(scope.counter).toEqual(0);
-
-           scope.$digest();
-           // no variable change
-           expect(scope.counter).toEqual(0);
-
-           scope.name = 'adam';
-           scope.$digest();
-           expect(scope.counter).toEqual(1);
-       * 
- * - */ - $digest: function() { - var watch, value, last, - watchers, - asyncQueue, - length, - dirty, ttl = TTL, - next, current, target = this, - watchLog = [], - logIdx, logMsg; - - beginPhase('$digest'); - - do { - dirty = false; - current = target; - do { - asyncQueue = current.$$asyncQueue; - while(asyncQueue.length) { - try { - current.$eval(asyncQueue.shift()); - } catch (e) { - $exceptionHandler(e); - } - } - if ((watchers = current.$$watchers)) { - // process our watches - length = watchers.length; - while (length--) { - try { - watch = watchers[length]; - // Most common watches are on primitives, in which case we can short - // circuit it with === operator, only when === fails do we use .equals - if ((value = watch.get(current)) !== (last = watch.last) && - !(watch.eq - ? equals(value, last) - : (typeof value == 'number' && typeof last == 'number' - && isNaN(value) && isNaN(last)))) { - dirty = true; - watch.last = watch.eq ? copy(value) : value; - watch.fn(value, ((last === initWatchVal) ? value : last), current); - if (ttl < 5) { - logIdx = 4 - ttl; - if (!watchLog[logIdx]) watchLog[logIdx] = []; - logMsg = (isFunction(watch.exp)) - ? 'fn: ' + (watch.exp.name || watch.exp.toString()) - : watch.exp; - logMsg += '; newVal: ' + toJson(value) + '; oldVal: ' + toJson(last); - watchLog[logIdx].push(logMsg); - } - } - } catch (e) { - $exceptionHandler(e); - } - } - } - - // Insanity Warning: scope depth-first traversal - // yes, this code is a bit crazy, but it works and we have tests to prove it! - // this piece should be kept in sync with the traversal in $broadcast - if (!(next = (current.$$childHead || (current !== target && current.$$nextSibling)))) { - while(current !== target && !(next = current.$$nextSibling)) { - current = current.$parent; - } - } - } while ((current = next)); - - if(dirty && !(ttl--)) { - clearPhase(); - throw Error(TTL + ' $digest() iterations reached. Aborting!\n' + - 'Watchers fired in the last 5 iterations: ' + toJson(watchLog)); - } - } while (dirty || asyncQueue.length); - - clearPhase(); - }, - - - /** - * @ngdoc project - * @name ng.$rootScope.Scope#$destroy - * @eventOf ng.$rootScope.Scope - * @eventType broadcast on scope being destroyed - * - * @description - * Broadcasted when a scope and its children are being destroyed. - */ - - /** - * @ngdoc function - * @name ng.$rootScope.Scope#$destroy - * @methodOf ng.$rootScope.Scope - * @function - * - * @description - * Removes the current scope (and all of its children) from the parent scope. Removal implies - * that calls to {@link ng.$rootScope.Scope#$digest $digest()} will no longer - * propagate to the current scope and its children. Removal also implies that the current - * scope is eligible for garbage collection. - * - * The `$destroy()` is usually used by directives such as - * {@link ng.directive:ngRepeat ngRepeat} for managing the - * unrolling of the loop. - * - * Just before a scope is destroyed a `$destroy` project is broadcasted on this scope. - * Application code can register a `$destroy` project handler that will give it chance to - * perform any necessary cleanup. - */ - $destroy: function() { - // we can't destroy the root scope or a scope that has been already destroyed - if ($rootScope == this || this.$$destroyed) return; - var parent = this.$parent; - - this.$broadcast('$destroy'); - this.$$destroyed = true; - - if (parent.$$childHead == this) parent.$$childHead = this.$$nextSibling; - if (parent.$$childTail == this) parent.$$childTail = this.$$prevSibling; - if (this.$$prevSibling) this.$$prevSibling.$$nextSibling = this.$$nextSibling; - if (this.$$nextSibling) this.$$nextSibling.$$prevSibling = this.$$prevSibling; - - // This is bogus code that works around Chrome's GC leak - // see: https://github.com/angular/angular.js/issues/1313#issuecomment-10378451 - this.$parent = this.$$nextSibling = this.$$prevSibling = this.$$childHead = - this.$$childTail = null; - }, - - /** - * @ngdoc function - * @name ng.$rootScope.Scope#$eval - * @methodOf ng.$rootScope.Scope - * @function - * - * @description - * Executes the `expression` on the current scope returning the result. Any exceptions in the - * expression are propagated (uncaught). This is useful when evaluating Angular expressions. - * - * # Example - *
-           var scope = ng.$rootScope.Scope();
-           scope.a = 1;
-           scope.b = 2;
-
-           expect(scope.$eval('a+b')).toEqual(3);
-           expect(scope.$eval(function(scope){ return scope.a + scope.b; })).toEqual(3);
-       * 
- * - * @param {(string|function())=} expression An angular expression to be executed. - * - * - `string`: execute using the rules as defined in {@link guide/expression expression}. - * - `function(scope)`: execute the function with the current `scope` parameter. - * - * @returns {*} The result of evaluating the expression. - */ - $eval: function(expr, locals) { - return $parse(expr)(this, locals); - }, - - /** - * @ngdoc function - * @name ng.$rootScope.Scope#$evalAsync - * @methodOf ng.$rootScope.Scope - * @function - * - * @description - * Executes the expression on the current scope at a later point in time. - * - * The `$evalAsync` makes no guarantees as to when the `expression` will be executed, only that: - * - * - it will execute in the current script execution context (before any DOM rendering). - * - at least one {@link ng.$rootScope.Scope#$digest $digest cycle} will be performed after - * `expression` execution. - * - * Any exceptions from the execution of the expression are forwarded to the - * {@link ng.$exceptionHandler $exceptionHandler} service. - * - * @param {(string|function())=} expression An angular expression to be executed. - * - * - `string`: execute using the rules as defined in {@link guide/expression expression}. - * - `function(scope)`: execute the function with the current `scope` parameter. - * - */ - $evalAsync: function(expr) { - this.$$asyncQueue.push(expr); - }, - - /** - * @ngdoc function - * @name ng.$rootScope.Scope#$apply - * @methodOf ng.$rootScope.Scope - * @function - * - * @description - * `$apply()` is used to execute an expression in angular from outside of the angular framework. - * (For example from browser DOM events, setTimeout, XHR or third party libraries). - * Because we are calling into the angular framework we need to perform proper scope life-cycle - * of {@link ng.$exceptionHandler exception handling}, - * {@link ng.$rootScope.Scope#$digest executing watches}. - * - * ## Life cycle - * - * # Pseudo-Code of `$apply()` - *
-           function $apply(expr) {
-             try {
-               return $eval(expr);
-             } catch (e) {
-               $exceptionHandler(e);
-             } finally {
-               $root.$digest();
-             }
-           }
-       * 
- * - * - * Scope's `$apply()` method transitions through the following stages: - * - * 1. The {@link guide/expression expression} is executed using the - * {@link ng.$rootScope.Scope#$eval $eval()} method. - * 2. Any exceptions from the execution of the expression are forwarded to the - * {@link ng.$exceptionHandler $exceptionHandler} service. - * 3. The {@link ng.$rootScope.Scope#$watch watch} listeners are fired immediately after the expression - * was executed using the {@link ng.$rootScope.Scope#$digest $digest()} method. - * - * - * @param {(string|function())=} exp An angular expression to be executed. - * - * - `string`: execute using the rules as defined in {@link guide/expression expression}. - * - `function(scope)`: execute the function with current `scope` parameter. - * - * @returns {*} The result of evaluating the expression. - */ - $apply: function(expr) { - try { - beginPhase('$apply'); - return this.$eval(expr); - } catch (e) { - $exceptionHandler(e); - } finally { - clearPhase(); - try { - $rootScope.$digest(); - } catch (e) { - $exceptionHandler(e); - throw e; - } - } - }, - - /** - * @ngdoc function - * @name ng.$rootScope.Scope#$on - * @methodOf ng.$rootScope.Scope - * @function - * - * @description - * Listens on events of a given type. See {@link ng.$rootScope.Scope#$emit $emit} for discussion of - * project life cycle. - * - * The project listener function format is: `function(project, args...)`. The `project` object - * passed into the listener has the following attributes: - * - * - `targetScope` - `{Scope}`: the scope on which the project was `$emit`-ed or `$broadcast`-ed. - * - `currentScope` - `{Scope}`: the current scope which is handling the project. - * - `name` - `{string}`: Name of the project. - * - `stopPropagation` - `{function=}`: calling `stopPropagation` function will cancel further project - * propagation (available only for events that were `$emit`-ed). - * - `preventDefault` - `{function}`: calling `preventDefault` sets `defaultPrevented` flag to true. - * - `defaultPrevented` - `{boolean}`: true if `preventDefault` was called. - * - * @param {string} name Event name to listen on. - * @param {function(event, args...)} listener Function to call when the project is emitted. - * @returns {function()} Returns a deregistration function for this listener. - */ - $on: function(name, listener) { - var namedListeners = this.$$listeners[name]; - if (!namedListeners) { - this.$$listeners[name] = namedListeners = []; - } - namedListeners.push(listener); - - return function() { - namedListeners[indexOf(namedListeners, listener)] = null; - }; - }, - - - /** - * @ngdoc function - * @name ng.$rootScope.Scope#$emit - * @methodOf ng.$rootScope.Scope - * @function - * - * @description - * Dispatches an project `name` upwards through the scope hierarchy notifying the - * registered {@link ng.$rootScope.Scope#$on} listeners. - * - * The project life cycle starts at the scope on which `$emit` was called. All - * {@link ng.$rootScope.Scope#$on listeners} listening for `name` project on this scope get notified. - * Afterwards, the project traverses upwards toward the root scope and calls all registered - * listeners along the way. The project will stop propagating if one of the listeners cancels it. - * - * Any exception emmited from the {@link ng.$rootScope.Scope#$on listeners} will be passed - * onto the {@link ng.$exceptionHandler $exceptionHandler} service. - * - * @param {string} name Event name to emit. - * @param {...*} args Optional set of arguments which will be passed onto the project listeners. - * @return {Object} Event object, see {@link ng.$rootScope.Scope#$on} - */ - $emit: function(name, args) { - var empty = [], - namedListeners, - scope = this, - stopPropagation = false, - event = { - name: name, - targetScope: scope, - stopPropagation: function() {stopPropagation = true;}, - preventDefault: function() { - event.defaultPrevented = true; - }, - defaultPrevented: false - }, - listenerArgs = concat([event], arguments, 1), - i, length; - - do { - namedListeners = scope.$$listeners[name] || empty; - event.currentScope = scope; - for (i=0, length=namedListeners.length; i 7), - hasEvent: function(event) { - // IE9 implements 'input' project it's so fubared that we rather pretend that it doesn't have - // it. In particular the project is not fired when backspace or delete key are pressed or - // when cut operation is performed. - if (event == 'input' && msie == 9) return false; - - if (isUndefined(eventSupport[event])) { - var divElm = $window.document.createElement('div'); - eventSupport[event] = 'on' + event in divElm; - } - - return eventSupport[event]; - }, - // TODO(i): currently there is no way to feature detect CSP without triggering alerts - csp: false - }; - }]; -} - -/** - * @ngdoc object - * @name ng.$window - * - * @description - * A reference to the browser's `window` object. While `window` - * is globally available in JavaScript, it causes testability problems, because - * it is a global variable. In angular we always refer to it through the - * `$window` service, so it may be overriden, removed or mocked for testing. - * - * All expressions are evaluated with respect to current scope so they don't - * suffer from window globality. - * - * @example - - - - - - - - - */ -function $WindowProvider(){ - this.$get = valueFn(window); -} - -/** - * Parse headers into key value object - * - * @param {string} headers Raw headers as a string - * @returns {Object} Parsed headers as key value object - */ -function parseHeaders(headers) { - var parsed = {}, key, val, i; - - if (!headers) return parsed; - - forEach(headers.split('\n'), function(line) { - i = line.indexOf(':'); - key = lowercase(trim(line.substr(0, i))); - val = trim(line.substr(i + 1)); - - if (key) { - if (parsed[key]) { - parsed[key] += ', ' + val; - } else { - parsed[key] = val; - } - } - }); - - return parsed; -} - - -/** - * Returns a function that provides access to parsed headers. - * - * Headers are lazy parsed when first requested. - * @see parseHeaders - * - * @param {(string|Object)} headers Headers to provide access to. - * @returns {function(string=)} Returns a getter function which if called with: - * - * - if called with single an argument returns a single header value or null - * - if called with no arguments returns an object containing all headers. - */ -function headersGetter(headers) { - var headersObj = isObject(headers) ? headers : undefined; - - return function(name) { - if (!headersObj) headersObj = parseHeaders(headers); - - if (name) { - return headersObj[lowercase(name)] || null; - } - - return headersObj; - }; -} - - -/** - * Chain all given functions - * - * This function is used for both request and response transforming - * - * @param {*} data Data to transform. - * @param {function(string=)} headers Http headers getter fn. - * @param {(function|Array.)} fns Function or an array of functions. - * @returns {*} Transformed data. - */ -function transformData(data, headers, fns) { - if (isFunction(fns)) - return fns(data, headers); - - forEach(fns, function(fn) { - data = fn(data, headers); - }); - - return data; -} - - -function isSuccess(status) { - return 200 <= status && status < 300; -} - - -function $HttpProvider() { - var JSON_START = /^\s*(\[|\{[^\{])/, - JSON_END = /[\}\]]\s*$/, - PROTECTION_PREFIX = /^\)\]\}',?\n/; - - var $config = this.defaults = { - // transform incoming response data - transformResponse: [function(data) { - if (isString(data)) { - // strip json vulnerability protection prefix - data = data.replace(PROTECTION_PREFIX, ''); - if (JSON_START.test(data) && JSON_END.test(data)) - data = fromJson(data, true); - } - return data; - }], - - // transform outgoing request data - transformRequest: [function(d) { - return isObject(d) && !isFile(d) ? toJson(d) : d; - }], - - // default headers - headers: { - common: { - 'Accept': 'application/json, text/plain, */*', - 'X-Requested-With': 'XMLHttpRequest' - }, - post: {'Content-Type': 'application/json;charset=utf-8'}, - put: {'Content-Type': 'application/json;charset=utf-8'} - } - }; - - var providerResponseInterceptors = this.responseInterceptors = []; - - this.$get = ['$httpBackend', '$browser', '$cacheFactory', '$rootScope', '$q', '$injector', - function($httpBackend, $browser, $cacheFactory, $rootScope, $q, $injector) { - - var defaultCache = $cacheFactory('$http'), - responseInterceptors = []; - - forEach(providerResponseInterceptors, function(interceptor) { - responseInterceptors.push( - isString(interceptor) - ? $injector.get(interceptor) - : $injector.invoke(interceptor) - ); - }); - - - /** - * @ngdoc function - * @name ng.$http - * @requires $httpBackend - * @requires $browser - * @requires $cacheFactory - * @requires $rootScope - * @requires $q - * @requires $injector - * - * @description - * The `$http` service is a core Angular service that facilitates communication with the remote - * HTTP servers via browser's {@link https://developer.mozilla.org/en/xmlhttprequest - * XMLHttpRequest} object or via {@link http://en.wikipedia.org/wiki/JSONP JSONP}. - * - * For unit testing applications that use `$http` service, see - * {@link ngMock.$httpBackend $httpBackend mock}. - * - * For a higher level of abstraction, please check out the {@link ngResource.$resource - * $resource} service. - * - * The $http API is based on the {@link ng.$q deferred/promise APIs} exposed by - * the $q service. While for simple usage patters this doesn't matter much, for advanced usage, - * it is important to familiarize yourself with these apis and guarantees they provide. - * - * - * # General usage - * The `$http` service is a function which takes a single argument — a configuration object — - * that is used to generate an http request and returns a {@link ng.$q promise} - * with two $http specific methods: `success` and `error`. - * - *
-     *   $http({method: 'GET', url: '/someUrl'}).
-     *     success(function(data, status, headers, config) {
-     *       // this callback will be called asynchronously
-     *       // when the response is available
-     *     }).
-     *     error(function(data, status, headers, config) {
-     *       // called asynchronously if an error occurs
-     *       // or server returns response with an error status.
-     *     });
-     * 
- * - * Since the returned value of calling the $http function is a Promise object, you can also use - * the `then` method to register callbacks, and these callbacks will receive a single argument – - * an object representing the response. See the api signature and type info below for more - * details. - * - * A response status code that falls in the [200, 300) range is considered a success status and - * will result in the success callback being called. Note that if the response is a redirect, - * XMLHttpRequest will transparently follow it, meaning that the error callback will not be - * called for such responses. - * - * # Shortcut methods - * - * Since all invocation of the $http service require definition of the http method and url and - * POST and PUT requests require response body/data to be provided as well, shortcut methods - * were created to simplify using the api: - * - *
-     *   $http.get('/someUrl').success(successCallback);
-     *   $http.post('/someUrl', data).success(successCallback);
-     * 
- * - * Complete list of shortcut methods: - * - * - {@link ng.$http#get $http.get} - * - {@link ng.$http#head $http.head} - * - {@link ng.$http#post $http.post} - * - {@link ng.$http#put $http.put} - * - {@link ng.$http#delete $http.delete} - * - {@link ng.$http#jsonp $http.jsonp} - * - * - * # Setting HTTP Headers - * - * The $http service will automatically add certain http headers to all requests. These defaults - * can be fully configured by accessing the `$httpProvider.defaults.headers` configuration - * object, which currently contains this default configuration: - * - * - `$httpProvider.defaults.headers.common` (headers that are common for all requests): - * - `Accept: application/json, text/plain, * / *` - * - `X-Requested-With: XMLHttpRequest` - * - `$httpProvider.defaults.headers.post`: (header defaults for HTTP POST requests) - * - `Content-Type: application/json` - * - `$httpProvider.defaults.headers.put` (header defaults for HTTP PUT requests) - * - `Content-Type: application/json` - * - * To add or overwrite these defaults, simply add or remove a property from this configuration - * objects. To add headers for an HTTP method other than POST or PUT, simply add a new object - * with name equal to the lower-cased http method name, e.g. - * `$httpProvider.defaults.headers.get['My-Header']='value'`. - * - * Additionally, the defaults can be set at runtime via the `$http.defaults` object in a similar - * fassion as described above. - * - * - * # Transforming Requests and Responses - * - * Both requests and responses can be transformed using transform functions. By default, Angular - * applies these transformations: - * - * Request transformations: - * - * - if the `data` property of the request config object contains an object, serialize it into - * JSON format. - * - * Response transformations: - * - * - if XSRF prefix is detected, strip it (see Security Considerations section below) - * - if json response is detected, deserialize it using a JSON parser - * - * To override these transformation locally, specify transform functions as `transformRequest` - * and/or `transformResponse` properties of the config object. To globally override the default - * transforms, override the `$httpProvider.defaults.transformRequest` and - * `$httpProvider.defaults.transformResponse` properties of the `$httpProvider`. - * - * - * # Caching - * - * To enable caching set the configuration property `cache` to `true`. When the cache is - * enabled, `$http` stores the response from the server in local cache. Next time the - * response is served from the cache without sending a request to the server. - * - * Note that even if the response is served from cache, delivery of the data is asynchronous in - * the same way that real requests are. - * - * If there are multiple GET requests for the same url that should be cached using the same - * cache, but the cache is not populated yet, only one request to the server will be made and - * the remaining requests will be fulfilled using the response for the first request. - * - * - * # Response interceptors - * - * Before you start creating interceptors, be sure to understand the - * {@link ng.$q $q and deferred/promise APIs}. - * - * For purposes of global error handling, authentication or any kind of synchronous or - * asynchronous preprocessing of received responses, it is desirable to be able to intercept - * responses for http requests before they are handed over to the application code that - * initiated these requests. The response interceptors leverage the {@link ng.$q - * promise apis} to fulfil this need for both synchronous and asynchronous preprocessing. - * - * The interceptors are service factories that are registered with the $httpProvider by - * adding them to the `$httpProvider.responseInterceptors` array. The factory is called and - * injected with dependencies (if specified) and returns the interceptor — a function that - * takes a {@link ng.$q promise} and returns the original or a new promise. - * - *
-     *   // register the interceptor as a service
-     *   $provide.factory('myHttpInterceptor', function($q, dependency1, dependency2) {
-     *     return function(promise) {
-     *       return promise.then(function(response) {
-     *         // do something on success
-     *       }, function(response) {
-     *         // do something on error
-     *         if (canRecover(response)) {
-     *           return responseOrNewPromise
-     *         }
-     *         return $q.reject(response);
-     *       });
-     *     }
-     *   });
-     *
-     *   $httpProvider.responseInterceptors.push('myHttpInterceptor');
-     *
-     *
-     *   // register the interceptor via an anonymous factory
-     *   $httpProvider.responseInterceptors.push(function($q, dependency1, dependency2) {
-     *     return function(promise) {
-     *       // same as above
-     *     }
-     *   });
-     * 
- * - * - * # Security Considerations - * - * When designing web applications, consider security threats from: - * - * - {@link http://haacked.com/archive/2008/11/20/anatomy-of-a-subtle-json-vulnerability.aspx - * JSON Vulnerability} - * - {@link http://en.wikipedia.org/wiki/Cross-site_request_forgery XSRF} - * - * Both server and the client must cooperate in order to eliminate these threats. Angular comes - * pre-configured with strategies that address these issues, but for this to work backend server - * cooperation is required. - * - * ## JSON Vulnerability Protection - * - * A {@link http://haacked.com/archive/2008/11/20/anatomy-of-a-subtle-json-vulnerability.aspx - * JSON Vulnerability} allows third party web-site to turn your JSON resource URL into - * {@link http://en.wikipedia.org/wiki/JSON#JSONP JSONP} request under some conditions. To - * counter this your server can prefix all JSON requests with following string `")]}',\n"`. - * Angular will automatically strip the prefix before processing it as JSON. - * - * For example if your server needs to return: - *
-     * ['one','two']
-     * 
- * - * which is vulnerable to attack, your server can return: - *
-     * )]}',
-     * ['one','two']
-     * 
- * - * Angular will strip the prefix, before processing the JSON. - * - * - * ## Cross Site Request Forgery (XSRF) Protection - * - * {@link http://en.wikipedia.org/wiki/Cross-site_request_forgery XSRF} is a technique by which - * an unauthorized site can gain your users's private data. Angular provides following mechanism - * to counter XSRF. When performing XHR requests, the $http service reads a token from a cookie - * called `XSRF-TOKEN` and sets it as the HTTP header `X-XSRF-TOKEN`. Since only JavaScript that - * runs on your domain could read the cookie, your server can be assured that the XHR came from - * JavaScript running on your domain. - * - * To take advantage of this, your server needs to set a token in a JavaScript readable session - * cookie called `XSRF-TOKEN` on first HTTP GET request. On subsequent non-GET requests the - * server can verify that the cookie matches `X-XSRF-TOKEN` HTTP header, and therefore be sure - * that only JavaScript running on your domain could have read the token. The token must be - * unique for each users and must be verifiable by the server (to prevent the JavaScript making - * up its own tokens). We recommend that the token is a digest of your site's authentication - * cookie with {@link http://en.wikipedia.org/wiki/Rainbow_table salt for added security}. - * - * - * @param {object} config Object describing the request to be made and how it should be - * processed. The object has following properties: - * - * - **method** – `{string}` – HTTP method (e.g. 'GET', 'POST', etc) - * - **url** – `{string}` – Absolute or relative URL of the resource that is being requested. - * - **params** – `{Object.}` – Map of strings or objects which will be turned to - * `?key1=value1&key2=value2` after the url. If the value is not a string, it will be JSONified. - * - **data** – `{string|Object}` – Data to be sent as the request message data. - * - **headers** – `{Object}` – Map of strings representing HTTP headers to send to the server. - * - **transformRequest** – `{function(data, headersGetter)|Array.}` – - * transform function or an array of such functions. The transform function takes the http - * request body and headers and returns its transformed (typically serialized) version. - * - **transformResponse** – `{function(data, headersGetter)|Array.}` – - * transform function or an array of such functions. The transform function takes the http - * response body and headers and returns its transformed (typically deserialized) version. - * - **cache** – `{boolean|Cache}` – If true, a default $http cache will be used to cache the - * GET request, otherwise if a cache instance built with - * {@link ng.$cacheFactory $cacheFactory}, this cache will be used for - * caching. - * - **timeout** – `{number}` – timeout in milliseconds. - * - **withCredentials** - `{boolean}` - whether to to set the `withCredentials` flag on the - * XHR object. See {@link https://developer.mozilla.org/en/http_access_control#section_5 - * requests with credentials} for more information. - * - * @returns {HttpPromise} Returns a {@link ng.$q promise} object with the - * standard `then` method and two http specific methods: `success` and `error`. The `then` - * method takes two arguments a success and an error callback which will be called with a - * response object. The `success` and `error` methods take a single argument - a function that - * will be called when the request succeeds or fails respectively. The arguments passed into - * these functions are destructured representation of the response object passed into the - * `then` method. The response object has these properties: - * - * - **data** – `{string|Object}` – The response body transformed with the transform functions. - * - **status** – `{number}` – HTTP status code of the response. - * - **headers** – `{function([headerName])}` – Header getter function. - * - **config** – `{Object}` – The configuration object that was used to generate the request. - * - * @property {Array.} pendingRequests Array of config objects for currently pending - * requests. This is primarily meant to be used for debugging purposes. - * - * - * @example - - -
- - -
- - - -
http status code: {{status}}
-
http response data: {{data}}
-
-
- - function FetchCtrl($scope, $http, $templateCache) { - $scope.method = 'GET'; - $scope.url = 'http-hello.html'; - - $scope.fetch = function() { - $scope.code = null; - $scope.response = null; - - $http({method: $scope.method, url: $scope.url, cache: $templateCache}). - success(function(data, status) { - $scope.status = status; - $scope.data = data; - }). - error(function(data, status) { - $scope.data = data || "Request failed"; - $scope.status = status; - }); - }; - - $scope.updateModel = function(method, url) { - $scope.method = method; - $scope.url = url; - }; - } - - - Hello, $http! - - - it('should make an xhr GET request', function() { - element(':button:contains("Sample GET")').click(); - element(':button:contains("fetch")').click(); - expect(binding('status')).toBe('200'); - expect(binding('data')).toMatch(/Hello, \$http!/); - }); - - it('should make a JSONP request to angularjs.org', function() { - element(':button:contains("Sample JSONP")').click(); - element(':button:contains("fetch")').click(); - expect(binding('status')).toBe('200'); - expect(binding('data')).toMatch(/Super Hero!/); - }); - - it('should make JSONP request to invalid URL and invoke the error handler', - function() { - element(':button:contains("Invalid JSONP")').click(); - element(':button:contains("fetch")').click(); - expect(binding('status')).toBe('0'); - expect(binding('data')).toBe('Request failed'); - }); - -
- */ - function $http(config) { - config.method = uppercase(config.method); - - var reqTransformFn = config.transformRequest || $config.transformRequest, - respTransformFn = config.transformResponse || $config.transformResponse, - defHeaders = $config.headers, - reqHeaders = extend({'X-XSRF-TOKEN': $browser.cookies()['XSRF-TOKEN']}, - defHeaders.common, defHeaders[lowercase(config.method)], config.headers), - reqData = transformData(config.data, headersGetter(reqHeaders), reqTransformFn), - promise; - - // strip content-type if data is undefined - if (isUndefined(config.data)) { - delete reqHeaders['Content-Type']; - } - - // send request - promise = sendReq(config, reqData, reqHeaders); - - - // transform future response - promise = promise.then(transformResponse, transformResponse); - - // apply interceptors - forEach(responseInterceptors, function(interceptor) { - promise = interceptor(promise); - }); - - promise.success = function(fn) { - promise.then(function(response) { - fn(response.data, response.status, response.headers, config); - }); - return promise; - }; - - promise.error = function(fn) { - promise.then(null, function(response) { - fn(response.data, response.status, response.headers, config); - }); - return promise; - }; - - return promise; - - function transformResponse(response) { - // make a copy since the response must be cacheable - var resp = extend({}, response, { - data: transformData(response.data, response.headers, respTransformFn) - }); - return (isSuccess(response.status)) - ? resp - : $q.reject(resp); - } - } - - $http.pendingRequests = []; - - /** - * @ngdoc method - * @name ng.$http#get - * @methodOf ng.$http - * - * @description - * Shortcut method to perform `GET` request - * - * @param {string} url Relative or absolute URL specifying the destination of the request - * @param {Object=} config Optional configuration object - * @returns {HttpPromise} Future object - */ - - /** - * @ngdoc method - * @name ng.$http#delete - * @methodOf ng.$http - * - * @description - * Shortcut method to perform `DELETE` request - * - * @param {string} url Relative or absolute URL specifying the destination of the request - * @param {Object=} config Optional configuration object - * @returns {HttpPromise} Future object - */ - - /** - * @ngdoc method - * @name ng.$http#head - * @methodOf ng.$http - * - * @description - * Shortcut method to perform `HEAD` request - * - * @param {string} url Relative or absolute URL specifying the destination of the request - * @param {Object=} config Optional configuration object - * @returns {HttpPromise} Future object - */ - - /** - * @ngdoc method - * @name ng.$http#jsonp - * @methodOf ng.$http - * - * @description - * Shortcut method to perform `JSONP` request - * - * @param {string} url Relative or absolute URL specifying the destination of the request. - * Should contain `JSON_CALLBACK` string. - * @param {Object=} config Optional configuration object - * @returns {HttpPromise} Future object - */ - createShortMethods('get', 'delete', 'head', 'jsonp'); - - /** - * @ngdoc method - * @name ng.$http#post - * @methodOf ng.$http - * - * @description - * Shortcut method to perform `POST` request - * - * @param {string} url Relative or absolute URL specifying the destination of the request - * @param {*} data Request content - * @param {Object=} config Optional configuration object - * @returns {HttpPromise} Future object - */ - - /** - * @ngdoc method - * @name ng.$http#put - * @methodOf ng.$http - * - * @description - * Shortcut method to perform `PUT` request - * - * @param {string} url Relative or absolute URL specifying the destination of the request - * @param {*} data Request content - * @param {Object=} config Optional configuration object - * @returns {HttpPromise} Future object - */ - createShortMethodsWithData('post', 'put'); - - /** - * @ngdoc property - * @name ng.$http#defaults - * @propertyOf ng.$http - * - * @description - * Runtime equivalent of the `$httpProvider.defaults` property. Allows configuration of - * default headers as well as request and response transformations. - * - * See "Setting HTTP Headers" and "Transforming Requests and Responses" sections above. - */ - $http.defaults = $config; - - - return $http; - - - function createShortMethods(names) { - forEach(arguments, function(name) { - $http[name] = function(url, config) { - return $http(extend(config || {}, { - method: name, - url: url - })); - }; - }); - } - - - function createShortMethodsWithData(name) { - forEach(arguments, function(name) { - $http[name] = function(url, data, config) { - return $http(extend(config || {}, { - method: name, - url: url, - data: data - })); - }; - }); - } - - - /** - * Makes the request - * - * !!! ACCESSES CLOSURE VARS: - * $httpBackend, $config, $log, $rootScope, defaultCache, $http.pendingRequests - */ - function sendReq(config, reqData, reqHeaders) { - var deferred = $q.defer(), - promise = deferred.promise, - cache, - cachedResp, - url = buildUrl(config.url, config.params); - - $http.pendingRequests.push(config); - promise.then(removePendingReq, removePendingReq); - - - if (config.cache && config.method == 'GET') { - cache = isObject(config.cache) ? config.cache : defaultCache; - } - - if (cache) { - cachedResp = cache.get(url); - if (cachedResp) { - if (cachedResp.then) { - // cached request has already been sent, but there is no response yet - cachedResp.then(removePendingReq, removePendingReq); - return cachedResp; - } else { - // serving from cache - if (isArray(cachedResp)) { - resolvePromise(cachedResp[1], cachedResp[0], copy(cachedResp[2])); - } else { - resolvePromise(cachedResp, 200, {}); - } - } - } else { - // put the promise for the non-transformed response into cache as a placeholder - cache.put(url, promise); - } - } - - // if we won't have the response in cache, send the request to the backend - if (!cachedResp) { - $httpBackend(config.method, url, reqData, done, reqHeaders, config.timeout, - config.withCredentials); - } - - return promise; - - - /** - * Callback registered to $httpBackend(): - * - caches the response if desired - * - resolves the raw $http promise - * - calls $apply - */ - function done(status, response, headersString) { - if (cache) { - if (isSuccess(status)) { - cache.put(url, [status, response, parseHeaders(headersString)]); - } else { - // remove promise from the cache - cache.remove(url); - } - } - - resolvePromise(response, status, headersString); - $rootScope.$apply(); - } - - - /** - * Resolves the raw $http promise. - */ - function resolvePromise(response, status, headers) { - // normalize internal statuses to 0 - status = Math.max(status, 0); - - (isSuccess(status) ? deferred.resolve : deferred.reject)({ - data: response, - status: status, - headers: headersGetter(headers), - config: config - }); - } - - - function removePendingReq() { - var idx = indexOf($http.pendingRequests, config); - if (idx !== -1) $http.pendingRequests.splice(idx, 1); - } - } - - - function buildUrl(url, params) { - if (!params) return url; - var parts = []; - forEachSorted(params, function(value, key) { - if (value == null || value == undefined) return; - if (isObject(value)) { - value = toJson(value); - } - parts.push(encodeURIComponent(key) + '=' + encodeURIComponent(value)); - }); - return url + ((url.indexOf('?') == -1) ? '?' : '&') + parts.join('&'); - } - - - }]; -} -var XHR = window.XMLHttpRequest || function() { - try { return new ActiveXObject("Msxml2.XMLHTTP.6.0"); } catch (e1) {} - try { return new ActiveXObject("Msxml2.XMLHTTP.3.0"); } catch (e2) {} - try { return new ActiveXObject("Msxml2.XMLHTTP"); } catch (e3) {} - throw new Error("This browser does not support XMLHttpRequest."); -}; - - -/** - * @ngdoc object - * @name ng.$httpBackend - * @requires $browser - * @requires $window - * @requires $document - * - * @description - * HTTP backend used by the {@link ng.$http service} that delegates to - * XMLHttpRequest object or JSONP and deals with browser incompatibilities. - * - * You should never need to use this service directly, instead use the higher-level abstractions: - * {@link ng.$http $http} or {@link ngResource.$resource $resource}. - * - * During testing this implementation is swapped with {@link ngMock.$httpBackend mock - * $httpBackend} which can be trained with responses. - */ -function $HttpBackendProvider() { - this.$get = ['$browser', '$window', '$document', function($browser, $window, $document) { - return createHttpBackend($browser, XHR, $browser.defer, $window.angular.callbacks, - $document[0], $window.location.protocol.replace(':', '')); - }]; -} - -function createHttpBackend($browser, XHR, $browserDefer, callbacks, rawDocument, locationProtocol) { - // TODO(vojta): fix the signature - return function(method, url, post, callback, headers, timeout, withCredentials) { - $browser.$$incOutstandingRequestCount(); - url = url || $browser.url(); - - if (lowercase(method) == 'jsonp') { - var callbackId = '_' + (callbacks.counter++).toString(36); - callbacks[callbackId] = function(data) { - callbacks[callbackId].data = data; - }; - - jsonpReq(url.replace('JSON_CALLBACK', 'angular.callbacks.' + callbackId), - function() { - if (callbacks[callbackId].data) { - completeRequest(callback, 200, callbacks[callbackId].data); - } else { - completeRequest(callback, -2); - } - delete callbacks[callbackId]; - }); - } else { - var xhr = new XHR(); - xhr.open(method, url, true); - forEach(headers, function(value, key) { - if (value) xhr.setRequestHeader(key, value); - }); - - var status; - - // In IE6 and 7, this might be called synchronously when xhr.send below is called and the - // response is in the cache. the promise api will ensure that to the app code the api is - // always async - xhr.onreadystatechange = function() { - if (xhr.readyState == 4) { - var responseHeaders = xhr.getAllResponseHeaders(); - - // TODO(vojta): remove once Firefox 21 gets released. - // begin: workaround to overcome Firefox CORS http response headers bug - // https://bugzilla.mozilla.org/show_bug.cgi?id=608735 - // Firefox already patched in nightly. Should land in Firefox 21. - - // CORS "simple response headers" http://www.w3.org/TR/cors/ - var value, - simpleHeaders = ["Cache-Control", "Content-Language", "Content-Type", - "Expires", "Last-Modified", "Pragma"]; - if (!responseHeaders) { - responseHeaders = ""; - forEach(simpleHeaders, function (header) { - var value = xhr.getResponseHeader(header); - if (value) { - responseHeaders += header + ": " + value + "\n"; - } - }); - } - // end of the workaround. - - completeRequest(callback, status || xhr.status, xhr.responseText, - responseHeaders); - } - }; - - if (withCredentials) { - xhr.withCredentials = true; - } - - xhr.send(post || ''); - - if (timeout > 0) { - $browserDefer(function() { - status = -1; - xhr.abort(); - }, timeout); - } - } - - - function completeRequest(callback, status, response, headersString) { - // URL_MATCH is defined in src/service/location.js - var protocol = (url.match(URL_MATCH) || ['', locationProtocol])[1]; - - // fix status code for file protocol (it's always 0) - status = (protocol == 'file') ? (response ? 200 : 404) : status; - - // normalize IE bug (http://bugs.jquery.com/ticket/1450) - status = status == 1223 ? 204 : status; - - callback(status, response, headersString); - $browser.$$completeOutstandingRequest(noop); - } - }; - - function jsonpReq(url, done) { - // we can't use jQuery/jqLite here because jQuery does crazy shit with script elements, e.g.: - // - fetches local scripts via XHR and evals them - // - adds and immediately removes script elements from the document - var script = rawDocument.createElement('script'), - doneWrapper = function() { - rawDocument.body.removeChild(script); - if (done) done(); - }; - - script.type = 'text/javascript'; - script.src = url; - - if (msie) { - script.onreadystatechange = function() { - if (/loaded|complete/.test(script.readyState)) doneWrapper(); - }; - } else { - script.onload = script.onerror = doneWrapper; - } - - rawDocument.body.appendChild(script); - } -} - -/** - * @ngdoc object - * @name ng.$locale - * - * @description - * $locale service provides localization rules for various Angular components. As of right now the - * only public api is: - * - * * `id` – `{string}` – locale id formatted as `languageId-countryId` (e.g. `en-us`) - */ -function $LocaleProvider(){ - this.$get = function() { - return { - id: 'en-us', - - NUMBER_FORMATS: { - DECIMAL_SEP: '.', - GROUP_SEP: ',', - PATTERNS: [ - { // Decimal Pattern - minInt: 1, - minFrac: 0, - maxFrac: 3, - posPre: '', - posSuf: '', - negPre: '-', - negSuf: '', - gSize: 3, - lgSize: 3 - },{ //Currency Pattern - minInt: 1, - minFrac: 2, - maxFrac: 2, - posPre: '\u00A4', - posSuf: '', - negPre: '(\u00A4', - negSuf: ')', - gSize: 3, - lgSize: 3 - } - ], - CURRENCY_SYM: '$' - }, - - DATETIME_FORMATS: { - MONTH: 'January,February,March,April,May,June,July,August,September,October,November,December' - .split(','), - SHORTMONTH: 'Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec'.split(','), - DAY: 'Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday'.split(','), - SHORTDAY: 'Sun,Mon,Tue,Wed,Thu,Fri,Sat'.split(','), - AMPMS: ['AM','PM'], - medium: 'MMM d, y h:mm:ss a', - short: 'M/d/yy h:mm a', - fullDate: 'EEEE, MMMM d, y', - longDate: 'MMMM d, y', - mediumDate: 'MMM d, y', - shortDate: 'M/d/yy', - mediumTime: 'h:mm:ss a', - shortTime: 'h:mm a' - }, - - pluralCat: function(num) { - if (num === 1) { - return 'one'; - } - return 'other'; - } - }; - }; -} - -function $TimeoutProvider() { - this.$get = ['$rootScope', '$browser', '$q', '$exceptionHandler', - function($rootScope, $browser, $q, $exceptionHandler) { - var deferreds = {}; - - - /** - * @ngdoc function - * @name ng.$timeout - * @requires $browser - * - * @description - * Angular's wrapper for `window.setTimeout`. The `fn` function is wrapped into a try/catch - * block and delegates any exceptions to - * {@link ng.$exceptionHandler $exceptionHandler} service. - * - * The return value of registering a timeout function is a promise which will be resolved when - * the timeout is reached and the timeout function is executed. - * - * To cancel a the timeout request, call `$timeout.cancel(promise)`. - * - * In tests you can use {@link ngMock.$timeout `$timeout.flush()`} to - * synchronously flush the queue of deferred functions. - * - * @param {function()} fn A function, who's execution should be delayed. - * @param {number=} [delay=0] Delay in milliseconds. - * @param {boolean=} [invokeApply=true] If set to false skips model dirty checking, otherwise - * will invoke `fn` within the {@link ng.$rootScope.Scope#$apply $apply} block. - * @returns {Promise} Promise that will be resolved when the timeout is reached. The value this - * promise will be resolved with is the return value of the `fn` function. - */ - function timeout(fn, delay, invokeApply) { - var deferred = $q.defer(), - promise = deferred.promise, - skipApply = (isDefined(invokeApply) && !invokeApply), - timeoutId, cleanup; - - timeoutId = $browser.defer(function() { - try { - deferred.resolve(fn()); - } catch(e) { - deferred.reject(e); - $exceptionHandler(e); - } - - if (!skipApply) $rootScope.$apply(); - }, delay); - - cleanup = function() { - delete deferreds[promise.$$timeoutId]; - }; - - promise.$$timeoutId = timeoutId; - deferreds[timeoutId] = deferred; - promise.then(cleanup, cleanup); - - return promise; - } - - - /** - * @ngdoc function - * @name ng.$timeout#cancel - * @methodOf ng.$timeout - * - * @description - * Cancels a task associated with the `promise`. As a result of this the promise will be - * resolved with a rejection. - * - * @param {Promise=} promise Promise returned by the `$timeout` function. - * @returns {boolean} Returns `true` if the task hasn't executed yet and was successfully - * canceled. - */ - timeout.cancel = function(promise) { - if (promise && promise.$$timeoutId in deferreds) { - deferreds[promise.$$timeoutId].reject('canceled'); - return $browser.defer.cancel(promise.$$timeoutId); - } - return false; - }; - - return timeout; - }]; -} - -/** - * @ngdoc object - * @name ng.$filterProvider - * @description - * - * Filters are just functions which transform input to an output. However filters need to be Dependency Injected. To - * achieve this a filter definition consists of a factory function which is annotated with dependencies and is - * responsible for creating a the filter function. - * - *
- *   // Filter registration
- *   function MyModule($provide, $filterProvider) {
- *     // create a service to demonstrate injection (not always needed)
- *     $provide.value('greet', function(name){
- *       return 'Hello ' + name + '!';
- *     });
- *
- *     // register a filter factory which uses the
- *     // greet service to demonstrate DI.
- *     $filterProvider.register('greet', function(greet){
- *       // return the filter function which uses the greet service
- *       // to generate salutation
- *       return function(text) {
- *         // filters need to be forgiving so check input validity
- *         return text && greet(text) || text;
- *       };
- *     });
- *   }
- * 
- * - * The filter function is registered with the `$injector` under the filter name suffixe with `Filter`. - *
- *   it('should be the same instance', inject(
- *     function($filterProvider) {
- *       $filterProvider.register('reverse', function(){
- *         return ...;
- *       });
- *     },
- *     function($filter, reverseFilter) {
- *       expect($filter('reverse')).toBe(reverseFilter);
- *     });
- * 
- * - * - * For more information about how angular filters work, and how to create your own filters, see - * {@link guide/dev_guide.templates.filters Understanding Angular Filters} in the angular Developer - * Guide. - */ -/** - * @ngdoc method - * @name ng.$filterProvider#register - * @methodOf ng.$filterProvider - * @description - * Register filter factory function. - * - * @param {String} name Name of the filter. - * @param {function} fn The filter factory function which is injectable. - */ - - -/** - * @ngdoc function - * @name ng.$filter - * @function - * @description - * Filters are used for formatting data displayed to the users. - * - * The general syntax in templates is as follows: - * - * {{ expression | [ filter_name ] }} - * - * @param {String} name Name of the filter function to retrieve - * @return {Function} the filter function - */ -$FilterProvider.$inject = ['$provide']; -function $FilterProvider($provide) { - var suffix = 'Filter'; - - function register(name, factory) { - return $provide.factory(name + suffix, factory); - } - this.register = register; - - this.$get = ['$injector', function($injector) { - return function(name) { - return $injector.get(name + suffix); - } - }]; - - //////////////////////////////////////// - - register('currency', currencyFilter); - register('date', dateFilter); - register('filter', filterFilter); - register('json', jsonFilter); - register('limitTo', limitToFilter); - register('lowercase', lowercaseFilter); - register('number', numberFilter); - register('orderBy', orderByFilter); - register('uppercase', uppercaseFilter); -} - -/** - * @ngdoc filter - * @name ng.filter:filter - * @function - * - * @description - * Selects a subset of items from `array` and returns it as a new array. - * - * Note: This function is used to augment the `Array` type in Angular expressions. See - * {@link ng.$filter} for more information about Angular arrays. - * - * @param {Array} array The source array. - * @param {string|Object|function()} expression The predicate to be used for selecting items from - * `array`. - * - * Can be one of: - * - * - `string`: Predicate that results in a substring match using the value of `expression` - * string. All strings or objects with string properties in `array` that contain this string - * will be returned. The predicate can be negated by prefixing the string with `!`. - * - * - `Object`: A pattern object can be used to filter specific properties on objects contained - * by `array`. For example `{name:"M", phone:"1"}` predicate will return an array of items - * which have property `name` containing "M" and property `phone` containing "1". A special - * property name `$` can be used (as in `{$:"text"}`) to accept a match against any - * property of the object. That's equivalent to the simple substring match with a `string` - * as described above. - * - * - `function`: A predicate function can be used to write arbitrary filters. The function is - * called for each element of `array`. The final result is an array of those elements that - * the predicate returned true for. - * - * @example - - -
- - Search: - - - - - - -
NamePhone
{{friend.name}}{{friend.phone}}
-
- Any:
- Name only
- Phone only
- - - - - - -
NamePhone
{{friend.name}}{{friend.phone}}
-
- - it('should search across all fields when filtering with a string', function() { - input('searchText').enter('m'); - expect(repeater('#searchTextResults tr', 'friend in friends').column('friend.name')). - toEqual(['Mary', 'Mike', 'Adam']); - - input('searchText').enter('76'); - expect(repeater('#searchTextResults tr', 'friend in friends').column('friend.name')). - toEqual(['John', 'Julie']); - }); - - it('should search in specific fields when filtering with a predicate object', function() { - input('search.$').enter('i'); - expect(repeater('#searchObjResults tr', 'friend in friends').column('friend.name')). - toEqual(['Mary', 'Mike', 'Julie']); - }); - -
- */ -function filterFilter() { - return function(array, expression) { - if (!isArray(array)) return array; - var predicates = []; - predicates.check = function(value) { - for (var j = 0; j < predicates.length; j++) { - if(!predicates[j](value)) { - return false; - } - } - return true; - }; - var search = function(obj, text){ - if (text.charAt(0) === '!') { - return !search(obj, text.substr(1)); - } - switch (typeof obj) { - case "boolean": - case "number": - case "string": - return ('' + obj).toLowerCase().indexOf(text) > -1; - case "object": - for ( var objKey in obj) { - if (objKey.charAt(0) !== '$' && search(obj[objKey], text)) { - return true; - } - } - return false; - case "array": - for ( var i = 0; i < obj.length; i++) { - if (search(obj[i], text)) { - return true; - } - } - return false; - default: - return false; - } - }; - switch (typeof expression) { - case "boolean": - case "number": - case "string": - expression = {$:expression}; - case "object": - for (var key in expression) { - if (key == '$') { - (function() { - var text = (''+expression[key]).toLowerCase(); - if (!text) return; - predicates.push(function(value) { - return search(value, text); - }); - })(); - } else { - (function() { - var path = key; - var text = (''+expression[key]).toLowerCase(); - if (!text) return; - predicates.push(function(value) { - return search(getter(value, path), text); - }); - })(); - } - } - break; - case 'function': - predicates.push(expression); - break; - default: - return array; - } - var filtered = []; - for ( var j = 0; j < array.length; j++) { - var value = array[j]; - if (predicates.check(value)) { - filtered.push(value); - } - } - return filtered; - } -} - -/** - * @ngdoc filter - * @name ng.filter:currency - * @function - * - * @description - * Formats a number as a currency (ie $1,234.56). When no currency symbol is provided, default - * symbol for current locale is used. - * - * @param {number} amount Input to filter. - * @param {string=} symbol Currency symbol or identifier to be displayed. - * @returns {string} Formatted number. - * - * - * @example - - - -
-
- default currency symbol ($): {{amount | currency}}
- custom currency identifier (USD$): {{amount | currency:"USD$"}} -
-
- - it('should init with 1234.56', function() { - expect(binding('amount | currency')).toBe('$1,234.56'); - expect(binding('amount | currency:"USD$"')).toBe('USD$1,234.56'); - }); - it('should update', function() { - input('amount').enter('-1234'); - expect(binding('amount | currency')).toBe('($1,234.00)'); - expect(binding('amount | currency:"USD$"')).toBe('(USD$1,234.00)'); - }); - -
- */ -currencyFilter.$inject = ['$locale']; -function currencyFilter($locale) { - var formats = $locale.NUMBER_FORMATS; - return function(amount, currencySymbol){ - if (isUndefined(currencySymbol)) currencySymbol = formats.CURRENCY_SYM; - return formatNumber(amount, formats.PATTERNS[1], formats.GROUP_SEP, formats.DECIMAL_SEP, 2). - replace(/\u00A4/g, currencySymbol); - }; -} - -/** - * @ngdoc filter - * @name ng.filter:number - * @function - * - * @description - * Formats a number as text. - * - * If the input is not a number an empty string is returned. - * - * @param {number|string} number Number to format. - * @param {(number|string)=} [fractionSize=2] Number of decimal places to round the number to. - * @returns {string} Number rounded to decimalPlaces and places a “,” after each third digit. - * - * @example - - - -
- Enter number:
- Default formatting: {{val | number}}
- No fractions: {{val | number:0}}
- Negative number: {{-val | number:4}} -
-
- - it('should format numbers', function() { - expect(binding('val | number')).toBe('1,234.568'); - expect(binding('val | number:0')).toBe('1,235'); - expect(binding('-val | number:4')).toBe('-1,234.5679'); - }); - - it('should update', function() { - input('val').enter('3374.333'); - expect(binding('val | number')).toBe('3,374.333'); - expect(binding('val | number:0')).toBe('3,374'); - expect(binding('-val | number:4')).toBe('-3,374.3330'); - }); - -
- */ - - -numberFilter.$inject = ['$locale']; -function numberFilter($locale) { - var formats = $locale.NUMBER_FORMATS; - return function(number, fractionSize) { - return formatNumber(number, formats.PATTERNS[0], formats.GROUP_SEP, formats.DECIMAL_SEP, - fractionSize); - }; -} - -var DECIMAL_SEP = '.'; -function formatNumber(number, pattern, groupSep, decimalSep, fractionSize) { - if (isNaN(number) || !isFinite(number)) return ''; - - var isNegative = number < 0; - number = Math.abs(number); - var numStr = number + '', - formatedText = '', - parts = []; - - var hasExponent = false; - if (numStr.indexOf('e') !== -1) { - var match = numStr.match(/([\d\.]+)e(-?)(\d+)/); - if (match && match[2] == '-' && match[3] > fractionSize + 1) { - numStr = '0'; - } else { - formatedText = numStr; - hasExponent = true; - } - } - - if (!hasExponent) { - var fractionLen = (numStr.split(DECIMAL_SEP)[1] || '').length; - - // determine fractionSize if it is not specified - if (isUndefined(fractionSize)) { - fractionSize = Math.min(Math.max(pattern.minFrac, fractionLen), pattern.maxFrac); - } - - var pow = Math.pow(10, fractionSize); - number = Math.round(number * pow) / pow; - var fraction = ('' + number).split(DECIMAL_SEP); - var whole = fraction[0]; - fraction = fraction[1] || ''; - - var pos = 0, - lgroup = pattern.lgSize, - group = pattern.gSize; - - if (whole.length >= (lgroup + group)) { - pos = whole.length - lgroup; - for (var i = 0; i < pos; i++) { - if ((pos - i)%group === 0 && i !== 0) { - formatedText += groupSep; - } - formatedText += whole.charAt(i); - } - } - - for (i = pos; i < whole.length; i++) { - if ((whole.length - i)%lgroup === 0 && i !== 0) { - formatedText += groupSep; - } - formatedText += whole.charAt(i); - } - - // format fraction part. - while(fraction.length < fractionSize) { - fraction += '0'; - } - - if (fractionSize && fractionSize !== "0") formatedText += decimalSep + fraction.substr(0, fractionSize); - } - - parts.push(isNegative ? pattern.negPre : pattern.posPre); - parts.push(formatedText); - parts.push(isNegative ? pattern.negSuf : pattern.posSuf); - return parts.join(''); -} - -function padNumber(num, digits, trim) { - var neg = ''; - if (num < 0) { - neg = '-'; - num = -num; - } - num = '' + num; - while(num.length < digits) num = '0' + num; - if (trim) - num = num.substr(num.length - digits); - return neg + num; -} - - -function dateGetter(name, size, offset, trim) { - return function(date) { - var value = date['get' + name](); - if (offset > 0 || value > -offset) - value += offset; - if (value === 0 && offset == -12 ) value = 12; - return padNumber(value, size, trim); - }; -} - -function dateStrGetter(name, shortForm) { - return function(date, formats) { - var value = date['get' + name](); - var get = uppercase(shortForm ? ('SHORT' + name) : name); - - return formats[get][value]; - }; -} - -function timeZoneGetter(date) { - var zone = -1 * date.getTimezoneOffset(); - var paddedZone = (zone >= 0) ? "+" : ""; - - paddedZone += padNumber(zone / 60, 2) + padNumber(Math.abs(zone % 60), 2); - - return paddedZone; -} - -function ampmGetter(date, formats) { - return date.getHours() < 12 ? formats.AMPMS[0] : formats.AMPMS[1]; -} - -var DATE_FORMATS = { - yyyy: dateGetter('FullYear', 4), - yy: dateGetter('FullYear', 2, 0, true), - y: dateGetter('FullYear', 1), - MMMM: dateStrGetter('Month'), - MMM: dateStrGetter('Month', true), - MM: dateGetter('Month', 2, 1), - M: dateGetter('Month', 1, 1), - dd: dateGetter('Date', 2), - d: dateGetter('Date', 1), - HH: dateGetter('Hours', 2), - H: dateGetter('Hours', 1), - hh: dateGetter('Hours', 2, -12), - h: dateGetter('Hours', 1, -12), - mm: dateGetter('Minutes', 2), - m: dateGetter('Minutes', 1), - ss: dateGetter('Seconds', 2), - s: dateGetter('Seconds', 1), - EEEE: dateStrGetter('Day'), - EEE: dateStrGetter('Day', true), - a: ampmGetter, - Z: timeZoneGetter -}; - -var DATE_FORMATS_SPLIT = /((?:[^yMdHhmsaZE']+)|(?:'(?:[^']|'')*')|(?:E+|y+|M+|d+|H+|h+|m+|s+|a|Z))(.*)/, - NUMBER_STRING = /^\d+$/; - -/** - * @ngdoc filter - * @name ng.filter:date - * @function - * - * @description - * Formats `date` to a string based on the requested `format`. - * - * `format` string can be composed of the following elements: - * - * * `'yyyy'`: 4 digit representation of year (e.g. AD 1 => 0001, AD 2010 => 2010) - * * `'yy'`: 2 digit representation of year, padded (00-99). (e.g. AD 2001 => 01, AD 2010 => 10) - * * `'y'`: 1 digit representation of year, e.g. (AD 1 => 1, AD 199 => 199) - * * `'MMMM'`: Month in year (January-December) - * * `'MMM'`: Month in year (Jan-Dec) - * * `'MM'`: Month in year, padded (01-12) - * * `'M'`: Month in year (1-12) - * * `'dd'`: Day in month, padded (01-31) - * * `'d'`: Day in month (1-31) - * * `'EEEE'`: Day in Week,(Sunday-Saturday) - * * `'EEE'`: Day in Week, (Sun-Sat) - * * `'HH'`: Hour in day, padded (00-23) - * * `'H'`: Hour in day (0-23) - * * `'hh'`: Hour in am/pm, padded (01-12) - * * `'h'`: Hour in am/pm, (1-12) - * * `'mm'`: Minute in hour, padded (00-59) - * * `'m'`: Minute in hour (0-59) - * * `'ss'`: Second in minute, padded (00-59) - * * `'s'`: Second in minute (0-59) - * * `'a'`: am/pm marker - * * `'Z'`: 4 digit (+sign) representation of the timezone offset (-1200-1200) - * - * `format` string can also be one of the following predefined - * {@link guide/i18n localizable formats}: - * - * * `'medium'`: equivalent to `'MMM d, y h:mm:ss a'` for en_US locale - * (e.g. Sep 3, 2010 12:05:08 pm) - * * `'short'`: equivalent to `'M/d/yy h:mm a'` for en_US locale (e.g. 9/3/10 12:05 pm) - * * `'fullDate'`: equivalent to `'EEEE, MMMM d,y'` for en_US locale - * (e.g. Friday, September 3, 2010) - * * `'longDate'`: equivalent to `'MMMM d, y'` for en_US locale (e.g. September 3, 2010 - * * `'mediumDate'`: equivalent to `'MMM d, y'` for en_US locale (e.g. Sep 3, 2010) - * * `'shortDate'`: equivalent to `'M/d/yy'` for en_US locale (e.g. 9/3/10) - * * `'mediumTime'`: equivalent to `'h:mm:ss a'` for en_US locale (e.g. 12:05:08 pm) - * * `'shortTime'`: equivalent to `'h:mm a'` for en_US locale (e.g. 12:05 pm) - * - * `format` string can contain literal values. These need to be quoted with single quotes (e.g. - * `"h 'in the morning'"`). In order to output single quote, use two single quotes in a sequence - * (e.g. `"h o''clock"`). - * - * @param {(Date|number|string)} date Date to format either as Date object, milliseconds (string or - * number) or various ISO 8601 datetime string formats (e.g. yyyy-MM-ddTHH:mm:ss.SSSZ and it's - * shorter versions like yyyy-MM-ddTHH:mmZ, yyyy-MM-dd or yyyyMMddTHHmmssZ). If no timezone is - * specified in the string input, the time is considered to be in the local timezone. - * @param {string=} format Formatting rules (see Description). If not specified, - * `mediumDate` is used. - * @returns {string} Formatted string or the input if input is not recognized as date/millis. - * - * @example - - - {{1288323623006 | date:'medium'}}: - {{1288323623006 | date:'medium'}}
- {{1288323623006 | date:'yyyy-MM-dd HH:mm:ss Z'}}: - {{1288323623006 | date:'yyyy-MM-dd HH:mm:ss Z'}}
- {{1288323623006 | date:'MM/dd/yyyy @ h:mma'}}: - {{'1288323623006' | date:'MM/dd/yyyy @ h:mma'}}
-
- - it('should format date', function() { - expect(binding("1288323623006 | date:'medium'")). - toMatch(/Oct 2\d, 2010 \d{1,2}:\d{2}:\d{2} (AM|PM)/); - expect(binding("1288323623006 | date:'yyyy-MM-dd HH:mm:ss Z'")). - toMatch(/2010\-10\-2\d \d{2}:\d{2}:\d{2} (\-|\+)?\d{4}/); - expect(binding("'1288323623006' | date:'MM/dd/yyyy @ h:mma'")). - toMatch(/10\/2\d\/2010 @ \d{1,2}:\d{2}(AM|PM)/); - }); - -
- */ -dateFilter.$inject = ['$locale']; -function dateFilter($locale) { - - - var R_ISO8601_STR = /^(\d{4})-?(\d\d)-?(\d\d)(?:T(\d\d)(?::?(\d\d)(?::?(\d\d)(?:\.(\d+))?)?)?(Z|([+-])(\d\d):?(\d\d))?)?$/; - function jsonStringToDate(string){ - var match; - if (match = string.match(R_ISO8601_STR)) { - var date = new Date(0), - tzHour = 0, - tzMin = 0; - if (match[9]) { - tzHour = int(match[9] + match[10]); - tzMin = int(match[9] + match[11]); - } - date.setUTCFullYear(int(match[1]), int(match[2]) - 1, int(match[3])); - date.setUTCHours(int(match[4]||0) - tzHour, int(match[5]||0) - tzMin, int(match[6]||0), int(match[7]||0)); - return date; - } - return string; - } - - - return function(date, format) { - var text = '', - parts = [], - fn, match; - - format = format || 'mediumDate'; - format = $locale.DATETIME_FORMATS[format] || format; - if (isString(date)) { - if (NUMBER_STRING.test(date)) { - date = int(date); - } else { - date = jsonStringToDate(date); - } - } - - if (isNumber(date)) { - date = new Date(date); - } - - if (!isDate(date)) { - return date; - } - - while(format) { - match = DATE_FORMATS_SPLIT.exec(format); - if (match) { - parts = concat(parts, match, 1); - format = parts.pop(); - } else { - parts.push(format); - format = null; - } - } - - forEach(parts, function(value){ - fn = DATE_FORMATS[value]; - text += fn ? fn(date, $locale.DATETIME_FORMATS) - : value.replace(/(^'|'$)/g, '').replace(/''/g, "'"); - }); - - return text; - }; -} - - -/** - * @ngdoc filter - * @name ng.filter:json - * @function - * - * @description - * Allows you to convert a JavaScript object into JSON string. - * - * This filter is mostly useful for debugging. When using the double curly {{value}} notation - * the binding is automatically converted to JSON. - * - * @param {*} object Any JavaScript object (including arrays and primitive types) to filter. - * @returns {string} JSON string. - * - * - * @example: - - -
{{ {'name':'value'} | json }}
-
- - it('should jsonify filtered objects', function() { - expect(binding("{'name':'value'}")).toMatch(/\{\n "name": ?"value"\n}/); - }); - -
- * - */ -function jsonFilter() { - return function(object) { - return toJson(object, true); - }; -} - - -/** - * @ngdoc filter - * @name ng.filter:lowercase - * @function - * @description - * Converts string to lowercase. - * @see angular.lowercase - */ -var lowercaseFilter = valueFn(lowercase); - - -/** - * @ngdoc filter - * @name ng.filter:uppercase - * @function - * @description - * Converts string to uppercase. - * @see angular.uppercase - */ -var uppercaseFilter = valueFn(uppercase); - -/** - * @ngdoc function - * @name ng.filter:limitTo - * @function - * - * @description - * Creates a new array containing only a specified number of elements in an array. The elements - * are taken from either the beginning or the end of the source array, as specified by the - * value and sign (positive or negative) of `limit`. - * - * Note: This function is used to augment the `Array` type in Angular expressions. See - * {@link ng.$filter} for more information about Angular arrays. - * - * @param {Array} array Source array to be limited. - * @param {string|Number} limit The length of the returned array. If the `limit` number is - * positive, `limit` number of items from the beginning of the source array are copied. - * If the number is negative, `limit` number of items from the end of the source array are - * copied. The `limit` will be trimmed if it exceeds `array.length` - * @returns {Array} A new sub-array of length `limit` or less if input array had less than `limit` - * elements. - * - * @example - - - -
- Limit {{numbers}} to: -

Output: {{ numbers | limitTo:limit }}

-
-
- - it('should limit the numer array to first three items', function() { - expect(element('.doc-example-live input[ng-model=limit]').val()).toBe('3'); - expect(binding('numbers | limitTo:limit')).toEqual('[1,2,3]'); - }); - - it('should update the output when -3 is entered', function() { - input('limit').enter(-3); - expect(binding('numbers | limitTo:limit')).toEqual('[7,8,9]'); - }); - - it('should not exceed the maximum size of input array', function() { - input('limit').enter(100); - expect(binding('numbers | limitTo:limit')).toEqual('[1,2,3,4,5,6,7,8,9]'); - }); - -
- */ -function limitToFilter(){ - return function(array, limit) { - if (!(array instanceof Array)) return array; - limit = int(limit); - var out = [], - i, n; - - // check that array is iterable - if (!array || !(array instanceof Array)) - return out; - - // if abs(limit) exceeds maximum length, trim it - if (limit > array.length) - limit = array.length; - else if (limit < -array.length) - limit = -array.length; - - if (limit > 0) { - i = 0; - n = limit; - } else { - i = array.length + limit; - n = array.length; - } - - for (; i} expression A predicate to be - * used by the comparator to determine the order of elements. - * - * Can be one of: - * - * - `function`: Getter function. The result of this function will be sorted using the - * `<`, `=`, `>` operator. - * - `string`: An Angular expression which evaluates to an object to order by, such as 'name' - * to sort by a property called 'name'. Optionally prefixed with `+` or `-` to control - * ascending or descending sort order (for example, +name or -name). - * - `Array`: An array of function or string predicates. The first predicate in the array - * is used for sorting, but when two items are equivalent, the next predicate is used. - * - * @param {boolean=} reverse Reverse the order the array. - * @returns {Array} Sorted copy of the source array. - * - * @example - - - -
-
Sorting predicate = {{predicate}}; reverse = {{reverse}}
-
- [ unsorted ] - - - - - - - - - - - -
Name - (^)Phone NumberAge
{{friend.name}}{{friend.phone}}{{friend.age}}
-
-
- - it('should be reverse ordered by aged', function() { - expect(binding('predicate')).toBe('-age'); - expect(repeater('table.friend', 'friend in friends').column('friend.age')). - toEqual(['35', '29', '21', '19', '10']); - expect(repeater('table.friend', 'friend in friends').column('friend.name')). - toEqual(['Adam', 'Julie', 'Mike', 'Mary', 'John']); - }); - - it('should reorder the table when users selects different predicate', function() { - element('.doc-example-live a:contains("Name")').click(); - expect(repeater('table.friend', 'friend in friends').column('friend.name')). - toEqual(['Adam', 'John', 'Julie', 'Mary', 'Mike']); - expect(repeater('table.friend', 'friend in friends').column('friend.age')). - toEqual(['35', '10', '29', '19', '21']); - - element('.doc-example-live a:contains("Phone")').click(); - expect(repeater('table.friend', 'friend in friends').column('friend.phone')). - toEqual(['555-9876', '555-8765', '555-5678', '555-4321', '555-1212']); - expect(repeater('table.friend', 'friend in friends').column('friend.name')). - toEqual(['Mary', 'Julie', 'Adam', 'Mike', 'John']); - }); - -
- */ -orderByFilter.$inject = ['$parse']; -function orderByFilter($parse){ - return function(array, sortPredicate, reverseOrder) { - if (!isArray(array)) return array; - if (!sortPredicate) return array; - sortPredicate = isArray(sortPredicate) ? sortPredicate: [sortPredicate]; - sortPredicate = map(sortPredicate, function(predicate){ - var descending = false, get = predicate || identity; - if (isString(predicate)) { - if ((predicate.charAt(0) == '+' || predicate.charAt(0) == '-')) { - descending = predicate.charAt(0) == '-'; - predicate = predicate.substring(1); - } - get = $parse(predicate); - } - return reverseComparator(function(a,b){ - return compare(get(a),get(b)); - }, descending); - }); - var arrayCopy = []; - for ( var i = 0; i < array.length; i++) { arrayCopy.push(array[i]); } - return arrayCopy.sort(reverseComparator(comparator, reverseOrder)); - - function comparator(o1, o2){ - for ( var i = 0; i < sortPredicate.length; i++) { - var comp = sortPredicate[i](o1, o2); - if (comp !== 0) return comp; - } - return 0; - } - function reverseComparator(comp, descending) { - return toBoolean(descending) - ? function(a,b){return comp(b,a);} - : comp; - } - function compare(v1, v2){ - var t1 = typeof v1; - var t2 = typeof v2; - if (t1 == t2) { - if (t1 == "string") v1 = v1.toLowerCase(); - if (t1 == "string") v2 = v2.toLowerCase(); - if (v1 === v2) return 0; - return v1 < v2 ? -1 : 1; - } else { - return t1 < t2 ? -1 : 1; - } - } - } -} - -function ngDirective(directive) { - if (isFunction(directive)) { - directive = { - link: directive - } - } - directive.restrict = directive.restrict || 'AC'; - return valueFn(directive); -} - -/** - * @ngdoc directive - * @name ng.directive:a - * @restrict E - * - * @description - * Modifies the default behavior of html A tag, so that the default action is prevented when href - * attribute is empty. - * - * The reasoning for this change is to allow easy creation of action links with `ngClick` directive - * without changing the location or causing page reloads, e.g.: - * `Save` - */ -var htmlAnchorDirective = valueFn({ - restrict: 'E', - compile: function(element, attr) { - - if (msie <= 8) { - - // turn link into a stylable link in IE - // but only if it doesn't have name attribute, in which case it's an anchor - if (!attr.href && !attr.name) { - attr.$set('href', ''); - } - - // add a comment node to anchors to workaround IE bug that causes element content to be reset - // to new attribute content if attribute is updated with value containing @ and element also - // contains value with @ - // see issue #1949 - element.append(document.createComment('IE fix')); - } - - return function(scope, element) { - element.bind('click', function(event){ - // if we have no href url, then don't navigate anywhere. - if (!element.attr('href')) { - event.preventDefault(); - } - }); - } - } -}); - -/** - * @ngdoc directive - * @name ng.directive:ngHref - * @restrict A - * - * @description - * Using Angular markup like {{hash}} in an href attribute makes - * the page open to a wrong URL, if the users clicks that link before - * angular has a chance to replace the {{hash}} with actual URL, the - * link will be broken and will most likely return a 404 error. - * The `ngHref` directive solves this problem. - * - * The buggy way to write it: - *
- * 
- * 
- * - * The correct way to write it: - *
- * 
- * 
- * - * @element A - * @param {template} ngHref any string which can contain `{{}}` markup. - * - * @example - * This example uses `link` variable inside `href` attribute: - - -
-
link 1 (link, don't reload)
- link 2 (link, don't reload)
- link 3 (link, reload!)
- anchor (link, don't reload)
- anchor (no link)
- link (link, change location) - - - it('should execute ng-click but not reload when href without value', function() { - element('#link-1').click(); - expect(input('value').val()).toEqual('1'); - expect(element('#link-1').attr('href')).toBe(""); - }); - - it('should execute ng-click but not reload when href empty string', function() { - element('#link-2').click(); - expect(input('value').val()).toEqual('2'); - expect(element('#link-2').attr('href')).toBe(""); - }); - - it('should execute ng-click and change url when ng-href specified', function() { - expect(element('#link-3').attr('href')).toBe("/123"); - - element('#link-3').click(); - expect(browser().window().path()).toEqual('/123'); - }); - - it('should execute ng-click but not reload when href empty string and name specified', function() { - element('#link-4').click(); - expect(input('value').val()).toEqual('4'); - expect(element('#link-4').attr('href')).toBe(''); - }); - - it('should execute ng-click but not reload when no href but name specified', function() { - element('#link-5').click(); - expect(input('value').val()).toEqual('5'); - expect(element('#link-5').attr('href')).toBe(undefined); - }); - - it('should only change url when only ng-href', function() { - input('value').enter('6'); - expect(element('#link-6').attr('href')).toBe('6'); - - element('#link-6').click(); - expect(browser().location().url()).toEqual('/6'); - }); - - - */ - -/** - * @ngdoc directive - * @name ng.directive:ngSrc - * @restrict A - * - * @description - * Using Angular markup like `{{hash}}` in a `src` attribute doesn't - * work right: The browser will fetch from the URL with the literal - * text `{{hash}}` until Angular replaces the expression inside - * `{{hash}}`. The `ngSrc` directive solves this problem. - * - * The buggy way to write it: - *
- * 
- * 
- * - * The correct way to write it: - *
- * 
- * 
- * - * @element IMG - * @param {template} ngSrc any string which can contain `{{}}` markup. - */ - -/** - * @ngdoc directive - * @name ng.directive:ngDisabled - * @restrict A - * - * @description - * - * The following markup will make the button enabled on Chrome/Firefox but not on IE8 and older IEs: - *
- * 
- * - *
- *
- * - * The HTML specs do not require browsers to preserve the special attributes such as disabled. - * (The presence of them means true and absence means false) - * This prevents the angular compiler from correctly retrieving the binding expression. - * To solve this problem, we introduce the `ngDisabled` directive. - * - * @example - - - Click me to toggle:
- -
- - it('should toggle button', function() { - expect(element('.doc-example-live :button').prop('disabled')).toBeFalsy(); - input('checked').check(); - expect(element('.doc-example-live :button').prop('disabled')).toBeTruthy(); - }); - -
- * - * @element INPUT - * @param {expression} ngDisabled Angular expression that will be evaluated. - */ - - -/** - * @ngdoc directive - * @name ng.directive:ngChecked - * @restrict A - * - * @description - * The HTML specs do not require browsers to preserve the special attributes such as checked. - * (The presence of them means true and absence means false) - * This prevents the angular compiler from correctly retrieving the binding expression. - * To solve this problem, we introduce the `ngChecked` directive. - * @example - - - Check me to check both:
- -
- - it('should check both checkBoxes', function() { - expect(element('.doc-example-live #checkSlave').prop('checked')).toBeFalsy(); - input('master').check(); - expect(element('.doc-example-live #checkSlave').prop('checked')).toBeTruthy(); - }); - -
- * - * @element INPUT - * @param {expression} ngChecked Angular expression that will be evaluated. - */ - - -/** - * @ngdoc directive - * @name ng.directive:ngMultiple - * @restrict A - * - * @description - * The HTML specs do not require browsers to preserve the special attributes such as multiple. - * (The presence of them means true and absence means false) - * This prevents the angular compiler from correctly retrieving the binding expression. - * To solve this problem, we introduce the `ngMultiple` directive. - * - * @example - - - Check me check multiple:
- -
- - it('should toggle multiple', function() { - expect(element('.doc-example-live #select').prop('multiple')).toBeFalsy(); - input('checked').check(); - expect(element('.doc-example-live #select').prop('multiple')).toBeTruthy(); - }); - -
- * - * @element SELECT - * @param {expression} ngMultiple Angular expression that will be evaluated. - */ - - -/** - * @ngdoc directive - * @name ng.directive:ngReadonly - * @restrict A - * - * @description - * The HTML specs do not require browsers to preserve the special attributes such as readonly. - * (The presence of them means true and absence means false) - * This prevents the angular compiler from correctly retrieving the binding expression. - * To solve this problem, we introduce the `ngReadonly` directive. - * @example - - - Check me to make text readonly:
- -
- - it('should toggle readonly attr', function() { - expect(element('.doc-example-live :text').prop('readonly')).toBeFalsy(); - input('checked').check(); - expect(element('.doc-example-live :text').prop('readonly')).toBeTruthy(); - }); - -
- * - * @element INPUT - * @param {string} expression Angular expression that will be evaluated. - */ - - -/** - * @ngdoc directive - * @name ng.directive:ngSelected - * @restrict A - * - * @description - * The HTML specs do not require browsers to preserve the special attributes such as selected. - * (The presence of them means true and absence means false) - * This prevents the angular compiler from correctly retrieving the binding expression. - * To solve this problem, we introduced the `ngSelected` directive. - * @example - - - Check me to select:
- -
- - it('should select Greetings!', function() { - expect(element('.doc-example-live #greet').prop('selected')).toBeFalsy(); - input('selected').check(); - expect(element('.doc-example-live #greet').prop('selected')).toBeTruthy(); - }); - -
- * - * @element OPTION - * @param {string} expression Angular expression that will be evaluated. - */ - - -var ngAttributeAliasDirectives = {}; - - -// boolean attrs are evaluated -forEach(BOOLEAN_ATTR, function(propName, attrName) { - var normalized = directiveNormalize('ng-' + attrName); - ngAttributeAliasDirectives[normalized] = function() { - return { - priority: 100, - compile: function() { - return function(scope, element, attr) { - scope.$watch(attr[normalized], function ngBooleanAttrWatchAction(value) { - attr.$set(attrName, !!value); - }); - }; - } - }; - }; -}); - - -// ng-src, ng-href are interpolated -forEach(['src', 'href'], function(attrName) { - var normalized = directiveNormalize('ng-' + attrName); - ngAttributeAliasDirectives[normalized] = function() { - return { - priority: 99, // it needs to run after the attributes are interpolated - link: function(scope, element, attr) { - attr.$observe(normalized, function(value) { - if (!value) - return; - - attr.$set(attrName, value); - - // on IE, if "ng:src" directive declaration is used and "src" attribute doesn't exist - // then calling element.setAttribute('src', 'foo') doesn't do anything, so we need - // to set the property as well to achieve the desired effect. - // we use attr[attrName] value since $set can sanitize the url. - if (msie) element.prop(attrName, attr[attrName]); - }); - } - }; - }; -}); - -var nullFormCtrl = { - $addControl: noop, - $removeControl: noop, - $setValidity: noop, - $setDirty: noop -}; - -/** - * @ngdoc object - * @name ng.directive:form.FormController - * - * @property {boolean} $pristine True if users has not interacted with the form yet. - * @property {boolean} $dirty True if users has already interacted with the form. - * @property {boolean} $valid True if all of the containing forms and controls are valid. - * @property {boolean} $invalid True if at least one containing control or form is invalid. - * - * @property {Object} $error Is an object hash, containing references to all invalid controls or - * forms, where: - * - * - keys are validation tokens (error names) — such as `required`, `url` or `email`), - * - values are arrays of controls or forms that are invalid with given error. - * - * @description - * `FormController` keeps track of all its controls and nested forms as well as state of them, - * such as being valid/invalid or dirty/pristine. - * - * Each {@link ng.directive:form form} directive creates an instance - * of `FormController`. - * - */ -//asks for $scope to fool the BC controller module -FormController.$inject = ['$element', '$attrs', '$scope']; -function FormController(element, attrs) { - var form = this, - parentForm = element.parent().controller('form') || nullFormCtrl, - invalidCount = 0, // used to easily determine if we are valid - errors = form.$error = {}; - - // init state - form.$name = attrs.name; - form.$dirty = false; - form.$pristine = true; - form.$valid = true; - form.$invalid = false; - - parentForm.$addControl(form); - - // Setup initial state of the control - element.addClass(PRISTINE_CLASS); - toggleValidCss(true); - - // convenience method for easy toggling of classes - function toggleValidCss(isValid, validationErrorKey) { - validationErrorKey = validationErrorKey ? '-' + snake_case(validationErrorKey, '-') : ''; - element. - removeClass((isValid ? INVALID_CLASS : VALID_CLASS) + validationErrorKey). - addClass((isValid ? VALID_CLASS : INVALID_CLASS) + validationErrorKey); - } - - form.$addControl = function(control) { - if (control.$name && !form.hasOwnProperty(control.$name)) { - form[control.$name] = control; - } - }; - - form.$removeControl = function(control) { - if (control.$name && form[control.$name] === control) { - delete form[control.$name]; - } - forEach(errors, function(queue, validationToken) { - form.$setValidity(validationToken, true, control); - }); - }; - - form.$setValidity = function(validationToken, isValid, control) { - var queue = errors[validationToken]; - - if (isValid) { - if (queue) { - arrayRemove(queue, control); - if (!queue.length) { - invalidCount--; - if (!invalidCount) { - toggleValidCss(isValid); - form.$valid = true; - form.$invalid = false; - } - errors[validationToken] = false; - toggleValidCss(true, validationToken); - parentForm.$setValidity(validationToken, true, form); - } - } - - } else { - if (!invalidCount) { - toggleValidCss(isValid); - } - if (queue) { - if (includes(queue, control)) return; - } else { - errors[validationToken] = queue = []; - invalidCount++; - toggleValidCss(false, validationToken); - parentForm.$setValidity(validationToken, false, form); - } - queue.push(control); - - form.$valid = false; - form.$invalid = true; - } - }; - - form.$setDirty = function() { - element.removeClass(PRISTINE_CLASS).addClass(DIRTY_CLASS); - form.$dirty = true; - form.$pristine = false; - parentForm.$setDirty(); - }; - -} - - -/** - * @ngdoc directive - * @name ng.directive:ngForm - * @restrict EAC - * - * @description - * Nestable alias of {@link ng.directive:form `form`} directive. HTML - * does not allow nesting of form elements. It is useful to nest forms, for example if the validity of a - * sub-group of controls needs to be determined. - * - * @param {string=} name|ngForm Name of the form. If specified, the form controller will be published into - * related scope, under this name. - * - */ - - /** - * @ngdoc directive - * @name ng.directive:form - * @restrict E - * - * @description - * Directive that instantiates - * {@link ng.directive:form.FormController FormController}. - * - * If `name` attribute is specified, the form controller is published onto the current scope under - * this name. - * - * # Alias: {@link ng.directive:ngForm `ngForm`} - * - * In angular forms can be nested. This means that the outer form is valid when all of the child - * forms are valid as well. However browsers do not allow nesting of `
` elements, for this - * reason angular provides {@link ng.directive:ngForm `ngForm`} alias - * which behaves identical to `` but allows form nesting. - * - * - * # CSS classes - * - `ng-valid` Is set if the form is valid. - * - `ng-invalid` Is set if the form is invalid. - * - `ng-pristine` Is set if the form is pristine. - * - `ng-dirty` Is set if the form is dirty. - * - * - * # Submitting a form and preventing default action - * - * Since the role of forms in client-side Angular applications is different than in classical - * roundtrip apps, it is desirable for the browser not to translate the form submission into a full - * page reload that sends the data to the server. Instead some javascript logic should be triggered - * to handle the form submission in application specific way. - * - * For this reason, Angular prevents the default action (form submission to the server) unless the - * `` element has an `action` attribute specified. - * - * You can use one of the following two ways to specify what javascript method should be called when - * a form is submitted: - * - * - {@link ng.directive:ngSubmit ngSubmit} directive on the form element - * - {@link ng.directive:ngClick ngClick} directive on the first - * button or input field of type submit (input[type=submit]) - * - * To prevent double execution of the handler, use only one of ngSubmit or ngClick directives. This - * is because of the following form submission rules coming from the html spec: - * - * - If a form has only one input field then hitting enter in this field triggers form submit - * (`ngSubmit`) - * - if a form has has 2+ input fields and no buttons or input[type=submit] then hitting enter - * doesn't trigger submit - * - if a form has one or more input fields and one or more buttons or input[type=submit] then - * hitting enter in any of the input fields will trigger the click handler on the *first* button or - * input[type=submit] (`ngClick`) *and* a submit handler on the enclosing form (`ngSubmit`) - * - * @param {string=} name Name of the form. If specified, the form controller will be published into - * related scope, under this name. - * - * @example - - - - - userType: - Required!
- userType = {{userType}}
- myForm.input.$valid = {{myForm.input.$valid}}
- myForm.input.$error = {{myForm.input.$error}}
- myForm.$valid = {{myForm.$valid}}
- myForm.$error.required = {{!!myForm.$error.required}}
- -
- - it('should initialize to model', function() { - expect(binding('userType')).toEqual('guest'); - expect(binding('myForm.input.$valid')).toEqual('true'); - }); - - it('should be invalid if empty', function() { - input('userType').enter(''); - expect(binding('userType')).toEqual(''); - expect(binding('myForm.input.$valid')).toEqual('false'); - }); - -
- */ -var formDirectiveFactory = function(isNgForm) { - return ['$timeout', function($timeout) { - var formDirective = { - name: 'form', - restrict: 'E', - controller: FormController, - compile: function() { - return { - pre: function(scope, formElement, attr, controller) { - if (!attr.action) { - // we can't use jq events because if a form is destroyed during submission the default - // action is not prevented. see #1238 - // - // IE 9 is not affected because it doesn't fire a submit project and try to do a full - // page reload if the form was destroyed by submission of the form via a click handler - // on a button in the form. Looks like an IE9 specific bug. - var preventDefaultListener = function(event) { - event.preventDefault - ? event.preventDefault() - : event.returnValue = false; // IE - }; - - addEventListenerFn(formElement[0], 'submit', preventDefaultListener); - - // unregister the preventDefault listener so that we don't not leak memory but in a - // way that will achieve the prevention of the default action. - formElement.bind('$destroy', function() { - $timeout(function() { - removeEventListenerFn(formElement[0], 'submit', preventDefaultListener); - }, 0, false); - }); - } - - var parentFormCtrl = formElement.parent().controller('form'), - alias = attr.name || attr.ngForm; - - if (alias) { - scope[alias] = controller; - } - if (parentFormCtrl) { - formElement.bind('$destroy', function() { - parentFormCtrl.$removeControl(controller); - if (alias) { - scope[alias] = undefined; - } - extend(controller, nullFormCtrl); //stop propagating child destruction handlers upwards - }); - } - } - }; - } - }; - - return isNgForm ? extend(copy(formDirective), {restrict: 'EAC'}) : formDirective; - }]; -}; - -var formDirective = formDirectiveFactory(); -var ngFormDirective = formDirectiveFactory(true); - -var URL_REGEXP = /^(ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?$/; -var EMAIL_REGEXP = /^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}$/; -var NUMBER_REGEXP = /^\s*(\-|\+)?(\d+|(\d*(\.\d*)))\s*$/; - -var inputType = { - - /** - * @ngdoc inputType - * @name ng.directive:input.text - * - * @description - * Standard HTML text input with angular data binding. - * - * @param {string} ngModel Assignable angular expression to data-bind to. - * @param {string=} name Property name of the form under which the control is published. - * @param {string=} required Adds `required` validation error key if the value is not entered. - * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to - * the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of - * `required` when you want to data-bind to the `required` attribute. - * @param {number=} ngMinlength Sets `minlength` validation error key if the value is shorter than - * minlength. - * @param {number=} ngMaxlength Sets `maxlength` validation error key if the value is longer than - * maxlength. - * @param {string=} ngPattern Sets `pattern` validation error key if the value does not match the - * RegExp pattern expression. Expected value is `/regexp/` for inline patterns or `regexp` for - * patterns defined as scope expressions. - * @param {string=} ngChange Angular expression to be executed when input changes due to users - * interaction with the input element. - * - * @example - - - -
- Single word: - - Required! - - Single word only! - - text = {{text}}
- myForm.input.$valid = {{myForm.input.$valid}}
- myForm.input.$error = {{myForm.input.$error}}
- myForm.$valid = {{myForm.$valid}}
- myForm.$error.required = {{!!myForm.$error.required}}
-
-
- - it('should initialize to model', function() { - expect(binding('text')).toEqual('guest'); - expect(binding('myForm.input.$valid')).toEqual('true'); - }); - - it('should be invalid if empty', function() { - input('text').enter(''); - expect(binding('text')).toEqual(''); - expect(binding('myForm.input.$valid')).toEqual('false'); - }); - - it('should be invalid if multi word', function() { - input('text').enter('hello world'); - expect(binding('myForm.input.$valid')).toEqual('false'); - }); - -
- */ - 'text': textInputType, - - - /** - * @ngdoc inputType - * @name ng.directive:input.number - * - * @description - * Text input with number validation and transformation. Sets the `number` validation - * error if not a valid number. - * - * @param {string} ngModel Assignable angular expression to data-bind to. - * @param {string=} name Property name of the form under which the control is published. - * @param {string=} min Sets the `min` validation error key if the value entered is less then `min`. - * @param {string=} max Sets the `max` validation error key if the value entered is greater then `min`. - * @param {string=} required Sets `required` validation error key if the value is not entered. - * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to - * the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of - * `required` when you want to data-bind to the `required` attribute. - * @param {number=} ngMinlength Sets `minlength` validation error key if the value is shorter than - * minlength. - * @param {number=} ngMaxlength Sets `maxlength` validation error key if the value is longer than - * maxlength. - * @param {string=} ngPattern Sets `pattern` validation error key if the value does not match the - * RegExp pattern expression. Expected value is `/regexp/` for inline patterns or `regexp` for - * patterns defined as scope expressions. - * @param {string=} ngChange Angular expression to be executed when input changes due to users - * interaction with the input element. - * - * @example - - - -
- Number: - - Required! - - Not valid number! - value = {{value}}
- myForm.input.$valid = {{myForm.input.$valid}}
- myForm.input.$error = {{myForm.input.$error}}
- myForm.$valid = {{myForm.$valid}}
- myForm.$error.required = {{!!myForm.$error.required}}
-
-
- - it('should initialize to model', function() { - expect(binding('value')).toEqual('12'); - expect(binding('myForm.input.$valid')).toEqual('true'); - }); - - it('should be invalid if empty', function() { - input('value').enter(''); - expect(binding('value')).toEqual(''); - expect(binding('myForm.input.$valid')).toEqual('false'); - }); - - it('should be invalid if over max', function() { - input('value').enter('123'); - expect(binding('value')).toEqual(''); - expect(binding('myForm.input.$valid')).toEqual('false'); - }); - -
- */ - 'number': numberInputType, - - - /** - * @ngdoc inputType - * @name ng.directive:input.url - * - * @description - * Text input with URL validation. Sets the `url` validation error key if the content is not a - * valid URL. - * - * @param {string} ngModel Assignable angular expression to data-bind to. - * @param {string=} name Property name of the form under which the control is published. - * @param {string=} required Sets `required` validation error key if the value is not entered. - * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to - * the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of - * `required` when you want to data-bind to the `required` attribute. - * @param {number=} ngMinlength Sets `minlength` validation error key if the value is shorter than - * minlength. - * @param {number=} ngMaxlength Sets `maxlength` validation error key if the value is longer than - * maxlength. - * @param {string=} ngPattern Sets `pattern` validation error key if the value does not match the - * RegExp pattern expression. Expected value is `/regexp/` for inline patterns or `regexp` for - * patterns defined as scope expressions. - * @param {string=} ngChange Angular expression to be executed when input changes due to users - * interaction with the input element. - * - * @example - - - -
- URL: - - Required! - - Not valid url! - text = {{text}}
- myForm.input.$valid = {{myForm.input.$valid}}
- myForm.input.$error = {{myForm.input.$error}}
- myForm.$valid = {{myForm.$valid}}
- myForm.$error.required = {{!!myForm.$error.required}}
- myForm.$error.url = {{!!myForm.$error.url}}
-
-
- - it('should initialize to model', function() { - expect(binding('text')).toEqual('http://google.com'); - expect(binding('myForm.input.$valid')).toEqual('true'); - }); - - it('should be invalid if empty', function() { - input('text').enter(''); - expect(binding('text')).toEqual(''); - expect(binding('myForm.input.$valid')).toEqual('false'); - }); - - it('should be invalid if not url', function() { - input('text').enter('xxx'); - expect(binding('myForm.input.$valid')).toEqual('false'); - }); - -
- */ - 'url': urlInputType, - - - /** - * @ngdoc inputType - * @name ng.directive:input.email - * - * @description - * Text input with email validation. Sets the `email` validation error key if not a valid email - * address. - * - * @param {string} ngModel Assignable angular expression to data-bind to. - * @param {string=} name Property name of the form under which the control is published. - * @param {string=} required Sets `required` validation error key if the value is not entered. - * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to - * the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of - * `required` when you want to data-bind to the `required` attribute. - * @param {number=} ngMinlength Sets `minlength` validation error key if the value is shorter than - * minlength. - * @param {number=} ngMaxlength Sets `maxlength` validation error key if the value is longer than - * maxlength. - * @param {string=} ngPattern Sets `pattern` validation error key if the value does not match the - * RegExp pattern expression. Expected value is `/regexp/` for inline patterns or `regexp` for - * patterns defined as scope expressions. - * - * @example - - - -
- Email: - - Required! - - Not valid email! - text = {{text}}
- myForm.input.$valid = {{myForm.input.$valid}}
- myForm.input.$error = {{myForm.input.$error}}
- myForm.$valid = {{myForm.$valid}}
- myForm.$error.required = {{!!myForm.$error.required}}
- myForm.$error.email = {{!!myForm.$error.email}}
-
-
- - it('should initialize to model', function() { - expect(binding('text')).toEqual('me@example.com'); - expect(binding('myForm.input.$valid')).toEqual('true'); - }); - - it('should be invalid if empty', function() { - input('text').enter(''); - expect(binding('text')).toEqual(''); - expect(binding('myForm.input.$valid')).toEqual('false'); - }); - - it('should be invalid if not email', function() { - input('text').enter('xxx'); - expect(binding('myForm.input.$valid')).toEqual('false'); - }); - -
- */ - 'email': emailInputType, - - - /** - * @ngdoc inputType - * @name ng.directive:input.radio - * - * @description - * HTML radio button. - * - * @param {string} ngModel Assignable angular expression to data-bind to. - * @param {string} value The value to which the expression should be set when selected. - * @param {string=} name Property name of the form under which the control is published. - * @param {string=} ngChange Angular expression to be executed when input changes due to users - * interaction with the input element. - * - * @example - - - -
- Red
- Green
- Blue
- color = {{color}}
-
-
- - it('should change state', function() { - expect(binding('color')).toEqual('blue'); - - input('color').select('red'); - expect(binding('color')).toEqual('red'); - }); - -
- */ - 'radio': radioInputType, - - - /** - * @ngdoc inputType - * @name ng.directive:input.checkbox - * - * @description - * HTML checkbox. - * - * @param {string} ngModel Assignable angular expression to data-bind to. - * @param {string=} name Property name of the form under which the control is published. - * @param {string=} ngTrueValue The value to which the expression should be set when selected. - * @param {string=} ngFalseValue The value to which the expression should be set when not selected. - * @param {string=} ngChange Angular expression to be executed when input changes due to users - * interaction with the input element. - * - * @example - - - -
- Value1:
- Value2:
- value1 = {{value1}}
- value2 = {{value2}}
-
-
- - it('should change state', function() { - expect(binding('value1')).toEqual('true'); - expect(binding('value2')).toEqual('YES'); - - input('value1').check(); - input('value2').check(); - expect(binding('value1')).toEqual('false'); - expect(binding('value2')).toEqual('NO'); - }); - -
- */ - 'checkbox': checkboxInputType, - - 'hidden': noop, - 'button': noop, - 'submit': noop, - 'reset': noop -}; - - -function isEmpty(value) { - return isUndefined(value) || value === '' || value === null || value !== value; -} - - -function textInputType(scope, element, attr, ctrl, $sniffer, $browser) { - - var listener = function() { - var value = trim(element.val()); - - if (ctrl.$viewValue !== value) { - scope.$apply(function() { - ctrl.$setViewValue(value); - }); - } - }; - - // if the browser does support "input" project, we are fine - except on IE9 which doesn't fire the - // input project on backspace, delete or cut - if ($sniffer.hasEvent('input')) { - element.bind('input', listener); - } else { - var timeout; - - element.bind('keydown', function(event) { - var key = event.keyCode; - - // ignore - // command modifiers arrows - if (key === 91 || (15 < key && key < 19) || (37 <= key && key <= 40)) return; - - if (!timeout) { - timeout = $browser.defer(function() { - listener(); - timeout = null; - }); - } - }); - - // if users paste into input using mouse, we need "change" project to catch it - element.bind('change', listener); - } - - - ctrl.$render = function() { - element.val(isEmpty(ctrl.$viewValue) ? '' : ctrl.$viewValue); - }; - - // pattern validator - var pattern = attr.ngPattern, - patternValidator; - - var validate = function(regexp, value) { - if (isEmpty(value) || regexp.test(value)) { - ctrl.$setValidity('pattern', true); - return value; - } else { - ctrl.$setValidity('pattern', false); - return undefined; - } - }; - - if (pattern) { - if (pattern.match(/^\/(.*)\/$/)) { - pattern = new RegExp(pattern.substr(1, pattern.length - 2)); - patternValidator = function(value) { - return validate(pattern, value) - }; - } else { - patternValidator = function(value) { - var patternObj = scope.$eval(pattern); - - if (!patternObj || !patternObj.test) { - throw new Error('Expected ' + pattern + ' to be a RegExp but was ' + patternObj); - } - return validate(patternObj, value); - }; - } - - ctrl.$formatters.push(patternValidator); - ctrl.$parsers.push(patternValidator); - } - - // min length validator - if (attr.ngMinlength) { - var minlength = int(attr.ngMinlength); - var minLengthValidator = function(value) { - if (!isEmpty(value) && value.length < minlength) { - ctrl.$setValidity('minlength', false); - return undefined; - } else { - ctrl.$setValidity('minlength', true); - return value; - } - }; - - ctrl.$parsers.push(minLengthValidator); - ctrl.$formatters.push(minLengthValidator); - } - - // max length validator - if (attr.ngMaxlength) { - var maxlength = int(attr.ngMaxlength); - var maxLengthValidator = function(value) { - if (!isEmpty(value) && value.length > maxlength) { - ctrl.$setValidity('maxlength', false); - return undefined; - } else { - ctrl.$setValidity('maxlength', true); - return value; - } - }; - - ctrl.$parsers.push(maxLengthValidator); - ctrl.$formatters.push(maxLengthValidator); - } -} - -function numberInputType(scope, element, attr, ctrl, $sniffer, $browser) { - textInputType(scope, element, attr, ctrl, $sniffer, $browser); - - ctrl.$parsers.push(function(value) { - var empty = isEmpty(value); - if (empty || NUMBER_REGEXP.test(value)) { - ctrl.$setValidity('number', true); - return value === '' ? null : (empty ? value : parseFloat(value)); - } else { - ctrl.$setValidity('number', false); - return undefined; - } - }); - - ctrl.$formatters.push(function(value) { - return isEmpty(value) ? '' : '' + value; - }); - - if (attr.min) { - var min = parseFloat(attr.min); - var minValidator = function(value) { - if (!isEmpty(value) && value < min) { - ctrl.$setValidity('min', false); - return undefined; - } else { - ctrl.$setValidity('min', true); - return value; - } - }; - - ctrl.$parsers.push(minValidator); - ctrl.$formatters.push(minValidator); - } - - if (attr.max) { - var max = parseFloat(attr.max); - var maxValidator = function(value) { - if (!isEmpty(value) && value > max) { - ctrl.$setValidity('max', false); - return undefined; - } else { - ctrl.$setValidity('max', true); - return value; - } - }; - - ctrl.$parsers.push(maxValidator); - ctrl.$formatters.push(maxValidator); - } - - ctrl.$formatters.push(function(value) { - - if (isEmpty(value) || isNumber(value)) { - ctrl.$setValidity('number', true); - return value; - } else { - ctrl.$setValidity('number', false); - return undefined; - } - }); -} - -function urlInputType(scope, element, attr, ctrl, $sniffer, $browser) { - textInputType(scope, element, attr, ctrl, $sniffer, $browser); - - var urlValidator = function(value) { - if (isEmpty(value) || URL_REGEXP.test(value)) { - ctrl.$setValidity('url', true); - return value; - } else { - ctrl.$setValidity('url', false); - return undefined; - } - }; - - ctrl.$formatters.push(urlValidator); - ctrl.$parsers.push(urlValidator); -} - -function emailInputType(scope, element, attr, ctrl, $sniffer, $browser) { - textInputType(scope, element, attr, ctrl, $sniffer, $browser); - - var emailValidator = function(value) { - if (isEmpty(value) || EMAIL_REGEXP.test(value)) { - ctrl.$setValidity('email', true); - return value; - } else { - ctrl.$setValidity('email', false); - return undefined; - } - }; - - ctrl.$formatters.push(emailValidator); - ctrl.$parsers.push(emailValidator); -} - -function radioInputType(scope, element, attr, ctrl) { - // make the name unique, if not defined - if (isUndefined(attr.name)) { - element.attr('name', nextUid()); - } - - element.bind('click', function() { - if (element[0].checked) { - scope.$apply(function() { - ctrl.$setViewValue(attr.value); - }); - } - }); - - ctrl.$render = function() { - var value = attr.value; - element[0].checked = (value == ctrl.$viewValue); - }; - - attr.$observe('value', ctrl.$render); -} - -function checkboxInputType(scope, element, attr, ctrl) { - var trueValue = attr.ngTrueValue, - falseValue = attr.ngFalseValue; - - if (!isString(trueValue)) trueValue = true; - if (!isString(falseValue)) falseValue = false; - - element.bind('click', function() { - scope.$apply(function() { - ctrl.$setViewValue(element[0].checked); - }); - }); - - ctrl.$render = function() { - element[0].checked = ctrl.$viewValue; - }; - - ctrl.$formatters.push(function(value) { - return value === trueValue; - }); - - ctrl.$parsers.push(function(value) { - return value ? trueValue : falseValue; - }); -} - - -/** - * @ngdoc directive - * @name ng.directive:textarea - * @restrict E - * - * @description - * HTML textarea element control with angular data-binding. The data-binding and validation - * properties of this element are exactly the same as those of the - * {@link ng.directive:input input element}. - * - * @param {string} ngModel Assignable angular expression to data-bind to. - * @param {string=} name Property name of the form under which the control is published. - * @param {string=} required Sets `required` validation error key if the value is not entered. - * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to - * the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of - * `required` when you want to data-bind to the `required` attribute. - * @param {number=} ngMinlength Sets `minlength` validation error key if the value is shorter than - * minlength. - * @param {number=} ngMaxlength Sets `maxlength` validation error key if the value is longer than - * maxlength. - * @param {string=} ngPattern Sets `pattern` validation error key if the value does not match the - * RegExp pattern expression. Expected value is `/regexp/` for inline patterns or `regexp` for - * patterns defined as scope expressions. - * @param {string=} ngChange Angular expression to be executed when input changes due to users - * interaction with the input element. - */ - - -/** - * @ngdoc directive - * @name ng.directive:input - * @restrict E - * - * @description - * HTML input element control with angular data-binding. Input control follows HTML5 input types - * and polyfills the HTML5 validation behavior for older browsers. - * - * @param {string} ngModel Assignable angular expression to data-bind to. - * @param {string=} name Property name of the form under which the control is published. - * @param {string=} required Sets `required` validation error key if the value is not entered. - * @param {boolean=} ngRequired Sets `required` attribute if set to true - * @param {number=} ngMinlength Sets `minlength` validation error key if the value is shorter than - * minlength. - * @param {number=} ngMaxlength Sets `maxlength` validation error key if the value is longer than - * maxlength. - * @param {string=} ngPattern Sets `pattern` validation error key if the value does not match the - * RegExp pattern expression. Expected value is `/regexp/` for inline patterns or `regexp` for - * patterns defined as scope expressions. - * @param {string=} ngChange Angular expression to be executed when input changes due to users - * interaction with the input element. - * - * @example - - - -
-
- User name: - - Required!
- Last name: - - Too short! - - Too long!
-
-
- users = {{users}}
- myForm.userName.$valid = {{myForm.userName.$valid}}
- myForm.userName.$error = {{myForm.userName.$error}}
- myForm.lastName.$valid = {{myForm.lastName.$valid}}
- myForm.userName.$error = {{myForm.lastName.$error}}
- myForm.$valid = {{myForm.$valid}}
- myForm.$error.required = {{!!myForm.$error.required}}
- myForm.$error.minlength = {{!!myForm.$error.minlength}}
- myForm.$error.maxlength = {{!!myForm.$error.maxlength}}
-
-
- - it('should initialize to model', function() { - expect(binding('users')).toEqual('{"name":"guest","last":"visitor"}'); - expect(binding('myForm.userName.$valid')).toEqual('true'); - expect(binding('myForm.$valid')).toEqual('true'); - }); - - it('should be invalid if empty when required', function() { - input('users.name').enter(''); - expect(binding('users')).toEqual('{"last":"visitor"}'); - expect(binding('myForm.userName.$valid')).toEqual('false'); - expect(binding('myForm.$valid')).toEqual('false'); - }); - - it('should be valid if empty when min length is set', function() { - input('users.last').enter(''); - expect(binding('users')).toEqual('{"name":"guest","last":""}'); - expect(binding('myForm.lastName.$valid')).toEqual('true'); - expect(binding('myForm.$valid')).toEqual('true'); - }); - - it('should be invalid if less than required min length', function() { - input('users.last').enter('xx'); - expect(binding('users')).toEqual('{"name":"guest"}'); - expect(binding('myForm.lastName.$valid')).toEqual('false'); - expect(binding('myForm.lastName.$error')).toMatch(/minlength/); - expect(binding('myForm.$valid')).toEqual('false'); - }); - - it('should be invalid if longer than max length', function() { - input('users.last').enter('some ridiculously long name'); - expect(binding('users')) - .toEqual('{"name":"guest"}'); - expect(binding('myForm.lastName.$valid')).toEqual('false'); - expect(binding('myForm.lastName.$error')).toMatch(/maxlength/); - expect(binding('myForm.$valid')).toEqual('false'); - }); - -
- */ -var inputDirective = ['$browser', '$sniffer', function($browser, $sniffer) { - return { - restrict: 'E', - require: '?ngModel', - link: function(scope, element, attr, ctrl) { - if (ctrl) { - (inputType[lowercase(attr.type)] || inputType.text)(scope, element, attr, ctrl, $sniffer, - $browser); - } - } - }; -}]; - -var VALID_CLASS = 'ng-valid', - INVALID_CLASS = 'ng-invalid', - PRISTINE_CLASS = 'ng-pristine', - DIRTY_CLASS = 'ng-dirty'; - -/** - * @ngdoc object - * @name ng.directive:ngModel.NgModelController - * - * @property {string} $viewValue Actual string value in the view. - * @property {*} $modelValue The value in the model, that the control is bound to. - * @property {Array.} $parsers Whenever the control reads value from the DOM, it executes - * all of these functions to sanitize / convert the value as well as validate. - * - * @property {Array.} $formatters Whenever the model value changes, it executes all of - * these functions to convert the value as well as validate. - * - * @property {Object} $error An bject hash with all errors as keys. - * - * @property {boolean} $pristine True if users has not interacted with the control yet. - * @property {boolean} $dirty True if users has already interacted with the control. - * @property {boolean} $valid True if there is no error. - * @property {boolean} $invalid True if at least one error on the control. - * - * @description - * - * `NgModelController` provides API for the `ng-model` directive. The controller contains - * services for data-binding, validation, CSS update, value formatting and parsing. It - * specifically does not contain any logic which deals with DOM rendering or listening to - * DOM events. The `NgModelController` is meant to be extended by other directives where, the - * directive provides DOM manipulation and the `NgModelController` provides the data-binding. - * - * This example shows how to use `NgModelController` with a custom control to achieve - * data-binding. Notice how different directives (`contenteditable`, `ng-model`, and `required`) - * collaborate together to achieve the desired result. - * - * - - [contenteditable] { - border: 1px solid black; - background-color: white; - min-height: 20px; - } - - .ng-invalid { - border: 1px solid red; - } - - - - angular.module('customControl', []). - directive('contenteditable', function() { - return { - restrict: 'A', // only activate on element attribute - require: '?ngModel', // get a hold of NgModelController - link: function(scope, element, attrs, ngModel) { - if(!ngModel) return; // do nothing if no ng-model - - // Specify how UI should be updated - ngModel.$render = function() { - element.html(ngModel.$viewValue || ''); - }; - - // Listen for change events to enable binding - element.bind('blur keyup change', function() { - scope.$apply(read); - }); - read(); // initialize - - // Write data to the model - function read() { - ngModel.$setViewValue(element.html()); - } - } - }; - }); - - -
-
Change me!
- Required! -
- -
-
- - it('should data-bind and become invalid', function() { - var contentEditable = element('[contenteditable]'); - - expect(contentEditable.text()).toEqual('Change me!'); - input('userContent').enter(''); - expect(contentEditable.text()).toEqual(''); - expect(contentEditable.prop('className')).toMatch(/ng-invalid-required/); - }); - - *
- * - */ -var NgModelController = ['$scope', '$exceptionHandler', '$attrs', '$element', '$parse', - function($scope, $exceptionHandler, $attr, $element, $parse) { - this.$viewValue = Number.NaN; - this.$modelValue = Number.NaN; - this.$parsers = []; - this.$formatters = []; - this.$viewChangeListeners = []; - this.$pristine = true; - this.$dirty = false; - this.$valid = true; - this.$invalid = false; - this.$name = $attr.name; - - var ngModelGet = $parse($attr.ngModel), - ngModelSet = ngModelGet.assign; - - if (!ngModelSet) { - throw Error(NON_ASSIGNABLE_MODEL_EXPRESSION + $attr.ngModel + - ' (' + startingTag($element) + ')'); - } - - /** - * @ngdoc function - * @name ng.directive:ngModel.NgModelController#$render - * @methodOf ng.directive:ngModel.NgModelController - * - * @description - * Called when the view needs to be updated. It is expected that the users of the ng-model - * directive will implement this method. - */ - this.$render = noop; - - var parentForm = $element.inheritedData('$formController') || nullFormCtrl, - invalidCount = 0, // used to easily determine if we are valid - $error = this.$error = {}; // keep invalid keys here - - - // Setup initial state of the control - $element.addClass(PRISTINE_CLASS); - toggleValidCss(true); - - // convenience method for easy toggling of classes - function toggleValidCss(isValid, validationErrorKey) { - validationErrorKey = validationErrorKey ? '-' + snake_case(validationErrorKey, '-') : ''; - $element. - removeClass((isValid ? INVALID_CLASS : VALID_CLASS) + validationErrorKey). - addClass((isValid ? VALID_CLASS : INVALID_CLASS) + validationErrorKey); - } - - /** - * @ngdoc function - * @name ng.directive:ngModel.NgModelController#$setValidity - * @methodOf ng.directive:ngModel.NgModelController - * - * @description - * Change the validity state, and notifies the form when the control changes validity. (i.e. it - * does not notify form if given validator is already marked as invalid). - * - * This method should be called by validators - i.e. the parser or formatter functions. - * - * @param {string} validationErrorKey Name of the validator. the `validationErrorKey` will assign - * to `$error[validationErrorKey]=isValid` so that it is available for data-binding. - * The `validationErrorKey` should be in camelCase and will get converted into dash-case - * for class name. Example: `myError` will result in `ng-valid-my-error` and `ng-invalid-my-error` - * class and can be bound to as `{{someForm.someControl.$error.myError}}` . - * @param {boolean} isValid Whether the current state is valid (true) or invalid (false). - */ - this.$setValidity = function(validationErrorKey, isValid) { - if ($error[validationErrorKey] === !isValid) return; - - if (isValid) { - if ($error[validationErrorKey]) invalidCount--; - if (!invalidCount) { - toggleValidCss(true); - this.$valid = true; - this.$invalid = false; - } - } else { - toggleValidCss(false); - this.$invalid = true; - this.$valid = false; - invalidCount++; - } - - $error[validationErrorKey] = !isValid; - toggleValidCss(isValid, validationErrorKey); - - parentForm.$setValidity(validationErrorKey, isValid, this); - }; - - - /** - * @ngdoc function - * @name ng.directive:ngModel.NgModelController#$setViewValue - * @methodOf ng.directive:ngModel.NgModelController - * - * @description - * Read a value from view. - * - * This method should be called from within a DOM project handler. - * For example {@link ng.directive:input input} or - * {@link ng.directive:select select} directives call it. - * - * It internally calls all `formatters` and if resulted value is valid, updates the model and - * calls all registered change listeners. - * - * @param {string} value Value from the view. - */ - this.$setViewValue = function(value) { - this.$viewValue = value; - - // change to dirty - if (this.$pristine) { - this.$dirty = true; - this.$pristine = false; - $element.removeClass(PRISTINE_CLASS).addClass(DIRTY_CLASS); - parentForm.$setDirty(); - } - - forEach(this.$parsers, function(fn) { - value = fn(value); - }); - - if (this.$modelValue !== value) { - this.$modelValue = value; - ngModelSet($scope, value); - forEach(this.$viewChangeListeners, function(listener) { - try { - listener(); - } catch(e) { - $exceptionHandler(e); - } - }) - } - }; - - // model -> value - var ctrl = this; - - $scope.$watch(function ngModelWatch() { - var value = ngModelGet($scope); - - // if scope model value and ngModel value are out of sync - if (ctrl.$modelValue !== value) { - - var formatters = ctrl.$formatters, - idx = formatters.length; - - ctrl.$modelValue = value; - while(idx--) { - value = formatters[idx](value); - } - - if (ctrl.$viewValue !== value) { - ctrl.$viewValue = value; - ctrl.$render(); - } - } - }); -}]; - - -/** - * @ngdoc directive - * @name ng.directive:ngModel - * - * @element input - * - * @description - * Is directive that tells Angular to do two-way data binding. It works together with `input`, - * `select`, `textarea`. You can easily write your own directives to use `ngModel` as well. - * - * `ngModel` is responsible for: - * - * - binding the view into the model, which other directives such as `input`, `textarea` or `select` - * require, - * - providing validation behavior (i.e. required, number, email, url), - * - keeping state of the control (valid/invalid, dirty/pristine, validation errors), - * - setting related css class onto the element (`ng-valid`, `ng-invalid`, `ng-dirty`, `ng-pristine`), - * - register the control with parent {@link ng.directive:form form}. - * - * For basic examples, how to use `ngModel`, see: - * - * - {@link ng.directive:input input} - * - {@link ng.directive:input.text text} - * - {@link ng.directive:input.checkbox checkbox} - * - {@link ng.directive:input.radio radio} - * - {@link ng.directive:input.number number} - * - {@link ng.directive:input.email email} - * - {@link ng.directive:input.url url} - * - {@link ng.directive:select select} - * - {@link ng.directive:textarea textarea} - * - */ -var ngModelDirective = function() { - return { - require: ['ngModel', '^?form'], - controller: NgModelController, - link: function(scope, element, attr, ctrls) { - // notify others, especially parent forms - - var modelCtrl = ctrls[0], - formCtrl = ctrls[1] || nullFormCtrl; - - formCtrl.$addControl(modelCtrl); - - element.bind('$destroy', function() { - formCtrl.$removeControl(modelCtrl); - }); - } - }; -}; - - -/** - * @ngdoc directive - * @name ng.directive:ngChange - * @restrict E - * - * @description - * Evaluate given expression when users changes the input. - * The expression is not evaluated when the value change is coming from the model. - * - * Note, this directive requires `ngModel` to be present. - * - * @element input - * - * @example - * - * - * - *
- * - * - *
- * debug = {{confirmed}}
- * counter = {{counter}} - *
- *
- * - * it('should evaluate the expression if changing from view', function() { - * expect(binding('counter')).toEqual('0'); - * element('#ng-change-example1').click(); - * expect(binding('counter')).toEqual('1'); - * expect(binding('confirmed')).toEqual('true'); - * }); - * - * it('should not evaluate the expression if changing from model', function() { - * element('#ng-change-example2').click(); - * expect(binding('counter')).toEqual('0'); - * expect(binding('confirmed')).toEqual('true'); - * }); - * - *
- */ -var ngChangeDirective = valueFn({ - require: 'ngModel', - link: function(scope, element, attr, ctrl) { - ctrl.$viewChangeListeners.push(function() { - scope.$eval(attr.ngChange); - }); - } -}); - - -var requiredDirective = function() { - return { - require: '?ngModel', - link: function(scope, elm, attr, ctrl) { - if (!ctrl) return; - attr.required = true; // force truthy in case we are on non input element - - var validator = function(value) { - if (attr.required && (isEmpty(value) || value === false)) { - ctrl.$setValidity('required', false); - return; - } else { - ctrl.$setValidity('required', true); - return value; - } - }; - - ctrl.$formatters.push(validator); - ctrl.$parsers.unshift(validator); - - attr.$observe('required', function() { - validator(ctrl.$viewValue); - }); - } - }; -}; - - -/** - * @ngdoc directive - * @name ng.directive:ngList - * - * @description - * Text input that converts between comma-separated string into an array of strings. - * - * @element input - * @param {string=} ngList optional delimiter that should be used to split the value. If - * specified in form `/something/` then the value will be converted into a regular expression. - * - * @example - - - -
- List: - - Required! - names = {{names}}
- myForm.namesInput.$valid = {{myForm.namesInput.$valid}}
- myForm.namesInput.$error = {{myForm.namesInput.$error}}
- myForm.$valid = {{myForm.$valid}}
- myForm.$error.required = {{!!myForm.$error.required}}
-
-
- - it('should initialize to model', function() { - expect(binding('names')).toEqual('["igor","misko","vojta"]'); - expect(binding('myForm.namesInput.$valid')).toEqual('true'); - }); - - it('should be invalid if empty', function() { - input('names').enter(''); - expect(binding('names')).toEqual('[]'); - expect(binding('myForm.namesInput.$valid')).toEqual('false'); - }); - -
- */ -var ngListDirective = function() { - return { - require: 'ngModel', - link: function(scope, element, attr, ctrl) { - var match = /\/(.*)\//.exec(attr.ngList), - separator = match && new RegExp(match[1]) || attr.ngList || ','; - - var parse = function(viewValue) { - var list = []; - - if (viewValue) { - forEach(viewValue.split(separator), function(value) { - if (value) list.push(trim(value)); - }); - } - - return list; - }; - - ctrl.$parsers.push(parse); - ctrl.$formatters.push(function(value) { - if (isArray(value)) { - return value.join(', '); - } - - return undefined; - }); - } - }; -}; - - -var CONSTANT_VALUE_REGEXP = /^(true|false|\d+)$/; - -var ngValueDirective = function() { - return { - priority: 100, - compile: function(tpl, tplAttr) { - if (CONSTANT_VALUE_REGEXP.test(tplAttr.ngValue)) { - return function(scope, elm, attr) { - attr.$set('value', scope.$eval(attr.ngValue)); - }; - } else { - return function(scope, elm, attr) { - scope.$watch(attr.ngValue, function valueWatchAction(value) { - attr.$set('value', value, false); - }); - }; - } - } - }; -}; - -/** - * @ngdoc directive - * @name ng.directive:ngBind - * - * @description - * The `ngBind` attribute tells Angular to replace the text content of the specified HTML element - * with the value of a given expression, and to update the text content when the value of that - * expression changes. - * - * Typically, you don't use `ngBind` directly, but instead you use the double curly markup like - * `{{ expression }}` which is similar but less verbose. - * - * Once scenario in which the use of `ngBind` is prefered over `{{ expression }}` binding is when - * it's desirable to put bindings into template that is momentarily displayed by the browser in its - * raw state before Angular compiles it. Since `ngBind` is an element attribute, it makes the - * bindings invisible to the users while the page is loading. - * - * An alternative solution to this problem would be using the - * {@link ng.directive:ngCloak ngCloak} directive. - * - * - * @element ANY - * @param {expression} ngBind {@link guide/expression Expression} to evaluate. - * - * @example - * Enter a name in the Live Preview text box; the greeting below the text box changes instantly. - - - -
- Enter name:
- Hello ! -
-
- - it('should check ng-bind', function() { - expect(using('.doc-example-live').binding('name')).toBe('Whirled'); - using('.doc-example-live').input('name').enter('world'); - expect(using('.doc-example-live').binding('name')).toBe('world'); - }); - -
- */ -var ngBindDirective = ngDirective(function(scope, element, attr) { - element.addClass('ng-binding').data('$binding', attr.ngBind); - scope.$watch(attr.ngBind, function ngBindWatchAction(value) { - element.text(value == undefined ? '' : value); - }); -}); - - -/** - * @ngdoc directive - * @name ng.directive:ngBindTemplate - * - * @description - * The `ngBindTemplate` directive specifies that the element - * text should be replaced with the template in ngBindTemplate. - * Unlike ngBind the ngBindTemplate can contain multiple `{{` `}}` - * expressions. (This is required since some HTML elements - * can not have SPAN elements such as TITLE, or OPTION to name a few.) - * - * @element ANY - * @param {string} ngBindTemplate template of form - * {{ expression }} to eval. - * - * @example - * Try it here: enter text in text box and watch the greeting change. - - - -
- Salutation:
- Name:
-

-       
-
- - it('should check ng-bind', function() { - expect(using('.doc-example-live').binding('salutation')). - toBe('Hello'); - expect(using('.doc-example-live').binding('name')). - toBe('World'); - using('.doc-example-live').input('salutation').enter('Greetings'); - using('.doc-example-live').input('name').enter('users'); - expect(using('.doc-example-live').binding('salutation')). - toBe('Greetings'); - expect(using('.doc-example-live').binding('name')). - toBe('users'); - }); - -
- */ -var ngBindTemplateDirective = ['$interpolate', function($interpolate) { - return function(scope, element, attr) { - // TODO: move this to scenario runner - var interpolateFn = $interpolate(element.attr(attr.$attr.ngBindTemplate)); - element.addClass('ng-binding').data('$binding', interpolateFn); - attr.$observe('ngBindTemplate', function(value) { - element.text(value); - }); - } -}]; - - -/** - * @ngdoc directive - * @name ng.directive:ngBindHtmlUnsafe - * - * @description - * Creates a binding that will innerHTML the result of evaluating the `expression` into the current - * element. *The innerHTML-ed content will not be sanitized!* You should use this directive only if - * {@link ngSanitize.directive:ngBindHtml ngBindHtml} directive is too - * restrictive and when you absolutely trust the source of the content you are binding to. - * - * See {@link ngSanitize.$sanitize $sanitize} docs for examples. - * - * @element ANY - * @param {expression} ngBindHtmlUnsafe {@link guide/expression Expression} to evaluate. - */ -var ngBindHtmlUnsafeDirective = [function() { - return function(scope, element, attr) { - element.addClass('ng-binding').data('$binding', attr.ngBindHtmlUnsafe); - scope.$watch(attr.ngBindHtmlUnsafe, function ngBindHtmlUnsafeWatchAction(value) { - element.html(value || ''); - }); - }; -}]; - -function classDirective(name, selector) { - name = 'ngClass' + name; - return ngDirective(function(scope, element, attr) { - var oldVal = undefined; - - scope.$watch(attr[name], ngClassWatchAction, true); - - attr.$observe('class', function(value) { - var ngClass = scope.$eval(attr[name]); - ngClassWatchAction(ngClass, ngClass); - }); - - - if (name !== 'ngClass') { - scope.$watch('$index', function($index, old$index) { - var mod = $index % 2; - if (mod !== old$index % 2) { - if (mod == selector) { - addClass(scope.$eval(attr[name])); - } else { - removeClass(scope.$eval(attr[name])); - } - } - }); - } - - - function ngClassWatchAction(newVal) { - if (selector === true || scope.$index % 2 === selector) { - if (oldVal && (newVal !== oldVal)) { - removeClass(oldVal); - } - addClass(newVal); - } - oldVal = newVal; - } - - - function removeClass(classVal) { - if (isObject(classVal) && !isArray(classVal)) { - classVal = map(classVal, function(v, k) { if (v) return k }); - } - element.removeClass(isArray(classVal) ? classVal.join(' ') : classVal); - } - - - function addClass(classVal) { - if (isObject(classVal) && !isArray(classVal)) { - classVal = map(classVal, function(v, k) { if (v) return k }); - } - if (classVal) { - element.addClass(isArray(classVal) ? classVal.join(' ') : classVal); - } - } - }); -} - -/** - * @ngdoc directive - * @name ng.directive:ngClass - * - * @description - * The `ngClass` allows you to set CSS class on HTML element dynamically by databinding an - * expression that represents all classes to be added. - * - * The directive won't add duplicate classes if a particular class was already set. - * - * When the expression changes, the previously added classes are removed and only then the - * new classes are added. - * - * @element ANY - * @param {expression} ngClass {@link guide/expression Expression} to eval. The result - * of the evaluation can be a string representing space delimited class - * names, an array, or a map of class names to boolean values. - * - * @example - - - - -
- Sample Text -
- - .my-class { - color: red; - } - - - it('should check ng-class', function() { - expect(element('.doc-example-live span').prop('className')).not(). - toMatch(/my-class/); - - using('.doc-example-live').element(':button:first').click(); - - expect(element('.doc-example-live span').prop('className')). - toMatch(/my-class/); - - using('.doc-example-live').element(':button:last').click(); - - expect(element('.doc-example-live span').prop('className')).not(). - toMatch(/my-class/); - }); - -
- */ -var ngClassDirective = classDirective('', true); - -/** - * @ngdoc directive - * @name ng.directive:ngClassOdd - * - * @description - * The `ngClassOdd` and `ngClassEven` directives work exactly as - * {@link ng.directive:ngClass ngClass}, except it works in - * conjunction with `ngRepeat` and takes affect only on odd (even) rows. - * - * This directive can be applied only within a scope of an - * {@link ng.directive:ngRepeat ngRepeat}. - * - * @element ANY - * @param {expression} ngClassOdd {@link guide/expression Expression} to eval. The result - * of the evaluation can be a string representing space delimited class names or an array. - * - * @example - - -
    -
  1. - - {{name}} - -
  2. -
-
- - .odd { - color: red; - } - .even { - color: blue; - } - - - it('should check ng-class-odd and ng-class-even', function() { - expect(element('.doc-example-live li:first span').prop('className')). - toMatch(/odd/); - expect(element('.doc-example-live li:last span').prop('className')). - toMatch(/even/); - }); - -
- */ -var ngClassOddDirective = classDirective('Odd', 0); - -/** - * @ngdoc directive - * @name ng.directive:ngClassEven - * - * @description - * The `ngClassOdd` and `ngClassEven` works exactly as - * {@link ng.directive:ngClass ngClass}, except it works in - * conjunction with `ngRepeat` and takes affect only on odd (even) rows. - * - * This directive can be applied only within a scope of an - * {@link ng.directive:ngRepeat ngRepeat}. - * - * @element ANY - * @param {expression} ngClassEven {@link guide/expression Expression} to eval. The - * result of the evaluation can be a string representing space delimited class names or an array. - * - * @example - - -
    -
  1. - - {{name}}       - -
  2. -
-
- - .odd { - color: red; - } - .even { - color: blue; - } - - - it('should check ng-class-odd and ng-class-even', function() { - expect(element('.doc-example-live li:first span').prop('className')). - toMatch(/odd/); - expect(element('.doc-example-live li:last span').prop('className')). - toMatch(/even/); - }); - -
- */ -var ngClassEvenDirective = classDirective('Even', 1); - -/** - * @ngdoc directive - * @name ng.directive:ngCloak - * - * @description - * The `ngCloak` directive is used to prevent the Angular html template from being briefly - * displayed by the browser in its raw (uncompiled) form while your application is loading. Use this - * directive to avoid the undesirable flicker effect caused by the html template display. - * - * The directive can be applied to the `` element, but typically a fine-grained application is - * prefered in order to benefit from progressive rendering of the browser view. - * - * `ngCloak` works in cooperation with a css rule that is embedded within `angular.js` and - * `angular.min.js` files. Following is the css rule: - * - *
- * [ng\:cloak], [ng-cloak], .ng-cloak {
- *   display: none;
- * }
- * 
- * - * When this css rule is loaded by the browser, all html elements (including their children) that - * are tagged with the `ng-cloak` directive are hidden. When Angular comes across this directive - * during the compilation of the template it deletes the `ngCloak` element attribute, which - * makes the compiled element visible. - * - * For the best result, `angular.js` script must be loaded in the head section of the html file; - * alternatively, the css rule (above) must be included in the external stylesheet of the - * application. - * - * Legacy browsers, like IE7, do not provide attribute selector support (added in CSS 2.1) so they - * cannot match the `[ng\:cloak]` selector. To work around this limitation, you must add the css - * class `ngCloak` in addition to `ngCloak` directive as shown in the example below. - * - * @element ANY - * - * @example - - -
{{ 'hello' }}
-
{{ 'hello IE7' }}
-
- - it('should remove the template directive and css class', function() { - expect(element('.doc-example-live #template1').attr('ng-cloak')). - not().toBeDefined(); - expect(element('.doc-example-live #template2').attr('ng-cloak')). - not().toBeDefined(); - }); - -
- * - */ -var ngCloakDirective = ngDirective({ - compile: function(element, attr) { - attr.$set('ngCloak', undefined); - element.removeClass('ng-cloak'); - } -}); - -/** - * @ngdoc directive - * @name ng.directive:ngController - * - * @description - * The `ngController` directive assigns behavior to a scope. This is a key aspect of how angular - * supports the principles behind the Model-View-Controller design pattern. - * - * MVC components in angular: - * - * * Model — The Model is data in scope properties; scopes are attached to the DOM. - * * View — The template (HTML with data bindings) is rendered into the View. - * * Controller — The `ngController` directive specifies a Controller class; the class has - * methods that typically express the business logic behind the application. - * - * Note that an alternative way to define controllers is via the `{@link ng.$route}` - * service. - * - * @element ANY - * @scope - * @param {expression} ngController Name of a globally accessible constructor function or an - * {@link guide/expression expression} that on the current scope evaluates to a - * constructor function. - * - * @example - * Here is a simple form for editing users contact information. Adding, removing, clearing, and - * greeting are methods declared on the controller (see source tab). These methods can - * easily be called from the angular markup. Notice that the scope becomes the `this` for the - * controller's instance. This allows for easy access to the view data from the controller. Also - * notice that any changes to the data are automatically reflected in the View without the need - * for a manual update. - - - -
- Name: - [ greet ]
- Contact: -
    -
  • - - - [ clear - | X ] -
  • -
  • [ add ]
  • -
-
-
- - it('should check controller', function() { - expect(element('.doc-example-live div>:input').val()).toBe('John Smith'); - expect(element('.doc-example-live li:nth-child(1) input').val()) - .toBe('408 555 1212'); - expect(element('.doc-example-live li:nth-child(2) input').val()) - .toBe('john.smith@example.org'); - - element('.doc-example-live li:first a:contains("clear")').click(); - expect(element('.doc-example-live li:first input').val()).toBe(''); - - element('.doc-example-live li:last a:contains("add")').click(); - expect(element('.doc-example-live li:nth-child(3) input').val()) - .toBe('yourname@example.org'); - }); - -
- */ -var ngControllerDirective = [function() { - return { - scope: true, - controller: '@' - }; -}]; - -/** - * @ngdoc directive - * @name ng.directive:ngCsp - * @priority 1000 - * - * @description - * Enables [CSP (Content Security Policy)](https://developer.mozilla.org/en/Security/CSP) support. - * This directive should be used on the root element of the application (typically the `` - * element or other element with the {@link ng.directive:ngApp ngApp} - * directive). - * - * If enabled the performance of template expression evaluator will suffer slightly, so don't enable - * this mode unless you need it. - * - * @element html - */ - -var ngCspDirective = ['$sniffer', function($sniffer) { - return { - priority: 1000, - compile: function() { - $sniffer.csp = true; - } - }; -}]; - -/** - * @ngdoc directive - * @name ng.directive:ngClick - * - * @description - * The ngClick allows you to specify custom behavior when - * element is clicked. - * - * @element ANY - * @param {expression} ngClick {@link guide/expression Expression} to evaluate upon - * click. (Event object is available as `$project`) - * - * @example - - - - count: {{count}} - - - it('should check ng-click', function() { - expect(binding('count')).toBe('0'); - element('.doc-example-live :button').click(); - expect(binding('count')).toBe('1'); - }); - - - */ -/* - * A directive that allows creation of custom onclick handlers that are defined as angular - * expressions and are compiled and executed within the current scope. - * - * Events that are handled via these handler are always configured not to propagate further. - */ -var ngEventDirectives = {}; -forEach( - 'click dblclick mousedown mouseup mouseover mouseout mousemove mouseenter mouseleave'.split(' '), - function(name) { - var directiveName = directiveNormalize('ng-' + name); - ngEventDirectives[directiveName] = ['$parse', function($parse) { - return function(scope, element, attr) { - var fn = $parse(attr[directiveName]); - element.bind(lowercase(name), function(event) { - scope.$apply(function() { - fn(scope, {$event:event}); - }); - }); - }; - }]; - } -); - -/** - * @ngdoc directive - * @name ng.directive:ngDblclick - * - * @description - * The `ngDblclick` directive allows you to specify custom behavior on dblclick project. - * - * @element ANY - * @param {expression} ngDblclick {@link guide/expression Expression} to evaluate upon - * dblclick. (Event object is available as `$project`) - * - * @example - * See {@link ng.directive:ngClick ngClick} - */ - - -/** - * @ngdoc directive - * @name ng.directive:ngMousedown - * - * @description - * The ngMousedown directive allows you to specify custom behavior on mousedown project. - * - * @element ANY - * @param {expression} ngMousedown {@link guide/expression Expression} to evaluate upon - * mousedown. (Event object is available as `$project`) - * - * @example - * See {@link ng.directive:ngClick ngClick} - */ - - -/** - * @ngdoc directive - * @name ng.directive:ngMouseup - * - * @description - * Specify custom behavior on mouseup project. - * - * @element ANY - * @param {expression} ngMouseup {@link guide/expression Expression} to evaluate upon - * mouseup. (Event object is available as `$project`) - * - * @example - * See {@link ng.directive:ngClick ngClick} - */ - -/** - * @ngdoc directive - * @name ng.directive:ngMouseover - * - * @description - * Specify custom behavior on mouseover project. - * - * @element ANY - * @param {expression} ngMouseover {@link guide/expression Expression} to evaluate upon - * mouseover. (Event object is available as `$project`) - * - * @example - * See {@link ng.directive:ngClick ngClick} - */ - - -/** - * @ngdoc directive - * @name ng.directive:ngMouseenter - * - * @description - * Specify custom behavior on mouseenter project. - * - * @element ANY - * @param {expression} ngMouseenter {@link guide/expression Expression} to evaluate upon - * mouseenter. (Event object is available as `$project`) - * - * @example - * See {@link ng.directive:ngClick ngClick} - */ - - -/** - * @ngdoc directive - * @name ng.directive:ngMouseleave - * - * @description - * Specify custom behavior on mouseleave project. - * - * @element ANY - * @param {expression} ngMouseleave {@link guide/expression Expression} to evaluate upon - * mouseleave. (Event object is available as `$project`) - * - * @example - * See {@link ng.directive:ngClick ngClick} - */ - - -/** - * @ngdoc directive - * @name ng.directive:ngMousemove - * - * @description - * Specify custom behavior on mousemove project. - * - * @element ANY - * @param {expression} ngMousemove {@link guide/expression Expression} to evaluate upon - * mousemove. (Event object is available as `$project`) - * - * @example - * See {@link ng.directive:ngClick ngClick} - */ - - -/** - * @ngdoc directive - * @name ng.directive:ngSubmit - * - * @description - * Enables binding angular expressions to onsubmit events. - * - * Additionally it prevents the default action (which for form means sending the request to the - * server and reloading the current page). - * - * @element form - * @param {expression} ngSubmit {@link guide/expression Expression} to eval. - * - * @example - - - -
- Enter text and hit enter: - - -
list={{list}}
-
-
- - it('should check ng-submit', function() { - expect(binding('list')).toBe('[]'); - element('.doc-example-live #submit').click(); - expect(binding('list')).toBe('["hello"]'); - expect(input('text').val()).toBe(''); - }); - it('should ignore empty strings', function() { - expect(binding('list')).toBe('[]'); - element('.doc-example-live #submit').click(); - element('.doc-example-live #submit').click(); - expect(binding('list')).toBe('["hello"]'); - }); - -
- */ -var ngSubmitDirective = ngDirective(function(scope, element, attrs) { - element.bind('submit', function() { - scope.$apply(attrs.ngSubmit); - }); -}); - -/** - * @ngdoc directive - * @name ng.directive:ngInclude - * @restrict ECA - * - * @description - * Fetches, compiles and includes an external HTML fragment. - * - * Keep in mind that Same Origin Policy applies to included resources - * (e.g. ngInclude won't work for cross-domain requests on all browsers and for - * file:// access on some browsers). - * - * @scope - * - * @param {string} ngInclude|src angular expression evaluating to URL. If the source is a string constant, - * make sure you wrap it in quotes, e.g. `src="'myPartialTemplate.html'"`. - * @param {string=} onload Expression to evaluate when a new partial is loaded. - * - * @param {string=} autoscroll Whether `ngInclude` should call {@link ng.$anchorScroll - * $anchorScroll} to scroll the viewport after the content is loaded. - * - * - If the attribute is not set, disable scrolling. - * - If the attribute is set without value, enable scrolling. - * - Otherwise enable scrolling only if the expression evaluates to truthy value. - * - * @example - - -
- - url of the template: {{template.url}} -
-
-
-
- - function Ctrl($scope) { - $scope.templates = - [ { name: 'template1.html', url: 'template1.html'} - , { name: 'template2.html', url: 'template2.html'} ]; - $scope.template = $scope.templates[0]; - } - - - Content of template1.html - - - Content of template2.html - - - it('should load template1.html', function() { - expect(element('.doc-example-live [ng-include]').text()). - toMatch(/Content of template1.html/); - }); - it('should load template2.html', function() { - select('template').option('1'); - expect(element('.doc-example-live [ng-include]').text()). - toMatch(/Content of template2.html/); - }); - it('should change to blank', function() { - select('template').option(''); - expect(element('.doc-example-live [ng-include]').text()).toEqual(''); - }); - -
- */ - - -/** - * @ngdoc project - * @name ng.directive:ngInclude#$includeContentLoaded - * @eventOf ng.directive:ngInclude - * @eventType emit on the current ngInclude scope - * @description - * Emitted every time the ngInclude content is reloaded. - */ -var ngIncludeDirective = ['$http', '$templateCache', '$anchorScroll', '$compile', - function($http, $templateCache, $anchorScroll, $compile) { - return { - restrict: 'ECA', - terminal: true, - compile: function(element, attr) { - var srcExp = attr.ngInclude || attr.src, - onloadExp = attr.onload || '', - autoScrollExp = attr.autoscroll; - - return function(scope, element) { - var changeCounter = 0, - childScope; - - var clearContent = function() { - if (childScope) { - childScope.$destroy(); - childScope = null; - } - - element.html(''); - }; - - scope.$watch(srcExp, function ngIncludeWatchAction(src) { - var thisChangeId = ++changeCounter; - - if (src) { - $http.get(src, {cache: $templateCache}).success(function(response) { - if (thisChangeId !== changeCounter) return; - - if (childScope) childScope.$destroy(); - childScope = scope.$new(); - - element.html(response); - $compile(element.contents())(childScope); - - if (isDefined(autoScrollExp) && (!autoScrollExp || scope.$eval(autoScrollExp))) { - $anchorScroll(); - } - - childScope.$emit('$includeContentLoaded'); - scope.$eval(onloadExp); - }).error(function() { - if (thisChangeId === changeCounter) clearContent(); - }); - } else clearContent(); - }); - }; - } - }; -}]; - -/** - * @ngdoc directive - * @name ng.directive:ngInit - * - * @description - * The `ngInit` directive specifies initialization tasks to be executed - * before the template enters execution mode during bootstrap. - * - * @element ANY - * @param {expression} ngInit {@link guide/expression Expression} to eval. - * - * @example - - -
- {{greeting}} {{person}}! -
-
- - it('should check greeting', function() { - expect(binding('greeting')).toBe('Hello'); - expect(binding('person')).toBe('World'); - }); - -
- */ -var ngInitDirective = ngDirective({ - compile: function() { - return { - pre: function(scope, element, attrs) { - scope.$eval(attrs.ngInit); - } - } - } -}); - -/** - * @ngdoc directive - * @name ng.directive:ngNonBindable - * @priority 1000 - * - * @description - * Sometimes it is necessary to write code which looks like bindings but which should be left alone - * by angular. Use `ngNonBindable` to make angular ignore a chunk of HTML. - * - * @element ANY - * - * @example - * In this example there are two location where a simple binding (`{{}}`) is present, but the one - * wrapped in `ngNonBindable` is left alone. - * - * @example - - -
Normal: {{1 + 2}}
-
Ignored: {{1 + 2}}
-
- - it('should check ng-non-bindable', function() { - expect(using('.doc-example-live').binding('1 + 2')).toBe('3'); - expect(using('.doc-example-live').element('div:last').text()). - toMatch(/1 \+ 2/); - }); - -
- */ -var ngNonBindableDirective = ngDirective({ terminal: true, priority: 1000 }); - -/** - * @ngdoc directive - * @name ng.directive:ngPluralize - * @restrict EA - * - * @description - * # Overview - * `ngPluralize` is a directive that displays messages according to en-US localization rules. - * These rules are bundled with angular.js and the rules can be overridden - * (see {@link guide/i18n Angular i18n} dev guide). You configure ngPluralize directive - * by specifying the mappings between - * {@link http://unicode.org/repos/cldr-tmp/trunk/diff/supplemental/language_plural_rules.html - * plural categories} and the strings to be displayed. - * - * # Plural categories and explicit number rules - * There are two - * {@link http://unicode.org/repos/cldr-tmp/trunk/diff/supplemental/language_plural_rules.html - * plural categories} in Angular's default en-US locale: "one" and "other". - * - * While a pural category may match many numbers (for example, in en-US locale, "other" can match - * any number that is not 1), an explicit number rule can only match one number. For example, the - * explicit number rule for "3" matches the number 3. You will see the use of plural categories - * and explicit number rules throughout later parts of this documentation. - * - * # Configuring ngPluralize - * You configure ngPluralize by providing 2 attributes: `count` and `when`. - * You can also provide an optional attribute, `offset`. - * - * The value of the `count` attribute can be either a string or an {@link guide/expression - * Angular expression}; these are evaluated on the current scope for its bound value. - * - * The `when` attribute specifies the mappings between plural categories and the actual - * string to be displayed. The value of the attribute should be a JSON object so that Angular - * can interpret it correctly. - * - * The following example shows how to configure ngPluralize: - * - *
- * 
- * 
- *
- * - * In the example, `"0: Nobody is viewing."` is an explicit number rule. If you did not - * specify this rule, 0 would be matched to the "other" category and "0 people are viewing" - * would be shown instead of "Nobody is viewing". You can specify an explicit number rule for - * other numbers, for example 12, so that instead of showing "12 people are viewing", you can - * show "a dozen people are viewing". - * - * You can use a set of closed braces(`{}`) as a placeholder for the number that you want substituted - * into pluralized strings. In the previous example, Angular will replace `{}` with - * `{{personCount}}`. The closed braces `{}` is a placeholder - * for {{numberExpression}}. - * - * # Configuring ngPluralize with offset - * The `offset` attribute allows further customization of pluralized text, which can result in - * a better users experience. For example, instead of the message "4 people are viewing this document", - * you might display "John, Kate and 2 others are viewing this document". - * The offset attribute allows you to offset a number by any desired value. - * Let's take a look at an example: - * - *
- * 
- * 
- * 
- * - * Notice that we are still using two plural categories(one, other), but we added - * three explicit number rules 0, 1 and 2. - * When one person, perhaps John, views the document, "John is viewing" will be shown. - * When three people view the document, no explicit number rule is found, so - * an offset of 2 is taken off 3, and Angular uses 1 to decide the plural category. - * In this case, plural category 'one' is matched and "John, Marry and one other person are viewing" - * is shown. - * - * Note that when you specify offsets, you must provide explicit number rules for - * numbers from 0 up to and including the offset. If you use an offset of 3, for example, - * you must provide explicit number rules for 0, 1, 2 and 3. You must also provide plural strings for - * plural categories "one" and "other". - * - * @param {string|expression} count The variable to be bounded to. - * @param {string} when The mapping between plural category to its correspoding strings. - * @param {number=} offset Offset to deduct from the total number. - * - * @example - - - -
- Person 1:
- Person 2:
- Number of People:
- - - Without Offset: - -
- - - With Offset(2): - - -
-
- - it('should show correct pluralized string', function() { - expect(element('.doc-example-live ng-pluralize:first').text()). - toBe('1 person is viewing.'); - expect(element('.doc-example-live ng-pluralize:last').text()). - toBe('Igor is viewing.'); - - using('.doc-example-live').input('personCount').enter('0'); - expect(element('.doc-example-live ng-pluralize:first').text()). - toBe('Nobody is viewing.'); - expect(element('.doc-example-live ng-pluralize:last').text()). - toBe('Nobody is viewing.'); - - using('.doc-example-live').input('personCount').enter('2'); - expect(element('.doc-example-live ng-pluralize:first').text()). - toBe('2 people are viewing.'); - expect(element('.doc-example-live ng-pluralize:last').text()). - toBe('Igor and Misko are viewing.'); - - using('.doc-example-live').input('personCount').enter('3'); - expect(element('.doc-example-live ng-pluralize:first').text()). - toBe('3 people are viewing.'); - expect(element('.doc-example-live ng-pluralize:last').text()). - toBe('Igor, Misko and one other person are viewing.'); - - using('.doc-example-live').input('personCount').enter('4'); - expect(element('.doc-example-live ng-pluralize:first').text()). - toBe('4 people are viewing.'); - expect(element('.doc-example-live ng-pluralize:last').text()). - toBe('Igor, Misko and 2 other people are viewing.'); - }); - - it('should show data-binded names', function() { - using('.doc-example-live').input('personCount').enter('4'); - expect(element('.doc-example-live ng-pluralize:last').text()). - toBe('Igor, Misko and 2 other people are viewing.'); - - using('.doc-example-live').input('person1').enter('Di'); - using('.doc-example-live').input('person2').enter('Vojta'); - expect(element('.doc-example-live ng-pluralize:last').text()). - toBe('Di, Vojta and 2 other people are viewing.'); - }); - -
- */ -var ngPluralizeDirective = ['$locale', '$interpolate', function($locale, $interpolate) { - var BRACE = /{}/g; - return { - restrict: 'EA', - link: function(scope, element, attr) { - var numberExp = attr.count, - whenExp = element.attr(attr.$attr.when), // this is because we have {{}} in attrs - offset = attr.offset || 0, - whens = scope.$eval(whenExp), - whensExpFns = {}, - startSymbol = $interpolate.startSymbol(), - endSymbol = $interpolate.endSymbol(); - - forEach(whens, function(expression, key) { - whensExpFns[key] = - $interpolate(expression.replace(BRACE, startSymbol + numberExp + '-' + - offset + endSymbol)); - }); - - scope.$watch(function ngPluralizeWatch() { - var value = parseFloat(scope.$eval(numberExp)); - - if (!isNaN(value)) { - //if explicit number rule such as 1, 2, 3... is defined, just use it. Otherwise, - //check it against pluralization rules in $locale service - if (!whens[value]) value = $locale.pluralCat(value - offset); - return whensExpFns[value](scope, element, true); - } else { - return ''; - } - }, function ngPluralizeWatchAction(newVal) { - element.text(newVal); - }); - } - }; -}]; - -/** - * @ngdoc directive - * @name ng.directive:ngRepeat - * - * @description - * The `ngRepeat` directive instantiates a template once per item from a collection. Each template - * instance gets its own scope, where the given loop variable is set to the current collection item, - * and `$index` is set to the item index or key. - * - * Special properties are exposed on the local scope of each template instance, including: - * - * * `$index` – `{number}` – iterator offset of the repeated element (0..length-1) - * * `$first` – `{boolean}` – true if the repeated element is first in the iterator. - * * `$middle` – `{boolean}` – true if the repeated element is between the first and last in the iterator. - * * `$last` – `{boolean}` – true if the repeated element is last in the iterator. - * - * - * @element ANY - * @scope - * @priority 1000 - * @param {repeat_expression} ngRepeat The expression indicating how to enumerate a collection. Two - * formats are currently supported: - * - * * `variable in expression` – where variable is the users defined loop variable and `expression` - * is a scope expression giving the collection to enumerate. - * - * For example: `track in cd.tracks`. - * - * * `(key, value) in expression` – where `key` and `value` can be any users defined identifiers, - * and `expression` is the scope expression giving the collection to enumerate. - * - * For example: `(name, age) in {'adam':10, 'amalie':12}`. - * - * @example - * This example initializes the scope to a list of names and - * then uses `ngRepeat` to display every person: - - -
- I have {{friends.length}} friends. They are: -
    -
  • - [{{$index + 1}}] {{friend.name}} who is {{friend.age}} years old. -
  • -
-
-
- - it('should check ng-repeat', function() { - var r = using('.doc-example-live').repeater('ul li'); - expect(r.count()).toBe(2); - expect(r.row(0)).toEqual(["1","John","25"]); - expect(r.row(1)).toEqual(["2","Mary","28"]); - }); - -
- */ -var ngRepeatDirective = ngDirective({ - transclude: 'element', - priority: 1000, - terminal: true, - compile: function(element, attr, linker) { - return function(scope, iterStartElement, attr){ - var expression = attr.ngRepeat; - var match = expression.match(/^\s*(.+)\s+in\s+(.*)\s*$/), - lhs, rhs, valueIdent, keyIdent; - if (! match) { - throw Error("Expected ngRepeat in form of '_item_ in _collection_' but got '" + - expression + "'."); - } - lhs = match[1]; - rhs = match[2]; - match = lhs.match(/^(?:([\$\w]+)|\(([\$\w]+)\s*,\s*([\$\w]+)\))$/); - if (!match) { - throw Error("'item' in 'item in collection' should be identifier or (key, value) but got '" + - lhs + "'."); - } - valueIdent = match[3] || match[1]; - keyIdent = match[2]; - - // Store a list of elements from previous run. This is a hash where key is the item from the - // iterator, and the value is an array of objects with following properties. - // - scope: bound scope - // - element: previous element. - // - index: position - // We need an array of these objects since the same object can be returned from the iterator. - // We expect this to be a rare case. - var lastOrder = new HashQueueMap(); - - scope.$watch(function ngRepeatWatch(scope){ - var index, length, - collection = scope.$eval(rhs), - cursor = iterStartElement, // current position of the node - // Same as lastOrder but it has the current state. It will become the - // lastOrder on the next iteration. - nextOrder = new HashQueueMap(), - arrayLength, - childScope, - key, value, // key/value of iteration - array, - last; // last object information {scope, element, index} - - - - if (!isArray(collection)) { - // if object, extract keys, sort them and use to determine order of iteration over obj props - array = []; - for(key in collection) { - if (collection.hasOwnProperty(key) && key.charAt(0) != '$') { - array.push(key); - } - } - array.sort(); - } else { - array = collection || []; - } - - arrayLength = array.length; - - // we are not using forEach for perf reasons (trying to avoid #call) - for (index = 0, length = array.length; index < length; index++) { - key = (collection === array) ? index : array[index]; - value = collection[key]; - - last = lastOrder.shift(value); - - if (last) { - // if we have already seen this object, then we need to reuse the - // associated scope/element - childScope = last.scope; - nextOrder.push(value, last); - - if (index === last.index) { - // do nothing - cursor = last.element; - } else { - // existing item which got moved - last.index = index; - // This may be a noop, if the element is next, but I don't know of a good way to - // figure this out, since it would require extra DOM access, so let's just hope that - // the browsers realizes that it is noop, and treats it as such. - cursor.after(last.element); - cursor = last.element; - } - } else { - // new item which we don't know about - childScope = scope.$new(); - } - - childScope[valueIdent] = value; - if (keyIdent) childScope[keyIdent] = key; - childScope.$index = index; - - childScope.$first = (index === 0); - childScope.$last = (index === (arrayLength - 1)); - childScope.$middle = !(childScope.$first || childScope.$last); - - if (!last) { - linker(childScope, function(clone){ - cursor.after(clone); - last = { - scope: childScope, - element: (cursor = clone), - index: index - }; - nextOrder.push(value, last); - }); - } - } - - //shrink children - for (key in lastOrder) { - if (lastOrder.hasOwnProperty(key)) { - array = lastOrder[key]; - while(array.length) { - value = array.pop(); - value.element.remove(); - value.scope.$destroy(); - } - } - } - - lastOrder = nextOrder; - }); - }; - } -}); - -/** - * @ngdoc directive - * @name ng.directive:ngShow - * - * @description - * The `ngShow` and `ngHide` directives show or hide a portion of the DOM tree (HTML) - * conditionally. - * - * @element ANY - * @param {expression} ngShow If the {@link guide/expression expression} is truthy - * then the element is shown or hidden respectively. - * - * @example - - - Click me:
- Show: I show up when your checkbox is checked.
- Hide: I hide when your checkbox is checked. -
- - it('should check ng-show / ng-hide', function() { - expect(element('.doc-example-live span:first:hidden').count()).toEqual(1); - expect(element('.doc-example-live span:last:visible').count()).toEqual(1); - - input('checked').check(); - - expect(element('.doc-example-live span:first:visible').count()).toEqual(1); - expect(element('.doc-example-live span:last:hidden').count()).toEqual(1); - }); - -
- */ -//TODO(misko): refactor to remove element from the DOM -var ngShowDirective = ngDirective(function(scope, element, attr){ - scope.$watch(attr.ngShow, function ngShowWatchAction(value){ - element.css('display', toBoolean(value) ? '' : 'none'); - }); -}); - - -/** - * @ngdoc directive - * @name ng.directive:ngHide - * - * @description - * The `ngHide` and `ngShow` directives hide or show a portion of the DOM tree (HTML) - * conditionally. - * - * @element ANY - * @param {expression} ngHide If the {@link guide/expression expression} is truthy then - * the element is shown or hidden respectively. - * - * @example - - - Click me:
- Show: I show up when you checkbox is checked?
- Hide: I hide when you checkbox is checked? -
- - it('should check ng-show / ng-hide', function() { - expect(element('.doc-example-live span:first:hidden').count()).toEqual(1); - expect(element('.doc-example-live span:last:visible').count()).toEqual(1); - - input('checked').check(); - - expect(element('.doc-example-live span:first:visible').count()).toEqual(1); - expect(element('.doc-example-live span:last:hidden').count()).toEqual(1); - }); - -
- */ -//TODO(misko): refactor to remove element from the DOM -var ngHideDirective = ngDirective(function(scope, element, attr){ - scope.$watch(attr.ngHide, function ngHideWatchAction(value){ - element.css('display', toBoolean(value) ? 'none' : ''); - }); -}); - -/** - * @ngdoc directive - * @name ng.directive:ngStyle - * - * @description - * The `ngStyle` directive allows you to set CSS style on an HTML element conditionally. - * - * @element ANY - * @param {expression} ngStyle {@link guide/expression Expression} which evals to an - * object whose keys are CSS style names and values are corresponding values for those CSS - * keys. - * - * @example - - - - -
- Sample Text -
myStyle={{myStyle}}
-
- - span { - color: black; - } - - - it('should check ng-style', function() { - expect(element('.doc-example-live span').css('color')).toBe('rgb(0, 0, 0)'); - element('.doc-example-live :button[value=set]').click(); - expect(element('.doc-example-live span').css('color')).toBe('rgb(255, 0, 0)'); - element('.doc-example-live :button[value=clear]').click(); - expect(element('.doc-example-live span').css('color')).toBe('rgb(0, 0, 0)'); - }); - -
- */ -var ngStyleDirective = ngDirective(function(scope, element, attr) { - scope.$watch(attr.ngStyle, function ngStyleWatchAction(newStyles, oldStyles) { - if (oldStyles && (newStyles !== oldStyles)) { - forEach(oldStyles, function(val, style) { element.css(style, '');}); - } - if (newStyles) element.css(newStyles); - }, true); -}); - -/** - * @ngdoc directive - * @name ng.directive:ngSwitch - * @restrict EA - * - * @description - * Conditionally change the DOM structure. - * - * @usageContent - * ... - * ... - * ... - * ... - * - * @scope - * @param {*} ngSwitch|on expression to match against ng-switch-when. - * @paramDescription - * On child elments add: - * - * * `ngSwitchWhen`: the case statement to match against. If match then this - * case will be displayed. - * * `ngSwitchDefault`: the default case when no other casses match. - * - * @example - - - -
- - selection={{selection}} -
-
-
Settings Div
- Home Span - default -
-
-
- - it('should start in settings', function() { - expect(element('.doc-example-live [ng-switch]').text()).toMatch(/Settings Div/); - }); - it('should change to home', function() { - select('selection').option('home'); - expect(element('.doc-example-live [ng-switch]').text()).toMatch(/Home Span/); - }); - it('should select deafault', function() { - select('selection').option('other'); - expect(element('.doc-example-live [ng-switch]').text()).toMatch(/default/); - }); - -
- */ -var NG_SWITCH = 'ng-switch'; -var ngSwitchDirective = valueFn({ - restrict: 'EA', - require: 'ngSwitch', - // asks for $scope to fool the BC controller module - controller: ['$scope', function ngSwitchController() { - this.cases = {}; - }], - link: function(scope, element, attr, ctrl) { - var watchExpr = attr.ngSwitch || attr.on, - selectedTransclude, - selectedElement, - selectedScope; - - scope.$watch(watchExpr, function ngSwitchWatchAction(value) { - if (selectedElement) { - selectedScope.$destroy(); - selectedElement.remove(); - selectedElement = selectedScope = null; - } - if ((selectedTransclude = ctrl.cases['!' + value] || ctrl.cases['?'])) { - scope.$eval(attr.change); - selectedScope = scope.$new(); - selectedTransclude(selectedScope, function(caseElement) { - selectedElement = caseElement; - element.append(caseElement); - }); - } - }); - } -}); - -var ngSwitchWhenDirective = ngDirective({ - transclude: 'element', - priority: 500, - require: '^ngSwitch', - compile: function(element, attrs, transclude) { - return function(scope, element, attr, ctrl) { - ctrl.cases['!' + attrs.ngSwitchWhen] = transclude; - }; - } -}); - -var ngSwitchDefaultDirective = ngDirective({ - transclude: 'element', - priority: 500, - require: '^ngSwitch', - compile: function(element, attrs, transclude) { - return function(scope, element, attr, ctrl) { - ctrl.cases['?'] = transclude; - }; - } -}); - -/** - * @ngdoc directive - * @name ng.directive:ngTransclude - * - * @description - * Insert the transcluded DOM here. - * - * @element ANY - * - * @example - - - -
-
-
- {{text}} -
-
- - it('should have transcluded', function() { - input('title').enter('TITLE'); - input('text').enter('TEXT'); - expect(binding('title')).toEqual('TITLE'); - expect(binding('text')).toEqual('TEXT'); - }); - -
- * - */ -var ngTranscludeDirective = ngDirective({ - controller: ['$transclude', '$element', function($transclude, $element) { - $transclude(function(clone) { - $element.append(clone); - }); - }] -}); - -/** - * @ngdoc directive - * @name ng.directive:ngView - * @restrict ECA - * - * @description - * # Overview - * `ngView` is a directive that complements the {@link ng.$route $route} service by - * including the rendered template of the current route into the main layout (`index.html`) file. - * Every time the current route changes, the included view changes with it according to the - * configuration of the `$route` service. - * - * @scope - * @example - - -
- Choose: - Moby | - Moby: Ch1 | - Gatsby | - Gatsby: Ch4 | - Scarlet Letter
- -
-
- -
$location.path() = {{$location.path()}}
-
$route.current.templateUrl = {{$route.current.templateUrl}}
-
$route.current.params = {{$route.current.params}}
-
$route.current.scope.name = {{$route.current.scope.name}}
-
$routeParams = {{$routeParams}}
-
-
- - - controller: {{name}}
- Book Id: {{params.bookId}}
-
- - - controller: {{name}}
- Book Id: {{params.bookId}}
- Chapter Id: {{params.chapterId}} -
- - - angular.module('ngView', [], function($routeProvider, $locationProvider) { - $routeProvider.when('/Book/:bookId', { - templateUrl: 'book.html', - controller: BookCntl - }); - $routeProvider.when('/Book/:bookId/ch/:chapterId', { - templateUrl: 'chapter.html', - controller: ChapterCntl - }); - - // configure html5 to get links working on jsfiddle - $locationProvider.html5Mode(true); - }); - - function MainCntl($scope, $route, $routeParams, $location) { - $scope.$route = $route; - $scope.$location = $location; - $scope.$routeParams = $routeParams; - } - - function BookCntl($scope, $routeParams) { - $scope.name = "BookCntl"; - $scope.params = $routeParams; - } - - function ChapterCntl($scope, $routeParams) { - $scope.name = "ChapterCntl"; - $scope.params = $routeParams; - } - - - - it('should load and compile correct template', function() { - element('a:contains("Moby: Ch1")').click(); - var content = element('.doc-example-live [ng-view]').text(); - expect(content).toMatch(/controller\: ChapterCntl/); - expect(content).toMatch(/Book Id\: Moby/); - expect(content).toMatch(/Chapter Id\: 1/); - - element('a:contains("Scarlet")').click(); - content = element('.doc-example-live [ng-view]').text(); - expect(content).toMatch(/controller\: BookCntl/); - expect(content).toMatch(/Book Id\: Scarlet/); - }); - -
- */ - - -/** - * @ngdoc project - * @name ng.directive:ngView#$viewContentLoaded - * @eventOf ng.directive:ngView - * @eventType emit on the current ngView scope - * @description - * Emitted every time the ngView content is reloaded. - */ -var ngViewDirective = ['$http', '$templateCache', '$route', '$anchorScroll', '$compile', - '$controller', - function($http, $templateCache, $route, $anchorScroll, $compile, - $controller) { - return { - restrict: 'ECA', - terminal: true, - link: function(scope, element, attr) { - var lastScope, - onloadExp = attr.onload || ''; - - scope.$on('$routeChangeSuccess', update); - update(); - - - function destroyLastScope() { - if (lastScope) { - lastScope.$destroy(); - lastScope = null; - } - } - - function clearContent() { - element.html(''); - destroyLastScope(); - } - - function update() { - var locals = $route.current && $route.current.locals, - template = locals && locals.$template; - - if (template) { - element.html(template); - destroyLastScope(); - - var link = $compile(element.contents()), - current = $route.current, - controller; - - lastScope = current.scope = scope.$new(); - if (current.controller) { - locals.$scope = lastScope; - controller = $controller(current.controller, locals); - element.children().data('$ngControllerController', controller); - } - - link(lastScope); - lastScope.$emit('$viewContentLoaded'); - lastScope.$eval(onloadExp); - - // $anchorScroll might listen on project... - $anchorScroll(); - } else { - clearContent(); - } - } - } - }; -}]; - -/** - * @ngdoc directive - * @name ng.directive:script - * - * @description - * Load content of a script tag, with type `text/ng-template`, into `$templateCache`, so that the - * template can be used by `ngInclude`, `ngView` or directive templates. - * - * @restrict E - * @param {'text/ng-template'} type must be set to `'text/ng-template'` - * - * @example - - - - - Load inlined template -
-
- - it('should load template defined inside script tag', function() { - element('#tpl-link').click(); - expect(element('#tpl-content').text()).toMatch(/Content of the template/); - }); - -
- */ -var scriptDirective = ['$templateCache', function($templateCache) { - return { - restrict: 'E', - terminal: true, - compile: function(element, attr) { - if (attr.type == 'text/ng-template') { - var templateUrl = attr.id, - // IE is not consistent, in scripts we have to read .text but in other nodes we have to read .textContent - text = element[0].text; - - $templateCache.put(templateUrl, text); - } - } - }; -}]; - -/** - * @ngdoc directive - * @name ng.directive:select - * @restrict E - * - * @description - * HTML `SELECT` element with angular data-binding. - * - * # `ngOptions` - * - * Optionally `ngOptions` attribute can be used to dynamically generate a list of `