\ No newline at end of file
diff --git a/OurUmbraco.Site/umbraco/Views/propertyeditors/test/test.html b/OurUmbraco.Site/umbraco/Views/propertyeditors/test/test.html
index 19b09721..113aeae3 100644
--- a/OurUmbraco.Site/umbraco/Views/propertyeditors/test/test.html
+++ b/OurUmbraco.Site/umbraco/Views/propertyeditors/test/test.html
@@ -1,18 +1,18 @@
-
-
-
- {{item[0].value}}...
-
-
-
-
-
- Save
-
-
-
Add new Show json
-
-
- json: {{model.value|json}}
-
+
+
+
+ {{item[0].value}}...
+
+
+
+
+
+ Save
+
+
+
Add new Show json
+
+
+ json: {{model.value|json}}
+
\ No newline at end of file
diff --git a/OurUmbraco.Site/umbraco/Views/propertyeditors/textarea/textarea.html b/OurUmbraco.Site/umbraco/Views/propertyeditors/textarea/textarea.html
index d0896ae8..0d1fae3f 100644
--- a/OurUmbraco.Site/umbraco/Views/propertyeditors/textarea/textarea.html
+++ b/OurUmbraco.Site/umbraco/Views/propertyeditors/textarea/textarea.html
@@ -1,3 +1,3 @@
-
-
Required
+
+
Required
\ No newline at end of file
diff --git a/OurUmbraco.Site/umbraco/Views/propertyeditors/textbox/textbox.html b/OurUmbraco.Site/umbraco/Views/propertyeditors/textbox/textbox.html
index defe4aee..c55fc350 100644
--- a/OurUmbraco.Site/umbraco/Views/propertyeditors/textbox/textbox.html
+++ b/OurUmbraco.Site/umbraco/Views/propertyeditors/textbox/textbox.html
@@ -1,9 +1,9 @@
-
-
-
- Required
-
+
+
+
+ Required
+
diff --git a/OurUmbraco.Site/umbraco/Views/propertyeditors/urllist/urllist.html b/OurUmbraco.Site/umbraco/Views/propertyeditors/urllist/urllist.html
index 864ad213..f154a2a7 100644
--- a/OurUmbraco.Site/umbraco/Views/propertyeditors/urllist/urllist.html
+++ b/OurUmbraco.Site/umbraco/Views/propertyeditors/urllist/urllist.html
@@ -1,11 +1,11 @@
-
-
+
\ No newline at end of file
diff --git a/OurUmbraco.Site/umbraco/Views/propertyeditors/validationtest/validationtest.html b/OurUmbraco.Site/umbraco/Views/propertyeditors/validationtest/validationtest.html
index 4716a639..b1145647 100644
--- a/OurUmbraco.Site/umbraco/Views/propertyeditors/validationtest/validationtest.html
+++ b/OurUmbraco.Site/umbraco/Views/propertyeditors/validationtest/validationtest.html
@@ -1,12 +1,12 @@
-
-
Enter a numeric value
-
-
-
-
Required!
-
The value entered is not a number
-
A server error occurred
-
+
+
Enter a numeric value
+
+
+
+
Required!
+
The value entered is not a number
+
A server error occurred
+
diff --git a/OurUmbraco.Site/umbraco/assets/css/umbraco.css b/OurUmbraco.Site/umbraco/assets/css/umbraco.css
index fa4a0815..629829c7 100644
--- a/OurUmbraco.Site/umbraco/assets/css/umbraco.css
+++ b/OurUmbraco.Site/umbraco/assets/css/umbraco.css
@@ -1 +1 @@
-@font-face{font-family:'Open Sans';font-style:normal;font-weight:400;src:url('../fonts/opensans/OpenSans-Regular-webfont.eot');src:local('Open Sans'),local('OpenSans'),url('../fonts/opensans/OpenSans-Regular-webfont.eot?#iefix') format('embedded-opentype'),url('../fonts/opensans/OpenSans-Regular-webfont.ttf') format('truetype'),url('../fonts/opensans/OpenSans-Regular-webfont.svg#open_sansregular') format('svg')}@font-face{font-family:'Open Sans';font-style:normal;font-weight:600;src:url('../fonts/opensans/OpenSans-Semibold-webfont.eot');src:local('Open Sans Semibold'),local('OpenSans-Semibold'),url('../fonts/opensans/OpenSans-Semibold-webfont.eot?#iefix') format('embedded-opentype'),url('../fonts/opensans/OpenSans-Semibold-webfont.ttf') format('truetype'),url('../fonts/opensans/OpenSans-Semibold-webfont.svg#open_sanssemibold') format('svg')}.red{color:#9d261d}.blue{color:#2e8aea}.color-red,.color-red i{color:#d90416!important}.color-blue,.color-blue i{color:#04bfbf!important}.color-orange,.color-orange i{color:#d9631e!important}.color-green,.color-green i{color:#04bf67!important}.color-yellow,.color-yellow i{color:#f28729!important}.clearfix{*zoom:1}.clearfix:before,.clearfix:after{display:table;line-height:0;content:""}.clearfix:after{clear:both}.hide-text{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.input-block-level{display:block;width:100%;min-height:30px;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"]{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:"Open Sans","Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:20px;color:#343434;background-color:#fff}a{color:#000;text-decoration:none}a:hover,a:focus{color:#000;text-decoration:underline}.img-rounded{border-radius:6px}.img-polaroid{padding:4px;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);box-shadow:0 1px 3px rgba(0,0,0,0.1)}.img-circle{border-radius:500px}.row{margin-left:0;*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:0}.container,.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:720px}.span12{width:720px}.span11{width:660px}.span10{width:600px}.span9{width:540px}.span8{width:480px}.span7{width:420px}.span6{width:360px}.span5{width:300px}.span4{width:240px}.span3{width:180px}.span2{width:120px}.span1{width:60px}.offset12{margin-left:720px}.offset11{margin-left:660px}.offset10{margin-left:600px}.offset9{margin-left:540px}.offset8{margin-left:480px}.offset7{margin-left:420px}.offset6{margin-left:360px}.offset5{margin-left:300px}.offset4{margin-left:240px}.offset3{margin-left:180px}.offset2{margin-left:120px}.offset1{margin-left:60px}.row-fluid{width:100%;*zoom:1}.row-fluid:before,.row-fluid:after{display:table;line-height:0;content:""}.row-fluid:after{clear:both}.row-fluid [class*="span"]{display:block;float:left;width:100%;min-height:30px;margin-left:0;*margin-left:-0.06944444444444445%;box-sizing:border-box}.row-fluid [class*="span"]:first-child{margin-left:0}.row-fluid .controls-row [class*="span"]+[class*="span"]{margin-left:0}.row-fluid .span12{width:99.99999999999999%;*width:99.93055555555554%}.row-fluid .span11{width:91.66666666666666%;*width:91.59722222222221%}.row-fluid .span10{width:83.33333333333331%;*width:83.26388888888887%}.row-fluid .span9{width:74.99999999999999%;*width:74.93055555555554%}.row-fluid .span8{width:66.66666666666666%;*width:66.59722222222221%}.row-fluid .span7{width:58.33333333333333%;*width:58.263888888888886%}.row-fluid .span6{width:49.99999999999999%;*width:49.93055555555555%}.row-fluid .span5{width:41.66666666666666%;*width:41.597222222222214%}.row-fluid .span4{width:33.33333333333333%;*width:33.263888888888886%}.row-fluid .span3{width:24.999999999999996%;*width:24.930555555555554%}.row-fluid .span2{width:16.666666666666664%;*width:16.59722222222222%}.row-fluid .span1{width:8.333333333333332%;*width:8.263888888888888%}.row-fluid .offset12{margin-left:99.99999999999999%;*margin-left:99.8611111111111%}.row-fluid .offset12:first-child{margin-left:99.99999999999999%;*margin-left:99.8611111111111%}.row-fluid .offset11{margin-left:91.66666666666666%;*margin-left:91.52777777777777%}.row-fluid .offset11:first-child{margin-left:91.66666666666666%;*margin-left:91.52777777777777%}.row-fluid .offset10{margin-left:83.33333333333331%;*margin-left:83.19444444444443%}.row-fluid .offset10:first-child{margin-left:83.33333333333331%;*margin-left:83.19444444444443%}.row-fluid .offset9{margin-left:74.99999999999999%;*margin-left:74.8611111111111%}.row-fluid .offset9:first-child{margin-left:74.99999999999999%;*margin-left:74.8611111111111%}.row-fluid .offset8{margin-left:66.66666666666666%;*margin-left:66.52777777777777%}.row-fluid .offset8:first-child{margin-left:66.66666666666666%;*margin-left:66.52777777777777%}.row-fluid .offset7{margin-left:58.33333333333333%;*margin-left:58.19444444444444%}.row-fluid .offset7:first-child{margin-left:58.33333333333333%;*margin-left:58.19444444444444%}.row-fluid .offset6{margin-left:49.99999999999999%;*margin-left:49.86111111111111%}.row-fluid .offset6:first-child{margin-left:49.99999999999999%;*margin-left:49.86111111111111%}.row-fluid .offset5{margin-left:41.66666666666666%;*margin-left:41.52777777777777%}.row-fluid .offset5:first-child{margin-left:41.66666666666666%;*margin-left:41.52777777777777%}.row-fluid .offset4{margin-left:33.33333333333333%;*margin-left:33.19444444444444%}.row-fluid .offset4:first-child{margin-left:33.33333333333333%;*margin-left:33.19444444444444%}.row-fluid .offset3{margin-left:24.999999999999996%;*margin-left:24.86111111111111%}.row-fluid .offset3:first-child{margin-left:24.999999999999996%;*margin-left:24.86111111111111%}.row-fluid .offset2{margin-left:16.666666666666664%;*margin-left:16.52777777777778%}.row-fluid .offset2:first-child{margin-left:16.666666666666664%;*margin-left:16.52777777777778%}.row-fluid .offset1{margin-left:8.333333333333332%;*margin-left:8.194444444444443%}.row-fluid .offset1:first-child{margin-left:8.333333333333332%;*margin-left:8.194444444444443%}[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:0;padding-left:0;*zoom:1}.container-fluid:before,.container-fluid:after{display:table;line-height:0;content:""}.container-fluid:after{clear:both}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:21px;font-weight:200;line-height:30px}small{font-size:85%}strong{font-weight:bold}em{font-style:italic}cite{font-style:normal}.muted{color:#d9d9d9}a.muted:hover,a.muted:focus{color:#c0c0c0}.text-warning{color:#fff}a.text-warning:hover,a.text-warning:focus{color:#e6e6e6}.text-error{color:#fff}a.text-error:hover,a.text-error:focus{color:#e6e6e6}.text-info{color:#fff}a.text-info:hover,a.text-info:focus{color:#e6e6e6}.text-success{color:#fff}a.text-success:hover,a.text-success:focus{color:#e6e6e6}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}h1,h2,h3,h4,h5,h6{margin:10px 0;font-family:inherit;font-weight:500;line-height:20px;color:inherit;text-rendering:optimizelegibility}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{font-weight:normal;line-height:1;color:#d9d9d9}h1,h2,h3{line-height:40px}h1{font-size:38.5px}h2{font-size:31.5px}h3{font-size:24.5px}h4{font-size:17.5px}h5{font-size:14px}h6{font-size:11.9px}h1 small{font-size:24.5px}h2 small{font-size:17.5px}h3 small{font-size:14px}h4 small{font-size:14px}.page-header{padding-bottom:9px;margin:20px 0 30px;border-bottom:1px solid #f8f8f8}ul,ol{padding:0;margin:0 0 10px 25px}ul ul,ul ol,ol ol,ol ul{margin-bottom:0}li{line-height:20px}ul.unstyled,ol.unstyled{margin-left:0;list-style:none}ul.inline,ol.inline{margin-left:0;list-style:none}ul.inline>li,ol.inline>li{display:inline-block;*display:inline;padding-right:5px;padding-left:5px;*zoom:1}dl{margin-bottom:20px}dt,dd{line-height:20px}dt{font-weight:bold}dd{margin-left:10px}.dl-horizontal{*zoom:1}.dl-horizontal:before,.dl-horizontal:after{display:table;line-height:0;content:""}.dl-horizontal:after{clear:both}.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}hr{margin:20px 0;border:0;border-top:1px solid #f8f8f8;border-bottom:1px solid #fff}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #d9d9d9}abbr.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:0 0 0 15px;margin:0 0 20px;border-left:5px solid #f8f8f8}blockquote p{margin-bottom:0;font-size:17.5px;font-weight:300;line-height:1.25}blockquote small{display:block;line-height:20px;color:#d9d9d9}blockquote small:before{content:'\2014 \00A0'}blockquote.pull-right{float:right;padding-right:15px;padding-left:0;border-right:5px solid #f8f8f8;border-left:0}blockquote.pull-right p,blockquote.pull-right small{text-align:right}blockquote.pull-right small:before{content:''}blockquote.pull-right small:after{content:'\00A0 \2014'}q:before,q:after,blockquote:before,blockquote:after{content:""}address{display:block;margin-bottom:20px;font-style:normal;line-height:20px}code,pre.code{padding:0 3px 2px;font-family:Monaco,Menlo,Consolas,"Courier New",monospace;font-size:12px;color:#343434;border-radius:3px}code{padding:2px 4px;color:#d14;white-space:nowrap;background-color:#f7f7f9;border:1px solid #e1e1e8}pre.code{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:20px;word-break:break-all;word-wrap:break-word;white-space:pre;white-space:pre-wrap;background-color:#f5f5f5;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.15);border-radius:0}pre.code.prettyprint{margin-bottom:20px}pre.code 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}table{max-width:100%;background-color:transparent;border-collapse:collapse;border-spacing:0}.table{width:100%;margin-bottom:20px}.table th,.table td{padding:8px;line-height:20px;text-align:left;vertical-align:top;border-top:1px solid #dbdbdb}.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 #dbdbdb}.table .table{background-color:#fff}.table-condensed th,.table-condensed td{padding:4px 5px}.table-bordered{border:1px solid #dbdbdb;border-collapse:separate;*border-collapse:collapse;border-left:0;border-radius:0}.table-bordered th,.table-bordered td{border-left:1px solid #dbdbdb}.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{border-top-left-radius:0;-moz-border-radius-topleft:0}.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{border-top-right-radius:0;-moz-border-radius-topright:0}.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{border-bottom-left-radius:0;-moz-border-radius-bottomleft:0}.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{border-bottom-right-radius:0;-moz-border-radius-bottomright:0}.table-bordered tfoot+tbody:last-child tr:last-child td:first-child{border-bottom-left-radius:0;-moz-border-radius-bottomleft:0}.table-bordered tfoot+tbody:last-child tr:last-child td:last-child{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{border-top-left-radius:0;-moz-border-radius-topleft:0}.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{border-top-right-radius:0;-moz-border-radius-topright:0}.table-striped tbody>tr:nth-child(odd)>td,.table-striped tbody>tr:nth-child(odd)>th{background-color:#f9f9f9}.table-hover tbody tr:hover>td,.table-hover tbody tr:hover>th{background-color:#f5f5f5}table td[class*="span"],table th[class*="span"],.row-fluid table td[class*="span"],.row-fluid table th[class*="span"]{display:table-cell;float:none;margin-left:0}.table td.span1,.table th.span1{float:none;width:44px;margin-left:0}.table td.span2,.table th.span2{float:none;width:104px;margin-left:0}.table td.span3,.table th.span3{float:none;width:164px;margin-left:0}.table td.span4,.table th.span4{float:none;width:224px;margin-left:0}.table td.span5,.table th.span5{float:none;width:284px;margin-left:0}.table td.span6,.table th.span6{float:none;width:344px;margin-left:0}.table td.span7,.table th.span7{float:none;width:404px;margin-left:0}.table td.span8,.table th.span8{float:none;width:464px;margin-left:0}.table td.span9,.table th.span9{float:none;width:524px;margin-left:0}.table td.span10,.table th.span10{float:none;width:584px;margin-left:0}.table td.span11,.table th.span11{float:none;width:644px;margin-left:0}.table td.span12,.table th.span12{float:none;width:704px;margin-left:0}.table tbody tr.success>td{background-color:#46a546}.table tbody tr.error>td{background-color:#9d261d}.table tbody tr.warning>td{background-color:#df7f48}.table tbody tr.info>td{background-color:#2e8aea}.table-hover tbody tr.success:hover>td{background-color:#3e933e}.table-hover tbody tr.error:hover>td{background-color:#872119}.table-hover tbody tr.warning:hover>td{background-color:#db7032}.table-hover tbody tr.info:hover>td{background-color:#177de7}.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:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);*border-right-width:2px;*border-bottom-width:2px;border-radius:6px;box-shadow:0 5px 10px rgba(0,0,0,0.2);background-clip:padding-box}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{*width:100%;height:1px;margin:9px 1px;*margin:-5px 0 5px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #fff}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:normal;line-height:20px;color:#343434;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:#000;background-image:linear-gradient(to bottom,#000,#000);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff000000',endColorstr='#ff000000',GradientType=0)}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#fff;text-decoration:none;background-color:#000;background-image:linear-gradient(to bottom,#000,#000);background-repeat:repeat-x;outline:0;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff000000',endColorstr='#ff000000',GradientType=0)}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{color:#d9d9d9}.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;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;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:#ccc;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;border-radius:6px 0 6px 6px}.dropdown .dropdown-menu .nav-header{padding-right:20px;padding-left:20px}.typeahead{z-index:1051;margin-top:2px;border-radius:0}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:0;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;border-radius:0}.well-small{padding:9px;border-radius:0}.fade{opacity:0;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{position:relative;height:0;overflow:hidden;transition:height .35s ease}.collapse.in{height:auto}.close{float:right;font-size:20px;font-weight:bold;line-height:20px;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-group{position:relative;display:inline-block;*display:inline;*margin-left:.3em;font-size:0;white-space:nowrap;vertical-align:middle;*zoom:1}.btn-group:first-child{*margin-left:0}.btn-group+.btn-group{margin-left:5px}.btn-toolbar{margin-top:10px;margin-bottom:10px;font-size:0}.btn-toolbar>.btn+.btn,.btn-toolbar>.btn-group+.btn,.btn-toolbar>.btn+.btn-group{margin-left:5px}.btn-group>.btn{position:relative;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;border-bottom-left-radius:0;border-top-left-radius:0;-moz-border-radius-bottomleft:0;-moz-border-radius-topleft:0}.btn-group>.btn:last-child,.btn-group>.dropdown-toggle{border-top-right-radius:0;border-bottom-right-radius:0;-moz-border-radius-topright:0;-moz-border-radius-bottomright:0}.btn-group>.btn.large:first-child{margin-left:0;border-bottom-left-radius:0;border-top-left-radius:0;-moz-border-radius-bottomleft:0;-moz-border-radius-topleft:0}.btn-group>.btn.large:last-child,.btn-group>.large.dropdown-toggle{border-top-right-radius:0;border-bottom-right-radius:0;-moz-border-radius-topright:0;-moz-border-radius-bottomright:0}.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;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;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:#e4e4e4}.btn-group.open .btn-primary.dropdown-toggle{background-color:#53a93f}.btn-group.open .btn-warning.dropdown-toggle{background-color:#df7f48}.btn-group.open .btn-danger.dropdown-toggle{background-color:#ee5f5b}.btn-group.open .btn-success.dropdown-toggle{background-color:#53a93f}.btn-group.open .btn-info.dropdown-toggle{background-color:#2f96b4}.btn-group.open .btn-inverse.dropdown-toggle{background-color:#222}.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%;border-radius:0}.btn-group-vertical>.btn+.btn{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:first-child{border-radius:0}.btn-group-vertical>.btn:last-child{border-radius:0}.btn-group-vertical>.btn-large:first-child{border-radius:0}.btn-group-vertical>.btn-large:last-child{border-radius:0}.alert{padding:8px 35px 8px 14px;margin-bottom:20px;background-color:#df7f48;border:1px solid transparent;border-radius:0}.alert,.alert h4,.alert a{color:#fff}.alert h4{margin:0}.alert .close{position:relative;top:-2px;right:-21px;line-height:20px}.close.-align-right{right:0}.alert-success{color:#fff;background-color:#46a546;border-color:transparent}.alert-success h4{color:#fff}.alert-danger,.alert-error{color:#fff;background-color:#9d261d;border-color:transparent}.alert-danger h4,.alert-error h4{color:#fff}.alert-info{color:#fff;background-color:#2e8aea;border-color:transparent}.alert-info h4{color:#fff}.alert-form{color:#555;background-color:#ececec;border:1px solid #555!important}.alert-form.-no-border{border:none!important}.alert-form h4{color:#555}.alert-block{padding-top:14px;padding-bottom:14px}.alert-block>p,.alert-block>ul{margin-bottom:0}.alert-block p+p{margin-top:5px}.list-icons li{max-width:300px;padding-left:35px}.list-icons li>i.icon{padding-right:7px;margin-left:-25px}.icon.handle{color:#d9d9d9}.nav{margin-bottom:20px;margin-left:0;list-style:none}.nav>li>a{display:block}.nav>li>a:hover,.nav>li>a:focus{text-decoration:none;background-color:#f8f8f8}.nav>li>a>img{max-width:none}.nav>.pull-right{float:right}.nav-header{display:block;padding:3px 15px;font-size:11px;font-weight:bold;line-height:20px;color:#d9d9d9;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:#000}.nav-list [class^="icon-"],.nav-list [class*=" icon-"]{margin-right:2px}.nav-list .divider{*width:100%;height:1px;margin:9px 1px;*margin:-5px 0 5px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #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:8px;padding-left:8px;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:5px;padding-bottom:4px;line-height:20px;color:#555;border:1px solid transparent}.nav-tabs>li>a:hover{color:#000}.nav-tabs>li>a:hover,.nav-tabs>li>a:focus{border-color:#f8f8f8 #f8f8f8 #ddd}.nav-tabs>.active>a,.nav-tabs>.active>a:hover,.nav-tabs>.active>a:focus{color:#000;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.show-validation .tab-error a,.show-validation .tab-error a:hover,.show-validation .tab-error a:focus{color:#fff!important;background-color:#9d261d!important;border-color:transparent}.show-validation .tab-error a:before{margin-right:5px;font-family:'icomoon';vertical-align:top;content:"\e25d"}.umb-nav-tabs{margin:-8px 0 0 0}.nav-pills>li>a{padding-top:8px;padding-bottom:8px;margin-top:2px;margin-bottom:2px;border-radius:5px}.nav-pills>.active>a,.nav-pills>.active>a:hover,.nav-pills>.active>a:focus{color:#fff;background-color:#000}.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;border-radius:0}.nav-tabs.nav-stacked>li:first-child>a{border-top-right-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{border-bottom-right-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}.dropdown-menu{border-radius:0}.dropdown-menu>li>a{padding:8px 20px}.nav-tabs .dropdown-menu{border-radius:0 0 6px 6px}.nav-pills .dropdown-menu{border-radius:6px}.nav .dropdown-toggle .caret{margin-top:6px;border-top-color:#000;border-bottom-color:#000}.nav .dropdown-toggle:hover .caret,.nav .dropdown-toggle:focus .caret{border-top-color:#000;border-bottom-color:#000}.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:#555;border-bottom-color:#555}.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{background-color:#d9d9d9;border-color:#d9d9d9}.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:#d9d9d9}.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{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;border-radius:4px 0 0 4px}.tabs-left>.nav-tabs>li>a:hover,.tabs-left>.nav-tabs>li>a:focus{border-color:#f8f8f8 #ddd #f8f8f8 #f8f8f8}.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;border-radius:0 4px 4px 0}.tabs-right>.nav-tabs>li>a:hover,.tabs-right>.nav-tabs>li>a:focus{border-color:#f8f8f8 #f8f8f8 #f8f8f8 #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:#d9d9d9}.nav>.disabled>a:hover,.nav>.disabled>a:focus{text-decoration:none;cursor:default;background-color:transparent}.navbar{*position:relative;*z-index:2;margin-bottom:20px;overflow:visible}.navbar-inner{min-height:40px;padding-right:20px;padding-left:20px;background-color:#fafafa;background-image:linear-gradient(to bottom,#fff,#f2f2f2);background-repeat:repeat-x;border:1px solid #d4d4d4;border-radius:0;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff',endColorstr='#fff2f2f2',GradientType=0);*zoom:1;box-shadow:0 1px 4px rgba(0,0,0,0.065)}.navbar-inner:before,.navbar-inner:after{display:table;line-height:0;content:""}.navbar-inner:after{clear:both}.navbar .container{width:auto}.nav-collapse.collapse{height:auto;overflow:visible}.navbar .brand{display:block;float:left;padding:10px 20px 10px;margin-left:-20px;font-size:20px;font-weight:200;color:#777;text-shadow:0 1px 0 #fff}.navbar .brand:hover,.navbar .brand:focus{text-decoration:none}.navbar-text{margin-bottom:0;line-height:40px;color:#777}.navbar-link{color:#777}.navbar-link:hover,.navbar-link:focus{color:#343434}.navbar .divider-vertical{height:40px;margin:0 9px;border-right:1px solid #fff;border-left:1px solid #f2f2f2}.navbar .btn,.navbar .btn-group{margin-top:5px}.navbar .btn-group .btn,.navbar .input-prepend .btn,.navbar .input-append .btn,.navbar .input-prepend .btn-group,.navbar .input-append .btn-group{margin-top:0}.navbar-form{margin-bottom:0;*zoom:1}.navbar-form:before,.navbar-form:after{display:table;line-height:0;content:""}.navbar-form:after{clear:both}.navbar-form input,.navbar-form select,.navbar-form .radio,.navbar-form .checkbox{margin-top:5px}.navbar-form input,.navbar-form select,.navbar-form .btn{display:inline-block;margin-bottom:0}.navbar-form input[type="image"],.navbar-form input[type="checkbox"],.navbar-form input[type="radio"]{margin-top:3px}.navbar-form .input-append,.navbar-form .input-prepend{margin-top:5px;white-space:nowrap}.navbar-form .input-append input,.navbar-form .input-prepend input{margin-top:0}.navbar-search{position:relative;float:left;margin-top:5px;margin-bottom:0}.navbar-search .search-query{padding:4px 14px;margin-bottom:0;font-family:"Open Sans","Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;font-weight:normal;line-height:1;border-radius:15px}.navbar-static-top{position:static;margin-bottom:0}.navbar-static-top .navbar-inner{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;border-radius:0}.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:720px}.navbar-fixed-top{top:0}.navbar-fixed-top .navbar-inner,.navbar-static-top .navbar-inner{box-shadow:0 1px 10px rgba(0,0,0,0.1)}.navbar-fixed-bottom{bottom:0}.navbar-fixed-bottom .navbar-inner{box-shadow:0 -1px 10px rgba(0,0,0,0.1)}.navbar .nav{position:relative;left:0;display:block;float:left;margin:0 10px 0 0}.navbar .nav.pull-right{float:right;margin-right:0}.navbar .nav>li{float:left}.navbar .nav>li>a{float:none;padding:10px 15px 10px;color:#777;text-decoration:none;text-shadow:0 1px 0 #fff}.navbar .nav .dropdown-toggle .caret{margin-top:8px}.navbar .nav>li>a:focus,.navbar .nav>li>a:hover{color:#343434;text-decoration:none;background-color:transparent}.navbar .nav>.active>a,.navbar .nav>.active>a:hover,.navbar .nav>.active>a:focus{color:#555;text-decoration:none;background-color:#e5e5e5;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:#ededed;*background-color:#e5e5e5;background-image:linear-gradient(to bottom,#f2f2f2,#e5e5e5);background-repeat:repeat-x;border-color:#e5e5e5 #e5e5e5 #bfbfbf;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2f2f2',endColorstr='#ffe5e5e5',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);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{background-color:#ededed}.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:#d9d9d9}.navbar .btn-navbar:active,.navbar .btn-navbar.active{background-color:#ccc \9}.navbar .btn-navbar .icon-bar{display:block;width:18px;height:2px;background-color:#f5f5f5;border-radius:1px;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 #fff;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 #fff;border-bottom:0}.navbar .nav li.dropdown>a:hover .caret,.navbar .nav li.dropdown>a:focus .caret{border-top-color:#343434;border-bottom-color:#343434}.navbar .nav li.dropdown.open>.dropdown-toggle,.navbar .nav li.dropdown.active>.dropdown-toggle,.navbar .nav li.dropdown.open.active>.dropdown-toggle{color:#555;background-color:#e5e5e5}.navbar .nav li.dropdown>.dropdown-toggle .caret{border-top-color:#777;border-bottom-color:#777}.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:#555;border-bottom-color:#555}.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;border-radius:6px 0 6px 6px}.navbar-inverse .navbar-inner{background-color:#1b1b1b;background-image:linear-gradient(to bottom,#222,#111);background-repeat:repeat-x;border-color:#252525;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff222222',endColorstr='#ff111111',GradientType=0)}.navbar-inverse .brand,.navbar-inverse .nav>li>a{color:#d9d9d9;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:#d9d9d9}.navbar-inverse .navbar-text{color:#d9d9d9}.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:#111}.navbar-inverse .navbar-link{color:#d9d9d9}.navbar-inverse .navbar-link:hover,.navbar-inverse .navbar-link:focus{color:#fff}.navbar-inverse .divider-vertical{border-right-color:#222;border-left-color:#111}.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:#111}.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:#d9d9d9;border-bottom-color:#d9d9d9}.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:#515151;border-color:#111;box-shadow:inset 0 1px 2px rgba(0,0,0,0.1),0 1px 0 rgba(255,255,255,0.15);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:#343434;text-shadow:0 1px 0 #fff;background-color:#fff;border:0;outline:0;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:#0e0e0e;*background-color:#040404;background-image:linear-gradient(to bottom,#151515,#040404);background-repeat:repeat-x;border-color:#040404 #040404 #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='#ff151515',endColorstr='#ff040404',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.navbar-inverse .btn-navbar:hover,.navbar-inverse .btn-navbar:focus,.navbar-inverse .btn-navbar:active{background-color:#101010}.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:#000}.navbar-inverse .btn-navbar:active,.navbar-inverse .btn-navbar.active{background-color:#000 \9}.breadcrumb{padding:8px 15px;margin:0 0 20px;list-style:none;background-color:#f5f5f5;border-radius:0}.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:#d9d9d9}.pagination{margin:20px 0}.pagination ul{display:inline-block;*display:inline;margin-bottom:0;margin-left:0;border-radius:0;*zoom:1;box-shadow:0 1px 2px rgba(0,0,0,0.05)}.pagination ul>li{display:inline}.pagination ul>li>a,.pagination ul>li>span{float:left;padding:4px 12px;line-height:20px;text-decoration:none;background-color:#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:#d9d9d9;cursor:default}.pagination ul>.disabled>span,.pagination ul>.disabled>a,.pagination ul>.disabled>a:hover,.pagination ul>.disabled>a:focus{color:#d9d9d9;cursor:default;background-color:transparent}.pagination ul>li:first-child>a,.pagination ul>li:first-child>span{border-left-width:1px;border-bottom-left-radius:0;border-top-left-radius:0;-moz-border-radius-bottomleft:0;-moz-border-radius-topleft:0}.pagination ul>li:last-child>a,.pagination ul>li:last-child>span{border-top-right-radius:0;border-bottom-right-radius:0;-moz-border-radius-topright:0;-moz-border-radius-bottomright:0}.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{border-bottom-left-radius:0;border-top-left-radius:0;-moz-border-radius-bottomleft:0;-moz-border-radius-topleft:0}.pagination-large ul>li:last-child>a,.pagination-large ul>li:last-child>span{border-top-right-radius:0;border-bottom-right-radius:0;-moz-border-radius-topright:0;-moz-border-radius-bottomright:0}.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{border-bottom-left-radius:0;border-top-left-radius:0;-moz-border-radius-bottomleft:0;-moz-border-radius-topleft:0}.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{border-top-right-radius:0;border-bottom-right-radius:0;-moz-border-radius-topright:0;-moz-border-radius-bottomright:0}.pagination-small ul>li>a,.pagination-small ul>li>span{padding:2px 10px;font-size:11.9px}.pagination-mini ul>li>a,.pagination-mini ul>li>span{padding:0 6px;font-size:10.5px}.pager{margin:20px 0;text-align:center;list-style:none;*zoom:1}.pager:before,.pager:after{display:table;line-height:0;content:""}.pager:after{clear:both}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;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:#d9d9d9;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;border-radius:6px;outline:0;box-shadow:0 3px 7px rgba(0,0,0,0.3);background-clip:padding-box}.modal.fade{top:-25%;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;border-radius:0 0 6px 6px;*zoom:1;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:#000;border-radius:0}.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:#000;border-width:5px 5px 0}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-right-color:#000;border-width:5px 5px 5px 0}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-left-color:#000;border-width:5px 0 5px 5px}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-bottom-color:#000;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:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);border-radius:6px;box-shadow:0 5px 10px rgba(0,0,0,0.2);background-clip:padding-box}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{padding:8px 14px;margin:0;font-size:14px;font-weight:normal;line-height:18px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;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:#fff;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:#fff;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:#fff;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:#fff;border-right-width:0}.tipmenu .tooltip{position:absolute;right:0;left:0;margin-right:auto;margin-left:auto}.tipmenu:hover .tooltip{opacity:1}.tipmenu:hover .tooltip a{color:white}.tipmenu .tooltip-inner{margin-right:auto;margin-left:auto}.thumbnails{margin-left:0;list-style:none;*zoom:1}.thumbnails:before,.thumbnails:after{display:table;line-height:0;content:""}.thumbnails:after{clear:both}.row-fluid .thumbnails{margin-left:0}.thumbnails>li{float:left;margin-bottom:20px;margin-left:0}.thumbnails>li a:hover{text-decoration:none}.thumbnail{display:block;padding:4px;line-height:20px;border:1px solid #ddd;border-radius:0;box-shadow:0 1px 3px rgba(0,0,0,0.055);transition:all .2s ease-in-out}a.thumbnail:hover,a.thumbnail:focus{border-color:#000;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:#555}.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:#d9d9d9}.label{border-radius:3px}.badge{padding-right:9px;padding-left: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:#fff}.label-important[href],.badge-important[href]{background-color:#e6e6e6}.label-warning,.badge-warning{background-color:#df7f48}.label-warning[href],.badge-warning[href]{background-color:#d06324}.label-success,.badge-success{background-color:#fff}.label-success[href],.badge-success[href]{background-color:#e6e6e6}.label-info,.badge-info{background-color:#fff}.label-info[href],.badge-info[href]{background-color:#e6e6e6}.label-inverse,.badge-inverse{background-color:#343434}.label-inverse[href],.badge-inverse[href]{background-color:#1a1a1a}.btn .label,.btn .badge{position:relative;top:-1px}.btn-mini .label,.btn-mini .badge{top:0}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f7f7f7;background-image:linear-gradient(to bottom,#f5f5f5,#f9f9f9);background-repeat:repeat-x;border-radius:0;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5',endColorstr='#fff9f9f9',GradientType=0);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:linear-gradient(to bottom,#149bdf,#0480be);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff149bdf',endColorstr='#ff0480be',GradientType=0);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);box-sizing:border-box;transition:width .6s ease}.progress .bar+.bar{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:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-size:40px 40px}.progress.active .bar{animation:progress-bar-stripes 2s linear infinite}.progress-danger .bar,.progress .bar-danger{background-color:#dd514c;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: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: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: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: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: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:#e69a6f;background-image:linear-gradient(to bottom,#eaad89,#df7f48);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffeaad89',endColorstr='#ffdf7f48',GradientType=0)}.progress-warning.progress-striped .bar,.progress-striped .bar-warning{background-color:#eaad89;background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.accordion{margin-bottom:20px}.accordion-group{margin-bottom:2px;border:1px solid #e5e5e5;border-radius:0}.accordion-heading{border-bottom:0}.accordion-heading .accordion-toggle{display:block;padding:8px 15px}.accordion-toggle{cursor:pointer}.accordion-inner{padding:9px 15px;border-top:1px solid #e5e5e5}.carousel{position:relative;margin-bottom:20px;line-height:1}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;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:#222;border:3px solid #fff;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:#343434;background:rgba(0,0,0,0.75)}.carousel-caption h4,.carousel-caption p{line-height:20px;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:30px;color:inherit;background-color:#f8f8f8;border-radius:6px}.hero-unit h1{margin-bottom:0;font-size:60px;line-height:1;letter-spacing:-1px;color:inherit}.hero-unit li{line-height:30px}.pull-right{float:right}.pull-left{float:left}.hide{display:none}.show{display:block}.invisible{visibility:hidden}.affix{position:fixed}html,body{height:100%;overflow:hidden}body{width:100%;height:100%;padding:0;margin:0;font-family:"Open Sans","Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:20px;color:#343434;background-color:#fff}.padded{padding:20px}#layout{position:relative;z-index:1;height:100%;padding:0}#mainwrapper{width:100%;height:100%;margin:0}#contentwrapper,#contentcolumn{position:absolute;top:0;right:0;bottom:0;left:80px;z-index:10;margin:0}#umb-notifications-wrapper{left:80px}#contentcolumn{left:0}#contentcolumn iframe#right{position:relative;display:block;width:100%;height:100%;border:0}#leftcolumn{position:absolute;z-index:20;float:left;width:80px;height:100%}#applications{position:absolute;top:0;bottom:0;left:0;z-index:1000;height:100%;text-align:center}#applications-tray{position:absolute;top:0;bottom:0;left:80px;z-index:900;height:100%;text-align:center}#search-form{position:absolute;top:0;right:0;left:0;z-index:100;display:block;margin:0;overflow:hidden}#search-form .form-search{display:-ms-flexbox;display:flex;margin-top:17px}#search-form .form-search .umb-search-field{width:auto;min-width:160px;-ms-flex:1;flex:1}@media(max-width:500px){#search-form .form-search{width:calc(100% - 80px)}}#navigation{position:absolute;top:0;bottom:0;left:80px;z-index:100;height:100%;background:#fff}.navigation-inner-container{position:absolute;top:0;right:0;bottom:0;left:0;z-index:100;padding-top:100px;border-right:1px solid #d9d9d9}#dialog{position:absolute;top:0;left:100%;z-index:50;display:inline-block;min-width:500px}#tree{z-index:100!important;padding:0;overflow:auto}#tree .umb-tree{padding:0 0 20px 0}#search-results{z-index:200}#contextMenu{position:absolute;top:0;left:100%;z-index:50;min-width:250px}#speechbubble{position:absolute;right:0;bottom:100px;left:0;z-index:1060;padding:0;margin:auto;background:0;border:0;border-bottom:0;border-radius:0}.ui-resizable-e{position:absolute;top:0;right:-5px;bottom:0;z-index:9999!important;width:4px;cursor:e-resize;background-color:#f8f8f8;border:solid 1px #d9d9d9;border-top:0;border-bottom:0}@media(min-width:1101px){#contentwrapper,#umb-notifications-wrapper{left:440px}#speechbubble{left:360px}}.emptySection #contentwrapper,.emptySection #umb-notifications-wrapper{left:80px}.emptySection #speechbubble{left:0}.emptySection #navigation{display:none}.login-only #speechbubble{left:0!important;z-index:10000}.login-only #speechbubble ul{padding-left:20px}@media(max-width:767px){#leftcolumn{width:61px}#applications ul.sections{width:61px}ul.sections.sections-tray{width:61px}#applications-tray{left:60px}#navigation{left:60px}#contentwrapper,#contentcolumn,#umb-notifications-wrapper{left:30px}#umbracoMainPageBody .umb-modal-left.fade.in{margin-left:61px}}@media(max-width:500px){#leftcolumn{width:41px}#applications ul.sections{width:41px}#applications ul.sections-tray{width:41px}ul.sections.sections-tray{width:41px}#applications-tray{left:40px}#navigation{left:40px}#contentwrapper,#contentcolumn,#umb-notifications-wrapper{left:20px}#umbracoMainPageBody .umb-modal-left.fade.in{width:85%!important;margin-left:41px}}.shadow-depth-1{box-shadow:0 1px 3px rgba(0,0,0,0.12),0 1px 2px rgba(0,0,0,0.24)}.shadow-depth-2{box-shadow:0 3px 6px rgba(0,0,0,0.16),0 3px 6px rgba(0,0,0,0.23)}.shadow-depth-3{box-shadow:0 10px 20px rgba(0,0,0,0.19),0 6px 6px rgba(0,0,0,0.23)}.shadow-depth-4{box-shadow:0 14px 28px rgba(0,0,0,0.25),0 10px 10px rgba(0,0,0,0.22)}.shadow-depth-5{box-shadow:0 19px 38px rgba(0,0,0,0.3),0 15px 12px rgba(0,0,0,0.22)}.animated{animation-duration:1s;animation-fill-mode:both}.animated.infinite{animation-iteration-count:infinite}.animated.hinge{animation-duration:2s}@keyframes bounce{0%,100%,20%,53%,80%{transform:translate3d(0,0,0);transition-timing-function:cubic-bezier(0.215,0.61,0.355,1)}40%,43%{transform:translate3d(0,-30px,0);transition-timing-function:cubic-bezier(0.755,0.05,0.855,0.06)}70%{transform:translate3d(0,-15px,0);transition-timing-function:cubic-bezier(0.755,0.05,0.855,0.06)}90%{transform:translate3d(0,-4px,0)}}.bounce{animation-name:bounce;transform-origin:center bottom}@keyframes flash{0%,100%,50%{opacity:1}25%,75%{opacity:0}}.flash{animation-name:flash}@keyframes pulse{0%{transform:scale3d(1,1,1)}50%{transform:scale3d(1.05,1.05,1.05)}100%{transform:scale3d(1,1,1)}}.pulse{animation-name:pulse}@keyframes rubberBand{0%{transform:scale3d(1,1,1)}30%{transform:scale3d(1.25,0.75,1)}40%{transform:scale3d(0.75,1.25,1)}50%{transform:scale3d(1.15,0.85,1)}65%{transform:scale3d(0.95,1.05,1)}75%{transform:scale3d(1.05,0.95,1)}100%{transform:scale3d(1,1,1)}}.rubberBand{animation-name:rubberBand}@keyframes shake{0%,100%{transform:translate3d(0,0,0)}10%,30%,50%,70%,90%{transform:translate3d(-10px,0,0)}20%,40%,60%,80%{transform:translate3d(10px,0,0)}}.shake{animation-name:shake}@keyframes swing{20%{transform:rotate3d(0,0,1,15deg)}40%{transform:rotate3d(0,0,1,-10deg)}60%{transform:rotate3d(0,0,1,5deg)}80%{transform:rotate3d(0,0,1,-5deg)}100%{transform:rotate3d(0,0,1,0deg)}}.swing{animation-name:swing;transform-origin:top center}@keyframes tada{0%{transform:scale3d(1,1,1)}10%,20%{transform:scale3d(0.9,0.9,0.9) rotate3d(0,0,1,-3deg)}30%,50%,70%,90%{transform:scale3d(1.1,1.1,1.1) rotate3d(0,0,1,3deg)}40%,60%,80%{transform:scale3d(1.1,1.1,1.1) rotate3d(0,0,1,-3deg)}100%{transform:scale3d(1,1,1)}}.tada{animation-name:tada}@keyframes wobble{0%{transform:none}15%{transform:translate3d(-25%,0,0) rotate3d(0,0,1,-5deg)}30%{transform:translate3d(20%,0,0) rotate3d(0,0,1,3deg)}45%{transform:translate3d(-15%,0,0) rotate3d(0,0,1,-3deg)}60%{transform:translate3d(10%,0,0) rotate3d(0,0,1,2deg)}75%{transform:translate3d(-5%,0,0) rotate3d(0,0,1,-1deg)}100%{transform:none}}.wobble{animation-name:wobble}@keyframes bounceIn{0%,100%,20%,40%,60%,80%{transition-timing-function:cubic-bezier(0.215,0.61,0.355,1)}0%{opacity:0;transform:scale3d(0.3,0.3,0.3)}20%{transform:scale3d(1.1,1.1,1.1)}40%{transform:scale3d(0.9,0.9,0.9)}60%{opacity:1;transform:scale3d(1.03,1.03,1.03)}80%{transform:scale3d(0.97,0.97,0.97)}100%{opacity:1;transform:scale3d(1,1,1)}}.bounceIn{animation-duration:.75s;animation-name:bounceIn}@keyframes bounceInDown{0%,100%,60%,75%,90%{transition-timing-function:cubic-bezier(0.215,0.61,0.355,1)}0%{opacity:0;transform:translate3d(0,-3000px,0)}60%{opacity:1;transform:translate3d(0,25px,0)}75%{transform:translate3d(0,-10px,0)}90%{transform:translate3d(0,5px,0)}100%{transform:none}}.bounceInDown{animation-name:bounceInDown}@keyframes bounceInLeft{0%,100%,60%,75%,90%{transition-timing-function:cubic-bezier(0.215,0.61,0.355,1)}0%{opacity:0;transform:translate3d(-3000px,0,0)}60%{opacity:1;transform:translate3d(25px,0,0)}75%{transform:translate3d(-10px,0,0)}90%{transform:translate3d(5px,0,0)}100%{transform:none}}.bounceInLeft{animation-name:bounceInLeft}@keyframes bounceInRight{0%,100%,60%,75%,90%{transition-timing-function:cubic-bezier(0.215,0.61,0.355,1)}0%{opacity:0;transform:translate3d(3000px,0,0)}60%{opacity:1;transform:translate3d(-25px,0,0)}75%{transform:translate3d(10px,0,0)}90%{transform:translate3d(-5px,0,0)}100%{transform:none}}.bounceInRight{animation-name:bounceInRight}@keyframes bounceInUp{0%,100%,60%,75%,90%{transition-timing-function:cubic-bezier(0.215,0.61,0.355,1)}0%{opacity:0;transform:translate3d(0,3000px,0)}60%{opacity:1;transform:translate3d(0,-20px,0)}75%{transform:translate3d(0,10px,0)}90%{transform:translate3d(0,-5px,0)}100%{transform:translate3d(0,0,0)}}.bounceInUp{animation-name:bounceInUp}@keyframes bounceOut{20%{transform:scale3d(0.9,0.9,0.9)}50%,55%{opacity:1;transform:scale3d(1.1,1.1,1.1)}100%{opacity:0;transform:scale3d(0.3,0.3,0.3)}}.bounceOut{animation-duration:.75s;animation-name:bounceOut}@keyframes bounceOutDown{20%{transform:translate3d(0,10px,0)}40%,45%{opacity:1;transform:translate3d(0,-20px,0)}100%{opacity:0;transform:translate3d(0,2000px,0)}}.bounceOutDown{animation-name:bounceOutDown}@keyframes bounceOutLeft{20%{opacity:1;transform:translate3d(20px,0,0)}100%{opacity:0;transform:translate3d(-2000px,0,0)}}.bounceOutLeft{animation-name:bounceOutLeft}@keyframes bounceOutRight{20%{opacity:1;transform:translate3d(-20px,0,0)}100%{opacity:0;transform:translate3d(2000px,0,0)}}.bounceOutRight{animation-name:bounceOutRight}@keyframes bounceOutUp{20%{transform:translate3d(0,-10px,0)}40%,45%{opacity:1;transform:translate3d(0,20px,0)}100%{opacity:0;transform:translate3d(0,-2000px,0)}}.bounceOutUp{animation-name:bounceOutUp}@keyframes fadeIn{0%{opacity:0}100%{opacity:1}}.fadeIn{animation-name:fadeIn}@keyframes fadeInDown{0%{opacity:0;transform:translate3d(0,-100%,0)}100%{opacity:1;transform:none}}.fadeInDown{animation-name:fadeInDown}@keyframes fadeInDownBig{0%{opacity:0;transform:translate3d(0,-2000px,0)}100%{opacity:1;transform:none}}.fadeInDownBig{animation-name:fadeInDownBig}@keyframes fadeInLeft{0%{opacity:0;transform:translate3d(-100%,0,0)}100%{opacity:1;transform:none}}.fadeInLeft{animation-name:fadeInLeft}@keyframes fadeInLeftBig{0%{opacity:0;transform:translate3d(-2000px,0,0)}100%{opacity:1;transform:none}}.fadeInLeftBig{animation-name:fadeInLeftBig}@keyframes fadeInRight{0%{opacity:0;transform:translate3d(100%,0,0)}100%{opacity:1;transform:none}}.fadeInRight{animation-name:fadeInRight}@keyframes fadeInRightBig{0%{opacity:0;transform:translate3d(2000px,0,0)}100%{opacity:1;transform:none}}.fadeInRightBig{animation-name:fadeInRightBig}@keyframes fadeInUp{0%{opacity:0;transform:translate3d(0,100%,0)}100%{opacity:1;transform:none}}.fadeInUp{animation-name:fadeInUp}@keyframes fadeInUpBig{0%{opacity:0;transform:translate3d(0,2000px,0)}100%{opacity:1;transform:none}}.fadeInUpBig{animation-name:fadeInUpBig}@keyframes fadeOut{0%{opacity:1}100%{opacity:0}}.fadeOut{animation-name:fadeOut}@keyframes fadeOutDown{0%{opacity:1}100%{opacity:0;transform:translate3d(0,100%,0)}}.fadeOutDown{animation-name:fadeOutDown}@keyframes fadeOutDownBig{0%{opacity:1}100%{opacity:0;transform:translate3d(0,2000px,0)}}.fadeOutDownBig{animation-name:fadeOutDownBig}@keyframes fadeOutLeft{0%{opacity:1}100%{opacity:0;transform:translate3d(-100%,0,0)}}.fadeOutLeft{animation-name:fadeOutLeft}@keyframes fadeOutLeftBig{0%{opacity:1}100%{opacity:0;transform:translate3d(-2000px,0,0)}}.fadeOutLeftBig{animation-name:fadeOutLeftBig}@keyframes fadeOutRight{0%{opacity:1}100%{opacity:0;transform:translate3d(100%,0,0)}}.fadeOutRight{animation-name:fadeOutRight}@keyframes fadeOutRightBig{0%{opacity:1}100%{opacity:0;transform:translate3d(2000px,0,0)}}.fadeOutRightBig{animation-name:fadeOutRightBig}@keyframes fadeOutUp{0%{opacity:1}100%{opacity:0;transform:translate3d(0,-100%,0)}}.fadeOutUp{animation-name:fadeOutUp}@keyframes fadeOutUpBig{0%{opacity:1}100%{opacity:0;transform:translate3d(0,-2000px,0)}}.fadeOutUpBig{animation-name:fadeOutUpBig}@keyframes flip{0%{transform:perspective(400px) rotate3d(0,1,0,-360deg);animation-timing-function:ease-out}40%{transform:perspective(400px) translate3d(0,0,150px) rotate3d(0,1,0,-190deg);animation-timing-function:ease-out}50%{transform:perspective(400px) translate3d(0,0,150px) rotate3d(0,1,0,-170deg);animation-timing-function:ease-in}80%{transform:perspective(400px) scale3d(0.95,0.95,0.95);animation-timing-function:ease-in}100%{transform:perspective(400px);animation-timing-function:ease-in}}.animated.flip{animation-name:flip;-ms-backface-visibility:visible;backface-visibility:visible}@keyframes flipInX{0%{opacity:0;transform:perspective(400px) rotate3d(1,0,0,90deg);transition-timing-function:ease-in}40%{transform:perspective(400px) rotate3d(1,0,0,-20deg);transition-timing-function:ease-in}60%{opacity:1;transform:perspective(400px) rotate3d(1,0,0,10deg)}80%{transform:perspective(400px) rotate3d(1,0,0,-5deg)}100%{transform:perspective(400px)}}.flipInX{animation-name:flipInX;-ms-backface-visibility:visible!important;backface-visibility:visible!important}@keyframes flipInY{0%{opacity:0;transform:perspective(400px) rotate3d(0,1,0,90deg);transition-timing-function:ease-in}40%{transform:perspective(400px) rotate3d(0,1,0,-20deg);transition-timing-function:ease-in}60%{opacity:1;transform:perspective(400px) rotate3d(0,1,0,10deg)}80%{transform:perspective(400px) rotate3d(0,1,0,-5deg)}100%{transform:perspective(400px)}}.flipInY{animation-name:flipInY;-ms-backface-visibility:visible!important;backface-visibility:visible!important}@keyframes flipOutX{0%{transform:perspective(400px)}30%{opacity:1;transform:perspective(400px) rotate3d(1,0,0,-20deg)}100%{opacity:0;transform:perspective(400px) rotate3d(1,0,0,90deg)}}.flipOutX{animation-duration:.75s;animation-name:flipOutX;-ms-backface-visibility:visible!important;backface-visibility:visible!important}@keyframes flipOutY{0%{transform:perspective(400px)}30%{opacity:1;transform:perspective(400px) rotate3d(0,1,0,-15deg)}100%{opacity:0;transform:perspective(400px) rotate3d(0,1,0,90deg)}}.flipOutY{animation-duration:.75s;animation-name:flipOutY;-ms-backface-visibility:visible!important;backface-visibility:visible!important}@keyframes lightSpeedIn{0%{opacity:0;transform:translate3d(100%,0,0) skewX(-30deg)}60%{opacity:1;transform:skewX(20deg)}80%{opacity:1;transform:skewX(-5deg)}100%{opacity:1;transform:none}}.lightSpeedIn{animation-name:lightSpeedIn;animation-timing-function:ease-out}@keyframes lightSpeedOut{0%{opacity:1}100%{opacity:0;transform:translate3d(100%,0,0) skewX(30deg)}}.lightSpeedOut{animation-name:lightSpeedOut;animation-timing-function:ease-in}@keyframes rotateIn{0%{opacity:0;transform:rotate3d(0,0,1,-200deg);transform-origin:center}100%{opacity:1;transform:none;transform-origin:center}}.rotateIn{animation-name:rotateIn}@keyframes rotateInDownLeft{0%{opacity:0;transform:rotate3d(0,0,1,-45deg);transform-origin:left bottom}100%{opacity:1;transform:none;transform-origin:left bottom}}.rotateInDownLeft{animation-name:rotateInDownLeft}@keyframes rotateInDownRight{0%{opacity:0;transform:rotate3d(0,0,1,45deg);transform-origin:right bottom}100%{opacity:1;transform:none;transform-origin:right bottom}}.rotateInDownRight{animation-name:rotateInDownRight}@keyframes rotateInUpLeft{0%{opacity:0;transform:rotate3d(0,0,1,45deg);transform-origin:left bottom}100%{opacity:1;transform:none;transform-origin:left bottom}}.rotateInUpLeft{animation-name:rotateInUpLeft}@keyframes rotateInUpRight{0%{opacity:0;transform:rotate3d(0,0,1,-90deg);transform-origin:right bottom}100%{opacity:1;transform:none;transform-origin:right bottom}}.rotateInUpRight{animation-name:rotateInUpRight}@keyframes rotateOut{0%{opacity:1;transform-origin:center}100%{opacity:0;transform:rotate3d(0,0,1,200deg);transform-origin:center}}.rotateOut{animation-name:rotateOut}@keyframes rotateOutDownLeft{0%{opacity:1;transform-origin:left bottom}100%{opacity:0;transform:rotate(0,0,1,45deg);transform-origin:left bottom}}.rotateOutDownLeft{animation-name:rotateOutDownLeft}@keyframes rotateOutDownRight{0%{opacity:1;transform-origin:right bottom}100%{opacity:0;transform:rotate3d(0,0,1,-45deg);transform-origin:right bottom}}.rotateOutDownRight{animation-name:rotateOutDownRight}@keyframes rotateOutUpLeft{0%{opacity:1;transform-origin:left bottom}100%{opacity:0;transform:rotate3d(0,0,1,-45deg);transform-origin:left bottom}}.rotateOutUpLeft{animation-name:rotateOutUpLeft}@keyframes rotateOutUpRight{0%{opacity:1;transform-origin:right bottom}100%{opacity:0;transform:rotate3d(0,0,1,90deg);transform-origin:right bottom}}.rotateOutUpRight{animation-name:rotateOutUpRight}@keyframes hinge{0%{animation-timing-function:ease-in-out;transform-origin:top left}20%,60%{transform:rotate3d(0,0,1,80deg);animation-timing-function:ease-in-out;transform-origin:top left}40%,80%{opacity:1;transform:rotate3d(0,0,1,60deg);animation-timing-function:ease-in-out;transform-origin:top left}100%{opacity:0;transform:translate3d(0,700px,0)}}.hinge{animation-name:hinge}@keyframes rollIn{0%{opacity:0;transform:translate3d(-100%,0,0) rotate3d(0,0,1,-120deg)}100%{opacity:1;transform:none}}.rollIn{animation-name:rollIn}@keyframes rollOut{0%{opacity:1}100%{opacity:0;transform:translate3d(100%,0,0) rotate3d(0,0,1,120deg)}}.rollOut{animation-name:rollOut}@keyframes zoomIn{0%{opacity:0;transform:scale3d(0.3,0.3,0.3)}50%{opacity:1}}.zoomIn{animation-name:zoomIn}@keyframes zoomInDown{0%{opacity:0;transform:scale3d(0.1,0.1,0.1) translate3d(0,-1000px,0);animation-timing-function:cubic-bezier(0.55,0.055,0.675,0.19)}60%{opacity:1;transform:scale3d(0.475,0.475,0.475) translate3d(0,60px,0);animation-timing-function:cubic-bezier(0.175,0.885,0.32,1)}}.zoomInDown{animation-name:zoomInDown}@keyframes zoomInLeft{0%{opacity:0;transform:scale3d(0.1,0.1,0.1) translate3d(-1000px,0,0);animation-timing-function:cubic-bezier(0.55,0.055,0.675,0.19)}60%{opacity:1;transform:scale3d(0.475,0.475,0.475) translate3d(10px,0,0);animation-timing-function:cubic-bezier(0.175,0.885,0.32,1)}}.zoomInLeft{animation-name:zoomInLeft}@keyframes zoomInRight{0%{opacity:0;transform:scale3d(0.1,0.1,0.1) translate3d(1000px,0,0);animation-timing-function:cubic-bezier(0.55,0.055,0.675,0.19)}60%{opacity:1;transform:scale3d(0.475,0.475,0.475) translate3d(-10px,0,0);animation-timing-function:cubic-bezier(0.175,0.885,0.32,1)}}.zoomInRight{animation-name:zoomInRight}@keyframes zoomInUp{0%{opacity:0;transform:scale3d(0.1,0.1,0.1) translate3d(0,1000px,0);animation-timing-function:cubic-bezier(0.55,0.055,0.675,0.19)}60%{opacity:1;transform:scale3d(0.475,0.475,0.475) translate3d(0,-60px,0);animation-timing-function:cubic-bezier(0.175,0.885,0.32,1)}}.zoomInUp{animation-name:zoomInUp}@keyframes zoomOut{0%{opacity:1}50%{opacity:0;transform:scale3d(0.3,0.3,0.3)}100%{opacity:0}}.zoomOut{animation-name:zoomOut}@keyframes zoomOutDown{40%{opacity:1;transform:scale3d(0.475,0.475,0.475) translate3d(0,-60px,0);animation-timing-function:cubic-bezier(0.55,0.055,0.675,0.19)}100%{opacity:0;transform:scale3d(0.1,0.1,0.1) translate3d(0,2000px,0);animation-timing-function:cubic-bezier(0.175,0.885,0.32,1);transform-origin:center bottom}}.zoomOutDown{animation-name:zoomOutDown}@keyframes zoomOutLeft{40%{opacity:1;transform:scale3d(0.475,0.475,0.475) translate3d(42px,0,0)}100%{opacity:0;transform:scale(0.1) translate3d(-2000px,0,0);transform-origin:left center}}.zoomOutLeft{animation-name:zoomOutLeft}@keyframes zoomOutRight{40%{opacity:1;transform:scale3d(0.475,0.475,0.475) translate3d(-42px,0,0)}100%{opacity:0;transform:scale(0.1) translate3d(2000px,0,0);transform-origin:right center}}.zoomOutRight{animation-name:zoomOutRight}@keyframes zoomOutUp{40%{opacity:1;transform:scale3d(0.475,0.475,0.475) translate3d(0,60px,0);animation-timing-function:cubic-bezier(0.55,0.055,0.675,0.19)}100%{opacity:0;transform:scale3d(0.1,0.1,0.1) translate3d(0,-2000px,0);animation-timing-function:cubic-bezier(0.175,0.885,0.32,1);transform-origin:center bottom}}.zoomOutUp{animation-name:zoomOutUp}.animated.-half-second{animation-duration:.5s}.slide-in-left.ng-hide-remove{animation:fadeInLeft .6s}.slide-in-left.ng-hide-add{display:block!important;animation:fadeOutLeft .6s}.slide-in-right.ng-hide-remove{animation:fadeInRight .6s}.slide-in-right.ng-hide-add{display:block!important;animation:fadeOutRight .6s}.slide-in-up.ng-hide-remove{animation:fadeInUp .6s}.slide-in-up.ng-hide-add{display:block!important;animation:fadeOutDown .6s}.tree-node-delete-leave{position:relative;display:block;animation:leave 600ms cubic-bezier(0.445,0.05,0.55,0.95)}@keyframes leave{to{bottom:-70px;height:0;opacity:0}25%{bottom:15px}from{bottom:0;height:30px;opacity:1}}.tree-node-delete-leave *{color:#9d261d!important}.tree-node-slide-up{top:0;opacity:1;transition:700ms cubic-bezier(0,0,0.58,1) all}.tree-node-slide-up *{font-size:100%;transition:font-size 700ms}.tree-node-slide-up.tree-node-slide-up-hide-active{top:-100px;opacity:0}.tree-node-slide-up.tree-node-slide-up-hide-active *{font-size:120%}.tree-fade-out-hide,.tree-fade-out-show,.tree-fade-out-hide div:not(.tree-node-slide-up-hide-active),.tree-fade-out-show div:not(.tree-node-slide-up-hide-active){transition:700ms cubic-bezier(0.075,0.82,0.165,1) all}.tree-fade-out-show.tree-fade-out-show-active div:not(.tree-node-slide-up-hide-active){opacity:1}.tree-fade-out-hide.tree-fade-out-hide-active div:not(.tree-node-slide-up-hide-active){opacity:0}.light{font-weight:300}.normal{font-weight:500}.semi-bold{font-weight:600}.bold{font-weight:700}.btn{display:inline-block;padding:4px 12px;margin-bottom:0;font-size:14px;line-height:20px;color:#000;text-align:center;vertical-align:middle;cursor:pointer;background:#f2f2f2;border:1px solid #ccc;box-shadow:none}.btn:hover,.btn:focus{color:#343434;text-decoration:none;background:#e4e4e4;background-position:0 -15px;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;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],.btn:disabled:hover{cursor:default;border-color:#ccc;opacity:.65;filter:alpha(opacity=65);box-shadow:none}.btn-group>.btn+.dropdown-toggle{box-shadow:none}.btn-group>.btn:first-child,.btn-group>.btn:last-child,.btn-group>.dropdown-toggle{border-radius:0}.btn-large{padding:11px 19px;font-size:17.5px}.btn-large [class^="icon-"],.btn-large [class*=" icon-"]{margin-top:4px;border-radius:0}.btn-small{padding:2px 10px;font-size:11.9px;border-radius:0}.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;border-radius:0}.btn-block{display:block;width:100%;padding-right:0;padding-left:0;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-round{z-index:6666;display:inline-block;width:32px;height:32px;overflow:hidden;font-size:24px;line-height:32px;color:#555;text-align:center;background:#fff;border-radius:15px}.btn-primary.active,.btn-warning.active,.btn-danger.active,.btn-success.active,.btn-info.active,.btn-inverse.active,.btn-neutral.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:#53a93f;*background-color:#53a93f;background-image:linear-gradient(to bottom,#53a93f,#53a93f);background-repeat:repeat-x;border-color:#53a93f #53a93f #38712a;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='#ff53a93f',endColorstr='#ff53a93f',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-primary:hover,.btn-primary:focus,.btn-primary:active{background-color:#4fa23c}.btn-primary:hover,.btn-primary:focus,.btn-primary:active,.btn-primary.active,.btn-primary.disabled,.btn-primary[disabled]{color:#fff;*background-color:#4a9638}.btn-primary:active,.btn-primary.active{background-color:#418431 \9}.btn-warning{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#df7f48;*background-color:#df7f48;background-image:linear-gradient(to bottom,#df7f48,#df7f48);background-repeat:repeat-x;border-color:#df7f48 #df7f48 #ba5821;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='#ffdf7f48',endColorstr='#ffdf7f48',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-warning:hover,.btn-warning:focus,.btn-warning:active{background-color:#dd793f}.btn-warning:hover,.btn-warning:focus,.btn-warning:active,.btn-warning.active,.btn-warning.disabled,.btn-warning[disabled]{color:#fff;*background-color:#db7032}.btn-warning:active,.btn-warning.active{background-color:#d06324 \9}.btn-danger{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#ee5f5b;*background-color:#ee5f5b;background-image:linear-gradient(to bottom,#ee5f5b,#ee5f5b);background-repeat:repeat-x;border-color:#ee5f5b #ee5f5b #e51d18;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='#ffee5f5b',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-danger:hover,.btn-danger:focus,.btn-danger:active{background-color:#ed5652}.btn-danger:hover,.btn-danger:focus,.btn-danger:active,.btn-danger.active,.btn-danger.disabled,.btn-danger[disabled]{color:#fff;*background-color:#ec4844}.btn-danger:active,.btn-danger.active{background-color:#e9322d \9}.btn-success{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#53a93f;*background-color:#53a93f;background-image:linear-gradient(to bottom,#53a93f,#53a93f);background-repeat:repeat-x;border-color:#53a93f #53a93f #38712a;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='#ff53a93f',endColorstr='#ff53a93f',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-success:hover,.btn-success:focus,.btn-success:active{background-color:#4fa23c}.btn-success:hover,.btn-success:focus,.btn-success:active,.btn-success.active,.btn-success.disabled,.btn-success[disabled]{color:#fff;*background-color:#4a9638}.btn-success:active,.btn-success.active{background-color:#418431 \9}.btn-info{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#49afcd;*background-color:#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{background-color:#53bddc}.btn-info:hover,.btn-info:focus,.btn-info:active,.btn-info.active,.btn-info.disabled,.btn-info[disabled]{color:#fff;*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:#363636;*background-color:#222;background-image:linear-gradient(to bottom,#444,#222);background-repeat:repeat-x;border-color:#222 #222 #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='#ff444444',endColorstr='#ff222222',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-inverse:hover,.btn-inverse:focus,.btn-inverse:active{background-color:#3f3f3f}.btn-inverse:hover,.btn-inverse:focus,.btn-inverse:active,.btn-inverse.active,.btn-inverse.disabled,.btn-inverse[disabled]{color:#fff;*background-color:#151515}.btn-inverse:active,.btn-inverse.active{background-color:#080808 \9}.btn-neutral{color:#fff;color:#656565;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#f5f5f5;*background-color:#f5f5f5;background-image:linear-gradient(to bottom,#f5f5f5,#f5f5f5);background-repeat:repeat-x;border-color:#f5f5f5 #f5f5f5 #cfcfcf;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='#fff5f5f5',endColorstr='#fff5f5f5',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-neutral:hover,.btn-neutral:focus,.btn-neutral:active{background-color:#f0f0f0}.btn-neutral:hover,.btn-neutral:focus,.btn-neutral:active,.btn-neutral.active,.btn-neutral.disabled,.btn-neutral[disabled]{color:#fff;*background-color:#e8e8e8}.btn-neutral:active,.btn-neutral.active{background-color:#dcdcdc \9}.btn-neutral:hover,.btn-neutral:focus{color:#656565}.btn-neutral.disabled,.btn-neutral[disabled]{color:#656565;opacity:.65;filter:alpha(opacity=65)}.btn-install{display:block;padding:15px 50px;margin:40px auto;font-size:16px;color:white;background:#2e8aea;border:0}.btn-install:hover{background:#2b8ee3}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;box-shadow:none}.btn-link{color:#000;cursor:pointer;border-color:transparent;border-radius:0}.btn-link:hover,.btn-link:focus{color:#000;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover,.btn-link[disabled]:focus{color:#343434;text-decoration:none}.btn-link-reverse{text-decoration:underline}.btn-link-reverse:hover,.btn-link-reverse:focus{text-decoration:none}.btn-link.-underline{display:inline-block;text-decoration:underline}.btn-link.-underline:hover{text-decoration:none}small.umb-detail,label small,.guiDialogTiny{display:block;font-size:11px;font-weight:normal;color:#7f7f7f!important;text-decoration:none}label.control-label,.control-label{padding:0 10px 0 0!important;font-weight:bold}.umb-status-label{color:#555!important}.controls-row label{padding:0 10px 0 10px;vertical-align:middle}.breadcrumb{display:block;height:30px;margin-top:10px}.breadcrumb li{height:30px;vertical-align:middle}.breadcrumb li a{height:30px;vertical-align:middle}.breadcrumb input{font-size:11px!Important}.form-search{position:relative;padding:0}.form-search a{text-decoration:none;cursor:pointer}.form-search a:hover{color:#555}.form-search h4{color:#555}.form-search small{color:#d9d9d9}.form-search .icon,.form-search .icon-search{position:absolute;top:6px;left:4px;color:#d9d9d9}.form-search .icon-search{pointer-events:none}.form-search input{width:90%;padding:4px 0 4px 16px;padding-left:25px!Important;font-size:17.5px;font-weight:400;line-height:22px;background:#fff;border:1px solid #d9d9d9}.form-search .search-input{font-weight:bold;border-color:#d9d9d9}.form-search .search-input:hover,.form-search .search-input:focus,.form-search .search-input:focus:hover{border-color:#ccc}.form-search .search-input:-moz-placeholder{font-weight:normal}.form-search .search-input:-ms-input-placeholder{font-weight:normal}.form-search .search-input::-webkit-input-placeholder{font-weight:normal}form{margin:0 0 20px}form.-no-margin-bottom{margin-bottom:0}fieldset{padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:40px;color:#343434;border:0;border-bottom:1px solid #e5e5e5}legend small{font-size:15px;color:#d9d9d9}label,input,button,select,textarea{font-size:14px;font-weight:normal;line-height:20px}input,button,select,textarea{font-family:"Open Sans","Helvetica Neue",Helvetica,Arial,sans-serif}label{display:inline-block;margin-bottom:5px}select,textarea,input[type="text"],input[type="password"],input[type="datetime"],input[type="datetime-local"],input[type="date"],input[type="month"],input[type="time"],input[type="week"],input[type="number"],input[type="email"],input[type="url"],input[type="search"],input[type="tel"],input[type="color"],.uneditable-input{display:inline-block;height:20px;padding:4px 6px;margin-bottom:10px;font-size:14px;line-height:20px;color:#555;vertical-align:middle;border-radius:0}input.-full-width-input{width:100%;height:30px;padding:4px 6px;box-sizing:border-box}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;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:none;outline:0;outline:none \9}input[type="radio"],input[type="checkbox"]{margin:4px 0 0;margin-top:1px \9;*margin-top:0;line-height:normal}input[type="file"],input[type="image"],input[type="submit"],input[type="reset"],input[type="button"],input[type="radio"],input[type="checkbox"]{width:auto}select,input[type="file"]{height:30px;*margin-top:4px;line-height:30px}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:#d9d9d9;cursor:not-allowed;background-color:#fcfcfc;border-color:#ccc;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:#d9d9d9}input:-ms-input-placeholder,textarea:-ms-input-placeholder{color:#d9d9d9}input::-webkit-input-placeholder,textarea::-webkit-input-placeholder{color:#d9d9d9}.radio,.checkbox{min-height:20px;padding-left:20px}.radio.no-indent,.checkbox.no-indent{padding-left:0}.radio input[type="radio"],.checkbox input[type="checkbox"]{float:left;margin-right:5px;margin-left:0}.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}.bigInput,.input-large-type{font-size:20px!important}input,textarea,.uneditable-input{margin-left:0}.controls-row [class*="span"]+[class*="span"]{margin-left:0}input.span12,textarea.span12,.uneditable-input.span12{width:706px}input.span11,textarea.span11,.uneditable-input.span11{width:646px}input.span10,textarea.span10,.uneditable-input.span10{width:586px}input.span9,textarea.span9,.uneditable-input.span9{width:526px}input.span8,textarea.span8,.uneditable-input.span8{width:466px}input.span7,textarea.span7,.uneditable-input.span7{width:406px}input.span6,textarea.span6,.uneditable-input.span6{width:346px}input.span5,textarea.span5,.uneditable-input.span5{width:286px}input.span4,textarea.span4,.uneditable-input.span4{width:226px}input.span3,textarea.span3,.uneditable-input.span3{width:166px}input.span2,textarea.span2,.uneditable-input.span2{width:106px}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:#f8f8f8}input[type="radio"][disabled],input[type="checkbox"][disabled],input[type="radio"][readonly],input[type="checkbox"][readonly]{background-color:transparent}.show-validation.ng-invalid .control-group.error .control-label,.show-validation.ng-invalid .umb-panel-header-content-wrapper .control-label,.show-validation.ng-invalid .control-group.error .help-block,.show-validation.ng-invalid .umb-panel-header-content-wrapper .help-block,.show-validation.ng-invalid .control-group.error .help-inline,.show-validation.ng-invalid .umb-panel-header-content-wrapper .help-inline{color:#9d261d}.show-validation.ng-invalid .control-group.error .checkbox.ng-invalid,.show-validation.ng-invalid .umb-panel-header-content-wrapper .checkbox.ng-invalid,.show-validation.ng-invalid .control-group.error .radio.ng-invalid,.show-validation.ng-invalid .umb-panel-header-content-wrapper .radio.ng-invalid,.show-validation.ng-invalid .control-group.error input.ng-invalid,.show-validation.ng-invalid .umb-panel-header-content-wrapper input.ng-invalid,.show-validation.ng-invalid .control-group.error select.ng-invalid,.show-validation.ng-invalid .umb-panel-header-content-wrapper select.ng-invalid,.show-validation.ng-invalid .control-group.error textarea.ng-invalid,.show-validation.ng-invalid .umb-panel-header-content-wrapper textarea.ng-invalid{color:#9d261d}.show-validation.ng-invalid .control-group.error input.ng-invalid,.show-validation.ng-invalid .umb-panel-header-content-wrapper input.ng-invalid,.show-validation.ng-invalid .control-group.error select.ng-invalid,.show-validation.ng-invalid .umb-panel-header-content-wrapper select.ng-invalid,.show-validation.ng-invalid .control-group.error textarea.ng-invalid,.show-validation.ng-invalid .umb-panel-header-content-wrapper textarea.ng-invalid{border-color:#9d261d}.show-validation.ng-invalid .control-group.error .input-prepend .add-on,.show-validation.ng-invalid .umb-panel-header-content-wrapper .input-prepend .add-on,.show-validation.ng-invalid .control-group.error .input-append .add-on,.show-validation.ng-invalid .umb-panel-header-content-wrapper .input-append .add-on{color:#9d261d;background-color:#f8dcda;border-color:#9d261d}.highlight-error{color:#9d261d!important;border-color:#ee5f5b!important}.show-validation .umb-headline-editor-wrapper input:focus:invalid,.show-validation .umb-headline-editor-wrapper textarea:focus:invalid,.show-validation .umb-headline-editor-wrapper select:focus:invalid{color:inherit;border:0;border-color:inherit;box-shadow:inherit}.ng-invalid>.umb-headline-editor-wrapper h1{color:#9d261d;cursor:pointer;border-bottom:1px dashed #9d261d}.form-actions{padding:19px 20px 20px;margin-top:20px;margin-bottom:20px;background-color:#f5f5f5;border-top:1px solid #e5e5e5;*zoom:1}.form-actions:before,.form-actions:after{display:table;line-height:0;content:""}.form-actions:after{clear:both}.help-block,.help-inline{color:#5a5a5a}.help-block{display:block;margin-bottom:10px}.help-inline{display:inline-block;*display:inline;padding-left:5px;vertical-align:middle;*zoom:1}.input-append,.input-prepend{display:inline-block;margin-bottom:10px;font-size:0;white-space:nowrap;vertical-align:middle}.input-append input,.input-prepend input,.input-append select,.input-prepend select,.input-append .uneditable-input,.input-prepend .uneditable-input,.input-append .dropdown-menu,.input-prepend .dropdown-menu,.input-append .popover,.input-prepend .popover{font-size:14px}.input-append input,.input-prepend input,.input-append select,.input-prepend select,.input-append .uneditable-input,.input-prepend .uneditable-input{position:relative;margin-bottom:0;*margin-left:0;vertical-align:top}.input-append input:focus,.input-prepend input:focus,.input-append select:focus,.input-prepend select:focus,.input-append .uneditable-input:focus,.input-prepend .uneditable-input:focus{z-index:2}.input-append .add-on,.input-prepend .add-on{display:inline-block;width:auto;height:20px;min-width:16px;padding:4px 5px;font-size:14px;font-weight:normal;line-height:20px;text-align:center;text-shadow:0 1px 0 #fff;background-color:#f8f8f8;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;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-append .add-on,.input-append .btn,.input-append .btn-group{margin-left:-1px}.input-prepend.input-append input,.input-prepend.input-append select,.input-prepend.input-append .uneditable-input{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{border-radius:0}.input-prepend.input-append .add-on:first-child,.input-prepend.input-append .btn:first-child{margin-right:-1px;border-radius:0}.input-prepend.input-append .add-on:last-child,.input-prepend.input-append .btn:last-child{margin-left:-1px;border-radius:0}.input-prepend.input-append .btn-group:first-child{margin-left:0}input.search-query{padding-right:4px \9;padding-left:14px;padding-left:4px \9;margin:0;border-radius:0}.form-search .input-append .search-query,.form-search .input-prepend .search-query{border-radius:0}.form-search .input-append .search-query{border-radius:14px 0 0 14px}.form-search .input-append .btn{border-radius:0 14px 14px 0}.form-search .input-prepend .search-query{border-radius:0 14px 14px 0}.form-search .input-prepend .btn{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:top;*zoom:1}.form-search .hide,.form-inline .hide,.form-horizontal .hide{display:none}.form-search label,.form-inline label,.form-search .btn-group,.form-inline .btn-group{display:inline-block}.form-search .input-append,.form-inline .input-append,.form-search .input-prepend,.form-inline .input-prepend{margin-bottom:0}.form-search .radio,.form-search .checkbox,.form-inline .radio,.form-inline .checkbox{padding-left:0;margin-bottom:0;vertical-align:middle}.form-search .radio input[type="radio"],.form-search .checkbox input[type="checkbox"],.form-inline .radio input[type="radio"],.form-inline .checkbox input[type="checkbox"]{float:left;margin-right:3px;margin-left:0}.control-group{margin-bottom:10px}.control-group.-no-margin{margin-bottom:0}legend+.control-group{margin-top:20px;-webkit-margin-top-collapse:separate}.form-horizontal .control-group{margin-bottom:20px;*zoom:1}.form-horizontal .control-group:before,.form-horizontal .control-group:after{display:table;line-height:0;content:""}.form-horizontal .control-group:after{clear:both}.form-horizontal .control-label{float:left;width:160px;padding-top:5px;text-align:right}.form-horizontal .controls{*display:inline-block;*padding-left:20px;margin-left:180px;*margin-left:0}.form-horizontal .controls:first-child{*padding-left:180px}.form-horizontal .help-block{margin-bottom:0}.form-horizontal input+.help-block,.form-horizontal select+.help-block,.form-horizontal textarea+.help-block,.form-horizontal .uneditable-input+.help-block,.form-horizontal .input-prepend+.help-block,.form-horizontal .input-append+.help-block{margin-top:10px}.form-horizontal .form-actions{padding-left:180px}.umb-panel-buttons .umb-btn-toolbar .btn{position:relative;z-index:1000}@media(max-width:767px){.form-horizontal .control-label{width:100%}.form-horizontal .controls{margin-left:0}}.umb-modalcolumn{background:white}.umb-modalcolumn-header{height:94px;padding:5px 20px 0 20px;white-space:nowrap;background:#f8f8f8;border-bottom:1px solid #d9d9d9}.umb-modalcolumn-header h1{padding-top:10px!important;margin:0;font-size:17.5px;font-weight:400;white-space:nowrap}.umb-modalcolumn-body{position:absolute;top:100px;right:0;bottom:0;left:0;padding:0;overflow:auto;background:#fff}.no-padding .umb-modalcolumn-body{padding:0}.umb-modalcolumn .umb-modalcolumn-header .btn{position:absolute;top:13px;right:15px}.umb-modalcolumn iframe.auto-expand,.umb-modal iframe.auto-expand{position:absolute;top:0;right:0;bottom:0;left:0;padding:0;margin:0;border:0}.umb-modal .umb-loader-wrapper,.umb-modalcolumn .umb-loader-wrapper,.umb-dialog .umb-loader-wrapper{position:relative;margin:20px -20px}.umb-modal-left .umb-panel-header .umb-headline,.umb-modal-left .umb-panel-header h1{width:auto;padding-left:0}.umb-dialog{position:absolute;top:0;right:0;bottom:0;left:0;padding:0;outline:0}.umb-dialog .umb-btn-toolbar{padding:15px 20px 10px 20px;margin-top:30px;clear:both;text-align:right;background:#fff}.umb-dialog .umb-btn-toolbar .umb-control-group{padding:none;border:0}.umb-dialog-body{position:absolute;top:0;right:0;bottom:90px;left:0;overflow:auto}.umb-dialog-body .umb-pane{margin-top:15px}.umb-dialog-footer{position:absolute;right:0;bottom:0;left:0;height:60px;overflow:auto;text-align:right;border-top:#efefef 1px solid}.umbracoDialog{width:auto!Important;height:auto!Important;padding:20px}.umbracoDialog .umb-pane{margin-top:0;margin-right:0;margin-left:0}.umbracoDialog .umb-dialog-body .umb-pane{margin-top:20px;margin-right:20px;margin-left:20px}.umbracoDialog form{height:100%}.umbracoDialog .controls-row,.umb-modal .controls-row{margin-left:0!important}.modal{border-radius:0!important}.modal.fade.in{border:none!important}.umb-modal.fade{top:0!important;left:-100%!important;width:0!important;height:100%!important;outline:0;transition:opacity .3s linear,top .3s ease-out}.umb-modal.fade.in{top:0!important;left:100%!important;display:block;width:440px!important;height:100%!important;margin-left:-440px}.umb-modal-left.fade{top:0!important;left:-100%!important;width:0!important;height:100%!important;transition:opacity .3s linear,top .3s ease-out}.umb-modal-left.fade.in{top:0!important;left:0!important;display:block;width:440px!important;height:100%!important;margin-left:80px}.umb-modal .umb-panel-header{height:auto;padding:20px;background:#fff;border:0}.umb-modal .umb-panel-body{padding:0 20px 0 20px}.umb-modal.fade.in.wide{width:640px!important;margin-left:-640px}.umb-modal i{font-size:14px}.umb-modal .breadcrumb{padding:0;background:0}.umb-modal .breadcrumb input{height:12px}.umb-modal.ysod{z-index:10000}.umb-panel{position:absolute;top:0;right:0;bottom:0;left:0;background:white}.umb-panel-nobody{padding-top:100px;overflow:auto}.umb-panel-header{position:absolute;top:0;right:0;left:0;height:99px;background:#f8f8f8;border-bottom:1px solid #d9d9d9}.umb-panel-body{position:absolute;top:101px;right:0;bottom:0;left:0;overflow:auto;clear:both}.umb-panel-body.no-header{top:20px}.umb-panel-body.with-footer{bottom:90px}.umb-mediapicker-upload{display:-ms-flexbox;display:flex}.umb-mediapicker-upload .form-search{-ms-flex:1;flex:1}.umb-mediapicker-upload .upload-button{margin-left:16px}.umb-panel.editor-breadcrumb .umb-panel-body,.umb-panel.editor-breadcrumb .umb-bottom-bar{bottom:31px!important}.umb-panel-header .umb-headline,.umb-panel-header h1{width:100%;height:auto;padding:3px 5px;margin:15px 0 0 20px;font-size:16px;line-height:1.4;background:0;border:0;border:1px solid #f8f8f8}.umb-panel-header .umb-headline:focus,.umb-panel-header .umb-headline:active{background-color:#fff;border:1px solid #d9d9d9}.umb-headline-editor-wrapper{position:relative}.umb-headline-editor-wrapper .help-inline{position:absolute;top:25px;right:0;font-size:10px;color:#9d261d}.umb-panel-header p{margin:0 20px}.umb-btn-toolbar .dimmed,.umb-dimmed{opacity:.6}.umb-headline-editor-wrapper input{padding:0 0 2px 0;margin:-6px 0 0 0;line-height:normal;letter-spacing:-0.01em;color:#000;background:0;border:0;border:1px solid transparent;border-radius:0}.umb-headline-editor-wrapper input.ng-invalid{color:#9d261d}.umb-headline-editor-wrapper input.ng-invalid::-moz-placeholder,.umb-headline-editor-wrapper input.ng-invalid:-ms-input-placeholder,.umb-headline-editor-wrapper input.ng-invalid::-webkit-input-placeholder{line-height:22px;color:#9d261d}.umb-panel-header-meta{height:50px}.umb-panel-header .umb-btn-toolbar{float:right;padding:5px 20px 0 0}.umb-panel-footer{position:absolute;right:0;bottom:0;left:0;z-index:999;padding:20px;margin:0}.umb-btn-toolbar .dropdown-menu{right:0;left:auto;z-index:6020;padding:0;border-radius:0;box-shadow:none}.umb-btn-toolbar .dropdown-menu small{display:block;padding:10px 20px;background:#fef9db}.umb-btn-toolbar .dropdown-menu .btn{width:80px;margin:20px 29px}.umb-bottom-bar{position:fixed;right:40px;bottom:0;left:100px;z-index:6010;padding:10px 0 10px 0;background:white;border-top:1px solid #f8f8f8;box-shadow:0 -18px 20px #fff}@media(min-width:1101px){.umb-bottom-bar{left:460px}}@media(max-width:767px){.umb-bottom-bar{left:80px}}@media(max-width:500px){.umb-bottom-bar{left:60px}}.umb-tab-buttons{padding-left:0}.umb-tab-buttons>.btn-group:not([style*="display:none"]):not([style*="display: none"]){margin-left:0}@media(min-width:768px){.umb-tab-buttons{padding-left:180px}}.umb-tab-pane{padding-bottom:90px}.tab-content{overflow:visible}.umb-panel-footer-nav{position:absolute;right:0;bottom:0;left:0;display:block;height:30px;margin:0;overflow:hidden;background:#f8f8f8;border-top:#d9d9d9 1px solid}.umb-panel-footer-nav li a{position:relative;display:block;float:left;height:30px;padding:8px 0 8px 30px;margin:0 1px 0 0;font-size:11px;color:#555;text-align:center;text-decoration:none;background:#f8f8f8;border-radius:0}.umb-panel-footer-nav li a:after{position:absolute;top:0;right:-16px;z-index:1;border-top:16px solid transparent;border-bottom:16px solid transparent;border-left:16px solid #f8f8f8;content:""}.umb-panel-footer-nav li a:before{position:absolute;top:0;left:0;border-top:16px solid transparent;border-bottom:16px solid transparent;border-left:16px solid #d9d9d9;content:""}.umb-panel-footer-nav li:first-child a{padding-left:20px}.umb-panel-footer-nav li:first-child a:before{display:none}.umb-panel-footer-nav li:last-child a:after{display:none}.umb-dialog .muted,.umb-panel .muted{color:#7f7f7f}.umb-dialog a.muted:hover,.umb-dialog a.muted:focus,.umb-panel a.muted:hover,.umb-panel a.muted:focus{color:#666}.umb-dialog .text-warning,.umb-panel .text-warning{color:#df7f48}.umb-dialog a.text-warning:hover,.umb-dialog a.text-warning:focus,.umb-panel a.text-warning:hover,.umb-panel a.text-warning:focus{color:#d06324}.umb-dialog .text-error,.umb-panel .text-error{color:#9d261d}.umb-dialog a.text-error:hover,.umb-dialog a.text-error:focus,.umb-panel a.text-error:hover,.umb-panel a.text-error:focus{color:#721c15}.umb-dialog .text-info,.umb-panel .text-info{color:#2e8aea}.umb-dialog a.text-info:hover,.umb-dialog a.text-info:focus,.umb-panel a.text-info:hover,.umb-panel a.text-info:focus{color:#1571d0}.umb-dialog .text-success,.umb-panel .text-success{color:#46a546}.umb-dialog a.text-success:hover,.umb-dialog a.text-success:focus,.umb-panel a.text-success:hover,.umb-panel a.text-success:focus{color:#378137}.external-logins form{margin:0}.external-logins button{margin:5px}.umb-panel-header-content-wrapper{display:-ms-flexbox;display:flex;height:100px;padding:0 20px;-ms-flex-direction:column;flex-direction:column}.umb-panel-header-content{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex:1;flex:1}.umb-panel-header-left-side{display:-ms-flexbox;display:flex;-ms-flex:1;flex:1;-ms-flex-direction:row;flex-direction:row}.umb-panel-header-left-side.-top-position{position:relative;top:-12px}.umb-panel-header-icon{display:-ms-flexbox;display:flex;height:55px;margin-right:5px;cursor:pointer;background:#fff;border:1px solid #ececec;animation:fadeIn .5s;-ms-flex-pack:center;justify-content:center;-ms-flex-align:center;align-items:center;-ms-flex:0 0 55px;flex:0 0 55px}.umb-panel-header-title-wrapper{position:relative;width:80%}.umb-panel-header-alias{position:absolute;top:5px;right:10px}.umb-panel-header-alias .umb-locked-field{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center}.umb-panel-header-alias .umb-locked-field,.umb-panel-header-alias .umb-locked-field .umb-locked-field__wrapper{margin-bottom:0}.umb-panel-header-alias .umb-validation-label:after{visibility:hidden}.umb-panel-header-alias .umb-locked-field:after{display:none}.umb-panel-header-icon.-placeholder{border:1px dashed #d9d9d9}.umb-panel-header-icon .icon{font-size:35px;color:#d9d9d9}.umb-panel-header-icon-text{font-size:10px;font-weight:bold;color:#2e8aea}.umb-panel-header .umb-nav-tabs{bottom:-1px}input.umb-panel-header-name-input{width:100%;height:30px;margin-bottom:0;font-size:15px;font-weight:bold;line-height:30px;color:#000;border-color:#ececec;box-sizing:border-box}input.umb-panel-header-name-input:hover{background:#fff;border:1px solid #ccc}input.umb-panel-header-name-input.name-is-empty{background:#fff;border:1px dashed #d9d9d9}.umb-panel-header-name{font-size:16px;font-weight:bold}input.umb-panel-header-description{width:100%;height:25px;margin-bottom:0;font-size:12px;line-height:25px;background:transparent;border-color:transparent;box-sizing:border-box}input.umb-panel-header-description:hover{background:#fff;border-color:#ccc}.umb-editor-drawer-content{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center}.umb-editor-drawer-content__right-side{padding-left:10px;margin-left:auto;-ms-flex:0 0 auto;flex:0 0 auto}.umb-editor-drawer-content__left-side{padding-right:10px;margin-right:auto}ul.sections{display:block;width:80px;height:100%;margin:0;background:#1d1d1d;border-right:1px solid #343434}ul.sections li{display:block;border-left:4px #1d1d1d solid;transition:all .3s linear}ul.sections li [class^="icon-"],ul.sections li [class*=" icon-"],ul.sections li img.icon-section{display:inline-block;margin:1px 0 0 0;font-size:30px;line-height:20px;opacity:.4;transition:all .3s linear}ul.sections:hover li [class^="icon-"],ul.sections:hover li [class*=" icon-"],ul.sections:hover li img.icon-section{opacity:1}ul.sections li a{display:block;width:100%;height:100%;padding:20px 4px 4px 0;margin:0 0 0 -4px;color:#d9d9d9;text-align:center;text-decoration:none;cursor:pointer;border-bottom:1px solid #343434}ul.sections a span{display:block;font-size:10px;line-height:1.4em;opacity:0;transition:all .3s linear}ul.sections:hover a span{opacity:1}ul.sections li.avatar{height:75px;padding:22px 0 2px 0;margin:0 0 0 -4px;text-align:center;border-bottom:1px solid #343434}ul.sections li.avatar a{width:40px;height:40px;padding:0;margin:0 auto;border:0}ul.sections li.avatar a img{width:30px;border-radius:50%}.faded ul.sections li{opacity:.4}ul.sections li.current,ul.sections li:hover{border-left:4px #df7f48 solid}ul.sections li.avatar.current,ul.sections li.avatar:hover{border-left:4px #1d1d1d solid}ul.sections li.current a{padding-left:0}ul.sections li.help{position:absolute;bottom:0;left:0;display:block;width:calc(100% - 5px);margin:0}ul.sections li.help a{border-bottom:0}@media(max-width:500px){ul.sections li [class^="icon-"],ul.sections li [class*=" icon-"]{font-size:25px}ul.sections li:not(.avatar) a{padding-top:12px;padding-bottom:6px}ul.sections li:not(.avatar) a .icon,ul.sections li:not(.avatar) a .icon-section{display:inline-block;padding-left:2px}ul.sections a span{display:none}}li.expand a,li.expand{border:none!important}li.expand>a>i.icon{transition:all .3s linear}li.expand.open>a>i.icon{transform:rotate(180deg)}ul.sections-tray{width:80px;padding-top:99px}ul.sections-tray>li:first-child>a{border-top:1px solid #343434}ul.sections-tray>li{border-left-width:5px}ul.sections-tray>li.current,ul.sections-tray>li:hover{border-left-width:5px}@font-face{font-family:'icomoon';font-style:normal;font-weight:normal;src:url('../fonts/helveticons/helveticons.eot');src:url('../fonts/helveticons/helveticons.eot?#iefix') format('embedded-opentype'),url('../fonts/helveticons/helveticons.ttf') format('truetype'),url('../fonts/helveticons/helveticons.svg#icomoon') format('svg')}[class^="icon-"],[class*=" icon-"]{*margin-right:.3em;font-family:icomoon;-webkit-font-smoothing:antialiased;font-style:normal;font-weight:normal;text-decoration:inherit}[class^="icon-"]:before,[class*=" icon-"]:before{display:inline-block;text-decoration:inherit;speak:none}i.large{font-size:32px}i.medium{font-size:24px}i.small{font-size:14px}.icon-zoom-out:before{content:"\e000"}.icon-truck:before{content:"\e001"}.icon-zoom-in:before{content:"\e002"}.icon-zip:before{content:"\e003"}.icon-axis-rotation:before{content:"\e004"}.icon-yen-bag:before{content:"\e005"}.icon-axis-rotation-2:before{content:"\e006"}.icon-axis-rotation-3:before{content:"\e007"}.icon-wrench:before{content:"\e008"}.icon-wine-glass:before{content:"\e009"}.icon-wrong:before{content:"\e00a"}.icon-windows:before{content:"\e00b"}.icon-window-sizes:before{content:"\e00c"}.icon-window-popin:before{content:"\e00d"}.icon-wifi:before{content:"\e00e"}.icon-width:before{content:"\e00f"}.icon-weight:before{content:"\e010"}.icon-war:before{content:"\e011"}.icon-wand:before{content:"\e012"}.icon-wallet:before{content:"\e013"}.icon-wall-plug:before{content:"\e014"}.icon-voice:before{content:"\e016"}.icon-video:before{content:"\e017"}.icon-vcard:before{content:"\e018"}.icon-utilities:before{content:"\e019"}.icon-users:before{content:"\e01a"}.icon-users-alt:before{content:"\e01b"}.icon-user:before{content:"\e01c"}.icon-user-glasses:before{content:"\e01d"}.icon-user-females:before{content:"\e01e"}.icon-user-females-alt:before{content:"\e01f"}.icon-user-female:before{content:"\e020"}.icon-usb:before{content:"\e021"}.icon-usb-connector:before{content:"\e022"}.icon-unlocked:before{content:"\e023"}.icon-universal:before{content:"\e024"}.icon-undo:before{content:"\e025"}.icon-umbrella:before{content:"\e026"}.icon-umb-deploy:before{content:"\e027"}.icon-umb-contour:before,.traycontour:before{content:"\e028"}.icon-umb-settings:before,.traysettings:before{content:"\e029"}.icon-umb-users:before,.trayuser:before,.trayusers:before{content:"\e02a"}.icon-umb-media:before,.traymedia:before{content:"\e02b"}.icon-umb-content:before,.traycontent:before{content:"\e02c"}.icon-umb-developer:before,.traydeveloper:before{content:"\e02d"}.icon-umb-members:before,.traymember:before{content:"\e015"}.icon-umb-translation:before,.traytranslation:before{content:"\e1fd"}.icon-tv:before{content:"\e02e"}.icon-tv-old:before{content:"\e02f"}.icon-trophy:before{content:"\e030"}.icon-tree:before{content:"\e031"}.icon-trash:before{content:"\e032"}.icon-trash-alt:before{content:"\e033"}.icon-trash-alt-2:before{content:"\e034"}.icon-train:before{content:"\e035"}.icon-trafic:before{content:"\e036"}.icon-traffic-alt:before{content:"\e037"}.icon-top:before{content:"\e038"}.icon-tools:before{content:"\e039"}.icon-timer:before{content:"\e03a"}.icon-time:before{content:"\e03b"}.icon-t-shirt:before{content:"\e03c"}.icon-tab-key:before{content:"\e03d"}.icon-tab:before{content:"\e03e"}.icon-tactics:before{content:"\e03f"}.icon-tag:before{content:"\e040"}.icon-tags:before{content:"\e041"}.icon-takeaway-cup:before{content:"\e042"}.icon-target:before{content:"\e043"}.icon-temperatrure-alt:before{content:"\e044"}.icon-temperature:before{content:"\e045"}.icon-terminal:before{content:"\e046"}.icon-theater:before{content:"\e047"}.icon-theif:before{content:"\e048"}.icon-thought-bubble:before{content:"\e049"}.icon-thumb-down:before{content:"\e04a"}.icon-thumb-up:before{content:"\e04b"}.icon-thumbnail-list:before{content:"\e04c"}.icon-thumbnails-small:before{content:"\e04d"}.icon-thumbnails:before{content:"\e04e"}.icon-ticket:before{content:"\e04f"}.icon-sync:before{content:"\e050"}.icon-sweatshirt:before{content:"\e051"}.icon-sunny:before{content:"\e052"}.icon-stream:before{content:"\e053"}.icon-store:before{content:"\e054"}.icon-stop:before{content:"\e055"}.icon-stop-hand:before{content:"\e056"}.icon-stop-alt:before{content:"\e057"}.icon-stamp:before{content:"\e058"}.icon-stacked-disks:before{content:"\e059"}.icon-ssd:before{content:"\e05a"}.icon-squiggly-line:before{content:"\e05b"}.icon-sprout:before{content:"\e05c"}.icon-split:before{content:"\e05d"}.icon-split-alt:before{content:"\e05e"}.icon-speed-gauge:before{content:"\e05f"}.icon-speaker:before{content:"\e060"}.icon-sound:before{content:"\e061"}.icon-spades:before{content:"\e062"}.icon-sound-waves:before{content:"\e063"}.icon-shipping-box:before{content:"\e064"}.icon-shipping:before{content:"\e065"}.icon-shoe:before{content:"\e066"}.icon-shopping-basket-alt-2:before{content:"\e067"}.icon-shopping-basket:before{content:"\e068"}.icon-shopping-basket-alt:before{content:"\e069"}.icon-shorts:before{content:"\e06a"}.icon-shuffle:before{content:"\e06b"}.icon-sience:before{content:"\e06c"}.icon-simcard:before{content:"\e06d"}.icon-single-note:before{content:"\e06e"}.icon-sitemap:before{content:"\e06f"}.icon-sleep:before{content:"\e070"}.icon-slideshow:before{content:"\e071"}.icon-smiley-inverted:before{content:"\e072"}.icon-smiley:before{content:"\e073"}.icon-snow:before{content:"\e074"}.icon-sound-low:before{content:"\e075"}.icon-sound-medium:before{content:"\e076"}.icon-sound-off:before{content:"\e077"}.icon-shift:before{content:"\e078"}.icon-shield:before{content:"\e079"}.icon-sharing-iphone:before{content:"\e07a"}.icon-share:before{content:"\e07b"}.icon-share-alt:before{content:"\e07c"}.icon-share-alt-2:before{content:"\e07d"}.icon-settings:before{content:"\e07e"}.icon-settings-alt:before{content:"\e07f"}.icon-settings-alt-2:before{content:"\e080"}.icon-server:before{content:"\e081"}.icon-server-alt:before{content:"\e082"}.icon-sensor:before{content:"\e083"}.icon-security-camera:before{content:"\e084"}.icon-search:before{content:"\e085"}.icon-scull:before{content:"\e086"}.icon-script:before{content:"\e087"}.icon-script-alt:before{content:"\e088"}.icon-screensharing:before{content:"\e089"}.icon-school:before{content:"\e08a"}.icon-scan:before{content:"\e08b"}.icon-refresh:before{content:"\e08c"}.icon-remote:before{content:"\e08d"}.icon-remove:before{content:"\e08e"}.icon-repeat-one:before{content:"\e08f"}.icon-repeat:before{content:"\e090"}.icon-resize:before{content:"\e091"}.icon-reply-arrow:before{content:"\e092"}.icon-return-to-top:before{content:"\e093"}.icon-right-double-arrow:before{content:"\e094"}.icon-road:before{content:"\e095"}.icon-roadsign:before{content:"\e096"}.icon-rocket:before{content:"\e097"}.icon-rss:before{content:"\e098"}.icon-ruler-alt:before{content:"\e099"}.icon-ruler:before{content:"\e09a"}.icon-sandbox-toys:before{content:"\e09b"}.icon-satellite-dish:before{content:"\e09c"}.icon-save:before{content:"\e09d"}.icon-safedial:before{content:"\e09e"}.icon-safe:before{content:"\e09f"}.icon-redo:before{content:"\e0a0"}.icon-printer-alt:before{content:"\e0a1"}.icon-planet:before{content:"\e0a2"}.icon-paste-in:before{content:"\e0a3"}.icon-os-x:before{content:"\e0a4"}.icon-navigation-left:before{content:"\e0a5"}.icon-message:before{content:"\e0a6"}.icon-lock:before{content:"\e0a7"}.icon-layers-alt:before{content:"\e0a8"}.icon-record:before{content:"\e0a9"}.icon-print:before{content:"\e0aa"}.icon-plane:before{content:"\e0ab"}.icon-partly-cloudy:before{content:"\e0ac"}.icon-ordered-list:before{content:"\e0ad"}.icon-navigation-last:before{content:"\e0ae"}.icon-message-unopened:before{content:"\e0af"}.icon-location-nearby:before{content:"\e0b0"}.icon-laptop:before{content:"\e0b1"}.icon-reception:before{content:"\e0b2"}.icon-price-yen:before{content:"\e0b3"}.icon-piracy:before{content:"\e0b4"}.icon-parental-control:before{content:"\e0b5"}.icon-operator:before{content:"\e0b6"}.icon-navigation-horizontal:before{content:"\e0b7"}.icon-message-open:before{content:"\e0b8"}.icon-lab:before{content:"\e0b9"}.icon-location-near-me:before{content:"\e0ba"}.icon-receipt-yen:before{content:"\e0bb"}.icon-price-pound:before{content:"\e0bc"}.icon-pin-location:before{content:"\e0bd"}.icon-parachute-drop:before{content:"\e0be"}.icon-old-phone:before{content:"\e0bf"}.icon-merge:before{content:"\e0c0"}.icon-navigation-first:before{content:"\e0c1"}.icon-locate:before{content:"\e0c2"}.icon-keyhole:before{content:"\e0c3"}.icon-receipt-pound:before{content:"\e0c4"}.icon-price-euro:before{content:"\e0c5"}.icon-piggy-bank:before{content:"\e0c6"}.icon-paper-plane:before{content:"\e0c7"}.icon-old-key:before{content:"\e0c8"}.icon-navigation-down:before{content:"\e0c9"}.icon-megaphone:before{content:"\e0ca"}.icon-loading:before{content:"\e0cb"}.icon-keychain:before{content:"\e0cc"}.icon-receipt-euro:before{content:"\e0cd"}.icon-price-dollar:before{content:"\e0ce"}.icon-pie-chart:before{content:"\e0cf"}.icon-paper-plane-alt:before{content:"\e0d0"}.icon-notepad:before{content:"\e0d1"}.icon-navigation-bottom:before{content:"\e0d2"}.icon-meeting:before{content:"\e0d3"}.icon-keyboard:before{content:"\e0d4"}.icon-load:before{content:"\e0d5"}.icon-receipt-dollar:before{content:"\e0d6"}.icon-previous:before{content:"\e0d7"}.icon-pictures:before{content:"\e0d8"}.icon-notepad-alt:before{content:"\e0d9"}.icon-paper-bag:before{content:"\e0da"}.icon-name-badge:before{content:"\e0db"}.icon-medicine:before{content:"\e0dc"}.icon-list:before{content:"\e0dd"}.icon-key:before{content:"\e0de"}.icon-receipt-alt:before{content:"\e0df"}.icon-previous-media:before{content:"\e0e0"}.icon-pictures-alt:before{content:"\e0e1"}.icon-pants:before{content:"\e0e2"}.icon-nodes:before{content:"\e0e3"}.icon-music:before{content:"\e0e4"}.icon-readonly:before{content:"\e0e5"}.icon-presentation:before{content:"\e0e6"}.icon-pictures-alt-2:before{content:"\e0e7"}.icon-pannel-close:before{content:"\e0e8"}.icon-next:before{content:"\e0e9"}.icon-multiple-windows:before{content:"\e0ea"}.icon-medical-emergency:before{content:"\e0eb"}.icon-medal:before{content:"\e0ec"}.icon-link:before{content:"\e0ed"}.icon-linux-tux:before{content:"\e0ee"}.icon-junk:before{content:"\e0ef"}.icon-item-arrangement:before{content:"\e0f0"}.icon-iphone:before{content:"\e0f1"}.icon-lightning:before{content:"\e0f2"}.icon-map:before{content:"\e0f3"}.icon-multiple-credit-cards:before{content:"\e0f4"}.icon-next-media:before{content:"\e0f5"}.icon-panel-show:before{content:"\e0f6"}.icon-picture:before{content:"\e0f7"}.icon-power:before{content:"\e0f8"}.icon-re-post:before{content:"\e0f9"}.icon-rate:before{content:"\e0fa"}.icon-rain:before{content:"\e0fb"}.icon-radio:before{content:"\e0fc"}.icon-radio-receiver:before{content:"\e0fd"}.icon-radio-alt:before{content:"\e0fe"}.icon-quote:before{content:"\e0ff"}.icon-qr-code:before{content:"\e100"}.icon-pushpin:before{content:"\e101"}.icon-pulse:before{content:"\e102"}.icon-projector:before{content:"\e103"}.icon-play:before{content:"\e104"}.icon-playing-cards:before{content:"\e105"}.icon-playlist:before{content:"\e106"}.icon-plugin:before{content:"\e107"}.icon-podcast:before{content:"\e108"}.icon-poker-chip:before{content:"\e109"}.icon-poll:before{content:"\e10a"}.icon-post-it:before{content:"\e10b"}.icon-pound-bag:before{content:"\e10c"}.icon-power-outlet:before{content:"\e10d"}.icon-photo-album:before{content:"\e10e"}.icon-phone:before{content:"\e10f"}.icon-phone-ring:before{content:"\e110"}.icon-people:before{content:"\e111"}.icon-people-female:before{content:"\e112"}.icon-people-alt:before{content:"\e113"}.icon-people-alt-2:before{content:"\e114"}.icon-pc:before{content:"\e115"}.icon-pause:before{content:"\e116"}.icon-path:before{content:"\e117"}.icon-out:before{content:"\e118"}.icon-outbox:before{content:"\e119"}.icon-outdent:before{content:"\e11a"}.icon-page-add:before{content:"\e11b"}.icon-page-down:before{content:"\e11c"}.icon-page-remove:before{content:"\e11d"}.icon-page-restricted:before{content:"\e11e"}.icon-page-up:before{content:"\e11f"}.icon-paint-roller:before{content:"\e120"}.icon-palette:before{content:"\e121"}.icon-newspaper:before{content:"\e122"}.icon-newspaper-alt:before{content:"\e123"}.icon-network-alt:before{content:"\e124"}.icon-navigational-arrow:before{content:"\e125"}.icon-navigation:before{content:"\e126"}.icon-navigation-vertical:before{content:"\e127"}.icon-navigation-up:before{content:"\e128"}.icon-navigation-top:before{content:"\e129"}.icon-navigation-road:before{content:"\e12a"}.icon-navigation-right:before{content:"\e12b"}.icon-microscope:before{content:"\e12c"}.icon-mindmap:before{content:"\e12d"}.icon-molecular-network:before{content:"\e12e"}.icon-molecular:before{content:"\e12f"}.icon-mountain:before{content:"\e130"}.icon-mouse-cursor:before{content:"\e131"}.icon-mouse:before{content:"\e132"}.icon-movie-alt:before{content:"\e133"}.icon-map-marker:before{content:"\e134"}.icon-movie:before{content:"\e135"}.icon-map-location:before{content:"\e136"}.icon-map-alt:before{content:"\e137"}.icon-male-symbol:before{content:"\e138"}.icon-male-and-female:before{content:"\e139"}.icon-mailbox:before{content:"\e13a"}.icon-magnet:before{content:"\e13b"}.icon-loupe:before{content:"\e13c"}.icon-mobile:before{content:"\e13d"}.icon-logout:before{content:"\e13e"}.icon-log-out:before{content:"\e13f"}.icon-layers:before{content:"\e140"}.icon-left-double-arrow:before{content:"\e141"}.icon-layout:before{content:"\e142"}.icon-legal:before{content:"\e143"}.icon-lense:before{content:"\e144"}.icon-library:before{content:"\e145"}.icon-light-down:before{content:"\e146"}.icon-light-up:before{content:"\e147"}.icon-lightbulb-active:before{content:"\e148"}.icon-lightbulb:before{content:"\e149"}.icon-ipad:before{content:"\e14a"}.icon-invoice:before{content:"\e14b"}.icon-info:before{content:"\e14c"}.icon-infinity:before{content:"\e14d"}.icon-indent:before{content:"\e14e"}.icon-inbox:before{content:"\e14f"}.icon-inbox-full:before{content:"\e150"}.icon-inactive-line:before{content:"\e151"}.icon-imac:before{content:"\e152"}.icon-hourglass:before{content:"\e153"}.icon-home:before{content:"\e154"}.icon-grid:before{content:"\e155"}.icon-food:before{content:"\e156"}.icon-favorite:before{content:"\e157"}.icon-door-open-alt:before{content:"\e158"}.icon-diagnostics:before{content:"\e159"}.icon-contrast:before{content:"\e15a"}.icon-coins-dollar-alt:before{content:"\e15b"}.icon-circle-dotted-active:before{content:"\e15c"}.icon-cinema:before{content:"\e15d"}.icon-chip:before{content:"\e15e"}.icon-chip-alt:before{content:"\e15f"}.icon-chess:before{content:"\e160"}.icon-checkbox:before{content:"\e161"}.icon-checkbox-empty:before{content:"\e162"}.icon-checkbox-dotted:before{content:"\e163"}.icon-checkbox-dotted-active:before{content:"\e164"}.icon-check:before{content:"\e165"}.icon-chat:before{content:"\e166"}.icon-chat-active:before{content:"\e167"}.icon-chart:before{content:"\e168"}.icon-chart-curve:before{content:"\e169"}.icon-certificate:before{content:"\e16a"}.icon-categories:before{content:"\e16b"}.icon-cash-register:before{content:"\e16c"}.icon-car:before{content:"\e16d"}.icon-caps-lock:before{content:"\e16e"}.icon-candy:before{content:"\e16f"}.icon-circle-dotted:before{content:"\e170"}.icon-circuits:before{content:"\e171"}.icon-circus:before{content:"\e172"}.icon-client:before{content:"\e173"}.icon-clothes-hanger:before{content:"\e174"}.icon-cloud-drive:before{content:"\e175"}.icon-cloud-upload:before{content:"\e176"}.icon-cloud:before{content:"\e177"}.icon-cloudy:before{content:"\e178"}.icon-clubs:before{content:"\e179"}.icon-cocktail:before{content:"\e17a"}.icon-code:before{content:"\e17b"}.icon-coffee:before{content:"\e17c"}.icon-coin-dollar:before{content:"\e17d"}.icon-coin-pound:before{content:"\e17e"}.icon-coin-yen:before{content:"\e17f"}.icon-coin:before{content:"\e180"}.icon-coins-alt:before{content:"\e181"}.icon-console:before{content:"\e182"}.icon-connection:before{content:"\e183"}.icon-compress:before{content:"\e184"}.icon-company:before{content:"\e185"}.icon-command:before{content:"\e186"}.icon-coin-euro:before{content:"\e187"}.icon-combination-lock:before{content:"\e188"}.icon-combination-lock-open:before{content:"\e189"}.icon-comb:before{content:"\e18a"}.icon-columns:before{content:"\e18b"}.icon-colorpicker:before{content:"\e18c"}.icon-color-bucket:before{content:"\e18d"}.icon-coins:before{content:"\e18e"}.icon-coins-yen:before{content:"\e18f"}.icon-coins-yen-alt:before{content:"\e190"}.icon-coins-pound:before{content:"\e191"}.icon-coins-pound-alt:before{content:"\e192"}.icon-coins-euro:before{content:"\e193"}.icon-coins-euro-alt:before{content:"\e194"}.icon-coins-dollar:before{content:"\e195"}.icon-conversation-alt:before{content:"\e196"}.icon-conversation:before{content:"\e197"}.icon-coverflow:before{content:"\e198"}.icon-credit-card-alt:before{content:"\e199"}.icon-credit-card:before{content:"\e19a"}.icon-crop:before{content:"\e19b"}.icon-crosshair:before{content:"\e19c"}.icon-crown-alt:before{content:"\e19d"}.icon-crown:before{content:"\e19e"}.icon-cupcake:before{content:"\e19f"}.icon-curve:before{content:"\e1a0"}.icon-cut:before{content:"\e1a1"}.icon-dashboard:before{content:"\e1a2"}.icon-defrag:before{content:"\e1a3"}.icon-delete:before{content:"\e1a4"}.icon-delete-key:before{content:"\e1a5"}.icon-departure:before{content:"\e1a6"}.icon-desk:before{content:"\e1a7"}.icon-desktop:before{content:"\e1a8"}.icon-donate:before{content:"\e1a9"}.icon-dollar-bag:before{content:"\e1aa"}.icon-documents:before{content:"\e1ab"}.icon-document:before{content:"\e1ac"}.icon-document-dashed-line:before{content:"\e1ad"}.icon-dock-connector:before{content:"\e1ae"}.icon-dna:before{content:"\e1af"}.icon-display:before{content:"\e1b0"}.icon-disk-image:before{content:"\e1b1"}.icon-disc:before{content:"\e1b2"}.icon-directions:before{content:"\e1b3"}.icon-directions-alt:before{content:"\e1b4"}.icon-diploma:before{content:"\e1b5"}.icon-diploma-alt:before{content:"\e1b6"}.icon-dice:before{content:"\e1b7"}.icon-diamonds:before{content:"\e1b8"}.icon-diamond:before{content:"\e1b9"}.icon-diagonal-arrow:before{content:"\e1ba"}.icon-diagonal-arrow-alt:before{content:"\e1bb"}.icon-door-open:before{content:"\e1bc"}.icon-download-alt:before{content:"\e1bd"}.icon-download:before{content:"\e1be"}.icon-drop:before{content:"\e1bf"}.icon-eco:before{content:"\e1c0"}.icon-economy:before{content:"\e1c1"}.icon-edit:before{content:"\e1c2"}.icon-eject:before{content:"\e1c3"}.icon-employee:before{content:"\e1c4"}.icon-energy-saving-bulb:before{content:"\e1c5"}.icon-enter:before{content:"\e1c6"}.icon-equalizer:before{content:"\e1c7"}.icon-escape:before{content:"\e1c8"}.icon-ethernet:before{content:"\e1c9"}.icon-euro-bag:before{content:"\e1ca"}.icon-exit-fullscreen:before{content:"\e1cb"}.icon-eye:before{content:"\e1cc"}.icon-facebook-like:before{content:"\e1cd"}.icon-factory:before{content:"\e1ce"}.icon-font:before{content:"\e1cf"}.icon-folders:before{content:"\e1d0"}.icon-folder:before,.icon-folder-close:before{content:"\e1d1"}.icon-folder-outline:before{content:"\e1d2"}.icon-folder-open:before{content:"\e1d3"}.icon-flowerpot:before{content:"\e1d4"}.icon-flashlight:before{content:"\e1d5"}.icon-flash:before{content:"\e1d6"}.icon-flag:before{content:"\e1d7"}.icon-flag-alt:before{content:"\e1d8"}.icon-firewire:before{content:"\e1d9"}.icon-firewall:before{content:"\e1da"}.icon-fire:before{content:"\e1db"}.icon-fingerprint:before{content:"\e1dc"}.icon-filter:before{content:"\e1dd"}.icon-filter-arrows:before{content:"\e1de"}.icon-files:before{content:"\e1df"}.icon-file-cabinet:before{content:"\e1e0"}.icon-female-symbol:before{content:"\e1e1"}.icon-footprints:before{content:"\e1e2"}.icon-hammer:before{content:"\e1e3"}.icon-hand-active-alt:before{content:"\e1e4"}.icon-forking:before{content:"\e1e5"}.icon-hand-active:before{content:"\e1e6"}.icon-hand-pointer-alt:before{content:"\e1e7"}.icon-hand-pointer:before{content:"\e1e8"}.icon-handprint:before{content:"\e1e9"}.icon-handshake:before{content:"\e1ea"}.icon-handtool:before{content:"\e1eb"}.icon-hard-drive:before{content:"\e1ec"}.icon-help:before{content:"\e1ed"}.icon-graduate:before{content:"\e1ee"}.icon-gps:before{content:"\e1ef"}.icon-help-alt:before{content:"\e1f0"}.icon-height:before{content:"\e1f1"}.icon-globe:before{content:"\e1f2"}.icon-hearts:before{content:"\e1f3"}.icon-globe-inverted-europe-africa:before{content:"\e1f4"}.icon-headset:before{content:"\e1f5"}.icon-globe-inverted-asia:before{content:"\e1f6"}.icon-headphones:before{content:"\e1f7"}.icon-globe-inverted-america:before{content:"\e1f8"}.icon-hd:before{content:"\e1f9"}.icon-globe-europe---africa:before{content:"\e1fa"}.icon-hat:before{content:"\e1fb"}.icon-globe-asia:before{content:"\e1fc"}.icon-globe-alt:before{content:"\e1fd"}.icon-hard-drive-alt:before{content:"\e1fe"}.icon-glasses:before{content:"\e1ff"}.icon-gift:before{content:"\e200"}.icon-handtool-alt:before{content:"\e201"}.icon-geometry:before{content:"\e202"}.icon-game:before{content:"\e203"}.icon-fullscreen:before{content:"\e204"}.icon-fullscreen-alt:before{content:"\e205"}.icon-frame:before{content:"\e206"}.icon-frame-alt:before{content:"\e207"}.icon-camera-roll:before{content:"\e208"}.icon-bookmark:before{content:"\e209"}.icon-bill:before{content:"\e20a"}.icon-baby-stroller:before{content:"\e20b"}.icon-alarm-clock:before{content:"\e20c"}.icon-adressbook:before{content:"\e20d"}.icon-add:before{content:"\e20e"}.icon-activity:before{content:"\e20f"}.icon-untitled:before{content:"\e210"}.icon-glasses:before{content:"\e211"}.icon-camcorder:before{content:"\e212"}.icon-calendar:before{content:"\e213"}.icon-calendar-alt:before{content:"\e214"}.icon-calculator:before{content:"\e215"}.icon-bus:before{content:"\e216"}.icon-burn:before{content:"\e217"}.icon-bulleted-list:before{content:"\e218"}.icon-bug:before{content:"\e219"}.icon-brush:before{content:"\e21a"}.icon-brush-alt:before{content:"\e21b"}.icon-brush-alt-2:before{content:"\e21c"}.icon-browser-window:before{content:"\e21d"}.icon-briefcase:before{content:"\e21e"}.icon-brick:before{content:"\e21f"}.icon-brackets:before{content:"\e220"}.icon-box:before{content:"\e221"}.icon-box-open:before{content:"\e222"}.icon-box-alt:before{content:"\e223"}.icon-books:before{content:"\e224"}.icon-billboard:before{content:"\e225"}.icon-bills-dollar:before{content:"\e226"}.icon-bills-euro:before{content:"\e227"}.icon-bills-pound:before{content:"\e228"}.icon-bills-yen:before{content:"\e229"}.icon-bills:before{content:"\e22a"}.icon-binarycode:before{content:"\e22b"}.icon-binoculars:before{content:"\e22c"}.icon-bird:before{content:"\e22d"}.icon-birthday-cake:before{content:"\e22e"}.icon-blueprint:before{content:"\e22f"}.icon-block:before{content:"\e230"}.icon-bluetooth:before{content:"\e231"}.icon-boat-shipping:before{content:"\e232"}.icon-bomb:before{content:"\e233"}.icon-book-alt-2:before{content:"\e234"}.icon-bones:before{content:"\e235"}.icon-book-alt:before{content:"\e236"}.icon-book:before{content:"\e237"}.icon-bill-yen:before{content:"\e238"}.icon-award:before{content:"\e239"}.icon-bill-pound:before{content:"\e23a"}.icon-autofill:before{content:"\e23b"}.icon-bill-euro:before{content:"\e23c"}.icon-auction-hammer:before{content:"\e23d"}.icon-bill-dollar:before{content:"\e23e"}.icon-attachment:before{content:"\e23f"}.icon-bell:before{content:"\e240"}.icon-article:before{content:"\e241"}.icon-bell-off:before{content:"\e242"}.icon-art-easel:before{content:"\e243"}.icon-beer-glass:before{content:"\e244"}.icon-arrow-up:before{content:"\e245"}.icon-battery-low:before{content:"\e246"}.icon-arrow-right:before{content:"\e247"}.icon-battery-full:before{content:"\e248"}.icon-arrow-left:before{content:"\e249"}.icon-bars:before{content:"\e24a"}.icon-arrow-down:before{content:"\e24b"}.icon-barcode:before{content:"\e24c"}.icon-arrivals:before{content:"\e24d"}.icon-bar-chart:before{content:"\e24e"}.icon-application-window:before{content:"\e24f"}.icon-band-aid:before{content:"\e250"}.icon-application-window-alt:before{content:"\e251"}.icon-ball:before{content:"\e252"}.icon-application-error:before{content:"\e253"}.icon-badge-restricted:before{content:"\e254"}.icon-app:before{content:"\e255"}.icon-badge-remove:before{content:"\e256"}.icon-anchor:before{content:"\e257"}.icon-badge-count:before{content:"\e258"}.icon-alt:before{content:"\e259"}.icon-badge-add:before{content:"\e25a"}.icon-alert:before{content:"\e25b"}.icon-backspace:before{content:"\e25c"}.icon-alert-alt:before{content:"\e25d"}.fill{height:100%;min-height:100%}.shadow{box-shadow:3px 0 7px #dbdbdb}.umb-scrollable,.umb-auto-overflow{overflow:auto}.umb-abstract{display:block;margin-top:0;margin-bottom:15px;font-size:14px;color:#b3b3b3}h5{margin-top:15px;font-size:13px;font-weight:bold;color:#b3b3b3;text-transform:uppercase}h5.-border-bottom{padding-bottom:5px;border-bottom:1px solid #ececec}h5.-black{color:#000}.umb-form-actions{background:0;border:0}.datepicker td.active,.datepicker td span.active{background:#f3762c!important}.umb-datetime-picker div.info{vertical-align:middle}.umb-userwidget img{float:left;margin-right:15px}.umb-userwidget small{display:block}.popover-title{display:none}.thumbnails>li.umb-plus-btn{margin:0 10px 10px 0}.umb-plus-btn a{display:block;width:136px;height:136px;font-size:50px;line-height:136px;color:#d9d9d9;text-align:center;text-decoration:none;border:2px dashed #d9d9d9;transition:all .3s ease-in-out}.umb-plus-btn a:hover{color:#000;border:2px dashed #000}.umb-plus-btn i{margin:auto;vertical-align:middle}.umb-pane{margin:30px 20px}.umb-control-group{padding-bottom:20px;margin-bottom:15px!important;border-bottom:1px solid #f8f8f8}.umb-control-group.-no-border{border:0}.compact .umb-pane{margin:0 0 15px 0}.compact .umb-control-group{padding-bottom:10px;margin-bottom:5px!important;border-bottom:1px solid #f8f8f8}.compact label.control-label{padding-top:0!important;margin-bottom:0}.compact .controls-row{padding-top:0}.umb-pane>.umb-control-group:last-child{padding-bottom:0!important;border:0}.umb-control-group .umb-el-wrap{padding:0}.umb-control-group label.control-label,.umb-control-group .control-label{text-align:left}.umb-control-group label.control-label>div>label{padding-left:0}.umb-control-group label .help-block,.umb-control-group label small{padding-top:5px;font-size:11px;line-height:13px;color:#a0a0a0}.umb-nolabel .controls{margin-left:0}.controls-row{padding-top:5px;margin-left:240px}.umb-user-panel .controls-row{margin-left:0}.controls-row label{display:inline-block}.controls-row>div>label{padding-left:0}.block-form .controls-row{padding-top:0;margin-left:0}.hidelabel>div>.controls-row,.hidelabel>.controls-row,.hidelabel>div>.controls{padding:0;margin:0!important;border:0}.controls-row>.vertical-align-items{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center}.controls-row>.vertical-align-items>input.umb-editor-tiny{margin-right:5px;margin-left:5px}.controls-row>.vertical-align-items>input.umb-editor-tiny:first-child{margin-left:0}.thumbnails .selected{background:#000;border-color:#000}.umb-version{position:absolute;right:20px;bottom:5px;color:#bbb}.dashboardHideLink{display:none}.dashboardWrapper{position:relative}.dashboardWrapper h2{padding:0 0 0 45px}.dashboardWrapper h3{font-size:14px;font-weight:bold}.dashboardIcon{position:absolute;top:2px;left:2px}.umb-dashboard-control iframe{position:absolute;display:block;width:99%;height:99%;overflow:auto!important}.umb-table{word-wrap:break-word;table-layout:fixed}.umb-no-border{border:none!important}table thead a{color:#333}.umb-table tbody.ui-sortable tr{cursor:pointer}.umb-table tbody.ui-sortable tr.ui-sortable-helper{background-color:rgba(4,156,219,0.5);border:0}.umb-table tbody.ui-sortable tr.ui-sortable-helper td{border:0}.umb-table tbody.ui-sortable tr.ui-sortable-placeholder{background-color:#2e8aea;border:0}.umb-table tbody.ui-sortable tr.ui-sortable-placeholder td{height:5px;padding:0;line-height:0}.thumbnails>li.umb-thumbnail{position:relative;margin:0 10px 10px 0}.thumbnails>li.umb-thumbnail .umb-icons{position:absolute;top:0;left:0;z-index:1000;width:100%;padding:17px 0;background:#222}.thumbnails>li.umb-thumbnail .icon-crop{position:absolute;top:10px;left:10px;font-size:14px;color:#fff}.thumbnails>li.umb-thumbnail .icon-remove{position:absolute;top:10px;right:10px;font-size:14px;color:#fff}.umb-image-crop{float:left;width:400px;padding:0 0 30px 0;margin:0 30px 25px 0}.umb-image-mask{position:relative;width:399px;height:300px;margin:0 30px 0 0}.umb-image-mask:after{position:absolute;top:0;left:0;z-index:5999;width:100%;height:100%;content:"";opacity:.6;filter:alpha(opacity=6);box-shadow:inset 0 0 0 40px #fff,inset 0 0 0 41px rgba(0,0,0,0.2),inset 0 0 20px 41px rgba(0,0,0,0.2)}.umb-image-mask .icon-screenshot{position:absolute;top:125px;left:110px;z-index:1000;font-size:30px;color:#fff}.umb-image-mask .icon-circle{position:absolute;top:130px;left:115px;z-index:1;font-size:20px;color:#4285f4}.umb-crop-preview{float:left;width:400px}.umb-image-controls{width:400px}.umb-image-controls .icon-minus{float:left;padding:14px 10px 0 10px;color:#ccc}.umb-image-controls .icon-plus{float:right;padding:14px 10px 0 10px;color:#ccc;text-align:left}.umb-image-crop .range{display:block;float:left;width:82%;height:1px;margin:20px 0 0 0;background:#ccc;-webkit-appearance:none}.umb-image-crop .range::-webkit-slider-thumb{width:14px;height:14px;margin-top:-1px;background:#f2f2f2;border:1px solid #ccc;border-radius:2px;content:"1";-webkit-appearance:none}.umb-search-group li>div{padding-left:20px}.umb-search-group li>div a>i{height:100%}#search-form .form-search div{margin-top:3px}#search-form .form-search div .btn{position:relative;top:0;left:0}#dictionaryItems tr{border-top:solid 1px #d9d9d9}#dictionaryItems thead tr{font-weight:bold;border-top:0}#dictionaryItems th{font-weight:normal;text-align:left}#dictionaryItems td{text-align:center}#dictionaryItems thead td:first-of-type{text-align:left}#dictioanryItems i{font-size:18px}#dictionaryItems .icon-alert{color:#9d261d}#dictionaryItems .icon-check{color:#46a546}.umb-loader{width:100%;height:1px;margin-top:0;margin-left:-100%;background-color:#2e8aea;animation-duration:1s;animation-iteration-count:infinite;animation-name:bounce_loadingProgressG;animation-timing-function:linear;-o-animationtiming-function:linear}@keyframes bounce_loadingProgressG{0%{margin-left:-100%}100%{margin-left:100%}}.umb-loader-wrapper{position:absolute;right:0;left:0;margin:10px 0;overflow:hidden}.umb-loader-wrapper.-bottom{bottom:0}.strong{font-weight:bold}.inline{display:inline}.input-label--title{margin-bottom:3px;font-weight:bold;color:#000}.input-label--small{display:inline;font-size:12px;font-weight:bold;color:rgba(0,0,0,0.7)}.input-label--small:hover{color:#000}input[type=checkbox]:checked+.input-label--small{color:#2e8aea}.panel-dialog--header{padding-bottom:10px;margin:10px 0;font-size:17.5px;font-weight:bold;line-height:20px;border-bottom:1px solid #555}.bootstrap-datetimepicker-widget,.bootstrap-datetimepicker-widget td,.bootstrap-datetimepicker-widget th,.bootstrap-datetimepicker-widget td span{border-radius:0!important}.umb-item-list{display:block;width:auto;margin:0}.umb-item-list li{display:block;width:auto}.umb-tree{width:auto;min-width:100%;margin:0}.umb-tree li{display:block;width:auto;min-width:100%}.umb-tree li.current>div,.umb-tree div.selected{background:#2e8aea}.umb-tree li.current>div a.umb-options i,.umb-tree div.selected i{background:#fff;border-color:#2e8aea;transition:opacity 120ms ease}.umb-tree li.current>div a.umb-options:hover i,.umb-tree div.selected i{opacity:.7}.umb-tree li.current>div a,.umb-tree li.current>div i.icon,.umb-tree li.current>div ins{color:white!important;background:#2e8aea;border-color:#2e8aea}.umb-tree li.root>div{padding:0}.umb-tree li.root>div h5{display:-ms-flexbox;display:flex;width:100%;margin:0;-ms-flex-align:center;align-items:center}.umb-tree li.root>div h5>a,.umb-tree-header{display:-ms-flexbox;display:flex;padding:20px 0 20px 20px;box-sizing:border-box}.umb-tree *{white-space:nowrap}.umb-tree ul{width:100%;min-width:100%;padding:0;margin:0}.umb-tree ul.collapsed{display:none}.umb-tree a{text-decoration:none;cursor:pointer;outline:0}.umb-tree a:hover{text-decoration:none}.umb-tree div{position:relative;display:-ms-flexbox;display:flex;padding:5px 0 5px 0;overflow:hidden;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-ms-flex-align:center;align-items:center}.umb-tree a.noSpr{background-position:0 0}.umb-tree div>a.umb-options{visibility:hidden}.umb-tree div:hover>a.umb-options{visibility:visible}.umb-tree li.root>div a,.umb-tree li.root h5,.umb-tree-header{font-size:13px;font-weight:bold;color:#b3b3b3;text-transform:uppercase}.umb-tree ins{width:16px;height:16px;margin:-4px 0 0 -16px;font-size:12px;text-decoration:none;visibility:hidden;transition:opacity 120ms ease}.umb-tree ins:hover{opacity:.7}.umb-tree li:hover ins{cursor:pointer;visibility:visible}.umb-tree li div{padding:0}.umb-tree li>div a:not(.umb-options){display:-ms-flexbox;display:flex;width:100%;padding:6px 0}.umb-tree li>div:hover a:not(.umb-options){margin-right:6px;overflow:hidden}.umb-tree .icon{margin:0 13px 0 0;font-size:20px;color:#21201c;vertical-align:middle}.umb-tree-icon{cursor:pointer}.umb-tree i.noSpr{display:inline-block;width:16px;height:16px;margin-top:1px;line-height:16px}.umb-tree div:hover{background:#f8f8f8}.umb-tree small.search-subtitle{display:block;padding-left:35px;color:#d9d9d9}.umb-tree .umb-tree-node-search{cursor:pointer}.umb-tree .umb-search-group-item{padding-left:20px}.umb-tree .umb-search-group-item-link{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-direction:column;flex-direction:column}.icon-check:before{content:"\e165"}.umb-tree .umb-tree-node-checked i[class^="icon-"],.umb-tree .umb-tree-node-checked i[class*=" icon-"]{font-family:'icomoon'!important;color:#2e8aea!important}.umb-tree .umb-tree-node-checked i:before{content:"\e165"!important}a.umb-options{display:-ms-flexbox;display:flex;padding:9px 5px;margin-right:10px;text-align:center;cursor:pointer;visibility:hidden;-ms-flex-pack:end;justify-content:flex-end}a.umb-options i{display:inline-block;width:5px!important;height:5px!important;margin:0 2px 0 0;background:#000;border-radius:20px}a.umb-options i:last-child{margin:0}a.umb-options:hover{background:#e4e4e4;border-radius:0}li.root>div>a.umb-options{top:18px;display:-ms-flexbox;display:flex;padding:10px 5px}.hide-options a.umb-options{display:none!important}.hide-header h5{display:none!important}.umb-icon-item{position:relative;display:block;padding:2px;padding-left:55px}.umb-icon-item:hover{background:#f8f8f8}.umb-icon-item i.icon{position:absolute;top:8px;left:19px}.umb-icon-item a:hover div{text-decoration:underline}.umb-icon-item a{height:15px;padding-top:3px;font-size:12px;color:#525252;text-decoration:none}.umb-icon-item small{display:block;font-size:10px;color:#999}.umb-icon-item:hover a.umb-options{visibility:visible}.umb-icon-item .umb-spr{float:left}div.not-published>i.icon,div.not-published>a{opacity:.6}div.protected:before{position:absolute;bottom:0;padding-top:7px;padding-left:7px;font-family:'icomoon';font-size:20px;color:#9d261d;content:"\e256"}div.has-unpublished-version:before{position:absolute;bottom:0;padding-top:7px;padding-left:7px;font-family:'icomoon';font-size:20px;color:#46a546;content:"\e25a"}div.not-allowed>i.icon,div.not-allowed>a{cursor:not-allowed}.umb-tree li.current>div:before{color:#add8e6}div.is-container:before{position:absolute;bottom:0;padding-top:8px;padding-left:13px;font-family:'icomoon';font-size:8px;color:#04bfbf;pointer-events:none;content:"\e04e"}div.locked:before{position:absolute;bottom:0;padding-top:7px;padding-left:7px;font-family:'icomoon';font-size:20px;color:#9d261d;content:"\e0a7"}.umb-actions{padding:0;margin:12px 0 0 0;list-style:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.umb-actions li.sep{display:block;border-top:1px solid #efefef}.umb-actions li.sep:first-child{border-top:0}.umb-actions a{display:block;padding:8px 25px 8px 20px;font-size:14px;color:#000;text-decoration:none;white-space:nowrap;cursor:pointer}.umb-actions a:hover,.umb-actions a:focus,.umb-actions li.selected{color:#000!important;background:#f8f8f8!important}.umb-actions .menu-label{display:inline-block;padding-top:2px;padding-left:15px;vertical-align:middle}.umb-actions i{margin-top:2px;font-size:18px;color:#999;color:#414141;vertical-align:middle}.umb-actions-child{display:block;margin:0;list-style:none}.umb-actions-child li{display:block}.umb-actions-child a{display:block;padding-left:10px;clear:both;text-decoration:none}.umb-actions-child li .menu-label{margin-left:10px;font-size:14px;color:#000}.umb-actions-child li .menu-label small{display:block;clear:right;font-size:12px;line-height:14px;color:#ccc;white-space:normal}.umb-actions-child li a:hover .menuLabel small{text-decoration:none!important}.umb-actions-child i{min-width:32px;font-size:32px;line-height:24px;text-align:center}.umb-actions-child li.add{padding-top:20px;margin-top:20px;border-top:1px solid #e9e9e9}.umb-actions-child li.add i{opacity:.4}.umb-tree i.icon.blue{color:#2e8aea}.umb-tree i.icon.green{color:#46a546}.umb-tree i.icon.purple{color:#7a43b6}.umb-tree i.icon.orange{color:#df7f48}.umb-tree i.icon.red{color:#9d261d}.umb-tree li div.l{position:absolute;bottom:0;left:0;width:100%;height:1px;overflow:hidden}.umb-tree li div.l div{width:100%;height:1px;margin-top:0;margin-left:-100%;background-color:#2e8aea;animation-duration:1s;animation-iteration-count:infinite;animation-name:bounce_loadingProgressG;animation-timing-function:linear;-o-animationtiming-function:linear}.umb-tree .umb-loader{height:10px;margin:10px 10px 10px 10px}body.touch .umb-tree ins{padding:7px;font-size:14px;visibility:visible}body.touch .umb-tree li>div{padding-top:8px;padding-bottom:8px;font-size:110%}body.touch .umb-tree li div.l div{padding:0}body.touch .umb-actions a{padding:7px 25px 7px 20px;font-size:110%}.umb-listview{width:auto!important}.umb-listview .dropdown-menu{border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);border-radius:0;box-shadow:0 5px 10px rgba(0,0,0,0)}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus,.dropdown-submenu:hover>a,.dropdown-submenu:focus>a{color:#000;background:#f8f8f8}.umb-listview table{border:1px solid #d9d9d9}.umb-listview table caption{text-align:left;vertical-align:middle;background:#fff}.umb-sub-header{padding:0 0 20px 0}.umb-sub-header .header-content-right{float:right}.form-search .inner-addon{position:relative}.form-search .inner-addon [class^="icon-"],.form-search .inner-addon [class*=" icon-"]{position:absolute;top:0;padding:5px 8px;pointer-events:none}.form-search .inner-addon input[type="text"]{width:190px}.form-search .left-addon [class^="icon-"],.form-search .left-addon [class*=" icon-"]{right:inherit;left:0}.form-search .right-addon [class^="icon-"],.form-search .right-addon [class*=" icon-"]{right:0;left:inherit}.form-search .left-addon input[type="text"]{padding-right:6px;padding-left:30px!important}.form-search .right-addon input[type="text"]{padding-right:30px;padding-left:6px!important}.umb-listview table form{position:relative;margin:0}.umb-listview table input[type="text"]{width:60px;padding:4px 0 4px 20px;background:0;border:1px solid #d9d9d9;transition:all .5s}.umb-listview table input::-webkit-input-placeholder{color:#555}.umb-listview table input:-moz-placeholder{color:#555}.umb-listview table input::-moz-placeholder{color:#555}.umb-listview table input:-ms-input-placeholder{color:#555}.umb-listview table input[type="text"]:focus{width:200px;color:#000;background:#fff;border:1px solid #d9d9d9}.umb-listview table thead a{cursor:default}.umb-listview table thead a:hover{text-decoration:none}.umb-listview table thead a.sortable{cursor:pointer}.umb-listview table thead a.sortable span:hover{text-decoration:underline}.umb-listview .icon-star{color:#d9d9d9}.umb-listview .selected i.icon,.umb-listview tbody tr:hover i.icon{display:none}.umb-listview .selected input[type="checkbox"],.umb-listview tr:hover input[type="checkbox"]{display:inline-block!important}.umb-listview .inactive{color:#d9d9d9}.umb-listview .selected td{font-weight:bold}.umb-listview table thead{font-size:11px;font-weight:600;text-transform:uppercase;background-color:#fff}.umb-listview table tfoot{background:#f8f8f8}.umb-listview table tfoot td:last-child{border-left:none}.umb-listview table tfoot th{padding:0 20px}.umb-listview .label{font-size:11px;font-weight:400;color:#000;text-shadow:none;background:#f8f8f8;border:1px solid #d9d9d9}.umb-listview .table-striped tbody>tr:nth-child(even)>td,.umb-listview .table-striped tbody>tr:nth-child(even)>th{background-color:#f8f8f8}.table-striped tbody>tr:nth-child(odd)>td,.table-striped tbody>tr:nth-child(odd)>th{background:0}.umb-listview .table-striped tbody td{position:relative}.umb-listview .table-striped thead input[type="checkbox"]{margin-left:7px}.umb-listview .table-striped tbody input[type="checkbox"]{z-index:5;display:none;margin-left:7px}.umb-listview .table-striped tbody i{top:10px;left:6px;z-index:6;display:block;width:20px;height:20px;padding:0 0 0 4px;background:#fff}.umb-listview .table-striped tbody>tr:nth-child(even)>td i,.umb-listview .table-striped tbody>tr:nth-child(even)>th i{background-color:#f8f8f8}.umb-listview .table-striped tbody i:not(.handle):hover{display:none!important}.list-view-layout{display:-ms-flexbox;display:flex;padding:10px 15px;margin-bottom:1px;background:#f8f8f8;-ms-flex-align:center;align-items:center}.list-view-layout__sort-handle{margin-right:15px;font-size:14px;color:#d9d9d9}.list-view-layout__name{display:-ms-flexbox;display:flex;margin-right:15px;font-weight:bold;line-height:1.2em;-ms-flex:5;flex:5;-ms-flex-line-pack:center;align-content:center;-ms-flex-wrap:wrap;flex-wrap:wrap}.list-view-layout__name-text{margin-right:3px}.list-view-layout__system{font-size:10px;font-weight:normal}.list-view-layout__path{margin-right:15px;-ms-flex:10;flex:10}.list-view-layout__icon{display:block;padding:6px 8px;margin-right:10px;font-size:18px;vertical-align:middle;background:#fff;border:1px solid #d9d9d9}.list-view-layout__icon:hover,.list-view-layout__icon:focus,.list-view-layout__icon:active{text-decoration:none}.list-view-layout__remove{position:relative;cursor:pointer}.list-view-add-layout{display:-ms-flexbox;display:flex;padding:5px 0;margin-top:10px;color:#2e8aea;border:1px dashed #d9d9d9;box-sizing:border-box;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center}.list-view-add-layout:hover{text-decoration:none}.mceContentBody{overflow-y:hidden!important}.usky-grid IFRAME{overflow:hidden}.usky-grid .ui-sortable-helper{position:absolute!important;width:160px!important;height:80px!important;padding:5px;overflow:hidden;background:#ccc;border:dashed 1px #000!important;border-radius:5px;opacity:.4;box-shadow:3px 3px 12px 0 rgba(50,50,50,0.45)}.usky-grid .ui-sortable-helper *{padding:0!important;margin:0!important;color:#999!important;background:none!important;border:none!important}.usky-grid .ui-sortable-helper .cell-tools{display:none!important}.usky-grid .ui-sortable-placeholder{padding:20px;font-family:icomoon;font-size:85px;line-height:65px;color:#555;text-align:center;vertical-align:middle;background-color:#f8f8f8;border:2px dashed #d9d9d9}.usky-grid .ui-sortable-placeholder:hover{border-color:#555}.usky-grid .ui-sortable-placeholder:before{content:"\e1bd"}.usky-grid-width{width:100%;margin:20px auto}.usky-grid .right{float:right}.usky-grid .tb{width:100%}.usky-grid .td{display:inline-block;width:100%;vertical-align:top;border-right:1px dashed rgba(182,182,182,0);box-sizing:border-box}.usky-grid .tb:hover .td{border-right:1px dashed rgba(182,182,182,0.3)}.usky-grid .td.last{border-right:1px dashed rgba(182,182,182,0)!important}.usky-grid .middle{text-align:center}.usky-grid .mainTb{border-collapse:separate}.usky-grid .mainTd{position:relative}.usky-grid .usky-row{position:relative;border:1px dashed rgba(0,0,0,0)}.umb-grid .tb:hover .usky-row{border-bottom:1px dashed rgba(182,182,182,0)!important}.usky-grid .usky-cell{position:relative;min-height:127px;border:1px dashed rgba(0,0,0,0)}.usky-grid .cell-tools{position:absolute;top:0;right:0;bottom:0;z-index:50;width:50px;opacity:.3;transition:all .2s ease-in-out}.umb-grid .cell-tools{width:50px!important}.usky-grid .cell-tools.with-prompt{width:200px}.usky-grid .cell-tools:hover{opacity:1}.usky-grid .cell-tools-add{position:absolute;right:0;bottom:0;left:0;margin:0 45px 1px 0;text-align:center}.usky-grid .cell-tools-add.emptyArea{margin:0 0 1px 0}.usky-grid .usky-control:hover .cell-tools-add{opacity:1}.usky-grid .cell-tools-remove{position:absolute;top:0;right:5px;z-index:500;display:inline-block;text-align:right}.usky-grid .cell-tools-remove .iconBox:hover,.usky-grid .cell-tools-remove .iconBox:hover *{background:#9d261d!important;border-color:#9d261d!important}.usky-grid .cell-tools-move{position:absolute;top:33px;right:5px;z-index:500;display:inline-block;cursor:move}.usky-grid .cell-tools-edit{position:absolute;top:66px;right:5px}.usky-grid .usky-control{position:relative;display:block;margin:10px 0 0 0;background-clip:padding-box}.usky-grid .warnhighlight,.usky-grid .td.last.warnhighlight{border:1px dashed #9d261d!important}.usky-grid .infohighlight,.usky-grid .td.last.infohighlight{border:1px dashed #2e8aea!important}.usky-grid .warnhighlight>ins.item-label{color:#9d261d;border-color:#9d261d}.usky-grid .infohighlight>ins.item-label{color:#2e8aea;border-color:#2e8aea}.usky-grid ins.item-label{position:absolute;top:-22px;left:-1px;display:none;height:20px;padding:0 7px;overflow:hidden;font-size:.8em;color:#d9d9d9;text-decoration:none;background-color:white;border:1px dashed #d9d9d9;border-bottom:1px solid white!important}.usky-grid .usky-row-inner>ins.item-label{top:-20px;left:0}.usky-grid .usky-control-inner.selectedControl,.usky-grid .usky-row-inner.selectedRow{border:1px dashed #d9d9d9}.usky-grid .usky-control-inner.selectedControl>ins.item-label,.usky-grid .usky-row-inner.selectedRow>ins.item-label{z-index:100000;display:block}.usky-grid .usky-control-placeholder{position:relative;min-height:20px;text-align:center;text-align:-moz-center;cursor:text}.usky-grid .usky-control-placeholder .placeholder{height:20px;padding:5px;font-size:14px;text-align:left;border:1px solid rgba(182,182,182,0.3);opacity:.7}.usky-grid .usky-control-placeholder:hover .placeholder{border:1px solid rgba(182,182,182,0.8)}.usky-grid .usky-editor-placeholder{position:relative;min-height:65px;padding:20px;padding-bottom:30px;text-align:center;text-align:-moz-center;background-color:white;border:4px dashed #f8f8f8}.usky-grid .usky-editor-placeholder i{display:block;margin-bottom:10px;font-size:85px;line-height:85px;color:#f8f8f8}.usky-grid textarea.textstring{display:block;overflow:hidden;color:#555;background:#fff;border:0;outline:0;resize:none}.usky-grid .usky-cell-rte textarea{display:none!important}.usky-grid .usky-cell-media .caption{display:block;width:98%;overflow:hidden;font-style:italic;background:#fff;border:0;outline:0;resize:none}.usky-grid .cellPanelRte{min-height:60px}.usky-grid .usky-cell-embed iframe{width:100%}.usky-grid .iconBox{display:inline-block;padding:4px 6px 4px 6px;margin:2px;cursor:pointer;background:#fff;border:1px solid #b6b6b6;border-radius:200px}.usky-grid .iconBox span.prompt{display:block;text-align:center;white-space:nowrap}.usky-grid .iconBox span.prompt>a{text-decoration:underline}.usky-grid .iconBox:hover,.usky-grid .iconBox:hover *{color:white!important;text-decoration:none;background:#2e8aea!important;border-color:#2e8aea!important}.usky-grid .iconBox a:hover{color:white!important;text-decoration:none}.usky-grid .iconBox.selected{background:transparent;background-image:linear-gradient(to bottom,#e6e6e6,#bfbfbf);background-repeat:repeat-x;border-color:#bfbfbf #bfbfbf #999;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);border-radius:3px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe6e6e6',endColorstr='#ffbfbfbf',GradientType=0);zoom:1;box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);-webkit-appearance:none}.usky-grid .iconBox i{display:block;font-size:16px!important;color:#5f5f5f}.usky-grid ul{display:inline-block;padding:0;margin:10px 0 0 0;text-align:center;list-style:none}.usky-grid .help-text{display:inline-block;padding:10px 20px 10px 20px;clear:both;font-size:14px;color:#555;background:#f8f8f8;border-radius:15px}.usky-grid ul li{display:inline-block;width:120px;margin:8px 8px 0 8px}.usky-grid .mce-panel{clear:both;border:none!important}.usky-grid .mce-btn button{padding:8px 6px;line-height:inherit}.usky-grid .mce-toolbar{position:absolute;z-index:100;z-index:9999999;display:inline-block;float:left;padding:-1px;margin:-1px -1px 0 -1px;background-color:#fafafa;border:1px solid rgba(207,207,207,0.7);box-shadow:2px 2px 10px 0 rgba(50,50,50,0.14)}.mce-flow-layout-item{margin:0}.usky-grid .mce-panel{background:transparent!important}.usky-grid .mce-floatpanel{background-color:#f7f7f7!important}.usky-cell-rte{border:1px solid #f8f8f8}.usky-grid .fullSizeImage{width:100%}.usky-grid .boxWidth{margin-bottom:10px;text-align:right}.usky-grid .boxWidth input{width:40px;text-align:center}.usky-grid .boxWidth label{padding:0;margin:5px 5px 0 0;font-size:10px;color:#808080}.usky-grid .usky-cell{padding-top:5px;padding-bottom:15px}.usky-grid .usky-control{padding:5px;margin:10px 0 0 0;border:1px dashed transparent}.usky-grid .usky-templates-columns{margin-top:30px}.usky-grid .usky-row-inner{margin-right:45px;border:1px dashed transparent}.usky-grid .usky-control-inner{position:relative;min-height:60px;padding:5px;margin-right:45px;margin-bottom:15px;border:1px dashed transparent}.usky-grid .uSky-templates{width:100%;overflow:hidden;text-align:center}.usky-grid .uSky-templates-template{display:inline-block;width:100px;padding-right:30px;margin:20px}.usky-grid .uSky-templates-template a.tb:hover{border:5px solid #2e8aea}.usky-grid .uSky-templates-template .tb{position:relative;width:100%;height:150px;padding:10px;cursor:pointer;background-color:#f8f8f8;border:5px solid #d9d9d9}.usky-grid .uSky-templates-template .tr{position:relative;height:100%}.usky-grid .uSky-templates-template .tb .uSky-templates-column{height:100%;border:1px dashed #d9d9d9;border-right:0}.usky-grid .uSky-templates-template .tb .uSky-templates-column.last{border-right:1px dashed #d9d9d9!important}.usky-grid a.uSky-templates-column:hover,.usky-grid a.uSky-templates-column.selected{background-color:#2e8aea}.usky-grid .templates-preview{display:inline-block;width:100%;text-align:center}.usky-grid .templates-preview small{position:absolute;bottom:-25px;left:0;width:100%;padding-top:15px}.usky-grid .templates-preview .help-text{margin:35px 35px 0 0}.usky-grid .preview-rows{position:relative;display:inline-block;width:125px;margin:35px 40px 15px 0;border:2px solid #d9d9d9;box-sizing:border-box;transition:border 200ms linear}.usky-grid .preview-rows.prevalues-rows{float:left;width:80px;margin:0 20px 20px 0}.usky-grid .preview-rows.prevalues-templates{float:left;margin:0 20px 20px 0}.usky-grid .preview-rows:hover{cursor:pointer;border-color:#2e8aea}.usky-grid .preview-rows .preview-row{display:inline-block;width:100%;vertical-align:bottom}.usky-grid .preview-rows.layout{padding:2px}.usky-grid .preview-rows.layout .preview-row{height:100%}.usky-grid .preview-rows.layout .preview-col{height:180px;border:dashed 1px #d9d9d9}.usky-grid .preview-rows.layout .preview-cell{background-color:#f8f8f8}.usky-grid .preview-rows.layout .preview-overlay{display:none}.usky-grid .preview-rows.columns{min-height:18px;padding:1px;line-height:11px}.usky-grid .preview-rows.columns.prevalues-rows{min-height:30px}.usky-grid .preview-rows .preview-col{display:block;float:left;width:33.3%;height:10px;margin:0;border:1px solid #fff;box-sizing:border-box}.usky-grid .preview-rows .preview-col .preview-cell{display:block;width:100%;height:100%;margin:0 1px 1px 0;background-color:#d9d9d9}.usky-grid .preview-rows.prevalues-templates .preview-col{height:80px}.usky-grid .preview-overlay{position:absolute;top:0;left:0;display:block;width:100%;height:100%;border:3px solid white;box-sizing:border-box}.usky-grid .cell-tools-menu{position:absolute;top:0;left:50%;z-index:6660;width:360px;height:380px;padding:7px;margin-top:-270px;margin-left:-150px;overflow:auto;background:white;border:1px solid #ccc;box-shadow:3px 3px 12px 0 rgba(50,50,50,0.45)}.usky-grid .cell-tools-menu h5{padding:10px;margin-top:0;color:#999;border-bottom:1px solid #d9d9d9}.usky-grid .elements{display:block;padding:0;margin:0}.usky-grid .elements li{display:inline-block;width:90px;height:80px;padding:5px;margin:5px;overflow:hidden;font-size:11px}.usky-grid .elements li:hover,.usky-grid .elements li:hover *{color:white;background:#2e8aea}.usky-grid .elements a{color:#222;text-decoration:none}.usky-grid .elements i{display:block;font-size:30px;line-height:50px;color:#999}.usky-grid-configuration .uSky-templates{text-align:left}.usky-grid-configuration ul{display:block}.usky-grid-configuration ul li{display:block;width:auto;text-align:left}.usky-grid-configuration .uSky-templates .uSky-templates-template .tb{max-height:50px;padding:0;overflow:hidden;border-spacing:2px;border-width:2px!important}.usky-grid-configuration .uSky-templates .uSky-templates-template span{display:inline-block;background:#d9d9d9}.usky-grid-configuration .uSky-templates .uSky-templates-template .tb:hover{border-width:2px!important}.usky-grid-configuration .uSky-templates-column{display:block;float:left;margin-left:-1px;background:#d9d9d9;border:1px white solid!important}.usky-grid-configuration .uSky-templates-column.last{margin-right:-1px}.usky-grid-configuration .uSky-templates-column.add{font-size:20px;line-height:70px;color:#ccc;text-align:center;text-decoration:none;background:white}.usky-grid-configuration .mainTdpt{height:initial;border:0}.usky-grid-configuration .uSky-templates-rows .uSky-templates-row{width:60px;margin:0 50px 20px 0}.usky-grid-configuration .uSky-templates-rows .uSky-templates-row .tb{padding:0;border-spacing:2px;border-width:2px!important}.usky-grid-configuration .uSky-templates-rows .mainTdpt{height:10px!important}.usky-grid-configuration a.uSky-templates-column{height:70px!important}body.dragging,body.dragging *{cursor:move!important}li.dragged{position:absolute;z-index:2000;opacity:.5}.umb-sort li{display:block;padding:5px;margin:5px;background:#f8f8f8;border:1px solid #CCC}.umb-sort .placeholder{position:relative;padding:0;margin:0;border:0}.umb-sort .placeholder:before{position:absolute;top:-4px;left:-5px;width:0;height:0;margin-top:-5px;border:5px solid transparent;border-right:0;border-left-color:red;content:""}.umb-dashboards-forms-install{position:relative;top:-30px;padding-top:30px;background:url('../img/forms/installer-background.png');background-repeat:repeat-x;border-radius:0 0 200px 200px;box-shadow:inset 0 -40px 30px 25px #fff}.umb-dashboards-forms-install small{font-size:14px;opacity:.5}.umb-dashboards-forms-install .umb-loader{width:640px;height:4px}.umb-dashboards-forms-install .video_player video{width:100%;max-width:640px;border:1px solid #ededed;border-bottom:0;border-left:none;box-sizing:border-box}.umb-dashboards-forms-install .video_player input[type="range"]{position:relative;z-index:999;width:100%;max-width:640px;margin:0 auto;cursor:pointer;opacity:0}.umb-dashboards-forms-install .video_player input[type="range"]::-ms-fill-lower,.umb-dashboards-forms-install .video_player input[type="range"]::-ms-fill-upper{background:transparent}.umb-dashboards-forms-install .video_player input[type="range"]::-ms-tooltip{display:none}.umb-dashboards-forms-install .video_player .video-controls{position:relative;height:20px;max-width:640px;margin:-13px auto 40px;opacity:.8}.umb-dashboards-forms-install .video_player .loader{display:block;width:100%;height:3px;margin-top:-13px;background-color:whitesmoke}.umb-dashboards-forms-install .video_player .progress-bar{display:block;width:200px;height:100%;max-width:100%;background:#7c7e80;box-sizing:border-box}.umb-dashboards-forms-install .video_player .video-controls,.umb-dashboards-forms-install .video_player .loader,.umb-dashboards-forms-install .video_player .progress-bar{transition:all 150ms ease-in-out}.umb-dashboards-forms-install .video_player .progress-bar{transition-property:background}.umb-dashboards-forms-install .video_player .video_player video:hover+.video-controls,.umb-dashboards-forms-install .video_player .video-controls:hover{margin-top:-19px;margin-bottom:46px;opacity:1}.umb-dashboards-forms-install .video_player .video_player video:hover+.video-controls .loader,.umb-dashboards-forms-install .video_player .video-controls:hover .loader{height:8px}.umb-dashboards-forms-install .video_player .video_player video:hover+.video-controls .progress-bar,.umb-dashboards-forms-install .video_player .video-controls:hover .progress-bar{background:#2e99f4}.umb-dashboards-forms-install .installer-top{position:relative;height:80px;margin:0 auto 30px;overflow:hidden;line-height:80px;text-align:center}.umb-dashboards-forms-install .installer-top i,.umb-dashboards-forms-install .installer-top h3{display:inline-block}.umb-dashboards-forms-install .installer-top i{position:absolute;top:50%;margin-top:-40px}.umb-dashboards-forms-install .installer-top h3{margin:0;margin-left:100px;font-size:36px;font-weight:700;line-height:80px;letter-spacing:-1px}.umb-validation-label{position:relative;padding:1px 5px;font-size:10px;line-height:1.5em;color:white;background:#9d261d}.umb-validation-label:after{position:absolute;bottom:100%;left:10px;width:0;height:0;margin-left:-4px;pointer-events:none;border:solid transparent;border-color:rgba(255,255,255,0);border-bottom-color:#9d261d;border-width:4px;content:" "}.umb-validation-label.-arrow-left{margin-left:10px}.umb-validation-label.-arrow-left:after{position:absolute;top:50%;right:100%;bottom:auto;left:auto;width:0;height:0;margin-top:-4px;pointer-events:none;border:solid transparent;border-color:rgba(255,255,255,0);border-right-color:#9d261d;border-width:4px;content:" "}.umb-editor-wrapper{position:absolute;top:0;right:0;bottom:0;left:0;display:-ms-flexbox;display:flex;background:white;-ms-flex-direction:column;flex-direction:column}.umb-editor-wrapper>form{display:-ms-flexbox;display:flex;height:100%;-ms-flex-direction:column;flex-direction:column}.umb-editor-header{position:relative;background:#f8f8f8;border-bottom:1px solid #d9d9d9;-ms-flex:0 0 99px;flex:0 0 99px}.umb-editor-header__actions-menu{margin-left:auto}.umb-editor-container{position:relative;top:0;right:0;bottom:0;left:0;overflow:auto;-ms-flex:1 1 100%;flex:1 1 100%}.umb-editor-wrapper.-no-footer .umb-editor-container{bottom:0}.umb-editor-container.-stop-scrolling{overflow:hidden}.umb-editor-drawer{padding:10px 20px;margin:0;background:#f8f8f8;border-top:1px solid #d9d9d9;-ms-flex:1 0 31px;flex:1 0 31px}.umb-editor-actions{padding:0;margin:0;list-style:none}.umb-editor-actions li{display:inline-block}.umb-overlay{position:fixed;z-index:996660;overflow:hidden;background:white;box-shadow:0 10px 20px rgba(0,0,0,0.19),0 6px 6px rgba(0,0,0,0.23);animation:fadeIn .2s}.umb-overlay__form{display:-ms-flexbox;display:flex;height:100%;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-ms-flex-direction:column;flex-direction:column}.umb-overlay .umb-overlay-header{padding:10px;margin-top:0;background:#f8f8f8;border-bottom:1px solid #d9d9d9;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0}.umb-overlay .umb-overlay__title{margin:7px 0;font-size:17.5px;font-weight:bold;color:#000}.umb-overlay .umb-overlay__subtitle{font-size:11.9px;color:#555}.umb-overlay .umb-overlay-container{position:relative;height:auto;overflow-x:hidden;overflow-y:auto;-ms-flex-positive:1;flex-grow:1;-ms-flex-negative:1;flex-shrink:1;-ms-flex-preferred-size:auto;flex-basis:auto}.umb-overlay .umb-overlay-drawer{padding:10px 20px;margin:0;background:#f8f8f8;border-top:1px solid #d9d9d9;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;-ms-flex-preferred-size:31px;flex-basis:31px}.umb-overlay .umb-overlay-drawer.-auto-height{-ms-flex-preferred-size:auto;flex-basis:auto}.umb-overlay .umb-overlay-drawer .umb-overlay-drawer__align-right{display:-ms-flexbox;display:flex;-ms-flex-pack:end;justify-content:flex-end}.umb-overlay .umb-overlay-drawer .umb-overlay-drawer-content .dropdown-menu{right:0;left:auto}.umb-overlay.umb-overlay-center{position:absolute;top:10px;left:50%;width:600px;height:500px;transform:translate(-50%,0)}.umb-overlay.umb-overlay-center .umb-overlay-header{text-align:center}.umb-overlay.umb-overlay-center .umb-overlay-container{padding:20px}.umb-overlay.umb-overlay-target{width:400px;height:400px;box-sizing:border-box}.umb-overlay.umb-overlay-target .umb-overlay-header{text-align:center}.umb-overlay.umb-overlay-target .umb-overlay-container{padding:10px}.umb-overlay.umb-overlay-right{top:0;right:0;bottom:0;width:500px;border:0;box-shadow:0 0 20px rgba(0,0,0,0.19),0 0 6px rgba(0,0,0,0.23)}.umb-overlay.umb-overlay-right .umb-overlay-header{padding:20px;box-sizing:border-box;-ms-flex-preferred-size:100px;flex-basis:100px}.umb-overlay.umb-overlay-right .umb-overlay-container{padding:20px}.umb-overlay.umb-overlay-left{top:0;bottom:0;left:0;width:500px;margin-left:81px;border:0;box-shadow:0 0 20px rgba(0,0,0,0.19),0 0 6px rgba(0,0,0,0.23)}.umb-overlay.umb-overlay-left .umb-overlay-header{padding:20px;box-sizing:border-box;-ms-flex-preferred-size:100px;flex-basis:100px}.umb-overlay.umb-overlay-left .umb-overlay-container{padding:20px}@media(max-width:767px){.umb-overlay.umb-overlay-left{margin-left:61px}}@media(max-width:500px){.umb-overlay.umb-overlay-left{width:calc(100% - 41px);margin-left:41px}}.umb-overlay__item-details{position:absolute;bottom:51px;left:0;width:100%;padding:20px;background:#f8f8f8;border-bottom:1px solid #d9d9d9;box-sizing:border-box}.umb-overlay__item-details-title-wrapper{display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;-ms-flex-align:center;align-items:center}.umb-overlay__item-details-icon{margin-right:10px;font-size:16px;color:#999;vertical-align:middle}.umb-overlay__item-details-title{margin-top:0;margin-bottom:0}.umb-overlay__item-details-description{margin-top:10px;font-size:12px}.umb-overlay .control-label,.umb-overlay .form-horizontal .control-label,.form-horizontal .umb-overlay .control-label{display:block;float:none;width:100%;margin-bottom:10px;box-sizing:border-box}.umb-overlay .controls-row,.umb-overlay .form-horizontal .controls,.form-horizontal .umb-overlay .controls{margin-left:0!important}.umb-card{position:relative;padding:5px 10px 5px 10px;background:white}.umb-card .title{padding:12px;margin:0 -10px 10px -10px;font-size:16px;font-weight:400;color:#555;text-transform:none;border-bottom:1px solid #d9d9d9}.umb-card-thumb{text-align:center}.umb-card-thumb i{display:block;padding-top:5px;font-size:20px;line-height:40px;color:#2e8aea;text-align:center}.umb-card-content .item-title{margin-bottom:3px;font-size:16px;font-weight:400;color:#1d1d1d;text-transform:none;border:0}.umb-card-content p{margin-bottom:1px;color:#555}.umb-card-actions{padding-top:10px;clear:both;border-top:#f8f8f8 1px solid}.umb-card-icons{display:block;padding:0;margin:0;text-align:center;vertical-align:middle;list-style:none}.umb-card-icons.vertical{position:absolute;top:7px;right:7px;width:1px;text-align:right}.umb-card-icons li{display:inline-block;margin:0 2px 0 2px}.umb-card-icons.vertical li{display:block;float:right;margin-bottom:3px}.umb-card-list{display:block;padding:0;margin:0}.umb-card-list li{display:block;padding-bottom:3px;border-bottom:#f8f8f8 1px solid}.umb-card-grid{display:-ms-flexbox;display:flex;padding:0;margin:0 auto;list-style:none;-ms-flex-flow:row wrap;flex-flow:row wrap;-ms-flex-pack:start;justify-content:flex-start}.umb-card-grid li{width:100px;height:105px;padding:5px;overflow:hidden;font-size:11px;text-align:center;box-sizing:border-box}.umb-card-grid li.-four-in-row{-ms-flex:0 0 25%;flex:0 0 25%}.umb-card-grid li.-three-in-row{-ms-flex:0 0 33.33%;flex:0 0 33.33%}.umb-card-grid .umb-card-grid-item{display:block;width:100%;height:100%}.umb-card-grid .umb-card-grid-item:hover,.umb-card-grid .umb-card-grid-item:focus,.umb-card-grid .umb-card-grid-item:hover>*,.umb-card-grid .umb-card-grid-item:focus>*{color:white;cursor:pointer;background:#2e8aea;outline:0}.umb-card-grid a{color:#222;text-decoration:none}.umb-card-grid i{display:block;font-size:30px;line-height:50px;color:#343434}.umb-btn-round{display:inline-block;padding:4px 6px 4px 6px;margin:2px;cursor:pointer;background:#fff;border:1px solid #b6b6b6;border-radius:200px}.umb-btn-round:hover,.umb-btn-round:hover *{color:white!important;text-decoration:none;background:#2e8aea!important;border-color:#2e8aea!important}.umb-btn-round a:hover{color:white!important;text-decoration:none}.umb-btn-round i{display:block;font-size:16px!important;color:#grayLight}.umb-btn-round.alert:hover,.umb-btn-round.alert:hover *{color:white!important;text-decoration:none;background:#9d261d!important;border-color:#9d261d!important}.umb-btn-round.no-border{background:none!important;border:none!important}.umb-sub-views .umb-sub-views-action-bar{margin-bottom:40px}.umb-sub-views .umb-sub-views-action-bar .btn-link{padding-right:0;padding-left:0}.umb-sub-views .umb-sub-views-action-bar .btn-link:focus{text-decoration:none;outline:0}.umb-sub-views .umb-sub-views-nav{float:right;margin:0}.umb-sub-views .umb-sub-views-nav .umb-sub-views-nav-item{display:inline-block;margin-left:15px}.umb-sub-views .umb-sub-views-nav .umb-sub-views-nav-item.is-active .btn-link{color:#2e8aea!important}.umb-sub-views .umb-sub-views-tools{float:left;margin:0}.umb-sub-views .umb-sub-views-tools .umb-sub-views-tool{display:inline-block;margin-right:15px}.umb-sub-views-nav{display:-ms-flexbox;display:flex;margin:0;list-style:none}.umb-sub-views-nav-item{display:block;margin-left:20px;text-align:center;cursor:pointer}.umb-sub-views-nav-item:focus{outline:0}.umb-sub-views-nav-item:hover,.umb-sub-views-nav-item:focus{text-decoration:none}.umb-sub-views-nav-item.is-active{color:#2e8aea}.show-validation .umb-sub-views-nav-item.-has-error{color:#9d261d}.umb-sub-views-nav-item .icon{display:block;font-size:24px;text-align:center}.umb-sub-views-nav-item-text{font-size:11px}.sub-view-columns{display:-ms-flexbox;display:flex;margin-bottom:40px}.sub-view-columns h5{margin-top:0}.sub-view-column-left{margin-right:70px;-ms-flex:0 0 250px;flex:0 0 250px}.sub-view-column-right{-ms-flex:1;flex:1}.sub-view-column-section{margin-bottom:20px}.umb-editor-sub-header{position:relative;top:0;display:-ms-flexbox;display:flex;padding:15px 0;margin-top:-30px;margin-bottom:30px;background:#fff;-ms-flex-pack:justify;justify-content:space-between}.umb-editor-sub-header.-umb-sticky-bar{top:100px;margin-top:0;margin-bottom:0;box-shadow:0 5px 0 rgba(0,0,0,0.08),0 1px 0 rgba(0,0,0,0.16);transition:box-shadow 1s}.umb-group-builder__property-preview .umb-editor-sub-header{display:none}.umb-editor-sub-header__content-left{margin-right:auto}.umb-editor-sub-header__content-right{margin-left:auto}.umb-editor-sub-header__content-left,.umb-editor-sub-header__content-right{display:-ms-flexbox;display:flex;-ms-flex-align:stretch;align-items:stretch}.umb-editor-sub-header__section{display:-ms-flexbox;display:flex;padding-right:20px;padding-left:20px;border-left:1px solid #d9d9d9;-ms-flex-align:center;align-items:center}.umb-editor-sub-header__content-left .umb-editor-sub-header__section:first-child{padding-left:0;border-left:none}.umb-editor-sub-header__content-right .umb-editor-sub-header__section{border-right:1px solid #d9d9d9;border-left:none}.umb-editor-sub-header__content-right .umb-editor-sub-header__section:last-child{padding-right:0;border-right:0}.umb-grid-selector__items{display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;-ms-flex-wrap:wrap;flex-wrap:wrap}.umb-grid-selector__item{position:relative;display:-ms-flexbox;display:flex;width:125px;height:150px;padding:20px;margin:0 20px 20px 0;text-align:center;background:#f8f8f8;border:1px solid #ccc;animation:fadeIn .5s;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center}.umb-grid-selector__item.-default{border-width:2px}.umb-grid-selector__item.-placeholder{cursor:pointer;background:0;border:1px dashed #d9d9d9}.umb-grid-selector__item-content{margin-top:10px}.umb-grid-selector__item-icon{display:block;margin-bottom:5px;font-size:50px;line-height:50px;color:#d9d9d9}.umb-grid-selector__item-label{font-size:13px;font-weight:bold}.umb-grid-selector__item-label.-blue{color:#2e8aea}.umb-grid-selector__item-remove{position:absolute;top:5px;right:5px;cursor:pointer}.umb-grid-selector__item-default-label{position:relative;top:-3px;font-size:10px;font-weight:bold;color:#555}.umb-grid-selector__item-default-label.-blue{color:#2e8aea}.umb-grid-selector__item-add{color:#2e8aea}.umb-child-selector__child{display:-ms-flexbox;display:flex;min-width:300px;padding:5px 15px;margin-bottom:5px;background:#f8f8f8;animation:fadeIn .5s}.umb-child-selector__child.-parent{padding-top:10px;padding-bottom:10px;background:#f1f1f1}.umb-child-selector__child.-placeholder{text-align:center;cursor:pointer;background:0;border:1px dashed #d9d9d9;-ms-flex-pack:center;justify-content:center}.umb-child-selector__children-container{margin-left:30px}.umb-child-selector__child-description{-ms-flex:1;flex:1}.umb-child-selector__child-icon-holder{display:inline-block;width:20px;margin-right:5px;text-align:center}.umb-child-selector__child-icon{font-size:16px;vertical-align:middle}.umb-child-selector__child-name{font-size:13px}.umb-child-selector__child-name.-blue{color:#2e8aea}.umb-child-selector__child-actions{text-align:right;-ms-flex:0 0 50px;flex:0 0 50px}.umb-child-selector__child-remove{cursor:pointer}.umb-group-builder__groups{padding:0;margin:0;list-style:none}.umb-group-builder__group{position:relative;min-height:86px;padding:10px 10px 5px 10px;margin:50px 0 0 0;border:2px solid #ccc;border-radius:0 10px 10px 10px;box-sizing:border-box}.umb-group-builder__group.-active{border-color:#2e8aea}.umb-group-builder__group.-inherited{border-color:#f2f2f2;animation:fadeIn .5s}.umb-group-builder__group.-placeholder{display:-ms-flexbox;display:flex;min-height:86px;font-weight:bold;color:#2e8aea;cursor:pointer;border:1px dashed #d9d9d9;-ms-flex-pack:center;justify-content:center;-ms-flex-align:center;align-items:center}.umb-group-builder__group.-sortable{min-height:initial;cursor:move}.umb-group-builder__group-actions{position:absolute;top:5px;right:5px;z-index:10;opacity:0;visibility:hidden}.umb-group-builder__group-action{display:inline-block}.umb-group-builder__group-remove{position:absolute;top:-30px;right:20px;font-size:18px}.umb-group-builder__group-remove:hover{color:#0064cd;cursor:pointer}.umb-group-builder__group-title-wrapper{position:absolute;top:-45px;left:-2px;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center}.umb-group-builder__group-title-wrapper.-placeholder{top:-44px;left:-1px}.umb-group-builder__group-title{display:-ms-flexbox;display:flex;height:38px;padding:5px 9px 0 9px;font-weight:bold;background:white;border:2px solid #ccc;border-bottom:0;border-radius:10px 10px 0 0;-ms-flex-align:center;align-items:center}.umb-group-builder__group-title-icon{margin-left:5px}.umb-group-builder__group-title.-active{border-color:#2e8aea}.umb-group-builder__group-title.-placeholder{width:70px;border:1px dashed #d9d9d9;border-bottom:0}.umb-group-builder__group-title.-inherited{border-color:#f2f2f2}input.umb-group-builder__group-title-input{margin-bottom:0;font-weight:bold;color:#515151;background:transparent;border-color:transparent}.umb-group-builder__group-title-input:hover{border-color:#ccc}.umb-group-builder__group-title-input.-placeholder{border:1px dashed #979797}.umb-group-builder__group-inherited-label{position:relative;top:2px;display:inline-block;margin-left:10px;font-size:13px;color:#d9d9d9}.umb-group-builder__group-sort-order{position:relative;top:2px;display:-ms-flexbox;display:flex;margin-left:10px;-ms-flex-align:center;align-items:center}input.umb-group-builder__group-sort-value{width:40px;padding:0 0 0 5px;margin-bottom:0;font-size:11px;border-color:#d9d9d9}.umb-group-builder__properties{min-height:35px;padding:0;margin:0;list-style:none}.umb-group-builder__property{position:relative;display:-ms-flexbox;display:flex;padding:5px;margin-bottom:5px;border:1px solid transparent;border-radius:5px;box-sizing:border-box;-ms-flex-flow:row;flex-flow:row}.umb-group-builder__property:hover{border:1px dashed #ccc}.umb-group-builder__property.-placeholder{cursor:pointer;background:#fff;border:1px dashed #d9d9d9;border-radius:5px;animation:fadeIn .5s;-ms-flex-align:center;align-items:center}.umb-group-builder__property.-inherited{border:transparent;animation:fadeIn .5s}.umb-group-builder__property.-inherited:hover{border:transparent}.umb-group-builder__property.-locked{border:transparent;animation:fadeIn .5s}.umb-group-builder__property.-locked:hover{border:transparent}.umb-group-builder__property.-sortable,.umb-group-builder__property.-sortable-locked{min-height:35px;border:0;border-radius:5px;animation:none;-ms-flex-align:center;align-items:center}.umb-group-builder__property.-sortable{color:#222;cursor:move;background:#e9e9e9}.umb-group-builder__property.-sortable-locked{padding-left:30px;background:#f8f8f8}.umb-group-builder__property-meta{margin-right:20px;-ms-flex:0 0 175px;flex:0 0 175px}.umb-group-builder__property-meta.-full-width{-ms-flex:1;flex:1}.umb-group-builder__property-meta-alias{margin-bottom:5px;font-size:10px;line-height:1.5;color:#555;word-break:break-word}.umb-group-builder__property-meta-label textarea{width:100%;min-height:25px;padding:0;margin-bottom:0;overflow:hidden;font-size:14px;font-weight:bold;color:#222;background:transparent;border-color:transparent;box-sizing:border-box;resize:none}.umb-group-builder__property-meta-label textarea.ng-invalid{border:0}.umb-group-builder__property-meta-description textarea{width:100%;min-height:25px;padding:0;margin-bottom:0;overflow:hidden;font-size:12px;line-height:1.5;color:#343434;background:transparent;border-color:transparent;box-sizing:border-box;resize:none}.umb-group-builder__property-preview{position:relative;height:30px;padding:35px 10px 25px 10px;overflow:hidden;background:url("../img/checkered-background-20.png");-ms-flex:1;flex:1}.umb-group-builder__property-preview:hover{cursor:pointer}.umb-group-builder__property-preview:focus{outline:0}.umb-group-builder__property-preview.-not-clickable:hover{cursor:auto}.umb-group-builder__property-preview .help-inline{display:none!important}.umb-group-builder__property-preview-label{position:absolute;top:0;left:0;z-index:15;padding:3px;font-size:11px;line-height:12px;text-transform:uppercase;background:#f8f8f8;opacity:.8}.umb-group-builder__property-actions{margin:15px 0 0 15px;text-align:center;-ms-flex:0 0 40px;flex:0 0 40px}.umb-group-builder__property-action{position:relative;display:block;margin:0 0 10px 0;font-size:18px;cursor:pointer}.umb-group-builder__property-action:hover{color:#0064cd}.umb-group-builder__property-tags{position:absolute;top:0;left:0;z-index:20;display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row}.umb-group-builder__property-tags.-right{right:0;left:auto}.umb-group-builder__property-tag{display:-ms-flexbox;display:flex;padding:0 4px;margin-left:10px;font-size:11px;background-color:#d9d9d9}.umb-group-builder__property-tag:first-child{margin-left:0}.umb-group-builder__property-tag.-white{background-color:#fff}.umb-group-builder__property-tag-icon{margin-right:3px}.umb-group-builder__placeholder-box{display:-ms-flexbox;display:flex;font-size:12px;font-weight:bold;color:#2e8aea;background:#e9e9e9;box-sizing:border-box;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center}.umb-group-builder__placeholder-box.-input{height:10px;margin-bottom:5px}.umb-group-builder__placeholder-box.-input-small{width:25%;height:5px;margin-bottom:5px}.umb-group-builder__placeholder-box.-text-full-width{height:3px;margin-bottom:3px}.umb-group-builder__placeholder-box.-text-short{width:75%;height:3px;margin-bottom:3px}.umb-group-builder__group-sortable-placeholder{margin:0 0 70px 0;background:transparent;border:1px dashed #d9d9d9;border-radius:10px;border-radius:5px}.umb-group-builder__property_sortable-placeholder{margin-bottom:5px;background:transparent;border:1px dashed #d9d9d9;border-radius:5px}.umb-group-builder__no-data-text{padding-top:50px;font-size:16px;line-height:1.8em;color:#ccc;text-align:center}.umb-overlay .show-validation .ng-invalid-val-required-component .editor-placeholder{color:#9d261d;border-color:#9d261d}.content-type-editor-dialog.edit-property-settings .validation-wrapper{position:relative}.content-type-editor-dialog.edit-property-settings .validation-label{position:absolute;top:50%;right:0;font-size:12px;color:#9d261d;transform:translate(0,-50%)}.content-type-editor-dialog.edit-property-settings textarea.editor-label{width:100%;padding-left:0;margin-bottom:0;font-size:16px;font-weight:bold;line-height:1.5em;border:0;border-color:transparent;box-shadow:none;box-sizing:border-box;resize:none}.content-type-editor-dialog.edit-property-settings textarea.editor-label:focus{outline:0;box-shadow:none!important}.content-type-editor-dialog.edit-property-settings .editor-placeholder{display:block;width:100%;height:80px;font-size:13px;font-weight:bold;line-height:80px;color:#555;color:#2e8aea;text-align:center;border:1px dashed #d9d9d9;border-radius:5px}.content-type-editor-dialog.edit-property-settings .editor-placeholder:hover{text-decoration:none}.content-type-editor-dialog.edit-property-settings .editor{margin-bottom:10px}.content-type-editor-dialog.edit-property-settings .editor .editor-icon-wrapper{float:left;width:60px;height:60px;margin-right:20px;line-height:60px;text-align:center;border:1px solid #d9d9d9;border-radius:5px}.content-type-editor-dialog.edit-property-settings .editor .editor-icon-wrapper .icon{font-size:26px}.content-type-editor-dialog.edit-property-settings .editor .editor-details{float:left;margin-top:10px}.content-type-editor-dialog.edit-property-settings .editor .editor-details .editor-name{display:block;font-weight:bold}.content-type-editor-dialog.edit-property-settings .editor .editor-details .editor-editor{display:block;font-size:12px}.content-type-editor-dialog.edit-property-settings .editor .editor-settings-icon{margin-top:8px;font-size:18px}.content-type-editor-dialog.edit-property-settings .checkbox{margin-bottom:20px}.content-type-editor-dialog.edit-property-settings .editor-description,.content-type-editor-dialog.edit-property-settings .editor-validation-pattern{min-width:100%;min-height:25px;overflow:hidden;border:0;box-sizing:border-box;resize:none}.content-type-editor-dialog.edit-property-settings .umb-dropdown{width:100%}.umb-list-view-settings__box{position:relative;display:-ms-flexbox;display:flex;padding:15px;background:#f8f8f8;border:1px solid #ccc;animation:fadeIn .5s}.umb-list-view-settings__trigger{margin-bottom:20px}.umb-list-view-settings__box.-open{border-bottom:transparent}.umb-list-view-settings__content{display:-ms-flexbox;display:flex}.umb-list-view-settings__list-view-icon{margin-right:10px;font-size:20px;color:#d9d9d9}.umb-list-view-settings__name{float:left;margin-right:5px;font-size:14px;font-weight:bold}.umb-list-view-settings__create-new{font-size:12px;color:#2e8aea}.umb-list-view-settings__remove-new{font-size:12px;color:#9d261d}.umb-list-view-settings__settings{padding:20px;border:1px dashed #d9d9d9;border-top:0}.umb-table{position:relative;display:-ms-flexbox;display:flex;min-width:640px;border:1px solid #d9d9d9;-ms-flex-direction:column;flex-direction:column;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-ms-flex-pack:justify;justify-content:space-between}.umb-table.umb-table-inactive:before{position:absolute;top:0;right:0;bottom:0;left:0;z-index:10;background:rgba(255,255,255,0.75);content:"";outline:1px solid rgba(255,255,255,0.75)}.umb-table a{text-decoration:none;cursor:pointer}.umb-table a:focus{text-decoration:none;outline:0}input.umb-table__input{margin:0 auto}.umb-table-head{font-size:11px;font-weight:600;text-transform:uppercase;background-color:#f8f8f8}.umb-table-head__link{position:relative;color:rgba(85,85,85,0.75);text-decoration:none;cursor:default}.umb-table-head__link:hover{color:rgba(85,85,85,0.75);text-decoration:none}.umb-table-head__link .sortable:hover{color:#000;text-decoration:none;cursor:pointer}.umb-table-thead__icon{position:absolute;padding-top:1px;padding-left:3px;font-size:13px;cursor:default}.umb-table-thead .sortable:hover{text-decoration:none;cursor:pointer}.umb-table-body .umb-table-row{font-size:13px;color:rgba(85,85,85,0.75);cursor:pointer;border-top:1px solid #d9d9d9}.umb-table-body .umb-table-row:hover{background-color:rgba(248,248,248,0.9)}.umb-table-body .umb-table-row.-solid{cursor:default}.umb-table-body .umb-table-row.-solid:hover{background-color:white}.umb-table-body__link{text-decoration:none}.umb-table-body__link:hover{text-decoration:underline}.umb-table-body__icon,.umb-table-body__icon[class^="icon-"],.umb-table-body__icon[class*=" icon-"]{margin:0 auto;font-size:22px;line-height:22px;color:#0064cd}.umb-table-body__checkicon,.umb-table-body__checkicon[class^="icon-"],.umb-table-body__checkicon[class*=" icon-"]{display:none;font-size:16px;line-height:22px}.umb-table-body .umb-table__name{font-size:14px;font-weight:bold;color:#000}.umb-table-body__empty{height:100%;padding:20px 0;font-size:16px;color:#555;text-align:center}.-selected .umb-table-body__fileicon{display:none}.-selected .umb-table-body__checkicon{display:inline-block}.-content .-unpublished .umb-table__name>*{opacity:.4}.-content .-unpublished .umb-table-body__icon{opacity:.4}.-selected.-unpublished .umb-table-body__icon{opacity:1}.umb-table-row{display:-ms-flexbox;display:flex;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-align:center;align-items:center}.umb-table-row.-selected,.umb-table-row.-selected:hover{background-color:rgba(0,100,205,0.04)}.umb-table-cell{position:relative;display:-ms-flexbox;display:flex;padding:6px 2px;margin:auto 14px;overflow:hidden;text-align:left;-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex:1 1 1%;flex:1 1 1%}.umb-table-cell>*{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.umb-table-cell:first-of-type:not(.not-fixed){padding:15px 0;margin:0 0 0 15px;-ms-flex:0 0 25px;flex:0 0 25px}.umb-table__name{max-width:25%;-ms-flex:1 1 25%;flex:1 1 25%}.umb_confirm-action__overlay{position:absolute;z-index:999999;display:-ms-flexbox;display:flex}.umb_confirm-action__overlay.-top{top:-50px;right:auto;bottom:auto;left:0;animation:fadeInUp .2s;-ms-flex-direction:column;flex-direction:column}.umb_confirm-action__overlay.-top .umb_confirm-action__overlay-action{margin-bottom:5px}.umb_confirm-action__overlay.-top .umb_confirm-action__overlay-action.-confirm{-ms-flex-order:1;order:1}.umb_confirm-action__overlay.-top .umb_confirm-action__overlay-action.-cancel{-ms-flex-order:2;order:2}.umb_confirm-action__overlay.-right{top:0;right:-50px;bottom:auto;left:auto;animation:fadeInLeft .2s;-ms-flex-direction:row;flex-direction:row}.umb_confirm-action__overlay.-right .umb_confirm-action__overlay-action{margin-left:5px}.umb_confirm-action__overlay.-right .umb_confirm-action__overlay-action.-confirm{-ms-flex-order:2;order:2}.umb_confirm-action__overlay.-right .umb_confirm-action__overlay-action.-cancel{-ms-flex-order:1;order:1}.umb_confirm-action__overlay.-bottom{top:auto;right:auto;bottom:-50px;left:0;animation:fadeInDown .2s;-ms-flex-direction:column;flex-direction:column}.umb_confirm-action__overlay.-bottom .umb_confirm-action__overlay-action{margin-top:5px}.umb_confirm-action__overlay.-bottom .umb_confirm-action__overlay-action.-confirm{-ms-flex-order:2;order:2}.umb_confirm-action__overlay.-bottom .umb_confirm-action__overlay-action.-cancel{-ms-flex-order:1;order:1}.umb_confirm-action__overlay.-left{top:0;right:auto;bottom:auto;left:-50px;animation:fadeInRight .2s;-ms-flex-direction:row;flex-direction:row}.umb_confirm-action__overlay.-left .umb_confirm-action__overlay-action{margin-right:5px}.umb_confirm-action__overlay.-left .umb_confirm-action__overlay-action.-confirm{-ms-flex-order:1;order:1}.umb_confirm-action__overlay.-left .umb_confirm-action__overlay-action.-cancel{-ms-flex-order:2;order:2}.umb_confirm-action__overlay-action{display:-ms-flexbox;display:flex;width:20px;height:20px;font-size:18px;color:#fff;border-radius:40px;box-shadow:0 2px 5px 0 rgba(0,0,0,0.26);-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center}.umb_confirm-action__overlay-action:hover{color:#fff;text-decoration:none}.umb_confirm-action__overlay-action.-confirm{color:#46a546!important;background:#fff}.umb_confirm-action__overlay-action.-confirm:hover{color:#46a546!important}.umb_confirm-action__overlay-action.-cancel{color:#9d261d!important;background:#fff}.umb_confirm-action__overlay-action.-cancel:hover{color:#9d261d!important}.umb-keyboard-shortcuts-overview__overlay{position:fixed;top:0;left:0;z-index:1000;width:100%;height:100%;padding-left:440px;background:#fff;box-sizing:border-box;animation:fadeIn .2s}.umb-keyboard-shortcuts-overview__overlay-close{position:absolute;top:20px;right:20px;display:-ms-flexbox;display:flex;width:35px;height:35px;font-size:25px;line-height:1em;background-color:transparent;border-radius:20px;-ms-flex-pack:center;justify-content:center;-ms-flex-align:center;align-items:center}.umb-keyboard-shortcuts-overview__overlay-close:hover{color:#fff;text-decoration:none;background-color:#2e8aea}.umb-keyboard-shortcuts-overview__overlay-content{display:-ms-flexbox;display:flex;width:100%;height:100%;-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:center;justify-content:center;-ms-flex-align:center;align-items:center}.umb-keyboard-shortcuts-overview__keyboard-shortcuts-group{width:50%;margin-bottom:10px}.umb-keyboard-shortcuts-overview__keyboard-shortcuts-group-name{margin-bottom:0}.umb-keyboard-shortcuts-overview__keyboard-shortcut{display:-ms-flexbox;display:flex;padding:7px 0;border-bottom:1px solid #d9d9d9;-ms-flex-pack:justify;justify-content:space-between;-ms-flex-align:center;align-items:center}.umb-keyboard-shortcuts-overview__keyboard-shortcut.-no-air{padding:0}.umb-keyboard-shortcuts-overview__keyboard-shortcut.-no-stroke{border-bottom:0}.umb-keyboard-shortcuts-overview__description{margin-right:10px;font-size:13px;font-weight:bold}.umb-keyboard-keys{display:-ms-flexbox;display:flex;font-size:12px;list-style:none;-ms-flex-align:center;align-items:center}.umb-keyboard-key-wrapper{display:-ms-flexbox;display:flex;margin-right:5px;-ms-flex-align:center;align-items:center}.umb-keyboard-key{padding:1px 7px;margin-right:5px;color:#555;background:#fff;border:1px solid #d9d9d9;border-radius:5px}.umb-checkbox-list{margin-left:0;list-style:none}.umb-checkbox-list__item{display:-ms-flexbox;display:flex;margin-bottom:2px;-ms-flex-align:center;align-items:center}.umb-checkbox-list__item:last-child{border-bottom:0}.umb-checkbox-list__item:hover{background-color:#f8f8f8}.umb-checkbox-list__item.-selected,.umb-checkbox-list__item.-disabled{font-weight:bold;background-color:rgba(0,100,205,0.04)}.umb-checkbox-list__item-checkbox{display:-ms-flexbox;display:flex;height:30px;margin-right:10px;-ms-flex-pack:center;justify-content:center;-ms-flex-align:center;align-items:center;-ms-flex:0 0 30px;flex:0 0 30px}.umb-checkbox-list__item-checkbox.-selected{background:#2e8aea}.umb-checkbox-list__item-icon{margin-right:5px}.umb-checkbox-list__item-text{margin-bottom:0;font-size:13px;-ms-flex:1 1 auto;flex:1 1 auto}.umb-checkbox-list__item-text.-faded{opacity:.5}.umb-checkbox-list__item.-disabled .umb-checkbox-list__item-text{cursor:not-allowed}.umb-checkbox-list__item-caption{margin-left:2px;font-size:11px}.umb-checkbox-list__no-data{padding-top:50px;font-size:16px;line-height:1.8em;color:#ccc;text-align:center}.umb-locked-field{position:relative;display:block;font-size:13px;color:#ccc}.umb-locked-field__wrapper{display:-ms-flexbox;display:flex;margin-bottom:5px;-ms-flex-align:center;align-items:center}.umb-locked-field__toggle{margin-right:3px}.umb-locked-field__toggle:hover,.umb-locked-field__toggle:focus{text-decoration:none}.umb-locked-field__lock-icon{color:#ccc;transition:color .25s}.umb-locked-field__lock-icon.-unlocked{color:#515151}input.umb-locked-field__input{padding:0;margin-bottom:0;font-size:13px;color:#ccc;background:rgba(255,255,255,0);border-color:transparent!important;transition:color .25s}input.umb-locked-field__input:focus{box-shadow:none!important}input.umb-locked-field__input.-unlocked{color:#515151}.umb-nav-tabs{position:absolute;z-index:10}.umb-nav-tabs.-padding-left{padding-left:20px}.umb-tab-content{position:relative;top:22px;padding-top:20px;border-top:1px solid #d9d9d9}.umb-load-indicator{position:absolute;top:50%;left:50%;padding:0;margin:0;margin-top:-6px;margin-left:-6px;font-size:0;list-style:none;transform:translate(-50%,-50%)}.umb-load-indicator__bubble{position:absolute;top:50%;left:0;width:0;width:6px;height:0;height:6px;margin:0;border:2px solid #2e8aea;border-radius:100%;transform:transformZ(0);animation:umbLoadIndicatorAnimation 1.4s infinite}.umb-load-indicator__bubble:nth-child(1n){left:-16px;animation-delay:0s}.umb-load-indicator__bubble:nth-child(2n){left:0;animation-delay:.15s}.umb-load-indicator__bubble:nth-child(3n){left:16px;animation-delay:.30s}@keyframes umbLoadIndicatorAnimation{0%{background:#2e8aea;transform:scale(0.5)}50%{background:white;transform:scale(1)}100%{background:#2e8aea;transform:scale(0.5)}}.umb-breadcrumbs{display:-ms-flexbox;display:flex;margin-bottom:0;margin-left:0;list-style:none;-ms-flex-wrap:wrap;flex-wrap:wrap}.umb-breadcrumbs__ancestor{display:-ms-flexbox;display:flex}.umb-breadcrumbs__ancestor-link,.umb-breadcrumbs__ancestor-text{max-width:150px;overflow:hidden;font-size:11px;color:#555;text-overflow:ellipsis;white-space:nowrap}.umb-breadcrumbs__ancestor-link{text-decoration:underline}.umb-breadcrumbs__ancestor-link:hover{color:#000}.umb-breadcrumbs__seperator{position:relative;top:1px;margin-right:5px;margin-left:5px;color:#ccc}.umb-media-grid{display:-ms-flexbox;display:flex;width:100%;margin-bottom:30px;-ms-flex-direction:row;flex-direction:row;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:center;align-items:center}.umb-media-grid__item{position:relative;display:-ms-flexbox;display:flex;margin:10px;overflow:hidden;cursor:pointer;box-shadow:0 1px 1px 0 rgba(0,0,0,0.2);transition:box-shadow 100ms;-ms-flex-direction:column;flex-direction:column;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-pack:center;justify-content:center;-ms-flex-line-pack:center;align-content:center;-ms-flex-align:center;align-items:center;-ms-flex-item-align:stretch;align-self:stretch}.umb-media-grid__item.-file{background-color:#f8f8f8}.umb-media-grid__item.-selected{box-shadow:0 2px 8px 0 rgba(0,0,0,0.35)}.umb-media-grid__item:hover{text-decoration:none}.umb-media-grid__item-image{position:relative;height:auto;max-width:100%!important}.umb-media-grid__item-image-placeholder{position:relative;width:100%;height:auto;max-width:100%}.umb-media-grid__image-background{position:absolute;top:0;right:0;bottom:0;left:0;background:url("../img/checkered-background.png");background-repeat:repeat;content:"";opacity:.5}.umb-media-grid__item-overlay{position:absolute;right:0;bottom:0;left:0;z-index:100;display:-ms-flexbox;display:flex;padding:5px 10px;overflow:hidden;font-size:11px;color:white;white-space:nowrap;background:#2e8aea;opacity:0;box-sizing:border-box;transition:opacity 150ms}.umb-media-grid__item.-file .umb-media-grid__item-overlay{color:#555;background:#f8f8f8;opacity:1}.umb-media-grid__item.-file:hover .umb-media-grid__item-overlay,.umb-media-grid__item.-file.-selected .umb-media-grid__item-overlay{color:#fff;background:#2e8aea}.umb-media-grid__info{margin-right:5px}.umb-media-grid__item-overlay.-locked{opacity:1}.umb-media-grid__item:hover .umb-media-grid__item-overlay{opacity:1}.umb-media-grid__item-name{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.umb-media-grid__item-icon{position:absolute;top:45%;left:50%;font-size:40px!important;color:#555;transform:translate(-50%,-50%)}.umb-media-grid__checkmark{position:absolute;top:10px;right:10px;z-index:2;display:-ms-flexbox;display:flex;width:25px;height:25px;margin-left:7px;color:#fff;background:#2e8aea;border:1px solid #fff;border-radius:50px;box-sizing:border-box;transition:background 100ms;-ms-flex-pack:center;justify-content:center;-ms-flex-align:center;align-items:center}.umb-folder-grid{display:-ms-flexbox;display:flex;width:100%;margin-bottom:30px;-ms-flex-direction:row;flex-direction:row;-ms-flex-wrap:wrap;flex-wrap:wrap}.umb-folder-grid__folder{position:relative;display:-ms-flexbox;display:flex;padding:10px 20px;margin:5px;cursor:pointer;background:#f8f8f8;border:1px solid transparent;box-sizing:border-box;transition:border .2s;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-ms-flex-align:center;align-items:center;-ms-flex:1 1 200px;flex:1 1 200px;-ms-flex-pack:justify;justify-content:space-between}.umb-folder-grid__folder:focus,.umb-folder-grid__folder:active{text-decoration:none}.umb-folder-grid__folder:hover{text-decoration:none;background-color:#ebebeb}.umb-folder-grid__folder-description{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center}.umb-folder-grid__folder-icon,.umb-folder-grid__folder-icon[class^="icon-"],.umb-folder-grid__folder-icon[class*=" icon-"]{margin-right:15px;font-size:20px;color:#000}.umb-folder-grid__folder-name{font-size:13px;font-weight:bold;color:#000}.umb-folder-grid__folder-name:hover{text-decoration:underline}.umb-folder-grid__action{display:-ms-flexbox;display:flex;width:25px;height:25px;margin-left:7px;color:#fff;cursor:pointer;background:rgba(0,0,0,0.4);border:1px solid #fff;border-radius:50px;opacity:0;box-sizing:border-box;-ms-flex-pack:center;justify-content:center;-ms-flex-align:center;align-items:center}.umb-folder-grid__action.-selected{background:#2e8aea;opacity:1}.umb-content-grid{display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-pack:center;justify-content:center}.umb-content-grid__item{position:relative;margin:10px;cursor:pointer;background:#f8f8f8;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-ms-flex:0 1 200px;flex:0 1 200px}.umb-content-grid__item.-selected{box-shadow:0 2px 8px 0 rgba(0,0,0,0.35)}.umb-content-grid__icon-container{display:-ms-flexbox;display:flex;height:75px;background:#ebebeb;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center}.umb-content-grid__icon,.umb-content-grid__icon[class^="icon-"],.umb-content-grid__icon[class*=" icon-"]{font-size:40px;color:#888}.umb-content-grid__icon.-light{color:#d9d9d9}.umb-content-grid__content{padding:15px;box-sizing:border-box}.umb-content-grid__item-name{display:inline-block;padding-bottom:10px;margin-bottom:10px;font-weight:bold;line-height:1.4em;color:black;border-bottom:1px solid #d9d9d9}.umb-content-grid__item-name:hover{text-decoration:underline}.umb-content-grid__item-name.-light{color:#d9d9d9}.umb-content-grid__details-list{margin-bottom:0;margin-left:0;font-size:11px;list-style:none}.umb-content-grid__details-list.-light{color:#d9d9d9}.umb-content-grid__details-label{display:inline-block;font-weight:bold}.umb-content-grid__details-value{display:inline-block}.umb-content-grid__checkmark{position:absolute;top:10px;right:10px;display:-ms-flexbox;display:flex;width:25px;height:25px;color:#fff;cursor:pointer;background:#2e8aea;border:1px solid #fff;border-radius:50px;box-sizing:border-box;-ms-flex-pack:center;justify-content:center;-ms-flex-align:center;align-items:center}.umb-content-grid__item:hover .umb-content-grid__action:not(.-selected){opacity:1;animation:fadeIn;animation-duration:.2s;animation-timing-function:ease-in-out}.umb-content-grid__no-items{padding-top:50px;padding-bottom:50px;font-size:16px;font-weight:bold;color:#d9d9d9}.umb-layout-selector{position:relative;display:inline-block}.umb-layout-selector__active-layout{display:-ms-flexbox;display:flex;width:30px;height:30px;font-size:20px;cursor:pointer;border:1px solid transparent;box-sizing:border-box;-ms-flex-pack:center;justify-content:center;-ms-flex-align:center;align-items:center}.umb-layout-selector__active-layout:hover{border-color:#d9d9d9}.umb-layout-selector__dropdown{position:absolute;left:50%;z-index:999;display:-ms-flexbox;display:flex;padding:5px;background:#333;background:#fff;transform:translate(-50%,0);-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-direction:column;flex-direction:column}.umb-layout-selector__dropdown-item{display:-ms-flexbox;display:flex;padding:5px;margin:3px 5px;cursor:pointer;border:1px solid transparent;-ms-flex-line-pack:center;align-content:center;-ms-flex-pack:center;justify-content:center;-ms-flex-direction:column;flex-direction:column}.umb-layout-selector__dropdown-item:hover{border:1px solid #d9d9d9}.umb-layout-selector__dropdown-item.-active{border:1px solid #2e8aea}.umb-layout-selector__dropdown-item-icon,.umb-layout-selector__dropdown-item-icon[class^="icon-"],.umb-layout-selector__dropdown-item-icon[class*=" icon-"]{font-size:20px;color:#555;text-align:center}.umb-tooltip{position:fixed;z-index:1000;display:-ms-flexbox;display:flex;max-width:200px;padding:10px;margin-top:15px;font-size:12px;background:#fff;animation:fadeIn;animation-duration:.1s;animation-timing-function:ease-in}.umb-tooltip-list{padding:10px;margin-bottom:0;margin-left:0;list-style:none}.umb-tooltip-list__item{margin-bottom:5px}.umb-tooltip-list__item:last-child{margin-bottom:0}.umb-tooltip-list__item-label{margin-bottom:-3px;font-weight:bold}.umb-overlay-backdrop{position:fixed;top:0;left:0;z-index:2000;width:100%;height:100%;background-color:rgba(255,255,255,0.5);animation:fadeIn .2s}.umb-grid IFRAME{overflow:hidden}.umb-grid .ui-sortable-helper{position:absolute!important;width:42px!important;height:42px!important;padding:5px;overflow:hidden;font-family:"icomoon";text-align:center;background-color:#2e8aea!important;border-radius:2px;box-shadow:3px 3px 12px 0 rgba(50,50,50,0.45)}.umb-grid .ui-sortable-helper:after{font-size:22px;line-height:42px;color:#fff;content:"\e126"}.umb-grid .ui-sortable-helper *{display:none}.umb-grid .ui-sortable-helper .umb-row-title-bar,.umb-grid .ui-sortable-helper .cell-tools-add{display:none!important}.umb-grid .ui-sortable-placeholder{position:absolute;right:0;left:0;height:2px;margin-bottom:20px;background-color:#2e8aea}.umb-grid .ui-sortable-placeholder:before,.umb-grid .ui-sortable-placeholder:after{position:absolute;top:-9px;font-family:"icomoon";font-size:18px;color:#2e8aea}.umb-grid .ui-sortable-placeholder:before{left:-5px;content:"\e0e9"}.umb-grid .ui-sortable-placeholder:after{right:-5px;content:"\e0d7"}.umb-grid .umb-cell .ui-sortable-placeholder{right:10px;left:10px}.umb-grid-width{width:100%;margin:20px auto}.umb-grid .right{float:right}.umb-grid .tb{width:100%}.umb-grid .td{display:inline-block;width:100%;vertical-align:top;box-sizing:border-box}.umb-grid .middle{text-align:center}.umb-grid .mainTd{position:relative}.umb-grid .umb-column{position:relative}.umb-grid .umb-row{position:relative;padding-top:10px;margin-bottom:40px}.umb-grid .row-tools a{text-decoration:none}.umb-grid .umb-cell{position:relative}.umb-grid .umb-cell-content{position:relative;display:block;margin:10px;border:1px solid transparent;box-sizing:border-box}.umb-grid .umb-row .umb-cell-placeholder{min-height:130px;background-color:#f8f8f8;border-color:#d9d9d9;border-style:dashed;border-width:2px;transition:border-color 100ms linear}.umb-grid .umb-row .umb-cell-placeholder:hover{cursor:pointer;border-color:#2e8aea}.umb-grid .umb-cell-content.-has-editors{padding-top:38px;background-color:#fff;border-color:#d9d9d9;border-style:solid;border-width:1px}.umb-grid .umb-cell-content.-has-editors:hover{cursor:auto}.umb-grid .umb-cell-content.-has-editors.-collapsed{padding-top:10px}.umb-grid .cell-tools{position:absolute;top:10px;right:10px;font-size:16px;color:#555}.umb-grid .cell-tool{float:right;cursor:pointer}.umb-grid .cell-tool:hover{color:#0064cd}.umb-grid .cell-tools-add{color:#2e8aea}.umb-grid .cell-tools-add:focus,.umb-grid .cell-tools-add:hover{text-decoration:none}.umb-grid .cell-tools-add.-center{position:absolute;top:50%;left:50%;color:#2e8aea;transform:translate(-50%,-50%)}.umb-grid .cell-tools-add.-bar{display:block;padding:5px;margin:10px;text-align:center;background:#f8f8f8;border:1px dashed #ccc}.umb-grid .cell-tools-remove{position:relative;display:inline-block}.umb-grid .cell-tools-remove .iconBox:hover,.umb-grid .cell-tools-remove .iconBox:hover *{background:#9d261d!important;border-color:#9d261d!important}.umb-grid .cell-tools-move{display:inline-block}.umb-grid .cell-tools-edit{display:inline-block;color:#fff}.umb-grid .drop-overlay{position:absolute;top:0;left:0;z-index:10;display:-ms-flexbox;display:flex;width:100%;height:100%;font-size:14px;font-weight:bold;line-height:1.3em;text-align:center;background:#fff;opacity:.9;box-sizing:border-box;-ms-flex-pack:center;justify-content:center;-ms-flex-align:center;align-items:center;-ms-flex-direction:column;flex-direction:column}.drop-overlay.-disable{color:#9d261d}.drop-overlay.-allow{color:#46a546}.umb-grid .drop-overlay .drop-icon{margin-bottom:20px;font-size:40px}.umb-grid .umb-control{position:relative;display:block;margin-right:10px;margin-bottom:10px;margin-left:10px;overflow:hidden}.umb-control-collapsed{padding:5px 10px;cursor:move;background-color:#f8f8f8;border-color:transparent;border-style:solid;border-width:1px}.umb-control-collapsed:hover{border-color:#2e8aea}.umb-grid .umb-control-click-overlay{position:absolute;top:0;left:0;z-index:5;width:100%;height:100%;cursor:pointer;opacity:0}.umb-grid .umb-control-click-overlay:hover{background-color:#2e8aea;opacity:.1;transition:opacity .1s}.umb-grid .umb-row-title-bar{display:-ms-flexbox;display:flex;padding-right:10px;padding-left:10px}.umb-grid .umb-row-title{display:inline-block;margin-right:6px;font-size:15px;font-weight:bold;color:#000;cursor:pointer}.umb-grid .row-tools{display:inline-block;margin-left:10px;font-size:18px;color:#555}.umb-grid .row-tool{cursor:pointer}.umb-grid .umb-add-row{text-align:center}.umb-grid .umb-control-placeholder{position:relative;min-height:20px;text-align:center;text-align:-moz-center;cursor:text}.umb-grid .umb-control-placeholder .placeholder{height:20px;padding:5px;font-size:14px;text-align:left;border:1px solid rgba(182,182,182,0.3);opacity:.7}.umb-grid .umb-control-placeholder:hover .placeholder{border:1px solid rgba(182,182,182,0.8)}.umb-grid .umb-editor-placeholder{position:relative;min-height:65px;padding:20px;padding-bottom:30px;text-align:center;text-align:-moz-center;cursor:pointer;background-color:#fff;border:4px dashed #d9d9d9}.umb-grid .umb-editor-placeholder i{display:block;margin-bottom:10px;font-size:85px;line-height:85px;color:#d9d9d9}.umb-grid .umb-row.-active{background-color:#2e8aea}.umb-grid .umb-row.-active .umb-row-title-bar{cursor:move}.umb-grid .umb-row.-active .row-tool,.umb-grid .umb-row.-active .umb-row-title{color:#fff}.umb-grid .umb-row.-active .umb-grid-has-config{color:rgba(255,255,255,0.66)}.umb-grid .umb-row.-active .umb-cell .umb-grid-has-config{color:rgba(0,0,0,0.44)}.umb-grid .umb-row.-active .umb-cell .umb-cell-content{border-color:transparent}.umb-grid .umb-row.-active-child{background-color:#f8f8f8}.umb-grid .umb-row.-active-child .umb-row-title-bar{cursor:default}.umb-grid .umb-row.-active-child .umb-row-title{color:#555}.umb-grid .umb-row.-active-child .row-tool{color:rgba(0,0,0,0.23)}.umb-grid .umb-row.-active-child .umb-grid-has-config{color:rgba(0,0,0,0.44)}.umb-grid .umb-row.-active-child .umb-cell-content.-placeholder{border-color:#d9d9d9}.umb-grid .umb-row.-active-child .umb-cell-content.-placeholder:hover{border-color:rgba(85,85,85,0.44)}.umb-grid .umb-row .umb-cell.-active{border-color:#d9d9d9}.umb-grid .umb-row .umb-cell.-active .umb-cell-content.-has-editors{border-color:#2e8aea;box-shadow:3px 3px 6px rgba(0,0,0,0.07)}.umb-grid .umb-row .umb-cell.-active-child .cell-tool{color:rgba(0,0,0,0.23)}.umb-grid .umb-row .umb-cell.-active-child .umb-cell-content.-has-editors{border-color:rgba(113,136,160,0.44)}.umb-grid .umb-row-title-bar{display:-ms-flexbox;display:flex}.umb-grid .umb-grid-right{display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;-ms-flex-pack:center;justify-content:center}.umb-grid .umb-tools{margin-left:auto}.umb-grid-add-more-content{text-align:center}.umb-grid .newbtn{display:inline-block;width:auto;padding:6px 15px;margin:10px auto 20px;font-size:12px;font-weight:bold;border-color:#e2e2e2;border-style:solid}.umb-grid .newbtn:hover{cursor:pointer;opacity:.77}.umb-grid textarea.textstring{display:block;overflow:hidden;color:#555;background:#fff;border:0;outline:0;resize:none}.umb-grid .umb-cell-rte textarea{display:none!important}.umb-grid .umb-cell-media .caption{display:block;width:98%;overflow:hidden;font-style:italic;background:#fff;border:0;outline:0;resize:none}.umb-grid .cellPanelRte{min-height:60px}.umb-grid .umb-cell-embed iframe{width:100%}.umb-grid .umb-cell-rte{border-color:transparent}.umb-grid .iconBox{display:inline-block;padding:4px 6px;margin:2px;cursor:pointer;background:#fff;border:1px solid #b6b6b6;border-radius:200px}.umb-grid .iconBox:hover,.umb-grid .iconBox:hover *{color:white!important;text-decoration:none;background:#2e8aea!important;border-color:#2e8aea!important}.umb-grid .iconBox span.prompt{display:block;text-align:center;white-space:nowrap}.umb-grid .iconBox span.prompt>a{text-decoration:underline}.umb-grid .iconBox a:hover{color:white!important;text-decoration:none}.umb-grid .iconBox.selected{background:transparent;background-image:linear-gradient(to bottom,#e6e6e6,#bfbfbf);background-repeat:repeat-x;border-color:#bfbfbf #bfbfbf #999;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);border-radius:3px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe6e6e6',endColorstr='#ffbfbfbf',GradientType=0);zoom:1;box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);-webkit-appearance:none}.umb-grid .iconBox i{display:block;font-size:16px!important;color:#5f5f5f}.umb-grid .help-text{display:inline-block;clear:both;font-size:14px;font-weight:bold;color:#000}.umb-grid .mce-panel{clear:both;background:transparent!important;border:none!important}.umb-grid .mce-btn button{padding:8px 6px;line-height:inherit}.umb-grid .mce-toolbar{display:none;background-color:#fafafa;border-bottom:1px solid rgba(207,207,207,0.7)}.umb-grid .umb-control.-active .mce-toolbar{display:block}.umb-grid .mce-flow-layout-item{margin:0}.umb-grid .mceContentBody{overflow-y:hidden!important}.umb-grid .fullSizeImage{width:100%}.umb-grid .boxWidth{margin-bottom:10px;text-align:right}.umb-grid .boxWidth input{width:40px;text-align:center}.umb-grid .boxWidth label{padding:0;margin:5px 5px 0 0;font-size:10px;color:#808080}.umb-grid .umb-control{border-color:transparent;border-style:solid;border-width:1px}.umb-grid .umb-control.-active{border-color:#2e8aea}.umb-grid .umb-templates-columns{margin-top:30px}.umb-grid .umb-control-inner{position:relative}.umb-grid .umb-control-bar{display:-ms-flexbox;display:flex;height:0;padding:2px 5px;font-size:10px;color:#fff;background:#2e8aea;opacity:0;transition:height 80ms linear,opacity 80ms linear;-ms-flex-align:center;align-items:center}.umb-grid .umb-control-title{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center}.umb-grid .umb-control.-active .umb-control-bar{height:25px;cursor:move;opacity:1}.umb-grid .umb-control-tools{display:inline-block;margin-left:10px}.umb-grid .umb-control-tool{position:relative;display:inline-block;margin-right:5px;font-size:16px;cursor:pointer}.umb-grid .umb-templates{width:100%;overflow:hidden;text-align:center}.umb-grid .umb-templates-template{display:inline-block;width:100px;padding-right:30px;margin:20px}.umb-grid .umb-templates-template a.tb:hover{border:5px solid #2e8aea}.umb-grid .umb-templates-template .tb{position:relative;width:100%;height:150px;padding:10px;cursor:pointer;background-color:#f8f8f8;border:5px solid #d9d9d9}.umb-grid .umb-templates-template .tr{position:relative;height:100%}.umb-grid .umb-templates-template .tb .umb-templates-column{height:100%;border:1px dashed #d9d9d9;border-right:0}.umb-grid .umb-templates-template .tb .umb-templates-column.last{border-right:1px dashed #d9d9d9!important}.umb-grid a.umb-templates-column:hover,.umb-grid a.umb-templates-column.selected{background-color:#2e8aea}.umb-grid .templates-preview{display:inline-block;width:100%;text-align:center}.umb-grid .templates-preview small{position:absolute;bottom:-25px;left:0;width:100%;padding-top:15px}.umb-grid .templates-preview .help-text{margin:35px 35px 0 0}.umb-grid .preview-rows{position:relative;display:inline-block;width:125px;margin:15px;border:3px solid #d9d9d9;box-sizing:border-box;transition:border 100ms linear}.umb-grid .preview-rows.prevalues-rows{float:left;width:80px;margin:0 20px 20px 0}.umb-grid .preview-rows.prevalues-templates{float:left;margin:0 20px 20px 0}.umb-grid .preview-rows:hover{cursor:pointer;border-color:#2e8aea}.umb-grid .preview-rows .preview-row{display:inline-block;width:100%;vertical-align:bottom}.umb-grid .preview-rows.layout{padding:2px}.umb-grid .preview-rows.layout .preview-row{height:100%}.umb-grid .preview-rows.layout .preview-col{height:180px}.umb-grid .preview-rows.layout .preview-cell{background-color:#f8f8f8}.umb-grid .preview-rows.layout .preview-overlay{display:none}.umb-grid .preview-rows.columns{min-height:16px;padding:1px;line-height:11px}.umb-grid .preview-rows.columns.prevalues-rows{min-height:30px}.umb-grid .preview-rows .preview-col{display:block;float:left;width:33.3%;height:10px;margin:0;border:1px solid #fff;box-sizing:border-box}.umb-grid .preview-rows .preview-col .preview-cell{display:block;width:100%;height:100%;margin:0 1px 1px 0;background-color:#d9d9d9}.umb-grid .preview-rows.prevalues-templates .preview-col{height:80px}.umb-grid .preview-overlay{position:absolute;top:0;left:0;display:block;width:100%;height:100%;border:3px solid white;box-sizing:border-box}.umb-grid .umb-grid-has-config{display:inline;font-size:12px;color:rgba(0,0,0,0.44)}.umb-grid .umb-cell .umb-grid-has-config{position:absolute;top:10px;left:10px}.umb-grid .cell-tools-menu{position:absolute;top:0;left:50%;z-index:6660;width:360px;height:380px;padding:7px;margin-top:-270px;margin-left:-150px;overflow:auto;background:#fff;border:1px solid #ccc;box-shadow:3px 3px 12px 0 rgba(50,50,50,0.45)}.umb-grid .cell-tools-menu h5{padding:10px;margin-top:0;color:#999;border-bottom:1px solid #d9d9d9}.umb-grid .elements{display:block;padding:0;margin:0}.umb-grid .elements li{display:inline-block;width:90px;height:80px;padding:5px;margin:5px;overflow:hidden;font-size:11px}.umb-grid .elements li:hover,.umb-grid .elements li:hover *{color:#fff;background:#2e8aea}.umb-grid .elements a{color:#222;text-decoration:none}.umb-grid .elements i{display:block;font-size:30px;line-height:50px;color:#999}.umb-grid-configuration .umb-templates{text-align:left}.umb-grid-configuration ul{display:block}.umb-grid-configuration ul li{display:block;width:auto;text-align:left}.umb-grid-configuration .umb-templates .umb-templates-template .tb{max-height:50px;padding:0;overflow:hidden;border-spacing:2px;border-width:2px!important}.umb-grid-configuration .umb-templates .umb-templates-template span{display:inline-block;background:#d9d9d9}.umb-grid-configuration .umb-templates .umb-templates-template .tb:hover{border-width:2px!important}.umb-grid-configuration .umb-templates-column{display:block;float:left;margin-left:-1px;background:#d9d9d9;border:1px white solid!important}.umb-grid-configuration .umb-templates-column.last{margin-right:-1px}.umb-grid-configuration .umb-templates-column.add{font-size:20px;line-height:70px;color:#ccc;text-align:center;text-decoration:none;background:#fff}.umb-grid-configuration .mainTdpt{height:initial;border:0}.umb-grid-configuration .umb-templates-rows .umb-templates-row{width:60px;margin:0 50px 20px 0}.umb-grid-configuration .umb-templates-rows .umb-templates-row .tb{padding:0;border-spacing:2px;border-width:2px!important}.umb-grid-configuration .umb-templates-rows .mainTdpt{height:10px!important}.umb-grid-configuration a.umb-templates-column{height:70px!important}.umb-empty-state{font-size:16.099999999999998px;line-height:1.8em;color:#7f7f7f;text-align:center}.umb-empty-state.-small{font-size:11.9px}.umb-empty-state.-large{font-size:17.5px}.umb-empty-state.-center{position:absolute;top:50%;left:50%;width:80%;max-width:400px;transform:translate(-50%,-50%)}.umb-property-editor.-not-clickable{pointer-events:none}.umb-iconpicker{display:-ms-flexbox;display:flex;margin:0;-ms-flex-direction:row;flex-direction:row;-ms-flex-wrap:wrap;flex-wrap:wrap}.umb-iconpicker-item{display:-ms-flexbox;display:flex;margin-bottom:0;overflow:hidden;-ms-flex-direction:row;flex-direction:row;-ms-flex:0 0 14.28%;flex:0 0 14.28%;-ms-flex-pack:center;justify-content:center;-ms-flex-align:center;align-items:center}.umb-iconpicker-item a{display:-ms-flexbox;display:flex;width:100%;height:100%;padding:15px 0;text-decoration:none;-ms-flex-pack:center;justify-content:center;-ms-flex-align:center;align-items:center}.umb-iconpicker-item a:hover,.umb-iconpicker-item a:focus{background:#f5f5f5;outline:0}.umb-iconpicker-item a:active{background:#eee}.umb-iconpicker-item i{font-size:30px}.umb-packages-view-title{margin-bottom:30px;font-size:20px;font-weight:bold;color:#000}.umb-packages-view-wrapper{padding:20px 60px}@media(max-width:768px){.umb-packages-view-wrapper{padding:0}}.umb-packages-section{margin-bottom:40px}.umb-packages-search{width:100%;padding:30px;background:#f8f8f8;border-radius:3px;box-sizing:border-box}.umb-packages-search input{min-height:44px;padding:4px 10px;margin-bottom:0;font-size:16px;border-color:#ececec;border-color:#d9d9d9;border-width:2px;border-radius:3px}.umb-packages-search input:hover,.umb-packages-search input:focus{border-color:#d9d9d9}.umb-packages__pagination{display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center}.umb-packages{display:-ms-flexbox;display:flex;margin:0 -10px;-ms-flex-wrap:wrap;flex-wrap:wrap}.umb-package{max-width:100%;padding:10px;box-sizing:border-box;-ms-flex:0 0 100%;flex:0 0 100%}@media(min-width:768px){.umb-package{max-width:50%;-ms-flex:0 0 50%;flex:0 0 50%}}@media(min-width:1200px){.umb-package{max-width:33.33%;-ms-flex:0 0 33.33%;flex:0 0 33.33%}}@media(min-width:1400px){.umb-package{max-width:25%;-ms-flex:0 0 25%;flex:0 0 25%}}@media(min-width:1700px){.umb-package{max-width:20%;-ms-flex:0 0 20%;flex:0 0 20%}}@media(min-width:1900px){.umb-package{max-width:16.66%;-ms-flex:0 0 16.66%;flex:0 0 16.66%}}@media(min-width:2200px){.umb-package{max-width:14.28%;-ms-flex:0 0 14.28%;flex:0 0 14.28%}}.umb-package-link{position:relative;display:block;width:100%;height:100%;text-decoration:none!important;border:1px solid #ececec;border-radius:3px;box-sizing:border-box;transition:border-color 100ms ease;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:center;justify-content:center}.umb-package-link:hover{border-color:#2e8aea}.umb-package-icon{display:-ms-flexbox;display:flex;min-height:60px;padding-top:10px;padding-right:10px;padding-bottom:10px;padding-left:10px;text-align:center;background-color:white;border-top-right-radius:3px;border-top-left-radius:3px;-ms-flex-pack:center;justify-content:center;-ms-flex-align:center;align-items:center}.umb-package-icon img{width:70px;height:auto;max-width:70px}.umb-package-info{padding-top:15px;padding-right:15px;padding-bottom:15px;padding-left:15px;text-align:center;background:#f8f8f8;border-top:1px solid #ececec;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.umb-package-name{max-width:250px;margin-right:auto;margin-bottom:5px;margin-left:auto;overflow:hidden;font-size:14px;font-weight:bold;line-height:normal;text-overflow:ellipsis;white-space:nowrap}.umb-package-description{max-width:100%;overflow:hidden;font-size:11px;line-height:1.1rem;color:#7f7f7f;text-overflow:ellipsis;word-wrap:break-word;white-space:nowrap}.umb-package-numbers{display:-ms-flexbox;display:flex;margin-top:10px;opacity:.6;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-direction:row;flex-direction:row;-ms-flex-pack:center;justify-content:center}.umb-package-numbers small{display:-ms-flexbox;display:flex;padding:0 5px;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center}.umb-package-numbers i{font-size:14px}.umb-package-link:hover .umb-package-numbers{opacity:1}.umb-package-link:hover .umb-package-numbers .icon-hearts{color:red!important}.umb-package-version{display:-ms-inline-flexbox;display:inline-flex;padding:1px 5px;font-size:11px;font-weight:bold;color:black;background:#ececec;border-radius:3px}.umb-era-button{display:-ms-flexbox;display:flex;height:38px;max-width:100%;padding:0 18px;overflow:hidden;font-size:14px;font-weight:bold;line-height:1;color:#484848;text-decoration:none!important;white-space:nowrap;cursor:pointer;background-color:#e0e0e0;border:0 none;border-radius:3px;box-sizing:border-box;transition:background-color 80ms ease,color 80ms ease;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-ms-flex-pack:center;justify-content:center;-ms-flex-align:center;align-items:center}.umb-era-button:hover,.umb-era-button:active{color:#484848;text-decoration:none;background-color:#d3d3d3;outline:0}.umb-era-button:focus{outline:0}.umb-era-button.-blue{color:white;background:#2e8aea}.umb-era-button.-blue:hover{background-color:#0064cd}.umb-era-button.-link{padding:0;background:transparent}.umb-era-button.-link:hover{background-color:transparent;opacity:.6}.umb-era-button.-inactive{color:#BBB;cursor:not-allowed;background:#eae7e7}.umb-era-button.-inactive:hover{color:#BBB;background:#eae7e7}.umb-era-button.-full-width{display:block;width:100%}.umb-era-button.umb-button--s{height:30px;font-size:13px}.umb-packages-categories{display:-ms-flexbox;display:flex;-webkit-user-select:center;-moz-user-select:center;-ms-user-select:center;user-select:center;-ms-flex-wrap:wrap;flex-wrap:wrap}.umb-packages-category{display:-ms-flexbox;display:flex;max-width:25%;padding:10px 0;font-size:14px;font-weight:bold;color:#000;border-top:1px solid #d9d9d9;border-right:1px solid #d9d9d9;border-bottom:1px solid #d9d9d9;box-sizing:border-box;-ms-flex-align:center;align-items:center;-ms-flex:1 0 auto;flex:1 0 auto;-ms-flex-pack:center;justify-content:center}@media(max-width:768px){.umb-packages-category{width:100%;margin-top:0;margin-right:0!important;margin-bottom:15px!important;margin-left:0!important}}@media(max-width:992px){.umb-packages-category{max-width:100%;padding:10px;margin:5px;text-align:center;border:1px solid #d9d9d9;border-radius:3px;-ms-flex:0 0 auto;flex:0 0 auto}}@media(min-width:1100px) and (max-width:1300px){.umb-packages-category{max-width:100%;padding:10px;margin:5px;text-align:center;border:1px solid #d9d9d9;border-radius:3px;-ms-flex:0 0 auto;flex:0 0 auto}}.umb-packages-category:hover,.umb-packages-category.-active{color:#2e8aea;text-decoration:none}.umb-packages-category.-first{border-left:1px solid #d9d9d9;border-bottom-left-radius:3px;border-top-left-radius:3px}.umb-packages-category.-last{border-right:1px solid #d9d9d9;border-top-right-radius:3px;border-bottom-right-radius:3px}.umb-package-details{display:-ms-flexbox;display:flex}a.umb-package-details__back-link{font-weight:bold;color:#000}.umb-package-details__back-link:hover{color:#7f7f7f;text-decoration:none}.umb-package-details__main-content{width:calc(100% - 350px - 40px);margin-right:40px;-ms-flex:1 1 auto;flex:1 1 auto}.umb-package-details__sidebar{-ms-flex:0 0 350px;flex:0 0 350px}@media(max-width:768px){.umb-package-details{-ms-flex-direction:column;flex-direction:column}.umb-package-details__main-content{width:100%;margin-right:0;margin-bottom:30px;-ms-flex:1 1 auto;flex:1 1 auto}.umb-package-details__sidebar{width:100%;-ms-flex:1 1 auto;flex:1 1 auto}}.umb-package-details__section{padding:20px;margin-bottom:20px;background:#f8f8f8;border-radius:3px}.umb-package-details__section-title{margin-top:0;margin-bottom:15px;font-size:17px;font-weight:bold;color:black}.umb-package-details__section-description{margin-bottom:15px;font-size:12px;line-height:1.6em}.umb-package-details__information-item{margin-bottom:10px;font-size:13px}.umb-package-details__information-item-label{font-weight:bold;color:black}.umb-package-details__information-item-content{word-break:break-word}.umb-package-details__information-item-label-2{font-size:12px;color:#7f7f7f}.umb-package-details__compatability{margin-bottom:15px}.umb-package-details__compatability-label{margin-bottom:3px}.umb-package-details__description{margin-bottom:20px;line-height:1.6em}.umb-package-details__description p{margin-bottom:20px}.umb-package-details__link{color:#da3287}.umb-package-details__link:hover{color:#b32d71;text-decoration:none}.umb-package-details__owner-profile{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center}.umb-package-details__owner-profile-avatar{margin-right:15px;-ms-flex:0 0 auto;flex:0 0 auto}.umb-package-details__owner-profile-name{font-size:15px;font-weight:bold;color:#000}.umb-package-details__owner-profile-karma{font-size:12px;color:#7f7f7f}.umb-gallery__thumbnails{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap}.umb-gallery__thumbnail{max-width:100px;padding:10px;margin:5px;border:1px solid #d9d9d9;border-radius:3px;box-sizing:border-box;-ms-flex:0 1 100px;flex:0 1 100px}.umb-gallery__thumbnail:hover{cursor:pointer;border-color:#2e8aea}.umb-package-list{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}.umb-package-list__item{display:-ms-flexbox;display:flex;padding:20px;margin-bottom:10px;background:#f8f8f8;border-radius:3px;-ms-flex-direction:row;flex-direction:row;-ms-flex-align:center;align-items:center}.umb-package-list__item-icon{margin-right:20px;font-size:30px;text-align:center;-ms-flex:0 0 50px;flex:0 0 50px}.umb-package-list__item-content{margin-right:20px;-ms-flex:1 1 auto;flex:1 1 auto}.umb-package-list__item-name{margin-bottom:5px;font-size:16px;font-weight:bold;color:#000}.umb-package-list__item-description{font-size:14px;color:#7f7f7f}.umb-package-list__item-actions{display:-ms-flexbox;display:flex;-ms-flex:1 1 auto;flex:1 1 auto;-ms-flex-pack:end;justify-content:flex-end}.faded{color:#7f7f7f}.umb-upload-local__dropzone{position:relative;display:-ms-flexbox;display:flex;width:500px;height:300px;margin-bottom:30px;background:#f8f8f8;border:2px dashed #d9d9d9;border-radius:3px;transition:100ms box-shadow ease,100ms border ease;-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:center;justify-content:center;-ms-flex-align:center;align-items:center}.umb-upload-local__dropzone:hover,.umb-upload-local__dropzone.drag-over{border-color:#2e8aea;border-style:solid;box-shadow:0 3px 8px rgba(0,0,0,0.1);transition:100ms box-shadow ease,100ms border ease}.umb-upload-local__dropzone i{display:block;font-size:110px;line-height:1;color:#d9d9d9}.umb-upload-local__select-file{font-weight:bold;color:#2e8aea;cursor:pointer}.umb-upload-local__select-file:hover{text-decoration:underline}.umb-accept-terms{display:-ms-flexbox;display:flex;font-size:13px;-ms-flex-align:center;align-items:center}.umb-package-installer-label .label-text{margin-left:5px}.umb-package-installer-label input[type="radio"],.umb-package-installer-label input[type="checkbox"]{margin-top:0}.umb-package-installer-label{display:-ms-inline-flexbox;display:inline-flex;font-size:13px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-ms-flex-align:center;align-items:center}.umb-info-local-items{display:-ms-flexbox;display:flex;width:100%;max-width:540px;margin:0 20px;background:#f8f8f8;border:2px solid #d9d9d9;border-radius:3px;-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:center;justify-content:center;-ms-flex-align:center;align-items:center}.umb-info-local-items a{text-decoration:underline}.umb-info-local-items a:hover{text-decoration:none}.umb-info-local-items .umb-package-icon{width:100%;min-height:150px;font-size:60px;box-sizing:border-box}.umb-info-local-items .umb-package-icon img{max-width:100px}.umb-info-local-items .umb-package-info{width:100%;padding:20px 40px;box-sizing:border-box}.umb-info-local-item{margin-bottom:20px}.umb-upload-local__dropzone .umb-info-local-item{margin:20px}.umb-lightbox{position:absolute;top:0;right:0;bottom:0;left:0;z-index:999;display:-ms-flexbox;display:flex;width:100%;height:100%;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;-ms-flex-direction:column;flex-direction:column}.umb-lightbox__backdrop{position:absolute;top:0;right:0;bottom:0;left:0;width:100%;height:100%;background:rgba(21,21,23,0.7)}.umb-lightbox__close{position:absolute;top:20px;right:60px}.umb-lightbox__close i{width:40px;height:40px;font-size:20px;cursor:pointer}.umb-lightbox__images{position:relative;z-index:1000}.umb-lightbox__image{padding:10px;background:#fff;border-radius:3px}.umb-lightbox__image img{max-width:50vw;max-height:70vh}.umb-lightbox__control{position:absolute;display:-ms-flexbox;display:flex;width:50px;height:50px;cursor:pointer;background-color:white;border-radius:50%;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center}.umb-lightbox__control.-next{top:50%;right:20px;transform:translate(0,-50%)}.umb-lightbox__control.-prev{top:50%;left:20px;transform:translate(0,-50%)}.umb-lightbox__control-icon{font-size:20px;color:#2e8aea}.umb-avatar{width:50px;height:50px;border-radius:50%}.umb-avatar.-xs{width:30px;height:30px}.umb-avatar.-s{width:40px;height:40px}.umb-avatar.-m{width:50px;height:50px}.umb-avatar.-l{width:70px;height:70px}.umb-avatar.-xl{width:100px;height:100px}.umb-progress-bar{position:relative;display:block;width:100%;height:10px;overflow:hidden;background:#d9d9d9;border-radius:10px;box-sizing:border-box}.umb-progress-bar__progress{position:absolute;top:0;bottom:0;left:0;width:100%;background:#50c878;border-radius:10px}.umb-button{position:relative;overflow:hidden}.umb-button__button:focus{outline:0}.umb-button__content{display:-ms-flexbox;display:flex;opacity:1;transition:opacity .25s ease;-ms-flex-wrap:wrap;flex-wrap:wrap}.umb-button__icon{margin-right:5px}.umb-button__content.-hidden{opacity:0}.umb-button__progress{position:absolute;top:50%;left:50%;z-index:100;width:14px;height:14px;margin-top:-9px;margin-left:-9px;border:2px solid #ccc;border-left-color:#46a546;border-radius:40px;opacity:1;animation:rotating .4s linear infinite;transition:opacity .25s ease}.umb-button__progress.-hidden{z-index:0;opacity:0}.umb-button__progress.-white{border-color:rgba(255,255,255,0.4);border-left-color:#fff}.umb-button__success,.umb-button__error{position:absolute;top:50%;left:50%;z-index:10;font-size:20px;color:#46a546;opacity:1;transform:translate(-50%,-50%);transition:opacity .25s ease}.umb-button__success{color:#46a546}.umb-button__error{color:#9d261d}.umb-button__success.-hidden,.umb-button__error.-hidden{z-index:0;opacity:0}.umb-button__success.-white,.umb-button__error.-white{color:#fff}.umb-button__overlay{position:absolute;z-index:10;width:100%;height:100%;background:#fff;opacity:0}@keyframes rotating{from{transform:rotate(0deg)}to{transform:rotate(360deg)}}.umb-button-group__toggle{padding-right:8px;padding-left:8px;margin-left:-1px}.umb-button-group__sub-buttons.-align-right{right:0;left:auto}.umb-notifications{position:absolute;right:0;bottom:52px;left:0;z-index:1000;padding:0;margin:auto;background:0;border:0;border-bottom:0;border-radius:0}.umb-notifications__notifications{position:relative;margin:0;list-style:none}.umb-notifications__notification{position:relative;padding:5px 20px;margin-bottom:0;font-size:12px;text-shadow:none;border:0;border-radius:0}.umb-notifications__notification.-extra-padding{padding-top:20px;padding-bottom:20px}.umb-file-dropzone-directive .dropzone{position:relative;width:auto;height:400px;padding:50px 0;margin:0 0 20px 0;color:#555;text-align:center;border:1px dashed #d9d9d9;transition:height .8s}.umb-file-dropzone-directive .dropzone .illustration{width:300px}.umb-file-dropzone-directive .dropzone.is-small{height:100px}.umb-file-dropzone-directive .dropzone.is-small .illustration{width:200px}.umb-file-dropzone-directive .dropzone.drag-over{border:1px dashed #343434}.umb-file-dropzone-directive .content{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}.umb-file-dropzone-directive .file-select{margin-top:10px;font-size:15px;color:#2e8aea;cursor:pointer}.umb-file-dropzone-directive .file-select:hover{color:#0064cd;text-decoration:underline}.umb-file-dropzone-directive .file-list{padding:10px 20px;margin:0 0 30px 0;list-style:none;background:#f8f8f8}.umb-file-dropzone-directive .file-list .file{position:relative;display:block;width:100%;padding:5px 0;border-top:1px solid #d9d9d9}.umb-file-dropzone-directive .file-list .file:first-child{border-top:0}.umb-file-dropzone-directive .file-list .file.ng-enter{animation:fadeIn .5s}.umb-file-dropzone-directive .file-list .file.ng-leave{animation:fadeOut 2s}.umb-file-dropzone-directive .file-list .file .file-description{display:block;width:100%;font-size:12px;color:#222}.umb-file-dropzone-directive .file-list .file .file-upload-progress{display:block;width:100%}.umb-file-dropzone-directive .file-list .file .file-icon{position:absolute;right:0;bottom:0}.umb-file-dropzone-directive .file-list .file .file-icon .icon{font-size:20px}.umb-file-dropzone-directive .file-list .file .file-icon .icon.ng-enter{animation:fadeIn .5s}.umb-file-dropzone-directive .file-list .file .file-icon .icon.ng-leave{animation:fadeIn .5s}.umb-file-dropzone-directive .file-progress{position:relative;height:4px;padding:2px}.umb-file-dropzone-directive .file-progress .file-progress-indicator{position:relative;display:block;width:0;height:100%;overflow:hidden;background-color:#2e8aea;border-radius:20px}.flex{display:-ms-flexbox;display:flex}.flex-inline{display:-ms-inline-flexbox;display:inline-flex}.flex-column{-ms-flex-direction:column;flex-direction:column}.flex-wrap{-ms-flex-wrap:wrap;flex-wrap:wrap}.items-start{-ms-flex-align:start;align-items:flex-start}.items-end{-ms-flex-align:end;align-items:flex-end}.items-center{-ms-flex-align:center;align-items:center}.items-baseline{-ms-flex-align:baseline;align-items:baseline}.items-stretch{-ms-flex-align:stretch;align-items:stretch}.self-start{-ms-flex-item-align:start;align-self:flex-start}.self-end{-ms-flex-item-align:end;align-self:flex-end}.self-center{-ms-flex-item-align:center;align-self:center}.self-baseline{-ms-flex-item-align:baseline;align-self:baseline}.self-stretch{-ms-flex-item-align:stretch;align-self:stretch}.justify-start{-ms-flex-pack:start;justify-content:flex-start}.justify-end{-ms-flex-pack:end;justify-content:flex-end}.justify-center{-ms-flex-pack:center;justify-content:center}.justify-between{-ms-flex-pack:justify;justify-content:space-between}.justify-around{-ms-flex-pack:distribute;justify-content:space-around}.content-start{-ms-flex-line-pack:start;align-content:flex-start}.content-end{-ms-flex-line-pack:end;align-content:flex-end}.content-center{-ms-flex-line-pack:center;align-content:center}.content-between{-ms-flex-line-pack:justify;align-content:space-between}.content-around{-ms-flex-line-pack:distribute;align-content:space-around}.content-stretch{-ms-flex-line-pack:stretch;align-content:stretch}.flx-i{-ms-flex:1;flex:1}.flx-g0{-ms-flex-positive:0;flex-grow:0}.flx-g1{-ms-flex-positive:1;flex-grow:1}.flx-s0{-ms-flex-negative:0;flex-shrink:0}.flx-s1{-ms-flex-negative:1;flex-shrink:1}.flx-b0{-ms-flex-preferred-size:0;flex-basis:0}.flx-b1{-ms-flex-preferred-size:10%;flex-basis:10%}.flx-b2{-ms-flex-preferred-size:20%;flex-basis:20%}.flx-b3{-ms-flex-preferred-size:30%;flex-basis:30%}.flx-b4{-ms-flex-preferred-size:40%;flex-basis:40%}.flx-b5{-ms-flex-preferred-size:50%;flex-basis:50%}.flx-b6{-ms-flex-preferred-size:60%;flex-basis:60%}.flx-b7{-ms-flex-preferred-size:70%;flex-basis:70%}.flx-b8{-ms-flex-preferred-size:80%;flex-basis:80%}.flx-b9{-ms-flex-preferred-size:90%;flex-basis:90%}.flx-b10{-ms-flex-preferred-size:100%;flex-basis:100%}.flx-ba{-ms-flex-preferred-size:auto;flex-basis:auto}.flex-auto{min-width:0;min-height:0;-ms-flex:1 1 auto;flex:1 1 auto}.flex-none{-ms-flex:none;flex:none}.m-center{margin-right:auto;margin-left:auto}.mt0{margin-top:0}.mt1{margin-top:.25rem}.mt2{margin-top:.5rem}.mt3{margin-top:1rem}.mt4{margin-top:2rem}.mt5{margin-top:4rem}.mt6{margin-top:8rem}.mt7{margin-top:16rem}.tl{text-align:left}.tr{text-align:right}.tc{text-align:center}.w1{width:1rem}.w2{width:2rem}.w3{width:4rem}.w4{width:8rem}.w5{width:16rem}.w-10{width:10%}.w-20{width:20%}.w-25{width:25%}.w-33{width:33%}.w-34{width:34%}.w-40{width:40%}.w-50{width:50%}.w-60{width:60%}.w-75{width:75%}.w-80{width:80%}.w-100{width:100%}.w-auto{width:auto}.login-overlay{position:absolute;top:0;left:0;z-index:10000;width:100%;height:100%;padding:0;margin:0!important;overflow-y:auto;color:#fff;background:#1d1d1d url(../img/application/logo.png) no-repeat 25px 30px fixed!important;background-size:30px 30px!important;border:0;border-radius:0}@media only screen and (-webkit-min-device-pixel-ratio:1.5),only screen and (min-resolution:144dpi){.login-overlay{background-image:url(../img/application/logo@2x.png)!important}}@media only screen and (-webkit-min-device-pixel-ratio:2),only screen and (min-resolution:192dpi){.login-overlay{background-image:url(../img/application/logo@2x.png)!important}}@media only screen and (-webkit-min-device-pixel-ratio:3),only screen and (min-resolution:3dppx),only screen and (-webkit-min-device-pixel-ratio:3.6458333333333335),only screen and (min-resolution:350dpi){.login-overlay{background-image:url(../img/application/logo@3x.png)!important}}.login-overlay .umb-modalcolumn{background:0;border:0}.login-overlay .form{position:relative;top:100px;left:165px;display:block;width:370px;text-align:right}.login-overlay h1{display:block;font-size:18px;font-weight:normal;color:#fff;text-align:right}.login-overlay .alert{display:inline-block;padding-right:6px;padding-left:6px;margin-top:10px;text-align:center}.login-overlay .switch-view{margin-top:10px}@media(max-width:767px) and (max-height:420px) and (orientation:landscape){.login-overlay .form{top:50px}}@media(max-width:565px){.login-overlay .form{top:60px;right:25px;left:inherit;width:auto;padding-right:25px;padding-left:25px}}@media(max-width:339px){.login-overlay .form input[type="text"],.login-overlay .form input[type="password"]{width:250px}}#hrOr{position:relative;height:30px;padding-top:20px;text-align:center}#hrOr hr{height:1px;margin:0;background-color:#555;border:0}#hrOr div{position:relative;top:-16px;width:20px;height:20px;padding:4px;margin:auto;color:#d9d9d9;background-color:black;border:1px solid #555;border-radius:50%}.login-overlay .text-error,.login-overlay .text-info{font-weight:bold}.umb-editor{min-width:66.6%}.umb-editor-tiny{width:50px}.umb-editor-small{width:90px}.umb-modal .umb-editor{width:95%}.umb-dialog .umb-editor{width:95%}.umb-dialog .umb-control-group .help-block{width:95%}.umb-codeeditor{width:99%}.umb-contentpicker li a:hover .hover-hide,.umb-contentpicker li a .hover-show{display:none}.umb-contentpicker li a:hover .hover-show{display:inline-block}.umb-contentpicker-popover .search-holder{padding:10px}.umb-contentpicker small:not(:last-child){padding-right:3px;border-right:1px solid #7f7f7f}.umb-contentpicker small a{color:#555}div.umb-codeeditor{border:1px solid #e8e8e8}div.umb-codeeditor .umb-el-wrap{padding:0}div.umb-codeeditor .umb-btn-toolbar{padding:0;margin:0;background:#f7f7f7;border-bottom:#e8e8e8 1px solid}.mce-tinymce{border:1px solid #d9d9d9!important;border-radius:0!important}.mce-panel{background:#f8f8f8!important;border-color:#d9d9d9!important}.mce-btn-group,.mce-btn{background:none!important;border:none!important}.mce-ico{font-size:12px!important;color:#1d1d1d!important}.mce-ico.mce-i-custom[class^="icon-"],.mce-ico.mce-i-custom[class*=" icon-"]{font-family:icomoon;font-size:16px!important}.rte-editor-preval .control-group .controls>div>label .mce-ico{line-height:20px}ul.color-picker li{width:60px;padding:2px;margin:3px;border:2px solid transparent}ul.color-picker li.active{border:2px dashed #d9d9d9}ul.color-picker li a{display:block;height:50px;cursor:pointer}.control-group.color-picker-preval .thumbnail{width:30px;border:0}.control-group.color-picker-preval pre{display:inline;margin-right:20px;margin-left:10px}.control-group.color-picker-preval label{padding:6px;border:solid white 1px}.umb-mediapicker .add-link{display:inline-block;width:120px;height:120px;line-height:120px;color:#d9d9d9;text-align:center;text-decoration:none;border:2px #d9d9d9 dashed;transition:all 150ms ease-in-out}.umb-mediapicker .add-link:hover{color:#2e8aea;border-color:#2e8aea}.umb-mediapicker .picked-image{position:absolute;right:10px;bottom:10px;display:none;width:32px;height:32px;overflow:hidden;font-size:24px;line-height:36px;color:red;text-align:center;text-decoration:none;background:white;border-radius:15px;opacity:.5}.umb-thumbnails{position:relative}.umb-thumbnails i{margin:auto}.umb-thumbnails a{border:none!important;outline:0;box-shadow:none!important}.umb-sortable-thumbnails{display:-ms-flexbox;display:flex;padding:0;margin:0;list-style-type:none;-ms-flex-direction:row;flex-direction:row;-ms-flex-wrap:wrap;flex-wrap:wrap}.umb-sortable-thumbnails li{position:relative;display:-ms-flexbox;display:flex;max-width:100%;padding:2px;margin:5px;background:white;border:1px solid #f8f8f8;-ms-flex-direction:row;flex-direction:row;-ms-flex-pack:center;justify-content:center;-ms-flex-align:center;align-items:center;-ms-flex-wrap:wrap;flex-wrap:wrap}.umb-mediapicker .umb-sortable-thumbnails li{padding:5px;margin:0;-ms-flex-direction:column;flex-direction:column}.umb-sortable-thumbnails li:hover a{display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;-ms-flex-align:center;align-items:center}.umb-sortable-thumbnails li img{display:block;max-width:100%;max-height:100%;margin:auto;background-image:url(../img/checkered-background.png)}.umb-sortable-thumbnails li img.noScale{max-width:none!important;max-height:none!important}.umb-sortable-thumbnails .icon-holder{text-align:center}.umb-sortable-thumbnails .icon-holder .icon{display:block;font-size:40px;line-height:50px;color:#555}.umb-sortable-thumbnails .umb-sortable-thumbnails__actions{position:absolute;right:10px;bottom:10px;display:-ms-flexbox;display:flex;text-decoration:none;opacity:0;visibility:hidden;-ms-flex-direction:row;flex-direction:row}.umb-sortable-thumbnails li:hover .umb-sortable-thumbnails__actions{opacity:1;visibility:visible}.umb-sortable-thumbnails .umb-sortable-thumbnails__action{display:-ms-flexbox;display:flex;width:25px;height:25px;margin-left:5px;font-size:16px;color:#222;background:white;border-radius:15px;-ms-flex-pack:center;justify-content:center;-ms-flex-align:center;align-items:center}.umb-sortable-thumbnails .umb-sortable-thumbnails__action.-red{color:red}.umb-sortable-thumbnails .umb-sortable-thumbnails__action:hover{text-decoration:none}.umb-cropper{position:relative}.umb-cropper img,.umb-cropper-gravity img{position:relative;top:0;left:0;height:auto;max-width:100%}.umb-cropper img{max-width:none}.umb-cropper .overlay,.umb-cropper-gravity .overlay{position:absolute;top:0;left:0;z-index:6001;cursor:move}.umb-cropper .viewport{position:relative;height:auto;max-width:100%;margin:auto;overflow:hidden}.umb-cropper-gravity .viewport{position:relative;width:100%;height:100%;overflow:hidden}.umb-cropper .viewport:after{position:absolute;top:0;left:0;z-index:5999;width:100%;height:100%;content:"";-moz-opacity:.75;opacity:.75;filter:alpha(opacity=7);box-shadow:inset 0 0 0 20px #fff,inset 0 0 0 21px rgba(0,0,0,0.1),inset 0 0 20px 21px rgba(0,0,0,0.2)}.umb-cropper-gravity .overlay{width:14px;height:14px;text-align:center;background:#2e8aea;border:3px solid white;border-radius:20px;opacity:.8}.umb-cropper-gravity .overlay i{font-size:26px;line-height:26px;opacity:.8!important}.umb-cropper .crop-container{text-align:center}.umb-cropper .crop-slider{display:-ms-flexbox;display:flex;padding:10px;margin-top:10px;border-top:1px solid #f8f8f8;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;-ms-flex-wrap:wrap;flex-wrap:wrap}@media(min-width:769px){.umb-cropper .crop-slider{padding:10px 50px 10px 50px}}.umb-cropper .crop-slider i{padding:0 5px;color:#555;box-sizing:border-box;-ms-flex:0 0 25px;flex:0 0 25px}.umb-cropper .crop-slider i:first-of-type{text-align:right}.umb-cropper .crop-slider input{-ms-flex:0 1 auto;flex:0 1 auto}.umb-cropper-gravity .viewport,.umb-cropper-gravity,.umb-cropper-imageholder{display:inline-block;max-width:100%}.umb-cropper-imageholder{float:left}.cropList{position:relative;display:inline-block;vertical-align:top}.gravity-container .viewport{max-width:600px}.gravity-container .viewport:hover{cursor:pointer}.imagecropper{display:-ms-flexbox;display:flex;-ms-flex-align:start;align-items:flex-start;-ms-flex-direction:row;flex-direction:row}@media(max-width:768px){.imagecropper{float:left;max-width:100%;-ms-flex-direction:column;flex-direction:column}}.imagecropper .umb-cropper__container{position:relative;max-width:100%;margin-bottom:10px;border:1px solid #f8f8f8}@media(min-width:769px){.imagecropper .umb-cropper__container{width:600px}}.umb-close-cropper{position:absolute;top:3px;right:3px;cursor:pointer}.umb-close-cropper:hover{background:#f8f8f8;opacity:.9}.imagecropper .umb-sortable-thumbnails{display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;-ms-flex-wrap:wrap;flex-wrap:wrap}.imagecropper .umb-sortable-thumbnails li{display:-ms-flexbox;display:flex;padding:8px;margin-top:0;-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:justify;justify-content:space-between}.imagecropper .umb-sortable-thumbnails li.current{color:#000;cursor:pointer;background:#f8f8f8;border-color:#d9d9d9}.imagecropper .umb-sortable-thumbnails li:hover,.imagecropper .umb-sortable-thumbnails li.current:hover{color:#000;cursor:pointer;background:#f8f8f8;border-color:#d9d9d9;opacity:.95}.imagecropper .umb-sortable-thumbnails li .crop-name,.imagecropper .umb-sortable-thumbnails li .crop-size{display:block;font-size:13px;line-height:1;text-align:left}.imagecropper .umb-sortable-thumbnails li .crop-name{margin:10px 0 5px;font-weight:bold}.imagecropper .umb-sortable-thumbnails li .crop-size{margin:0 0 5px;font-size:10px;font-style:italic}.btn-crop-delete{display:block;text-align:left}.umb-folderbrowser .add-link{display:inline-block;width:120px;height:120px;line-height:120px;text-align:center;border:1px #d9d9d9 dashed}.umb-upload-drop-zone{margin-bottom:5px}.umb-upload-drop-zone .info,.umb-upload-button-big{display:block;padding:20px;font-size:14px;color:#d9d9d9;text-align:center;background:0;border:1px dashed #d9d9d9;opacity:1}.umb-upload-button-big:hover{color:#d9d9d9}.umb-upload-drop-zone .info i.icon,.umb-upload-button-big i.icon{font-size:55px;line-height:70px}.umb-upload-button-big{display:block}.umb-upload-button-big input{bottom:0;left:0;width:100%;height:100%}.umb-photo-folder .picrow{position:relative;overflow-y:hidden}.umb-photo-folder .picrow div,.umb-photo-preview{position:relative;display:inline-block;padding:0;margin:0;vertical-align:top;border:0}.umb-photo-folder .picrow div a:first-child{width:100%;height:100%}.umb-photo-folder .picrow div.umb-photo{width:100%;height:100%;background-color:#f8f8f8}.umb-photo-folder a:hover{text-decoration:none}.umb-photo-folder .umb-non-thumbnail{font-size:12px;color:#000;text-align:center;text-decoration:none;vertical-align:middle;background:#f8f8f8}.umb-photo-folder .selector-overlay{display:none}.umb-photo-folder .pic:hover .selector-overlay{position:absolute;right:0;bottom:0;left:0;z-index:100;display:block;padding:5px;overflow:hidden;color:white;text-align:center;text-decoration:none;white-space:nowrap;background:black;opacity:.4;text-overlow:ellipsis}.umb-photo-folder .umb-non-thumbnail i{position:relative;top:50%;display:block;margin:auto;font-size:50px;line-height:60px;color:#d9d9d9;transform:translateY(-50%)}.umb-photo-folder .umb-non-thumbnail span{position:absolute;top:20px;display:block;width:100%;margin:auto}.umb-photo-folder .selected{position:relative}.umb-photo-folder .selected:before{position:absolute;right:10px;bottom:10px;z-index:100;display:block;width:32px;height:32px;overflow:hidden;font-family:Icomoon;font-size:24px;line-height:36px;color:black;text-align:center;background:white;border-radius:15px;content:"\e165";opacity:.5}.umb-fileupload .preview{float:left;padding:3px;margin-right:30px;margin-bottom:30px;background:#efefef;border:1px solid #a0a0a0;border-radius:5px}.umb-fileupload ul{margin-bottom:0;vertical-align:middle;list-style:none}.umb-fileupload label{padding-left:7px;font-weight:normal;vertical-align:middle}.umb-fileupload .preview-file{width:55px;height:45px;padding-top:27px;font-size:10px;color:#666;text-align:center;text-transform:uppercase}.umb-fileupload .file-icon{position:relative;display:block;padding:5px 0;text-align:center}.umb-fileupload .file-icon>.icon{font-size:70px;line-height:110%;color:#666;text-align:center}.umb-fileupload .file-icon>span{position:absolute;top:45px;left:110px;padding:1px 3px;font-size:12px;line-height:130%;color:#fff;background:#666}.umb-fileupload input{font-size:12px;line-height:1}.umb-member-group-box{width:45%}.umb-member-group-box:nth-child(1){float:left}.umb-member-group-box:nth-child(2){float:right}.umb-relatedlinks table>tr>td{word-break:break-all;word-wrap:break-word;border-bottom:1px solid transparent}.umb-relatedlinks .handle{cursor:move}.umb-relatedlinks table>tbody>tr.unsortable .handle{cursor:default}.umb-relatedlinks table td.col-sort{width:20px}.umb-relatedlinks table td.col-caption{min-width:200px}.umb-relatedlinks table td.col-link{min-width:200px}.umb-relatedlinks table td.col-actions{min-width:120px}.umb-relatedlinks table td.col-caption .control-wrapper,.umb-relatedlinks table td.col-link .control-wrapper{display:-ms-flexbox;display:flex}.umb-relatedlinks table td.col-caption .control-wrapper input[type="text"],.umb-relatedlinks table td.col-link .control-wrapper input[type="text"]{width:auto;-ms-flex:1;flex:1}.umb-relatedlinks .sortable-placeholder{display:table-row;background-color:#f9f9f9}.umb-relatedlinks .sortable-placeholder>td{display:table-cell;padding:8px}.umb-relatedlinks .ui-sortable-helper{display:table-row;background-color:#fff;opacity:.7}.umb-relatedlinks .ui-sortable-helper>td{display:table-cell;border-bottom:1px solid #dbdbdb}.umb-tags{padding:10px;font-size:13px;text-shadow:none;border:#f8f8f8 solid 1px}.umb-tags .tag{padding:7px;margin:7px;cursor:pointer;background:#2e8aea}.umb-tags .tag i{padding:2px}.umb-tags input{background:#fff;border:0}.bootstrap-datetimepicker-widget .btn{padding:0}.bootstrap-datetimepicker-widget .picker-switch .btn{background:0;border:0}.umb-datepicker .input-append .add-on{cursor:pointer}.umb-datepicker p{margin-top:10px}.umb-datepicker p a{color:#555}.CodeMirror,.CodeMirror-scroll{height:100%;min-height:200px}.umb-nested-boolean label{float:left;width:320px;margin-bottom:8px}.umb-nested-boolean label span{float:left;width:80%}.umb-nested-boolean label input[type='checkbox']{float:left;margin-right:10px}.typeahead,.tt-query,.tt-hint{z-index:auto!important;width:396px;height:30px;padding:8px 12px;margin-top:-4px!important;font-size:24px;line-height:30px;border:2px solid #d9d9d9;border-radius:2px!important;outline:0}.typeahead{background-color:#fff}.tt-query{box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.tt-hint{color:#d9d9d9!important}.tt-dropdown-menu{width:422px;padding:8px 0;margin-top:12px;background-color:#fff;border:1px solid #d9d9d9;border:1px solid rgba(0,0,0,0.2);border-radius:8px;box-shadow:0 5px 10px rgba(0,0,0,0.2)}.tt-suggestion{padding:3px 20px;font-size:14px;line-height:20px;cursor:pointer}.tt-suggestion.tt-cursor{color:#fff;background-color:#2e8aea}.tt-suggestion p{margin:0}*{-ms-touch-action:none}.ace_editor{height:200px}.nounderline{text-decoration:none!important}.nounderline:hover{text-decoration:underline!important}.nounderline *{text-decoration:none!important;border:0}.ui-sortable-placeholder{margin-left:0!important}.controls-row img{max-width:none}.thumbnail{border-radius:0}.thumbnail img{width:100%;max-width:100%!important}#mapCanvas img{max-width:none!important}.btn-group .dropdown-backdrop{display:none}iframe,.content-column-body{background:center center url(../img/loader.gif) no-repeat;border:0}.fileinput-button{position:relative;margin-bottom:5px;overflow:hidden}.fileinput-button input{position:absolute;top:0;right:0;margin:0;font-size:23px;cursor:pointer;opacity:0;filter:alpha(opacity=0);transform:translate(-300px,0) scale(4);direction:ltr}.legacy-custom-file{display:inline-block;width:16px;height:16px;min-width:20px;background-position:center center;background-repeat:no-repeat}.icon-chevron-up:before{content:"\e128"}.icon-chevron-down:before{content:"\e0c9"}.pa-umb-overlay{-webkit-font-smoothing:antialiased;font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.pa-umb-overlay+.pa-umb-overlay{padding-top:30px;border-top:1px solid #d9d9d9}.pa-select-type{display:-ms-flexbox;display:flex;margin-top:15px;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-ms-flex-direction:row;flex-direction:row;-ms-flex-pack:center;justify-content:center;-ms-flex-align:start;align-items:flex-start}.pa-select-type label{padding:0 20px}.pa-access-header{padding-bottom:0;margin:0 0 3px 0;font-weight:bold}.pa-access-description{margin:0;color:#b3b3b3}.pa-validation-message{display:inline-block;padding:6px 12px!important;margin:5px 0 0 0!important}.pa-select-pages label{margin:0;font-size:15px}.pa-select-pages label+.controls-row{padding-top:0}.pa-select-pages .umb-detail{margin:2px 0 5px;font-size:13px}.pa-choose-page a{font-size:15px;color:#2e8aea}.pa-choose-page a:hover,.pa-choose-page a:active,.pa-choose-page a:focus{color:#0064cd;text-decoration:none}.pa-choose-page a:before{margin-right:3px;font-weight:bold;content:"+"}.pa-choose-page .treePickerTitle{padding:3px 5px;font-size:13px;font-style:italic;font-weight:bold;color:grey;background:whitesmoke;border-bottom:0}.pa-form+.pa-form{margin-top:10px}code{border-radius:0}pre{display:block;padding:9.5px;margin:0 0 10px;overflow-x:auto;font-family:Monaco,Menlo,Consolas,"Courier New",monospace;font-size:13px;line-height:20px;color:#343434;white-space:pre;background-color:#f5f5f5;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.15);border-radius:0}pre.prettyprint{margin-bottom:20px}pre code{padding:0;word-wrap:normal;white-space:pre;background-color:transparent;border:0}.umb-healthcheck{display:-ms-flexbox;display:flex;margin-right:-10px;margin-left:-10px;-ms-flex-wrap:wrap;flex-wrap:wrap}.umb-healthcheck-help-text{margin-bottom:30px;line-height:1.6em}.umb-healthcheck-action-bar{display:-ms-flexbox;display:flex;margin-bottom:20px;-ms-flex-pack:end;justify-content:flex-end}.umb-healthcheck-group{display:-ms-flexbox;display:flex;height:100%;padding:15px 10px;text-align:center;background:#f8f8f8;border:2px solid transparent;border-radius:3px;box-sizing:border-box;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-direction:column;flex-direction:column}.umb-healthcheck-group:hover{cursor:pointer;border:2px solid #2e8aea}.umb-healthcheck-group__load-container{position:relative;height:30px;margin-top:15px;margin-bottom:16px}.umb-healthcheck-title{font-size:14px;font-weight:bold}.umb-healthcheck-messages{margin-top:15px}.umb-healthcheck-message{position:relative;display:-ms-inline-flexbox;display:inline-flex;padding-right:8px;padding-left:8px;margin-bottom:5px;font-size:13px;font-weight:bold;color:#000;background:#fff;border-radius:50px;-ms-flex-align:center;align-items:center}.umb-healthcheck-message i{margin-right:3px;font-size:15px}.umb-healthcheck-details-link{color:#2e8aea}.umb-healthcheck-details-link:hover{color:#2e8aea;text-decoration:none}.align-self-center{-ms-flex-item-align:center;align-self:center}.umb-era-button{display:-ms-flexbox;display:flex;height:40px;max-width:100%;padding:0 15px;overflow:hidden;font-size:14px;font-weight:bold;line-height:1;color:#484848;text-decoration:none!important;white-space:nowrap;cursor:pointer;background-color:#e0e0e0;border:0 none;border-radius:3px;box-sizing:border-box;transition:background-color 80ms ease,color 80ms ease,opacity 80ms ease;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-ms-flex-pack:center;justify-content:center;-ms-flex-align:center;align-items:center}.umb-era-button:hover,.umb-era-button:active{color:#484848;text-decoration:none;background-color:#d3d3d3;outline:0}.umb-era-button:focus{outline:0}.umb-era-button.-blue{color:white;background:#2e8aea}.umb-era-button.-blue:hover{background-color:#0064cd}.umb-era-button.-link{padding:0;background:transparent}.umb-era-button.-link:hover{background-color:transparent;opacity:.6}.umb-era-button.-inactive{color:#BBB;cursor:not-allowed;background:#eae7e7}.umb-era-button.-inactive:hover{color:#BBB;background:#eae7e7}.umb-era-button.-full-width{display:block;width:100%}.umb-era-button.-white{background-color:#fff}.umb-era-button.-white:hover{opacity:.9}.umb-era-button.-text-black{color:#000}.umb-air{max-width:100%;padding:10px;box-sizing:border-box;-ms-flex:0 0 auto;flex:0 0 auto;-ms-flex-preferred-size:100%;flex-basis:100%}@media(min-width:500px){.umb-air{max-width:50%;-ms-flex-preferred-size:50%;flex-basis:50%}}@media(min-width:768px){.umb-air{max-width:20%;-ms-flex-preferred-size:20%;flex-basis:20%}}.umb-healthcheck-back-link{font-weight:bold;color:#000}.umb-healthcheck-group__details{margin-bottom:40px;border-radius:3px}.umb-healthcheck-group__details-group-title{display:-ms-flexbox;display:flex;padding:10px 20px;background-color:#2e8aea;border-radius:3px 3px 0 0;-ms-flex-align:center;align-items:center;-ms-flex-pack:justify;justify-content:space-between}.umb-healthcheck-group__details-group-name{font-size:16px;font-weight:bold;color:#fff}.umb-healthcheck-group__details-checks{border:1px solid #d9d9d9;border-top:0;border-radius:0 0 3px 3px}.umb-healthcheck-group__details-check{position:relative}.umb-healthcheck-group__details-check-title{padding:15px 20px;background-color:#f8f8f8}.umb-healthcheck-group__details-check-name{margin-bottom:2px;font-size:14px;font-weight:bold;color:#000}.umb-healthcheck-group__details-check-description{font-size:12px;line-height:1.6em;color:#7f7f7f}.umb-healthcheck-group__details-status{display:-ms-flexbox;display:flex;padding:15px 0;border-bottom:2px solid #f8f8f8}.umb-healthcheck-group__details-status-overlay{position:absolute;top:0;right:0;bottom:0;left:0;background:#fff;opacity:.9}.umb-healthcheck-group__details-status:last-child{border-bottom:0}.umb-healthcheck-group__details-status-icon-container{display:-ms-flexbox;display:flex;padding:0 20px;-ms-flex:0 0 50px;flex:0 0 50px;-ms-flex-pack:center;justify-content:center}.umb-healthcheck-status-icon{margin-top:2px;font-size:20px}.umb-healthcheck-status-icon.-large{width:70px;height:70px;font-size:30px;background-color:#fff}.umb-healthcheck-group__details-status-content{padding:0 20px;-ms-flex:1 1 auto;flex:1 1 auto}.umb-healthcheck-group__details-status-text{line-height:1.6em}.umb-healthcheck-group__details-status-actions{display:-ms-flexbox;display:flex;margin-top:10px;-ms-flex-direction:column;flex-direction:column}.umb-healthcheck-group__details-status-action{padding:10px;margin-bottom:10px;background-color:#f8f8f8;border-radius:3px}.umb-healthcheck-group__details-status-action:last-child{margin-bottom:0}.umb-healthcheck-group__details-status-action-description{margin-top:5px;font-size:11px}
\ No newline at end of file
+@font-face{font-family:'Open Sans';font-style:normal;font-weight:400;src:url('../fonts/opensans/OpenSans-Regular-webfont.eot');src:local('Open Sans'),local('OpenSans'),url('../fonts/opensans/OpenSans-Regular-webfont.eot?#iefix') format('embedded-opentype'),url('../fonts/opensans/OpenSans-Regular-webfont.ttf') format('truetype'),url('../fonts/opensans/OpenSans-Regular-webfont.svg#open_sansregular') format('svg')}@font-face{font-family:'Open Sans';font-style:normal;font-weight:600;src:url('../fonts/opensans/OpenSans-Semibold-webfont.eot');src:local('Open Sans Semibold'),local('OpenSans-Semibold'),url('../fonts/opensans/OpenSans-Semibold-webfont.eot?#iefix') format('embedded-opentype'),url('../fonts/opensans/OpenSans-Semibold-webfont.ttf') format('truetype'),url('../fonts/opensans/OpenSans-Semibold-webfont.svg#open_sanssemibold') format('svg')}.red{color:#9d261d}.blue{color:#2e8aea}.color-red,.color-red i{color:#d90416!important}.color-blue,.color-blue i{color:#04bfbf!important}.color-orange,.color-orange i{color:#d9631e!important}.color-green,.color-green i{color:#04bf67!important}.color-yellow,.color-yellow i{color:#f28729!important}.clearfix{*zoom:1}.clearfix:before,.clearfix:after{display:table;line-height:0;content:""}.clearfix:after{clear:both}.hide-text{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.input-block-level{display:block;width:100%;min-height:30px;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"]{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:"Open Sans","Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:20px;color:#343434;background-color:#fff}a{color:#000;text-decoration:none}a:hover,a:focus{color:#000;text-decoration:underline}.img-rounded{border-radius:6px}.img-polaroid{padding:4px;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);box-shadow:0 1px 3px rgba(0,0,0,0.1)}.img-circle{border-radius:500px}.row{margin-left:0;*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:0}.container,.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:720px}.span12{width:720px}.span11{width:660px}.span10{width:600px}.span9{width:540px}.span8{width:480px}.span7{width:420px}.span6{width:360px}.span5{width:300px}.span4{width:240px}.span3{width:180px}.span2{width:120px}.span1{width:60px}.offset12{margin-left:720px}.offset11{margin-left:660px}.offset10{margin-left:600px}.offset9{margin-left:540px}.offset8{margin-left:480px}.offset7{margin-left:420px}.offset6{margin-left:360px}.offset5{margin-left:300px}.offset4{margin-left:240px}.offset3{margin-left:180px}.offset2{margin-left:120px}.offset1{margin-left:60px}.row-fluid{width:100%;*zoom:1}.row-fluid:before,.row-fluid:after{display:table;line-height:0;content:""}.row-fluid:after{clear:both}.row-fluid [class*="span"]{display:block;float:left;width:100%;min-height:30px;margin-left:0;*margin-left:-0.06944444444444445%;box-sizing:border-box}.row-fluid [class*="span"]:first-child{margin-left:0}.row-fluid .controls-row [class*="span"]+[class*="span"]{margin-left:0}.row-fluid .span12{width:99.99999999999999%;*width:99.93055555555554%}.row-fluid .span11{width:91.66666666666666%;*width:91.59722222222221%}.row-fluid .span10{width:83.33333333333331%;*width:83.26388888888887%}.row-fluid .span9{width:74.99999999999999%;*width:74.93055555555554%}.row-fluid .span8{width:66.66666666666666%;*width:66.59722222222221%}.row-fluid .span7{width:58.33333333333333%;*width:58.263888888888886%}.row-fluid .span6{width:49.99999999999999%;*width:49.93055555555555%}.row-fluid .span5{width:41.66666666666666%;*width:41.597222222222214%}.row-fluid .span4{width:33.33333333333333%;*width:33.263888888888886%}.row-fluid .span3{width:24.999999999999996%;*width:24.930555555555554%}.row-fluid .span2{width:16.666666666666664%;*width:16.59722222222222%}.row-fluid .span1{width:8.333333333333332%;*width:8.263888888888888%}.row-fluid .offset12{margin-left:99.99999999999999%;*margin-left:99.8611111111111%}.row-fluid .offset12:first-child{margin-left:99.99999999999999%;*margin-left:99.8611111111111%}.row-fluid .offset11{margin-left:91.66666666666666%;*margin-left:91.52777777777777%}.row-fluid .offset11:first-child{margin-left:91.66666666666666%;*margin-left:91.52777777777777%}.row-fluid .offset10{margin-left:83.33333333333331%;*margin-left:83.19444444444443%}.row-fluid .offset10:first-child{margin-left:83.33333333333331%;*margin-left:83.19444444444443%}.row-fluid .offset9{margin-left:74.99999999999999%;*margin-left:74.8611111111111%}.row-fluid .offset9:first-child{margin-left:74.99999999999999%;*margin-left:74.8611111111111%}.row-fluid .offset8{margin-left:66.66666666666666%;*margin-left:66.52777777777777%}.row-fluid .offset8:first-child{margin-left:66.66666666666666%;*margin-left:66.52777777777777%}.row-fluid .offset7{margin-left:58.33333333333333%;*margin-left:58.19444444444444%}.row-fluid .offset7:first-child{margin-left:58.33333333333333%;*margin-left:58.19444444444444%}.row-fluid .offset6{margin-left:49.99999999999999%;*margin-left:49.86111111111111%}.row-fluid .offset6:first-child{margin-left:49.99999999999999%;*margin-left:49.86111111111111%}.row-fluid .offset5{margin-left:41.66666666666666%;*margin-left:41.52777777777777%}.row-fluid .offset5:first-child{margin-left:41.66666666666666%;*margin-left:41.52777777777777%}.row-fluid .offset4{margin-left:33.33333333333333%;*margin-left:33.19444444444444%}.row-fluid .offset4:first-child{margin-left:33.33333333333333%;*margin-left:33.19444444444444%}.row-fluid .offset3{margin-left:24.999999999999996%;*margin-left:24.86111111111111%}.row-fluid .offset3:first-child{margin-left:24.999999999999996%;*margin-left:24.86111111111111%}.row-fluid .offset2{margin-left:16.666666666666664%;*margin-left:16.52777777777778%}.row-fluid .offset2:first-child{margin-left:16.666666666666664%;*margin-left:16.52777777777778%}.row-fluid .offset1{margin-left:8.333333333333332%;*margin-left:8.194444444444443%}.row-fluid .offset1:first-child{margin-left:8.333333333333332%;*margin-left:8.194444444444443%}[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:0;padding-left:0;*zoom:1}.container-fluid:before,.container-fluid:after{display:table;line-height:0;content:""}.container-fluid:after{clear:both}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:21px;font-weight:200;line-height:30px}small{font-size:85%}strong{font-weight:bold}em{font-style:italic}cite{font-style:normal}.muted{color:#d9d9d9}a.muted:hover,a.muted:focus{color:#c0c0c0}.text-warning{color:#fff}a.text-warning:hover,a.text-warning:focus{color:#e6e6e6}.text-error{color:#fff}a.text-error:hover,a.text-error:focus{color:#e6e6e6}.text-info{color:#fff}a.text-info:hover,a.text-info:focus{color:#e6e6e6}.text-success{color:#fff}a.text-success:hover,a.text-success:focus{color:#e6e6e6}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}h1,h2,h3,h4,h5,h6{margin:10px 0;font-family:inherit;font-weight:500;line-height:20px;color:inherit;text-rendering:optimizelegibility}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{font-weight:normal;line-height:1;color:#d9d9d9}h1,h2,h3{line-height:40px}h1{font-size:38.5px}h2{font-size:31.5px}h3{font-size:24.5px}h4{font-size:17.5px}h5{font-size:14px}h6{font-size:11.9px}h1 small{font-size:24.5px}h2 small{font-size:17.5px}h3 small{font-size:14px}h4 small{font-size:14px}.page-header{padding-bottom:9px;margin:20px 0 30px;border-bottom:1px solid #f8f8f8}ul,ol{padding:0;margin:0 0 10px 25px}ul ul,ul ol,ol ol,ol ul{margin-bottom:0}li{line-height:20px}ul.unstyled,ol.unstyled{margin-left:0;list-style:none}ul.inline,ol.inline{margin-left:0;list-style:none}ul.inline>li,ol.inline>li{display:inline-block;*display:inline;padding-right:5px;padding-left:5px;*zoom:1}dl{margin-bottom:20px}dt,dd{line-height:20px}dt{font-weight:bold}dd{margin-left:10px}.dl-horizontal{*zoom:1}.dl-horizontal:before,.dl-horizontal:after{display:table;line-height:0;content:""}.dl-horizontal:after{clear:both}.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}hr{margin:20px 0;border:0;border-top:1px solid #f8f8f8;border-bottom:1px solid #fff}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #d9d9d9}abbr.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:0 0 0 15px;margin:0 0 20px;border-left:5px solid #f8f8f8}blockquote p{margin-bottom:0;font-size:17.5px;font-weight:300;line-height:1.25}blockquote small{display:block;line-height:20px;color:#d9d9d9}blockquote small:before{content:'\2014 \00A0'}blockquote.pull-right{float:right;padding-right:15px;padding-left:0;border-right:5px solid #f8f8f8;border-left:0}blockquote.pull-right p,blockquote.pull-right small{text-align:right}blockquote.pull-right small:before{content:''}blockquote.pull-right small:after{content:'\00A0 \2014'}q:before,q:after,blockquote:before,blockquote:after{content:""}address{display:block;margin-bottom:20px;font-style:normal;line-height:20px}code,pre.code{padding:0 3px 2px;font-family:Monaco,Menlo,Consolas,"Courier New",monospace;font-size:12px;color:#343434;border-radius:3px}code{padding:2px 4px;color:#d14;white-space:nowrap;background-color:#f7f7f9;border:1px solid #e1e1e8}pre.code{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:20px;word-break:break-all;word-wrap:break-word;white-space:pre;white-space:pre-wrap;background-color:#f5f5f5;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.15);border-radius:0}pre.code.prettyprint{margin-bottom:20px}pre.code 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}table{max-width:100%;background-color:transparent;border-collapse:collapse;border-spacing:0}.table{width:100%;margin-bottom:20px}.table th,.table td{padding:8px;line-height:20px;text-align:left;vertical-align:top;border-top:1px solid #dbdbdb}.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 #dbdbdb}.table .table{background-color:#fff}.table-condensed th,.table-condensed td{padding:4px 5px}.table-bordered{border:1px solid #dbdbdb;border-collapse:separate;*border-collapse:collapse;border-left:0;border-radius:0}.table-bordered th,.table-bordered td{border-left:1px solid #dbdbdb}.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{border-top-left-radius:0;-moz-border-radius-topleft:0}.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{border-top-right-radius:0;-moz-border-radius-topright:0}.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{border-bottom-left-radius:0;-moz-border-radius-bottomleft:0}.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{border-bottom-right-radius:0;-moz-border-radius-bottomright:0}.table-bordered tfoot+tbody:last-child tr:last-child td:first-child{border-bottom-left-radius:0;-moz-border-radius-bottomleft:0}.table-bordered tfoot+tbody:last-child tr:last-child td:last-child{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{border-top-left-radius:0;-moz-border-radius-topleft:0}.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{border-top-right-radius:0;-moz-border-radius-topright:0}.table-striped tbody>tr:nth-child(odd)>td,.table-striped tbody>tr:nth-child(odd)>th{background-color:#f9f9f9}.table-hover tbody tr:hover>td,.table-hover tbody tr:hover>th{background-color:#f5f5f5}table td[class*="span"],table th[class*="span"],.row-fluid table td[class*="span"],.row-fluid table th[class*="span"]{display:table-cell;float:none;margin-left:0}.table td.span1,.table th.span1{float:none;width:44px;margin-left:0}.table td.span2,.table th.span2{float:none;width:104px;margin-left:0}.table td.span3,.table th.span3{float:none;width:164px;margin-left:0}.table td.span4,.table th.span4{float:none;width:224px;margin-left:0}.table td.span5,.table th.span5{float:none;width:284px;margin-left:0}.table td.span6,.table th.span6{float:none;width:344px;margin-left:0}.table td.span7,.table th.span7{float:none;width:404px;margin-left:0}.table td.span8,.table th.span8{float:none;width:464px;margin-left:0}.table td.span9,.table th.span9{float:none;width:524px;margin-left:0}.table td.span10,.table th.span10{float:none;width:584px;margin-left:0}.table td.span11,.table th.span11{float:none;width:644px;margin-left:0}.table td.span12,.table th.span12{float:none;width:704px;margin-left:0}.table tbody tr.success>td{background-color:#46a546}.table tbody tr.error>td{background-color:#9d261d}.table tbody tr.warning>td{background-color:#df7f48}.table tbody tr.info>td{background-color:#2e8aea}.table-hover tbody tr.success:hover>td{background-color:#3e933e}.table-hover tbody tr.error:hover>td{background-color:#872119}.table-hover tbody tr.warning:hover>td{background-color:#db7032}.table-hover tbody tr.info:hover>td{background-color:#177de7}.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:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);*border-right-width:2px;*border-bottom-width:2px;border-radius:6px;box-shadow:0 5px 10px rgba(0,0,0,0.2);background-clip:padding-box}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{*width:100%;height:1px;margin:9px 1px;*margin:-5px 0 5px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #fff}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:normal;line-height:20px;color:#343434;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:#000;background-image:linear-gradient(to bottom,#000,#000);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff000000',endColorstr='#ff000000',GradientType=0)}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#fff;text-decoration:none;background-color:#000;background-image:linear-gradient(to bottom,#000,#000);background-repeat:repeat-x;outline:0;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff000000',endColorstr='#ff000000',GradientType=0)}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{color:#d9d9d9}.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;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;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:#ccc;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;border-radius:6px 0 6px 6px}.dropdown .dropdown-menu .nav-header{padding-right:20px;padding-left:20px}.typeahead{z-index:1051;margin-top:2px;border-radius:0}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:0;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;border-radius:0}.well-small{padding:9px;border-radius:0}.fade{opacity:0;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{position:relative;height:0;overflow:hidden;transition:height .35s ease}.collapse.in{height:auto}.close{float:right;font-size:20px;font-weight:bold;line-height:20px;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-group{position:relative;display:inline-block;*display:inline;*margin-left:.3em;font-size:0;white-space:nowrap;vertical-align:middle;*zoom:1}.btn-group:first-child{*margin-left:0}.btn-group+.btn-group{margin-left:5px}.btn-toolbar{margin-top:10px;margin-bottom:10px;font-size:0}.btn-toolbar>.btn+.btn,.btn-toolbar>.btn-group+.btn,.btn-toolbar>.btn+.btn-group{margin-left:5px}.btn-group>.btn{position:relative;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;border-bottom-left-radius:0;border-top-left-radius:0;-moz-border-radius-bottomleft:0;-moz-border-radius-topleft:0}.btn-group>.btn:last-child,.btn-group>.dropdown-toggle{border-top-right-radius:0;border-bottom-right-radius:0;-moz-border-radius-topright:0;-moz-border-radius-bottomright:0}.btn-group>.btn.large:first-child{margin-left:0;border-bottom-left-radius:0;border-top-left-radius:0;-moz-border-radius-bottomleft:0;-moz-border-radius-topleft:0}.btn-group>.btn.large:last-child,.btn-group>.large.dropdown-toggle{border-top-right-radius:0;border-bottom-right-radius:0;-moz-border-radius-topright:0;-moz-border-radius-bottomright:0}.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;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;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:#e4e4e4}.btn-group.open .btn-primary.dropdown-toggle{background-color:#53a93f}.btn-group.open .btn-warning.dropdown-toggle{background-color:#df7f48}.btn-group.open .btn-danger.dropdown-toggle{background-color:#ee5f5b}.btn-group.open .btn-success.dropdown-toggle{background-color:#53a93f}.btn-group.open .btn-info.dropdown-toggle{background-color:#2f96b4}.btn-group.open .btn-inverse.dropdown-toggle{background-color:#222}.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%;border-radius:0}.btn-group-vertical>.btn+.btn{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:first-child{border-radius:0}.btn-group-vertical>.btn:last-child{border-radius:0}.btn-group-vertical>.btn-large:first-child{border-radius:0}.btn-group-vertical>.btn-large:last-child{border-radius:0}.alert{padding:8px 35px 8px 14px;margin-bottom:20px;background-color:#df7f48;border:1px solid transparent;border-radius:0}.alert,.alert h4,.alert a{color:#fff}.alert h4{margin:0}.alert .close{position:relative;top:-2px;right:-21px;line-height:20px}.close.-align-right{right:0}.alert-success{color:#fff;background-color:#46a546;border-color:transparent}.alert-success h4{color:#fff}.alert-danger,.alert-error{color:#fff;background-color:#9d261d;border-color:transparent}.alert-danger h4,.alert-error h4{color:#fff}.alert-info{color:#fff;background-color:#2e8aea;border-color:transparent}.alert-info h4{color:#fff}.alert-form{color:#555;background-color:#ececec;border:1px solid #555!important}.alert-form.-no-border{border:none!important}.alert-form h4{color:#555}.alert-block{padding-top:14px;padding-bottom:14px}.alert-block>p,.alert-block>ul{margin-bottom:0}.alert-block p+p{margin-top:5px}.list-icons li{max-width:300px;padding-left:35px}.list-icons li>i.icon{padding-right:7px;margin-left:-25px}.icon.handle{color:#d9d9d9}.nav{margin-bottom:20px;margin-left:0;list-style:none}.nav>li>a{display:block}.nav>li>a:hover,.nav>li>a:focus{text-decoration:none;background-color:#f8f8f8}.nav>li>a>img{max-width:none}.nav>.pull-right{float:right}.nav-header{display:block;padding:3px 15px;font-size:11px;font-weight:bold;line-height:20px;color:#d9d9d9;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:#000}.nav-list [class^="icon-"],.nav-list [class*=" icon-"]{margin-right:2px}.nav-list .divider{*width:100%;height:1px;margin:9px 1px;*margin:-5px 0 5px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #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:8px;padding-left:8px;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:5px;padding-bottom:4px;line-height:20px;color:#555;border:1px solid transparent}.nav-tabs>li>a:hover{color:#000}.nav-tabs>li>a:hover,.nav-tabs>li>a:focus{border-color:#f8f8f8 #f8f8f8 #ddd}.nav-tabs>.active>a,.nav-tabs>.active>a:hover,.nav-tabs>.active>a:focus{color:#000;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.show-validation .tab-error a,.show-validation .tab-error a:hover,.show-validation .tab-error a:focus{color:#fff!important;background-color:#9d261d!important;border-color:transparent}.show-validation .tab-error a:before{margin-right:5px;font-family:'icomoon';vertical-align:top;content:"\e25d"}.umb-nav-tabs{margin:-8px 0 0 0}.nav-pills>li>a{padding-top:8px;padding-bottom:8px;margin-top:2px;margin-bottom:2px;border-radius:5px}.nav-pills>.active>a,.nav-pills>.active>a:hover,.nav-pills>.active>a:focus{color:#fff;background-color:#000}.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;border-radius:0}.nav-tabs.nav-stacked>li:first-child>a{border-top-right-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{border-bottom-right-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}.dropdown-menu{border-radius:0}.dropdown-menu>li>a{padding:8px 20px}.nav-tabs .dropdown-menu{border-radius:0 0 6px 6px}.nav-pills .dropdown-menu{border-radius:6px}.nav .dropdown-toggle .caret{margin-top:6px;border-top-color:#000;border-bottom-color:#000}.nav .dropdown-toggle:hover .caret,.nav .dropdown-toggle:focus .caret{border-top-color:#000;border-bottom-color:#000}.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:#555;border-bottom-color:#555}.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{background-color:#d9d9d9;border-color:#d9d9d9}.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:#d9d9d9}.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{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;border-radius:4px 0 0 4px}.tabs-left>.nav-tabs>li>a:hover,.tabs-left>.nav-tabs>li>a:focus{border-color:#f8f8f8 #ddd #f8f8f8 #f8f8f8}.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;border-radius:0 4px 4px 0}.tabs-right>.nav-tabs>li>a:hover,.tabs-right>.nav-tabs>li>a:focus{border-color:#f8f8f8 #f8f8f8 #f8f8f8 #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:#d9d9d9}.nav>.disabled>a:hover,.nav>.disabled>a:focus{text-decoration:none;cursor:default;background-color:transparent}.navbar{*position:relative;*z-index:2;margin-bottom:20px;overflow:visible}.navbar-inner{min-height:40px;padding-right:20px;padding-left:20px;background-color:#fafafa;background-image:linear-gradient(to bottom,#fff,#f2f2f2);background-repeat:repeat-x;border:1px solid #d4d4d4;border-radius:0;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff',endColorstr='#fff2f2f2',GradientType=0);*zoom:1;box-shadow:0 1px 4px rgba(0,0,0,0.065)}.navbar-inner:before,.navbar-inner:after{display:table;line-height:0;content:""}.navbar-inner:after{clear:both}.navbar .container{width:auto}.nav-collapse.collapse{height:auto;overflow:visible}.navbar .brand{display:block;float:left;padding:10px 20px 10px;margin-left:-20px;font-size:20px;font-weight:200;color:#777;text-shadow:0 1px 0 #fff}.navbar .brand:hover,.navbar .brand:focus{text-decoration:none}.navbar-text{margin-bottom:0;line-height:40px;color:#777}.navbar-link{color:#777}.navbar-link:hover,.navbar-link:focus{color:#343434}.navbar .divider-vertical{height:40px;margin:0 9px;border-right:1px solid #fff;border-left:1px solid #f2f2f2}.navbar .btn,.navbar .btn-group{margin-top:5px}.navbar .btn-group .btn,.navbar .input-prepend .btn,.navbar .input-append .btn,.navbar .input-prepend .btn-group,.navbar .input-append .btn-group{margin-top:0}.navbar-form{margin-bottom:0;*zoom:1}.navbar-form:before,.navbar-form:after{display:table;line-height:0;content:""}.navbar-form:after{clear:both}.navbar-form input,.navbar-form select,.navbar-form .radio,.navbar-form .checkbox{margin-top:5px}.navbar-form input,.navbar-form select,.navbar-form .btn{display:inline-block;margin-bottom:0}.navbar-form input[type="image"],.navbar-form input[type="checkbox"],.navbar-form input[type="radio"]{margin-top:3px}.navbar-form .input-append,.navbar-form .input-prepend{margin-top:5px;white-space:nowrap}.navbar-form .input-append input,.navbar-form .input-prepend input{margin-top:0}.navbar-search{position:relative;float:left;margin-top:5px;margin-bottom:0}.navbar-search .search-query{padding:4px 14px;margin-bottom:0;font-family:"Open Sans","Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;font-weight:normal;line-height:1;border-radius:15px}.navbar-static-top{position:static;margin-bottom:0}.navbar-static-top .navbar-inner{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;border-radius:0}.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:720px}.navbar-fixed-top{top:0}.navbar-fixed-top .navbar-inner,.navbar-static-top .navbar-inner{box-shadow:0 1px 10px rgba(0,0,0,0.1)}.navbar-fixed-bottom{bottom:0}.navbar-fixed-bottom .navbar-inner{box-shadow:0 -1px 10px rgba(0,0,0,0.1)}.navbar .nav{position:relative;left:0;display:block;float:left;margin:0 10px 0 0}.navbar .nav.pull-right{float:right;margin-right:0}.navbar .nav>li{float:left}.navbar .nav>li>a{float:none;padding:10px 15px 10px;color:#777;text-decoration:none;text-shadow:0 1px 0 #fff}.navbar .nav .dropdown-toggle .caret{margin-top:8px}.navbar .nav>li>a:focus,.navbar .nav>li>a:hover{color:#343434;text-decoration:none;background-color:transparent}.navbar .nav>.active>a,.navbar .nav>.active>a:hover,.navbar .nav>.active>a:focus{color:#555;text-decoration:none;background-color:#e5e5e5;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:#ededed;*background-color:#e5e5e5;background-image:linear-gradient(to bottom,#f2f2f2,#e5e5e5);background-repeat:repeat-x;border-color:#e5e5e5 #e5e5e5 #bfbfbf;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2f2f2',endColorstr='#ffe5e5e5',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);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{background-color:#ededed}.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:#d9d9d9}.navbar .btn-navbar:active,.navbar .btn-navbar.active{background-color:#ccc \9}.navbar .btn-navbar .icon-bar{display:block;width:18px;height:2px;background-color:#f5f5f5;border-radius:1px;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 #fff;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 #fff;border-bottom:0}.navbar .nav li.dropdown>a:hover .caret,.navbar .nav li.dropdown>a:focus .caret{border-top-color:#343434;border-bottom-color:#343434}.navbar .nav li.dropdown.open>.dropdown-toggle,.navbar .nav li.dropdown.active>.dropdown-toggle,.navbar .nav li.dropdown.open.active>.dropdown-toggle{color:#555;background-color:#e5e5e5}.navbar .nav li.dropdown>.dropdown-toggle .caret{border-top-color:#777;border-bottom-color:#777}.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:#555;border-bottom-color:#555}.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;border-radius:6px 0 6px 6px}.navbar-inverse .navbar-inner{background-color:#1b1b1b;background-image:linear-gradient(to bottom,#222,#111);background-repeat:repeat-x;border-color:#252525;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff222222',endColorstr='#ff111111',GradientType=0)}.navbar-inverse .brand,.navbar-inverse .nav>li>a{color:#d9d9d9;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:#d9d9d9}.navbar-inverse .navbar-text{color:#d9d9d9}.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:#111}.navbar-inverse .navbar-link{color:#d9d9d9}.navbar-inverse .navbar-link:hover,.navbar-inverse .navbar-link:focus{color:#fff}.navbar-inverse .divider-vertical{border-right-color:#222;border-left-color:#111}.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:#111}.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:#d9d9d9;border-bottom-color:#d9d9d9}.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:#515151;border-color:#111;box-shadow:inset 0 1px 2px rgba(0,0,0,0.1),0 1px 0 rgba(255,255,255,0.15);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:#343434;text-shadow:0 1px 0 #fff;background-color:#fff;border:0;outline:0;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:#0e0e0e;*background-color:#040404;background-image:linear-gradient(to bottom,#151515,#040404);background-repeat:repeat-x;border-color:#040404 #040404 #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='#ff151515',endColorstr='#ff040404',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.navbar-inverse .btn-navbar:hover,.navbar-inverse .btn-navbar:focus,.navbar-inverse .btn-navbar:active{background-color:#101010}.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:#000}.navbar-inverse .btn-navbar:active,.navbar-inverse .btn-navbar.active{background-color:#000 \9}.breadcrumb{padding:8px 15px;margin:0 0 20px;list-style:none;background-color:#f5f5f5;border-radius:0}.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:#d9d9d9}.pagination{margin:20px 0}.pagination ul{display:inline-block;*display:inline;margin-bottom:0;margin-left:0;border-radius:0;*zoom:1;box-shadow:0 1px 2px rgba(0,0,0,0.05)}.pagination ul>li{display:inline}.pagination ul>li>a,.pagination ul>li>span{float:left;padding:4px 12px;line-height:20px;text-decoration:none;background-color:#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:#d9d9d9;cursor:default}.pagination ul>.disabled>span,.pagination ul>.disabled>a,.pagination ul>.disabled>a:hover,.pagination ul>.disabled>a:focus{color:#d9d9d9;cursor:default;background-color:transparent}.pagination ul>li:first-child>a,.pagination ul>li:first-child>span{border-left-width:1px;border-bottom-left-radius:0;border-top-left-radius:0;-moz-border-radius-bottomleft:0;-moz-border-radius-topleft:0}.pagination ul>li:last-child>a,.pagination ul>li:last-child>span{border-top-right-radius:0;border-bottom-right-radius:0;-moz-border-radius-topright:0;-moz-border-radius-bottomright:0}.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{border-bottom-left-radius:0;border-top-left-radius:0;-moz-border-radius-bottomleft:0;-moz-border-radius-topleft:0}.pagination-large ul>li:last-child>a,.pagination-large ul>li:last-child>span{border-top-right-radius:0;border-bottom-right-radius:0;-moz-border-radius-topright:0;-moz-border-radius-bottomright:0}.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{border-bottom-left-radius:0;border-top-left-radius:0;-moz-border-radius-bottomleft:0;-moz-border-radius-topleft:0}.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{border-top-right-radius:0;border-bottom-right-radius:0;-moz-border-radius-topright:0;-moz-border-radius-bottomright:0}.pagination-small ul>li>a,.pagination-small ul>li>span{padding:2px 10px;font-size:11.9px}.pagination-mini ul>li>a,.pagination-mini ul>li>span{padding:0 6px;font-size:10.5px}.pager{margin:20px 0;text-align:center;list-style:none;*zoom:1}.pager:before,.pager:after{display:table;line-height:0;content:""}.pager:after{clear:both}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;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:#d9d9d9;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;border-radius:6px;outline:0;box-shadow:0 3px 7px rgba(0,0,0,0.3);background-clip:padding-box}.modal.fade{top:-25%;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;border-radius:0 0 6px 6px;*zoom:1;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:#000;border-radius:0}.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:#000;border-width:5px 5px 0}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-right-color:#000;border-width:5px 5px 5px 0}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-left-color:#000;border-width:5px 0 5px 5px}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-bottom-color:#000;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:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);border-radius:6px;box-shadow:0 5px 10px rgba(0,0,0,0.2);background-clip:padding-box}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{padding:8px 14px;margin:0;font-size:14px;font-weight:normal;line-height:18px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;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:#fff;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:#fff;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:#fff;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:#fff;border-right-width:0}.tipmenu .tooltip{position:absolute;right:0;left:0;margin-right:auto;margin-left:auto}.tipmenu:hover .tooltip{opacity:1}.tipmenu:hover .tooltip a{color:white}.tipmenu .tooltip-inner{margin-right:auto;margin-left:auto}.thumbnails{margin-left:0;list-style:none;*zoom:1}.thumbnails:before,.thumbnails:after{display:table;line-height:0;content:""}.thumbnails:after{clear:both}.row-fluid .thumbnails{margin-left:0}.thumbnails>li{float:left;margin-bottom:20px;margin-left:0}.thumbnails>li a:hover{text-decoration:none}.thumbnail{display:block;padding:4px;line-height:20px;border:1px solid #ddd;border-radius:0;box-shadow:0 1px 3px rgba(0,0,0,0.055);transition:all .2s ease-in-out}a.thumbnail:hover,a.thumbnail:focus{border-color:#000;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:#555}.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:#d9d9d9}.label{border-radius:3px}.badge{padding-right:9px;padding-left: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:#fff}.label-important[href],.badge-important[href]{background-color:#e6e6e6}.label-warning,.badge-warning{background-color:#df7f48}.label-warning[href],.badge-warning[href]{background-color:#d06324}.label-success,.badge-success{background-color:#fff}.label-success[href],.badge-success[href]{background-color:#e6e6e6}.label-info,.badge-info{background-color:#fff}.label-info[href],.badge-info[href]{background-color:#e6e6e6}.label-inverse,.badge-inverse{background-color:#343434}.label-inverse[href],.badge-inverse[href]{background-color:#1a1a1a}.btn .label,.btn .badge{position:relative;top:-1px}.btn-mini .label,.btn-mini .badge{top:0}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f7f7f7;background-image:linear-gradient(to bottom,#f5f5f5,#f9f9f9);background-repeat:repeat-x;border-radius:0;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5',endColorstr='#fff9f9f9',GradientType=0);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:linear-gradient(to bottom,#149bdf,#0480be);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff149bdf',endColorstr='#ff0480be',GradientType=0);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);box-sizing:border-box;transition:width .6s ease}.progress .bar+.bar{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:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-size:40px 40px}.progress.active .bar{animation:progress-bar-stripes 2s linear infinite}.progress-danger .bar,.progress .bar-danger{background-color:#dd514c;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: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: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: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: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: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:#e69a6f;background-image:linear-gradient(to bottom,#eaad89,#df7f48);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffeaad89',endColorstr='#ffdf7f48',GradientType=0)}.progress-warning.progress-striped .bar,.progress-striped .bar-warning{background-color:#eaad89;background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.accordion{margin-bottom:20px}.accordion-group{margin-bottom:2px;border:1px solid #e5e5e5;border-radius:0}.accordion-heading{border-bottom:0}.accordion-heading .accordion-toggle{display:block;padding:8px 15px}.accordion-toggle{cursor:pointer}.accordion-inner{padding:9px 15px;border-top:1px solid #e5e5e5}.carousel{position:relative;margin-bottom:20px;line-height:1}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;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:#222;border:3px solid #fff;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:#343434;background:rgba(0,0,0,0.75)}.carousel-caption h4,.carousel-caption p{line-height:20px;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:30px;color:inherit;background-color:#f8f8f8;border-radius:6px}.hero-unit h1{margin-bottom:0;font-size:60px;line-height:1;letter-spacing:-1px;color:inherit}.hero-unit li{line-height:30px}.pull-right{float:right}.pull-left{float:left}.hide{display:none}.show{display:block}.invisible{visibility:hidden}.affix{position:fixed}html,body{height:100%;overflow:hidden}body{width:100%;height:100%;padding:0;margin:0;font-family:"Open Sans","Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:20px;color:#343434;background-color:#fff}.padded{padding:20px}#layout{position:relative;z-index:1;height:100%;padding:0}#mainwrapper{width:100%;height:100%;margin:0}#contentwrapper,#contentcolumn{position:absolute;top:0;right:0;bottom:0;left:80px;z-index:10;margin:0}#umb-notifications-wrapper{left:80px}#contentcolumn{left:0}#contentcolumn iframe#right{position:relative;display:block;width:100%;height:100%;border:0}#leftcolumn{position:absolute;z-index:20;float:left;width:80px;height:100%}#applications{position:absolute;top:0;bottom:0;left:0;z-index:1000;height:100%;text-align:center}#applications-tray{position:absolute;top:0;bottom:0;left:80px;z-index:900;height:100%;text-align:center}#search-form{position:absolute;top:0;right:0;left:0;z-index:100;display:block;margin:0;overflow:hidden}#search-form .form-search{display:-ms-flexbox;display:flex;margin-top:17px}#search-form .form-search .umb-search-field{width:auto;min-width:160px;-ms-flex:1;flex:1}@media(max-width:500px){#search-form .form-search{width:calc(100% - 80px)}}#navigation{position:absolute;top:0;bottom:0;left:80px;z-index:100;height:100%;background:#fff}.navigation-inner-container{position:absolute;top:0;right:0;bottom:0;left:0;z-index:100;padding-top:100px;border-right:1px solid #d9d9d9}#dialog{position:absolute;top:0;left:100%;z-index:50;display:inline-block;min-width:500px}#tree{z-index:100!important;padding:0;overflow:auto}#tree .umb-tree{padding:0 0 20px 0}#search-results{z-index:200}#contextMenu{position:absolute;top:0;left:100%;z-index:50;min-width:250px}#speechbubble{position:absolute;right:0;bottom:100px;left:0;z-index:1060;padding:0;margin:auto;background:0;border:0;border-bottom:0;border-radius:0}.ui-resizable-e{position:absolute;top:0;right:-5px;bottom:0;z-index:9999!important;width:4px;cursor:e-resize;background-color:#f8f8f8;border:solid 1px #d9d9d9;border-top:0;border-bottom:0}@media(min-width:1101px){#contentwrapper,#umb-notifications-wrapper{left:440px}#speechbubble{left:360px}}.emptySection #contentwrapper,.emptySection #umb-notifications-wrapper{left:80px}.emptySection #speechbubble{left:0}.emptySection #navigation{display:none}.login-only #speechbubble{left:0!important;z-index:10000}.login-only #speechbubble ul{padding-left:20px}@media(max-width:767px){#leftcolumn{width:61px}#applications ul.sections{width:61px}ul.sections.sections-tray{width:61px}#applications-tray{left:60px}#navigation{left:60px}#contentwrapper,#contentcolumn,#umb-notifications-wrapper{left:30px}#umbracoMainPageBody .umb-modal-left.fade.in{margin-left:61px}}@media(max-width:500px){#leftcolumn{width:41px}#applications ul.sections{width:41px}#applications ul.sections-tray{width:41px}ul.sections.sections-tray{width:41px}#applications-tray{left:40px}#navigation{left:40px}#contentwrapper,#contentcolumn,#umb-notifications-wrapper{left:20px}#umbracoMainPageBody .umb-modal-left.fade.in{width:85%!important;margin-left:41px}}.shadow-depth-1{box-shadow:0 1px 3px rgba(0,0,0,0.12),0 1px 2px rgba(0,0,0,0.24)}.shadow-depth-2{box-shadow:0 3px 6px rgba(0,0,0,0.16),0 3px 6px rgba(0,0,0,0.23)}.shadow-depth-3{box-shadow:0 10px 20px rgba(0,0,0,0.19),0 6px 6px rgba(0,0,0,0.23)}.shadow-depth-4{box-shadow:0 14px 28px rgba(0,0,0,0.25),0 10px 10px rgba(0,0,0,0.22)}.shadow-depth-5{box-shadow:0 19px 38px rgba(0,0,0,0.3),0 15px 12px rgba(0,0,0,0.22)}.animated{animation-duration:1s;animation-fill-mode:both}.animated.infinite{animation-iteration-count:infinite}.animated.hinge{animation-duration:2s}@keyframes bounce{0%,100%,20%,53%,80%{transform:translate3d(0,0,0);transition-timing-function:cubic-bezier(0.215,0.61,0.355,1)}40%,43%{transform:translate3d(0,-30px,0);transition-timing-function:cubic-bezier(0.755,0.05,0.855,0.06)}70%{transform:translate3d(0,-15px,0);transition-timing-function:cubic-bezier(0.755,0.05,0.855,0.06)}90%{transform:translate3d(0,-4px,0)}}.bounce{animation-name:bounce;transform-origin:center bottom}@keyframes flash{0%,100%,50%{opacity:1}25%,75%{opacity:0}}.flash{animation-name:flash}@keyframes pulse{0%{transform:scale3d(1,1,1)}50%{transform:scale3d(1.05,1.05,1.05)}100%{transform:scale3d(1,1,1)}}.pulse{animation-name:pulse}@keyframes rubberBand{0%{transform:scale3d(1,1,1)}30%{transform:scale3d(1.25,0.75,1)}40%{transform:scale3d(0.75,1.25,1)}50%{transform:scale3d(1.15,0.85,1)}65%{transform:scale3d(0.95,1.05,1)}75%{transform:scale3d(1.05,0.95,1)}100%{transform:scale3d(1,1,1)}}.rubberBand{animation-name:rubberBand}@keyframes shake{0%,100%{transform:translate3d(0,0,0)}10%,30%,50%,70%,90%{transform:translate3d(-10px,0,0)}20%,40%,60%,80%{transform:translate3d(10px,0,0)}}.shake{animation-name:shake}@keyframes swing{20%{transform:rotate3d(0,0,1,15deg)}40%{transform:rotate3d(0,0,1,-10deg)}60%{transform:rotate3d(0,0,1,5deg)}80%{transform:rotate3d(0,0,1,-5deg)}100%{transform:rotate3d(0,0,1,0deg)}}.swing{animation-name:swing;transform-origin:top center}@keyframes tada{0%{transform:scale3d(1,1,1)}10%,20%{transform:scale3d(0.9,0.9,0.9) rotate3d(0,0,1,-3deg)}30%,50%,70%,90%{transform:scale3d(1.1,1.1,1.1) rotate3d(0,0,1,3deg)}40%,60%,80%{transform:scale3d(1.1,1.1,1.1) rotate3d(0,0,1,-3deg)}100%{transform:scale3d(1,1,1)}}.tada{animation-name:tada}@keyframes wobble{0%{transform:none}15%{transform:translate3d(-25%,0,0) rotate3d(0,0,1,-5deg)}30%{transform:translate3d(20%,0,0) rotate3d(0,0,1,3deg)}45%{transform:translate3d(-15%,0,0) rotate3d(0,0,1,-3deg)}60%{transform:translate3d(10%,0,0) rotate3d(0,0,1,2deg)}75%{transform:translate3d(-5%,0,0) rotate3d(0,0,1,-1deg)}100%{transform:none}}.wobble{animation-name:wobble}@keyframes bounceIn{0%,100%,20%,40%,60%,80%{transition-timing-function:cubic-bezier(0.215,0.61,0.355,1)}0%{opacity:0;transform:scale3d(0.3,0.3,0.3)}20%{transform:scale3d(1.1,1.1,1.1)}40%{transform:scale3d(0.9,0.9,0.9)}60%{opacity:1;transform:scale3d(1.03,1.03,1.03)}80%{transform:scale3d(0.97,0.97,0.97)}100%{opacity:1;transform:scale3d(1,1,1)}}.bounceIn{animation-duration:.75s;animation-name:bounceIn}@keyframes bounceInDown{0%,100%,60%,75%,90%{transition-timing-function:cubic-bezier(0.215,0.61,0.355,1)}0%{opacity:0;transform:translate3d(0,-3000px,0)}60%{opacity:1;transform:translate3d(0,25px,0)}75%{transform:translate3d(0,-10px,0)}90%{transform:translate3d(0,5px,0)}100%{transform:none}}.bounceInDown{animation-name:bounceInDown}@keyframes bounceInLeft{0%,100%,60%,75%,90%{transition-timing-function:cubic-bezier(0.215,0.61,0.355,1)}0%{opacity:0;transform:translate3d(-3000px,0,0)}60%{opacity:1;transform:translate3d(25px,0,0)}75%{transform:translate3d(-10px,0,0)}90%{transform:translate3d(5px,0,0)}100%{transform:none}}.bounceInLeft{animation-name:bounceInLeft}@keyframes bounceInRight{0%,100%,60%,75%,90%{transition-timing-function:cubic-bezier(0.215,0.61,0.355,1)}0%{opacity:0;transform:translate3d(3000px,0,0)}60%{opacity:1;transform:translate3d(-25px,0,0)}75%{transform:translate3d(10px,0,0)}90%{transform:translate3d(-5px,0,0)}100%{transform:none}}.bounceInRight{animation-name:bounceInRight}@keyframes bounceInUp{0%,100%,60%,75%,90%{transition-timing-function:cubic-bezier(0.215,0.61,0.355,1)}0%{opacity:0;transform:translate3d(0,3000px,0)}60%{opacity:1;transform:translate3d(0,-20px,0)}75%{transform:translate3d(0,10px,0)}90%{transform:translate3d(0,-5px,0)}100%{transform:translate3d(0,0,0)}}.bounceInUp{animation-name:bounceInUp}@keyframes bounceOut{20%{transform:scale3d(0.9,0.9,0.9)}50%,55%{opacity:1;transform:scale3d(1.1,1.1,1.1)}100%{opacity:0;transform:scale3d(0.3,0.3,0.3)}}.bounceOut{animation-duration:.75s;animation-name:bounceOut}@keyframes bounceOutDown{20%{transform:translate3d(0,10px,0)}40%,45%{opacity:1;transform:translate3d(0,-20px,0)}100%{opacity:0;transform:translate3d(0,2000px,0)}}.bounceOutDown{animation-name:bounceOutDown}@keyframes bounceOutLeft{20%{opacity:1;transform:translate3d(20px,0,0)}100%{opacity:0;transform:translate3d(-2000px,0,0)}}.bounceOutLeft{animation-name:bounceOutLeft}@keyframes bounceOutRight{20%{opacity:1;transform:translate3d(-20px,0,0)}100%{opacity:0;transform:translate3d(2000px,0,0)}}.bounceOutRight{animation-name:bounceOutRight}@keyframes bounceOutUp{20%{transform:translate3d(0,-10px,0)}40%,45%{opacity:1;transform:translate3d(0,20px,0)}100%{opacity:0;transform:translate3d(0,-2000px,0)}}.bounceOutUp{animation-name:bounceOutUp}@keyframes fadeIn{0%{opacity:0}100%{opacity:1}}.fadeIn{animation-name:fadeIn}@keyframes fadeInDown{0%{opacity:0;transform:translate3d(0,-100%,0)}100%{opacity:1;transform:none}}.fadeInDown{animation-name:fadeInDown}@keyframes fadeInDownBig{0%{opacity:0;transform:translate3d(0,-2000px,0)}100%{opacity:1;transform:none}}.fadeInDownBig{animation-name:fadeInDownBig}@keyframes fadeInLeft{0%{opacity:0;transform:translate3d(-100%,0,0)}100%{opacity:1;transform:none}}.fadeInLeft{animation-name:fadeInLeft}@keyframes fadeInLeftBig{0%{opacity:0;transform:translate3d(-2000px,0,0)}100%{opacity:1;transform:none}}.fadeInLeftBig{animation-name:fadeInLeftBig}@keyframes fadeInRight{0%{opacity:0;transform:translate3d(100%,0,0)}100%{opacity:1;transform:none}}.fadeInRight{animation-name:fadeInRight}@keyframes fadeInRightBig{0%{opacity:0;transform:translate3d(2000px,0,0)}100%{opacity:1;transform:none}}.fadeInRightBig{animation-name:fadeInRightBig}@keyframes fadeInUp{0%{opacity:0;transform:translate3d(0,100%,0)}100%{opacity:1;transform:none}}.fadeInUp{animation-name:fadeInUp}@keyframes fadeInUpBig{0%{opacity:0;transform:translate3d(0,2000px,0)}100%{opacity:1;transform:none}}.fadeInUpBig{animation-name:fadeInUpBig}@keyframes fadeOut{0%{opacity:1}100%{opacity:0}}.fadeOut{animation-name:fadeOut}@keyframes fadeOutDown{0%{opacity:1}100%{opacity:0;transform:translate3d(0,100%,0)}}.fadeOutDown{animation-name:fadeOutDown}@keyframes fadeOutDownBig{0%{opacity:1}100%{opacity:0;transform:translate3d(0,2000px,0)}}.fadeOutDownBig{animation-name:fadeOutDownBig}@keyframes fadeOutLeft{0%{opacity:1}100%{opacity:0;transform:translate3d(-100%,0,0)}}.fadeOutLeft{animation-name:fadeOutLeft}@keyframes fadeOutLeftBig{0%{opacity:1}100%{opacity:0;transform:translate3d(-2000px,0,0)}}.fadeOutLeftBig{animation-name:fadeOutLeftBig}@keyframes fadeOutRight{0%{opacity:1}100%{opacity:0;transform:translate3d(100%,0,0)}}.fadeOutRight{animation-name:fadeOutRight}@keyframes fadeOutRightBig{0%{opacity:1}100%{opacity:0;transform:translate3d(2000px,0,0)}}.fadeOutRightBig{animation-name:fadeOutRightBig}@keyframes fadeOutUp{0%{opacity:1}100%{opacity:0;transform:translate3d(0,-100%,0)}}.fadeOutUp{animation-name:fadeOutUp}@keyframes fadeOutUpBig{0%{opacity:1}100%{opacity:0;transform:translate3d(0,-2000px,0)}}.fadeOutUpBig{animation-name:fadeOutUpBig}@keyframes flip{0%{transform:perspective(400px) rotate3d(0,1,0,-360deg);animation-timing-function:ease-out}40%{transform:perspective(400px) translate3d(0,0,150px) rotate3d(0,1,0,-190deg);animation-timing-function:ease-out}50%{transform:perspective(400px) translate3d(0,0,150px) rotate3d(0,1,0,-170deg);animation-timing-function:ease-in}80%{transform:perspective(400px) scale3d(0.95,0.95,0.95);animation-timing-function:ease-in}100%{transform:perspective(400px);animation-timing-function:ease-in}}.animated.flip{animation-name:flip;-ms-backface-visibility:visible;backface-visibility:visible}@keyframes flipInX{0%{opacity:0;transform:perspective(400px) rotate3d(1,0,0,90deg);transition-timing-function:ease-in}40%{transform:perspective(400px) rotate3d(1,0,0,-20deg);transition-timing-function:ease-in}60%{opacity:1;transform:perspective(400px) rotate3d(1,0,0,10deg)}80%{transform:perspective(400px) rotate3d(1,0,0,-5deg)}100%{transform:perspective(400px)}}.flipInX{animation-name:flipInX;-ms-backface-visibility:visible!important;backface-visibility:visible!important}@keyframes flipInY{0%{opacity:0;transform:perspective(400px) rotate3d(0,1,0,90deg);transition-timing-function:ease-in}40%{transform:perspective(400px) rotate3d(0,1,0,-20deg);transition-timing-function:ease-in}60%{opacity:1;transform:perspective(400px) rotate3d(0,1,0,10deg)}80%{transform:perspective(400px) rotate3d(0,1,0,-5deg)}100%{transform:perspective(400px)}}.flipInY{animation-name:flipInY;-ms-backface-visibility:visible!important;backface-visibility:visible!important}@keyframes flipOutX{0%{transform:perspective(400px)}30%{opacity:1;transform:perspective(400px) rotate3d(1,0,0,-20deg)}100%{opacity:0;transform:perspective(400px) rotate3d(1,0,0,90deg)}}.flipOutX{animation-duration:.75s;animation-name:flipOutX;-ms-backface-visibility:visible!important;backface-visibility:visible!important}@keyframes flipOutY{0%{transform:perspective(400px)}30%{opacity:1;transform:perspective(400px) rotate3d(0,1,0,-15deg)}100%{opacity:0;transform:perspective(400px) rotate3d(0,1,0,90deg)}}.flipOutY{animation-duration:.75s;animation-name:flipOutY;-ms-backface-visibility:visible!important;backface-visibility:visible!important}@keyframes lightSpeedIn{0%{opacity:0;transform:translate3d(100%,0,0) skewX(-30deg)}60%{opacity:1;transform:skewX(20deg)}80%{opacity:1;transform:skewX(-5deg)}100%{opacity:1;transform:none}}.lightSpeedIn{animation-name:lightSpeedIn;animation-timing-function:ease-out}@keyframes lightSpeedOut{0%{opacity:1}100%{opacity:0;transform:translate3d(100%,0,0) skewX(30deg)}}.lightSpeedOut{animation-name:lightSpeedOut;animation-timing-function:ease-in}@keyframes rotateIn{0%{opacity:0;transform:rotate3d(0,0,1,-200deg);transform-origin:center}100%{opacity:1;transform:none;transform-origin:center}}.rotateIn{animation-name:rotateIn}@keyframes rotateInDownLeft{0%{opacity:0;transform:rotate3d(0,0,1,-45deg);transform-origin:left bottom}100%{opacity:1;transform:none;transform-origin:left bottom}}.rotateInDownLeft{animation-name:rotateInDownLeft}@keyframes rotateInDownRight{0%{opacity:0;transform:rotate3d(0,0,1,45deg);transform-origin:right bottom}100%{opacity:1;transform:none;transform-origin:right bottom}}.rotateInDownRight{animation-name:rotateInDownRight}@keyframes rotateInUpLeft{0%{opacity:0;transform:rotate3d(0,0,1,45deg);transform-origin:left bottom}100%{opacity:1;transform:none;transform-origin:left bottom}}.rotateInUpLeft{animation-name:rotateInUpLeft}@keyframes rotateInUpRight{0%{opacity:0;transform:rotate3d(0,0,1,-90deg);transform-origin:right bottom}100%{opacity:1;transform:none;transform-origin:right bottom}}.rotateInUpRight{animation-name:rotateInUpRight}@keyframes rotateOut{0%{opacity:1;transform-origin:center}100%{opacity:0;transform:rotate3d(0,0,1,200deg);transform-origin:center}}.rotateOut{animation-name:rotateOut}@keyframes rotateOutDownLeft{0%{opacity:1;transform-origin:left bottom}100%{opacity:0;transform:rotate(0,0,1,45deg);transform-origin:left bottom}}.rotateOutDownLeft{animation-name:rotateOutDownLeft}@keyframes rotateOutDownRight{0%{opacity:1;transform-origin:right bottom}100%{opacity:0;transform:rotate3d(0,0,1,-45deg);transform-origin:right bottom}}.rotateOutDownRight{animation-name:rotateOutDownRight}@keyframes rotateOutUpLeft{0%{opacity:1;transform-origin:left bottom}100%{opacity:0;transform:rotate3d(0,0,1,-45deg);transform-origin:left bottom}}.rotateOutUpLeft{animation-name:rotateOutUpLeft}@keyframes rotateOutUpRight{0%{opacity:1;transform-origin:right bottom}100%{opacity:0;transform:rotate3d(0,0,1,90deg);transform-origin:right bottom}}.rotateOutUpRight{animation-name:rotateOutUpRight}@keyframes hinge{0%{animation-timing-function:ease-in-out;transform-origin:top left}20%,60%{transform:rotate3d(0,0,1,80deg);animation-timing-function:ease-in-out;transform-origin:top left}40%,80%{opacity:1;transform:rotate3d(0,0,1,60deg);animation-timing-function:ease-in-out;transform-origin:top left}100%{opacity:0;transform:translate3d(0,700px,0)}}.hinge{animation-name:hinge}@keyframes rollIn{0%{opacity:0;transform:translate3d(-100%,0,0) rotate3d(0,0,1,-120deg)}100%{opacity:1;transform:none}}.rollIn{animation-name:rollIn}@keyframes rollOut{0%{opacity:1}100%{opacity:0;transform:translate3d(100%,0,0) rotate3d(0,0,1,120deg)}}.rollOut{animation-name:rollOut}@keyframes zoomIn{0%{opacity:0;transform:scale3d(0.3,0.3,0.3)}50%{opacity:1}}.zoomIn{animation-name:zoomIn}@keyframes zoomInDown{0%{opacity:0;transform:scale3d(0.1,0.1,0.1) translate3d(0,-1000px,0);animation-timing-function:cubic-bezier(0.55,0.055,0.675,0.19)}60%{opacity:1;transform:scale3d(0.475,0.475,0.475) translate3d(0,60px,0);animation-timing-function:cubic-bezier(0.175,0.885,0.32,1)}}.zoomInDown{animation-name:zoomInDown}@keyframes zoomInLeft{0%{opacity:0;transform:scale3d(0.1,0.1,0.1) translate3d(-1000px,0,0);animation-timing-function:cubic-bezier(0.55,0.055,0.675,0.19)}60%{opacity:1;transform:scale3d(0.475,0.475,0.475) translate3d(10px,0,0);animation-timing-function:cubic-bezier(0.175,0.885,0.32,1)}}.zoomInLeft{animation-name:zoomInLeft}@keyframes zoomInRight{0%{opacity:0;transform:scale3d(0.1,0.1,0.1) translate3d(1000px,0,0);animation-timing-function:cubic-bezier(0.55,0.055,0.675,0.19)}60%{opacity:1;transform:scale3d(0.475,0.475,0.475) translate3d(-10px,0,0);animation-timing-function:cubic-bezier(0.175,0.885,0.32,1)}}.zoomInRight{animation-name:zoomInRight}@keyframes zoomInUp{0%{opacity:0;transform:scale3d(0.1,0.1,0.1) translate3d(0,1000px,0);animation-timing-function:cubic-bezier(0.55,0.055,0.675,0.19)}60%{opacity:1;transform:scale3d(0.475,0.475,0.475) translate3d(0,-60px,0);animation-timing-function:cubic-bezier(0.175,0.885,0.32,1)}}.zoomInUp{animation-name:zoomInUp}@keyframes zoomOut{0%{opacity:1}50%{opacity:0;transform:scale3d(0.3,0.3,0.3)}100%{opacity:0}}.zoomOut{animation-name:zoomOut}@keyframes zoomOutDown{40%{opacity:1;transform:scale3d(0.475,0.475,0.475) translate3d(0,-60px,0);animation-timing-function:cubic-bezier(0.55,0.055,0.675,0.19)}100%{opacity:0;transform:scale3d(0.1,0.1,0.1) translate3d(0,2000px,0);animation-timing-function:cubic-bezier(0.175,0.885,0.32,1);transform-origin:center bottom}}.zoomOutDown{animation-name:zoomOutDown}@keyframes zoomOutLeft{40%{opacity:1;transform:scale3d(0.475,0.475,0.475) translate3d(42px,0,0)}100%{opacity:0;transform:scale(0.1) translate3d(-2000px,0,0);transform-origin:left center}}.zoomOutLeft{animation-name:zoomOutLeft}@keyframes zoomOutRight{40%{opacity:1;transform:scale3d(0.475,0.475,0.475) translate3d(-42px,0,0)}100%{opacity:0;transform:scale(0.1) translate3d(2000px,0,0);transform-origin:right center}}.zoomOutRight{animation-name:zoomOutRight}@keyframes zoomOutUp{40%{opacity:1;transform:scale3d(0.475,0.475,0.475) translate3d(0,60px,0);animation-timing-function:cubic-bezier(0.55,0.055,0.675,0.19)}100%{opacity:0;transform:scale3d(0.1,0.1,0.1) translate3d(0,-2000px,0);animation-timing-function:cubic-bezier(0.175,0.885,0.32,1);transform-origin:center bottom}}.zoomOutUp{animation-name:zoomOutUp}.animated.-half-second{animation-duration:.5s}.slide-in-left.ng-hide-remove{animation:fadeInLeft .6s}.slide-in-left.ng-hide-add{display:block!important;animation:fadeOutLeft .6s}.slide-in-right.ng-hide-remove{animation:fadeInRight .6s}.slide-in-right.ng-hide-add{display:block!important;animation:fadeOutRight .6s}.slide-in-up.ng-hide-remove{animation:fadeInUp .6s}.slide-in-up.ng-hide-add{display:block!important;animation:fadeOutDown .6s}.tree-node-delete-leave{position:relative;display:block;animation:leave 600ms cubic-bezier(0.445,0.05,0.55,0.95)}@keyframes leave{to{bottom:-70px;height:0;opacity:0}25%{bottom:15px}from{bottom:0;height:30px;opacity:1}}.tree-node-delete-leave *{color:#9d261d!important}.tree-node-slide-up{top:0;opacity:1;transition:700ms cubic-bezier(0,0,0.58,1) all}.tree-node-slide-up *{font-size:100%;transition:font-size 700ms}.tree-node-slide-up.tree-node-slide-up-hide-active{top:-100px;opacity:0}.tree-node-slide-up.tree-node-slide-up-hide-active *{font-size:120%}.tree-fade-out-hide,.tree-fade-out-show,.tree-fade-out-hide div:not(.tree-node-slide-up-hide-active),.tree-fade-out-show div:not(.tree-node-slide-up-hide-active){transition:700ms cubic-bezier(0.075,0.82,0.165,1) all}.tree-fade-out-show.tree-fade-out-show-active div:not(.tree-node-slide-up-hide-active){opacity:1}.tree-fade-out-hide.tree-fade-out-hide-active div:not(.tree-node-slide-up-hide-active){opacity:0}.light{font-weight:300}.normal{font-weight:500}.semi-bold{font-weight:600}.bold{font-weight:700}.btn{display:inline-block;padding:4px 12px;margin-bottom:0;font-size:14px;line-height:20px;color:#000;text-align:center;vertical-align:middle;cursor:pointer;background:#f2f2f2;border:1px solid #ccc;box-shadow:none}.btn:hover,.btn:focus{color:#343434;text-decoration:none;background:#e4e4e4;background-position:0 -15px;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;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],.btn:disabled:hover{cursor:default;border-color:#ccc;opacity:.65;filter:alpha(opacity=65);box-shadow:none}.btn-group>.btn+.dropdown-toggle{box-shadow:none}.btn-group>.btn:first-child,.btn-group>.btn:last-child,.btn-group>.dropdown-toggle{border-radius:0}.btn-large{padding:11px 19px;font-size:17.5px}.btn-large [class^="icon-"],.btn-large [class*=" icon-"]{margin-top:4px;border-radius:0}.btn-small{padding:2px 10px;font-size:11.9px;border-radius:0}.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;border-radius:0}.btn-block{display:block;width:100%;padding-right:0;padding-left:0;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-round{z-index:6666;display:inline-block;width:32px;height:32px;overflow:hidden;font-size:24px;line-height:32px;color:#555;text-align:center;background:#fff;border-radius:15px}.btn-primary.active,.btn-warning.active,.btn-danger.active,.btn-success.active,.btn-info.active,.btn-inverse.active,.btn-neutral.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:#53a93f;*background-color:#53a93f;background-image:linear-gradient(to bottom,#53a93f,#53a93f);background-repeat:repeat-x;border-color:#53a93f #53a93f #38712a;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='#ff53a93f',endColorstr='#ff53a93f',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-primary:hover,.btn-primary:focus,.btn-primary:active{background-color:#4fa23c}.btn-primary:hover,.btn-primary:focus,.btn-primary:active,.btn-primary.active,.btn-primary.disabled,.btn-primary[disabled]{color:#fff;*background-color:#4a9638}.btn-primary:active,.btn-primary.active{background-color:#418431 \9}.btn-warning{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#df7f48;*background-color:#df7f48;background-image:linear-gradient(to bottom,#df7f48,#df7f48);background-repeat:repeat-x;border-color:#df7f48 #df7f48 #ba5821;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='#ffdf7f48',endColorstr='#ffdf7f48',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-warning:hover,.btn-warning:focus,.btn-warning:active{background-color:#dd793f}.btn-warning:hover,.btn-warning:focus,.btn-warning:active,.btn-warning.active,.btn-warning.disabled,.btn-warning[disabled]{color:#fff;*background-color:#db7032}.btn-warning:active,.btn-warning.active{background-color:#d06324 \9}.btn-danger{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#ee5f5b;*background-color:#ee5f5b;background-image:linear-gradient(to bottom,#ee5f5b,#ee5f5b);background-repeat:repeat-x;border-color:#ee5f5b #ee5f5b #e51d18;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='#ffee5f5b',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-danger:hover,.btn-danger:focus,.btn-danger:active{background-color:#ed5652}.btn-danger:hover,.btn-danger:focus,.btn-danger:active,.btn-danger.active,.btn-danger.disabled,.btn-danger[disabled]{color:#fff;*background-color:#ec4844}.btn-danger:active,.btn-danger.active{background-color:#e9322d \9}.btn-success{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#53a93f;*background-color:#53a93f;background-image:linear-gradient(to bottom,#53a93f,#53a93f);background-repeat:repeat-x;border-color:#53a93f #53a93f #38712a;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='#ff53a93f',endColorstr='#ff53a93f',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-success:hover,.btn-success:focus,.btn-success:active{background-color:#4fa23c}.btn-success:hover,.btn-success:focus,.btn-success:active,.btn-success.active,.btn-success.disabled,.btn-success[disabled]{color:#fff;*background-color:#4a9638}.btn-success:active,.btn-success.active{background-color:#418431 \9}.btn-info{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#49afcd;*background-color:#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{background-color:#53bddc}.btn-info:hover,.btn-info:focus,.btn-info:active,.btn-info.active,.btn-info.disabled,.btn-info[disabled]{color:#fff;*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:#363636;*background-color:#222;background-image:linear-gradient(to bottom,#444,#222);background-repeat:repeat-x;border-color:#222 #222 #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='#ff444444',endColorstr='#ff222222',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-inverse:hover,.btn-inverse:focus,.btn-inverse:active{background-color:#3f3f3f}.btn-inverse:hover,.btn-inverse:focus,.btn-inverse:active,.btn-inverse.active,.btn-inverse.disabled,.btn-inverse[disabled]{color:#fff;*background-color:#151515}.btn-inverse:active,.btn-inverse.active{background-color:#080808 \9}.btn-neutral{color:#fff;color:#656565;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#f5f5f5;*background-color:#f5f5f5;background-image:linear-gradient(to bottom,#f5f5f5,#f5f5f5);background-repeat:repeat-x;border-color:#f5f5f5 #f5f5f5 #cfcfcf;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='#fff5f5f5',endColorstr='#fff5f5f5',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-neutral:hover,.btn-neutral:focus,.btn-neutral:active{background-color:#f0f0f0}.btn-neutral:hover,.btn-neutral:focus,.btn-neutral:active,.btn-neutral.active,.btn-neutral.disabled,.btn-neutral[disabled]{color:#fff;*background-color:#e8e8e8}.btn-neutral:active,.btn-neutral.active{background-color:#dcdcdc \9}.btn-neutral:hover,.btn-neutral:focus{color:#656565}.btn-neutral.disabled,.btn-neutral[disabled]{color:#656565;opacity:.65;filter:alpha(opacity=65)}.btn-install{display:block;padding:15px 50px;margin:40px auto;font-size:16px;color:white;background:#2e8aea;border:0}.btn-install:hover{background:#2b8ee3}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;box-shadow:none}.btn-link{color:#000;cursor:pointer;border-color:transparent;border-radius:0}.btn-link:hover,.btn-link:focus{color:#000;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover,.btn-link[disabled]:focus{color:#343434;text-decoration:none}.btn-link-reverse{text-decoration:underline}.btn-link-reverse:hover,.btn-link-reverse:focus{text-decoration:none}.btn-link.-underline{display:inline-block;text-decoration:underline}.btn-link.-underline:hover{text-decoration:none}small.umb-detail,label small,.guiDialogTiny{display:block;font-size:11px;font-weight:normal;color:#7f7f7f!important;text-decoration:none}label.control-label,.control-label{padding:0 10px 0 0!important;font-weight:bold}.umb-status-label{color:#555!important}.controls-row label{padding:0 10px 0 10px;vertical-align:middle}.breadcrumb{display:block;height:30px;margin-top:10px}.breadcrumb li{height:30px;vertical-align:middle}.breadcrumb li a{height:30px;vertical-align:middle}.breadcrumb input{font-size:11px!Important}.form-search{position:relative;padding:0}.form-search a{text-decoration:none;cursor:pointer}.form-search a:hover{color:#555}.form-search h4{color:#555}.form-search small{color:#d9d9d9}.form-search .icon,.form-search .icon-search{position:absolute;top:6px;left:4px;color:#d9d9d9}.form-search .icon-search{pointer-events:none}.form-search input{width:90%;padding:4px 0 4px 16px;padding-left:25px!Important;font-size:17.5px;font-weight:400;line-height:22px;background:#fff;border:1px solid #d9d9d9}.form-search .search-input{font-weight:bold;border-color:#d9d9d9}.form-search .search-input:hover,.form-search .search-input:focus,.form-search .search-input:focus:hover{border-color:#ccc}.form-search .search-input:-moz-placeholder{font-weight:normal}.form-search .search-input:-ms-input-placeholder{font-weight:normal}.form-search .search-input::-webkit-input-placeholder{font-weight:normal}form{margin:0 0 20px}form.-no-margin-bottom{margin-bottom:0}fieldset{padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:40px;color:#343434;border:0;border-bottom:1px solid #e5e5e5}legend small{font-size:15px;color:#d9d9d9}label,input,button,select,textarea{font-size:14px;font-weight:normal;line-height:20px}input,button,select,textarea{font-family:"Open Sans","Helvetica Neue",Helvetica,Arial,sans-serif}label{display:inline-block;margin-bottom:5px}select,textarea,input[type="text"],input[type="password"],input[type="datetime"],input[type="datetime-local"],input[type="date"],input[type="month"],input[type="time"],input[type="week"],input[type="number"],input[type="email"],input[type="url"],input[type="search"],input[type="tel"],input[type="color"],.uneditable-input{display:inline-block;height:20px;padding:4px 6px;margin-bottom:10px;font-size:14px;line-height:20px;color:#555;vertical-align:middle;border-radius:0}input.-full-width-input{width:100%;height:30px;padding:4px 6px;box-sizing:border-box}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;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:none;outline:0;outline:none \9}input[type="radio"],input[type="checkbox"]{margin:4px 0 0;margin-top:1px \9;*margin-top:0;line-height:normal}input[type="file"],input[type="image"],input[type="submit"],input[type="reset"],input[type="button"],input[type="radio"],input[type="checkbox"]{width:auto}select,input[type="file"]{height:30px;*margin-top:4px;line-height:30px}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:#d9d9d9;cursor:not-allowed;background-color:#fcfcfc;border-color:#ccc;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:#d9d9d9}input:-ms-input-placeholder,textarea:-ms-input-placeholder{color:#d9d9d9}input::-webkit-input-placeholder,textarea::-webkit-input-placeholder{color:#d9d9d9}.radio,.checkbox{min-height:20px;padding-left:20px}.radio.no-indent,.checkbox.no-indent{padding-left:0}.radio input[type="radio"],.checkbox input[type="checkbox"]{float:left;margin-right:5px;margin-left:0}.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}.bigInput,.input-large-type{font-size:20px!important}input,textarea,.uneditable-input{margin-left:0}.controls-row [class*="span"]+[class*="span"]{margin-left:0}input.span12,textarea.span12,.uneditable-input.span12{width:706px}input.span11,textarea.span11,.uneditable-input.span11{width:646px}input.span10,textarea.span10,.uneditable-input.span10{width:586px}input.span9,textarea.span9,.uneditable-input.span9{width:526px}input.span8,textarea.span8,.uneditable-input.span8{width:466px}input.span7,textarea.span7,.uneditable-input.span7{width:406px}input.span6,textarea.span6,.uneditable-input.span6{width:346px}input.span5,textarea.span5,.uneditable-input.span5{width:286px}input.span4,textarea.span4,.uneditable-input.span4{width:226px}input.span3,textarea.span3,.uneditable-input.span3{width:166px}input.span2,textarea.span2,.uneditable-input.span2{width:106px}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:#f8f8f8}input[type="radio"][disabled],input[type="checkbox"][disabled],input[type="radio"][readonly],input[type="checkbox"][readonly]{background-color:transparent}.show-validation.ng-invalid .control-group.error .control-label,.show-validation.ng-invalid .umb-panel-header-content-wrapper .control-label,.show-validation.ng-invalid .control-group.error .help-block,.show-validation.ng-invalid .umb-panel-header-content-wrapper .help-block,.show-validation.ng-invalid .control-group.error .help-inline,.show-validation.ng-invalid .umb-panel-header-content-wrapper .help-inline{color:#9d261d}.show-validation.ng-invalid .control-group.error .checkbox.ng-invalid,.show-validation.ng-invalid .umb-panel-header-content-wrapper .checkbox.ng-invalid,.show-validation.ng-invalid .control-group.error .radio.ng-invalid,.show-validation.ng-invalid .umb-panel-header-content-wrapper .radio.ng-invalid,.show-validation.ng-invalid .control-group.error input.ng-invalid,.show-validation.ng-invalid .umb-panel-header-content-wrapper input.ng-invalid,.show-validation.ng-invalid .control-group.error select.ng-invalid,.show-validation.ng-invalid .umb-panel-header-content-wrapper select.ng-invalid,.show-validation.ng-invalid .control-group.error textarea.ng-invalid,.show-validation.ng-invalid .umb-panel-header-content-wrapper textarea.ng-invalid{color:#9d261d}.show-validation.ng-invalid .control-group.error input.ng-invalid,.show-validation.ng-invalid .umb-panel-header-content-wrapper input.ng-invalid,.show-validation.ng-invalid .control-group.error select.ng-invalid,.show-validation.ng-invalid .umb-panel-header-content-wrapper select.ng-invalid,.show-validation.ng-invalid .control-group.error textarea.ng-invalid,.show-validation.ng-invalid .umb-panel-header-content-wrapper textarea.ng-invalid{border-color:#9d261d}.show-validation.ng-invalid .control-group.error .input-prepend .add-on,.show-validation.ng-invalid .umb-panel-header-content-wrapper .input-prepend .add-on,.show-validation.ng-invalid .control-group.error .input-append .add-on,.show-validation.ng-invalid .umb-panel-header-content-wrapper .input-append .add-on{color:#9d261d;background-color:#f8dcda;border-color:#9d261d}.highlight-error{color:#9d261d!important;border-color:#ee5f5b!important}.show-validation .umb-headline-editor-wrapper input:focus:invalid,.show-validation .umb-headline-editor-wrapper textarea:focus:invalid,.show-validation .umb-headline-editor-wrapper select:focus:invalid{color:inherit;border:0;border-color:inherit;box-shadow:inherit}.ng-invalid>.umb-headline-editor-wrapper h1{color:#9d261d;cursor:pointer;border-bottom:1px dashed #9d261d}.form-actions{padding:19px 20px 20px;margin-top:20px;margin-bottom:20px;background-color:#f5f5f5;border-top:1px solid #e5e5e5;*zoom:1}.form-actions:before,.form-actions:after{display:table;line-height:0;content:""}.form-actions:after{clear:both}.help-block,.help-inline{color:#5a5a5a}.help-block{display:block;margin-bottom:10px}.help-inline{display:inline-block;*display:inline;padding-left:5px;vertical-align:middle;*zoom:1}.input-append,.input-prepend{display:inline-block;margin-bottom:10px;font-size:0;white-space:nowrap;vertical-align:middle}.input-append input,.input-prepend input,.input-append select,.input-prepend select,.input-append .uneditable-input,.input-prepend .uneditable-input,.input-append .dropdown-menu,.input-prepend .dropdown-menu,.input-append .popover,.input-prepend .popover{font-size:14px}.input-append input,.input-prepend input,.input-append select,.input-prepend select,.input-append .uneditable-input,.input-prepend .uneditable-input{position:relative;margin-bottom:0;*margin-left:0;vertical-align:top}.input-append input:focus,.input-prepend input:focus,.input-append select:focus,.input-prepend select:focus,.input-append .uneditable-input:focus,.input-prepend .uneditable-input:focus{z-index:2}.input-append .add-on,.input-prepend .add-on{display:inline-block;width:auto;height:20px;min-width:16px;padding:4px 5px;font-size:14px;font-weight:normal;line-height:20px;text-align:center;text-shadow:0 1px 0 #fff;background-color:#f8f8f8;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;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-append .add-on,.input-append .btn,.input-append .btn-group{margin-left:-1px}.input-prepend.input-append input,.input-prepend.input-append select,.input-prepend.input-append .uneditable-input{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{border-radius:0}.input-prepend.input-append .add-on:first-child,.input-prepend.input-append .btn:first-child{margin-right:-1px;border-radius:0}.input-prepend.input-append .add-on:last-child,.input-prepend.input-append .btn:last-child{margin-left:-1px;border-radius:0}.input-prepend.input-append .btn-group:first-child{margin-left:0}input.search-query{padding-right:4px \9;padding-left:14px;padding-left:4px \9;margin:0;border-radius:0}.form-search .input-append .search-query,.form-search .input-prepend .search-query{border-radius:0}.form-search .input-append .search-query{border-radius:14px 0 0 14px}.form-search .input-append .btn{border-radius:0 14px 14px 0}.form-search .input-prepend .search-query{border-radius:0 14px 14px 0}.form-search .input-prepend .btn{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:top;*zoom:1}.form-search .hide,.form-inline .hide,.form-horizontal .hide{display:none}.form-search label,.form-inline label,.form-search .btn-group,.form-inline .btn-group{display:inline-block}.form-search .input-append,.form-inline .input-append,.form-search .input-prepend,.form-inline .input-prepend{margin-bottom:0}.form-search .radio,.form-search .checkbox,.form-inline .radio,.form-inline .checkbox{padding-left:0;margin-bottom:0;vertical-align:middle}.form-search .radio input[type="radio"],.form-search .checkbox input[type="checkbox"],.form-inline .radio input[type="radio"],.form-inline .checkbox input[type="checkbox"]{float:left;margin-right:3px;margin-left:0}.control-group{margin-bottom:10px}.control-group.-no-margin{margin-bottom:0}legend+.control-group{margin-top:20px;-webkit-margin-top-collapse:separate}.form-horizontal .control-group{margin-bottom:20px;*zoom:1}.form-horizontal .control-group:before,.form-horizontal .control-group:after{display:table;line-height:0;content:""}.form-horizontal .control-group:after{clear:both}.form-horizontal .control-label{float:left;width:160px;padding-top:5px;text-align:right}.form-horizontal .controls{*display:inline-block;*padding-left:20px;margin-left:180px;*margin-left:0}.form-horizontal .controls:first-child{*padding-left:180px}.form-horizontal .help-block{margin-bottom:0}.form-horizontal input+.help-block,.form-horizontal select+.help-block,.form-horizontal textarea+.help-block,.form-horizontal .uneditable-input+.help-block,.form-horizontal .input-prepend+.help-block,.form-horizontal .input-append+.help-block{margin-top:10px}.form-horizontal .form-actions{padding-left:180px}.umb-panel-buttons .umb-btn-toolbar .btn{position:relative;z-index:1000}@media(max-width:767px){.form-horizontal .control-label{width:100%}.form-horizontal .controls{margin-left:0}}.umb-modalcolumn{background:white}.umb-modalcolumn-header{height:94px;padding:5px 20px 0 20px;white-space:nowrap;background:#f8f8f8;border-bottom:1px solid #d9d9d9}.umb-modalcolumn-header h1{padding-top:10px!important;margin:0;font-size:17.5px;font-weight:400;white-space:nowrap}.umb-modalcolumn-body{position:absolute;top:100px;right:0;bottom:0;left:0;padding:0;overflow:auto;background:#fff}.no-padding .umb-modalcolumn-body{padding:0}.umb-modalcolumn .umb-modalcolumn-header .btn{position:absolute;top:13px;right:15px}.umb-modalcolumn iframe.auto-expand,.umb-modal iframe.auto-expand{position:absolute;top:0;right:0;bottom:0;left:0;padding:0;margin:0;border:0}.umb-modal .umb-loader-wrapper,.umb-modalcolumn .umb-loader-wrapper,.umb-dialog .umb-loader-wrapper{position:relative;margin:20px -20px}.umb-modal-left .umb-panel-header .umb-headline,.umb-modal-left .umb-panel-header h1{width:auto;padding-left:0}.umb-dialog{position:absolute;top:0;right:0;bottom:0;left:0;padding:0;outline:0}.umb-dialog .umb-btn-toolbar{padding:15px 20px 10px 20px;margin-top:30px;clear:both;text-align:right;background:#fff}.umb-dialog .umb-btn-toolbar .umb-control-group{padding:none;border:0}.umb-dialog-body{position:absolute;top:0;right:0;bottom:90px;left:0;overflow:auto}.umb-dialog-body .umb-pane{margin-top:15px}.umb-dialog-footer{position:absolute;right:0;bottom:0;left:0;height:60px;overflow:auto;text-align:right;border-top:#efefef 1px solid}.umbracoDialog{width:auto!Important;height:auto!Important;padding:20px}.umbracoDialog .umb-pane{margin-top:0;margin-right:0;margin-left:0}.umbracoDialog .umb-dialog-body .umb-pane{margin-top:20px;margin-right:20px;margin-left:20px}.umbracoDialog form{height:100%}.umbracoDialog .controls-row,.umb-modal .controls-row{margin-left:0!important}.modal{border-radius:0!important}.modal.fade.in{border:none!important}.umb-modal.fade{top:0!important;left:-100%!important;width:0!important;height:100%!important;outline:0;transition:opacity .3s linear,top .3s ease-out}.umb-modal.fade.in{top:0!important;left:100%!important;display:block;width:440px!important;height:100%!important;margin-left:-440px}.umb-modal-left.fade{top:0!important;left:-100%!important;width:0!important;height:100%!important;transition:opacity .3s linear,top .3s ease-out}.umb-modal-left.fade.in{top:0!important;left:0!important;display:block;width:440px!important;height:100%!important;margin-left:80px}.umb-modal .umb-panel-header{height:auto;padding:20px;background:#fff;border:0}.umb-modal .umb-panel-body{padding:0 20px 0 20px}.umb-modal.fade.in.wide{width:640px!important;margin-left:-640px}.umb-modal i{font-size:14px}.umb-modal .breadcrumb{padding:0;background:0}.umb-modal .breadcrumb input{height:12px}.umb-modal.ysod{z-index:10000}.umb-panel{position:absolute;top:0;right:0;bottom:0;left:0;background:white}.umb-panel-nobody{padding-top:100px;overflow:auto}.umb-panel-header{position:absolute;top:0;right:0;left:0;height:99px;background:#f8f8f8;border-bottom:1px solid #d9d9d9}.umb-panel-body{position:absolute;top:101px;right:0;bottom:0;left:0;overflow:auto;clear:both}.umb-panel-body.no-header{top:20px}.umb-panel-body.with-footer{bottom:90px}.umb-mediapicker-upload{display:-ms-flexbox;display:flex}.umb-mediapicker-upload .form-search{-ms-flex:1;flex:1}.umb-mediapicker-upload .upload-button{margin-left:16px}.umb-panel.editor-breadcrumb .umb-panel-body,.umb-panel.editor-breadcrumb .umb-bottom-bar{bottom:31px!important}.umb-panel-header .umb-headline,.umb-panel-header h1{width:100%;height:auto;padding:3px 5px;margin:15px 0 0 20px;font-size:16px;line-height:1.4;background:0;border:0;border:1px solid #f8f8f8}.umb-panel-header .umb-headline:focus,.umb-panel-header .umb-headline:active{background-color:#fff;border:1px solid #d9d9d9}.umb-headline-editor-wrapper{position:relative}.umb-headline-editor-wrapper .help-inline{position:absolute;top:25px;right:0;font-size:10px;color:#9d261d}.umb-panel-header p{margin:0 20px}.umb-btn-toolbar .dimmed,.umb-dimmed{opacity:.6}.umb-headline-editor-wrapper input{padding:0 0 2px 0;margin:-6px 0 0 0;line-height:normal;letter-spacing:-0.01em;color:#000;background:0;border:0;border:1px solid transparent;border-radius:0}.umb-headline-editor-wrapper input.ng-invalid{color:#9d261d}.umb-headline-editor-wrapper input.ng-invalid::-moz-placeholder,.umb-headline-editor-wrapper input.ng-invalid:-ms-input-placeholder,.umb-headline-editor-wrapper input.ng-invalid::-webkit-input-placeholder{line-height:22px;color:#9d261d}.umb-panel-header-meta{height:50px}.umb-panel-header .umb-btn-toolbar{float:right;padding:5px 20px 0 0}.umb-panel-footer{position:absolute;right:0;bottom:0;left:0;z-index:999;padding:20px;margin:0}.umb-btn-toolbar .dropdown-menu{right:0;left:auto;z-index:6020;padding:0;border-radius:0;box-shadow:none}.umb-btn-toolbar .dropdown-menu small{display:block;padding:10px 20px;background:#fef9db}.umb-btn-toolbar .dropdown-menu .btn{width:80px;margin:20px 29px}.umb-bottom-bar{position:fixed;right:40px;bottom:0;left:100px;z-index:6010;padding:10px 0 10px 0;background:white;border-top:1px solid #f8f8f8;box-shadow:0 -18px 20px #fff}@media(min-width:1101px){.umb-bottom-bar{left:460px}}@media(max-width:767px){.umb-bottom-bar{left:80px}}@media(max-width:500px){.umb-bottom-bar{left:60px}}.umb-tab-buttons{padding-left:0}.umb-tab-buttons>.btn-group:not([style*="display:none"]):not([style*="display: none"]){margin-left:0}@media(min-width:768px){.umb-tab-buttons{padding-left:180px}}.umb-tab-pane{padding-bottom:90px}.tab-content{overflow:visible}.umb-panel-footer-nav{position:absolute;right:0;bottom:0;left:0;display:block;height:30px;margin:0;overflow:hidden;background:#f8f8f8;border-top:#d9d9d9 1px solid}.umb-panel-footer-nav li a{position:relative;display:block;float:left;height:30px;padding:8px 0 8px 30px;margin:0 1px 0 0;font-size:11px;color:#555;text-align:center;text-decoration:none;background:#f8f8f8;border-radius:0}.umb-panel-footer-nav li a:after{position:absolute;top:0;right:-16px;z-index:1;border-top:16px solid transparent;border-bottom:16px solid transparent;border-left:16px solid #f8f8f8;content:""}.umb-panel-footer-nav li a:before{position:absolute;top:0;left:0;border-top:16px solid transparent;border-bottom:16px solid transparent;border-left:16px solid #d9d9d9;content:""}.umb-panel-footer-nav li:first-child a{padding-left:20px}.umb-panel-footer-nav li:first-child a:before{display:none}.umb-panel-footer-nav li:last-child a:after{display:none}.umb-dialog .muted,.umb-panel .muted{color:#7f7f7f}.umb-dialog a.muted:hover,.umb-dialog a.muted:focus,.umb-panel a.muted:hover,.umb-panel a.muted:focus{color:#666}.umb-dialog .text-warning,.umb-panel .text-warning{color:#df7f48}.umb-dialog a.text-warning:hover,.umb-dialog a.text-warning:focus,.umb-panel a.text-warning:hover,.umb-panel a.text-warning:focus{color:#d06324}.umb-dialog .text-error,.umb-panel .text-error{color:#9d261d}.umb-dialog a.text-error:hover,.umb-dialog a.text-error:focus,.umb-panel a.text-error:hover,.umb-panel a.text-error:focus{color:#721c15}.umb-dialog .text-info,.umb-panel .text-info{color:#2e8aea}.umb-dialog a.text-info:hover,.umb-dialog a.text-info:focus,.umb-panel a.text-info:hover,.umb-panel a.text-info:focus{color:#1571d0}.umb-dialog .text-success,.umb-panel .text-success{color:#46a546}.umb-dialog a.text-success:hover,.umb-dialog a.text-success:focus,.umb-panel a.text-success:hover,.umb-panel a.text-success:focus{color:#378137}.external-logins form{margin:0}.external-logins button{margin:5px}.umb-panel-header-content-wrapper{display:-ms-flexbox;display:flex;height:100px;padding:0 20px;-ms-flex-direction:column;flex-direction:column}.umb-panel-header-content{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex:1;flex:1}.umb-panel-header-left-side{display:-ms-flexbox;display:flex;-ms-flex:1;flex:1;-ms-flex-direction:row;flex-direction:row}.umb-panel-header-left-side.-top-position{position:relative;top:-12px}.umb-panel-header-icon{display:-ms-flexbox;display:flex;height:55px;margin-right:5px;cursor:pointer;background:#fff;border:1px solid #ececec;animation:fadeIn .5s;-ms-flex-pack:center;justify-content:center;-ms-flex-align:center;align-items:center;-ms-flex:0 0 55px;flex:0 0 55px}.umb-panel-header-title-wrapper{position:relative;width:80%}.umb-panel-header-alias{position:absolute;top:5px;right:10px}.umb-panel-header-alias .umb-locked-field{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center}.umb-panel-header-alias .umb-locked-field,.umb-panel-header-alias .umb-locked-field .umb-locked-field__wrapper{margin-bottom:0}.umb-panel-header-alias .umb-validation-label:after{visibility:hidden}.umb-panel-header-alias .umb-locked-field:after{display:none}.umb-panel-header-icon.-placeholder{border:1px dashed #d9d9d9}.umb-panel-header-icon .icon{font-size:35px;color:#d9d9d9}.umb-panel-header-icon-text{font-size:10px;font-weight:bold;color:#2e8aea}.umb-panel-header .umb-nav-tabs{bottom:-1px}input.umb-panel-header-name-input{width:100%;height:30px;margin-bottom:0;font-size:15px;font-weight:bold;line-height:30px;color:#000;border-color:#ececec;box-sizing:border-box}input.umb-panel-header-name-input:hover{background:#fff;border:1px solid #ccc}input.umb-panel-header-name-input.name-is-empty{background:#fff;border:1px dashed #d9d9d9}.umb-panel-header-name{font-size:16px;font-weight:bold}input.umb-panel-header-description{width:100%;height:25px;margin-bottom:0;font-size:12px;line-height:25px;background:transparent;border-color:transparent;box-sizing:border-box}input.umb-panel-header-description:hover{background:#fff;border-color:#ccc}.umb-editor-drawer-content{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center}.umb-editor-drawer-content__right-side{padding-left:10px;margin-left:auto;-ms-flex:0 0 auto;flex:0 0 auto}.umb-editor-drawer-content__left-side{padding-right:10px;margin-right:auto}ul.sections{display:block;width:80px;height:100%;margin:0;background:#1d1d1d;border-right:1px solid #343434}ul.sections li{display:block;border-left:4px #1d1d1d solid;transition:all .3s linear}ul.sections li [class^="icon-"],ul.sections li [class*=" icon-"],ul.sections li img.icon-section{display:inline-block;margin:1px 0 0 0;font-size:30px;line-height:20px;opacity:.4;transition:all .3s linear}ul.sections:hover li [class^="icon-"],ul.sections:hover li [class*=" icon-"],ul.sections:hover li img.icon-section{opacity:1}ul.sections li a{display:block;width:100%;height:100%;padding:20px 4px 4px 0;margin:0 0 0 -4px;color:#d9d9d9;text-align:center;text-decoration:none;cursor:pointer;border-bottom:1px solid #343434}ul.sections a span{display:block;font-size:10px;line-height:1.4em;opacity:0;transition:all .3s linear}ul.sections:hover a span{opacity:1}ul.sections li.avatar{height:75px;padding:22px 0 2px 0;margin:0 0 0 -4px;text-align:center;border-bottom:1px solid #343434}ul.sections li.avatar a{width:40px;height:40px;padding:0;margin:0 auto;border:0}ul.sections li.avatar a img{width:30px;border-radius:50%}.faded ul.sections li{opacity:.4}ul.sections li.current,ul.sections li:hover{border-left:4px #df7f48 solid}ul.sections li.avatar.current,ul.sections li.avatar:hover{border-left:4px #1d1d1d solid}ul.sections li.current a{padding-left:0}ul.sections li.help{position:absolute;bottom:0;left:0;display:block;width:calc(100% - 5px);margin:0}ul.sections li.help a{border-bottom:0}@media(max-width:500px){ul.sections li [class^="icon-"],ul.sections li [class*=" icon-"]{font-size:25px}ul.sections li:not(.avatar) a{padding-top:12px;padding-bottom:6px}ul.sections li:not(.avatar) a .icon,ul.sections li:not(.avatar) a .icon-section{display:inline-block;padding-left:2px}ul.sections a span{display:none}}li.expand a,li.expand{border:none!important}li.expand>a>i.icon{transition:all .3s linear}li.expand.open>a>i.icon{transform:rotate(180deg)}ul.sections-tray{width:80px;padding-top:99px}ul.sections-tray>li:first-child>a{border-top:1px solid #343434}ul.sections-tray>li{border-left-width:5px}ul.sections-tray>li.current,ul.sections-tray>li:hover{border-left-width:5px}@font-face{font-family:'icomoon';font-style:normal;font-weight:normal;src:url('../fonts/helveticons/helveticons.eot');src:url('../fonts/helveticons/helveticons.eot?#iefix') format('embedded-opentype'),url('../fonts/helveticons/helveticons.ttf') format('truetype'),url('../fonts/helveticons/helveticons.svg#icomoon') format('svg')}[class^="icon-"],[class*=" icon-"]{*margin-right:.3em;font-family:icomoon;-webkit-font-smoothing:antialiased;font-style:normal;font-weight:normal;text-decoration:inherit}[class^="icon-"]:before,[class*=" icon-"]:before{display:inline-block;text-decoration:inherit;speak:none}i.large{font-size:32px}i.medium{font-size:24px}i.small{font-size:14px}.icon-zoom-out:before{content:"\e000"}.icon-truck:before{content:"\e001"}.icon-zoom-in:before{content:"\e002"}.icon-zip:before{content:"\e003"}.icon-axis-rotation:before{content:"\e004"}.icon-yen-bag:before{content:"\e005"}.icon-axis-rotation-2:before{content:"\e006"}.icon-axis-rotation-3:before{content:"\e007"}.icon-wrench:before{content:"\e008"}.icon-wine-glass:before{content:"\e009"}.icon-wrong:before{content:"\e00a"}.icon-windows:before{content:"\e00b"}.icon-window-sizes:before{content:"\e00c"}.icon-window-popin:before{content:"\e00d"}.icon-wifi:before{content:"\e00e"}.icon-width:before{content:"\e00f"}.icon-weight:before{content:"\e010"}.icon-war:before{content:"\e011"}.icon-wand:before{content:"\e012"}.icon-wallet:before{content:"\e013"}.icon-wall-plug:before{content:"\e014"}.icon-voice:before{content:"\e016"}.icon-video:before{content:"\e017"}.icon-vcard:before{content:"\e018"}.icon-utilities:before{content:"\e019"}.icon-users:before{content:"\e01a"}.icon-users-alt:before{content:"\e01b"}.icon-user:before{content:"\e01c"}.icon-user-glasses:before{content:"\e01d"}.icon-user-females:before{content:"\e01e"}.icon-user-females-alt:before{content:"\e01f"}.icon-user-female:before{content:"\e020"}.icon-usb:before{content:"\e021"}.icon-usb-connector:before{content:"\e022"}.icon-unlocked:before{content:"\e023"}.icon-universal:before{content:"\e024"}.icon-undo:before{content:"\e025"}.icon-umbrella:before{content:"\e026"}.icon-umb-deploy:before{content:"\e027"}.icon-umb-contour:before,.traycontour:before{content:"\e028"}.icon-umb-settings:before,.traysettings:before{content:"\e029"}.icon-umb-users:before,.trayuser:before,.trayusers:before{content:"\e02a"}.icon-umb-media:before,.traymedia:before{content:"\e02b"}.icon-umb-content:before,.traycontent:before{content:"\e02c"}.icon-umb-developer:before,.traydeveloper:before{content:"\e02d"}.icon-umb-members:before,.traymember:before{content:"\e015"}.icon-umb-translation:before,.traytranslation:before{content:"\e1fd"}.icon-tv:before{content:"\e02e"}.icon-tv-old:before{content:"\e02f"}.icon-trophy:before{content:"\e030"}.icon-tree:before{content:"\e031"}.icon-trash:before{content:"\e032"}.icon-trash-alt:before{content:"\e033"}.icon-trash-alt-2:before{content:"\e034"}.icon-train:before{content:"\e035"}.icon-trafic:before{content:"\e036"}.icon-traffic-alt:before{content:"\e037"}.icon-top:before{content:"\e038"}.icon-tools:before{content:"\e039"}.icon-timer:before{content:"\e03a"}.icon-time:before{content:"\e03b"}.icon-t-shirt:before{content:"\e03c"}.icon-tab-key:before{content:"\e03d"}.icon-tab:before{content:"\e03e"}.icon-tactics:before{content:"\e03f"}.icon-tag:before{content:"\e040"}.icon-tags:before{content:"\e041"}.icon-takeaway-cup:before{content:"\e042"}.icon-target:before{content:"\e043"}.icon-temperatrure-alt:before{content:"\e044"}.icon-temperature:before{content:"\e045"}.icon-terminal:before{content:"\e046"}.icon-theater:before{content:"\e047"}.icon-theif:before{content:"\e048"}.icon-thought-bubble:before{content:"\e049"}.icon-thumb-down:before{content:"\e04a"}.icon-thumb-up:before{content:"\e04b"}.icon-thumbnail-list:before{content:"\e04c"}.icon-thumbnails-small:before{content:"\e04d"}.icon-thumbnails:before{content:"\e04e"}.icon-ticket:before{content:"\e04f"}.icon-sync:before{content:"\e050"}.icon-sweatshirt:before{content:"\e051"}.icon-sunny:before{content:"\e052"}.icon-stream:before{content:"\e053"}.icon-store:before{content:"\e054"}.icon-stop:before{content:"\e055"}.icon-stop-hand:before{content:"\e056"}.icon-stop-alt:before{content:"\e057"}.icon-stamp:before{content:"\e058"}.icon-stacked-disks:before{content:"\e059"}.icon-ssd:before{content:"\e05a"}.icon-squiggly-line:before{content:"\e05b"}.icon-sprout:before{content:"\e05c"}.icon-split:before{content:"\e05d"}.icon-split-alt:before{content:"\e05e"}.icon-speed-gauge:before{content:"\e05f"}.icon-speaker:before{content:"\e060"}.icon-sound:before{content:"\e061"}.icon-spades:before{content:"\e062"}.icon-sound-waves:before{content:"\e063"}.icon-shipping-box:before{content:"\e064"}.icon-shipping:before{content:"\e065"}.icon-shoe:before{content:"\e066"}.icon-shopping-basket-alt-2:before{content:"\e067"}.icon-shopping-basket:before{content:"\e068"}.icon-shopping-basket-alt:before{content:"\e069"}.icon-shorts:before{content:"\e06a"}.icon-shuffle:before{content:"\e06b"}.icon-sience:before{content:"\e06c"}.icon-simcard:before{content:"\e06d"}.icon-single-note:before{content:"\e06e"}.icon-sitemap:before{content:"\e06f"}.icon-sleep:before{content:"\e070"}.icon-slideshow:before{content:"\e071"}.icon-smiley-inverted:before{content:"\e072"}.icon-smiley:before{content:"\e073"}.icon-snow:before{content:"\e074"}.icon-sound-low:before{content:"\e075"}.icon-sound-medium:before{content:"\e076"}.icon-sound-off:before{content:"\e077"}.icon-shift:before{content:"\e078"}.icon-shield:before{content:"\e079"}.icon-sharing-iphone:before{content:"\e07a"}.icon-share:before{content:"\e07b"}.icon-share-alt:before{content:"\e07c"}.icon-share-alt-2:before{content:"\e07d"}.icon-settings:before{content:"\e07e"}.icon-settings-alt:before{content:"\e07f"}.icon-settings-alt-2:before{content:"\e080"}.icon-server:before{content:"\e081"}.icon-server-alt:before{content:"\e082"}.icon-sensor:before{content:"\e083"}.icon-security-camera:before{content:"\e084"}.icon-search:before{content:"\e085"}.icon-scull:before{content:"\e086"}.icon-script:before{content:"\e087"}.icon-script-alt:before{content:"\e088"}.icon-screensharing:before{content:"\e089"}.icon-school:before{content:"\e08a"}.icon-scan:before{content:"\e08b"}.icon-refresh:before{content:"\e08c"}.icon-remote:before{content:"\e08d"}.icon-remove:before{content:"\e08e"}.icon-repeat-one:before{content:"\e08f"}.icon-repeat:before{content:"\e090"}.icon-resize:before{content:"\e091"}.icon-reply-arrow:before{content:"\e092"}.icon-return-to-top:before{content:"\e093"}.icon-right-double-arrow:before{content:"\e094"}.icon-road:before{content:"\e095"}.icon-roadsign:before{content:"\e096"}.icon-rocket:before{content:"\e097"}.icon-rss:before{content:"\e098"}.icon-ruler-alt:before{content:"\e099"}.icon-ruler:before{content:"\e09a"}.icon-sandbox-toys:before{content:"\e09b"}.icon-satellite-dish:before{content:"\e09c"}.icon-save:before{content:"\e09d"}.icon-safedial:before{content:"\e09e"}.icon-safe:before{content:"\e09f"}.icon-redo:before{content:"\e0a0"}.icon-printer-alt:before{content:"\e0a1"}.icon-planet:before{content:"\e0a2"}.icon-paste-in:before{content:"\e0a3"}.icon-os-x:before{content:"\e0a4"}.icon-navigation-left:before{content:"\e0a5"}.icon-message:before{content:"\e0a6"}.icon-lock:before{content:"\e0a7"}.icon-layers-alt:before{content:"\e0a8"}.icon-record:before{content:"\e0a9"}.icon-print:before{content:"\e0aa"}.icon-plane:before{content:"\e0ab"}.icon-partly-cloudy:before{content:"\e0ac"}.icon-ordered-list:before{content:"\e0ad"}.icon-navigation-last:before{content:"\e0ae"}.icon-message-unopened:before{content:"\e0af"}.icon-location-nearby:before{content:"\e0b0"}.icon-laptop:before{content:"\e0b1"}.icon-reception:before{content:"\e0b2"}.icon-price-yen:before{content:"\e0b3"}.icon-piracy:before{content:"\e0b4"}.icon-parental-control:before{content:"\e0b5"}.icon-operator:before{content:"\e0b6"}.icon-navigation-horizontal:before{content:"\e0b7"}.icon-message-open:before{content:"\e0b8"}.icon-lab:before{content:"\e0b9"}.icon-location-near-me:before{content:"\e0ba"}.icon-receipt-yen:before{content:"\e0bb"}.icon-price-pound:before{content:"\e0bc"}.icon-pin-location:before{content:"\e0bd"}.icon-parachute-drop:before{content:"\e0be"}.icon-old-phone:before{content:"\e0bf"}.icon-merge:before{content:"\e0c0"}.icon-navigation-first:before{content:"\e0c1"}.icon-locate:before{content:"\e0c2"}.icon-keyhole:before{content:"\e0c3"}.icon-receipt-pound:before{content:"\e0c4"}.icon-price-euro:before{content:"\e0c5"}.icon-piggy-bank:before{content:"\e0c6"}.icon-paper-plane:before{content:"\e0c7"}.icon-old-key:before{content:"\e0c8"}.icon-navigation-down:before{content:"\e0c9"}.icon-megaphone:before{content:"\e0ca"}.icon-loading:before{content:"\e0cb"}.icon-keychain:before{content:"\e0cc"}.icon-receipt-euro:before{content:"\e0cd"}.icon-price-dollar:before{content:"\e0ce"}.icon-pie-chart:before{content:"\e0cf"}.icon-paper-plane-alt:before{content:"\e0d0"}.icon-notepad:before{content:"\e0d1"}.icon-navigation-bottom:before{content:"\e0d2"}.icon-meeting:before{content:"\e0d3"}.icon-keyboard:before{content:"\e0d4"}.icon-load:before{content:"\e0d5"}.icon-receipt-dollar:before{content:"\e0d6"}.icon-previous:before{content:"\e0d7"}.icon-pictures:before{content:"\e0d8"}.icon-notepad-alt:before{content:"\e0d9"}.icon-paper-bag:before{content:"\e0da"}.icon-name-badge:before{content:"\e0db"}.icon-medicine:before{content:"\e0dc"}.icon-list:before{content:"\e0dd"}.icon-key:before{content:"\e0de"}.icon-receipt-alt:before{content:"\e0df"}.icon-previous-media:before{content:"\e0e0"}.icon-pictures-alt:before{content:"\e0e1"}.icon-pants:before{content:"\e0e2"}.icon-nodes:before{content:"\e0e3"}.icon-music:before{content:"\e0e4"}.icon-readonly:before{content:"\e0e5"}.icon-presentation:before{content:"\e0e6"}.icon-pictures-alt-2:before{content:"\e0e7"}.icon-pannel-close:before{content:"\e0e8"}.icon-next:before{content:"\e0e9"}.icon-multiple-windows:before{content:"\e0ea"}.icon-medical-emergency:before{content:"\e0eb"}.icon-medal:before{content:"\e0ec"}.icon-link:before{content:"\e0ed"}.icon-linux-tux:before{content:"\e0ee"}.icon-junk:before{content:"\e0ef"}.icon-item-arrangement:before{content:"\e0f0"}.icon-iphone:before{content:"\e0f1"}.icon-lightning:before{content:"\e0f2"}.icon-map:before{content:"\e0f3"}.icon-multiple-credit-cards:before{content:"\e0f4"}.icon-next-media:before{content:"\e0f5"}.icon-panel-show:before{content:"\e0f6"}.icon-picture:before{content:"\e0f7"}.icon-power:before{content:"\e0f8"}.icon-re-post:before{content:"\e0f9"}.icon-rate:before{content:"\e0fa"}.icon-rain:before{content:"\e0fb"}.icon-radio:before{content:"\e0fc"}.icon-radio-receiver:before{content:"\e0fd"}.icon-radio-alt:before{content:"\e0fe"}.icon-quote:before{content:"\e0ff"}.icon-qr-code:before{content:"\e100"}.icon-pushpin:before{content:"\e101"}.icon-pulse:before{content:"\e102"}.icon-projector:before{content:"\e103"}.icon-play:before{content:"\e104"}.icon-playing-cards:before{content:"\e105"}.icon-playlist:before{content:"\e106"}.icon-plugin:before{content:"\e107"}.icon-podcast:before{content:"\e108"}.icon-poker-chip:before{content:"\e109"}.icon-poll:before{content:"\e10a"}.icon-post-it:before{content:"\e10b"}.icon-pound-bag:before{content:"\e10c"}.icon-power-outlet:before{content:"\e10d"}.icon-photo-album:before{content:"\e10e"}.icon-phone:before{content:"\e10f"}.icon-phone-ring:before{content:"\e110"}.icon-people:before{content:"\e111"}.icon-people-female:before{content:"\e112"}.icon-people-alt:before{content:"\e113"}.icon-people-alt-2:before{content:"\e114"}.icon-pc:before{content:"\e115"}.icon-pause:before{content:"\e116"}.icon-path:before{content:"\e117"}.icon-out:before{content:"\e118"}.icon-outbox:before{content:"\e119"}.icon-outdent:before{content:"\e11a"}.icon-page-add:before{content:"\e11b"}.icon-page-down:before{content:"\e11c"}.icon-page-remove:before{content:"\e11d"}.icon-page-restricted:before{content:"\e11e"}.icon-page-up:before{content:"\e11f"}.icon-paint-roller:before{content:"\e120"}.icon-palette:before{content:"\e121"}.icon-newspaper:before{content:"\e122"}.icon-newspaper-alt:before{content:"\e123"}.icon-network-alt:before{content:"\e124"}.icon-navigational-arrow:before{content:"\e125"}.icon-navigation:before{content:"\e126"}.icon-navigation-vertical:before{content:"\e127"}.icon-navigation-up:before{content:"\e128"}.icon-navigation-top:before{content:"\e129"}.icon-navigation-road:before{content:"\e12a"}.icon-navigation-right:before{content:"\e12b"}.icon-microscope:before{content:"\e12c"}.icon-mindmap:before{content:"\e12d"}.icon-molecular-network:before{content:"\e12e"}.icon-molecular:before{content:"\e12f"}.icon-mountain:before{content:"\e130"}.icon-mouse-cursor:before{content:"\e131"}.icon-mouse:before{content:"\e132"}.icon-movie-alt:before{content:"\e133"}.icon-map-marker:before{content:"\e134"}.icon-movie:before{content:"\e135"}.icon-map-location:before{content:"\e136"}.icon-map-alt:before{content:"\e137"}.icon-male-symbol:before{content:"\e138"}.icon-male-and-female:before{content:"\e139"}.icon-mailbox:before{content:"\e13a"}.icon-magnet:before{content:"\e13b"}.icon-loupe:before{content:"\e13c"}.icon-mobile:before{content:"\e13d"}.icon-logout:before{content:"\e13e"}.icon-log-out:before{content:"\e13f"}.icon-layers:before{content:"\e140"}.icon-left-double-arrow:before{content:"\e141"}.icon-layout:before{content:"\e142"}.icon-legal:before{content:"\e143"}.icon-lense:before{content:"\e144"}.icon-library:before{content:"\e145"}.icon-light-down:before{content:"\e146"}.icon-light-up:before{content:"\e147"}.icon-lightbulb-active:before{content:"\e148"}.icon-lightbulb:before{content:"\e149"}.icon-ipad:before{content:"\e14a"}.icon-invoice:before{content:"\e14b"}.icon-info:before{content:"\e14c"}.icon-infinity:before{content:"\e14d"}.icon-indent:before{content:"\e14e"}.icon-inbox:before{content:"\e14f"}.icon-inbox-full:before{content:"\e150"}.icon-inactive-line:before{content:"\e151"}.icon-imac:before{content:"\e152"}.icon-hourglass:before{content:"\e153"}.icon-home:before{content:"\e154"}.icon-grid:before{content:"\e155"}.icon-food:before{content:"\e156"}.icon-favorite:before{content:"\e157"}.icon-door-open-alt:before{content:"\e158"}.icon-diagnostics:before{content:"\e159"}.icon-contrast:before{content:"\e15a"}.icon-coins-dollar-alt:before{content:"\e15b"}.icon-circle-dotted-active:before{content:"\e15c"}.icon-cinema:before{content:"\e15d"}.icon-chip:before{content:"\e15e"}.icon-chip-alt:before{content:"\e15f"}.icon-chess:before{content:"\e160"}.icon-checkbox:before{content:"\e161"}.icon-checkbox-empty:before{content:"\e162"}.icon-checkbox-dotted:before{content:"\e163"}.icon-checkbox-dotted-active:before{content:"\e164"}.icon-check:before{content:"\e165"}.icon-chat:before{content:"\e166"}.icon-chat-active:before{content:"\e167"}.icon-chart:before{content:"\e168"}.icon-chart-curve:before{content:"\e169"}.icon-certificate:before{content:"\e16a"}.icon-categories:before{content:"\e16b"}.icon-cash-register:before{content:"\e16c"}.icon-car:before{content:"\e16d"}.icon-caps-lock:before{content:"\e16e"}.icon-candy:before{content:"\e16f"}.icon-circle-dotted:before{content:"\e170"}.icon-circuits:before{content:"\e171"}.icon-circus:before{content:"\e172"}.icon-client:before{content:"\e173"}.icon-clothes-hanger:before{content:"\e174"}.icon-cloud-drive:before{content:"\e175"}.icon-cloud-upload:before{content:"\e176"}.icon-cloud:before{content:"\e177"}.icon-cloudy:before{content:"\e178"}.icon-clubs:before{content:"\e179"}.icon-cocktail:before{content:"\e17a"}.icon-code:before{content:"\e17b"}.icon-coffee:before{content:"\e17c"}.icon-coin-dollar:before{content:"\e17d"}.icon-coin-pound:before{content:"\e17e"}.icon-coin-yen:before{content:"\e17f"}.icon-coin:before{content:"\e180"}.icon-coins-alt:before{content:"\e181"}.icon-console:before{content:"\e182"}.icon-connection:before{content:"\e183"}.icon-compress:before{content:"\e184"}.icon-company:before{content:"\e185"}.icon-command:before{content:"\e186"}.icon-coin-euro:before{content:"\e187"}.icon-combination-lock:before{content:"\e188"}.icon-combination-lock-open:before{content:"\e189"}.icon-comb:before{content:"\e18a"}.icon-columns:before{content:"\e18b"}.icon-colorpicker:before{content:"\e18c"}.icon-color-bucket:before{content:"\e18d"}.icon-coins:before{content:"\e18e"}.icon-coins-yen:before{content:"\e18f"}.icon-coins-yen-alt:before{content:"\e190"}.icon-coins-pound:before{content:"\e191"}.icon-coins-pound-alt:before{content:"\e192"}.icon-coins-euro:before{content:"\e193"}.icon-coins-euro-alt:before{content:"\e194"}.icon-coins-dollar:before{content:"\e195"}.icon-conversation-alt:before{content:"\e196"}.icon-conversation:before{content:"\e197"}.icon-coverflow:before{content:"\e198"}.icon-credit-card-alt:before{content:"\e199"}.icon-credit-card:before{content:"\e19a"}.icon-crop:before{content:"\e19b"}.icon-crosshair:before{content:"\e19c"}.icon-crown-alt:before{content:"\e19d"}.icon-crown:before{content:"\e19e"}.icon-cupcake:before{content:"\e19f"}.icon-curve:before{content:"\e1a0"}.icon-cut:before{content:"\e1a1"}.icon-dashboard:before{content:"\e1a2"}.icon-defrag:before{content:"\e1a3"}.icon-delete:before{content:"\e1a4"}.icon-delete-key:before{content:"\e1a5"}.icon-departure:before{content:"\e1a6"}.icon-desk:before{content:"\e1a7"}.icon-desktop:before{content:"\e1a8"}.icon-donate:before{content:"\e1a9"}.icon-dollar-bag:before{content:"\e1aa"}.icon-documents:before{content:"\e1ab"}.icon-document:before{content:"\e1ac"}.icon-document-dashed-line:before{content:"\e1ad"}.icon-dock-connector:before{content:"\e1ae"}.icon-dna:before{content:"\e1af"}.icon-display:before{content:"\e1b0"}.icon-disk-image:before{content:"\e1b1"}.icon-disc:before{content:"\e1b2"}.icon-directions:before{content:"\e1b3"}.icon-directions-alt:before{content:"\e1b4"}.icon-diploma:before{content:"\e1b5"}.icon-diploma-alt:before{content:"\e1b6"}.icon-dice:before{content:"\e1b7"}.icon-diamonds:before{content:"\e1b8"}.icon-diamond:before{content:"\e1b9"}.icon-diagonal-arrow:before{content:"\e1ba"}.icon-diagonal-arrow-alt:before{content:"\e1bb"}.icon-door-open:before{content:"\e1bc"}.icon-download-alt:before{content:"\e1bd"}.icon-download:before{content:"\e1be"}.icon-drop:before{content:"\e1bf"}.icon-eco:before{content:"\e1c0"}.icon-economy:before{content:"\e1c1"}.icon-edit:before{content:"\e1c2"}.icon-eject:before{content:"\e1c3"}.icon-employee:before{content:"\e1c4"}.icon-energy-saving-bulb:before{content:"\e1c5"}.icon-enter:before{content:"\e1c6"}.icon-equalizer:before{content:"\e1c7"}.icon-escape:before{content:"\e1c8"}.icon-ethernet:before{content:"\e1c9"}.icon-euro-bag:before{content:"\e1ca"}.icon-exit-fullscreen:before{content:"\e1cb"}.icon-eye:before{content:"\e1cc"}.icon-facebook-like:before{content:"\e1cd"}.icon-factory:before{content:"\e1ce"}.icon-font:before{content:"\e1cf"}.icon-folders:before{content:"\e1d0"}.icon-folder:before,.icon-folder-close:before{content:"\e1d1"}.icon-folder-outline:before{content:"\e1d2"}.icon-folder-open:before{content:"\e1d3"}.icon-flowerpot:before{content:"\e1d4"}.icon-flashlight:before{content:"\e1d5"}.icon-flash:before{content:"\e1d6"}.icon-flag:before{content:"\e1d7"}.icon-flag-alt:before{content:"\e1d8"}.icon-firewire:before{content:"\e1d9"}.icon-firewall:before{content:"\e1da"}.icon-fire:before{content:"\e1db"}.icon-fingerprint:before{content:"\e1dc"}.icon-filter:before{content:"\e1dd"}.icon-filter-arrows:before{content:"\e1de"}.icon-files:before{content:"\e1df"}.icon-file-cabinet:before{content:"\e1e0"}.icon-female-symbol:before{content:"\e1e1"}.icon-footprints:before{content:"\e1e2"}.icon-hammer:before{content:"\e1e3"}.icon-hand-active-alt:before{content:"\e1e4"}.icon-forking:before{content:"\e1e5"}.icon-hand-active:before{content:"\e1e6"}.icon-hand-pointer-alt:before{content:"\e1e7"}.icon-hand-pointer:before{content:"\e1e8"}.icon-handprint:before{content:"\e1e9"}.icon-handshake:before{content:"\e1ea"}.icon-handtool:before{content:"\e1eb"}.icon-hard-drive:before{content:"\e1ec"}.icon-help:before{content:"\e1ed"}.icon-graduate:before{content:"\e1ee"}.icon-gps:before{content:"\e1ef"}.icon-help-alt:before{content:"\e1f0"}.icon-height:before{content:"\e1f1"}.icon-globe:before{content:"\e1f2"}.icon-hearts:before{content:"\e1f3"}.icon-globe-inverted-europe-africa:before{content:"\e1f4"}.icon-headset:before{content:"\e1f5"}.icon-globe-inverted-asia:before{content:"\e1f6"}.icon-headphones:before{content:"\e1f7"}.icon-globe-inverted-america:before{content:"\e1f8"}.icon-hd:before{content:"\e1f9"}.icon-globe-europe---africa:before{content:"\e1fa"}.icon-hat:before{content:"\e1fb"}.icon-globe-asia:before{content:"\e1fc"}.icon-globe-alt:before{content:"\e1fd"}.icon-hard-drive-alt:before{content:"\e1fe"}.icon-glasses:before{content:"\e1ff"}.icon-gift:before{content:"\e200"}.icon-handtool-alt:before{content:"\e201"}.icon-geometry:before{content:"\e202"}.icon-game:before{content:"\e203"}.icon-fullscreen:before{content:"\e204"}.icon-fullscreen-alt:before{content:"\e205"}.icon-frame:before{content:"\e206"}.icon-frame-alt:before{content:"\e207"}.icon-camera-roll:before{content:"\e208"}.icon-bookmark:before{content:"\e209"}.icon-bill:before{content:"\e20a"}.icon-baby-stroller:before{content:"\e20b"}.icon-alarm-clock:before{content:"\e20c"}.icon-adressbook:before{content:"\e20d"}.icon-add:before{content:"\e20e"}.icon-activity:before{content:"\e20f"}.icon-untitled:before{content:"\e210"}.icon-glasses:before{content:"\e211"}.icon-camcorder:before{content:"\e212"}.icon-calendar:before{content:"\e213"}.icon-calendar-alt:before{content:"\e214"}.icon-calculator:before{content:"\e215"}.icon-bus:before{content:"\e216"}.icon-burn:before{content:"\e217"}.icon-bulleted-list:before{content:"\e218"}.icon-bug:before{content:"\e219"}.icon-brush:before{content:"\e21a"}.icon-brush-alt:before{content:"\e21b"}.icon-brush-alt-2:before{content:"\e21c"}.icon-browser-window:before{content:"\e21d"}.icon-briefcase:before{content:"\e21e"}.icon-brick:before{content:"\e21f"}.icon-brackets:before{content:"\e220"}.icon-box:before{content:"\e221"}.icon-box-open:before{content:"\e222"}.icon-box-alt:before{content:"\e223"}.icon-books:before{content:"\e224"}.icon-billboard:before{content:"\e225"}.icon-bills-dollar:before{content:"\e226"}.icon-bills-euro:before{content:"\e227"}.icon-bills-pound:before{content:"\e228"}.icon-bills-yen:before{content:"\e229"}.icon-bills:before{content:"\e22a"}.icon-binarycode:before{content:"\e22b"}.icon-binoculars:before{content:"\e22c"}.icon-bird:before{content:"\e22d"}.icon-birthday-cake:before{content:"\e22e"}.icon-blueprint:before{content:"\e22f"}.icon-block:before{content:"\e230"}.icon-bluetooth:before{content:"\e231"}.icon-boat-shipping:before{content:"\e232"}.icon-bomb:before{content:"\e233"}.icon-book-alt-2:before{content:"\e234"}.icon-bones:before{content:"\e235"}.icon-book-alt:before{content:"\e236"}.icon-book:before{content:"\e237"}.icon-bill-yen:before{content:"\e238"}.icon-award:before{content:"\e239"}.icon-bill-pound:before{content:"\e23a"}.icon-autofill:before{content:"\e23b"}.icon-bill-euro:before{content:"\e23c"}.icon-auction-hammer:before{content:"\e23d"}.icon-bill-dollar:before{content:"\e23e"}.icon-attachment:before{content:"\e23f"}.icon-bell:before{content:"\e240"}.icon-article:before{content:"\e241"}.icon-bell-off:before{content:"\e242"}.icon-art-easel:before{content:"\e243"}.icon-beer-glass:before{content:"\e244"}.icon-arrow-up:before{content:"\e245"}.icon-battery-low:before{content:"\e246"}.icon-arrow-right:before{content:"\e247"}.icon-battery-full:before{content:"\e248"}.icon-arrow-left:before{content:"\e249"}.icon-bars:before{content:"\e24a"}.icon-arrow-down:before{content:"\e24b"}.icon-barcode:before{content:"\e24c"}.icon-arrivals:before{content:"\e24d"}.icon-bar-chart:before{content:"\e24e"}.icon-application-window:before{content:"\e24f"}.icon-band-aid:before{content:"\e250"}.icon-application-window-alt:before{content:"\e251"}.icon-ball:before{content:"\e252"}.icon-application-error:before{content:"\e253"}.icon-badge-restricted:before{content:"\e254"}.icon-app:before{content:"\e255"}.icon-badge-remove:before{content:"\e256"}.icon-anchor:before{content:"\e257"}.icon-badge-count:before{content:"\e258"}.icon-alt:before{content:"\e259"}.icon-badge-add:before{content:"\e25a"}.icon-alert:before{content:"\e25b"}.icon-backspace:before{content:"\e25c"}.icon-alert-alt:before{content:"\e25d"}.fill{height:100%;min-height:100%}.shadow{box-shadow:3px 0 7px #dbdbdb}.umb-scrollable,.umb-auto-overflow{overflow:auto}.umb-abstract{display:block;margin-top:0;margin-bottom:15px;font-size:14px;color:#b3b3b3}h5{margin-top:15px;font-size:13px;font-weight:bold;color:#b3b3b3;text-transform:uppercase}h5.-border-bottom{padding-bottom:5px;border-bottom:1px solid #ececec}h5.-black{color:#000}.umb-form-actions{background:0;border:0}.datepicker td.active,.datepicker td span.active{background:#f3762c!important}.umb-datetime-picker div.info{vertical-align:middle}.umb-userwidget img{float:left;margin-right:15px}.umb-userwidget small{display:block}.popover-title{display:none}.thumbnails>li.umb-plus-btn{margin:0 10px 10px 0}.umb-plus-btn a{display:block;width:136px;height:136px;font-size:50px;line-height:136px;color:#d9d9d9;text-align:center;text-decoration:none;border:2px dashed #d9d9d9;transition:all .3s ease-in-out}.umb-plus-btn a:hover{color:#000;border:2px dashed #000}.umb-plus-btn i{margin:auto;vertical-align:middle}.umb-pane{margin:30px 20px}.umb-control-group{padding-bottom:20px;margin-bottom:15px!important;border-bottom:1px solid #f8f8f8}.umb-control-group.-no-border{border:0}.compact .umb-pane{margin:0 0 15px 0}.compact .umb-control-group{padding-bottom:10px;margin-bottom:5px!important;border-bottom:1px solid #f8f8f8}.compact label.control-label{padding-top:0!important;margin-bottom:0}.compact .controls-row{padding-top:0}.umb-pane>.umb-control-group:last-child{padding-bottom:0!important;border:0}.umb-control-group .umb-el-wrap{padding:0}.umb-control-group label.control-label,.umb-control-group .control-label{text-align:left}.umb-control-group label.control-label>div>label{padding-left:0}.umb-control-group label .help-block,.umb-control-group label small{padding-top:5px;font-size:11px;line-height:13px;color:#a0a0a0}.umb-nolabel .controls{margin-left:0}.controls-row{padding-top:5px;margin-left:240px}.umb-user-panel .controls-row{margin-left:0}.controls-row label{display:inline-block}.controls-row>div>label{padding-left:0}.block-form .controls-row{padding-top:0;margin-left:0}.hidelabel>div>.controls-row,.hidelabel>.controls-row,.hidelabel>div>.controls{padding:0;margin:0!important;border:0}.controls-row>.vertical-align-items{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center}.controls-row>.vertical-align-items>input.umb-editor-tiny{margin-right:5px;margin-left:5px}.controls-row>.vertical-align-items>input.umb-editor-tiny:first-child{margin-left:0}.thumbnails .selected{background:#000;border-color:#000}.umb-version{position:absolute;right:20px;bottom:5px;color:#bbb}.dashboardHideLink{display:none}.dashboardWrapper{position:relative}.dashboardWrapper h2{padding:0 0 0 45px}.dashboardWrapper h3{font-size:14px;font-weight:bold}.dashboardIcon{position:absolute;top:2px;left:2px}.umb-dashboard-control iframe{position:absolute;display:block;width:99%;height:99%;overflow:auto!important}.umb-table{word-wrap:break-word;table-layout:fixed}.umb-no-border{border:none!important}table thead a{color:#333}.umb-table tbody.ui-sortable tr{cursor:pointer}.umb-table tbody.ui-sortable tr.ui-sortable-helper{background-color:rgba(4,156,219,0.5);border:0}.umb-table tbody.ui-sortable tr.ui-sortable-helper td{border:0}.umb-table tbody.ui-sortable tr.ui-sortable-placeholder{background-color:#2e8aea;border:0}.umb-table tbody.ui-sortable tr.ui-sortable-placeholder td{height:5px;padding:0;line-height:0}.thumbnails>li.umb-thumbnail{position:relative;margin:0 10px 10px 0}.thumbnails>li.umb-thumbnail .umb-icons{position:absolute;top:0;left:0;z-index:1000;width:100%;padding:17px 0;background:#222}.thumbnails>li.umb-thumbnail .icon-crop{position:absolute;top:10px;left:10px;font-size:14px;color:#fff}.thumbnails>li.umb-thumbnail .icon-remove{position:absolute;top:10px;right:10px;font-size:14px;color:#fff}.umb-image-crop{float:left;width:400px;padding:0 0 30px 0;margin:0 30px 25px 0}.umb-image-mask{position:relative;width:399px;height:300px;margin:0 30px 0 0}.umb-image-mask:after{position:absolute;top:0;left:0;z-index:5999;width:100%;height:100%;content:"";opacity:.6;filter:alpha(opacity=6);box-shadow:inset 0 0 0 40px #fff,inset 0 0 0 41px rgba(0,0,0,0.2),inset 0 0 20px 41px rgba(0,0,0,0.2)}.umb-image-mask .icon-screenshot{position:absolute;top:125px;left:110px;z-index:1000;font-size:30px;color:#fff}.umb-image-mask .icon-circle{position:absolute;top:130px;left:115px;z-index:1;font-size:20px;color:#4285f4}.umb-crop-preview{float:left;width:400px}.umb-image-controls{width:400px}.umb-image-controls .icon-minus{float:left;padding:14px 10px 0 10px;color:#ccc}.umb-image-controls .icon-plus{float:right;padding:14px 10px 0 10px;color:#ccc;text-align:left}.umb-image-crop .range{display:block;float:left;width:82%;height:1px;margin:20px 0 0 0;background:#ccc;-webkit-appearance:none}.umb-image-crop .range::-webkit-slider-thumb{width:14px;height:14px;margin-top:-1px;background:#f2f2f2;border:1px solid #ccc;border-radius:2px;content:"1";-webkit-appearance:none}.umb-search-group li>div{padding-left:20px}.umb-search-group li>div a>i{height:100%}#search-form .form-search div{margin-top:3px}#search-form .form-search div .btn{position:relative;top:0;left:0}#dictionaryItems tr{border-top:solid 1px #d9d9d9}#dictionaryItems thead tr{font-weight:bold;border-top:0}#dictionaryItems th{font-weight:normal;text-align:left}#dictionaryItems td{text-align:center}#dictionaryItems thead td:first-of-type{text-align:left}#dictioanryItems i{font-size:18px}#dictionaryItems .icon-alert{color:#9d261d}#dictionaryItems .icon-check{color:#46a546}.umb-loader{width:100%;height:1px;margin-top:0;margin-left:-100%;background-color:#2e8aea;animation-duration:1s;animation-iteration-count:infinite;animation-name:bounce_loadingProgressG;animation-timing-function:linear;-o-animationtiming-function:linear}@keyframes bounce_loadingProgressG{0%{margin-left:-100%}100%{margin-left:100%}}.umb-loader-wrapper{position:absolute;right:0;left:0;margin:10px 0;overflow:hidden}.umb-loader-wrapper.-bottom{bottom:0}.strong{font-weight:bold}.inline{display:inline}.input-label--title{margin-bottom:3px;font-weight:bold;color:#000}.input-label--small{display:inline;font-size:12px;font-weight:bold;color:rgba(0,0,0,0.7)}.input-label--small:hover{color:#000}input[type=checkbox]:checked+.input-label--small{color:#2e8aea}.panel-dialog--header{padding-bottom:10px;margin:10px 0;font-size:17.5px;font-weight:bold;line-height:20px;border-bottom:1px solid #555}.bootstrap-datetimepicker-widget,.bootstrap-datetimepicker-widget td,.bootstrap-datetimepicker-widget th,.bootstrap-datetimepicker-widget td span{border-radius:0!important}.umb-item-list{display:block;width:auto;margin:0}.umb-item-list li{display:block;width:auto}.umb-tree{width:auto;min-width:100%;margin:0}.umb-tree li{display:block;width:auto;min-width:100%}.umb-tree li.current>div,.umb-tree div.selected{background:#2e8aea}.umb-tree li.current>div a.umb-options i,.umb-tree div.selected i{background:#fff;border-color:#2e8aea;transition:opacity 120ms ease}.umb-tree li.current>div a.umb-options:hover i,.umb-tree div.selected i{opacity:.7}.umb-tree li.current>div a,.umb-tree li.current>div i.icon,.umb-tree li.current>div ins{color:white!important;background:#2e8aea;border-color:#2e8aea}.umb-tree li.root>div{padding:0}.umb-tree li.root>div h5{display:-ms-flexbox;display:flex;width:100%;margin:0;-ms-flex-align:center;align-items:center}.umb-tree li.root>div h5>a,.umb-tree-header{display:-ms-flexbox;display:flex;padding:20px 0 20px 20px;box-sizing:border-box}.umb-tree *{white-space:nowrap}.umb-tree ul{width:100%;min-width:100%;padding:0;margin:0}.umb-tree ul.collapsed{display:none}.umb-tree a{text-decoration:none;cursor:pointer;outline:0}.umb-tree a:hover{text-decoration:none}.umb-tree div{position:relative;display:-ms-flexbox;display:flex;padding:5px 0 5px 0;overflow:hidden;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-ms-flex-align:center;align-items:center}.umb-tree a.noSpr{background-position:0 0}.umb-tree div>a.umb-options{visibility:hidden}.umb-tree div:hover>a.umb-options{visibility:visible}.umb-tree li.root>div a,.umb-tree li.root h5,.umb-tree-header{font-size:13px;font-weight:bold;color:#b3b3b3;text-transform:uppercase}.umb-tree ins{width:16px;height:16px;margin:-4px 0 0 -16px;font-size:12px;text-decoration:none;visibility:hidden;transition:opacity 120ms ease}.umb-tree ins:hover{opacity:.7}.umb-tree li:hover ins{cursor:pointer;visibility:visible}.umb-tree li div{padding:0}.umb-tree li>div a:not(.umb-options){display:-ms-flexbox;display:flex;width:100%;padding:6px 0}.umb-tree li>div:hover a:not(.umb-options){margin-right:6px;overflow:hidden}.umb-tree .icon{margin:0 13px 0 0;font-size:20px;color:#21201c;vertical-align:middle}.umb-tree-icon{cursor:pointer}.umb-tree i.noSpr{display:inline-block;width:16px;height:16px;margin-top:1px;line-height:16px}.umb-tree div:hover{background:#f8f8f8}.umb-tree small.search-subtitle{display:block;padding-left:35px;color:#d9d9d9}.umb-tree .umb-tree-node-search{cursor:pointer}.umb-tree .umb-search-group-item{padding-left:20px}.umb-tree .umb-search-group-item-link{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-direction:column;flex-direction:column}.icon-check:before{content:"\e165"}.umb-tree .umb-tree-node-checked i[class^="icon-"],.umb-tree .umb-tree-node-checked i[class*=" icon-"]{font-family:'icomoon'!important;color:#2e8aea!important}.umb-tree .umb-tree-node-checked i:before{content:"\e165"!important}a.umb-options{display:-ms-flexbox;display:flex;padding:9px 5px;margin-right:10px;text-align:center;cursor:pointer;visibility:hidden;-ms-flex-pack:end;justify-content:flex-end}a.umb-options i{display:inline-block;width:5px!important;height:5px!important;margin:0 2px 0 0;background:#000;border-radius:20px}a.umb-options i:last-child{margin:0}a.umb-options:hover{background:#e4e4e4;border-radius:0}li.root>div>a.umb-options{top:18px;display:-ms-flexbox;display:flex;padding:10px 5px}.hide-options a.umb-options{display:none!important}.hide-header h5{display:none!important}.umb-icon-item{position:relative;display:block;padding:2px;padding-left:55px}.umb-icon-item:hover{background:#f8f8f8}.umb-icon-item i.icon{position:absolute;top:8px;left:19px}.umb-icon-item a:hover div{text-decoration:underline}.umb-icon-item a{height:15px;padding-top:3px;font-size:12px;color:#525252;text-decoration:none}.umb-icon-item small{display:block;font-size:10px;color:#999}.umb-icon-item:hover a.umb-options{visibility:visible}.umb-icon-item .umb-spr{float:left}div.not-published>i.icon,div.not-published>a{opacity:.6}div.protected:before{position:absolute;bottom:0;padding-top:7px;padding-left:7px;font-family:'icomoon';font-size:20px;color:#9d261d;content:"\e256"}div.has-unpublished-version:before{position:absolute;bottom:0;padding-top:7px;padding-left:7px;font-family:'icomoon';font-size:20px;color:#46a546;content:"\e25a"}div.not-allowed>i.icon,div.not-allowed>a{cursor:not-allowed}.umb-tree li.current>div:before{color:#add8e6}div.is-container:before{position:absolute;bottom:0;padding-top:8px;padding-left:13px;font-family:'icomoon';font-size:8px;color:#04bfbf;pointer-events:none;content:"\e04e"}div.locked:before{position:absolute;bottom:0;padding-top:7px;padding-left:7px;font-family:'icomoon';font-size:20px;color:#9d261d;content:"\e0a7"}.umb-actions{padding:0;margin:12px 0 0 0;list-style:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.umb-actions li.sep{display:block;border-top:1px solid #efefef}.umb-actions li.sep:first-child{border-top:0}.umb-actions a{display:block;padding:8px 25px 8px 20px;font-size:14px;color:#000;text-decoration:none;white-space:nowrap;cursor:pointer}.umb-actions a:hover,.umb-actions a:focus,.umb-actions li.selected{color:#000!important;background:#f8f8f8!important}.umb-actions .menu-label{display:inline-block;padding-top:2px;padding-left:15px;vertical-align:middle}.umb-actions i{margin-top:2px;font-size:18px;color:#999;color:#414141;vertical-align:middle}.umb-actions-child{display:block;margin:0;list-style:none}.umb-actions-child li{display:block}.umb-actions-child a{display:block;padding-left:10px;clear:both;text-decoration:none}.umb-actions-child li .menu-label{margin-left:10px;font-size:14px;color:#000}.umb-actions-child li .menu-label small{display:block;clear:right;font-size:12px;line-height:14px;color:#ccc;white-space:normal}.umb-actions-child li a:hover .menuLabel small{text-decoration:none!important}.umb-actions-child i{min-width:32px;font-size:32px;line-height:24px;text-align:center}.umb-actions-child li.add{padding-top:20px;margin-top:20px;border-top:1px solid #e9e9e9}.umb-actions-child li.add i{opacity:.4}.umb-tree i.icon.blue{color:#2e8aea}.umb-tree i.icon.green{color:#46a546}.umb-tree i.icon.purple{color:#7a43b6}.umb-tree i.icon.orange{color:#df7f48}.umb-tree i.icon.red{color:#9d261d}.umb-tree li div.l{position:absolute;bottom:0;left:0;width:100%;height:1px;overflow:hidden}.umb-tree li div.l div{width:100%;height:1px;margin-top:0;margin-left:-100%;background-color:#2e8aea;animation-duration:1s;animation-iteration-count:infinite;animation-name:bounce_loadingProgressG;animation-timing-function:linear;-o-animationtiming-function:linear}.umb-tree .umb-loader{height:10px;margin:10px 10px 10px 10px}body.touch .umb-tree ins{padding:7px;font-size:14px;visibility:visible}body.touch .umb-tree li>div{padding-top:8px;padding-bottom:8px;font-size:110%}body.touch .umb-tree li div.l div{padding:0}body.touch .umb-actions a{padding:7px 25px 7px 20px;font-size:110%}.umb-listview{width:auto!important}.umb-listview .dropdown-menu{border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);border-radius:0;box-shadow:0 5px 10px rgba(0,0,0,0)}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus,.dropdown-submenu:hover>a,.dropdown-submenu:focus>a{color:#000;background:#f8f8f8}.umb-listview table{border:1px solid #d9d9d9}.umb-listview table caption{text-align:left;vertical-align:middle;background:#fff}.umb-sub-header{padding:0 0 20px 0}.umb-sub-header .header-content-right{float:right}.form-search .inner-addon{position:relative}.form-search .inner-addon [class^="icon-"],.form-search .inner-addon [class*=" icon-"]{position:absolute;top:0;padding:5px 8px;pointer-events:none}.form-search .inner-addon input[type="text"]{width:190px}.form-search .left-addon [class^="icon-"],.form-search .left-addon [class*=" icon-"]{right:inherit;left:0}.form-search .right-addon [class^="icon-"],.form-search .right-addon [class*=" icon-"]{right:0;left:inherit}.form-search .left-addon input[type="text"]{padding-right:6px;padding-left:30px!important}.form-search .right-addon input[type="text"]{padding-right:30px;padding-left:6px!important}.umb-listview table form{position:relative;margin:0}.umb-listview table input[type="text"]{width:60px;padding:4px 0 4px 20px;background:0;border:1px solid #d9d9d9;transition:all .5s}.umb-listview table input::-webkit-input-placeholder{color:#555}.umb-listview table input:-moz-placeholder{color:#555}.umb-listview table input::-moz-placeholder{color:#555}.umb-listview table input:-ms-input-placeholder{color:#555}.umb-listview table input[type="text"]:focus{width:200px;color:#000;background:#fff;border:1px solid #d9d9d9}.umb-listview table thead a{cursor:default}.umb-listview table thead a:hover{text-decoration:none}.umb-listview table thead a.sortable{cursor:pointer}.umb-listview table thead a.sortable span:hover{text-decoration:underline}.umb-listview .icon-star{color:#d9d9d9}.umb-listview .selected i.icon,.umb-listview tbody tr:hover i.icon{display:none}.umb-listview .selected input[type="checkbox"],.umb-listview tr:hover input[type="checkbox"]{display:inline-block!important}.umb-listview .inactive{color:#d9d9d9}.umb-listview .selected td{font-weight:bold}.umb-listview table thead{font-size:11px;font-weight:600;text-transform:uppercase;background-color:#fff}.umb-listview table tfoot{background:#f8f8f8}.umb-listview table tfoot td:last-child{border-left:none}.umb-listview table tfoot th{padding:0 20px}.umb-listview .label{font-size:11px;font-weight:400;color:#000;text-shadow:none;background:#f8f8f8;border:1px solid #d9d9d9}.umb-listview .table-striped tbody>tr:nth-child(even)>td,.umb-listview .table-striped tbody>tr:nth-child(even)>th{background-color:#f8f8f8}.table-striped tbody>tr:nth-child(odd)>td,.table-striped tbody>tr:nth-child(odd)>th{background:0}.umb-listview .table-striped tbody td{position:relative}.umb-listview .table-striped thead input[type="checkbox"]{margin-left:7px}.umb-listview .table-striped tbody input[type="checkbox"]{z-index:5;display:none;margin-left:7px}.umb-listview .table-striped tbody i{top:10px;left:6px;z-index:6;display:block;width:20px;height:20px;padding:0 0 0 4px;background:#fff}.umb-listview .table-striped tbody>tr:nth-child(even)>td i,.umb-listview .table-striped tbody>tr:nth-child(even)>th i{background-color:#f8f8f8}.umb-listview .table-striped tbody i:not(.handle):hover{display:none!important}.list-view-layout{display:-ms-flexbox;display:flex;padding:10px 15px;margin-bottom:1px;background:#f8f8f8;-ms-flex-align:center;align-items:center}.list-view-layout__sort-handle{margin-right:15px;font-size:14px;color:#d9d9d9}.list-view-layout__name{display:-ms-flexbox;display:flex;margin-right:15px;font-weight:bold;line-height:1.2em;-ms-flex:5;flex:5;-ms-flex-line-pack:center;align-content:center;-ms-flex-wrap:wrap;flex-wrap:wrap}.list-view-layout__name-text{margin-right:3px}.list-view-layout__system{font-size:10px;font-weight:normal}.list-view-layout__path{margin-right:15px;-ms-flex:10;flex:10}.list-view-layout__icon{display:block;padding:6px 8px;margin-right:10px;font-size:18px;vertical-align:middle;background:#fff;border:1px solid #d9d9d9}.list-view-layout__icon:hover,.list-view-layout__icon:focus,.list-view-layout__icon:active{text-decoration:none}.list-view-layout__remove{position:relative;cursor:pointer}.list-view-add-layout{display:-ms-flexbox;display:flex;padding:5px 0;margin-top:10px;color:#2e8aea;border:1px dashed #d9d9d9;box-sizing:border-box;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center}.list-view-add-layout:hover{text-decoration:none}.mceContentBody{overflow-y:hidden!important}.usky-grid IFRAME{overflow:hidden}.usky-grid .ui-sortable-helper{position:absolute!important;width:160px!important;height:80px!important;padding:5px;overflow:hidden;background:#ccc;border:dashed 1px #000!important;border-radius:5px;opacity:.4;box-shadow:3px 3px 12px 0 rgba(50,50,50,0.45)}.usky-grid .ui-sortable-helper *{padding:0!important;margin:0!important;color:#999!important;background:none!important;border:none!important}.usky-grid .ui-sortable-helper .cell-tools{display:none!important}.usky-grid .ui-sortable-placeholder{padding:20px;font-family:icomoon;font-size:85px;line-height:65px;color:#555;text-align:center;vertical-align:middle;background-color:#f8f8f8;border:2px dashed #d9d9d9}.usky-grid .ui-sortable-placeholder:hover{border-color:#555}.usky-grid .ui-sortable-placeholder:before{content:"\e1bd"}.usky-grid-width{width:100%;margin:20px auto}.usky-grid .right{float:right}.usky-grid .tb{width:100%}.usky-grid .td{display:inline-block;width:100%;vertical-align:top;border-right:1px dashed rgba(182,182,182,0);box-sizing:border-box}.usky-grid .tb:hover .td{border-right:1px dashed rgba(182,182,182,0.3)}.usky-grid .td.last{border-right:1px dashed rgba(182,182,182,0)!important}.usky-grid .middle{text-align:center}.usky-grid .mainTb{border-collapse:separate}.usky-grid .mainTd{position:relative}.usky-grid .usky-row{position:relative;border:1px dashed rgba(0,0,0,0)}.umb-grid .tb:hover .usky-row{border-bottom:1px dashed rgba(182,182,182,0)!important}.usky-grid .usky-cell{position:relative;min-height:127px;border:1px dashed rgba(0,0,0,0)}.usky-grid .cell-tools{position:absolute;top:0;right:0;bottom:0;z-index:50;width:50px;opacity:.3;transition:all .2s ease-in-out}.umb-grid .cell-tools{width:50px!important}.usky-grid .cell-tools.with-prompt{width:200px}.usky-grid .cell-tools:hover{opacity:1}.usky-grid .cell-tools-add{position:absolute;right:0;bottom:0;left:0;margin:0 45px 1px 0;text-align:center}.usky-grid .cell-tools-add.emptyArea{margin:0 0 1px 0}.usky-grid .usky-control:hover .cell-tools-add{opacity:1}.usky-grid .cell-tools-remove{position:absolute;top:0;right:5px;z-index:500;display:inline-block;text-align:right}.usky-grid .cell-tools-remove .iconBox:hover,.usky-grid .cell-tools-remove .iconBox:hover *{background:#9d261d!important;border-color:#9d261d!important}.usky-grid .cell-tools-move{position:absolute;top:33px;right:5px;z-index:500;display:inline-block;cursor:move}.usky-grid .cell-tools-edit{position:absolute;top:66px;right:5px}.usky-grid .usky-control{position:relative;display:block;margin:10px 0 0 0;background-clip:padding-box}.usky-grid .warnhighlight,.usky-grid .td.last.warnhighlight{border:1px dashed #9d261d!important}.usky-grid .infohighlight,.usky-grid .td.last.infohighlight{border:1px dashed #2e8aea!important}.usky-grid .warnhighlight>ins.item-label{color:#9d261d;border-color:#9d261d}.usky-grid .infohighlight>ins.item-label{color:#2e8aea;border-color:#2e8aea}.usky-grid ins.item-label{position:absolute;top:-22px;left:-1px;display:none;height:20px;padding:0 7px;overflow:hidden;font-size:.8em;color:#d9d9d9;text-decoration:none;background-color:white;border:1px dashed #d9d9d9;border-bottom:1px solid white!important}.usky-grid .usky-row-inner>ins.item-label{top:-20px;left:0}.usky-grid .usky-control-inner.selectedControl,.usky-grid .usky-row-inner.selectedRow{border:1px dashed #d9d9d9}.usky-grid .usky-control-inner.selectedControl>ins.item-label,.usky-grid .usky-row-inner.selectedRow>ins.item-label{z-index:100000;display:block}.usky-grid .usky-control-placeholder{position:relative;min-height:20px;text-align:center;text-align:-moz-center;cursor:text}.usky-grid .usky-control-placeholder .placeholder{height:20px;padding:5px;font-size:14px;text-align:left;border:1px solid rgba(182,182,182,0.3);opacity:.7}.usky-grid .usky-control-placeholder:hover .placeholder{border:1px solid rgba(182,182,182,0.8)}.usky-grid .usky-editor-placeholder{position:relative;min-height:65px;padding:20px;padding-bottom:30px;text-align:center;text-align:-moz-center;background-color:white;border:4px dashed #f8f8f8}.usky-grid .usky-editor-placeholder i{display:block;margin-bottom:10px;font-size:85px;line-height:85px;color:#f8f8f8}.usky-grid textarea.textstring{display:block;overflow:hidden;color:#555;background:#fff;border:0;outline:0;resize:none}.usky-grid .usky-cell-rte textarea{display:none!important}.usky-grid .usky-cell-media .caption{display:block;width:98%;overflow:hidden;font-style:italic;background:#fff;border:0;outline:0;resize:none}.usky-grid .cellPanelRte{min-height:60px}.usky-grid .usky-cell-embed iframe{width:100%}.usky-grid .iconBox{display:inline-block;padding:4px 6px 4px 6px;margin:2px;cursor:pointer;background:#fff;border:1px solid #b6b6b6;border-radius:200px}.usky-grid .iconBox span.prompt{display:block;text-align:center;white-space:nowrap}.usky-grid .iconBox span.prompt>a{text-decoration:underline}.usky-grid .iconBox:hover,.usky-grid .iconBox:hover *{color:white!important;text-decoration:none;background:#2e8aea!important;border-color:#2e8aea!important}.usky-grid .iconBox a:hover{color:white!important;text-decoration:none}.usky-grid .iconBox.selected{background:transparent;background-image:linear-gradient(to bottom,#e6e6e6,#bfbfbf);background-repeat:repeat-x;border-color:#bfbfbf #bfbfbf #999;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);border-radius:3px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe6e6e6',endColorstr='#ffbfbfbf',GradientType=0);zoom:1;box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);-webkit-appearance:none}.usky-grid .iconBox i{display:block;font-size:16px!important;color:#5f5f5f}.usky-grid ul{display:inline-block;padding:0;margin:10px 0 0 0;text-align:center;list-style:none}.usky-grid .help-text{display:inline-block;padding:10px 20px 10px 20px;clear:both;font-size:14px;color:#555;background:#f8f8f8;border-radius:15px}.usky-grid ul li{display:inline-block;width:120px;margin:8px 8px 0 8px}.usky-grid .mce-panel{clear:both;border:none!important}.usky-grid .mce-btn button{padding:8px 6px;line-height:inherit}.usky-grid .mce-toolbar{position:absolute;z-index:100;z-index:9999999;display:inline-block;float:left;padding:-1px;margin:-1px -1px 0 -1px;background-color:#fafafa;border:1px solid rgba(207,207,207,0.7);box-shadow:2px 2px 10px 0 rgba(50,50,50,0.14)}.mce-flow-layout-item{margin:0}.usky-grid .mce-panel{background:transparent!important}.usky-grid .mce-floatpanel{background-color:#f7f7f7!important}.usky-cell-rte{border:1px solid #f8f8f8}.usky-grid .fullSizeImage{width:100%}.usky-grid .boxWidth{margin-bottom:10px;text-align:right}.usky-grid .boxWidth input{width:40px;text-align:center}.usky-grid .boxWidth label{padding:0;margin:5px 5px 0 0;font-size:10px;color:#808080}.usky-grid .usky-cell{padding-top:5px;padding-bottom:15px}.usky-grid .usky-control{padding:5px;margin:10px 0 0 0;border:1px dashed transparent}.usky-grid .usky-templates-columns{margin-top:30px}.usky-grid .usky-row-inner{margin-right:45px;border:1px dashed transparent}.usky-grid .usky-control-inner{position:relative;min-height:60px;padding:5px;margin-right:45px;margin-bottom:15px;border:1px dashed transparent}.usky-grid .uSky-templates{width:100%;overflow:hidden;text-align:center}.usky-grid .uSky-templates-template{display:inline-block;width:100px;padding-right:30px;margin:20px}.usky-grid .uSky-templates-template a.tb:hover{border:5px solid #2e8aea}.usky-grid .uSky-templates-template .tb{position:relative;width:100%;height:150px;padding:10px;cursor:pointer;background-color:#f8f8f8;border:5px solid #d9d9d9}.usky-grid .uSky-templates-template .tr{position:relative;height:100%}.usky-grid .uSky-templates-template .tb .uSky-templates-column{height:100%;border:1px dashed #d9d9d9;border-right:0}.usky-grid .uSky-templates-template .tb .uSky-templates-column.last{border-right:1px dashed #d9d9d9!important}.usky-grid a.uSky-templates-column:hover,.usky-grid a.uSky-templates-column.selected{background-color:#2e8aea}.usky-grid .templates-preview{display:inline-block;width:100%;text-align:center}.usky-grid .templates-preview small{position:absolute;bottom:-25px;left:0;width:100%;padding-top:15px}.usky-grid .templates-preview .help-text{margin:35px 35px 0 0}.usky-grid .preview-rows{position:relative;display:inline-block;width:125px;margin:35px 40px 15px 0;border:2px solid #d9d9d9;box-sizing:border-box;transition:border 200ms linear}.usky-grid .preview-rows.prevalues-rows{float:left;width:80px;margin:0 20px 20px 0}.usky-grid .preview-rows.prevalues-templates{float:left;margin:0 20px 20px 0}.usky-grid .preview-rows:hover{cursor:pointer;border-color:#2e8aea}.usky-grid .preview-rows .preview-row{display:inline-block;width:100%;vertical-align:bottom}.usky-grid .preview-rows.layout{padding:2px}.usky-grid .preview-rows.layout .preview-row{height:100%}.usky-grid .preview-rows.layout .preview-col{height:180px;border:dashed 1px #d9d9d9}.usky-grid .preview-rows.layout .preview-cell{background-color:#f8f8f8}.usky-grid .preview-rows.layout .preview-overlay{display:none}.usky-grid .preview-rows.columns{min-height:18px;padding:1px;line-height:11px}.usky-grid .preview-rows.columns.prevalues-rows{min-height:30px}.usky-grid .preview-rows .preview-col{display:block;float:left;width:33.3%;height:10px;margin:0;border:1px solid #fff;box-sizing:border-box}.usky-grid .preview-rows .preview-col .preview-cell{display:block;width:100%;height:100%;margin:0 1px 1px 0;background-color:#d9d9d9}.usky-grid .preview-rows.prevalues-templates .preview-col{height:80px}.usky-grid .preview-overlay{position:absolute;top:0;left:0;display:block;width:100%;height:100%;border:3px solid white;box-sizing:border-box}.usky-grid .cell-tools-menu{position:absolute;top:0;left:50%;z-index:6660;width:360px;height:380px;padding:7px;margin-top:-270px;margin-left:-150px;overflow:auto;background:white;border:1px solid #ccc;box-shadow:3px 3px 12px 0 rgba(50,50,50,0.45)}.usky-grid .cell-tools-menu h5{padding:10px;margin-top:0;color:#999;border-bottom:1px solid #d9d9d9}.usky-grid .elements{display:block;padding:0;margin:0}.usky-grid .elements li{display:inline-block;width:90px;height:80px;padding:5px;margin:5px;overflow:hidden;font-size:11px}.usky-grid .elements li:hover,.usky-grid .elements li:hover *{color:white;background:#2e8aea}.usky-grid .elements a{color:#222;text-decoration:none}.usky-grid .elements i{display:block;font-size:30px;line-height:50px;color:#999}.usky-grid-configuration .uSky-templates{text-align:left}.usky-grid-configuration ul{display:block}.usky-grid-configuration ul li{display:block;width:auto;text-align:left}.usky-grid-configuration .uSky-templates .uSky-templates-template .tb{max-height:50px;padding:0;overflow:hidden;border-spacing:2px;border-width:2px!important}.usky-grid-configuration .uSky-templates .uSky-templates-template span{display:inline-block;background:#d9d9d9}.usky-grid-configuration .uSky-templates .uSky-templates-template .tb:hover{border-width:2px!important}.usky-grid-configuration .uSky-templates-column{display:block;float:left;margin-left:-1px;background:#d9d9d9;border:1px white solid!important}.usky-grid-configuration .uSky-templates-column.last{margin-right:-1px}.usky-grid-configuration .uSky-templates-column.add{font-size:20px;line-height:70px;color:#ccc;text-align:center;text-decoration:none;background:white}.usky-grid-configuration .mainTdpt{height:initial;border:0}.usky-grid-configuration .uSky-templates-rows .uSky-templates-row{width:60px;margin:0 50px 20px 0}.usky-grid-configuration .uSky-templates-rows .uSky-templates-row .tb{padding:0;border-spacing:2px;border-width:2px!important}.usky-grid-configuration .uSky-templates-rows .mainTdpt{height:10px!important}.usky-grid-configuration a.uSky-templates-column{height:70px!important}body.dragging,body.dragging *{cursor:move!important}li.dragged{position:absolute;z-index:2000;opacity:.5}.umb-sort li{display:block;padding:5px;margin:5px;background:#f8f8f8;border:1px solid #CCC}.umb-sort .placeholder{position:relative;padding:0;margin:0;border:0}.umb-sort .placeholder:before{position:absolute;top:-4px;left:-5px;width:0;height:0;margin-top:-5px;border:5px solid transparent;border-right:0;border-left-color:red;content:""}.umb-dashboards-forms-install{position:relative;top:-30px;padding-top:30px;background:url('../img/forms/installer-background.png');background-repeat:repeat-x;border-radius:0 0 200px 200px;box-shadow:inset 0 -40px 30px 25px #fff}.umb-dashboards-forms-install small{font-size:14px;opacity:.5}.umb-dashboards-forms-install .umb-loader{width:640px;height:4px}.umb-dashboards-forms-install .video_player video{width:100%;max-width:640px;border:1px solid #ededed;border-bottom:0;border-left:none;box-sizing:border-box}.umb-dashboards-forms-install .video_player input[type="range"]{position:relative;z-index:999;width:100%;max-width:640px;margin:0 auto;cursor:pointer;opacity:0}.umb-dashboards-forms-install .video_player input[type="range"]::-ms-fill-lower,.umb-dashboards-forms-install .video_player input[type="range"]::-ms-fill-upper{background:transparent}.umb-dashboards-forms-install .video_player input[type="range"]::-ms-tooltip{display:none}.umb-dashboards-forms-install .video_player .video-controls{position:relative;height:20px;max-width:640px;margin:-13px auto 40px;opacity:.8}.umb-dashboards-forms-install .video_player .loader{display:block;width:100%;height:3px;margin-top:-13px;background-color:whitesmoke}.umb-dashboards-forms-install .video_player .progress-bar{display:block;width:200px;height:100%;max-width:100%;background:#7c7e80;box-sizing:border-box}.umb-dashboards-forms-install .video_player .video-controls,.umb-dashboards-forms-install .video_player .loader,.umb-dashboards-forms-install .video_player .progress-bar{transition:all 150ms ease-in-out}.umb-dashboards-forms-install .video_player .progress-bar{transition-property:background}.umb-dashboards-forms-install .video_player .video_player video:hover+.video-controls,.umb-dashboards-forms-install .video_player .video-controls:hover{margin-top:-19px;margin-bottom:46px;opacity:1}.umb-dashboards-forms-install .video_player .video_player video:hover+.video-controls .loader,.umb-dashboards-forms-install .video_player .video-controls:hover .loader{height:8px}.umb-dashboards-forms-install .video_player .video_player video:hover+.video-controls .progress-bar,.umb-dashboards-forms-install .video_player .video-controls:hover .progress-bar{background:#2e99f4}.umb-dashboards-forms-install .installer-top{position:relative;height:80px;margin:0 auto 30px;overflow:hidden;line-height:80px;text-align:center}.umb-dashboards-forms-install .installer-top i,.umb-dashboards-forms-install .installer-top h3{display:inline-block}.umb-dashboards-forms-install .installer-top i{position:absolute;top:50%;margin-top:-40px}.umb-dashboards-forms-install .installer-top h3{margin:0;margin-left:100px;font-size:36px;font-weight:700;line-height:80px;letter-spacing:-1px}.umb-validation-label{position:relative;padding:1px 5px;font-size:10px;line-height:1.5em;color:white;background:#9d261d}.umb-validation-label:after{position:absolute;bottom:100%;left:10px;width:0;height:0;margin-left:-4px;pointer-events:none;border:solid transparent;border-color:rgba(255,255,255,0);border-bottom-color:#9d261d;border-width:4px;content:" "}.umb-validation-label.-arrow-left{margin-left:10px}.umb-validation-label.-arrow-left:after{position:absolute;top:50%;right:100%;bottom:auto;left:auto;width:0;height:0;margin-top:-4px;pointer-events:none;border:solid transparent;border-color:rgba(255,255,255,0);border-right-color:#9d261d;border-width:4px;content:" "}.umb-editor-wrapper{position:absolute;top:0;right:0;bottom:0;left:0;display:-ms-flexbox;display:flex;background:white;-ms-flex-direction:column;flex-direction:column}.umb-editor-wrapper>form{display:-ms-flexbox;display:flex;height:100%;-ms-flex-direction:column;flex-direction:column}.umb-editor-header{position:relative;background:#f8f8f8;border-bottom:1px solid #d9d9d9;-ms-flex:0 0 99px;flex:0 0 99px}.umb-editor-header__actions-menu{margin-left:auto}.umb-editor-container{position:relative;top:0;right:0;bottom:0;left:0;overflow:auto;-ms-flex:1 1 100%;flex:1 1 100%}.umb-editor-wrapper.-no-footer .umb-editor-container{bottom:0}.umb-editor-container.-stop-scrolling{overflow:hidden}.umb-editor-drawer{padding:10px 20px;margin:0;background:#f8f8f8;border-top:1px solid #d9d9d9;-ms-flex:1 0 31px;flex:1 0 31px}.umb-editor-actions{padding:0;margin:0;list-style:none}.umb-editor-actions li{display:inline-block}.umb-overlay{position:fixed;z-index:996660;overflow:hidden;background:white;box-shadow:0 10px 20px rgba(0,0,0,0.19),0 6px 6px rgba(0,0,0,0.23);animation:fadeIn .2s}.umb-overlay__form{display:-ms-flexbox;display:flex;height:100%;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-ms-flex-direction:column;flex-direction:column}.umb-overlay .umb-overlay-header{padding:10px;margin-top:0;background:#f8f8f8;border-bottom:1px solid #d9d9d9;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0}.umb-overlay .umb-overlay__title{margin:7px 0;font-size:17.5px;font-weight:bold;color:#000}.umb-overlay .umb-overlay__subtitle{font-size:11.9px;color:#555}.umb-overlay .umb-overlay-container{position:relative;height:auto;overflow-x:hidden;overflow-y:auto;-ms-flex-positive:1;flex-grow:1;-ms-flex-negative:1;flex-shrink:1;-ms-flex-preferred-size:auto;flex-basis:auto}.umb-overlay .umb-overlay-drawer{padding:10px 20px;margin:0;background:#f8f8f8;border-top:1px solid #d9d9d9;-ms-flex-positive:0;flex-grow:0;-ms-flex-negative:0;flex-shrink:0;-ms-flex-preferred-size:31px;flex-basis:31px}.umb-overlay .umb-overlay-drawer.-auto-height{-ms-flex-preferred-size:auto;flex-basis:auto}.umb-overlay .umb-overlay-drawer .umb-overlay-drawer__align-right{display:-ms-flexbox;display:flex;-ms-flex-pack:end;justify-content:flex-end}.umb-overlay .umb-overlay-drawer .umb-overlay-drawer-content .dropdown-menu{right:0;left:auto}.umb-overlay.umb-overlay-center{position:absolute;top:10px;left:50%;width:600px;height:500px;transform:translate(-50%,0)}.umb-overlay.umb-overlay-center .umb-overlay-header{text-align:center}.umb-overlay.umb-overlay-center .umb-overlay-container{padding:20px}.umb-overlay.umb-overlay-target{width:400px;height:400px;box-sizing:border-box}.umb-overlay.umb-overlay-target .umb-overlay-header{text-align:center}.umb-overlay.umb-overlay-target .umb-overlay-container{padding:10px}.umb-overlay.umb-overlay-right{top:0;right:0;bottom:0;width:500px;border:0;box-shadow:0 0 20px rgba(0,0,0,0.19),0 0 6px rgba(0,0,0,0.23)}.umb-overlay.umb-overlay-right .umb-overlay-header{padding:20px;box-sizing:border-box;-ms-flex-preferred-size:100px;flex-basis:100px}.umb-overlay.umb-overlay-right .umb-overlay-container{padding:20px}.umb-overlay.umb-overlay-left{top:0;bottom:0;left:0;width:500px;margin-left:81px;border:0;box-shadow:0 0 20px rgba(0,0,0,0.19),0 0 6px rgba(0,0,0,0.23)}.umb-overlay.umb-overlay-left .umb-overlay-header{padding:20px;box-sizing:border-box;-ms-flex-preferred-size:100px;flex-basis:100px}.umb-overlay.umb-overlay-left .umb-overlay-container{padding:20px}@media(max-width:767px){.umb-overlay.umb-overlay-left{margin-left:61px}}@media(max-width:500px){.umb-overlay.umb-overlay-left{width:calc(100% - 41px);margin-left:41px}}.umb-overlay__item-details{position:absolute;bottom:51px;left:0;width:100%;padding:20px;background:#f8f8f8;border-bottom:1px solid #d9d9d9;box-sizing:border-box}.umb-overlay__item-details-title-wrapper{display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;-ms-flex-align:center;align-items:center}.umb-overlay__item-details-icon{margin-right:10px;font-size:16px;color:#999;vertical-align:middle}.umb-overlay__item-details-title{margin-top:0;margin-bottom:0}.umb-overlay__item-details-description{margin-top:10px;font-size:12px}.umb-overlay .control-label,.umb-overlay .form-horizontal .control-label,.form-horizontal .umb-overlay .control-label{display:block;float:none;width:100%;margin-bottom:10px;box-sizing:border-box}.umb-overlay .controls-row,.umb-overlay .form-horizontal .controls,.form-horizontal .umb-overlay .controls{margin-left:0!important}.umb-card{position:relative;padding:5px 10px 5px 10px;background:white}.umb-card .title{padding:12px;margin:0 -10px 10px -10px;font-size:16px;font-weight:400;color:#555;text-transform:none;border-bottom:1px solid #d9d9d9}.umb-card-thumb{text-align:center}.umb-card-thumb i{display:block;padding-top:5px;font-size:20px;line-height:40px;color:#2e8aea;text-align:center}.umb-card-content .item-title{margin-bottom:3px;font-size:16px;font-weight:400;color:#1d1d1d;text-transform:none;border:0}.umb-card-content p{margin-bottom:1px;color:#555}.umb-card-actions{padding-top:10px;clear:both;border-top:#f8f8f8 1px solid}.umb-card-icons{display:block;padding:0;margin:0;text-align:center;vertical-align:middle;list-style:none}.umb-card-icons.vertical{position:absolute;top:7px;right:7px;width:1px;text-align:right}.umb-card-icons li{display:inline-block;margin:0 2px 0 2px}.umb-card-icons.vertical li{display:block;float:right;margin-bottom:3px}.umb-card-list{display:block;padding:0;margin:0}.umb-card-list li{display:block;padding-bottom:3px;border-bottom:#f8f8f8 1px solid}.umb-card-grid{display:-ms-flexbox;display:flex;padding:0;margin:0 auto;list-style:none;-ms-flex-flow:row wrap;flex-flow:row wrap;-ms-flex-pack:start;justify-content:flex-start}.umb-card-grid li{width:100px;height:105px;padding:5px;overflow:hidden;font-size:11px;text-align:center;box-sizing:border-box}.umb-card-grid li.-four-in-row{-ms-flex:0 0 25%;flex:0 0 25%}.umb-card-grid li.-three-in-row{-ms-flex:0 0 33.33%;flex:0 0 33.33%}.umb-card-grid .umb-card-grid-item{display:block;width:100%;height:100%}.umb-card-grid .umb-card-grid-item:hover,.umb-card-grid .umb-card-grid-item:focus,.umb-card-grid .umb-card-grid-item:hover>*,.umb-card-grid .umb-card-grid-item:focus>*{color:white;cursor:pointer;background:#2e8aea;outline:0}.umb-card-grid a{color:#222;text-decoration:none}.umb-card-grid i{display:block;font-size:30px;line-height:50px;color:#343434}.umb-btn-round{display:inline-block;padding:4px 6px 4px 6px;margin:2px;cursor:pointer;background:#fff;border:1px solid #b6b6b6;border-radius:200px}.umb-btn-round:hover,.umb-btn-round:hover *{color:white!important;text-decoration:none;background:#2e8aea!important;border-color:#2e8aea!important}.umb-btn-round a:hover{color:white!important;text-decoration:none}.umb-btn-round i{display:block;font-size:16px!important;color:#grayLight}.umb-btn-round.alert:hover,.umb-btn-round.alert:hover *{color:white!important;text-decoration:none;background:#9d261d!important;border-color:#9d261d!important}.umb-btn-round.no-border{background:none!important;border:none!important}.umb-sub-views .umb-sub-views-action-bar{margin-bottom:40px}.umb-sub-views .umb-sub-views-action-bar .btn-link{padding-right:0;padding-left:0}.umb-sub-views .umb-sub-views-action-bar .btn-link:focus{text-decoration:none;outline:0}.umb-sub-views .umb-sub-views-nav{float:right;margin:0}.umb-sub-views .umb-sub-views-nav .umb-sub-views-nav-item{display:inline-block;margin-left:15px}.umb-sub-views .umb-sub-views-nav .umb-sub-views-nav-item.is-active .btn-link{color:#2e8aea!important}.umb-sub-views .umb-sub-views-tools{float:left;margin:0}.umb-sub-views .umb-sub-views-tools .umb-sub-views-tool{display:inline-block;margin-right:15px}.umb-sub-views-nav{display:-ms-flexbox;display:flex;margin:0;list-style:none}.umb-sub-views-nav-item{display:block;margin-left:20px;text-align:center;cursor:pointer}.umb-sub-views-nav-item:focus{outline:0}.umb-sub-views-nav-item:hover,.umb-sub-views-nav-item:focus{text-decoration:none}.umb-sub-views-nav-item.is-active{color:#2e8aea}.show-validation .umb-sub-views-nav-item.-has-error{color:#9d261d}.umb-sub-views-nav-item .icon{display:block;font-size:24px;text-align:center}.umb-sub-views-nav-item-text{font-size:11px}.sub-view-columns{display:-ms-flexbox;display:flex;margin-bottom:40px}.sub-view-columns h5{margin-top:0}.sub-view-column-left{margin-right:70px;-ms-flex:0 0 250px;flex:0 0 250px}.sub-view-column-right{-ms-flex:1;flex:1}.sub-view-column-section{margin-bottom:20px}.umb-editor-sub-header{position:relative;top:0;display:-ms-flexbox;display:flex;padding:15px 0;margin-top:-30px;margin-bottom:30px;background:#fff;-ms-flex-pack:justify;justify-content:space-between}.umb-editor-sub-header.-umb-sticky-bar{top:100px;margin-top:0;margin-bottom:0;box-shadow:0 5px 0 rgba(0,0,0,0.08),0 1px 0 rgba(0,0,0,0.16);transition:box-shadow 1s}.umb-group-builder__property-preview .umb-editor-sub-header{display:none}.umb-editor-sub-header__content-left{margin-right:auto}.umb-editor-sub-header__content-right{margin-left:auto}.umb-editor-sub-header__content-left,.umb-editor-sub-header__content-right{display:-ms-flexbox;display:flex;-ms-flex-align:stretch;align-items:stretch}.umb-editor-sub-header__section{display:-ms-flexbox;display:flex;padding-right:20px;padding-left:20px;border-left:1px solid #d9d9d9;-ms-flex-align:center;align-items:center}.umb-editor-sub-header__content-left .umb-editor-sub-header__section:first-child{padding-left:0;border-left:none}.umb-editor-sub-header__content-right .umb-editor-sub-header__section{border-right:1px solid #d9d9d9;border-left:none}.umb-editor-sub-header__content-right .umb-editor-sub-header__section:last-child{padding-right:0;border-right:0}.umb-grid-selector__items{display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;-ms-flex-wrap:wrap;flex-wrap:wrap}.umb-grid-selector__item{position:relative;display:-ms-flexbox;display:flex;width:125px;height:150px;padding:20px;margin:0 20px 20px 0;text-align:center;background:#f8f8f8;border:1px solid #ccc;animation:fadeIn .5s;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center}.umb-grid-selector__item.-default{border-width:2px}.umb-grid-selector__item.-placeholder{cursor:pointer;background:0;border:1px dashed #d9d9d9}.umb-grid-selector__item-content{margin-top:10px}.umb-grid-selector__item-icon{display:block;margin-bottom:5px;font-size:50px;line-height:50px;color:#d9d9d9}.umb-grid-selector__item-label{font-size:13px;font-weight:bold}.umb-grid-selector__item-label.-blue{color:#2e8aea}.umb-grid-selector__item-remove{position:absolute;top:5px;right:5px;cursor:pointer}.umb-grid-selector__item-default-label{position:relative;top:-3px;font-size:10px;font-weight:bold;color:#555}.umb-grid-selector__item-default-label.-blue{color:#2e8aea}.umb-grid-selector__item-add{color:#2e8aea}.umb-child-selector__child{display:-ms-flexbox;display:flex;min-width:300px;padding:5px 15px;margin-bottom:5px;background:#f8f8f8;animation:fadeIn .5s}.umb-child-selector__child.-parent{padding-top:10px;padding-bottom:10px;background:#f1f1f1}.umb-child-selector__child.-placeholder{text-align:center;cursor:pointer;background:0;border:1px dashed #d9d9d9;-ms-flex-pack:center;justify-content:center}.umb-child-selector__children-container{margin-left:30px}.umb-child-selector__child-description{-ms-flex:1;flex:1}.umb-child-selector__child-icon-holder{display:inline-block;width:20px;margin-right:5px;text-align:center}.umb-child-selector__child-icon{font-size:16px;vertical-align:middle}.umb-child-selector__child-name{font-size:13px}.umb-child-selector__child-name.-blue{color:#2e8aea}.umb-child-selector__child-actions{text-align:right;-ms-flex:0 0 50px;flex:0 0 50px}.umb-child-selector__child-remove{cursor:pointer}.umb-group-builder__groups{padding:0;margin:0;list-style:none}.umb-group-builder__group{position:relative;min-height:86px;padding:10px 10px 5px 10px;margin:50px 0 0 0;border:2px solid #ccc;border-radius:0 10px 10px 10px;box-sizing:border-box}.umb-group-builder__group.-active{border-color:#2e8aea}.umb-group-builder__group.-inherited{border-color:#f2f2f2;animation:fadeIn .5s}.umb-group-builder__group.-placeholder{display:-ms-flexbox;display:flex;min-height:86px;font-weight:bold;color:#2e8aea;cursor:pointer;border:1px dashed #d9d9d9;-ms-flex-pack:center;justify-content:center;-ms-flex-align:center;align-items:center}.umb-group-builder__group.-sortable{min-height:initial;cursor:move}.umb-group-builder__group-actions{position:absolute;top:5px;right:5px;z-index:10;opacity:0;visibility:hidden}.umb-group-builder__group-action{display:inline-block}.umb-group-builder__group-remove{position:absolute;top:-30px;right:20px;font-size:18px}.umb-group-builder__group-remove:hover{color:#0064cd;cursor:pointer}.umb-group-builder__group-title-wrapper{position:absolute;top:-45px;left:-2px;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center}.umb-group-builder__group-title-wrapper.-placeholder{top:-44px;left:-1px}.umb-group-builder__group-title{display:-ms-flexbox;display:flex;height:38px;padding:5px 9px 0 9px;font-weight:bold;background:white;border:2px solid #ccc;border-bottom:0;border-radius:10px 10px 0 0;-ms-flex-align:center;align-items:center}.umb-group-builder__group-title-icon{margin-left:5px}.umb-group-builder__group-title.-active{border-color:#2e8aea}.umb-group-builder__group-title.-placeholder{width:70px;border:1px dashed #d9d9d9;border-bottom:0}.umb-group-builder__group-title.-inherited{border-color:#f2f2f2}input.umb-group-builder__group-title-input{margin-bottom:0;font-weight:bold;color:#515151;background:transparent;border-color:transparent}.umb-group-builder__group-title-input:hover{border-color:#ccc}.umb-group-builder__group-title-input.-placeholder{border:1px dashed #979797}.umb-group-builder__group-inherited-label{position:relative;top:2px;display:inline-block;margin-left:10px;font-size:13px;color:#d9d9d9}.umb-group-builder__group-sort-order{position:relative;top:2px;display:-ms-flexbox;display:flex;margin-left:10px;-ms-flex-align:center;align-items:center}input.umb-group-builder__group-sort-value{width:40px;padding:0 0 0 5px;margin-bottom:0;font-size:11px;border-color:#d9d9d9}.umb-group-builder__properties{min-height:35px;padding:0;margin:0;list-style:none}.umb-group-builder__property{position:relative;display:-ms-flexbox;display:flex;padding:5px;margin-bottom:5px;border:1px solid transparent;border-radius:5px;box-sizing:border-box;-ms-flex-flow:row;flex-flow:row}.umb-group-builder__property:hover{border:1px dashed #ccc}.umb-group-builder__property.-placeholder{cursor:pointer;background:#fff;border:1px dashed #d9d9d9;border-radius:5px;animation:fadeIn .5s;-ms-flex-align:center;align-items:center}.umb-group-builder__property.-inherited{border:transparent;animation:fadeIn .5s}.umb-group-builder__property.-inherited:hover{border:transparent}.umb-group-builder__property.-locked{border:transparent;animation:fadeIn .5s}.umb-group-builder__property.-locked:hover{border:transparent}.umb-group-builder__property.-sortable,.umb-group-builder__property.-sortable-locked{min-height:35px;border:0;border-radius:5px;animation:none;-ms-flex-align:center;align-items:center}.umb-group-builder__property.-sortable{color:#222;cursor:move;background:#e9e9e9}.umb-group-builder__property.-sortable-locked{padding-left:30px;background:#f8f8f8}.umb-group-builder__property-meta{margin-right:20px;-ms-flex:0 0 175px;flex:0 0 175px}.umb-group-builder__property-meta.-full-width{-ms-flex:1;flex:1}.umb-group-builder__property-meta-alias{margin-bottom:5px;font-size:10px;line-height:1.5;color:#555;word-break:break-word}.umb-group-builder__property-meta-label textarea{width:100%;min-height:25px;padding:0;margin-bottom:0;overflow:hidden;font-size:14px;font-weight:bold;color:#222;background:transparent;border-color:transparent;box-sizing:border-box;resize:none}.umb-group-builder__property-meta-label textarea.ng-invalid{border:0}.umb-group-builder__property-meta-description textarea{width:100%;min-height:25px;padding:0;margin-bottom:0;overflow:hidden;font-size:12px;line-height:1.5;color:#343434;background:transparent;border-color:transparent;box-sizing:border-box;resize:none}.umb-group-builder__property-preview{position:relative;height:30px;padding:35px 10px 25px 10px;overflow:hidden;background:url("../img/checkered-background-20.png");-ms-flex:1;flex:1}.umb-group-builder__property-preview:hover{cursor:pointer}.umb-group-builder__property-preview:focus{outline:0}.umb-group-builder__property-preview.-not-clickable:hover{cursor:auto}.umb-group-builder__property-preview .help-inline{display:none!important}.umb-group-builder__property-preview-label{position:absolute;top:0;left:0;z-index:15;padding:3px;font-size:11px;line-height:12px;text-transform:uppercase;background:#f8f8f8;opacity:.8}.umb-group-builder__property-actions{margin:15px 0 0 15px;text-align:center;-ms-flex:0 0 40px;flex:0 0 40px}.umb-group-builder__property-action{position:relative;display:block;margin:0 0 10px 0;font-size:18px;cursor:pointer}.umb-group-builder__property-action:hover{color:#0064cd}.umb-group-builder__property-tags{position:absolute;top:0;left:0;z-index:20;display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row}.umb-group-builder__property-tags.-right{right:0;left:auto}.umb-group-builder__property-tag{display:-ms-flexbox;display:flex;padding:0 4px;margin-left:10px;font-size:11px;background-color:#d9d9d9}.umb-group-builder__property-tag:first-child{margin-left:0}.umb-group-builder__property-tag.-white{background-color:#fff}.umb-group-builder__property-tag-icon{margin-right:3px}.umb-group-builder__placeholder-box{display:-ms-flexbox;display:flex;font-size:12px;font-weight:bold;color:#2e8aea;background:#e9e9e9;box-sizing:border-box;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center}.umb-group-builder__placeholder-box.-input{height:10px;margin-bottom:5px}.umb-group-builder__placeholder-box.-input-small{width:25%;height:5px;margin-bottom:5px}.umb-group-builder__placeholder-box.-text-full-width{height:3px;margin-bottom:3px}.umb-group-builder__placeholder-box.-text-short{width:75%;height:3px;margin-bottom:3px}.umb-group-builder__group-sortable-placeholder{margin:0 0 70px 0;background:transparent;border:1px dashed #d9d9d9;border-radius:10px;border-radius:5px}.umb-group-builder__property_sortable-placeholder{margin-bottom:5px;background:transparent;border:1px dashed #d9d9d9;border-radius:5px}.umb-group-builder__no-data-text{padding-top:50px;font-size:16px;line-height:1.8em;color:#ccc;text-align:center}.umb-overlay .show-validation .ng-invalid-val-required-component .editor-placeholder{color:#9d261d;border-color:#9d261d}.content-type-editor-dialog.edit-property-settings .validation-wrapper{position:relative}.content-type-editor-dialog.edit-property-settings .validation-label{position:absolute;top:50%;right:0;font-size:12px;color:#9d261d;transform:translate(0,-50%)}.content-type-editor-dialog.edit-property-settings textarea.editor-label{width:100%;padding-left:0;margin-bottom:0;font-size:16px;font-weight:bold;line-height:1.5em;border:0;border-color:transparent;box-shadow:none;box-sizing:border-box;resize:none}.content-type-editor-dialog.edit-property-settings textarea.editor-label:focus{outline:0;box-shadow:none!important}.content-type-editor-dialog.edit-property-settings .editor-placeholder{display:block;width:100%;height:80px;font-size:13px;font-weight:bold;line-height:80px;color:#555;color:#2e8aea;text-align:center;border:1px dashed #d9d9d9;border-radius:5px}.content-type-editor-dialog.edit-property-settings .editor-placeholder:hover{text-decoration:none}.content-type-editor-dialog.edit-property-settings .editor{margin-bottom:10px}.content-type-editor-dialog.edit-property-settings .editor .editor-icon-wrapper{float:left;width:60px;height:60px;margin-right:20px;line-height:60px;text-align:center;border:1px solid #d9d9d9;border-radius:5px}.content-type-editor-dialog.edit-property-settings .editor .editor-icon-wrapper .icon{font-size:26px}.content-type-editor-dialog.edit-property-settings .editor .editor-details{float:left;margin-top:10px}.content-type-editor-dialog.edit-property-settings .editor .editor-details .editor-name{display:block;font-weight:bold}.content-type-editor-dialog.edit-property-settings .editor .editor-details .editor-editor{display:block;font-size:12px}.content-type-editor-dialog.edit-property-settings .editor .editor-settings-icon{margin-top:8px;font-size:18px}.content-type-editor-dialog.edit-property-settings .checkbox{margin-bottom:20px}.content-type-editor-dialog.edit-property-settings .editor-description,.content-type-editor-dialog.edit-property-settings .editor-validation-pattern{min-width:100%;min-height:25px;overflow:hidden;border:0;box-sizing:border-box;resize:none}.content-type-editor-dialog.edit-property-settings .umb-dropdown{width:100%}.umb-list-view-settings__box{position:relative;display:-ms-flexbox;display:flex;padding:15px;background:#f8f8f8;border:1px solid #ccc;animation:fadeIn .5s}.umb-list-view-settings__trigger{margin-bottom:20px}.umb-list-view-settings__box.-open{border-bottom:transparent}.umb-list-view-settings__content{display:-ms-flexbox;display:flex}.umb-list-view-settings__list-view-icon{margin-right:10px;font-size:20px;color:#d9d9d9}.umb-list-view-settings__name{float:left;margin-right:5px;font-size:14px;font-weight:bold}.umb-list-view-settings__create-new{font-size:12px;color:#2e8aea}.umb-list-view-settings__remove-new{font-size:12px;color:#9d261d}.umb-list-view-settings__settings{padding:20px;border:1px dashed #d9d9d9;border-top:0}.umb-table{position:relative;display:-ms-flexbox;display:flex;min-width:640px;border:1px solid #d9d9d9;-ms-flex-direction:column;flex-direction:column;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-ms-flex-pack:justify;justify-content:space-between}.umb-table.umb-table-inactive:before{position:absolute;top:0;right:0;bottom:0;left:0;z-index:10;background:rgba(255,255,255,0.75);content:"";outline:1px solid rgba(255,255,255,0.75)}.umb-table a{text-decoration:none;cursor:pointer}.umb-table a:focus{text-decoration:none;outline:0}input.umb-table__input{margin:0 auto}.umb-table-head{font-size:11px;font-weight:600;text-transform:uppercase;background-color:#f8f8f8}.umb-table-head__link{position:relative;color:rgba(85,85,85,0.75);text-decoration:none;cursor:default}.umb-table-head__link:hover{color:rgba(85,85,85,0.75);text-decoration:none}.umb-table-head__link .sortable:hover{color:#000;text-decoration:none;cursor:pointer}.umb-table-thead__icon{position:absolute;padding-top:1px;padding-left:3px;font-size:13px;cursor:default}.umb-table-thead .sortable:hover{text-decoration:none;cursor:pointer}.umb-table-body .umb-table-row{font-size:13px;color:rgba(85,85,85,0.75);cursor:pointer;border-top:1px solid #d9d9d9}.umb-table-body .umb-table-row:hover{background-color:rgba(248,248,248,0.9)}.umb-table-body .umb-table-row.-solid{cursor:default}.umb-table-body .umb-table-row.-solid:hover{background-color:white}.umb-table-body__link{text-decoration:none}.umb-table-body__link:hover{text-decoration:underline}.umb-table-body__icon,.umb-table-body__icon[class^="icon-"],.umb-table-body__icon[class*=" icon-"]{margin:0 auto;font-size:22px;line-height:22px;color:#0064cd}.umb-table-body__checkicon,.umb-table-body__checkicon[class^="icon-"],.umb-table-body__checkicon[class*=" icon-"]{display:none;font-size:16px;line-height:22px}.umb-table-body .umb-table__name{font-size:14px;font-weight:bold;color:#000}.umb-table-body__empty{height:100%;padding:20px 0;font-size:16px;color:#555;text-align:center}.-selected .umb-table-body__fileicon{display:none}.-selected .umb-table-body__checkicon{display:inline-block}.-content .-unpublished .umb-table__name>*{opacity:.4}.-content .-unpublished .umb-table-body__icon{opacity:.4}.-selected.-unpublished .umb-table-body__icon{opacity:1}.umb-table-row{display:-ms-flexbox;display:flex;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-align:center;align-items:center}.umb-table-row.-selected,.umb-table-row.-selected:hover{background-color:rgba(0,100,205,0.04)}.umb-table-cell{position:relative;display:-ms-flexbox;display:flex;padding:6px 2px;margin:auto 14px;overflow:hidden;text-align:left;-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex:1 1 1%;flex:1 1 1%}.umb-table-cell>*{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.umb-table-cell:first-of-type:not(.not-fixed){padding:15px 0;margin:0 0 0 15px;-ms-flex:0 0 25px;flex:0 0 25px}.umb-table__name{max-width:25%;-ms-flex:1 1 25%;flex:1 1 25%}.umb_confirm-action__overlay{position:absolute;z-index:999999;display:-ms-flexbox;display:flex}.umb_confirm-action__overlay.-top{top:-50px;right:auto;bottom:auto;left:0;animation:fadeInUp .2s;-ms-flex-direction:column;flex-direction:column}.umb_confirm-action__overlay.-top .umb_confirm-action__overlay-action{margin-bottom:5px}.umb_confirm-action__overlay.-top .umb_confirm-action__overlay-action.-confirm{-ms-flex-order:1;order:1}.umb_confirm-action__overlay.-top .umb_confirm-action__overlay-action.-cancel{-ms-flex-order:2;order:2}.umb_confirm-action__overlay.-right{top:0;right:-50px;bottom:auto;left:auto;animation:fadeInLeft .2s;-ms-flex-direction:row;flex-direction:row}.umb_confirm-action__overlay.-right .umb_confirm-action__overlay-action{margin-left:5px}.umb_confirm-action__overlay.-right .umb_confirm-action__overlay-action.-confirm{-ms-flex-order:2;order:2}.umb_confirm-action__overlay.-right .umb_confirm-action__overlay-action.-cancel{-ms-flex-order:1;order:1}.umb_confirm-action__overlay.-bottom{top:auto;right:auto;bottom:-50px;left:0;animation:fadeInDown .2s;-ms-flex-direction:column;flex-direction:column}.umb_confirm-action__overlay.-bottom .umb_confirm-action__overlay-action{margin-top:5px}.umb_confirm-action__overlay.-bottom .umb_confirm-action__overlay-action.-confirm{-ms-flex-order:2;order:2}.umb_confirm-action__overlay.-bottom .umb_confirm-action__overlay-action.-cancel{-ms-flex-order:1;order:1}.umb_confirm-action__overlay.-left{top:0;right:auto;bottom:auto;left:-50px;animation:fadeInRight .2s;-ms-flex-direction:row;flex-direction:row}.umb_confirm-action__overlay.-left .umb_confirm-action__overlay-action{margin-right:5px}.umb_confirm-action__overlay.-left .umb_confirm-action__overlay-action.-confirm{-ms-flex-order:1;order:1}.umb_confirm-action__overlay.-left .umb_confirm-action__overlay-action.-cancel{-ms-flex-order:2;order:2}.umb_confirm-action__overlay-action{display:-ms-flexbox;display:flex;width:20px;height:20px;font-size:18px;color:#fff;border-radius:40px;box-shadow:0 2px 5px 0 rgba(0,0,0,0.26);-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center}.umb_confirm-action__overlay-action:hover{color:#fff;text-decoration:none}.umb_confirm-action__overlay-action.-confirm{color:#46a546!important;background:#fff}.umb_confirm-action__overlay-action.-confirm:hover{color:#46a546!important}.umb_confirm-action__overlay-action.-cancel{color:#9d261d!important;background:#fff}.umb_confirm-action__overlay-action.-cancel:hover{color:#9d261d!important}.umb-keyboard-shortcuts-overview__overlay{position:fixed;top:0;left:0;z-index:1000;width:100%;height:100%;padding-left:440px;background:#fff;box-sizing:border-box;animation:fadeIn .2s}.umb-keyboard-shortcuts-overview__overlay-close{position:absolute;top:20px;right:20px;display:-ms-flexbox;display:flex;width:35px;height:35px;font-size:25px;line-height:1em;background-color:transparent;border-radius:20px;-ms-flex-pack:center;justify-content:center;-ms-flex-align:center;align-items:center}.umb-keyboard-shortcuts-overview__overlay-close:hover{color:#fff;text-decoration:none;background-color:#2e8aea}.umb-keyboard-shortcuts-overview__overlay-content{display:-ms-flexbox;display:flex;width:100%;height:100%;-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:center;justify-content:center;-ms-flex-align:center;align-items:center}.umb-keyboard-shortcuts-overview__keyboard-shortcuts-group{width:50%;margin-bottom:10px}.umb-keyboard-shortcuts-overview__keyboard-shortcuts-group-name{margin-bottom:0}.umb-keyboard-shortcuts-overview__keyboard-shortcut{display:-ms-flexbox;display:flex;padding:7px 0;border-bottom:1px solid #d9d9d9;-ms-flex-pack:justify;justify-content:space-between;-ms-flex-align:center;align-items:center}.umb-keyboard-shortcuts-overview__keyboard-shortcut.-no-air{padding:0}.umb-keyboard-shortcuts-overview__keyboard-shortcut.-no-stroke{border-bottom:0}.umb-keyboard-shortcuts-overview__description{margin-right:10px;font-size:13px;font-weight:bold}.umb-keyboard-keys{display:-ms-flexbox;display:flex;font-size:12px;list-style:none;-ms-flex-align:center;align-items:center}.umb-keyboard-key-wrapper{display:-ms-flexbox;display:flex;margin-right:5px;-ms-flex-align:center;align-items:center}.umb-keyboard-key{padding:1px 7px;margin-right:5px;color:#555;background:#fff;border:1px solid #d9d9d9;border-radius:5px}.umb-checkbox-list{margin-left:0;list-style:none}.umb-checkbox-list__item{display:-ms-flexbox;display:flex;margin-bottom:2px;-ms-flex-align:center;align-items:center}.umb-checkbox-list__item:last-child{border-bottom:0}.umb-checkbox-list__item:hover{background-color:#f8f8f8}.umb-checkbox-list__item.-selected,.umb-checkbox-list__item.-disabled{font-weight:bold;background-color:rgba(0,100,205,0.04)}.umb-checkbox-list__item-checkbox{display:-ms-flexbox;display:flex;height:30px;margin-right:10px;-ms-flex-pack:center;justify-content:center;-ms-flex-align:center;align-items:center;-ms-flex:0 0 30px;flex:0 0 30px}.umb-checkbox-list__item-checkbox.-selected{background:#2e8aea}.umb-checkbox-list__item-icon{margin-right:5px}.umb-checkbox-list__item-text{margin-bottom:0;font-size:13px;-ms-flex:1 1 auto;flex:1 1 auto}.umb-checkbox-list__item-text.-faded{opacity:.5}.umb-checkbox-list__item.-disabled .umb-checkbox-list__item-text{cursor:not-allowed}.umb-checkbox-list__item-caption{margin-left:2px;font-size:11px}.umb-checkbox-list__no-data{padding-top:50px;font-size:16px;line-height:1.8em;color:#ccc;text-align:center}.umb-locked-field{position:relative;display:block;font-size:13px;color:#ccc}.umb-locked-field__wrapper{display:-ms-flexbox;display:flex;margin-bottom:5px;-ms-flex-align:center;align-items:center}.umb-locked-field__toggle{margin-right:3px}.umb-locked-field__toggle:hover,.umb-locked-field__toggle:focus{text-decoration:none}.umb-locked-field__lock-icon{color:#ccc;transition:color .25s}.umb-locked-field__lock-icon.-unlocked{color:#515151}input.umb-locked-field__input{padding:0;margin-bottom:0;font-size:13px;color:#ccc;background:rgba(255,255,255,0);border-color:transparent!important;transition:color .25s}input.umb-locked-field__input:focus{box-shadow:none!important}input.umb-locked-field__input.-unlocked{color:#515151}.umb-nav-tabs{position:absolute;z-index:10}.umb-nav-tabs.-padding-left{padding-left:20px}.umb-tab-content{position:relative;top:22px;padding-top:20px;border-top:1px solid #d9d9d9}.umb-load-indicator{position:absolute;top:50%;left:50%;padding:0;margin:0;margin-top:-6px;margin-left:-6px;font-size:0;list-style:none;transform:translate(-50%,-50%)}.umb-load-indicator__bubble{position:absolute;top:50%;left:0;width:0;width:6px;height:0;height:6px;margin:0;border:2px solid #2e8aea;border-radius:100%;transform:transformZ(0);animation:umbLoadIndicatorAnimation 1.4s infinite}.umb-load-indicator__bubble:nth-child(1n){left:-16px;animation-delay:0s}.umb-load-indicator__bubble:nth-child(2n){left:0;animation-delay:.15s}.umb-load-indicator__bubble:nth-child(3n){left:16px;animation-delay:.30s}@keyframes umbLoadIndicatorAnimation{0%{background:#2e8aea;transform:scale(0.5)}50%{background:white;transform:scale(1)}100%{background:#2e8aea;transform:scale(0.5)}}.umb-breadcrumbs{display:-ms-flexbox;display:flex;margin-bottom:0;margin-left:0;list-style:none;-ms-flex-wrap:wrap;flex-wrap:wrap}.umb-breadcrumbs__ancestor{display:-ms-flexbox;display:flex}.umb-breadcrumbs__ancestor-link,.umb-breadcrumbs__ancestor-text{max-width:150px;overflow:hidden;font-size:11px;color:#555;text-overflow:ellipsis;white-space:nowrap}.umb-breadcrumbs__ancestor-link{text-decoration:underline}.umb-breadcrumbs__ancestor-link:hover{color:#000}.umb-breadcrumbs__seperator{position:relative;top:1px;margin-right:5px;margin-left:5px;color:#ccc}.umb-media-grid{display:-ms-flexbox;display:flex;width:100%;margin-bottom:30px;-ms-flex-direction:row;flex-direction:row;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:center;align-items:center}.umb-media-grid__item{position:relative;display:-ms-flexbox;display:flex;margin:10px;overflow:hidden;cursor:pointer;box-shadow:0 1px 1px 0 rgba(0,0,0,0.2);transition:box-shadow 100ms;-ms-flex-direction:column;flex-direction:column;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-pack:center;justify-content:center;-ms-flex-line-pack:center;align-content:center;-ms-flex-align:center;align-items:center;-ms-flex-item-align:stretch;align-self:stretch}.umb-media-grid__item.-file{background-color:#f8f8f8}.umb-media-grid__item.-selected{box-shadow:0 2px 8px 0 rgba(0,0,0,0.35)}.umb-media-grid__item:hover{text-decoration:none}.umb-media-grid__item-image{position:relative;height:auto;max-width:100%!important}.umb-media-grid__item-image-placeholder{position:relative;width:100%;height:auto;max-width:100%}.umb-media-grid__image-background{position:absolute;top:0;right:0;bottom:0;left:0;background:url("../img/checkered-background.png");background-repeat:repeat;content:"";opacity:.5}.umb-media-grid__item-overlay{position:absolute;right:0;bottom:0;left:0;z-index:100;display:-ms-flexbox;display:flex;padding:5px 10px;overflow:hidden;font-size:11px;color:white;white-space:nowrap;background:#2e8aea;opacity:0;box-sizing:border-box;transition:opacity 150ms}.umb-media-grid__item.-file .umb-media-grid__item-overlay{color:#555;background:#f8f8f8;opacity:1}.umb-media-grid__item.-file:hover .umb-media-grid__item-overlay,.umb-media-grid__item.-file.-selected .umb-media-grid__item-overlay{color:#fff;background:#2e8aea}.umb-media-grid__info{margin-right:5px}.umb-media-grid__item-overlay.-locked{opacity:1}.umb-media-grid__item:hover .umb-media-grid__item-overlay{opacity:1}.umb-media-grid__item-name{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.umb-media-grid__item-icon{position:absolute;top:45%;left:50%;font-size:40px!important;color:#555;transform:translate(-50%,-50%)}.umb-media-grid__checkmark{position:absolute;top:10px;right:10px;z-index:2;display:-ms-flexbox;display:flex;width:25px;height:25px;margin-left:7px;color:#fff;background:#2e8aea;border:1px solid #fff;border-radius:50px;box-sizing:border-box;transition:background 100ms;-ms-flex-pack:center;justify-content:center;-ms-flex-align:center;align-items:center}.umb-folder-grid{display:-ms-flexbox;display:flex;width:100%;margin-bottom:30px;-ms-flex-direction:row;flex-direction:row;-ms-flex-wrap:wrap;flex-wrap:wrap}.umb-folder-grid__folder{position:relative;display:-ms-flexbox;display:flex;padding:10px 20px;margin:5px;cursor:pointer;background:#f8f8f8;border:1px solid transparent;box-sizing:border-box;transition:border .2s;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-ms-flex-align:center;align-items:center;-ms-flex:1 1 200px;flex:1 1 200px;-ms-flex-pack:justify;justify-content:space-between}.umb-folder-grid__folder:focus,.umb-folder-grid__folder:active{text-decoration:none}.umb-folder-grid__folder:hover{text-decoration:none;background-color:#ebebeb}.umb-folder-grid__folder-description{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center}.umb-folder-grid__folder-icon,.umb-folder-grid__folder-icon[class^="icon-"],.umb-folder-grid__folder-icon[class*=" icon-"]{margin-right:15px;font-size:20px;color:#000}.umb-folder-grid__folder-name{font-size:13px;font-weight:bold;color:#000}.umb-folder-grid__folder-name:hover{text-decoration:underline}.umb-folder-grid__action{display:-ms-flexbox;display:flex;width:25px;height:25px;margin-left:7px;color:#fff;cursor:pointer;background:rgba(0,0,0,0.4);border:1px solid #fff;border-radius:50px;opacity:0;box-sizing:border-box;-ms-flex-pack:center;justify-content:center;-ms-flex-align:center;align-items:center}.umb-folder-grid__action.-selected{background:#2e8aea;opacity:1}.umb-content-grid{display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-pack:center;justify-content:center}.umb-content-grid__item{position:relative;margin:10px;cursor:pointer;background:#f8f8f8;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-ms-flex:0 1 200px;flex:0 1 200px}.umb-content-grid__item.-selected{box-shadow:0 2px 8px 0 rgba(0,0,0,0.35)}.umb-content-grid__icon-container{display:-ms-flexbox;display:flex;height:75px;background:#ebebeb;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center}.umb-content-grid__icon,.umb-content-grid__icon[class^="icon-"],.umb-content-grid__icon[class*=" icon-"]{font-size:40px;color:#888}.umb-content-grid__icon.-light{color:#d9d9d9}.umb-content-grid__content{padding:15px;box-sizing:border-box}.umb-content-grid__item-name{display:inline-block;padding-bottom:10px;margin-bottom:10px;font-weight:bold;line-height:1.4em;color:black;border-bottom:1px solid #d9d9d9}.umb-content-grid__item-name:hover{text-decoration:underline}.umb-content-grid__item-name.-light{color:#d9d9d9}.umb-content-grid__details-list{margin-bottom:0;margin-left:0;font-size:11px;list-style:none}.umb-content-grid__details-list.-light{color:#d9d9d9}.umb-content-grid__details-label{display:inline-block;font-weight:bold}.umb-content-grid__details-value{display:inline-block}.umb-content-grid__checkmark{position:absolute;top:10px;right:10px;display:-ms-flexbox;display:flex;width:25px;height:25px;color:#fff;cursor:pointer;background:#2e8aea;border:1px solid #fff;border-radius:50px;box-sizing:border-box;-ms-flex-pack:center;justify-content:center;-ms-flex-align:center;align-items:center}.umb-content-grid__item:hover .umb-content-grid__action:not(.-selected){opacity:1;animation:fadeIn;animation-duration:.2s;animation-timing-function:ease-in-out}.umb-content-grid__no-items{padding-top:50px;padding-bottom:50px;font-size:16px;font-weight:bold;color:#d9d9d9}.umb-layout-selector{position:relative;display:inline-block}.umb-layout-selector__active-layout{display:-ms-flexbox;display:flex;width:30px;height:30px;font-size:20px;cursor:pointer;border:1px solid transparent;box-sizing:border-box;-ms-flex-pack:center;justify-content:center;-ms-flex-align:center;align-items:center}.umb-layout-selector__active-layout:hover{border-color:#d9d9d9}.umb-layout-selector__dropdown{position:absolute;left:50%;z-index:999;display:-ms-flexbox;display:flex;padding:5px;background:#333;background:#fff;transform:translate(-50%,0);-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-direction:column;flex-direction:column}.umb-layout-selector__dropdown-item{display:-ms-flexbox;display:flex;padding:5px;margin:3px 5px;cursor:pointer;border:1px solid transparent;-ms-flex-line-pack:center;align-content:center;-ms-flex-pack:center;justify-content:center;-ms-flex-direction:column;flex-direction:column}.umb-layout-selector__dropdown-item:hover{border:1px solid #d9d9d9}.umb-layout-selector__dropdown-item.-active{border:1px solid #2e8aea}.umb-layout-selector__dropdown-item-icon,.umb-layout-selector__dropdown-item-icon[class^="icon-"],.umb-layout-selector__dropdown-item-icon[class*=" icon-"]{font-size:20px;color:#555;text-align:center}.umb-tooltip{position:fixed;z-index:1000;display:-ms-flexbox;display:flex;max-width:200px;padding:10px;margin-top:15px;font-size:12px;background:#fff;animation:fadeIn;animation-duration:.1s;animation-timing-function:ease-in}.umb-tooltip-list{padding:10px;margin-bottom:0;margin-left:0;list-style:none}.umb-tooltip-list__item{margin-bottom:5px}.umb-tooltip-list__item:last-child{margin-bottom:0}.umb-tooltip-list__item-label{margin-bottom:-3px;font-weight:bold}.umb-overlay-backdrop{position:fixed;top:0;left:0;z-index:2000;width:100%;height:100%;background-color:rgba(255,255,255,0.5);animation:fadeIn .2s}.umb-grid IFRAME{overflow:hidden}.umb-grid .ui-sortable-helper{position:absolute!important;width:42px!important;height:42px!important;padding:5px;overflow:hidden;font-family:"icomoon";text-align:center;background-color:#2e8aea!important;border-radius:2px;box-shadow:3px 3px 12px 0 rgba(50,50,50,0.45)}.umb-grid .ui-sortable-helper:after{font-size:22px;line-height:42px;color:#fff;content:"\e126"}.umb-grid .ui-sortable-helper *{display:none}.umb-grid .ui-sortable-helper .umb-row-title-bar,.umb-grid .ui-sortable-helper .cell-tools-add{display:none!important}.umb-grid .ui-sortable-placeholder{position:absolute;right:0;left:0;height:2px;margin-bottom:20px;background-color:#2e8aea}.umb-grid .ui-sortable-placeholder:before,.umb-grid .ui-sortable-placeholder:after{position:absolute;top:-9px;font-family:"icomoon";font-size:18px;color:#2e8aea}.umb-grid .ui-sortable-placeholder:before{left:-5px;content:"\e0e9"}.umb-grid .ui-sortable-placeholder:after{right:-5px;content:"\e0d7"}.umb-grid .umb-cell .ui-sortable-placeholder{right:10px;left:10px}.umb-grid-width{width:100%;margin:20px auto}.umb-grid .right{float:right}.umb-grid .tb{width:100%}.umb-grid .td{display:inline-block;width:100%;vertical-align:top;box-sizing:border-box}.umb-grid .middle{text-align:center}.umb-grid .mainTd{position:relative}.umb-grid .umb-column{position:relative}.umb-grid .umb-row{position:relative;padding-top:10px;margin-bottom:40px}.umb-grid .row-tools a{text-decoration:none}.umb-grid .umb-cell{position:relative}.umb-grid .umb-cell-content{position:relative;display:block;margin:10px;border:1px solid transparent;box-sizing:border-box}.umb-grid .umb-row .umb-cell-placeholder{min-height:130px;background-color:#f8f8f8;border-color:#d9d9d9;border-style:dashed;border-width:2px;transition:border-color 100ms linear}.umb-grid .umb-row .umb-cell-placeholder:hover{cursor:pointer;border-color:#2e8aea}.umb-grid .umb-cell-content.-has-editors{padding-top:38px;background-color:#fff;border-color:#d9d9d9;border-style:solid;border-width:1px}.umb-grid .umb-cell-content.-has-editors:hover{cursor:auto}.umb-grid .umb-cell-content.-has-editors.-collapsed{padding-top:10px}.umb-grid .cell-tools{position:absolute;top:10px;right:10px;font-size:16px;color:#555}.umb-grid .cell-tool{float:right;cursor:pointer}.umb-grid .cell-tool:hover{color:#0064cd}.umb-grid .cell-tools-add{color:#2e8aea}.umb-grid .cell-tools-add:focus,.umb-grid .cell-tools-add:hover{text-decoration:none}.umb-grid .cell-tools-add.-center{position:absolute;top:50%;left:50%;color:#2e8aea;transform:translate(-50%,-50%)}.umb-grid .cell-tools-add.-bar{display:block;padding:5px;margin:10px;text-align:center;background:#f8f8f8;border:1px dashed #ccc}.umb-grid .cell-tools-remove{position:relative;display:inline-block}.umb-grid .cell-tools-remove .iconBox:hover,.umb-grid .cell-tools-remove .iconBox:hover *{background:#9d261d!important;border-color:#9d261d!important}.umb-grid .cell-tools-move{display:inline-block}.umb-grid .cell-tools-edit{display:inline-block;color:#fff}.umb-grid .drop-overlay{position:absolute;top:0;left:0;z-index:10;display:-ms-flexbox;display:flex;width:100%;height:100%;font-size:14px;font-weight:bold;line-height:1.3em;text-align:center;background:#fff;opacity:.9;box-sizing:border-box;-ms-flex-pack:center;justify-content:center;-ms-flex-align:center;align-items:center;-ms-flex-direction:column;flex-direction:column}.drop-overlay.-disable{color:#9d261d}.drop-overlay.-allow{color:#46a546}.umb-grid .drop-overlay .drop-icon{margin-bottom:20px;font-size:40px}.umb-grid .umb-control{position:relative;display:block;margin-right:10px;margin-bottom:10px;margin-left:10px;overflow:hidden}.umb-control-collapsed{padding:5px 10px;cursor:move;background-color:#f8f8f8;border-color:transparent;border-style:solid;border-width:1px}.umb-control-collapsed:hover{border-color:#2e8aea}.umb-grid .umb-control-click-overlay{position:absolute;top:0;left:0;z-index:5;width:100%;height:100%;cursor:pointer;opacity:0}.umb-grid .umb-control-click-overlay:hover{background-color:#2e8aea;opacity:.1;transition:opacity .1s}.umb-grid .umb-row-title-bar{display:-ms-flexbox;display:flex;padding-right:10px;padding-left:10px}.umb-grid .umb-row-title{display:inline-block;margin-right:6px;font-size:15px;font-weight:bold;color:#000;cursor:pointer}.umb-grid .row-tools{display:inline-block;margin-left:10px;font-size:18px;color:#555}.umb-grid .row-tool{cursor:pointer}.umb-grid .umb-add-row{text-align:center}.umb-grid .umb-control-placeholder{position:relative;min-height:20px;text-align:center;text-align:-moz-center;cursor:text}.umb-grid .umb-control-placeholder .placeholder{height:20px;padding:5px;font-size:14px;text-align:left;border:1px solid rgba(182,182,182,0.3);opacity:.7}.umb-grid .umb-control-placeholder:hover .placeholder{border:1px solid rgba(182,182,182,0.8)}.umb-grid .umb-editor-placeholder{position:relative;min-height:65px;padding:20px;padding-bottom:30px;text-align:center;text-align:-moz-center;cursor:pointer;background-color:#fff;border:4px dashed #d9d9d9}.umb-grid .umb-editor-placeholder i{display:block;margin-bottom:10px;font-size:85px;line-height:85px;color:#d9d9d9}.umb-grid .umb-row.-active{background-color:#2e8aea}.umb-grid .umb-row.-active .umb-row-title-bar{cursor:move}.umb-grid .umb-row.-active .row-tool,.umb-grid .umb-row.-active .umb-row-title{color:#fff}.umb-grid .umb-row.-active .umb-grid-has-config{color:rgba(255,255,255,0.66)}.umb-grid .umb-row.-active .umb-cell .umb-grid-has-config{color:rgba(0,0,0,0.44)}.umb-grid .umb-row.-active .umb-cell .umb-cell-content{border-color:transparent}.umb-grid .umb-row.-active-child{background-color:#f8f8f8}.umb-grid .umb-row.-active-child .umb-row-title-bar{cursor:default}.umb-grid .umb-row.-active-child .umb-row-title{color:#555}.umb-grid .umb-row.-active-child .row-tool{color:rgba(0,0,0,0.23)}.umb-grid .umb-row.-active-child .umb-grid-has-config{color:rgba(0,0,0,0.44)}.umb-grid .umb-row.-active-child .umb-cell-content.-placeholder{border-color:#d9d9d9}.umb-grid .umb-row.-active-child .umb-cell-content.-placeholder:hover{border-color:rgba(85,85,85,0.44)}.umb-grid .umb-row .umb-cell.-active{border-color:#d9d9d9}.umb-grid .umb-row .umb-cell.-active .umb-cell-content.-has-editors{border-color:#2e8aea;box-shadow:3px 3px 6px rgba(0,0,0,0.07)}.umb-grid .umb-row .umb-cell.-active-child .cell-tool{color:rgba(0,0,0,0.23)}.umb-grid .umb-row .umb-cell.-active-child .umb-cell-content.-has-editors{border-color:rgba(113,136,160,0.44)}.umb-grid .umb-row-title-bar{display:-ms-flexbox;display:flex}.umb-grid .umb-grid-right{display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;-ms-flex-pack:center;justify-content:center}.umb-grid .umb-tools{margin-left:auto}.umb-grid-add-more-content{text-align:center}.umb-grid .newbtn{display:inline-block;width:auto;padding:6px 15px;margin:10px auto 20px;font-size:12px;font-weight:bold;border-color:#e2e2e2;border-style:solid}.umb-grid .newbtn:hover{cursor:pointer;opacity:.77}.umb-grid textarea.textstring{display:block;overflow:hidden;color:#555;background:#fff;border:0;outline:0;resize:none}.umb-grid .umb-cell-rte textarea{display:none!important}.umb-grid .umb-cell-media .caption{display:block;width:98%;overflow:hidden;font-style:italic;background:#fff;border:0;outline:0;resize:none}.umb-grid .cellPanelRte{min-height:60px}.umb-grid .umb-cell-embed iframe{width:100%}.umb-grid .umb-cell-rte{border-color:transparent}.umb-grid .iconBox{display:inline-block;padding:4px 6px;margin:2px;cursor:pointer;background:#fff;border:1px solid #b6b6b6;border-radius:200px}.umb-grid .iconBox:hover,.umb-grid .iconBox:hover *{color:white!important;text-decoration:none;background:#2e8aea!important;border-color:#2e8aea!important}.umb-grid .iconBox span.prompt{display:block;text-align:center;white-space:nowrap}.umb-grid .iconBox span.prompt>a{text-decoration:underline}.umb-grid .iconBox a:hover{color:white!important;text-decoration:none}.umb-grid .iconBox.selected{background:transparent;background-image:linear-gradient(to bottom,#e6e6e6,#bfbfbf);background-repeat:repeat-x;border-color:#bfbfbf #bfbfbf #999;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);border-radius:3px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe6e6e6',endColorstr='#ffbfbfbf',GradientType=0);zoom:1;box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);-webkit-appearance:none}.umb-grid .iconBox i{display:block;font-size:16px!important;color:#5f5f5f}.umb-grid .help-text{display:inline-block;clear:both;font-size:14px;font-weight:bold;color:#000}.umb-grid .mce-panel{clear:both;background:transparent!important;border:none!important}.umb-grid .mce-btn button{padding:8px 6px;line-height:inherit}.umb-grid .mce-toolbar{display:none;background-color:#fafafa;border-bottom:1px solid rgba(207,207,207,0.7)}.umb-grid .umb-control.-active .mce-toolbar{display:block}.umb-grid .mce-flow-layout-item{margin:0}.umb-grid .mceContentBody{overflow-y:hidden!important}.umb-grid .fullSizeImage{width:100%}.umb-grid .boxWidth{margin-bottom:10px;text-align:right}.umb-grid .boxWidth input{width:40px;text-align:center}.umb-grid .boxWidth label{padding:0;margin:5px 5px 0 0;font-size:10px;color:#808080}.umb-grid .umb-control{border-color:transparent;border-style:solid;border-width:1px}.umb-grid .umb-control.-active{border-color:#2e8aea}.umb-grid .umb-templates-columns{margin-top:30px}.umb-grid .umb-control-inner{position:relative}.umb-grid .umb-control-bar{display:-ms-flexbox;display:flex;height:0;padding:2px 5px;font-size:10px;color:#fff;background:#2e8aea;opacity:0;transition:height 80ms linear,opacity 80ms linear;-ms-flex-align:center;align-items:center}.umb-grid .umb-control-title{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center}.umb-grid .umb-control.-active .umb-control-bar{height:25px;cursor:move;opacity:1}.umb-grid .umb-control-tools{display:inline-block;margin-left:10px}.umb-grid .umb-control-tool{position:relative;display:inline-block;margin-right:5px;font-size:16px;cursor:pointer}.umb-grid .umb-templates{width:100%;overflow:hidden;text-align:center}.umb-grid .umb-templates-template{display:inline-block;width:100px;padding-right:30px;margin:20px}.umb-grid .umb-templates-template a.tb:hover{border:5px solid #2e8aea}.umb-grid .umb-templates-template .tb{position:relative;width:100%;height:150px;padding:10px;cursor:pointer;background-color:#f8f8f8;border:5px solid #d9d9d9}.umb-grid .umb-templates-template .tr{position:relative;height:100%}.umb-grid .umb-templates-template .tb .umb-templates-column{height:100%;border:1px dashed #d9d9d9;border-right:0}.umb-grid .umb-templates-template .tb .umb-templates-column.last{border-right:1px dashed #d9d9d9!important}.umb-grid a.umb-templates-column:hover,.umb-grid a.umb-templates-column.selected{background-color:#2e8aea}.umb-grid .templates-preview{display:inline-block;width:100%;text-align:center}.umb-grid .templates-preview small{position:absolute;bottom:-25px;left:0;width:100%;padding-top:15px}.umb-grid .templates-preview .help-text{margin:35px 35px 0 0}.umb-grid .preview-rows{position:relative;display:inline-block;width:125px;margin:15px;border:3px solid #d9d9d9;box-sizing:border-box;transition:border 100ms linear}.umb-grid .preview-rows.prevalues-rows{float:left;width:80px;margin:0 20px 20px 0}.umb-grid .preview-rows.prevalues-templates{float:left;margin:0 20px 20px 0}.umb-grid .preview-rows:hover{cursor:pointer;border-color:#2e8aea}.umb-grid .preview-rows .preview-row{display:inline-block;width:100%;vertical-align:bottom}.umb-grid .preview-rows.layout{padding:2px}.umb-grid .preview-rows.layout .preview-row{height:100%}.umb-grid .preview-rows.layout .preview-col{height:180px}.umb-grid .preview-rows.layout .preview-cell{background-color:#f8f8f8}.umb-grid .preview-rows.layout .preview-overlay{display:none}.umb-grid .preview-rows.columns{min-height:16px;padding:1px;line-height:11px}.umb-grid .preview-rows.columns.prevalues-rows{min-height:30px}.umb-grid .preview-rows .preview-col{display:block;float:left;width:33.3%;height:10px;margin:0;border:1px solid #fff;box-sizing:border-box}.umb-grid .preview-rows .preview-col .preview-cell{display:block;width:100%;height:100%;margin:0 1px 1px 0;background-color:#d9d9d9}.umb-grid .preview-rows.prevalues-templates .preview-col{height:80px}.umb-grid .preview-overlay{position:absolute;top:0;left:0;display:block;width:100%;height:100%;border:3px solid white;box-sizing:border-box}.umb-grid .umb-grid-has-config{display:inline;font-size:12px;color:rgba(0,0,0,0.44)}.umb-grid .umb-cell .umb-grid-has-config{position:absolute;top:10px;left:10px}.umb-grid .cell-tools-menu{position:absolute;top:0;left:50%;z-index:6660;width:360px;height:380px;padding:7px;margin-top:-270px;margin-left:-150px;overflow:auto;background:#fff;border:1px solid #ccc;box-shadow:3px 3px 12px 0 rgba(50,50,50,0.45)}.umb-grid .cell-tools-menu h5{padding:10px;margin-top:0;color:#999;border-bottom:1px solid #d9d9d9}.umb-grid .elements{display:block;padding:0;margin:0}.umb-grid .elements li{display:inline-block;width:90px;height:80px;padding:5px;margin:5px;overflow:hidden;font-size:11px}.umb-grid .elements li:hover,.umb-grid .elements li:hover *{color:#fff;background:#2e8aea}.umb-grid .elements a{color:#222;text-decoration:none}.umb-grid .elements i{display:block;font-size:30px;line-height:50px;color:#999}.umb-grid-configuration .umb-templates{text-align:left}.umb-grid-configuration ul{display:block}.umb-grid-configuration ul li{display:block;width:auto;text-align:left}.umb-grid-configuration .umb-templates .umb-templates-template .tb{max-height:50px;padding:0;overflow:hidden;border-spacing:2px;border-width:2px!important}.umb-grid-configuration .umb-templates .umb-templates-template span{display:inline-block;background:#d9d9d9}.umb-grid-configuration .umb-templates .umb-templates-template .tb:hover{border-width:2px!important}.umb-grid-configuration .umb-templates-column{display:block;float:left;margin-left:-1px;background:#d9d9d9;border:1px white solid!important}.umb-grid-configuration .umb-templates-column.last{margin-right:-1px}.umb-grid-configuration .umb-templates-column.add{font-size:20px;line-height:70px;color:#ccc;text-align:center;text-decoration:none;background:#fff}.umb-grid-configuration .mainTdpt{height:initial;border:0}.umb-grid-configuration .umb-templates-rows .umb-templates-row{width:60px;margin:0 50px 20px 0}.umb-grid-configuration .umb-templates-rows .umb-templates-row .tb{padding:0;border-spacing:2px;border-width:2px!important}.umb-grid-configuration .umb-templates-rows .mainTdpt{height:10px!important}.umb-grid-configuration a.umb-templates-column{height:70px!important}.umb-empty-state{font-size:16.099999999999998px;line-height:1.8em;color:#7f7f7f;text-align:center}.umb-empty-state.-small{font-size:11.9px}.umb-empty-state.-large{font-size:17.5px}.umb-empty-state.-center{position:absolute;top:50%;left:50%;width:80%;max-width:400px;transform:translate(-50%,-50%)}.umb-property-editor.-not-clickable{pointer-events:none}.umb-iconpicker{display:-ms-flexbox;display:flex;margin:0;-ms-flex-direction:row;flex-direction:row;-ms-flex-wrap:wrap;flex-wrap:wrap}.umb-iconpicker-item{display:-ms-flexbox;display:flex;margin-bottom:0;overflow:hidden;-ms-flex-direction:row;flex-direction:row;-ms-flex:0 0 14.28%;flex:0 0 14.28%;-ms-flex-pack:center;justify-content:center;-ms-flex-align:center;align-items:center}.umb-iconpicker-item a{display:-ms-flexbox;display:flex;width:100%;height:100%;padding:15px 0;text-decoration:none;-ms-flex-pack:center;justify-content:center;-ms-flex-align:center;align-items:center}.umb-iconpicker-item a:hover,.umb-iconpicker-item a:focus{background:#f5f5f5;outline:0}.umb-iconpicker-item a:active{background:#eee}.umb-iconpicker-item i{font-size:30px}.umb-packages-view-title{margin-bottom:30px;font-size:20px;font-weight:bold;color:#000}.umb-packages-view-wrapper{padding:20px 60px}@media(max-width:768px){.umb-packages-view-wrapper{padding:0}}.umb-packages-section{margin-bottom:40px}.umb-packages-search{width:100%;padding:30px;background:#f8f8f8;border-radius:3px;box-sizing:border-box}.umb-packages-search input{min-height:44px;padding:4px 10px;margin-bottom:0;font-size:16px;border-color:#ececec;border-color:#d9d9d9;border-width:2px;border-radius:3px}.umb-packages-search input:hover,.umb-packages-search input:focus{border-color:#d9d9d9}.umb-packages__pagination{display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center}.umb-packages{display:-ms-flexbox;display:flex;margin:0 -10px;-ms-flex-wrap:wrap;flex-wrap:wrap}.umb-package{max-width:100%;padding:10px;box-sizing:border-box;-ms-flex:0 0 100%;flex:0 0 100%}@media(min-width:768px){.umb-package{max-width:50%;-ms-flex:0 0 50%;flex:0 0 50%}}@media(min-width:1200px){.umb-package{max-width:33.33%;-ms-flex:0 0 33.33%;flex:0 0 33.33%}}@media(min-width:1400px){.umb-package{max-width:25%;-ms-flex:0 0 25%;flex:0 0 25%}}@media(min-width:1700px){.umb-package{max-width:20%;-ms-flex:0 0 20%;flex:0 0 20%}}@media(min-width:1900px){.umb-package{max-width:16.66%;-ms-flex:0 0 16.66%;flex:0 0 16.66%}}@media(min-width:2200px){.umb-package{max-width:14.28%;-ms-flex:0 0 14.28%;flex:0 0 14.28%}}.umb-package-link{position:relative;display:block;width:100%;height:100%;text-decoration:none!important;border:1px solid #ececec;border-radius:3px;box-sizing:border-box;transition:border-color 100ms ease;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:center;justify-content:center}.umb-package-link:hover{border-color:#2e8aea}.umb-package-icon{display:-ms-flexbox;display:flex;min-height:60px;padding-top:10px;padding-right:10px;padding-bottom:10px;padding-left:10px;text-align:center;background-color:white;border-top-right-radius:3px;border-top-left-radius:3px;-ms-flex-pack:center;justify-content:center;-ms-flex-align:center;align-items:center}.umb-package-icon img{width:70px;height:auto;max-width:70px}.umb-package-info{padding-top:15px;padding-right:15px;padding-bottom:15px;padding-left:15px;text-align:center;background:#f8f8f8;border-top:1px solid #ececec;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.umb-package-name{max-width:250px;margin-right:auto;margin-bottom:5px;margin-left:auto;overflow:hidden;font-size:14px;font-weight:bold;line-height:normal;text-overflow:ellipsis;white-space:nowrap}.umb-package-description{max-width:100%;overflow:hidden;font-size:11px;line-height:1.1rem;color:#7f7f7f;text-overflow:ellipsis;word-wrap:break-word;white-space:nowrap}.umb-package-numbers{display:-ms-flexbox;display:flex;margin-top:10px;opacity:.6;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-direction:row;flex-direction:row;-ms-flex-pack:center;justify-content:center}.umb-package-numbers small{display:-ms-flexbox;display:flex;padding:0 5px;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center}.umb-package-numbers i{font-size:14px}.umb-package-link:hover .umb-package-numbers{opacity:1}.umb-package-link:hover .umb-package-numbers .icon-hearts{color:red!important}.umb-package-version{display:-ms-inline-flexbox;display:inline-flex;padding:1px 5px;font-size:11px;font-weight:bold;color:black;background:#ececec;border-radius:3px}.umb-era-button{display:-ms-flexbox;display:flex;height:38px;max-width:100%;padding:0 18px;overflow:hidden;font-size:14px;font-weight:bold;line-height:1;color:#484848;text-decoration:none!important;white-space:nowrap;cursor:pointer;background-color:#e0e0e0;border:0 none;border-radius:3px;box-sizing:border-box;transition:background-color 80ms ease,color 80ms ease;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-ms-flex-pack:center;justify-content:center;-ms-flex-align:center;align-items:center}.umb-era-button:hover,.umb-era-button:active{color:#484848;text-decoration:none;background-color:#d3d3d3;outline:0}.umb-era-button:focus{outline:0}.umb-era-button.-blue{color:white;background:#2e8aea}.umb-era-button.-blue:hover{background-color:#0064cd}.umb-era-button.-link{padding:0;background:transparent}.umb-era-button.-link:hover{background-color:transparent;opacity:.6}.umb-era-button.-inactive{color:#BBB;cursor:not-allowed;background:#eae7e7}.umb-era-button.-inactive:hover{color:#BBB;background:#eae7e7}.umb-era-button.-full-width{display:block;width:100%}.umb-era-button.umb-button--s{height:30px;font-size:13px}.umb-packages-categories{display:-ms-flexbox;display:flex;-webkit-user-select:center;-moz-user-select:center;-ms-user-select:center;user-select:center;-ms-flex-wrap:wrap;flex-wrap:wrap}.umb-packages-category{display:-ms-flexbox;display:flex;max-width:25%;padding:10px 0;font-size:14px;font-weight:bold;color:#000;border-top:1px solid #d9d9d9;border-right:1px solid #d9d9d9;border-bottom:1px solid #d9d9d9;box-sizing:border-box;-ms-flex-align:center;align-items:center;-ms-flex:1 0 auto;flex:1 0 auto;-ms-flex-pack:center;justify-content:center}@media(max-width:768px){.umb-packages-category{width:100%;margin-top:0;margin-right:0!important;margin-bottom:15px!important;margin-left:0!important}}@media(max-width:992px){.umb-packages-category{max-width:100%;padding:10px;margin:5px;text-align:center;border:1px solid #d9d9d9;border-radius:3px;-ms-flex:0 0 auto;flex:0 0 auto}}@media(min-width:1100px) and (max-width:1300px){.umb-packages-category{max-width:100%;padding:10px;margin:5px;text-align:center;border:1px solid #d9d9d9;border-radius:3px;-ms-flex:0 0 auto;flex:0 0 auto}}.umb-packages-category:hover,.umb-packages-category.-active{color:#2e8aea;text-decoration:none}.umb-packages-category.-first{border-left:1px solid #d9d9d9;border-bottom-left-radius:3px;border-top-left-radius:3px}.umb-packages-category.-last{border-right:1px solid #d9d9d9;border-top-right-radius:3px;border-bottom-right-radius:3px}.umb-package-details{display:-ms-flexbox;display:flex}a.umb-package-details__back-link{font-weight:bold;color:#000}.umb-package-details__back-link:hover{color:#7f7f7f;text-decoration:none}.umb-package-details__main-content{width:calc(100% - 350px - 40px);margin-right:40px;-ms-flex:1 1 auto;flex:1 1 auto}.umb-package-details__sidebar{-ms-flex:0 0 350px;flex:0 0 350px}@media(max-width:768px){.umb-package-details{-ms-flex-direction:column;flex-direction:column}.umb-package-details__main-content{width:100%;margin-right:0;margin-bottom:30px;-ms-flex:1 1 auto;flex:1 1 auto}.umb-package-details__sidebar{width:100%;-ms-flex:1 1 auto;flex:1 1 auto}}.umb-package-details__section{padding:20px;margin-bottom:20px;background:#f8f8f8;border-radius:3px}.umb-package-details__section-title{margin-top:0;margin-bottom:15px;font-size:17px;font-weight:bold;color:black}.umb-package-details__section-description{margin-bottom:15px;font-size:12px;line-height:1.6em}.umb-package-details__information-item{margin-bottom:10px;font-size:13px}.umb-package-details__information-item-label{font-weight:bold;color:black}.umb-package-details__information-item-content{word-break:break-word}.umb-package-details__information-item-label-2{font-size:12px;color:#7f7f7f}.umb-package-details__compatability{margin-bottom:15px}.umb-package-details__compatability-label{margin-bottom:3px}.umb-package-details__description{margin-bottom:20px;line-height:1.6em}.umb-package-details__description p{margin-bottom:20px}.umb-package-details__link{color:#da3287}.umb-package-details__link:hover{color:#b32d71;text-decoration:none}.umb-package-details__owner-profile{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center}.umb-package-details__owner-profile-avatar{margin-right:15px;-ms-flex:0 0 auto;flex:0 0 auto}.umb-package-details__owner-profile-name{font-size:15px;font-weight:bold;color:#000}.umb-package-details__owner-profile-karma{font-size:12px;color:#7f7f7f}.umb-gallery__thumbnails{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap}.umb-gallery__thumbnail{max-width:100px;padding:10px;margin:5px;border:1px solid #d9d9d9;border-radius:3px;box-sizing:border-box;-ms-flex:0 1 100px;flex:0 1 100px}.umb-gallery__thumbnail:hover{cursor:pointer;border-color:#2e8aea}.umb-package-list{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}.umb-package-list__item{display:-ms-flexbox;display:flex;padding:20px;margin-bottom:10px;background:#f8f8f8;border-radius:3px;-ms-flex-direction:row;flex-direction:row;-ms-flex-align:center;align-items:center}.umb-package-list__item-icon{margin-right:20px;font-size:30px;text-align:center;-ms-flex:0 0 50px;flex:0 0 50px}.umb-package-list__item-content{margin-right:20px;-ms-flex:1 1 auto;flex:1 1 auto}.umb-package-list__item-name{margin-bottom:5px;font-size:16px;font-weight:bold;color:#000}.umb-package-list__item-description{font-size:14px;color:#7f7f7f}.umb-package-list__item-actions{display:-ms-flexbox;display:flex;-ms-flex:1 1 auto;flex:1 1 auto;-ms-flex-pack:end;justify-content:flex-end}.faded{color:#7f7f7f}.umb-upload-local__dropzone{position:relative;display:-ms-flexbox;display:flex;width:500px;height:300px;margin-bottom:30px;background:#f8f8f8;border:2px dashed #d9d9d9;border-radius:3px;transition:100ms box-shadow ease,100ms border ease;-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:center;justify-content:center;-ms-flex-align:center;align-items:center}.umb-upload-local__dropzone:hover,.umb-upload-local__dropzone.drag-over{border-color:#2e8aea;border-style:solid;box-shadow:0 3px 8px rgba(0,0,0,0.1);transition:100ms box-shadow ease,100ms border ease}.umb-upload-local__dropzone i{display:block;font-size:110px;line-height:1;color:#d9d9d9}.umb-upload-local__select-file{font-weight:bold;color:#2e8aea;cursor:pointer}.umb-upload-local__select-file:hover{text-decoration:underline}.umb-accept-terms{display:-ms-flexbox;display:flex;font-size:13px;-ms-flex-align:center;align-items:center}.umb-package-installer-label .label-text{margin-left:5px}.umb-package-installer-label input[type="radio"],.umb-package-installer-label input[type="checkbox"]{margin-top:0}.umb-package-installer-label{display:-ms-inline-flexbox;display:inline-flex;font-size:13px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-ms-flex-align:center;align-items:center}.umb-info-local-items{display:-ms-flexbox;display:flex;width:100%;max-width:540px;margin:0 20px;background:#f8f8f8;border:2px solid #d9d9d9;border-radius:3px;-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:center;justify-content:center;-ms-flex-align:center;align-items:center}.umb-info-local-items a{text-decoration:underline}.umb-info-local-items a:hover{text-decoration:none}.umb-info-local-items .umb-package-icon{width:100%;min-height:150px;font-size:60px;box-sizing:border-box}.umb-info-local-items .umb-package-icon img{max-width:100px}.umb-info-local-items .umb-package-info{width:100%;padding:20px 40px;box-sizing:border-box}.umb-info-local-item{margin-bottom:20px}.umb-upload-local__dropzone .umb-info-local-item{margin:20px}.umb-lightbox{position:absolute;top:0;right:0;bottom:0;left:0;z-index:999;display:-ms-flexbox;display:flex;width:100%;height:100%;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;-ms-flex-direction:column;flex-direction:column}.umb-lightbox__backdrop{position:absolute;top:0;right:0;bottom:0;left:0;width:100%;height:100%;background:rgba(21,21,23,0.7)}.umb-lightbox__close{position:absolute;top:20px;right:60px}.umb-lightbox__close i{width:40px;height:40px;font-size:20px;cursor:pointer}.umb-lightbox__images{position:relative;z-index:1000}.umb-lightbox__image{padding:10px;background:#fff;border-radius:3px}.umb-lightbox__image img{max-width:50vw;max-height:70vh}.umb-lightbox__control{position:absolute;display:-ms-flexbox;display:flex;width:50px;height:50px;cursor:pointer;background-color:white;border-radius:50%;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center}.umb-lightbox__control.-next{top:50%;right:20px;transform:translate(0,-50%)}.umb-lightbox__control.-prev{top:50%;left:20px;transform:translate(0,-50%)}.umb-lightbox__control-icon{font-size:20px;color:#2e8aea}.umb-avatar{width:50px;height:50px;border-radius:50%}.umb-avatar.-xs{width:30px;height:30px}.umb-avatar.-s{width:40px;height:40px}.umb-avatar.-m{width:50px;height:50px}.umb-avatar.-l{width:70px;height:70px}.umb-avatar.-xl{width:100px;height:100px}.umb-progress-bar{position:relative;display:block;width:100%;height:10px;overflow:hidden;background:#d9d9d9;border-radius:10px;box-sizing:border-box}.umb-progress-bar__progress{position:absolute;top:0;bottom:0;left:0;width:100%;background:#50c878;border-radius:10px}.umb-button{position:relative;overflow:hidden}.umb-button__button:focus{outline:0}.umb-button__content{display:-ms-flexbox;display:flex;opacity:1;transition:opacity .25s ease;-ms-flex-wrap:wrap;flex-wrap:wrap}.umb-button__icon{margin-right:5px}.umb-button__content.-hidden{opacity:0}.umb-button__progress{position:absolute;top:50%;left:50%;z-index:100;width:14px;height:14px;margin-top:-9px;margin-left:-9px;border:2px solid #ccc;border-left-color:#46a546;border-radius:40px;opacity:1;animation:rotating .4s linear infinite;transition:opacity .25s ease}.umb-button__progress.-hidden{z-index:0;opacity:0}.umb-button__progress.-white{border-color:rgba(255,255,255,0.4);border-left-color:#fff}.umb-button__success,.umb-button__error{position:absolute;top:50%;left:50%;z-index:10;font-size:20px;color:#46a546;opacity:1;transform:translate(-50%,-50%);transition:opacity .25s ease}.umb-button__success{color:#46a546}.umb-button__error{color:#9d261d}.umb-button__success.-hidden,.umb-button__error.-hidden{z-index:0;opacity:0}.umb-button__success.-white,.umb-button__error.-white{color:#fff}.umb-button__overlay{position:absolute;z-index:10;width:100%;height:100%;background:#fff;opacity:0}@keyframes rotating{from{transform:rotate(0deg)}to{transform:rotate(360deg)}}.umb-button-group__toggle{padding-right:8px;padding-left:8px;margin-left:-1px}.umb-button-group__sub-buttons.-align-right{right:0;left:auto}.umb-notifications{position:absolute;right:0;bottom:52px;left:0;z-index:1000;padding:0;margin:auto;background:0;border:0;border-bottom:0;border-radius:0}.umb-notifications__notifications{position:relative;margin:0;list-style:none}.umb-notifications__notification{position:relative;padding:5px 20px;margin-bottom:0;font-size:12px;text-shadow:none;border:0;border-radius:0}.umb-notifications__notification.-extra-padding{padding-top:20px;padding-bottom:20px}.umb-file-dropzone-directive .dropzone{position:relative;width:auto;height:400px;padding:50px 0;margin:0 0 20px 0;color:#555;text-align:center;border:1px dashed #d9d9d9;transition:height .8s}.umb-file-dropzone-directive .dropzone .illustration{width:300px}.umb-file-dropzone-directive .dropzone.is-small{height:100px}.umb-file-dropzone-directive .dropzone.is-small .illustration{width:200px}.umb-file-dropzone-directive .dropzone.drag-over{border:1px dashed #343434}.umb-file-dropzone-directive .content{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}.umb-file-dropzone-directive .file-select{margin-top:10px;font-size:15px;color:#2e8aea;cursor:pointer}.umb-file-dropzone-directive .file-select:hover{color:#0064cd;text-decoration:underline}.umb-file-dropzone-directive .file-list{padding:10px 20px;margin:0 0 30px 0;list-style:none;background:#f8f8f8}.umb-file-dropzone-directive .file-list .file{position:relative;display:block;width:100%;padding:5px 0;border-top:1px solid #d9d9d9}.umb-file-dropzone-directive .file-list .file:first-child{border-top:0}.umb-file-dropzone-directive .file-list .file.ng-enter{animation:fadeIn .5s}.umb-file-dropzone-directive .file-list .file.ng-leave{animation:fadeOut 2s}.umb-file-dropzone-directive .file-list .file .file-description{display:block;width:100%;font-size:12px;color:#222}.umb-file-dropzone-directive .file-list .file .file-upload-progress{display:block;width:100%}.umb-file-dropzone-directive .file-list .file .file-icon{position:absolute;right:0;bottom:0}.umb-file-dropzone-directive .file-list .file .file-icon .icon{font-size:20px}.umb-file-dropzone-directive .file-list .file .file-icon .icon.ng-enter{animation:fadeIn .5s}.umb-file-dropzone-directive .file-list .file .file-icon .icon.ng-leave{animation:fadeIn .5s}.umb-file-dropzone-directive .file-progress{position:relative;height:4px;padding:2px}.umb-file-dropzone-directive .file-progress .file-progress-indicator{position:relative;display:block;width:0;height:100%;overflow:hidden;background-color:#2e8aea;border-radius:20px}.flex{display:-ms-flexbox;display:flex}.flex-inline{display:-ms-inline-flexbox;display:inline-flex}.flex-column{-ms-flex-direction:column;flex-direction:column}.flex-wrap{-ms-flex-wrap:wrap;flex-wrap:wrap}.items-start{-ms-flex-align:start;align-items:flex-start}.items-end{-ms-flex-align:end;align-items:flex-end}.items-center{-ms-flex-align:center;align-items:center}.items-baseline{-ms-flex-align:baseline;align-items:baseline}.items-stretch{-ms-flex-align:stretch;align-items:stretch}.self-start{-ms-flex-item-align:start;align-self:flex-start}.self-end{-ms-flex-item-align:end;align-self:flex-end}.self-center{-ms-flex-item-align:center;align-self:center}.self-baseline{-ms-flex-item-align:baseline;align-self:baseline}.self-stretch{-ms-flex-item-align:stretch;align-self:stretch}.justify-start{-ms-flex-pack:start;justify-content:flex-start}.justify-end{-ms-flex-pack:end;justify-content:flex-end}.justify-center{-ms-flex-pack:center;justify-content:center}.justify-between{-ms-flex-pack:justify;justify-content:space-between}.justify-around{-ms-flex-pack:distribute;justify-content:space-around}.content-start{-ms-flex-line-pack:start;align-content:flex-start}.content-end{-ms-flex-line-pack:end;align-content:flex-end}.content-center{-ms-flex-line-pack:center;align-content:center}.content-between{-ms-flex-line-pack:justify;align-content:space-between}.content-around{-ms-flex-line-pack:distribute;align-content:space-around}.content-stretch{-ms-flex-line-pack:stretch;align-content:stretch}.flx-i{-ms-flex:1;flex:1}.flx-g0{-ms-flex-positive:0;flex-grow:0}.flx-g1{-ms-flex-positive:1;flex-grow:1}.flx-s0{-ms-flex-negative:0;flex-shrink:0}.flx-s1{-ms-flex-negative:1;flex-shrink:1}.flx-b0{-ms-flex-preferred-size:0;flex-basis:0}.flx-b1{-ms-flex-preferred-size:10%;flex-basis:10%}.flx-b2{-ms-flex-preferred-size:20%;flex-basis:20%}.flx-b3{-ms-flex-preferred-size:30%;flex-basis:30%}.flx-b4{-ms-flex-preferred-size:40%;flex-basis:40%}.flx-b5{-ms-flex-preferred-size:50%;flex-basis:50%}.flx-b6{-ms-flex-preferred-size:60%;flex-basis:60%}.flx-b7{-ms-flex-preferred-size:70%;flex-basis:70%}.flx-b8{-ms-flex-preferred-size:80%;flex-basis:80%}.flx-b9{-ms-flex-preferred-size:90%;flex-basis:90%}.flx-b10{-ms-flex-preferred-size:100%;flex-basis:100%}.flx-ba{-ms-flex-preferred-size:auto;flex-basis:auto}.flex-auto{min-width:0;min-height:0;-ms-flex:1 1 auto;flex:1 1 auto}.flex-none{-ms-flex:none;flex:none}.m-center{margin-right:auto;margin-left:auto}.mt0{margin-top:0}.mt1{margin-top:.25rem}.mt2{margin-top:.5rem}.mt3{margin-top:1rem}.mt4{margin-top:2rem}.mt5{margin-top:4rem}.mt6{margin-top:8rem}.mt7{margin-top:16rem}.tl{text-align:left}.tr{text-align:right}.tc{text-align:center}.w1{width:1rem}.w2{width:2rem}.w3{width:4rem}.w4{width:8rem}.w5{width:16rem}.w-10{width:10%}.w-20{width:20%}.w-25{width:25%}.w-33{width:33%}.w-34{width:34%}.w-40{width:40%}.w-50{width:50%}.w-60{width:60%}.w-75{width:75%}.w-80{width:80%}.w-100{width:100%}.w-auto{width:auto}.login-overlay{position:absolute;top:0;left:0;z-index:10000;width:100%;height:100%;padding:0;margin:0!important;overflow-y:auto;color:#fff;background:#1d1d1d url(../img/application/logo.png) no-repeat 25px 30px fixed!important;background-size:30px 30px!important;border:0;border-radius:0}@media only screen and (-webkit-min-device-pixel-ratio:1.5),only screen and (min-resolution:144dpi){.login-overlay{background-image:url(../img/application/logo@2x.png)!important}}@media only screen and (-webkit-min-device-pixel-ratio:2),only screen and (min-resolution:192dpi){.login-overlay{background-image:url(../img/application/logo@2x.png)!important}}@media only screen and (-webkit-min-device-pixel-ratio:3),only screen and (min-resolution:3dppx),only screen and (-webkit-min-device-pixel-ratio:3.6458333333333335),only screen and (min-resolution:350dpi){.login-overlay{background-image:url(../img/application/logo@3x.png)!important}}.login-overlay .umb-modalcolumn{background:0;border:0}.login-overlay .form{position:relative;top:100px;left:165px;display:block;width:370px;text-align:right}.login-overlay h1{display:block;font-size:18px;font-weight:normal;color:#fff;text-align:right}.login-overlay .alert{display:inline-block;padding-right:6px;padding-left:6px;margin-top:10px;text-align:center}.login-overlay .switch-view{margin-top:10px}@media(max-width:767px) and (max-height:420px) and (orientation:landscape){.login-overlay .form{top:50px}}@media(max-width:565px){.login-overlay .form{top:60px;right:25px;left:inherit;width:auto;padding-right:25px;padding-left:25px}}@media(max-width:339px){.login-overlay .form input[type="text"],.login-overlay .form input[type="password"]{width:250px}}#hrOr{position:relative;height:30px;padding-top:20px;text-align:center}#hrOr hr{height:1px;margin:0;background-color:#555;border:0}#hrOr div{position:relative;top:-16px;width:20px;height:20px;padding:4px;margin:auto;color:#d9d9d9;background-color:black;border:1px solid #555;border-radius:50%}.login-overlay .text-error,.login-overlay .text-info{font-weight:bold}.umb-editor{min-width:66.6%}.umb-editor-tiny{width:50px}.umb-editor-small{width:90px}.umb-modal .umb-editor{width:95%}.umb-dialog .umb-editor{width:95%}.umb-dialog .umb-control-group .help-block{width:95%}.umb-codeeditor{width:99%}.umb-contentpicker li a:hover .hover-hide,.umb-contentpicker li a .hover-show{display:none}.umb-contentpicker li a:hover .hover-show{display:inline-block}.umb-contentpicker-popover .search-holder{padding:10px}.umb-contentpicker small:not(:last-child){padding-right:3px;border-right:1px solid #7f7f7f}.umb-contentpicker small a{color:#555}div.umb-codeeditor{border:1px solid #e8e8e8}div.umb-codeeditor .umb-el-wrap{padding:0}div.umb-codeeditor .umb-btn-toolbar{padding:0;margin:0;background:#f7f7f7;border-bottom:#e8e8e8 1px solid}.mce-tinymce{border:1px solid #d9d9d9!important;border-radius:0!important}.mce-panel{background:#f8f8f8!important;border-color:#d9d9d9!important}.mce-btn-group,.mce-btn{background:none!important;border:none!important}.mce-ico{font-size:12px!important;color:#1d1d1d!important}.mce-ico.mce-i-custom[class^="icon-"],.mce-ico.mce-i-custom[class*=" icon-"]{font-family:icomoon;font-size:16px!important}.rte-editor-preval .control-group .controls>div>label .mce-ico{line-height:20px}ul.color-picker li{width:60px;padding:2px;margin:3px;border:2px solid transparent}ul.color-picker li.active{border:2px dashed #d9d9d9}ul.color-picker li a{display:block;height:50px;cursor:pointer}.control-group.color-picker-preval .thumbnail{width:30px;border:0}.control-group.color-picker-preval pre{display:inline;margin-right:20px;margin-left:10px}.control-group.color-picker-preval label{padding:6px;border:solid white 1px}.umb-mediapicker .add-link{display:inline-block;width:120px;height:120px;line-height:120px;color:#d9d9d9;text-align:center;text-decoration:none;border:2px #d9d9d9 dashed;transition:all 150ms ease-in-out}.umb-mediapicker .add-link:hover{color:#2e8aea;border-color:#2e8aea}.umb-mediapicker .picked-image{position:absolute;right:10px;bottom:10px;display:none;width:32px;height:32px;overflow:hidden;font-size:24px;line-height:36px;color:red;text-align:center;text-decoration:none;background:white;border-radius:15px;opacity:.5}.umb-thumbnails{position:relative}.umb-thumbnails i{margin:auto}.umb-thumbnails a{border:none!important;outline:0;box-shadow:none!important}.umb-sortable-thumbnails{display:-ms-flexbox;display:flex;padding:0;margin:0;list-style-type:none;-ms-flex-direction:row;flex-direction:row;-ms-flex-wrap:wrap;flex-wrap:wrap}.umb-sortable-thumbnails li{position:relative;display:-ms-flexbox;display:flex;max-width:100%;padding:2px;margin:5px;background:white;border:1px solid #f8f8f8;-ms-flex-direction:row;flex-direction:row;-ms-flex-pack:center;justify-content:center;-ms-flex-align:center;align-items:center;-ms-flex-wrap:wrap;flex-wrap:wrap}.umb-mediapicker .umb-sortable-thumbnails li{padding:5px;margin:0;-ms-flex-direction:column;flex-direction:column}.umb-sortable-thumbnails li:hover a{display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;-ms-flex-align:center;align-items:center}.umb-sortable-thumbnails li img{display:block;max-width:100%;max-height:100%;margin:auto;background-image:url(../img/checkered-background.png)}.umb-sortable-thumbnails li img.noScale{max-width:none!important;max-height:none!important}.umb-sortable-thumbnails .icon-holder{text-align:center}.umb-sortable-thumbnails .icon-holder .icon{display:block;font-size:40px;line-height:50px;color:#555}.umb-sortable-thumbnails .umb-sortable-thumbnails__actions{position:absolute;right:10px;bottom:10px;display:-ms-flexbox;display:flex;text-decoration:none;opacity:0;visibility:hidden;-ms-flex-direction:row;flex-direction:row}.umb-sortable-thumbnails li:hover .umb-sortable-thumbnails__actions{opacity:1;visibility:visible}.umb-sortable-thumbnails .umb-sortable-thumbnails__action{display:-ms-flexbox;display:flex;width:25px;height:25px;margin-left:5px;font-size:16px;color:#222;background:white;border-radius:15px;-ms-flex-pack:center;justify-content:center;-ms-flex-align:center;align-items:center}.umb-sortable-thumbnails .umb-sortable-thumbnails__action.-red{color:red}.umb-sortable-thumbnails .umb-sortable-thumbnails__action:hover{text-decoration:none}.umb-cropper{position:relative}.umb-cropper img,.umb-cropper-gravity img{position:relative;top:0;left:0;height:auto;max-width:100%}.umb-cropper img{max-width:none}.umb-cropper .overlay,.umb-cropper-gravity .overlay{position:absolute;top:0;left:0;z-index:6001;cursor:move}.umb-cropper .viewport{position:relative;height:auto;max-width:100%;margin:auto;overflow:hidden}.umb-cropper-gravity .viewport{position:relative;width:100%;height:100%;overflow:hidden}.umb-cropper .viewport:after{position:absolute;top:0;left:0;z-index:5999;width:100%;height:100%;content:"";-moz-opacity:.75;opacity:.75;filter:alpha(opacity=7);box-shadow:inset 0 0 0 20px #fff,inset 0 0 0 21px rgba(0,0,0,0.1),inset 0 0 20px 21px rgba(0,0,0,0.2)}.umb-cropper-gravity .overlay{width:14px;height:14px;text-align:center;background:#2e8aea;border:3px solid white;border-radius:20px;opacity:.8}.umb-cropper-gravity .overlay i{font-size:26px;line-height:26px;opacity:.8!important}.umb-cropper .crop-container{text-align:center}.umb-cropper .crop-slider{display:-ms-flexbox;display:flex;padding:10px;margin-top:10px;border-top:1px solid #f8f8f8;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;-ms-flex-wrap:wrap;flex-wrap:wrap}@media(min-width:769px){.umb-cropper .crop-slider{padding:10px 50px 10px 50px}}.umb-cropper .crop-slider i{padding:0 5px;color:#555;box-sizing:border-box;-ms-flex:0 0 25px;flex:0 0 25px}.umb-cropper .crop-slider i:first-of-type{text-align:right}.umb-cropper .crop-slider input{-ms-flex:0 1 auto;flex:0 1 auto}.umb-cropper-gravity .viewport,.umb-cropper-gravity,.umb-cropper-imageholder{display:inline-block;max-width:100%}.umb-cropper-imageholder{float:left}.cropList{position:relative;display:inline-block;vertical-align:top}.gravity-container .viewport{max-width:600px}.gravity-container .viewport:hover{cursor:pointer}.imagecropper{display:-ms-flexbox;display:flex;-ms-flex-align:start;align-items:flex-start;-ms-flex-direction:row;flex-direction:row}@media(max-width:768px){.imagecropper{float:left;max-width:100%;-ms-flex-direction:column;flex-direction:column}}.imagecropper .umb-cropper__container{position:relative;max-width:100%;margin-bottom:10px;border:1px solid #f8f8f8}@media(min-width:769px){.imagecropper .umb-cropper__container{width:600px}}.umb-close-cropper{position:absolute;top:3px;right:3px;cursor:pointer}.umb-close-cropper:hover{background:#f8f8f8;opacity:.9}.imagecropper .umb-sortable-thumbnails{display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;-ms-flex-wrap:wrap;flex-wrap:wrap}.imagecropper .umb-sortable-thumbnails li{display:-ms-flexbox;display:flex;padding:8px;margin-top:0;-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:justify;justify-content:space-between}.imagecropper .umb-sortable-thumbnails li.current{color:#000;cursor:pointer;background:#f8f8f8;border-color:#d9d9d9}.imagecropper .umb-sortable-thumbnails li:hover,.imagecropper .umb-sortable-thumbnails li.current:hover{color:#000;cursor:pointer;background:#f8f8f8;border-color:#d9d9d9;opacity:.95}.imagecropper .umb-sortable-thumbnails li .crop-name,.imagecropper .umb-sortable-thumbnails li .crop-size{display:block;font-size:13px;line-height:1;text-align:left}.imagecropper .umb-sortable-thumbnails li .crop-name{margin:10px 0 5px;font-weight:bold}.imagecropper .umb-sortable-thumbnails li .crop-size{margin:0 0 5px;font-size:10px;font-style:italic}.btn-crop-delete{display:block;text-align:left}.umb-folderbrowser .add-link{display:inline-block;width:120px;height:120px;line-height:120px;text-align:center;border:1px #d9d9d9 dashed}.umb-upload-drop-zone{margin-bottom:5px}.umb-upload-drop-zone .info,.umb-upload-button-big{display:block;padding:20px;font-size:14px;color:#d9d9d9;text-align:center;background:0;border:1px dashed #d9d9d9;opacity:1}.umb-upload-button-big:hover{color:#d9d9d9}.umb-upload-drop-zone .info i.icon,.umb-upload-button-big i.icon{font-size:55px;line-height:70px}.umb-upload-button-big{display:block}.umb-upload-button-big input{bottom:0;left:0;width:100%;height:100%}.umb-photo-folder .picrow{position:relative;overflow-y:hidden}.umb-photo-folder .picrow div,.umb-photo-preview{position:relative;display:inline-block;padding:0;margin:0;vertical-align:top;border:0}.umb-photo-folder .picrow div a:first-child{width:100%;height:100%}.umb-photo-folder .picrow div.umb-photo{width:100%;height:100%;background-color:#f8f8f8}.umb-photo-folder a:hover{text-decoration:none}.umb-photo-folder .umb-non-thumbnail{font-size:12px;color:#000;text-align:center;text-decoration:none;vertical-align:middle;background:#f8f8f8}.umb-photo-folder .selector-overlay{display:none}.umb-photo-folder .pic:hover .selector-overlay{position:absolute;right:0;bottom:0;left:0;z-index:100;display:block;padding:5px;overflow:hidden;color:white;text-align:center;text-decoration:none;white-space:nowrap;background:black;opacity:.4;text-overlow:ellipsis}.umb-photo-folder .umb-non-thumbnail i{position:relative;top:50%;display:block;margin:auto;font-size:50px;line-height:60px;color:#d9d9d9;transform:translateY(-50%)}.umb-photo-folder .umb-non-thumbnail span{position:absolute;top:20px;display:block;width:100%;margin:auto}.umb-photo-folder .selected{position:relative}.umb-photo-folder .selected:before{position:absolute;right:10px;bottom:10px;z-index:100;display:block;width:32px;height:32px;overflow:hidden;font-family:Icomoon;font-size:24px;line-height:36px;color:black;text-align:center;background:white;border-radius:15px;content:"\e165";opacity:.5}.umb-fileupload .preview{float:left;padding:3px;margin-right:30px;margin-bottom:30px;background:#efefef;border:1px solid #a0a0a0;border-radius:5px}.umb-fileupload ul{margin-bottom:0;vertical-align:middle;list-style:none}.umb-fileupload label{padding-left:7px;font-weight:normal;vertical-align:middle}.umb-fileupload .preview-file{width:55px;height:45px;padding-top:27px;font-size:10px;color:#666;text-align:center;text-transform:uppercase}.umb-fileupload .file-icon{position:relative;display:block;padding:5px 0;text-align:center}.umb-fileupload .file-icon>.icon{font-size:70px;line-height:110%;color:#666;text-align:center}.umb-fileupload .file-icon>span{position:absolute;top:45px;left:110px;padding:1px 3px;font-size:12px;line-height:130%;color:#fff;background:#666}.umb-fileupload input{font-size:12px;line-height:1}.umb-member-group-box{width:45%}.umb-member-group-box:nth-child(1){float:left}.umb-member-group-box:nth-child(2){float:right}.umb-relatedlinks table>tr>td{word-break:break-all;word-wrap:break-word;border-bottom:1px solid transparent}.umb-relatedlinks .handle{cursor:move}.umb-relatedlinks table>tbody>tr.unsortable .handle{cursor:default}.umb-relatedlinks table td.col-sort{width:20px}.umb-relatedlinks table td.col-caption{min-width:200px}.umb-relatedlinks table td.col-link{min-width:200px}.umb-relatedlinks table td.col-actions{min-width:120px}.umb-relatedlinks table td.col-caption .control-wrapper,.umb-relatedlinks table td.col-link .control-wrapper{display:-ms-flexbox;display:flex}.umb-relatedlinks table td.col-caption .control-wrapper input[type="text"],.umb-relatedlinks table td.col-link .control-wrapper input[type="text"]{width:auto;-ms-flex:1;flex:1}.umb-relatedlinks .sortable-placeholder{display:table-row;background-color:#f9f9f9}.umb-relatedlinks .sortable-placeholder>td{display:table-cell;padding:8px}.umb-relatedlinks .ui-sortable-helper{display:table-row;background-color:#fff;opacity:.7}.umb-relatedlinks .ui-sortable-helper>td{display:table-cell;border-bottom:1px solid #dbdbdb}.umb-tags{padding:10px;font-size:13px;text-shadow:none;border:#f8f8f8 solid 1px}.umb-tags .tag{padding:7px;margin:7px;cursor:pointer;background:#2e8aea}.umb-tags .tag i{padding:2px}.umb-tags input{background:#fff;border:0}.bootstrap-datetimepicker-widget .btn{padding:0}.bootstrap-datetimepicker-widget .picker-switch .btn{background:0;border:0}.umb-datepicker .input-append .add-on{cursor:pointer}.umb-datepicker p{margin-top:10px}.umb-datepicker p a{color:#555}.CodeMirror,.CodeMirror-scroll{height:100%;min-height:200px}.umb-nested-boolean label{float:left;width:320px;margin-bottom:8px}.umb-nested-boolean label span{float:left;width:80%}.umb-nested-boolean label input[type='checkbox']{float:left;margin-right:10px}.typeahead,.tt-query,.tt-hint{z-index:auto!important;width:396px;height:30px;padding:8px 12px;margin-top:-4px!important;font-size:24px;line-height:30px;border:2px solid #d9d9d9;border-radius:2px!important;outline:0}.typeahead{background-color:#fff}.tt-query{box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.tt-hint{color:#d9d9d9!important}.tt-dropdown-menu{width:422px;padding:8px 0;margin-top:12px;background-color:#fff;border:1px solid #d9d9d9;border:1px solid rgba(0,0,0,0.2);border-radius:8px;box-shadow:0 5px 10px rgba(0,0,0,0.2)}.tt-suggestion{padding:3px 20px;font-size:14px;line-height:20px;cursor:pointer}.tt-suggestion.tt-cursor{color:#fff;background-color:#2e8aea}.tt-suggestion p{margin:0}*{-ms-touch-action:none}.ace_editor{height:200px}.nounderline{text-decoration:none!important}.nounderline:hover{text-decoration:underline!important}.nounderline *{text-decoration:none!important;border:0}.ui-sortable-placeholder{margin-left:0!important}.controls-row img{max-width:none}.thumbnail{border-radius:0}.thumbnail img{width:100%;max-width:100%!important}#mapCanvas img{max-width:none!important}.btn-group .dropdown-backdrop{display:none}iframe,.content-column-body{background:center center url(../img/loader.gif) no-repeat;border:0}.fileinput-button{position:relative;margin-bottom:5px;overflow:hidden}.fileinput-button input{position:absolute;top:0;right:0;margin:0;font-size:23px;cursor:pointer;opacity:0;filter:alpha(opacity=0);transform:translate(-300px,0) scale(4);direction:ltr}.legacy-custom-file{display:inline-block;width:16px;height:16px;min-width:20px;background-position:center center;background-repeat:no-repeat}.icon-chevron-up:before{content:"\e128"}.icon-chevron-down:before{content:"\e0c9"}.pa-umb-overlay{-webkit-font-smoothing:antialiased;font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.pa-umb-overlay+.pa-umb-overlay{padding-top:30px;border-top:1px solid #d9d9d9}.pa-select-type{display:-ms-flexbox;display:flex;margin-top:15px;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-ms-flex-direction:row;flex-direction:row;-ms-flex-pack:center;justify-content:center;-ms-flex-align:start;align-items:flex-start}.pa-select-type label{padding:0 20px}.pa-access-header{padding-bottom:0;margin:0 0 3px 0;font-weight:bold}.pa-access-description{margin:0;color:#b3b3b3}.pa-validation-message{display:inline-block;padding:6px 12px!important;margin:5px 0 0 0!important}.pa-select-pages label{margin:0;font-size:15px}.pa-select-pages label+.controls-row{padding-top:0}.pa-select-pages .umb-detail{margin:2px 0 5px;font-size:13px}.pa-choose-page a{font-size:15px;color:#2e8aea}.pa-choose-page a:hover,.pa-choose-page a:active,.pa-choose-page a:focus{color:#0064cd;text-decoration:none}.pa-choose-page a:before{margin-right:3px;font-weight:bold;content:"+"}.pa-choose-page .treePickerTitle{padding:3px 5px;font-size:13px;font-style:italic;font-weight:bold;color:grey;background:whitesmoke;border-bottom:0}.pa-form+.pa-form{margin-top:10px}code{border-radius:0}pre{display:block;padding:9.5px;margin:0 0 10px;overflow-x:auto;font-family:Monaco,Menlo,Consolas,"Courier New",monospace;font-size:13px;line-height:20px;color:#343434;white-space:pre;background-color:#f5f5f5;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.15);border-radius:0}pre.prettyprint{margin-bottom:20px}pre code{padding:0;word-wrap:normal;white-space:pre;background-color:transparent;border:0}.umb-healthcheck{display:-ms-flexbox;display:flex;margin-right:-10px;margin-left:-10px;-ms-flex-wrap:wrap;flex-wrap:wrap}.umb-healthcheck-help-text{margin-bottom:30px;line-height:1.6em}.umb-healthcheck-action-bar{display:-ms-flexbox;display:flex;margin-bottom:20px;-ms-flex-pack:end;justify-content:flex-end}.umb-healthcheck-group{display:-ms-flexbox;display:flex;height:100%;padding:15px 10px;text-align:center;background:#f8f8f8;border:2px solid transparent;border-radius:3px;box-sizing:border-box;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-direction:column;flex-direction:column}.umb-healthcheck-group:hover{cursor:pointer;border:2px solid #2e8aea}.umb-healthcheck-group__load-container{position:relative;height:30px;margin-top:15px;margin-bottom:16px}.umb-healthcheck-title{font-size:14px;font-weight:bold}.umb-healthcheck-messages{margin-top:15px}.umb-healthcheck-message{position:relative;display:-ms-inline-flexbox;display:inline-flex;padding-right:8px;padding-left:8px;margin-bottom:5px;font-size:13px;font-weight:bold;color:#000;background:#fff;border-radius:50px;-ms-flex-align:center;align-items:center}.umb-healthcheck-message i{margin-right:3px;font-size:15px}.umb-healthcheck-details-link{color:#2e8aea}.umb-healthcheck-details-link:hover{color:#2e8aea;text-decoration:none}.align-self-center{-ms-flex-item-align:center;align-self:center}.umb-era-button{display:-ms-flexbox;display:flex;height:40px;max-width:100%;padding:0 15px;overflow:hidden;font-size:14px;font-weight:bold;line-height:1;color:#484848;text-decoration:none!important;white-space:nowrap;cursor:pointer;background-color:#e0e0e0;border:0 none;border-radius:3px;box-sizing:border-box;transition:background-color 80ms ease,color 80ms ease,opacity 80ms ease;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-ms-flex-pack:center;justify-content:center;-ms-flex-align:center;align-items:center}.umb-era-button:hover,.umb-era-button:active{color:#484848;text-decoration:none;background-color:#d3d3d3;outline:0}.umb-era-button:focus{outline:0}.umb-era-button.-blue{color:white;background:#2e8aea}.umb-era-button.-blue:hover{background-color:#0064cd}.umb-era-button.-red{color:white;background:#ee5f5b}.umb-era-button.-red:hover{background-color:#ec4844}.umb-era-button.-link{padding:0;background:transparent}.umb-era-button.-link:hover{background-color:transparent;opacity:.6}.umb-era-button.-inactive{color:#BBB;cursor:not-allowed;background:#eae7e7}.umb-era-button.-inactive:hover{color:#BBB;background:#eae7e7}.umb-era-button.-full-width{display:block;width:100%}.umb-era-button.-white{background-color:#fff}.umb-era-button.-white:hover{opacity:.9}.umb-era-button.-text-black{color:#000}.umb-air{max-width:100%;padding:10px;box-sizing:border-box;-ms-flex:0 0 auto;flex:0 0 auto;-ms-flex-preferred-size:100%;flex-basis:100%}@media(min-width:500px){.umb-air{max-width:50%;-ms-flex-preferred-size:50%;flex-basis:50%}}@media(min-width:768px){.umb-air{max-width:20%;-ms-flex-preferred-size:20%;flex-basis:20%}}.umb-healthcheck-back-link{font-weight:bold;color:#000}.umb-healthcheck-group__details{margin-bottom:40px;border-radius:3px}.umb-healthcheck-group__details-group-title{display:-ms-flexbox;display:flex;padding:10px 20px;background-color:#2e8aea;border-radius:3px 3px 0 0;-ms-flex-align:center;align-items:center;-ms-flex-pack:justify;justify-content:space-between}.umb-healthcheck-group__details-group-name{font-size:16px;font-weight:bold;color:#fff}.umb-healthcheck-group__details-checks{border:1px solid #d9d9d9;border-top:0;border-radius:0 0 3px 3px}.umb-healthcheck-group__details-check{position:relative}.umb-healthcheck-group__details-check-title{padding:15px 20px;background-color:#f8f8f8}.umb-healthcheck-group__details-check-name{margin-bottom:2px;font-size:14px;font-weight:bold;color:#000}.umb-healthcheck-group__details-check-description{font-size:12px;line-height:1.6em;color:#7f7f7f}.umb-healthcheck-group__details-status{display:-ms-flexbox;display:flex;padding:15px 0;border-bottom:2px solid #f8f8f8}.umb-healthcheck-group__details-status-overlay{position:absolute;top:0;right:0;bottom:0;left:0;background:#fff;opacity:.9}.umb-healthcheck-group__details-status:last-child{border-bottom:0}.umb-healthcheck-group__details-status-icon-container{display:-ms-flexbox;display:flex;padding:0 20px;-ms-flex:0 0 50px;flex:0 0 50px;-ms-flex-pack:center;justify-content:center}.umb-healthcheck-status-icon{margin-top:2px;font-size:20px}.umb-healthcheck-status-icon.-large{width:70px;height:70px;font-size:30px;background-color:#fff}.umb-healthcheck-group__details-status-content{padding:0 20px;-ms-flex:1 1 auto;flex:1 1 auto}.umb-healthcheck-group__details-status-text{line-height:1.6em}.umb-healthcheck-group__details-status-actions{display:-ms-flexbox;display:flex;margin-top:10px;-ms-flex-direction:column;flex-direction:column}.umb-healthcheck-group__details-status-action{padding:10px;margin-bottom:10px;background-color:#f8f8f8;border-radius:3px}.umb-healthcheck-group__details-status-action:last-child{margin-bottom:0}.umb-healthcheck-group__details-status-action-description{margin-top:5px;font-size:11px}
\ No newline at end of file
diff --git a/OurUmbraco.Site/umbraco/assets/fonts/helveticons/helveticons.svg b/OurUmbraco.Site/umbraco/assets/fonts/helveticons/helveticons.svg
index e4ae7c75..166168f1 100644
--- a/OurUmbraco.Site/umbraco/assets/fonts/helveticons/helveticons.svg
+++ b/OurUmbraco.Site/umbraco/assets/fonts/helveticons/helveticons.svg
@@ -1,6176 +1,6176 @@
-
-
-
-
-This is a custom SVG font generated by IcoMoon.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+This is a custom SVG font generated by IcoMoon.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/OurUmbraco.Site/umbraco/assets/img/applicationIcons/help.svg b/OurUmbraco.Site/umbraco/assets/img/applicationIcons/help.svg
index 16edca44..90a85754 100644
--- a/OurUmbraco.Site/umbraco/assets/img/applicationIcons/help.svg
+++ b/OurUmbraco.Site/umbraco/assets/img/applicationIcons/help.svg
@@ -1,22 +1,22 @@
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
diff --git a/OurUmbraco.Site/umbraco/assets/img/applicationIcons/hlvticons-umbraco.svg b/OurUmbraco.Site/umbraco/assets/img/applicationIcons/hlvticons-umbraco.svg
index 5025acdf..8884b6de 100644
--- a/OurUmbraco.Site/umbraco/assets/img/applicationIcons/hlvticons-umbraco.svg
+++ b/OurUmbraco.Site/umbraco/assets/img/applicationIcons/hlvticons-umbraco.svg
@@ -1,87 +1,87 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/OurUmbraco.Site/umbraco/config/lang/en.xml b/OurUmbraco.Site/umbraco/config/lang/en.xml
index 838bbbe8..92160e85 100644
--- a/OurUmbraco.Site/umbraco/config/lang/en.xml
+++ b/OurUmbraco.Site/umbraco/config/lang/en.xml
@@ -147,9 +147,9 @@
Page Title
Properties
This document is published but is not visible because the parent '%0%' is unpublished
- Oops: this document is published but is not in the cache (internal error - see log)
- Oops: could not get the url (internal error - see log)
- Oops: this document is published but its url would collide with content %0%
+ This document is published but is not in the cache
+ Could not get the url
+ This document is published but its url would collide with content %0%
Publish
Publication Status
Publish at
@@ -1356,6 +1356,7 @@ To manage your website, simply open the Umbraco back office and start adding con
Media - Total XML: %0%, Total: %1%, Total invalid %2%
Content - Total XML: %0%, Total published: %1%, Total invalid %2%
+ Your site certificate was marked as valid.
Certificate validation error: '%0%'
Error pinging the URL %0% - '%1%'
You are currently %0% viewing the site using the HTTPS scheme.
diff --git a/OurUmbraco.Site/umbraco/config/lang/en_us.xml b/OurUmbraco.Site/umbraco/config/lang/en_us.xml
index f08eaedf..aa896185 100644
--- a/OurUmbraco.Site/umbraco/config/lang/en_us.xml
+++ b/OurUmbraco.Site/umbraco/config/lang/en_us.xml
@@ -1,1440 +1,1442 @@
-
-
-
- The Umbraco community
- http://our.umbraco.org/documentation/Extending-Umbraco/Language-Files
-
-
- Culture and Hostnames
- Audit Trail
- Browse Node
- Change Document Type
- Copy
- Create
- Create Package
- Delete
- Disable
- Empty recycle bin
- Export Document Type
- Import Document Type
- Import Package
- Edit in Canvas
- Exit
- Move
- Notifications
- Public access
- Publish
- Unpublish
- Reload
- Republish entire site
- Restore
- Permissions
- Rollback
- Send To Publish
- Send To Translation
- Sort
- Send to publication
- Translate
- Update
- Default value
-
-
- Permission denied.
- Add new Domain
- remove
- Invalid node.
- Invalid domain format.
- Domain has already been assigned.
- Language
- Domain
- New domain '%0%' has been created
- Domain '%0%' is deleted
- Domain '%0%' has already been assigned
- Domain '%0%' has been updated
- Edit Current Domains
-
- Inherit
- Culture
- or inherit culture from parent nodes. Will also apply
- to the current node, unless a domain below applies too.]]>
- Domains
-
-
- Viewing for
-
-
- Clear selection
- Select
- Select current folder
- Do something else
- Bold
- Cancel Paragraph Indent
- Insert form field
- Insert graphic headline
- Edit Html
- Indent Paragraph
- Italic
- Center
- Justify Left
- Justify Right
- Insert Link
- Insert local link (anchor)
- Bullet List
- Numeric List
- Insert macro
- Insert picture
- Edit relations
- Return to list
- Save
- Save and publish
- Save and send for approval
- Save list view
- Preview
- Preview is disabled because there's no template assigned
- Choose style
- Show styles
- Insert table
- Generate models
- Save and generate models
-
-
- To change the document type for the selected content, first select from the list of valid types for this location.
- Then confirm and/or amend the mapping of properties from the current type to the new, and click Save.
- The content has been re-published.
- Current Property
- Current type
- The document type cannot be changed, as there are no alternatives valid for this location. An alternative will be valid if it is allowed under the parent of the selected content item and that all existing child content items are allowed to be created under it.
- Document Type Changed
- Map Properties
- Map to Property
- New Template
- New Type
- none
- Content
- Select New Document Type
- The document type of the selected content has been successfully changed to [new type] and the following properties mapped:
- to
- Could not complete property mapping as one or more properties have more than one mapping defined.
- Only alternate types valid for the current location are displayed.
-
-
- Is Published
- About this page
- Alias
- (how would you describe the picture over the phone)
- Alternative Links
- Click to edit this item
- Created by
- Original author
- Updated by
- Created
- Date/time this document was created
- Document Type
- Editing
- Remove at
- This item has been changed after publication
- This item is not published
- Last published
- There are no items to show
- There are no items to show in the list.
- Media Type
- Link to media item(s)
- Member Group
- Role
- Member Type
- No date chosen
- Page Title
- Properties
- This document is published but is not visible because the parent '%0%' is unpublished
- Oops: this document is published but is not in the cache (internal error - see log)
- Oops: could not get the url (internal error - see log)
- Oops: this document is published but its url would collide with content %0%
- Publish
- Publication Status
- Publish at
- Unpublish at
- Clear Date
- Sortorder is updated
- To sort the nodes, simply drag the nodes or click one of the column headers. You can select multiple nodes by holding the "shift" or "control" key while selecting
- Statistics
- Title (optional)
- Alternative text (optional)
- Type
- Unpublish
- Last edited
- Date/time this document was edited
- Remove file(s)
- Link to document
- Member of group(s)
- Not a member of group(s)
- Child items
- Target
- This translates to the following time on the server:
- What does this mean?]]>
-
-
- Click to upload
- Drop your files here...
- Link to media
- or click here to choose files
- Only allowed file types are
- Cannot upload this file, it does not have an approved file type
- Max file size is
-
-
- Create a new member
- All Members
-
-
- Where do you want to create the new %0%
- Create an item under
- Choose a type and a title
- "document types".]]>
- "media types".]]>
- Document Type without a template
- New folder
- New data type
-
-
- Browse your website
- - Hide
- If Umbraco isn't opening, you might need to allow popups from this site
- has opened in a new window
- Restart
- Visit
- Welcome
-
-
- Stay
- Discard changes
- You have unsaved changes
- Are you sure you want to navigate away from this page? - you have unsaved changes
-
-
- Done
-
- Deleted %0% item
- Deleted %0% items
- Deleted %0% out of %1% item
- Deleted %0% out of %1% items
-
- Published %0% item
- Published %0% items
- Published %0% out of %1% item
- Published %0% out of %1% items
-
- Unpublished %0% item
- Unpublished %0% items
- Unpublished %0% out of %1% item
- Unpublished %0% out of %1% items
-
- Moved %0% item
- Moved %0% items
- Moved %0% out of %1% item
- Moved %0% out of %1% items
-
- Copied %0% item
- Copied %0% items
- Copied %0% out of %1% item
- Copied %0% out of %1% items
-
-
- Name
- Manage hostnames
- Close this window
- Are you sure you want to delete
- Are you sure you want to disable
- Please check this box to confirm deletion of %0% item(s)
- Are you sure?
- Are you sure?
- Cut
- Edit Dictionary Item
- Edit Language
- Insert local link
- Insert character
- Insert graphic headline
- Insert picture
- Insert link
- Click to add a Macro
- Insert table
- Last Edited
- Link
- Internal link:
- When using local links, insert "#" in front of link
- Open in new window?
- Macro Settings
- This macro does not contain any properties you can edit
- Paste
- Edit Permissions for
- The items in the recycle bin are now being deleted. Please do not close this window while this operation takes place
- The recycle bin is now empty
- When items are deleted from the recycle bin, they will be gone forever
- regexlib.com's webservice is currently experiencing some problems, which we have no control over. We are very sorry for this inconvenience.]]>
- Search for a regular expression to add validation to a form field. Example: 'email, 'zip-code' 'url'
- Remove Macro
- Required Field
- Site is reindexed
- The website cache has been refreshed. All publish content is now up to date. While all unpublished content is still unpublished
- The website cache will be refreshed. All published content will be updated, while unpublished content will stay unpublished.
- Number of columns
- Number of rows
- Set a placeholder id by setting an ID on your placeholder you can inject content into this template from child templates,
- by referring this ID using a <asp:content /> element.]]>
- Select a placeholder id from the list below. You can only
- choose Id's from the current template's master.]]>
- Click on the image to see full size
- Pick item
- View Cache Item
- Create folder...
-
- Relate to original
- The friendliest community
-
- Link to page
-
- Opens the linked document in a new window or tab
- Opens the linked document in the full body of the window
- Opens the linked document in the parent frame
-
- Link to media
-
- Select media
- Select icon
- Select item
- Select link
- Select macro
- Select content
- Select member
- Select member group
-
- There are no parameters for this macro
-
- External login providers
- Exception Details
- Stacktrace
- Inner Exception
-
- Link your
- Un-Link your
-
- account
-
- Select editor
-
-
- %0%' below You can add additional languages under the 'languages' in the menu on the left
- ]]>
- Culture Name
-
-
- Enter your username
- Enter your password
- Confirm your password
- Name the %0%...
- Enter a name...
- Label...
- Enter a description...
- Type to search...
- Type to filter...
- Type to add tags (press enter after each tag)...
- Enter your email
-
-
-
- Allow at root
- Only Content Types with this checked can be created at the root level of Content and Media trees
- Allowed child node types
- Document Type Compositions
- Create
- Delete tab
- Description
- New tab
- Tab
- Thumbnail
- Enable list view
- Configures the content item to show a sortable & searchable list of its children, the children will not be shown in the tree
- Current list view
- The active list view data type
- Create custom list view
- Remove custom list view
-
-
- Add prevalue
- Database datatype
- Property editor GUID
- Property editor
- Buttons
- Enable advanced settings for
- Enable context menu
- Maximum default size of inserted images
- Related stylesheets
- Show label
- Width and height
-
-
- Your data has been saved, but before you can publish this page there are some errors you need to fix first:
- The current membership provider does not support changing password (EnablePasswordRetrieval need to be true)
- %0% already exists
- There were errors:
- There were errors:
- The password should be a minimum of %0% characters long and contain at least %1% non-alpha numeric character(s)
- %0% must be an integer
- The %0% field in the %1% tab is mandatory
- %0% is a mandatory field
- %0% at %1% is not in a correct format
- %0% is not in a correct format
-
-
- Received an error from the server
- The specified file type has been disallowed by the administrator
- NOTE! Even though CodeMirror is enabled by configuration, it is disabled in Internet Explorer because it's not stable enough.
- Please fill both alias and name on the new property type!
- There is a problem with read/write access to a specific file or folder
- Error loading Partial View script (file: %0%)
- Error loading userControl '%0%'
- Error loading customControl (Assembly: %0%, Type: '%1%')
- Error loading MacroEngine script (file: %0%)
- "Error parsing XSLT file: %0%
- "Error reading XSLT file: %0%
- Please enter a title
- Please choose a type
- You're about to make the picture larger than the original size. Are you sure that you want to proceed?
- Error in python script
- The python script has not been saved, because it contained error(s)
- Startnode deleted, please contact your administrator
- Please mark content before changing style
- No active styles available
- Please place cursor at the left of the two cells you wish to merge
- You cannot split a cell that hasn't been merged.
- Error in XSLT source
- The XSLT has not been saved, because it contained error(s)
- There is a configuration error with the data type used for this property, please check the data type
-
-
- About
- Action
- Actions
- Add
- Alias
- All
- Are you sure?
- Back
- Border
- by
- Cancel
- Cell margin
- Choose
- Close
- Close Window
- Comment
- Confirm
- Constrain proportions
- Continue
- Copy
- Create
- Database
- Date
- Default
- Delete
- Deleted
- Deleting...
- Design
- Dimensions
- Down
- Download
- Edit
- Edited
- Elements
- Email
- Error
- Find
- Height
- Help
- Icon
- Import
- Inner margin
- Insert
- Install
- Invalid
- Justify
- Language
- Layout
- Loading
- Locked
- Login
- Log off
- Logout
- Macro
- Mandatory
- Move
- More
- Name
- New
- Next
- No
- of
- OK
- Open
- or
- Password
- Path
- Placeholder ID
- One moment please...
- Previous
- Properties
- Email to receive form data
- Recycle Bin
- Your recycle bin is empty
- Remaining
- Rename
- Renew
- Required
- Retry
- Permissions
- Search
- Sorry, we can not find what you are looking for
- Server
- Show
- Show page on Send
- Size
- Sort
- Submit
- Type
- Type to search...
- Up
- Update
- Upgrade
- Upload
- Url
- User
- Username
- Value
- View
- Welcome...
- Width
- Yes
- Folder
- Search results
- Reorder
- I am done reordering
- Preview
- Change password
- to
- List view
- Saving...
- current
- Embed
- selected
-
-
- Black
- Green
- Yellow
- Orange
- Blue
- Red
-
-
- Add tab
- Add property
- Add editor
- Add template
- Add child node
- Add child
-
- Edit data type
-
- Navigate sections
-
- Shortcuts
- show shortcuts
-
- Toggle list view
- Toggle allow as root
-
-
- Background color
- Bold
- Text color
- Font
- Text
-
-
- Page
-
-
- The installer cannot connect to the database.
- Could not save the web.config file. Please modify the connection string manually.
- Your database has been found and is identified as
- Database configuration
- install button to install the Umbraco %0% database
- ]]>
- Next to proceed.]]>
- Database not found! Please check that the information in the "connection string" of the "web.config" file is correct.
- To proceed, please edit the "web.config" file (using Visual Studio or your favourite text editor), scroll to the bottom, add the connection string for your database in the key named "UmbracoDbDSN" and save the file.
-
- Click the retry button when
- done.
- More information on editing web.config here.
]]>
-
- Please contact your ISP if necessary.
- If you're installing on a local machine or server you might need information from your system administrator.]]>
-
- Press the upgrade button to upgrade your database to Umbraco %0%
-
- Don't worry - no content will be deleted and everything will continue working afterwards!
-
- ]]>
-
- Press Next to
- proceed. ]]>
-
- next to continue the configuration wizard]]>
- The Default users' password needs to be changed!]]>
- The Default user has been disabled or has no access to Umbraco!No further actions needs to be taken. Click Next to proceed.]]>
- The Default user's password has been successfully changed since the installation!No further actions needs to be taken. Click Next to proceed.]]>
- The password is changed!
-
- ('admin') and password ('default') . It's important that the password is changed to something unique.
- ]]>
- Get a great start, watch our introduction videos
- By clicking the next button (or modifying the umbracoConfigurationStatus in web.config), you accept the license for this software as specified in the box below. Notice that this Umbraco distribution consists of two different licenses, the open source MIT license for the framework and the Umbraco freeware license that covers the UI.
- Not installed yet.
- Affected files and folders
- More information on setting up permissions for Umbraco here
- You need to grant ASP.NET modify permissions to the following files/folders
- Your permission settings are almost perfect!
- You can run Umbraco without problems, but you will not be able to install packages which are recommended to take full advantage of Umbraco.]]>
- How to Resolve
- Click here to read the text version
- video tutorial on setting up folder permissions for Umbraco or read the text version.]]>
- Your permission settings might be an issue!
-
- You can run Umbraco without problems, but you will not be able to create folders or install packages which are recommended to take full advantage of Umbraco.]]>
- Your permission settings are not ready for Umbraco!
-
- In order to run Umbraco, you'll need to update your permission settings.]]>
- Your permission settings are perfect!
- You are ready to run Umbraco and install packages!]]>
- Resolving folder issue
- Follow this link for more information on problems with ASP.NET and creating folders
- Setting up folder permissions
-
- I want to start from scratch
-
- learn how)
- You can still choose to install Runway later on. Please go to the Developer section and choose Packages.
- ]]>
- You've just set up a clean Umbraco platform. What do you want to do next?
- Runway is installed
-
- This is our list of recommended modules, check off the ones you would like to install, or view the full list of modules
- ]]>
- Only recommended for experienced users
- I want to start with a simple website
-
-
- "Runway" is a simple website providing some basic document types and templates. The installer can set up Runway for you automatically,
- but you can easily edit, extend or remove it. It's not necessary and you can perfectly use Umbraco without it. However,
- Runway offers an easy foundation based on best practices to get you started faster than ever.
- If you choose to install Runway, you can optionally select basic building blocks called Runway Modules to enhance your Runway pages.
-
-
- Included with Runway: Home page, Getting Started page, Installing Modules page.
- Optional Modules: Top Navigation, Sitemap, Contact, Gallery.
-
- ]]>
- What is Runway
- Step 1/5 Accept license
- Step 2/5: Database configuration
- Step 3/5: Validating File Permissions
- Step 4/5: Check Umbraco security
- Step 5/5: Umbraco is ready to get you started
- Thank you for choosing Umbraco
- Browse your new site
-You installed Runway, so why not see how your new website looks.]]>
- Further help and information
-Get help from our award winning community, browse the documentation or watch some free videos on how to build a simple site, how to use packages and a quick guide to the Umbraco terminology]]>
- Umbraco %0% is installed and ready for use
- /web.config file and update the AppSetting key UmbracoConfigurationStatus in the bottom to the value of '%0%' .]]>
- started instantly by clicking the "Launch Umbraco" button below. If you are new to Umbraco ,
-you can find plenty of resources on our getting started pages.]]>
- Launch Umbraco
-To manage your website, simply open the Umbraco back office and start adding content, updating the templates and stylesheets or add new functionality]]>
- Connection to database failed.
- Umbraco Version 3
- Umbraco Version 4
- Watch
- Umbraco %0% for a fresh install or upgrading from version 3.0.
-
- Press "next" to start the wizard.]]>
-
-
- Culture Code
- Culture Name
-
-
- You've been idle and logout will automatically occur in
- Renew now to save your work
-
-
- Happy super Sunday
- Happy manic Monday
- Happy tubular Tuesday
- Happy wonderful Wednesday
- Happy thunderous Thursday
- Happy funky Friday
- Happy Caturday
- Log in below
- Sign in with
- Session timed out
- © 2001 - %0% Umbraco.com ]]>
- Forgotten password?
- An email will be sent to the address specified with a link to reset your password
- An email with password reset instructions will be sent to the specified address if it matched our records
- Return to login form
- Please provide a new password
- Your Password has been updated
- The link you have clicked on is invalid or has expired
- Umbraco: Reset Password
-
- Your username to login to the Umbraco back-office is: %0% Click here to reset your password or copy/paste this URL into your browser:
%1%
]]>
-
-
-
- Dashboard
- Sections
- Content
-
-
- Choose page above...
- %0% has been copied to %1%
- Select where the document %0% should be copied to below
- %0% has been moved to %1%
- Select where the document %0% should be moved to below
- has been selected as the root of your new content, click 'ok' below.
- No node selected yet, please select a node in the list above before clicking 'ok'
- The current node is not allowed under the chosen node because of its type
- The current node cannot be moved to one of its subpages
- The current node cannot exist at the root
- The action isn't allowed since you have insufficient permissions on 1 or more child documents.
- Relate copied items to original
-
-
- Edit your notification for %0%
-
-
- Hi %0%
-
- This is an automated mail to inform you that the task '%1%'
- has been performed on the page '%2%'
- by the user '%3%'
-
-
-
-
Update summary:
-
-
-
-
-
- Have a nice day!
- Cheers from the Umbraco robot
-
]]>
- [%0%] Notification about %1% performed on %2%
- Notifications
-
-
-
- button and locating the package. Umbraco packages usually have a ".umb" or ".zip" extension.
- ]]>
- Author
- Demonstration
- Documentation
- Package meta data
- Package name
- Package doesn't contain any items
-
- You can safely remove this from the system by clicking "uninstall package" below.]]>
- No upgrades available
- Package options
- Package readme
- Package repository
- Confirm uninstall
- Package was uninstalled
- The package was successfully uninstalled
- Uninstall package
-
- Notice: any documents, media etc depending on the items you remove, will stop working, and could lead to system instability,
- so uninstall with caution. If in doubt, contact the package author.]]>
- Download update from the repository
- Upgrade package
- Upgrade instructions
- There's an upgrade available for this package. You can download it directly from the Umbraco package repository.
- Package version
- Package version history
- View package website
- Package already installed
- This package cannot be installed, it requires a minimum Umbraco version of %0%
- Uninstalling...
- Downloading...
- Importing...
- Installing...
- Restarting, please wait...
- All done, your browser will now refresh, please wait...
-
-
- Paste with full formatting (Not recommended)
- The text you're trying to paste contains special characters or formatting. This could be caused by copying text from Microsoft Word. Umbraco can remove special characters or formatting automatically, so the pasted content will be more suitable for the web.
- Paste as raw text without any formatting at all
- Paste, but remove formatting (Recommended)
-
-
- Role based protection
- using Umbraco's member groups.]]>
- role-based authentication.]]>
- Error Page
- Used when people are logged on, but do not have access
- Choose how to restrict access to this page
- %0% is now protected
- Protection removed from %0%
- Login Page
- Choose the page that contains the login form
- Remove Protection
- Select the pages that contain login form and error messages
- Pick the roles who have access to this page
- Set the login and password for this page
- Single user protection
- If you just want to setup simple protection using a single login and password
-
-
-
-
-
-
-
-
-
- Include unpublished subpages
- Publishing in progress - please wait...
- %0% out of %1% pages have been published...
- %0% has been published
- %0% and subpages have been published
- Publish %0% and all its subpages
- Publish to publish %0% and thereby making its content publicly available.
- You can publish this page and all its subpages by checking Include unpublished subpages below.
- ]]>
-
-
- You have not configured any approved colors
-
-
- enter external link
- choose internal page
- Caption
- Link
- Open in new window
- enter the display caption
- Enter the link
-
-
- Reset
-
-
- Current version
- Red text will not be shown in the selected version. , green means added ]]>
- Document has been rolled back
- This displays the selected version as HTML, if you wish to see the difference between 2 versions at the same time, use the diff view
- Rollback to
- Select version
- View
-
-
- Edit script file
-
-
- Concierge
- Content
- Courier
- Developer
- Umbraco Configuration Wizard
- Media
- Members
- Newsletters
- Settings
- Statistics
- Translation
- Users
- Help
- Forms
- Analytics
-
-
- go to
- Help topics for
- Video chapters for
- The best Umbraco video tutorials
-
-
- Default template
- Dictionary Key
- To import a document type, find the ".udt" file on your computer by clicking the "Browse" button and click "Import" (you'll be asked for confirmation on the next screen)
- New Tab Title
- Node type
- Type
- Stylesheet
- Script
- Stylesheet property
- Tab
- Tab Title
- Tabs
- Master Content Type enabled
- This Content Type uses
- as a Master Content Type. Tabs from Master Content Types are not shown and can only be edited on the Master Content Type itself
- No properties defined on this tab. Click on the "add a new property" link at the top to create a new property.
- Master Document Type
- Create matching template
- Add icon
-
-
- Sort order
- Creation date
- Sorting complete.
- Drag the different items up or down below to set how they should be arranged. Or click the column headers to sort the entire collection of items
- Do not close this window during sorting]]>
-
-
- Validation
- Validation errors must be fixed before the item can be saved
- Failed
- Insufficient user permissions, could not complete the operation
- Cancelled
- Operation was cancelled by a 3rd party add-in
- Publishing was cancelled by a 3rd party add-in
- Property type already exists
- Property type created
- DataType: %1%]]>
- Propertytype deleted
- Document Type saved
- Tab created
- Tab deleted
- Tab with id: %0% deleted
- Stylesheet not saved
- Stylesheet saved
- Stylesheet saved without any errors
- Datatype saved
- Dictionary item saved
- Publishing failed because the parent page isn't published
- Content published
- and visible at the website
- Content saved
- Remember to publish to make changes visible
- Sent For Approval
- Changes have been sent for approval
- Media saved
- Media saved without any errors
- Member saved
- Stylesheet Property Saved
- Stylesheet saved
- Template saved
- Error saving user (check log)
- User Saved
- User type saved
- File not saved
- file could not be saved. Please check file permissions
- File saved
- File saved without any errors
- Language saved
- Media Type saved
- Member Type saved
- Python script not saved
- Python script could not be saved due to error
- Python script saved
- No errors in python script
- Template not saved
- Please make sure that you do not have 2 templates with the same alias
- Template saved
- Template saved without any errors!
- XSLT not saved
- XSLT contained an error
- XSLT could not be saved, check file permissions
- XSLT saved
- No errors in XSLT
- Content unpublished
- Partial view saved
- Partial view saved without any errors!
- Partial view not saved
- An error occurred saving the file.
- Script view saved
- Script view saved without any errors!
- Script view not saved
- An error occurred saving the file.
- An error occurred saving the file.
-
-
- Uses CSS syntax ex: h1, .redHeader, .blueTex
- Edit stylesheet
- Edit stylesheet property
- Name to identify the style property in the rich text editor
- Preview
- Styles
-
-
- Edit template
- Insert content area
- Insert content area placeholder
- Insert dictionary item
- Insert Macro
- Insert Umbraco page field
- Master template
- Quick Guide to Umbraco template tags
- Template
-
-
- Choose type of content
- Choose a layout
- Add a row
- Add content
- Drop content
- Settings applied
-
- This content is not allowed here
- This content is allowed here
-
- Click to embed
- Click to insert image
- Image caption...
- Write here...
-
- Grid Layouts
- Layouts are the overall work area for the grid editor, usually you only need one or two different layouts
- Add Grid Layout
- Adjust the layout by setting column widths and adding additional sections
- Row configurations
- Rows are predefined cells arranged horizontally
- Add row configuration
- Adjust the row by setting cell widths and adding additional cells
-
- Columns
- Total combined number of columns in the grid layout
-
- Settings
- Configure what settings editors can change
-
-
- Styles
- Configure what styling editors can change
-
- Settings will only save if the entered json configuration is valid
-
- Allow all editors
- Allow all row configurations
- Set as default
- Choose extra
- Choose default
- are added
-
-
-
- Compositions
- You have not added any tabs
- Add new tab
- Add another tab
- Inherited from
- Add property
- Required label
-
- Enable list view
- Configures the content item to show a sortable and searchable list of its children, the children will not be shown in the tree
-
- Allowed Templates
- Choose which templates editors are allowed to use on content of this type
- Allow as root
- Allow editors to create content of this type in the root of the content tree
- Yes - allow content of this type in the root
-
- Allowed child node types
- Allow content of the specified types to be created underneath content of this type
-
- Choose child node
- Inherit tabs and properties from an existing document type. New tabs will be added to the current document type or merged if a tab with an identical name exists.
- This content type is used in a composition, and therefore cannot be composed itself.
- There are no content types available to use as a composition.
-
- Available editors
- Reuse
- Editor settings
-
- Configuration
-
- Yes, delete
-
- was moved underneath
- was copied underneath
- Select the folder to move
- Select the folder to copy
- to in the tree structure below
-
- All Document types
- All Documents
- All media items
-
- using this document type will be deleted permanently, please confirm you want to delete these as well.
- using this media type will be deleted permanently, please confirm you want to delete these as well.
- using this member type will be deleted permanently, please confirm you want to delete these as well
-
- and all documents using this type
- and all media items using this type
- and all members using this type
-
- using this editor will get updated with the new settings
-
- Member can edit
- Show on member profile
- tab has no sort order
-
-
-
- Building models
- this can take abit of time, don't worry
- Models generated
- Models could not be generated
- Models generation has failed, see exception in U log
-
-
-
- Alternative field
- Alternative Text
- Casing
- Encoding
- Choose field
- Convert line breaks
- Replaces line breaks with html-tag <br>
- Custom Fields
- Yes, Date only
- Format as date
- HTML encode
- Will replace special characters by their HTML equivalent.
- Will be inserted after the field value
- Will be inserted before the field value
- Lowercase
- None
- Insert after field
- Insert before field
- Recursive
- Remove Paragraph tags
- Will remove any <P> in the beginning and end of the text
- Standard Fields
- Uppercase
- URL encode
- Will format special characters in URLs
- Will only be used when the field values above are empty
- This field will only be used if the primary field is empty
- Yes, with time. Separator:
-
-
- Tasks assigned to you
- assigned to you. To see a detailed view including comments, click on "Details" or just the page name.
- You can also download the page as XML directly by clicking the "Download Xml" link.
- To close a translation task, please go to the Details view and click the "Close" button.
- ]]>
- close task
- Translation details
- Download all translation tasks as XML
- Download XML
- Download XML DTD
- Fields
- Include subpages
-
- [%0%] Translation task for %1%
- No translator users found. Please create a translator user before you start sending content to translation
- Tasks created by you
- created by you. To see a detailed view including comments,
- click on "Details" or just the page name. You can also download the page as XML directly by clicking the "Download Xml" link.
- To close a translation task, please go to the Details view and click the "Close" button.
- ]]>
- The page '%0%' has been send to translation
- Please select the language that the content should be translated into
- Send the page '%0%' to translation
- Assigned by
- Task opened
- Total words
- Translate to
- Translation completed.
- You can preview the pages, you've just translated, by clicking below. If the original page is found, you will get a comparison of the 2 pages.
- Translation failed, the XML file might be corrupt
- Translation options
- Translator
- Upload translation XML
-
-
- Cache Browser
- Recycle Bin
- Created packages
- Data Types
- Dictionary
- Installed packages
- Install skin
- Install starter kit
- Languages
- Install local package
- Macros
- Media Types
- Members
- Member Groups
- Member Roles
- Member Types
- Document Types
- Relation Types
- Packages
- Packages
- Python Files
- Install from repository
- Install Runway
- Runway modules
- Scripting Files
- Scripts
- Stylesheets
- Templates
- XSLT Files
- Analytics
-
-
- New update ready
- %0% is ready, click here for download
- No connection to server
- Error checking for update. Please review trace-stack for further information
-
-
- Administrator
- Category field
- Change Your Password
- New password
- Confirm new password
- You can change your password for accessing the Umbraco Back Office by filling out the form below and click the 'Change Password' button
- Content Channel
- Description field
- Disable User
- Document Type
- Editor
- Excerpt field
- Language
- Login
- Start Node in Media Library
- Sections
- Disable Umbraco Access
- Old password
- Password
- Reset password
- Your password has been changed!
- Please confirm the new password
- Enter your new password
- Your new password cannot be blank!
- Current password
- Invalid current password
- There was a difference between the new password and the confirmed password. Please try again!
- The confirmed password doesn't match the new password!
- Replace child node permissions
- You are currently modifying permissions for the pages:
- Select pages to modify their permissions
- Search all children
- Start Node in Content
- Name
- User permissions
- User type
- User types
- Writer
- Translator
- Change
- Your profile
- Your recent history
- Session expires in
-
-
- Validation
- Validate as email
- Validate as a number
- Validate as a Url
- ...or enter a custom validation
- Field is mandatory
-
-
-
- Value is set to the recommended value: '%0%'.
- Value was set to '%1%' for XPath '%2%' in configuration file '%3%'.
- Expected value '%1%' for '%2%' in configuration file '%3%', but found '%0%'.
- Found unexpected value '%0%' for '%2%' in configuration file '%3%'.
-
-
- Custom errors are set to '%0%'.
- Custom errors are currently set to '%0%'. It is recommended to set this to '%1%' before go live.
- Custom errors successfully set to '%0%'.
-
- MacroErrors are set to '%0%'.
- MacroErrors are set to '%0%' which will prevent some or all pages in your site from loading completely when there's any errors in macros. Rectifying this will set the value to '%1%'.
- MacroErrors are now set to '%0%'.
-
-
- Try Skip IIS Custom Errors is set to '%0%' and you're using IIS version '%1%'.
- Try Skip IIS Custom Errors is currently '%0%'. It is recommended to set this to '%1%' for your IIS version (%2%).
- Try Skip IIS Custom Errors successfully set to '%0%'.
-
-
- File does not exist: '%0%'.
- '%0%' in config file '%1%' .]]>
- There was an error, check log for full error: %0%.
-
- Members - Total XML: %0%, Total: %1%, Total invalid: %2%
- Media - Total XML: %0%, Total: %1%, Total invalid: %2%
- Content - Total XML: %0%, Total published: %1%, Total invalid: %2%
-
- Certificate validation error: '%0%'
- Error pinging the URL %0% - '%1%'
- You are currently %0% viewing the site using the HTTPS scheme.
- The appSetting 'umbracoUseSSL' is set to 'false' in your web.config file. Once you access this site using the HTTPS scheme, that should be set to 'true'.
- The appSetting 'umbracoUseSSL' is set to '%0%' in your web.config file, your cookies are %1% marked as secure.
- Could not update the 'umbracoUseSSL' setting in your web.config file. Error: %0%
-
-
- Enable HTTPS
- Sets umbracoSSL setting to true in the appSettings of the web.config file.
- The appSetting 'umbracoUseSSL' is now set to 'true' in your web.config file, your cookies will be marked as secure.
-
- Fix
- Cannot fix a check with a value comparison type of 'ShouldNotEqual'.
- Cannot fix a check with a value comparison type of 'ShouldEqual' with a provided value.
- Value to fix check not provided.
-
- Debug compilation mode is disabled.
- Debug compilation mode is currently enabled. It is recommended to disable this setting before go live.
- Debug compilation mode successfully disabled.
-
- Trace mode is disabled.
- Trace mode is currently enabled. It is recommended to disable this setting before go live.
- Trace mode successfully disabled.
-
- All folders have the correct permissions set.
-
- %0%.]]>
- %0%. If they aren't being written to no action need be taken.]]>
-
- All files have the correct permissions set.
-
- %0%.]]>
- %0%. If they aren't being written to no action need be taken.]]>
-
- X-Frame-Options used to control whether a site can be IFRAMEd by another was found.]]>
- X-Frame-Options used to control whether a site can be IFRAMEd by another was not found.]]>
- Set Header in Config
- Adds a value to the httpProtocol/customHeaders section of web.config to prevent the site being IFRAMEd by other websites.
- A setting to create a header preventing IFRAMEing of the site by other websites has been added to your web.config file.
- Could not update web.config file. Error: %0%
-
-
- %0%.]]>
- No headers revealing information about the website technology were found.
-
- In the Web.config file, system.net/mailsettings could not be found.
- In the Web.config file system.net/mailsettings section, the host is not configured.
- SMTP settings are configured correctly and the service is operating as expected.
- The SMTP server configured with host '%0%' and port '%1%' could not be reached. Please check to ensure the SMTP settings in the Web.config file system.net/mailsettings are correct.
-
- %0%.]]>
- %0%.]]>
-
-
- Disable URL tracker
- Enable URL tracker
- Original URL
- Redirected To
- No redirects have been made
- When a published page gets renamed or moved a redirect will automatically be made to the new page.
- Remove
- Are you sure you want to remove the redirect from '%0%' to '%1%'?
- Redirect URL removed.
- Error removing redirect URL.
- Are you sure you want to disable the URL tracker?
- URL tracker has now been disabled.
- Error disabling the URL tracker, more information can be found in your log file.
- URL tracker has now been enabled.
- Error enabling the URL tracker, more information can be found in your log file.
-
-
+
+
+
+ The Umbraco community
+ http://our.umbraco.org/documentation/Extending-Umbraco/Language-Files
+
+
+ Culture and Hostnames
+ Audit Trail
+ Browse Node
+ Change Document Type
+ Copy
+ Create
+ Create Package
+ Delete
+ Disable
+ Empty recycle bin
+ Export Document Type
+ Import Document Type
+ Import Package
+ Edit in Canvas
+ Exit
+ Move
+ Notifications
+ Public access
+ Publish
+ Unpublish
+ Reload
+ Republish entire site
+ Restore
+ Permissions
+ Rollback
+ Send To Publish
+ Send To Translation
+ Sort
+ Send to publication
+ Translate
+ Update
+ Default value
+
+
+ Permission denied.
+ Add new Domain
+ remove
+ Invalid node.
+ Invalid domain format.
+ Domain has already been assigned.
+ Language
+ Domain
+ New domain '%0%' has been created
+ Domain '%0%' is deleted
+ Domain '%0%' has already been assigned
+ Domain '%0%' has been updated
+ Edit Current Domains
+
+ Inherit
+ Culture
+ or inherit culture from parent nodes. Will also apply
+ to the current node, unless a domain below applies too.]]>
+ Domains
+
+
+ Viewing for
+
+
+ Clear selection
+ Select
+ Select current folder
+ Do something else
+ Bold
+ Cancel Paragraph Indent
+ Insert form field
+ Insert graphic headline
+ Edit Html
+ Indent Paragraph
+ Italic
+ Center
+ Justify Left
+ Justify Right
+ Insert Link
+ Insert local link (anchor)
+ Bullet List
+ Numeric List
+ Insert macro
+ Insert picture
+ Edit relations
+ Return to list
+ Save
+ Save and publish
+ Save and send for approval
+ Save list view
+ Preview
+ Preview is disabled because there's no template assigned
+ Choose style
+ Show styles
+ Insert table
+ Generate models
+ Save and generate models
+
+
+ To change the document type for the selected content, first select from the list of valid types for this location.
+ Then confirm and/or amend the mapping of properties from the current type to the new, and click Save.
+ The content has been re-published.
+ Current Property
+ Current type
+ The document type cannot be changed, as there are no alternatives valid for this location. An alternative will be valid if it is allowed under the parent of the selected content item and that all existing child content items are allowed to be created under it.
+ Document Type Changed
+ Map Properties
+ Map to Property
+ New Template
+ New Type
+ none
+ Content
+ Select New Document Type
+ The document type of the selected content has been successfully changed to [new type] and the following properties mapped:
+ to
+ Could not complete property mapping as one or more properties have more than one mapping defined.
+ Only alternate types valid for the current location are displayed.
+
+
+ Is Published
+ About this page
+ Alias
+ (how would you describe the picture over the phone)
+ Alternative Links
+ Click to edit this item
+ Created by
+ Original author
+ Updated by
+ Created
+ Date/time this document was created
+ Document Type
+ Editing
+ Remove at
+ This item has been changed after publication
+ This item is not published
+ Last published
+ There are no items to show
+ There are no items to show in the list.
+ Media Type
+ Link to media item(s)
+ Member Group
+ Role
+ Member Type
+ No date chosen
+ Page Title
+ Properties
+ This document is published but is not visible because the parent '%0%' is unpublished
+ This document is published but is not in the cache
+ Could not get the url
+ This document is published but its url would collide with content %0%
+ Publish
+ Publication Status
+ Publish at
+ Unpublish at
+ Clear Date
+ Sortorder is updated
+ To sort the nodes, simply drag the nodes or click one of the column headers. You can select multiple nodes by holding the "shift" or "control" key while selecting
+ Statistics
+ Title (optional)
+ Alternative text (optional)
+ Type
+ Unpublish
+ Last edited
+ Date/time this document was edited
+ Remove file(s)
+ Link to document
+ Member of group(s)
+ Not a member of group(s)
+ Child items
+ Target
+ This translates to the following time on the server:
+ What does this mean?]]>
+
+
+ Click to upload
+ Drop your files here...
+ Link to media
+ or click here to choose files
+ Only allowed file types are
+ Cannot upload this file, it does not have an approved file type
+ Max file size is
+
+
+ Create a new member
+ All Members
+
+
+ Where do you want to create the new %0%
+ Create an item under
+ Choose a type and a title
+ "document types".]]>
+ "media types".]]>
+ Document Type without a template
+ New folder
+ New data type
+
+
+ Browse your website
+ - Hide
+ If Umbraco isn't opening, you might need to allow popups from this site
+ has opened in a new window
+ Restart
+ Visit
+ Welcome
+
+
+ Stay
+ Discard changes
+ You have unsaved changes
+ Are you sure you want to navigate away from this page? - you have unsaved changes
+
+
+ Done
+
+ Deleted %0% item
+ Deleted %0% items
+ Deleted %0% out of %1% item
+ Deleted %0% out of %1% items
+
+ Published %0% item
+ Published %0% items
+ Published %0% out of %1% item
+ Published %0% out of %1% items
+
+ Unpublished %0% item
+ Unpublished %0% items
+ Unpublished %0% out of %1% item
+ Unpublished %0% out of %1% items
+
+ Moved %0% item
+ Moved %0% items
+ Moved %0% out of %1% item
+ Moved %0% out of %1% items
+
+ Copied %0% item
+ Copied %0% items
+ Copied %0% out of %1% item
+ Copied %0% out of %1% items
+
+
+ Name
+ Manage hostnames
+ Close this window
+ Are you sure you want to delete
+ Are you sure you want to disable
+ Please check this box to confirm deletion of %0% item(s)
+ Are you sure?
+ Are you sure?
+ Cut
+ Edit Dictionary Item
+ Edit Language
+ Insert local link
+ Insert character
+ Insert graphic headline
+ Insert picture
+ Insert link
+ Click to add a Macro
+ Insert table
+ Last Edited
+ Link
+ Internal link:
+ When using local links, insert "#" in front of link
+ Open in new window?
+ Macro Settings
+ This macro does not contain any properties you can edit
+ Paste
+ Edit Permissions for
+ The items in the recycle bin are now being deleted. Please do not close this window while this operation takes place
+ The recycle bin is now empty
+ When items are deleted from the recycle bin, they will be gone forever
+ regexlib.com's webservice is currently experiencing some problems, which we have no control over. We are very sorry for this inconvenience.]]>
+ Search for a regular expression to add validation to a form field. Example: 'email, 'zip-code' 'url'
+ Remove Macro
+ Required Field
+ Site is reindexed
+ The website cache has been refreshed. All publish content is now up to date. While all unpublished content is still unpublished
+ The website cache will be refreshed. All published content will be updated, while unpublished content will stay unpublished.
+ Number of columns
+ Number of rows
+ Set a placeholder id by setting an ID on your placeholder you can inject content into this template from child templates,
+ by referring this ID using a <asp:content /> element.]]>
+ Select a placeholder id from the list below. You can only
+ choose Id's from the current template's master.]]>
+ Click on the image to see full size
+ Pick item
+ View Cache Item
+ Create folder...
+
+ Relate to original
+ The friendliest community
+
+ Link to page
+
+ Opens the linked document in a new window or tab
+ Opens the linked document in the full body of the window
+ Opens the linked document in the parent frame
+
+ Link to media
+
+ Select media
+ Select icon
+ Select item
+ Select link
+ Select macro
+ Select content
+ Select member
+ Select member group
+
+ There are no parameters for this macro
+
+ External login providers
+ Exception Details
+ Stacktrace
+ Inner Exception
+
+ Link your
+ Un-Link your
+
+ account
+
+ Select editor
+
+
+ %0%' below You can add additional languages under the 'languages' in the menu on the left
+ ]]>
+ Culture Name
+
+
+ Enter your username
+ Enter your password
+ Confirm your password
+ Name the %0%...
+ Enter a name...
+ Label...
+ Enter a description...
+ Type to search...
+ Type to filter...
+ Type to add tags (press enter after each tag)...
+ Enter your email
+
+
+
+ Allow at root
+ Only Content Types with this checked can be created at the root level of Content and Media trees
+ Allowed child node types
+ Document Type Compositions
+ Create
+ Delete tab
+ Description
+ New tab
+ Tab
+ Thumbnail
+ Enable list view
+ Configures the content item to show a sortable & searchable list of its children, the children will not be shown in the tree
+ Current list view
+ The active list view data type
+ Create custom list view
+ Remove custom list view
+
+
+ Add prevalue
+ Database datatype
+ Property editor GUID
+ Property editor
+ Buttons
+ Enable advanced settings for
+ Enable context menu
+ Maximum default size of inserted images
+ Related stylesheets
+ Show label
+ Width and height
+
+
+ Your data has been saved, but before you can publish this page there are some errors you need to fix first:
+ The current membership provider does not support changing password (EnablePasswordRetrieval need to be true)
+ %0% already exists
+ There were errors:
+ There were errors:
+ The password should be a minimum of %0% characters long and contain at least %1% non-alpha numeric character(s)
+ %0% must be an integer
+ The %0% field in the %1% tab is mandatory
+ %0% is a mandatory field
+ %0% at %1% is not in a correct format
+ %0% is not in a correct format
+
+
+ Received an error from the server
+ The specified file type has been disallowed by the administrator
+ NOTE! Even though CodeMirror is enabled by configuration, it is disabled in Internet Explorer because it's not stable enough.
+ Please fill both alias and name on the new property type!
+ There is a problem with read/write access to a specific file or folder
+ Error loading Partial View script (file: %0%)
+ Error loading userControl '%0%'
+ Error loading customControl (Assembly: %0%, Type: '%1%')
+ Error loading MacroEngine script (file: %0%)
+ "Error parsing XSLT file: %0%
+ "Error reading XSLT file: %0%
+ Please enter a title
+ Please choose a type
+ You're about to make the picture larger than the original size. Are you sure that you want to proceed?
+ Error in python script
+ The python script has not been saved, because it contained error(s)
+ Startnode deleted, please contact your administrator
+ Please mark content before changing style
+ No active styles available
+ Please place cursor at the left of the two cells you wish to merge
+ You cannot split a cell that hasn't been merged.
+ Error in XSLT source
+ The XSLT has not been saved, because it contained error(s)
+ There is a configuration error with the data type used for this property, please check the data type
+
+
+ About
+ Action
+ Actions
+ Add
+ Alias
+ All
+ Are you sure?
+ Back
+ Border
+ by
+ Cancel
+ Cell margin
+ Choose
+ Close
+ Close Window
+ Comment
+ Confirm
+ Constrain proportions
+ Continue
+ Copy
+ Create
+ Database
+ Date
+ Default
+ Delete
+ Deleted
+ Deleting...
+ Design
+ Dimensions
+ Down
+ Download
+ Edit
+ Edited
+ Elements
+ Email
+ Error
+ Find
+ Height
+ Help
+ Icon
+ Import
+ Inner margin
+ Insert
+ Install
+ Invalid
+ Justify
+ Label
+ Language
+ Layout
+ Loading
+ Locked
+ Login
+ Log off
+ Logout
+ Macro
+ Mandatory
+ Move
+ More
+ Name
+ New
+ Next
+ No
+ of
+ OK
+ Open
+ or
+ Password
+ Path
+ Placeholder ID
+ One moment please...
+ Previous
+ Properties
+ Email to receive form data
+ Recycle Bin
+ Your recycle bin is empty
+ Remaining
+ Rename
+ Renew
+ Required
+ Retry
+ Permissions
+ Search
+ Sorry, we can not find what you are looking for
+ Server
+ Show
+ Show page on Send
+ Size
+ Sort
+ Submit
+ Type
+ Type to search...
+ Up
+ Update
+ Upgrade
+ Upload
+ Url
+ User
+ Username
+ Value
+ View
+ Welcome...
+ Width
+ Yes
+ Folder
+ Search results
+ Reorder
+ I am done reordering
+ Preview
+ Change password
+ to
+ List view
+ Saving...
+ current
+ Embed
+ selected
+
+
+ Black
+ Green
+ Yellow
+ Orange
+ Blue
+ Red
+
+
+ Add tab
+ Add property
+ Add editor
+ Add template
+ Add child node
+ Add child
+
+ Edit data type
+
+ Navigate sections
+
+ Shortcuts
+ show shortcuts
+
+ Toggle list view
+ Toggle allow as root
+
+
+ Background color
+ Bold
+ Text color
+ Font
+ Text
+
+
+ Page
+
+
+ The installer cannot connect to the database.
+ Could not save the web.config file. Please modify the connection string manually.
+ Your database has been found and is identified as
+ Database configuration
+ install button to install the Umbraco %0% database
+ ]]>
+ Next to proceed.]]>
+ Database not found! Please check that the information in the "connection string" of the "web.config" file is correct.
+ To proceed, please edit the "web.config" file (using Visual Studio or your favourite text editor), scroll to the bottom, add the connection string for your database in the key named "UmbracoDbDSN" and save the file.
+
+ Click the retry button when
+ done.
+ More information on editing web.config here.
]]>
+
+ Please contact your ISP if necessary.
+ If you're installing on a local machine or server you might need information from your system administrator.]]>
+
+ Press the upgrade button to upgrade your database to Umbraco %0%
+
+ Don't worry - no content will be deleted and everything will continue working afterwards!
+
+ ]]>
+
+ Press Next to
+ proceed. ]]>
+
+ next to continue the configuration wizard]]>
+ The Default users' password needs to be changed!]]>
+ The Default user has been disabled or has no access to Umbraco!No further actions needs to be taken. Click Next to proceed.]]>
+ The Default user's password has been successfully changed since the installation!No further actions needs to be taken. Click Next to proceed.]]>
+ The password is changed!
+
+ ('admin') and password ('default') . It's important that the password is changed to something unique.
+ ]]>
+ Get a great start, watch our introduction videos
+ By clicking the next button (or modifying the umbracoConfigurationStatus in web.config), you accept the license for this software as specified in the box below. Notice that this Umbraco distribution consists of two different licenses, the open source MIT license for the framework and the Umbraco freeware license that covers the UI.
+ Not installed yet.
+ Affected files and folders
+ More information on setting up permissions for Umbraco here
+ You need to grant ASP.NET modify permissions to the following files/folders
+ Your permission settings are almost perfect!
+ You can run Umbraco without problems, but you will not be able to install packages which are recommended to take full advantage of Umbraco.]]>
+ How to Resolve
+ Click here to read the text version
+ video tutorial on setting up folder permissions for Umbraco or read the text version.]]>
+ Your permission settings might be an issue!
+
+ You can run Umbraco without problems, but you will not be able to create folders or install packages which are recommended to take full advantage of Umbraco.]]>
+ Your permission settings are not ready for Umbraco!
+
+ In order to run Umbraco, you'll need to update your permission settings.]]>
+ Your permission settings are perfect!
+ You are ready to run Umbraco and install packages!]]>
+ Resolving folder issue
+ Follow this link for more information on problems with ASP.NET and creating folders
+ Setting up folder permissions
+
+ I want to start from scratch
+
+ learn how)
+ You can still choose to install Runway later on. Please go to the Developer section and choose Packages.
+ ]]>
+ You've just set up a clean Umbraco platform. What do you want to do next?
+ Runway is installed
+
+ This is our list of recommended modules, check off the ones you would like to install, or view the full list of modules
+ ]]>
+ Only recommended for experienced users
+ I want to start with a simple website
+
+
+ "Runway" is a simple website providing some basic document types and templates. The installer can set up Runway for you automatically,
+ but you can easily edit, extend or remove it. It's not necessary and you can perfectly use Umbraco without it. However,
+ Runway offers an easy foundation based on best practices to get you started faster than ever.
+ If you choose to install Runway, you can optionally select basic building blocks called Runway Modules to enhance your Runway pages.
+
+
+ Included with Runway: Home page, Getting Started page, Installing Modules page.
+ Optional Modules: Top Navigation, Sitemap, Contact, Gallery.
+
+ ]]>
+ What is Runway
+ Step 1/5 Accept license
+ Step 2/5: Database configuration
+ Step 3/5: Validating File Permissions
+ Step 4/5: Check Umbraco security
+ Step 5/5: Umbraco is ready to get you started
+ Thank you for choosing Umbraco
+ Browse your new site
+You installed Runway, so why not see how your new website looks.]]>
+ Further help and information
+Get help from our award winning community, browse the documentation or watch some free videos on how to build a simple site, how to use packages and a quick guide to the Umbraco terminology]]>
+ Umbraco %0% is installed and ready for use
+ /web.config file and update the AppSetting key UmbracoConfigurationStatus in the bottom to the value of '%0%' .]]>
+ started instantly by clicking the "Launch Umbraco" button below. If you are new to Umbraco ,
+you can find plenty of resources on our getting started pages.]]>
+ Launch Umbraco
+To manage your website, simply open the Umbraco back office and start adding content, updating the templates and stylesheets or add new functionality]]>
+ Connection to database failed.
+ Umbraco Version 3
+ Umbraco Version 4
+ Watch
+ Umbraco %0% for a fresh install or upgrading from version 3.0.
+
+ Press "next" to start the wizard.]]>
+
+
+ Culture Code
+ Culture Name
+
+
+ You've been idle and logout will automatically occur in
+ Renew now to save your work
+
+
+ Happy super Sunday
+ Happy manic Monday
+ Happy tubular Tuesday
+ Happy wonderful Wednesday
+ Happy thunderous Thursday
+ Happy funky Friday
+ Happy Caturday
+ Log in below
+ Sign in with
+ Session timed out
+ © 2001 - %0% Umbraco.com ]]>
+ Forgotten password?
+ An email will be sent to the address specified with a link to reset your password
+ An email with password reset instructions will be sent to the specified address if it matched our records
+ Return to login form
+ Please provide a new password
+ Your Password has been updated
+ The link you have clicked on is invalid or has expired
+ Umbraco: Reset Password
+
+ Your username to login to the Umbraco back-office is: %0% Click here to reset your password or copy/paste this URL into your browser:
%1%
]]>
+
+
+
+ Dashboard
+ Sections
+ Content
+
+
+ Choose page above...
+ %0% has been copied to %1%
+ Select where the document %0% should be copied to below
+ %0% has been moved to %1%
+ Select where the document %0% should be moved to below
+ has been selected as the root of your new content, click 'ok' below.
+ No node selected yet, please select a node in the list above before clicking 'ok'
+ The current node is not allowed under the chosen node because of its type
+ The current node cannot be moved to one of its subpages
+ The current node cannot exist at the root
+ The action isn't allowed since you have insufficient permissions on 1 or more child documents.
+ Relate copied items to original
+
+
+ Edit your notification for %0%
+
+
+ Hi %0%
+
+ This is an automated mail to inform you that the task '%1%'
+ has been performed on the page '%2%'
+ by the user '%3%'
+
+
+
+
Update summary:
+
+
+
+
+
+ Have a nice day!
+ Cheers from the Umbraco robot
+
]]>
+ [%0%] Notification about %1% performed on %2%
+ Notifications
+
+
+
+ button and locating the package. Umbraco packages usually have a ".umb" or ".zip" extension.
+ ]]>
+ Author
+ Demonstration
+ Documentation
+ Package meta data
+ Package name
+ Package doesn't contain any items
+
+ You can safely remove this from the system by clicking "uninstall package" below.]]>
+ No upgrades available
+ Package options
+ Package readme
+ Package repository
+ Confirm uninstall
+ Package was uninstalled
+ The package was successfully uninstalled
+ Uninstall package
+
+ Notice: any documents, media etc depending on the items you remove, will stop working, and could lead to system instability,
+ so uninstall with caution. If in doubt, contact the package author.]]>
+ Download update from the repository
+ Upgrade package
+ Upgrade instructions
+ There's an upgrade available for this package. You can download it directly from the Umbraco package repository.
+ Package version
+ Package version history
+ View package website
+ Package already installed
+ This package cannot be installed, it requires a minimum Umbraco version of %0%
+ Uninstalling...
+ Downloading...
+ Importing...
+ Installing...
+ Restarting, please wait...
+ All done, your browser will now refresh, please wait...
+
+
+ Paste with full formatting (Not recommended)
+ The text you're trying to paste contains special characters or formatting. This could be caused by copying text from Microsoft Word. Umbraco can remove special characters or formatting automatically, so the pasted content will be more suitable for the web.
+ Paste as raw text without any formatting at all
+ Paste, but remove formatting (Recommended)
+
+
+ Role based protection
+ using Umbraco's member groups.]]>
+ role-based authentication.]]>
+ Error Page
+ Used when people are logged on, but do not have access
+ Choose how to restrict access to this page
+ %0% is now protected
+ Protection removed from %0%
+ Login Page
+ Choose the page that contains the login form
+ Remove Protection
+ Select the pages that contain login form and error messages
+ Pick the roles who have access to this page
+ Set the login and password for this page
+ Single user protection
+ If you just want to setup simple protection using a single login and password
+
+
+
+
+
+
+
+
+
+ Include unpublished subpages
+ Publishing in progress - please wait...
+ %0% out of %1% pages have been published...
+ %0% has been published
+ %0% and subpages have been published
+ Publish %0% and all its subpages
+ Publish to publish %0% and thereby making its content publicly available.
+ You can publish this page and all its subpages by checking Include unpublished subpages below.
+ ]]>
+
+
+ You have not configured any approved colors
+
+
+ enter external link
+ choose internal page
+ Caption
+ Link
+ Open in new window
+ enter the display caption
+ Enter the link
+
+
+ Reset
+
+
+ Current version
+ Red text will not be shown in the selected version. , green means added ]]>
+ Document has been rolled back
+ This displays the selected version as HTML, if you wish to see the difference between 2 versions at the same time, use the diff view
+ Rollback to
+ Select version
+ View
+
+
+ Edit script file
+
+
+ Concierge
+ Content
+ Courier
+ Developer
+ Umbraco Configuration Wizard
+ Media
+ Members
+ Newsletters
+ Settings
+ Statistics
+ Translation
+ Users
+ Help
+ Forms
+ Analytics
+
+
+ go to
+ Help topics for
+ Video chapters for
+ The best Umbraco video tutorials
+
+
+ Default template
+ Dictionary Key
+ To import a document type, find the ".udt" file on your computer by clicking the "Browse" button and click "Import" (you'll be asked for confirmation on the next screen)
+ New Tab Title
+ Node type
+ Type
+ Stylesheet
+ Script
+ Stylesheet property
+ Tab
+ Tab Title
+ Tabs
+ Master Content Type enabled
+ This Content Type uses
+ as a Master Content Type. Tabs from Master Content Types are not shown and can only be edited on the Master Content Type itself
+ No properties defined on this tab. Click on the "add a new property" link at the top to create a new property.
+ Master Document Type
+ Create matching template
+ Add icon
+
+
+ Sort order
+ Creation date
+ Sorting complete.
+ Drag the different items up or down below to set how they should be arranged. Or click the column headers to sort the entire collection of items
+ Do not close this window during sorting]]>
+
+
+ Validation
+ Validation errors must be fixed before the item can be saved
+ Failed
+ Insufficient user permissions, could not complete the operation
+ Cancelled
+ Operation was cancelled by a 3rd party add-in
+ Publishing was cancelled by a 3rd party add-in
+ Property type already exists
+ Property type created
+ DataType: %1%]]>
+ Propertytype deleted
+ Document Type saved
+ Tab created
+ Tab deleted
+ Tab with id: %0% deleted
+ Stylesheet not saved
+ Stylesheet saved
+ Stylesheet saved without any errors
+ Datatype saved
+ Dictionary item saved
+ Publishing failed because the parent page isn't published
+ Content published
+ and visible at the website
+ Content saved
+ Remember to publish to make changes visible
+ Sent For Approval
+ Changes have been sent for approval
+ Media saved
+ Media saved without any errors
+ Member saved
+ Stylesheet Property Saved
+ Stylesheet saved
+ Template saved
+ Error saving user (check log)
+ User Saved
+ User type saved
+ File not saved
+ file could not be saved. Please check file permissions
+ File saved
+ File saved without any errors
+ Language saved
+ Media Type saved
+ Member Type saved
+ Python script not saved
+ Python script could not be saved due to error
+ Python script saved
+ No errors in python script
+ Template not saved
+ Please make sure that you do not have 2 templates with the same alias
+ Template saved
+ Template saved without any errors!
+ XSLT not saved
+ XSLT contained an error
+ XSLT could not be saved, check file permissions
+ XSLT saved
+ No errors in XSLT
+ Content unpublished
+ Partial view saved
+ Partial view saved without any errors!
+ Partial view not saved
+ An error occurred saving the file.
+ Script view saved
+ Script view saved without any errors!
+ Script view not saved
+ An error occurred saving the file.
+ An error occurred saving the file.
+
+
+ Uses CSS syntax ex: h1, .redHeader, .blueTex
+ Edit stylesheet
+ Edit stylesheet property
+ Name to identify the style property in the rich text editor
+ Preview
+ Styles
+
+
+ Edit template
+ Insert content area
+ Insert content area placeholder
+ Insert dictionary item
+ Insert Macro
+ Insert Umbraco page field
+ Master template
+ Quick Guide to Umbraco template tags
+ Template
+
+
+ Choose type of content
+ Choose a layout
+ Add a row
+ Add content
+ Drop content
+ Settings applied
+
+ This content is not allowed here
+ This content is allowed here
+
+ Click to embed
+ Click to insert image
+ Image caption...
+ Write here...
+
+ Grid Layouts
+ Layouts are the overall work area for the grid editor, usually you only need one or two different layouts
+ Add Grid Layout
+ Adjust the layout by setting column widths and adding additional sections
+ Row configurations
+ Rows are predefined cells arranged horizontally
+ Add row configuration
+ Adjust the row by setting cell widths and adding additional cells
+
+ Columns
+ Total combined number of columns in the grid layout
+
+ Settings
+ Configure what settings editors can change
+
+
+ Styles
+ Configure what styling editors can change
+
+ Settings will only save if the entered json configuration is valid
+
+ Allow all editors
+ Allow all row configurations
+ Set as default
+ Choose extra
+ Choose default
+ are added
+
+
+
+ Compositions
+ You have not added any tabs
+ Add new tab
+ Add another tab
+ Inherited from
+ Add property
+ Required label
+
+ Enable list view
+ Configures the content item to show a sortable and searchable list of its children, the children will not be shown in the tree
+
+ Allowed Templates
+ Choose which templates editors are allowed to use on content of this type
+ Allow as root
+ Allow editors to create content of this type in the root of the content tree
+ Yes - allow content of this type in the root
+
+ Allowed child node types
+ Allow content of the specified types to be created underneath content of this type
+
+ Choose child node
+ Inherit tabs and properties from an existing document type. New tabs will be added to the current document type or merged if a tab with an identical name exists.
+ This content type is used in a composition, and therefore cannot be composed itself.
+ There are no content types available to use as a composition.
+
+ Available editors
+ Reuse
+ Editor settings
+
+ Configuration
+
+ Yes, delete
+
+ was moved underneath
+ was copied underneath
+ Select the folder to move
+ Select the folder to copy
+ to in the tree structure below
+
+ All Document types
+ All Documents
+ All media items
+
+ using this document type will be deleted permanently, please confirm you want to delete these as well.
+ using this media type will be deleted permanently, please confirm you want to delete these as well.
+ using this member type will be deleted permanently, please confirm you want to delete these as well
+
+ and all documents using this type
+ and all media items using this type
+ and all members using this type
+
+ using this editor will get updated with the new settings
+
+ Member can edit
+ Show on member profile
+ tab has no sort order
+
+
+
+ Building models
+ this can take abit of time, don't worry
+ Models generated
+ Models could not be generated
+ Models generation has failed, see exception in U log
+
+
+
+ Alternative field
+ Alternative Text
+ Casing
+ Encoding
+ Choose field
+ Convert line breaks
+ Replaces line breaks with html-tag <br>
+ Custom Fields
+ Yes, Date only
+ Format as date
+ HTML encode
+ Will replace special characters by their HTML equivalent.
+ Will be inserted after the field value
+ Will be inserted before the field value
+ Lowercase
+ None
+ Insert after field
+ Insert before field
+ Recursive
+ Remove Paragraph tags
+ Will remove any <P> in the beginning and end of the text
+ Standard Fields
+ Uppercase
+ URL encode
+ Will format special characters in URLs
+ Will only be used when the field values above are empty
+ This field will only be used if the primary field is empty
+ Yes, with time. Separator:
+
+
+ Tasks assigned to you
+ assigned to you. To see a detailed view including comments, click on "Details" or just the page name.
+ You can also download the page as XML directly by clicking the "Download Xml" link.
+ To close a translation task, please go to the Details view and click the "Close" button.
+ ]]>
+ close task
+ Translation details
+ Download all translation tasks as XML
+ Download XML
+ Download XML DTD
+ Fields
+ Include subpages
+
+ [%0%] Translation task for %1%
+ No translator users found. Please create a translator user before you start sending content to translation
+ Tasks created by you
+ created by you. To see a detailed view including comments,
+ click on "Details" or just the page name. You can also download the page as XML directly by clicking the "Download Xml" link.
+ To close a translation task, please go to the Details view and click the "Close" button.
+ ]]>
+ The page '%0%' has been send to translation
+ Please select the language that the content should be translated into
+ Send the page '%0%' to translation
+ Assigned by
+ Task opened
+ Total words
+ Translate to
+ Translation completed.
+ You can preview the pages, you've just translated, by clicking below. If the original page is found, you will get a comparison of the 2 pages.
+ Translation failed, the XML file might be corrupt
+ Translation options
+ Translator
+ Upload translation XML
+
+
+ Cache Browser
+ Recycle Bin
+ Created packages
+ Data Types
+ Dictionary
+ Installed packages
+ Install skin
+ Install starter kit
+ Languages
+ Install local package
+ Macros
+ Media Types
+ Members
+ Member Groups
+ Member Roles
+ Member Types
+ Document Types
+ Relation Types
+ Packages
+ Packages
+ Python Files
+ Install from repository
+ Install Runway
+ Runway modules
+ Scripting Files
+ Scripts
+ Stylesheets
+ Templates
+ XSLT Files
+ Analytics
+
+
+ New update ready
+ %0% is ready, click here for download
+ No connection to server
+ Error checking for update. Please review trace-stack for further information
+
+
+ Administrator
+ Category field
+ Change Your Password
+ New password
+ Confirm new password
+ You can change your password for accessing the Umbraco Back Office by filling out the form below and click the 'Change Password' button
+ Content Channel
+ Description field
+ Disable User
+ Document Type
+ Editor
+ Excerpt field
+ Language
+ Login
+ Start Node in Media Library
+ Sections
+ Disable Umbraco Access
+ Old password
+ Password
+ Reset password
+ Your password has been changed!
+ Please confirm the new password
+ Enter your new password
+ Your new password cannot be blank!
+ Current password
+ Invalid current password
+ There was a difference between the new password and the confirmed password. Please try again!
+ The confirmed password doesn't match the new password!
+ Replace child node permissions
+ You are currently modifying permissions for the pages:
+ Select pages to modify their permissions
+ Search all children
+ Start Node in Content
+ Name
+ User permissions
+ User type
+ User types
+ Writer
+ Translator
+ Change
+ Your profile
+ Your recent history
+ Session expires in
+
+
+ Validation
+ Validate as email
+ Validate as a number
+ Validate as a Url
+ ...or enter a custom validation
+ Field is mandatory
+
+
+
+ Value is set to the recommended value: '%0%'.
+ Value was set to '%1%' for XPath '%2%' in configuration file '%3%'.
+ Expected value '%1%' for '%2%' in configuration file '%3%', but found '%0%'.
+ Found unexpected value '%0%' for '%2%' in configuration file '%3%'.
+
+
+ Custom errors are set to '%0%'.
+ Custom errors are currently set to '%0%'. It is recommended to set this to '%1%' before go live.
+ Custom errors successfully set to '%0%'.
+
+ MacroErrors are set to '%0%'.
+ MacroErrors are set to '%0%' which will prevent some or all pages in your site from loading completely when there's any errors in macros. Rectifying this will set the value to '%1%'.
+ MacroErrors are now set to '%0%'.
+
+
+ Try Skip IIS Custom Errors is set to '%0%' and you're using IIS version '%1%'.
+ Try Skip IIS Custom Errors is currently '%0%'. It is recommended to set this to '%1%' for your IIS version (%2%).
+ Try Skip IIS Custom Errors successfully set to '%0%'.
+
+
+ File does not exist: '%0%'.
+ '%0%' in config file '%1%' .]]>
+ There was an error, check log for full error: %0%.
+
+ Members - Total XML: %0%, Total: %1%, Total invalid: %2%
+ Media - Total XML: %0%, Total: %1%, Total invalid: %2%
+ Content - Total XML: %0%, Total published: %1%, Total invalid: %2%
+
+ Your site certificate was marked as valid.
+ Certificate validation error: '%0%'
+ Error pinging the URL %0% - '%1%'
+ You are currently %0% viewing the site using the HTTPS scheme.
+ The appSetting 'umbracoUseSSL' is set to 'false' in your web.config file. Once you access this site using the HTTPS scheme, that should be set to 'true'.
+ The appSetting 'umbracoUseSSL' is set to '%0%' in your web.config file, your cookies are %1% marked as secure.
+ Could not update the 'umbracoUseSSL' setting in your web.config file. Error: %0%
+
+
+ Enable HTTPS
+ Sets umbracoSSL setting to true in the appSettings of the web.config file.
+ The appSetting 'umbracoUseSSL' is now set to 'true' in your web.config file, your cookies will be marked as secure.
+
+ Fix
+ Cannot fix a check with a value comparison type of 'ShouldNotEqual'.
+ Cannot fix a check with a value comparison type of 'ShouldEqual' with a provided value.
+ Value to fix check not provided.
+
+ Debug compilation mode is disabled.
+ Debug compilation mode is currently enabled. It is recommended to disable this setting before go live.
+ Debug compilation mode successfully disabled.
+
+ Trace mode is disabled.
+ Trace mode is currently enabled. It is recommended to disable this setting before go live.
+ Trace mode successfully disabled.
+
+ All folders have the correct permissions set.
+
+ %0%.]]>
+ %0%. If they aren't being written to no action need be taken.]]>
+
+ All files have the correct permissions set.
+
+ %0%.]]>
+ %0%. If they aren't being written to no action need be taken.]]>
+
+ X-Frame-Options used to control whether a site can be IFRAMEd by another was found.]]>
+ X-Frame-Options used to control whether a site can be IFRAMEd by another was not found.]]>
+ Set Header in Config
+ Adds a value to the httpProtocol/customHeaders section of web.config to prevent the site being IFRAMEd by other websites.
+ A setting to create a header preventing IFRAMEing of the site by other websites has been added to your web.config file.
+ Could not update web.config file. Error: %0%
+
+
+ %0%.]]>
+ No headers revealing information about the website technology were found.
+
+ In the Web.config file, system.net/mailsettings could not be found.
+ In the Web.config file system.net/mailsettings section, the host is not configured.
+ SMTP settings are configured correctly and the service is operating as expected.
+ The SMTP server configured with host '%0%' and port '%1%' could not be reached. Please check to ensure the SMTP settings in the Web.config file system.net/mailsettings are correct.
+
+ %0%.]]>
+ %0%.]]>
+
+
+ Disable URL tracker
+ Enable URL tracker
+ Original URL
+ Redirected To
+ No redirects have been made
+ When a published page gets renamed or moved a redirect will automatically be made to the new page.
+ Remove
+ Are you sure you want to remove the redirect from '%0%' to '%1%'?
+ Redirect URL removed.
+ Error removing redirect URL.
+ Are you sure you want to disable the URL tracker?
+ URL tracker has now been disabled.
+ Error disabling the URL tracker, more information can be found in your log file.
+ URL tracker has now been enabled.
+ Error enabling the URL tracker, more information can be found in your log file.
+
+
diff --git a/OurUmbraco.Site/umbraco/config/lang/es.xml b/OurUmbraco.Site/umbraco/config/lang/es.xml
index 4d652352..09af6059 100644
--- a/OurUmbraco.Site/umbraco/config/lang/es.xml
+++ b/OurUmbraco.Site/umbraco/config/lang/es.xml
@@ -1,936 +1,936 @@
-
-
-
- The Umbraco community
- http://our.umbraco.org/documentation/Extending-Umbraco/Language-Files
-
-
- Administrar hostnames
- Auditoría
- Nodo de Exploración
- Cambiar tipo de documento
- Copiar
- Crear
- Crear Paquete
- Borrar
- Deshabilitar
- Vaciar Papelera
- Exportar Documento (tipo)
- Importar Documento (tipo)
- Importar Paquete
- Editar en lienzo
- Salir
- Mover
- Notificaciones
- Acceso Público
- Publicar
- Unpublish
- Recargar Nodos
- Republicar sitio completo
- Permisos
- Deshacer
- Enviar a Publicar
- Enviar a Traducir
- Ordernar
- Enviar a publicación
- Traducir
- Actualizar
- Valor por defecto
-
-
- Permiso denegado.
- Añadir nuevo dominio
- quitar
- Nodo no válido.
- Formato de dominio no válido.
- Este dominio ya ha sido asignado.
- Language
- Dominio
- El nuevo dominio %0% ha sido creado
- El dominio %0% ha sido borrado
- El dominio'%0%' ya ha sido asignado
- El dominio %0% ha sido actualizado
- Editar dominios actuales
-
- Los dominios de un nivel están soportados, por ej. "example.com/en". De todas formas deberían de evitarse. Mejor usar la configuración cultural especificada arriba.]]>
-
- Heredar
- Cultura
-
- o hereda la cultura de los nodos padres. También se aplicará
- para el nodo actual, a menos que un dominio por debajo lo aplique también.]]>
-
- Domains
-
-
- Visualización de
-
-
- Seleccionar
- Selecciona la carpeta actual
- Hacer otra cosa
- Negrita
- Cancelar Sangría del Párrafo
- Insertar campo de formulario
- Insertar gráfico de titular
- Editar Html
- Sangría
- Cursiva
- Centrar
- Alinear a la Izquierda
- Alinear a la Derecha
- Insertar Link
- Insertar link local (anchor)
- Lista en Viñetas
- Lista Numérica
- Insertar macro
- Insertar imagen
- Editar relaciones
- Guardar
- Guardar y publicar
- Guardar y enviar para aprobación
- Previsualizar
- La previsualización está deshabilitada porque no hay ninguna plantilla asignada
- Elegir estilo
- Mostrar estilos
- Insertar tabla
- Volver al listado
-
-
- Para cambiar el tipo de documento al contenido seleccionado, primero selecciona uno de la lista de tipos válidos.
- Entonces confirma el mapeo de propiedades del tipo actual al nuevo y haz click en Guardar.
- El contenido se ha vuelto a publicar.
- Propiedad actual
- Tipo actual
- El tipo de contenido no se puede cambiar, porque no hay alternativas válidas para este contenido.
- Tipo de documento cambiado
- Mapeo de propiedades
- Mapea a la propiedad
- Nueva plantilla
- Nuevo tipo
- ninguno
- Contenido
- Selecciona un nuevo Tipo de Documento
- El tipo de documento del contenido seleccionado ha sido cambiado correctamente a [new type] y las siguientes propiedades mapeadas:
- a
- No se ha podido completar el mapeo de propiedades porque uno o más propiedades tienen más de un mapeo definido.
- Solo se muestran otros tipos válidos para el contenido actual.
-
-
- Está publicado
- Acerca de
- Link alternativo
- (como describe la imagen sobre el teléfono)
- Vinculos Alternativos
- Click para editar esta entrada
- Creado por
- Autor original
- Actualizado por
- Creado
- Fecha/hora de creación del documento
- Tipo de Documento
- Editando
- Remover el
- Esta entrada ha sido modificada después de haber sido publicada
- Esta entrada no esta publicada
- Último publicado
- Tipo de Medio
- Miembro de Grupo
- Rol
- Tipo de miembro
- Sin fecha
- Título de la página
- Propiedades
- Este documento ha sido publicado pero no es visible porque el padre '%0%' no esta publicado
- Upss: este documento está publicado pero no está en la caché (error interno)
- Publicar
- Estado de la Publicación
- Publicar el
- Despublicar el
- Fecha de Eliminación
- El Orden esta actualizado
- Para organizar los nodos, simplemente arrastre los nodos o realice un clic en uno de los encabezados de columna. Puede seleccionar multiple nodos manteniendo presionados "Shift" o "Control" mientras selecciona
- Estadísticas
- Título (opcional)
- Tipo
- No Publicar
- Última actualización
- Fecha/hora este documento fue modificado
- Eliminar archivo
- Vínculo al documento
- Miembro de grupo(s)
- No es miembreo de grupo(s)
- Nodos hijo
- Target
- No hay datos que mostrar
-
-
- Haz click para subir archivos
- Arrastra los archivos aquí...
-
-
- ¿Dónde quieres crear el nuevo %0%
- Crear debajo de
- Elije un tipo y un título
- "Tipos de documentos".]]>
- "Tipos de medios".]]>
-
-
- Navega en tu sitio Web
- No volver a mostrar
- Si Umbraco no se ha abierto tendrás que permitir ventanas emergentes para este sitio Web
- se ha abierto en una nueva ventana
- Reinicio
- Visita
- Bienvenido
-
-
- Stay
- Discard changes
- You have unsaved changes
- Are you sure you want to navigate away from this page? - you have unsaved changes
-
-
- Done
-
- Deleted %0% item
- Deleted %0% items
- Deleted %0% out of %1% item
- Deleted %0% out of %1% items
-
- Published %0% item
- Published %0% items
- Published %0% out of %1% item
- Published %0% out of %1% items
-
- Unpublished %0% item
- Unpublished %0% items
- Unpublished %0% out of %1% item
- Unpublished %0% out of %1% items
-
- Moved %0% item
- Moved %0% items
- Moved %0% out of %1% item
- Moved %0% out of %1% items
-
- Copied %0% item
- Copied %0% items
- Copied %0% out of %1% item
- Copied %0% out of %1% items
-
-
- Nombre
- Administrar dominios
- Cerrar esta ventana
- Esta usted seguro que desea borrar
- Esta usted seguro que desea deshabilitar
- Por favor seleccione esta casilla para confirmar la eliminación de %0% entrada(s)
- Esta usted seguro?
- Esta usted Seguro?
- Cortar
- Editar entrada del Diccionario
- Editar idioma
- Agregar enlace interno
- Insertar caracter
- Insertar titular gráfico
- Insertar imagen
- Insertar enlace
- Insertar macro
- Insertar tabla
- Última edición
- Enlace
- Enlace interno
- Al usar enlaces locales, insertar "#" delante del enlace
- ¿Abrir en nueva ventana?
- Ajustes para la Macro
- Esta macro no contiene ninguna propiedad que pueda editar
- Pegar
- Editar permisos para
- Se está vaciando la papelera. No cierre esta ventana mientras se ejecuta este proceso
- La papelera está vacía
- No podrá recuperar los items una vez sean borrados de la papelera
- regexlib.com está experimentando algunos problemas en estos momentos, de los cuales no somos responsables. Pedimos disculpas por las molestias.]]>
- Buscar una expresión regular para agregar validación a un campo de formulario. Ejemplo: 'correo electrónico', código postal "," url "
- Eliminar macro
- Campo obligatorio
- El sitio ha sido reindexado
- Se ha actualizado la caché y se ha publicado el contenido del sitio web.
- La caché del sitio web será actualizada. Todos los contenidos publicados serán actualizados, mientras el contenido no publicado permanecerá no publicado.
- Número de columnas
- Número de filas
- Coloca un 'placeholder' id al colocar un ID en tu 'placeholder' puedes insertar contenido en esta plantilla desde una plantilla hija, referenciando este ID usando un elemento<asp:content />.]]>
- Seleccione una tecla de la lista abajo indicada. Sólo puede elegir a partir de la ID de la plantilla actual del dominio.
- Haga clic sobre la imagen para verla a tamaño completo.
- Seleccionar item
- Ver item en la caché
-
-
- Editar las diferentes versiones lingüísticas para la entrada en el diccionario '% 0%' debajo añadir otros idiomas en el menu de 'idiomas' en el menú de la izquierda
-
-
-
- Escribe tu nombre de usuario
- Escribe tu contraseña
- Nombre del %0%...
- Escribe un nombre...
- Escribe tu búsqueda...
- Escribe para filtrar resultados...
-
-
- Permitir en nodo raíz
- Sólo tipos de contenido permitidos podrán crearse bajo el nodo raíz de los árboles de Contenido y Media
- Tipos de nodos hijos permitidos
- Composiciones de Tipo de Documento
- Crear
- Borrar pestaña
- Descripción
- Nueva pestaña
- Pestaña
- Miniatura
- Permitir vista de listado
- Configura el contenido para mostrar un listado de nodos hijos, en lugar de mostrarlos en forma de árbol
- Vista de listado actual
- El tipo de vista de listado activa
- Crear un tipo de listado personalizado
- Quitar el tipo de listado personalizado
-
-
- añadir prevalor
-
- Tipo de datos GUID
- Tipo de datos GUIDprestar control
- Botones
- Habilitar la configuración avanzada para
- Habilitar menú contextual
- Por defecto, el tamaño máximo de imágenes insertado
-
- Mostrar etiqueta
-
-
-
- Se ha guardado la información pero debes solucionar los siguientes errores para poder publicar:
- La composición actual del proveedor no es compatible con el cambio de la contraseña (Habilitar la contraseña de recuperación es necesaria para que sea cierta)
- %0% ya existe
- Se han encontrado los siguientes errores:
- Se han encontrado los siguientes errores:
- La clave debe tener como mínimo %0% caracteres y %1% caracter(es) no alfanuméricos
- %0% debe ser un número entero
- Debe llenar los campos del %0% al %1%
- Debe llenar el campo %0%
- Debe poner el formato correcto del %0% al %1%
- Debe poner un formato correcto en %0%
-
-
- NOTA: Aunque CodeMirror esté activado en los ajustes de configuracion, no se muestra en Internet Explorer debido a que no es lo suficientemente estable.'
- Debe llenar el alias y el nombre en el propertytype
- Hay un problema de lectura y escritura al acceder a un archivo o carpeta
-
- Por favor, elija un tipo
- Usted está a punto de hacer la foto más grande que el tamaño original. ¿Está seguro de que desea continuar?
- Error en script python
- El script python no se ha guardado debido a que contenía error(es)
-
- Por favor, marque el contenido antes de cambiar de estilo
- No active estilos disponibles
-
-
-
- El XSLT no se ha guardado, porque contenía un error (s)
-
-
- Acerca de
- Acción
- Acciones
- Añadir
- Alias
- ¿Está seguro?
- Borde
- o
- Cancelar
- Margen de la celda
- Elegir
- Cerrar
- Cerrar ventana
- Comentario
- Confirmar
- Mantener proporciones
- Continuar
- Copiar
- Crear
- Base de datos
- Fecha
- Por defecto
- Borrar
- Borrado
- Borrando...
- Diseño
- Dimensiones
- Abajo
- Descargar
- Editar
- Editado
- Elementos
- Mail
- Error
- Buscar
- Altura
- Ayuda
- Icono
- Importar
- Margen interno
- Insertar
- Instalar
- Justificar
- Idioma
- Diseño
- Cargando
- Bloqueado
- Iniciar sesión
- Cerrar sesión
- Cerrar sesión
- Macro
- Mover
- Nombre
- New
- Próximo
- No
- de
- OK
- Abrir
- o
- Contraseña
- Ruta
- ID de marcador de posición
- Un momento por favor...
- Anterior
- Propiedades
- Mail para recibir los datos del formulario
- Papelera
- Restantes
- Renombrar
- Renovar
- Reintentar
- Permisos
- Buscar
- Servidor
- Mostrar
- Mostrar página al enviar
- Tamaño
- Ordenar
- Submit
- Tipo
- Tipo que buscar...
- Arriba
- Actualizar
- Actualizar
- Upload
- Url
- Usuario
- Nombre de usuario
- Valor
- Ver
- Bienvenido...
- Ancho
- Si
- Reorder
- I am done reordering
-
-
- Color de fondo
- Negritas
- Color del texto
- Fuente
- Texto
-
-
- Página
-
-
- El instalador no puede conectar con la base de datos.
- No se ha podido guardar el archivo Web.config. Por favor, modifique la cadena de conexión manualmente.
- Su base de datos ha sido encontrada y ha sido identificada como
- Configuración de la base de datos
- instalar strong> para instalar %0% la base de datos de Umbraco]]>
- Próximo para continuar]]>
- ¡No se ha encontrado ninguna base de datos! Mira si la información en la "connection string" del “web.config” es correcta. Para continuar, edite el "web.config" (bien sea usando Visual Studio o su editor de texto preferido), vaya al final del archivo y añada la cadena de conexión para la base de datos con el nombre (key) "umbracoDbDSN" y guarde el archivo.
Pinche en reintentar cuando haya terminado.Pinche aquí para mayor información de como editar el web.config (en inglés)
]]>
- Por favor, contacta con tu ISP si es necesario. Si estás realizando la instalación en una máquina o servidor local, quizás necesites información de tu administrador de sistemas.]]>
- Pinche en actualizar para actualizar la base de datos a Umbraco %0% Ningún contenido será borrado de la base de datos y seguirá funcionando después de la actualización
]]>
- Pinche en Próximo para continuar. ]]>
- próximo para continuar con el asistente de configuración]]>
- La contraseña del usuario por defecto debe ser cambiada]]>
- El usuario por defecto ha sido desabilitado o ha perdido el acceso a Umbraco!Pinche en Próximo para continuar.]]>
- ¡La contraseña del usuario por defecto ha sido cambiada desde que se instaló!No hay que realizar ninguna tarea más. Pulsa Siguiente para proseguir.]]>
- ¡La constraseña se ha cambiado!
- Umbraco crea un usuario por defecto con un nombre de usuario ('admin') y constraseña ('default') . Es importante que la contraseña se cambie a algo único. Este paso comprobará la contraseña del usuario por defecto y sugerirá si debe cambiarse.
]]>
- Ten un buen comienzo, visita nuestros videos de introducción
- Pulsando el botón de Siguiente (o modificando el UmbracoConfigurationStatus en el web.config), aceptar la licencia de este software tal y como se especifica en el cuadro de debajo. Ten en cuenta que esta distribución de Umbraco consta de dos licencias diferentes, la licencia open source MIT para el framework y la licencia Umbraco freeware que cubre la IU.
- No ha sido instalado.
- Archivos y directorios afectados
- Mas información en configurar los permisos para Umbraco aquí
- Necesitas dar permisos de modificación a ASP.NET para los siguientes archivos/directorios
- ¡Tu configuración de permisos es casi perfecta! Puedes ejecutar Umbraco sin problemas, pero no podrás instalar paquetes que es algo recomendable para explotar el potencial de Umbraco.]]>
- Como Resolver
- Pulsa aquí para leer la versión de texto
- video tutoriales acerca de cómo configurar los permisos de los directorios para Umbraco o lee la versión de texto.]]>
- ¡La configuración de tus permisos podría ser un problema! Puedes ejecutar Umbraco sin problemas, pero no serás capaz de crear directorios o instalar paquetes que es algo recomendable para explotar el potencial de Umbraco.]]>
- ¡Tu configuración de permisos no está lista para Umbraco! Para ejecutar Umbraco, necesitarás actualizar tu configuración de permisos.]]>
- ¡Tu configuración de permisos es perfecta! ¡Estás listo para ejecutar Umbraco e instalar paquetes!]]>
- Resolviendo problemas con directorios
- Sigue este enlace para más información sobre problemas con ASP.NET y creación de directorios
- Configurando los permisos de directorios
- Umbraco necesita permisos de lectura/escritura en algunos directorios para poder almacenar archivos tales como imagenes y PDFs. También almacena datos en la caché para mejorar el rendimiento de su sitio web
- Quiero empezar de cero
- learn how). Todavía podrás elegir instalar Runway más adelante. Por favor ve a la sección del Desarrollador y elije Paquetes.]]>
- Acabas de configurar una nueva plataforma Umbraco. ¿Qué deseas hacer ahora?
- Se ha instalado Runway
- Esta es nuestra lista de módulos recomendados, selecciona los que desees instalar, o mira la lista completa de módulos ]]>
- Sólo recomendado para usuarios expertos
- Quiero empezar con un sitio web sencillo
- "Runway" es un sitio web sencillo que contiene unos tipos de documentos y plantillas básicos. El instalador puede configurar Runway por ti de forma automática, pero fácilmente puedes editarlo, extenderlo o eliminarlo. No es necesario y puedes usar Umbrao perfectamente sin él. Sin embargo, Runway ofrece unos cimientos sencillos basados en buenas prácticas para iniciarte más rápido que nunca. Si eliges instalar Runway, puedes seleccionar bloques de construcción básicos llamados Módulos de Runway de forma opcional para realzar tus páginas de Runway. > Incluido con Runway: Página de inicio, página de Cómo empezar, página de Instalación de módulos. Módulos opcionales: Navegación superior, Mapa del sitio, Contacto, Galería. ]]>
- ¿Qué es Runway?
- Paso 1 de 5. Aceptar los términos de la licencia
- Paso 2 de 5. Configuración de la base de datos
- Paso 3 de 5. Autorizar / validar permiso en los archivos
- Paso 4 de 5. Configurar seguridad en Umbraco
- Paso 5 de 5. Umbraco está listo para ser usado
- Gracias por elegir Umbraco
- Navega a tu nuevo sitio Has instalado Runway, por qué no ves el aspecto de tu nuevo sitio web.]]>
- Más ayuda e información Consigue ayuda de nuestra premiada comunidad, navega por la documentación o mira algunos videos gratuitos de cómo crear un sitio sencillo, cómo utilizar los paquetes y una guía rápida de la terminología de Umbraco]]>
- Umbraco %0% ha sido instalado y está listo para ser usado
- archivo /web.config y actualizar la clave del AppSetting UmbracoConfigurationStatus del final al valor '%0%' .]]>
- empezar inmediatamente pulsando el botón "Lanzar Umbraco" de debajo. Si eres nuevo con Umbraco , puedes encontrar cantidad de recursos en nuestras páginas de cómo empezar.]]>
- Lanzar Umbraco Para administrar tu sitio web, simplemente abre el back office de Umbraco y empieza a añadir contenido, a actualizar plantillas y hojas de estilo o a añadir nueva funcionalidad]]>
- No se ha podido establecer la conexión con la base de datos
- Umbraco versión 3
- Umbraco versión 4
- Mirar
- Umbraco %0% o actualizar la versión 3.0 a Umbraco %0% . Pinche en "próximo" para empezar con el asistente de configuración.]]>
-
-
- Código de cultura
- Nombre de cultura
-
-
- No ha habido ninguna actividad y su sessión se cerrará en
- Renovar su sessión para guardar sus cambios
-
-
- Feliz super domingo
- Feliz lunes
- Tremendo martes
- Maravilloso miércoles
- Fantástico jueves
- ¡Ya es viernes!
- Resplandeciente sábado
- Iniciar sesión
- La sesión ha caducado
- © 2001 - %0% umbraco.com ]]>
-
-
-
- Panel de Administración
- Secciones
- Contenido
-
-
- Elija una página arriba...
- %0% ha sido copiado al %1%
- Seleccione donde el documento %0% debe ser copiado abajo
- %0% ha sido movido a %1%
- Seleccione debajo donde mover el documento %0%
- ha sido seleccionado como raíz de su nuevo contenido, haga click sobre 'ok' debajo.
- No ha seleccionado ningún nodo. Seleccione un nodo en la lista mostrada arriba antes the pinchar en 'continuar' (continue)
- No se puede colgar el nodo actual bajo el nodo elegido debido a su tipo
- El nodo actual no puede moverse a ninguna de sus subpáginas
- Acción no permitida. No tiene permisos suficientes para uno o más subnodos.'
-
-
- Edite su notificación para %0%
- Hola %0% Esto es un e-mail automático para informarle que la tarea '%1%' ha sido realizada sobre la página '%2%' por el usuario '%3%' Vaya a http://%4%/#/content/content/edit/%5% para editarla. ¡Espero que tenga un buen día! Saludos del robot de Umbraco
- Hola %0% Esto es un e-mail generado automáticamente para informarle que la tarea '%1%' ha sido realizada sobre la página '%2%' por el usuario '%3%'
Resumen de actualización: ¡Espero que tenga un buen día! Saludos del robot Umbraco.
]]>
- [%0%] Notificación acerca de %1% realizado en %2%
- Notificaciones
-
-
- y localizando el paquete. Los paquetes de Umbraco normalmente tienen la extensión ".umb" o ".zip".]]>
- Autor
-
- Documentación
- Meta datos del paquete
- Nombre del paquete
- El paquete no contiene ningún elemento
- Puedes eliminarlo del sistema de forma segura seleccionando la opción "desinstalar paquete" de abajo.]]>
- No hay actualizaciones disponibles
- Opciones del paquete
- Leeme del paquete
- Repositorio de paquetes
- Confirma la desinstalación
- El paquete ha sido desinstalado
- El paquete se ha desinstalado correctamente
- Desinstalar paquete
- Nota: cualquier documento, archivo etc dependiente de los elementos eliminados, dejará de funcionar, y puede conllevar inestabilidad en el sistema, por lo que lleva cuidado al desinstalar elementos. En caso de duda, contacta con el autor del paquete.]]>
- Descargar actualización del repositorio
- Actualizar paquete
- Instrucciones de actualización
- Hay una actualización disponible para este paquete. Puedes descargarla directamente del repositorio de paquetes de Umbraco.
- Versión del paquete
- Ver página web del paquete
-
-
- Pegar con formato completo (No recomendado)
- El texto que estás intentando pegar contiene caractéres o formato especial. El problema puede ser debido al copiar texto desde Microsoft Word. Umbraco puede eliminar estos caractéres o formato especial automáticamente, de esa manera el contenido será más adecuado para la web.
- Pegar como texto sin formato
- Pegar, pero quitando el formato (Recomendado)
-
-
- Proteccion basada en roles
- usando los grupos de miembros de Umbraco.]]>
- autenticación basada en roles.]]>
- Página de error
- Usada cuando alguien hace login, pero no tiene acceso
- Elija cómo restringir el acceso a esta página
- %0% está protegido
- Protección borrada de %0%
- Página de login
- Elija la página que contenga el formulario de login
- Borrar protección
- Elija las páginas que contendrán el formulario de login y mensajes de error
- Elija los roles que tendrán acceso a esta página
- Elija el login y password para esta página
- Protección de usuario único
- Si sólo necesita configurar una protección simple usando un único login y password
-
-
- %0% no ha podido ser publicado, debido a que una extensión de otro proveedor ha cancelado la acción.
- Incluir las páginas hija sin publicar
- Publicación en progreso - por favor, espera...
- Se han publicado %0% de %1% páginas...
- %0% se ha publicado
- %0% y sus subpáginas se han publicado
- Publicar %0% y todas sus subpáginas
- aceptar para publicar %0% y por lo tanto, hacer que su contenido esté disponible al público. Puedes publicar esta página y todas sus subpáginas marcando publicar todos los hijos debajo. ]]>
-
-
- Añadir un enlace externo
- Añadir un enlace interno
- Añadir
- Título
- Página interna
- Enlace
- Bajar
- Subir
- Abrir en una nueva ventana
- Quitar el enlace
-
-
- Versión actual
- Red el texto de la versión seleccionada no se mostrará. , green means added ]]>
- Se ha recuperado la última versión del documento.
- Esto muestra la versión seleccionada como html, si desea ver la diferencia entre 2 versiones al mismo tiempo, por favor use la vista diff
- Volver a
- Elija versión
- Vista
-
-
- Editar fichero de script
-
-
- Conserje
- Contenido
- Mensajero
- Desarrollador
- Asistente de configuración de Umbraco
- Media
- Miembros
- Boletín informativo
- Ajustes
- Estadísticas
- Traducción
- Usuarios
- Ayuda
- Analytics
-
-
- Plantilla por defecto
- Clave de diccionario
- Para importar un tipo de documento encuentre el fichero ".udt" en su ordenador haciendo click sobre el botón "Navegar" y pulsando "Importar" (se le solicitará confirmación en la siguiente pantalla)
- Nuevo nombre de la pestaña
- Tipo de nodo
- Tipo
- Hoja de estilos
- Propiedades de la hoja de estilos
- Pestaña
- Nombre de la pestaña
- Pestañas
- Tipo de Contenido Maestro activado
- Este Tipo de Contenido usa
- como Tipo de Contenido Maestro. Las pestañas para los Tipos de Contenido Maestros no se muestran y solo se pueden modificar desde el Tipo de Contenido Maestro
- No existen propiedades para esta pestaña. Haga clic en el enlace "añadir nueva propiedad" para crear una nueva propiedad.
- Tipo de documento Maestro
- Crear template correspondiente
-
-
- Sort order
- Creation date
- Ordenación completa.
- Arrastra las diferentes páginas debajo para colocarlas como deberían estar. O haz click en las cabeceras de las columnas para ordenar todas las páginas
-
- No cierre esta ventana mientras se está ordenando ]]>
-
-
- La publicación fue cancelada por un complemento de terceros
- El tipo de propiedad ya existe
- Tipo de propiedad creado
- Tipo de Dato: %1%]]>
- Tipo de propiedad eliminado
- Tipo de contenido guardado
- Pestaña creada
- Pestaña eliminada
- Pestaña con id: %0% eliminada
- La hoja de estilos no se ha guardado
- Hoja de estilos guardada
- La hoja de estilos se ha guardado sin errores
- Tipo de dato guardado
- Elemento del diccionario guardado
- La publicación ha fallado porque la página padre no está publicada
- Contenido publicado
- y visible en el sitio web
- Contenido guardado
- Recuerda publicar para hacer los cambios visibles
- Mandado para ser aprobado
- Los cambios se han mandado para ser aprobados
- Miembro guardado
- Propiedad de la hoja de estilos guardada
- Hoja de estilos guardada
- Plantilla guardada
- Error grabando usuario (comprueba el log)
- Usuario grabado
- El archivo no se ha guardado
- El archivo no se ha grabado. Por favor, comprueba los permisos de los ficheros
- Archivo guardado
- Archivo grabado sin errores
- Lenguaje guardado
- El script en Python no se ha guardado
- El script en Python no se ha podido guardar debido a un error
- Script en Python guardado
- No hay errores en el script en Python
- La plantilla no se ha guardado
- Por favor, asegúrate de que no hay 2 plantillas con el mismo alias
- Plantilla guardada
- Plantilla guardada sin errores
- El XSLT no se ha guardado
- El XSLT tenía un error
- El XSLT no se ha podido guardar, comprueba los permisos de los ficheros
- XSLT guardado
- No hay errores en el XSLT
-
-
- Usa sintaxis CSS, p.ej.: h1, .redHeader, .blueTex
- Editar hoja de estilos
- Editar propiedades de la hoja de estilos
- Nombre para identificar la propiedad del estilo en el editor de texto rico
- Previsualizar
- Estilos
-
-
- Editar plantilla
- Insertar área de contenido
- Insertar marcador de posición de área de contenido
- Insertar objeto del diccionario
- Insertar macro
- Insertar campo de página de Umbraco
- Plantilla principal
- Guía rápida sobre las etiquetas de plantilla de Umbraco
- Plantilla
-
-
- Insertar control
- Choose layout
- Añade más filas
- Add content
- Drop content
- Settings applied
-
- This content is not allowed here
- This content is allowed here
-
- Plantillas de Grid
- Las plantillas son el área de trabajo para el editor de grids, normalmente sólo necesitas una o dos plantillas diferentes
- Añadir plantilla de grid
- Ajusta la plantilla configurando la anchura de las columnas y añadiendo más secciones
-
- Configuraciones de filas
- Las filas son celdas predefinidas que se disponen horizontalmente
- Añade una configuración de fila
- Ajusta la fila configurando los anchos de cada celda y añadiendo más celdas
-
- Columnas
- Número total de columnas en la plantilla del grid
-
- Configuración
- Configura qué ajustes pueden cambiar los editores
-
-
- Estilos
- Configura qué estilos pueden cambiar los editores
-
- La configuración sólo se guardará si el json introducido es válido
-
- Permitir todos los controles de edición
- Permitir todas las configuraciones de fila
-
-
- Campo opcional
- Texto opcional
- MAYÚSCULA/minúscula
- Elegir campo
- Convertir a salto de línea
- Reemplaza los saltos de línea con la etiqueta HTML <br>
- Si, solamente la fecha
- Cambiar formato a fecha
- Codificar HTML
- Se reemplazarán los caracteres especiales por su código HTML equivalente.
- Será insertado después del valor del campo
- Será insertado antes del valor del campo
- Minúscula
- Ninguno/ninguna
- Insertar después del campo
- Insertar antes del campo
- Recursivo
- Borrar los tags del párrafo
- Borrará cualquier <P> al principio y al final del texto
- Mayúscula
- Codificar URL
- Formateará los caracteres especiales de las URLs
- Sólo será usado cuando el campo superior esté vacio
- Este campo será usado unicamente si el campo primario está vacío
- Si, con el tiempo. Separador:
-
-
- Tareas asignadas a usted
- asignadas a usted. Para acceder a la vista detallaa incluyendo comentarios, haga click sobre "Detalles" o sobre el nombre de la página. También puede descargar la página como XML directamente pulsando sobre el enlace "Descarga XML". Para terminar la tarea de traducción, por favor dirijase a la vista de detalles y haga click sobre el botón de "Cerrar". ]]>
- cerrar tarea
- Detalles de traducción
- Descargar todas las tareas pendientes de traducción como archivo xml
- Descargar xml
- Descargar xml DTD
- Campos
- Incluir subpáginas
-
- Tarea para tradudir [%0%] por %1%
- No se encontraron usuarios traductores. Por favor, crea un usuario traductor antes de empezar a mandar contenido para su traducción
- Tareas creadas por ti
- creadas por tí. Para ver una vista detallada incluyendo los comentarios, pulsa en "Detalles" o tan solo en el nombre de la página. También puedes descargar la página como XML directamente pulsando en el enlace "Descargar Xml". Para cerrar una tarea de traducción, por favor ve a la vista de Detalles y pulsa el botón de "Cerrar".]]>
- La página '%0%' se ha mandado a traducción
- Manda la página '%0%' a traducción
- Asignada por
- Tarea abierta
- Total de palabras
- Traducir a
- Traducción hecha.
- Puedes previsualizar las páginas que acabas de traducir, pulsando debajo. Si la página original existe, se mostrará una comparación de las 2 páginas.
- La traducción ha fallado. El archivo xml es inválido
- Opciones para traducir
- Traductor
- Subir traducción xml
-
-
- Caché del navegador
- Papelera de reciclaje
- Paquetes creados
- Tipos de datos
- Diccionario
- Paquetes instalados
- Instalar skin
- Instalar starter kit
- Idiomas
- Instalar paquete local
- Macros
- Tipos de medios
- Miembros
- Grupos de miembros
- Roles
- Tipos de miembros
- Tipos de documento
- Paquetes
- Paquetes
- Ficheros Python
- Instalar desde repositorio
- Instalar pasarela
- Módulos pasarela
- Ficheros de script
- Scripts
- Hojas de estilo
- Plantillas
- Archivos XSLT
-
-
- Existe una nueva actualización
- %0% esta listo, pulsa aquí para descargar
- No hay conexión al servidor
- Error al comprobar la actualización. Por favor revisa "trace-stack" para conseguir más información.
-
-
- Administrador
- Campo de categoria
- Cambiar contraseña
- Change Your Password
- Confirm new password
- Puede cambiar su contraseña para acceder al 'back office' de Umbraco rellenando el siguiente formulario y haciendo clic en el botón 'Cambiar contraseña'
- Canal de contenido
- Campo descriptivo
- Deshabilitar usuario
- Tipo de documento
- Editor
- Campo de citas
- Idioma
- Login
- Nodo de comienzo en la libreria de medios
- Secciones
- Deshabilitar acceso a Umbraco
- Contraseña
- Reset password
- Su contraseña ha sido cambiada
- Por favor confirme su nueva contraseña
- Introduzca su nueva contraseña
- La nueva contraseña no puede estar vacía
- Current password
- Invalid current password
- La nueva contraseña no coincide con la contraseña de confirmación. Por favor, vuela a intentarlo!'
- La contraseña de confirmación no coincide con la nueva contraseña!'
- Reemplazar los permisos de los nodos hijo
- Estas modificando los permisos para las páginas:
- Selecciona las páginas para modificar sus permisos
- Buscar en todos los hijos
- Nodo de comienzo en contenido
- Nombre de usuario
- Permisos de usuarios
- Tipo de usuario
- Tipos de usuarios
- Redactor
- Tu perfil
- Tu historial reciente
- La sesión caduca en
-
-
+
+
+
+ The Umbraco community
+ http://our.umbraco.org/documentation/Extending-Umbraco/Language-Files
+
+
+ Administrar hostnames
+ Auditoría
+ Nodo de Exploración
+ Cambiar tipo de documento
+ Copiar
+ Crear
+ Crear Paquete
+ Borrar
+ Deshabilitar
+ Vaciar Papelera
+ Exportar Documento (tipo)
+ Importar Documento (tipo)
+ Importar Paquete
+ Editar en lienzo
+ Salir
+ Mover
+ Notificaciones
+ Acceso Público
+ Publicar
+ Unpublish
+ Recargar Nodos
+ Republicar sitio completo
+ Permisos
+ Deshacer
+ Enviar a Publicar
+ Enviar a Traducir
+ Ordernar
+ Enviar a publicación
+ Traducir
+ Actualizar
+ Valor por defecto
+
+
+ Permiso denegado.
+ Añadir nuevo dominio
+ quitar
+ Nodo no válido.
+ Formato de dominio no válido.
+ Este dominio ya ha sido asignado.
+ Language
+ Dominio
+ El nuevo dominio %0% ha sido creado
+ El dominio %0% ha sido borrado
+ El dominio'%0%' ya ha sido asignado
+ El dominio %0% ha sido actualizado
+ Editar dominios actuales
+
+ Los dominios de un nivel están soportados, por ej. "example.com/en". De todas formas deberían de evitarse. Mejor usar la configuración cultural especificada arriba.]]>
+
+ Heredar
+ Cultura
+
+ o hereda la cultura de los nodos padres. También se aplicará
+ para el nodo actual, a menos que un dominio por debajo lo aplique también.]]>
+
+ Domains
+
+
+ Visualización de
+
+
+ Seleccionar
+ Selecciona la carpeta actual
+ Hacer otra cosa
+ Negrita
+ Cancelar Sangría del Párrafo
+ Insertar campo de formulario
+ Insertar gráfico de titular
+ Editar Html
+ Sangría
+ Cursiva
+ Centrar
+ Alinear a la Izquierda
+ Alinear a la Derecha
+ Insertar Link
+ Insertar link local (anchor)
+ Lista en Viñetas
+ Lista Numérica
+ Insertar macro
+ Insertar imagen
+ Editar relaciones
+ Guardar
+ Guardar y publicar
+ Guardar y enviar para aprobación
+ Previsualizar
+ La previsualización está deshabilitada porque no hay ninguna plantilla asignada
+ Elegir estilo
+ Mostrar estilos
+ Insertar tabla
+ Volver al listado
+
+
+ Para cambiar el tipo de documento al contenido seleccionado, primero selecciona uno de la lista de tipos válidos.
+ Entonces confirma el mapeo de propiedades del tipo actual al nuevo y haz click en Guardar.
+ El contenido se ha vuelto a publicar.
+ Propiedad actual
+ Tipo actual
+ El tipo de contenido no se puede cambiar, porque no hay alternativas válidas para este contenido.
+ Tipo de documento cambiado
+ Mapeo de propiedades
+ Mapea a la propiedad
+ Nueva plantilla
+ Nuevo tipo
+ ninguno
+ Contenido
+ Selecciona un nuevo Tipo de Documento
+ El tipo de documento del contenido seleccionado ha sido cambiado correctamente a [new type] y las siguientes propiedades mapeadas:
+ a
+ No se ha podido completar el mapeo de propiedades porque uno o más propiedades tienen más de un mapeo definido.
+ Solo se muestran otros tipos válidos para el contenido actual.
+
+
+ Está publicado
+ Acerca de
+ Link alternativo
+ (como describe la imagen sobre el teléfono)
+ Vinculos Alternativos
+ Click para editar esta entrada
+ Creado por
+ Autor original
+ Actualizado por
+ Creado
+ Fecha/hora de creación del documento
+ Tipo de Documento
+ Editando
+ Remover el
+ Esta entrada ha sido modificada después de haber sido publicada
+ Esta entrada no esta publicada
+ Último publicado
+ Tipo de Medio
+ Miembro de Grupo
+ Rol
+ Tipo de miembro
+ Sin fecha
+ Título de la página
+ Propiedades
+ Este documento ha sido publicado pero no es visible porque el padre '%0%' no esta publicado
+ Upss: este documento está publicado pero no está en la caché (error interno)
+ Publicar
+ Estado de la Publicación
+ Publicar el
+ Despublicar el
+ Fecha de Eliminación
+ El Orden esta actualizado
+ Para organizar los nodos, simplemente arrastre los nodos o realice un clic en uno de los encabezados de columna. Puede seleccionar multiple nodos manteniendo presionados "Shift" o "Control" mientras selecciona
+ Estadísticas
+ Título (opcional)
+ Tipo
+ No Publicar
+ Última actualización
+ Fecha/hora este documento fue modificado
+ Eliminar archivo
+ Vínculo al documento
+ Miembro de grupo(s)
+ No es miembreo de grupo(s)
+ Nodos hijo
+ Target
+ No hay datos que mostrar
+
+
+ Haz click para subir archivos
+ Arrastra los archivos aquí...
+
+
+ ¿Dónde quieres crear el nuevo %0%
+ Crear debajo de
+ Elije un tipo y un título
+ "Tipos de documentos".]]>
+ "Tipos de medios".]]>
+
+
+ Navega en tu sitio Web
+ No volver a mostrar
+ Si Umbraco no se ha abierto tendrás que permitir ventanas emergentes para este sitio Web
+ se ha abierto en una nueva ventana
+ Reinicio
+ Visita
+ Bienvenido
+
+
+ Stay
+ Discard changes
+ You have unsaved changes
+ Are you sure you want to navigate away from this page? - you have unsaved changes
+
+
+ Done
+
+ Deleted %0% item
+ Deleted %0% items
+ Deleted %0% out of %1% item
+ Deleted %0% out of %1% items
+
+ Published %0% item
+ Published %0% items
+ Published %0% out of %1% item
+ Published %0% out of %1% items
+
+ Unpublished %0% item
+ Unpublished %0% items
+ Unpublished %0% out of %1% item
+ Unpublished %0% out of %1% items
+
+ Moved %0% item
+ Moved %0% items
+ Moved %0% out of %1% item
+ Moved %0% out of %1% items
+
+ Copied %0% item
+ Copied %0% items
+ Copied %0% out of %1% item
+ Copied %0% out of %1% items
+
+
+ Nombre
+ Administrar dominios
+ Cerrar esta ventana
+ Esta usted seguro que desea borrar
+ Esta usted seguro que desea deshabilitar
+ Por favor seleccione esta casilla para confirmar la eliminación de %0% entrada(s)
+ Esta usted seguro?
+ Esta usted Seguro?
+ Cortar
+ Editar entrada del Diccionario
+ Editar idioma
+ Agregar enlace interno
+ Insertar caracter
+ Insertar titular gráfico
+ Insertar imagen
+ Insertar enlace
+ Insertar macro
+ Insertar tabla
+ Última edición
+ Enlace
+ Enlace interno
+ Al usar enlaces locales, insertar "#" delante del enlace
+ ¿Abrir en nueva ventana?
+ Ajustes para la Macro
+ Esta macro no contiene ninguna propiedad que pueda editar
+ Pegar
+ Editar permisos para
+ Se está vaciando la papelera. No cierre esta ventana mientras se ejecuta este proceso
+ La papelera está vacía
+ No podrá recuperar los items una vez sean borrados de la papelera
+ regexlib.com está experimentando algunos problemas en estos momentos, de los cuales no somos responsables. Pedimos disculpas por las molestias.]]>
+ Buscar una expresión regular para agregar validación a un campo de formulario. Ejemplo: 'correo electrónico', código postal "," url "
+ Eliminar macro
+ Campo obligatorio
+ El sitio ha sido reindexado
+ Se ha actualizado la caché y se ha publicado el contenido del sitio web.
+ La caché del sitio web será actualizada. Todos los contenidos publicados serán actualizados, mientras el contenido no publicado permanecerá no publicado.
+ Número de columnas
+ Número de filas
+ Coloca un 'placeholder' id al colocar un ID en tu 'placeholder' puedes insertar contenido en esta plantilla desde una plantilla hija, referenciando este ID usando un elemento<asp:content />.]]>
+ Seleccione una tecla de la lista abajo indicada. Sólo puede elegir a partir de la ID de la plantilla actual del dominio.
+ Haga clic sobre la imagen para verla a tamaño completo.
+ Seleccionar item
+ Ver item en la caché
+
+
+ Editar las diferentes versiones lingüísticas para la entrada en el diccionario '% 0%' debajo añadir otros idiomas en el menu de 'idiomas' en el menú de la izquierda
+
+
+
+ Escribe tu nombre de usuario
+ Escribe tu contraseña
+ Nombre del %0%...
+ Escribe un nombre...
+ Escribe tu búsqueda...
+ Escribe para filtrar resultados...
+
+
+ Permitir en nodo raíz
+ Sólo tipos de contenido permitidos podrán crearse bajo el nodo raíz de los árboles de Contenido y Media
+ Tipos de nodos hijos permitidos
+ Composiciones de Tipo de Documento
+ Crear
+ Borrar pestaña
+ Descripción
+ Nueva pestaña
+ Pestaña
+ Miniatura
+ Permitir vista de listado
+ Configura el contenido para mostrar un listado de nodos hijos, en lugar de mostrarlos en forma de árbol
+ Vista de listado actual
+ El tipo de vista de listado activa
+ Crear un tipo de listado personalizado
+ Quitar el tipo de listado personalizado
+
+
+ añadir prevalor
+
+ Tipo de datos GUID
+ Tipo de datos GUIDprestar control
+ Botones
+ Habilitar la configuración avanzada para
+ Habilitar menú contextual
+ Por defecto, el tamaño máximo de imágenes insertado
+
+ Mostrar etiqueta
+
+
+
+ Se ha guardado la información pero debes solucionar los siguientes errores para poder publicar:
+ La composición actual del proveedor no es compatible con el cambio de la contraseña (Habilitar la contraseña de recuperación es necesaria para que sea cierta)
+ %0% ya existe
+ Se han encontrado los siguientes errores:
+ Se han encontrado los siguientes errores:
+ La clave debe tener como mínimo %0% caracteres y %1% caracter(es) no alfanuméricos
+ %0% debe ser un número entero
+ Debe llenar los campos del %0% al %1%
+ Debe llenar el campo %0%
+ Debe poner el formato correcto del %0% al %1%
+ Debe poner un formato correcto en %0%
+
+
+ NOTA: Aunque CodeMirror esté activado en los ajustes de configuracion, no se muestra en Internet Explorer debido a que no es lo suficientemente estable.'
+ Debe llenar el alias y el nombre en el propertytype
+ Hay un problema de lectura y escritura al acceder a un archivo o carpeta
+
+ Por favor, elija un tipo
+ Usted está a punto de hacer la foto más grande que el tamaño original. ¿Está seguro de que desea continuar?
+ Error en script python
+ El script python no se ha guardado debido a que contenía error(es)
+
+ Por favor, marque el contenido antes de cambiar de estilo
+ No active estilos disponibles
+
+
+
+ El XSLT no se ha guardado, porque contenía un error (s)
+
+
+ Acerca de
+ Acción
+ Acciones
+ Añadir
+ Alias
+ ¿Está seguro?
+ Borde
+ o
+ Cancelar
+ Margen de la celda
+ Elegir
+ Cerrar
+ Cerrar ventana
+ Comentario
+ Confirmar
+ Mantener proporciones
+ Continuar
+ Copiar
+ Crear
+ Base de datos
+ Fecha
+ Por defecto
+ Borrar
+ Borrado
+ Borrando...
+ Diseño
+ Dimensiones
+ Abajo
+ Descargar
+ Editar
+ Editado
+ Elementos
+ Mail
+ Error
+ Buscar
+ Altura
+ Ayuda
+ Icono
+ Importar
+ Margen interno
+ Insertar
+ Instalar
+ Justificar
+ Idioma
+ Diseño
+ Cargando
+ Bloqueado
+ Iniciar sesión
+ Cerrar sesión
+ Cerrar sesión
+ Macro
+ Mover
+ Nombre
+ New
+ Próximo
+ No
+ de
+ OK
+ Abrir
+ o
+ Contraseña
+ Ruta
+ ID de marcador de posición
+ Un momento por favor...
+ Anterior
+ Propiedades
+ Mail para recibir los datos del formulario
+ Papelera
+ Restantes
+ Renombrar
+ Renovar
+ Reintentar
+ Permisos
+ Buscar
+ Servidor
+ Mostrar
+ Mostrar página al enviar
+ Tamaño
+ Ordenar
+ Submit
+ Tipo
+ Tipo que buscar...
+ Arriba
+ Actualizar
+ Actualizar
+ Upload
+ Url
+ Usuario
+ Nombre de usuario
+ Valor
+ Ver
+ Bienvenido...
+ Ancho
+ Si
+ Reorder
+ I am done reordering
+
+
+ Color de fondo
+ Negritas
+ Color del texto
+ Fuente
+ Texto
+
+
+ Página
+
+
+ El instalador no puede conectar con la base de datos.
+ No se ha podido guardar el archivo Web.config. Por favor, modifique la cadena de conexión manualmente.
+ Su base de datos ha sido encontrada y ha sido identificada como
+ Configuración de la base de datos
+ instalar strong> para instalar %0% la base de datos de Umbraco]]>
+ Próximo para continuar]]>
+ ¡No se ha encontrado ninguna base de datos! Mira si la información en la "connection string" del “web.config” es correcta. Para continuar, edite el "web.config" (bien sea usando Visual Studio o su editor de texto preferido), vaya al final del archivo y añada la cadena de conexión para la base de datos con el nombre (key) "umbracoDbDSN" y guarde el archivo.
Pinche en reintentar cuando haya terminado.Pinche aquí para mayor información de como editar el web.config (en inglés)
]]>
+ Por favor, contacta con tu ISP si es necesario. Si estás realizando la instalación en una máquina o servidor local, quizás necesites información de tu administrador de sistemas.]]>
+ Pinche en actualizar para actualizar la base de datos a Umbraco %0% Ningún contenido será borrado de la base de datos y seguirá funcionando después de la actualización
]]>
+ Pinche en Próximo para continuar. ]]>
+ próximo para continuar con el asistente de configuración]]>
+ La contraseña del usuario por defecto debe ser cambiada]]>
+ El usuario por defecto ha sido desabilitado o ha perdido el acceso a Umbraco!Pinche en Próximo para continuar.]]>
+ ¡La contraseña del usuario por defecto ha sido cambiada desde que se instaló!No hay que realizar ninguna tarea más. Pulsa Siguiente para proseguir.]]>
+ ¡La constraseña se ha cambiado!
+ Umbraco crea un usuario por defecto con un nombre de usuario ('admin') y constraseña ('default') . Es importante que la contraseña se cambie a algo único. Este paso comprobará la contraseña del usuario por defecto y sugerirá si debe cambiarse.
]]>
+ Ten un buen comienzo, visita nuestros videos de introducción
+ Pulsando el botón de Siguiente (o modificando el UmbracoConfigurationStatus en el web.config), aceptar la licencia de este software tal y como se especifica en el cuadro de debajo. Ten en cuenta que esta distribución de Umbraco consta de dos licencias diferentes, la licencia open source MIT para el framework y la licencia Umbraco freeware que cubre la IU.
+ No ha sido instalado.
+ Archivos y directorios afectados
+ Mas información en configurar los permisos para Umbraco aquí
+ Necesitas dar permisos de modificación a ASP.NET para los siguientes archivos/directorios
+ ¡Tu configuración de permisos es casi perfecta! Puedes ejecutar Umbraco sin problemas, pero no podrás instalar paquetes que es algo recomendable para explotar el potencial de Umbraco.]]>
+ Como Resolver
+ Pulsa aquí para leer la versión de texto
+ video tutoriales acerca de cómo configurar los permisos de los directorios para Umbraco o lee la versión de texto.]]>
+ ¡La configuración de tus permisos podría ser un problema! Puedes ejecutar Umbraco sin problemas, pero no serás capaz de crear directorios o instalar paquetes que es algo recomendable para explotar el potencial de Umbraco.]]>
+ ¡Tu configuración de permisos no está lista para Umbraco! Para ejecutar Umbraco, necesitarás actualizar tu configuración de permisos.]]>
+ ¡Tu configuración de permisos es perfecta! ¡Estás listo para ejecutar Umbraco e instalar paquetes!]]>
+ Resolviendo problemas con directorios
+ Sigue este enlace para más información sobre problemas con ASP.NET y creación de directorios
+ Configurando los permisos de directorios
+ Umbraco necesita permisos de lectura/escritura en algunos directorios para poder almacenar archivos tales como imagenes y PDFs. También almacena datos en la caché para mejorar el rendimiento de su sitio web
+ Quiero empezar de cero
+ learn how). Todavía podrás elegir instalar Runway más adelante. Por favor ve a la sección del Desarrollador y elije Paquetes.]]>
+ Acabas de configurar una nueva plataforma Umbraco. ¿Qué deseas hacer ahora?
+ Se ha instalado Runway
+ Esta es nuestra lista de módulos recomendados, selecciona los que desees instalar, o mira la lista completa de módulos ]]>
+ Sólo recomendado para usuarios expertos
+ Quiero empezar con un sitio web sencillo
+ "Runway" es un sitio web sencillo que contiene unos tipos de documentos y plantillas básicos. El instalador puede configurar Runway por ti de forma automática, pero fácilmente puedes editarlo, extenderlo o eliminarlo. No es necesario y puedes usar Umbrao perfectamente sin él. Sin embargo, Runway ofrece unos cimientos sencillos basados en buenas prácticas para iniciarte más rápido que nunca. Si eliges instalar Runway, puedes seleccionar bloques de construcción básicos llamados Módulos de Runway de forma opcional para realzar tus páginas de Runway. > Incluido con Runway: Página de inicio, página de Cómo empezar, página de Instalación de módulos. Módulos opcionales: Navegación superior, Mapa del sitio, Contacto, Galería. ]]>
+ ¿Qué es Runway?
+ Paso 1 de 5. Aceptar los términos de la licencia
+ Paso 2 de 5. Configuración de la base de datos
+ Paso 3 de 5. Autorizar / validar permiso en los archivos
+ Paso 4 de 5. Configurar seguridad en Umbraco
+ Paso 5 de 5. Umbraco está listo para ser usado
+ Gracias por elegir Umbraco
+ Navega a tu nuevo sitio Has instalado Runway, por qué no ves el aspecto de tu nuevo sitio web.]]>
+ Más ayuda e información Consigue ayuda de nuestra premiada comunidad, navega por la documentación o mira algunos videos gratuitos de cómo crear un sitio sencillo, cómo utilizar los paquetes y una guía rápida de la terminología de Umbraco]]>
+ Umbraco %0% ha sido instalado y está listo para ser usado
+ archivo /web.config y actualizar la clave del AppSetting UmbracoConfigurationStatus del final al valor '%0%' .]]>
+ empezar inmediatamente pulsando el botón "Lanzar Umbraco" de debajo. Si eres nuevo con Umbraco , puedes encontrar cantidad de recursos en nuestras páginas de cómo empezar.]]>
+ Lanzar Umbraco Para administrar tu sitio web, simplemente abre el back office de Umbraco y empieza a añadir contenido, a actualizar plantillas y hojas de estilo o a añadir nueva funcionalidad]]>
+ No se ha podido establecer la conexión con la base de datos
+ Umbraco versión 3
+ Umbraco versión 4
+ Mirar
+ Umbraco %0% o actualizar la versión 3.0 a Umbraco %0% . Pinche en "próximo" para empezar con el asistente de configuración.]]>
+
+
+ Código de cultura
+ Nombre de cultura
+
+
+ No ha habido ninguna actividad y su sessión se cerrará en
+ Renovar su sessión para guardar sus cambios
+
+
+ Feliz super domingo
+ Feliz lunes
+ Tremendo martes
+ Maravilloso miércoles
+ Fantástico jueves
+ ¡Ya es viernes!
+ Resplandeciente sábado
+ Iniciar sesión
+ La sesión ha caducado
+ © 2001 - %0% umbraco.com ]]>
+
+
+
+ Panel de Administración
+ Secciones
+ Contenido
+
+
+ Elija una página arriba...
+ %0% ha sido copiado al %1%
+ Seleccione donde el documento %0% debe ser copiado abajo
+ %0% ha sido movido a %1%
+ Seleccione debajo donde mover el documento %0%
+ ha sido seleccionado como raíz de su nuevo contenido, haga click sobre 'ok' debajo.
+ No ha seleccionado ningún nodo. Seleccione un nodo en la lista mostrada arriba antes the pinchar en 'continuar' (continue)
+ No se puede colgar el nodo actual bajo el nodo elegido debido a su tipo
+ El nodo actual no puede moverse a ninguna de sus subpáginas
+ Acción no permitida. No tiene permisos suficientes para uno o más subnodos.'
+
+
+ Edite su notificación para %0%
+ Hola %0% Esto es un e-mail automático para informarle que la tarea '%1%' ha sido realizada sobre la página '%2%' por el usuario '%3%' Vaya a http://%4%/#/content/content/edit/%5% para editarla. ¡Espero que tenga un buen día! Saludos del robot de Umbraco
+ Hola %0% Esto es un e-mail generado automáticamente para informarle que la tarea '%1%' ha sido realizada sobre la página '%2%' por el usuario '%3%'
Resumen de actualización: ¡Espero que tenga un buen día! Saludos del robot Umbraco.
]]>
+ [%0%] Notificación acerca de %1% realizado en %2%
+ Notificaciones
+
+
+ y localizando el paquete. Los paquetes de Umbraco normalmente tienen la extensión ".umb" o ".zip".]]>
+ Autor
+
+ Documentación
+ Meta datos del paquete
+ Nombre del paquete
+ El paquete no contiene ningún elemento
+ Puedes eliminarlo del sistema de forma segura seleccionando la opción "desinstalar paquete" de abajo.]]>
+ No hay actualizaciones disponibles
+ Opciones del paquete
+ Leeme del paquete
+ Repositorio de paquetes
+ Confirma la desinstalación
+ El paquete ha sido desinstalado
+ El paquete se ha desinstalado correctamente
+ Desinstalar paquete
+ Nota: cualquier documento, archivo etc dependiente de los elementos eliminados, dejará de funcionar, y puede conllevar inestabilidad en el sistema, por lo que lleva cuidado al desinstalar elementos. En caso de duda, contacta con el autor del paquete.]]>
+ Descargar actualización del repositorio
+ Actualizar paquete
+ Instrucciones de actualización
+ Hay una actualización disponible para este paquete. Puedes descargarla directamente del repositorio de paquetes de Umbraco.
+ Versión del paquete
+ Ver página web del paquete
+
+
+ Pegar con formato completo (No recomendado)
+ El texto que estás intentando pegar contiene caractéres o formato especial. El problema puede ser debido al copiar texto desde Microsoft Word. Umbraco puede eliminar estos caractéres o formato especial automáticamente, de esa manera el contenido será más adecuado para la web.
+ Pegar como texto sin formato
+ Pegar, pero quitando el formato (Recomendado)
+
+
+ Proteccion basada en roles
+ usando los grupos de miembros de Umbraco.]]>
+ autenticación basada en roles.]]>
+ Página de error
+ Usada cuando alguien hace login, pero no tiene acceso
+ Elija cómo restringir el acceso a esta página
+ %0% está protegido
+ Protección borrada de %0%
+ Página de login
+ Elija la página que contenga el formulario de login
+ Borrar protección
+ Elija las páginas que contendrán el formulario de login y mensajes de error
+ Elija los roles que tendrán acceso a esta página
+ Elija el login y password para esta página
+ Protección de usuario único
+ Si sólo necesita configurar una protección simple usando un único login y password
+
+
+ %0% no ha podido ser publicado, debido a que una extensión de otro proveedor ha cancelado la acción.
+ Incluir las páginas hija sin publicar
+ Publicación en progreso - por favor, espera...
+ Se han publicado %0% de %1% páginas...
+ %0% se ha publicado
+ %0% y sus subpáginas se han publicado
+ Publicar %0% y todas sus subpáginas
+ aceptar para publicar %0% y por lo tanto, hacer que su contenido esté disponible al público. Puedes publicar esta página y todas sus subpáginas marcando publicar todos los hijos debajo. ]]>
+
+
+ Añadir un enlace externo
+ Añadir un enlace interno
+ Añadir
+ Título
+ Página interna
+ Enlace
+ Bajar
+ Subir
+ Abrir en una nueva ventana
+ Quitar el enlace
+
+
+ Versión actual
+ Red el texto de la versión seleccionada no se mostrará. , green means added ]]>
+ Se ha recuperado la última versión del documento.
+ Esto muestra la versión seleccionada como html, si desea ver la diferencia entre 2 versiones al mismo tiempo, por favor use la vista diff
+ Volver a
+ Elija versión
+ Vista
+
+
+ Editar fichero de script
+
+
+ Conserje
+ Contenido
+ Mensajero
+ Desarrollador
+ Asistente de configuración de Umbraco
+ Media
+ Miembros
+ Boletín informativo
+ Ajustes
+ Estadísticas
+ Traducción
+ Usuarios
+ Ayuda
+ Analytics
+
+
+ Plantilla por defecto
+ Clave de diccionario
+ Para importar un tipo de documento encuentre el fichero ".udt" en su ordenador haciendo click sobre el botón "Navegar" y pulsando "Importar" (se le solicitará confirmación en la siguiente pantalla)
+ Nuevo nombre de la pestaña
+ Tipo de nodo
+ Tipo
+ Hoja de estilos
+ Propiedades de la hoja de estilos
+ Pestaña
+ Nombre de la pestaña
+ Pestañas
+ Tipo de Contenido Maestro activado
+ Este Tipo de Contenido usa
+ como Tipo de Contenido Maestro. Las pestañas para los Tipos de Contenido Maestros no se muestran y solo se pueden modificar desde el Tipo de Contenido Maestro
+ No existen propiedades para esta pestaña. Haga clic en el enlace "añadir nueva propiedad" para crear una nueva propiedad.
+ Tipo de documento Maestro
+ Crear template correspondiente
+
+
+ Sort order
+ Creation date
+ Ordenación completa.
+ Arrastra las diferentes páginas debajo para colocarlas como deberían estar. O haz click en las cabeceras de las columnas para ordenar todas las páginas
+
+ No cierre esta ventana mientras se está ordenando ]]>
+
+
+ La publicación fue cancelada por un complemento de terceros
+ El tipo de propiedad ya existe
+ Tipo de propiedad creado
+ Tipo de Dato: %1%]]>
+ Tipo de propiedad eliminado
+ Tipo de contenido guardado
+ Pestaña creada
+ Pestaña eliminada
+ Pestaña con id: %0% eliminada
+ La hoja de estilos no se ha guardado
+ Hoja de estilos guardada
+ La hoja de estilos se ha guardado sin errores
+ Tipo de dato guardado
+ Elemento del diccionario guardado
+ La publicación ha fallado porque la página padre no está publicada
+ Contenido publicado
+ y visible en el sitio web
+ Contenido guardado
+ Recuerda publicar para hacer los cambios visibles
+ Mandado para ser aprobado
+ Los cambios se han mandado para ser aprobados
+ Miembro guardado
+ Propiedad de la hoja de estilos guardada
+ Hoja de estilos guardada
+ Plantilla guardada
+ Error grabando usuario (comprueba el log)
+ Usuario grabado
+ El archivo no se ha guardado
+ El archivo no se ha grabado. Por favor, comprueba los permisos de los ficheros
+ Archivo guardado
+ Archivo grabado sin errores
+ Lenguaje guardado
+ El script en Python no se ha guardado
+ El script en Python no se ha podido guardar debido a un error
+ Script en Python guardado
+ No hay errores en el script en Python
+ La plantilla no se ha guardado
+ Por favor, asegúrate de que no hay 2 plantillas con el mismo alias
+ Plantilla guardada
+ Plantilla guardada sin errores
+ El XSLT no se ha guardado
+ El XSLT tenía un error
+ El XSLT no se ha podido guardar, comprueba los permisos de los ficheros
+ XSLT guardado
+ No hay errores en el XSLT
+
+
+ Usa sintaxis CSS, p.ej.: h1, .redHeader, .blueTex
+ Editar hoja de estilos
+ Editar propiedades de la hoja de estilos
+ Nombre para identificar la propiedad del estilo en el editor de texto rico
+ Previsualizar
+ Estilos
+
+
+ Editar plantilla
+ Insertar área de contenido
+ Insertar marcador de posición de área de contenido
+ Insertar objeto del diccionario
+ Insertar macro
+ Insertar campo de página de Umbraco
+ Plantilla principal
+ Guía rápida sobre las etiquetas de plantilla de Umbraco
+ Plantilla
+
+
+ Insertar control
+ Choose layout
+ Añade más filas
+ Add content
+ Drop content
+ Settings applied
+
+ This content is not allowed here
+ This content is allowed here
+
+ Plantillas de Grid
+ Las plantillas son el área de trabajo para el editor de grids, normalmente sólo necesitas una o dos plantillas diferentes
+ Añadir plantilla de grid
+ Ajusta la plantilla configurando la anchura de las columnas y añadiendo más secciones
+
+ Configuraciones de filas
+ Las filas son celdas predefinidas que se disponen horizontalmente
+ Añade una configuración de fila
+ Ajusta la fila configurando los anchos de cada celda y añadiendo más celdas
+
+ Columnas
+ Número total de columnas en la plantilla del grid
+
+ Configuración
+ Configura qué ajustes pueden cambiar los editores
+
+
+ Estilos
+ Configura qué estilos pueden cambiar los editores
+
+ La configuración sólo se guardará si el json introducido es válido
+
+ Permitir todos los controles de edición
+ Permitir todas las configuraciones de fila
+
+
+ Campo opcional
+ Texto opcional
+ MAYÚSCULA/minúscula
+ Elegir campo
+ Convertir a salto de línea
+ Reemplaza los saltos de línea con la etiqueta HTML <br>
+ Si, solamente la fecha
+ Cambiar formato a fecha
+ Codificar HTML
+ Se reemplazarán los caracteres especiales por su código HTML equivalente.
+ Será insertado después del valor del campo
+ Será insertado antes del valor del campo
+ Minúscula
+ Ninguno/ninguna
+ Insertar después del campo
+ Insertar antes del campo
+ Recursivo
+ Borrar los tags del párrafo
+ Borrará cualquier <P> al principio y al final del texto
+ Mayúscula
+ Codificar URL
+ Formateará los caracteres especiales de las URLs
+ Sólo será usado cuando el campo superior esté vacio
+ Este campo será usado unicamente si el campo primario está vacío
+ Si, con el tiempo. Separador:
+
+
+ Tareas asignadas a usted
+ asignadas a usted. Para acceder a la vista detallaa incluyendo comentarios, haga click sobre "Detalles" o sobre el nombre de la página. También puede descargar la página como XML directamente pulsando sobre el enlace "Descarga XML". Para terminar la tarea de traducción, por favor dirijase a la vista de detalles y haga click sobre el botón de "Cerrar". ]]>
+ cerrar tarea
+ Detalles de traducción
+ Descargar todas las tareas pendientes de traducción como archivo xml
+ Descargar xml
+ Descargar xml DTD
+ Campos
+ Incluir subpáginas
+
+ Tarea para tradudir [%0%] por %1%
+ No se encontraron usuarios traductores. Por favor, crea un usuario traductor antes de empezar a mandar contenido para su traducción
+ Tareas creadas por ti
+ creadas por tí. Para ver una vista detallada incluyendo los comentarios, pulsa en "Detalles" o tan solo en el nombre de la página. También puedes descargar la página como XML directamente pulsando en el enlace "Descargar Xml". Para cerrar una tarea de traducción, por favor ve a la vista de Detalles y pulsa el botón de "Cerrar".]]>
+ La página '%0%' se ha mandado a traducción
+ Manda la página '%0%' a traducción
+ Asignada por
+ Tarea abierta
+ Total de palabras
+ Traducir a
+ Traducción hecha.
+ Puedes previsualizar las páginas que acabas de traducir, pulsando debajo. Si la página original existe, se mostrará una comparación de las 2 páginas.
+ La traducción ha fallado. El archivo xml es inválido
+ Opciones para traducir
+ Traductor
+ Subir traducción xml
+
+
+ Caché del navegador
+ Papelera de reciclaje
+ Paquetes creados
+ Tipos de datos
+ Diccionario
+ Paquetes instalados
+ Instalar skin
+ Instalar starter kit
+ Idiomas
+ Instalar paquete local
+ Macros
+ Tipos de medios
+ Miembros
+ Grupos de miembros
+ Roles
+ Tipos de miembros
+ Tipos de documento
+ Paquetes
+ Paquetes
+ Ficheros Python
+ Instalar desde repositorio
+ Instalar pasarela
+ Módulos pasarela
+ Ficheros de script
+ Scripts
+ Hojas de estilo
+ Plantillas
+ Archivos XSLT
+
+
+ Existe una nueva actualización
+ %0% esta listo, pulsa aquí para descargar
+ No hay conexión al servidor
+ Error al comprobar la actualización. Por favor revisa "trace-stack" para conseguir más información.
+
+
+ Administrador
+ Campo de categoria
+ Cambiar contraseña
+ Change Your Password
+ Confirm new password
+ Puede cambiar su contraseña para acceder al 'back office' de Umbraco rellenando el siguiente formulario y haciendo clic en el botón 'Cambiar contraseña'
+ Canal de contenido
+ Campo descriptivo
+ Deshabilitar usuario
+ Tipo de documento
+ Editor
+ Campo de citas
+ Idioma
+ Login
+ Nodo de comienzo en la libreria de medios
+ Secciones
+ Deshabilitar acceso a Umbraco
+ Contraseña
+ Reset password
+ Su contraseña ha sido cambiada
+ Por favor confirme su nueva contraseña
+ Introduzca su nueva contraseña
+ La nueva contraseña no puede estar vacía
+ Current password
+ Invalid current password
+ La nueva contraseña no coincide con la contraseña de confirmación. Por favor, vuela a intentarlo!'
+ La contraseña de confirmación no coincide con la nueva contraseña!'
+ Reemplazar los permisos de los nodos hijo
+ Estas modificando los permisos para las páginas:
+ Selecciona las páginas para modificar sus permisos
+ Buscar en todos los hijos
+ Nodo de comienzo en contenido
+ Nombre de usuario
+ Permisos de usuarios
+ Tipo de usuario
+ Tipos de usuarios
+ Redactor
+ Tu perfil
+ Tu historial reciente
+ La sesión caduca en
+
+
diff --git a/OurUmbraco.Site/umbraco/config/lang/fr.xml b/OurUmbraco.Site/umbraco/config/lang/fr.xml
index 250d8cc8..4affcf02 100644
--- a/OurUmbraco.Site/umbraco/config/lang/fr.xml
+++ b/OurUmbraco.Site/umbraco/config/lang/fr.xml
@@ -1,1070 +1,1070 @@
-
-
-
- The Umbraco community
- http://our.umbraco.org/documentation/Extending-Umbraco/Language-Files
-
-
- Gérer les noms d'hôtes
- Informations d'audit
- Parcourir
- Changer le type de document
- Copier
- Créer
- Créer un package
- Supprimer
- Désactiver
- Vider la corbeille
- Exporter un type
- Importer un type
- Importer un package
- Editer dans Canvas
- Déconnexion
- Déplacer
- Notifications
- Accès public
- Publier
- Dépublier
- Rafraîchir
- Republier le site entier
- Permissions
- Version antérieure
- Envoyer pour publication
- Envoyer pour traduction
- Trier
- Envoyer pour publication
- Traduire
- Mettre à jour
- Valeur par défaut
-
-
- Permission refusée.
- Ajouter nouveau domaine
- Supprimer
- Noeud invalide.
- Domaine invalide.
- Domaine déjà assigné.
- Domaine
- Langage
- Nouveau domaine '%0%' créé
- Domaine '%0%' supprimé
- Domaine '%0%' déjà assigné
- Les domaines contenant un chemin d'un niveau sont autorisés, ex : "example.com/en". Pour autant, cela
- devrait être évité. Utilisez plutôt la gestion des noms d'hôte.]]>
- Domaine '%0%' mis à jour
- Editer les domaines
- Hériter
- Culture
- ou hériter la culture des noeuds parent. S'appliquera aussi'
- au noeud courant, à moins qu'un domaine soit appliqué aussi.]]>
- Domaines
-
-
- Voir pour
-
-
- Choisir
- Choisir le répertoire courant
- Faire autre chose
- Gras
- Annuler l'indentation de paragraphe
- Insérer champ de formulaire
- Insérer une entête graphique
- Editer le HTML
- Indenter le paragraphe
- Italique
- Centrer
- Justifier à gauche
- Justifier à droite
- Insérer un lien
- Insérer une ancre
- Liste à puces
- Liste numérique
- Insérer une macro
- Insérer une image
- Editer les relations
- Sauver
- Sauver et publier
- Sauver et envoyer pour approbation
- Prévisualiser
- La prévisualisation est désactivée car aucun modèle n'a été assigné.
- Choisir un style
- Afficher les styles
- Insérer un tableau
-
-
- Pour changer le type de document du contenu séléctionné, choisissez un type valide pour cet emplacement, qui soit conforme à la structure des types de documents.
- Puis modifiez si nécessaire le mappage des propriétés du type actuel vers le nouveau, et cliquez sur Sauver
- Le contenu a été republié.
- Propriété actuelle
- Type actuel
- Le type de document ne peut être changé, il n'y a pas d'alternatives valides pour cet emplacement.
- Type de document modifié
- Mapper les propriétés
- Mapper à la propriété
- Nouveau modèle
- Nouveau type
- aucun
- Contenu
- Choisir le nouveau Type de Document
- Le type de document du contenu séléctionné a a bien été changé en [new type] et les propriétés suivantes mappées :
- en
- Impossible de terminer le mappage des propriétés car une ou plus des propriétés ont plus de un mappage défini.
- Seuls les types de documents valides pour cet emplacement sont affichés.
-
-
- A propos de cette page
- Alias
- (comment décririez-vous l'image oralement)
- Liens alternatifs
- Cliquez pour éditer cet élément
- Créé par
- Auteur original
- Mis à jour par
- Créé
- Date/heure à laquelle ce document a été créé
- Type de Document
- Edition
- Expire le
- Cet élément a été changé après la publication
- Cet élément n'est pas publié
- Dernière publication
- Il n'y a aucun élément à afficher dans cette liste.
- Type de Média
- Lien vers des média(s)
- Groupe de membres
- Rôle
- Type de membre
- Aucune date choisie
- Titre de page
- Propriétés
- Ce document est publié mais n'est pas visible car son parent '%0%' est dépublié
- Oups : ce document est publié mais n'est pas présent dans le cache (erreur interne Umbraco)
- Publier
- Statut de publication
- Publié le
- Dépublié le
- Supprimer la date
- Ordre de tri mis à jour
- Pour trier les noeuds, faites les glisser à l'aide de la souris ou cliquez sur les entêtes de colonne. Vous pouvez séléctionner plusieurs noeuds en gardant la touche "shift" ou "ctrl" enfoncée pendant votre séléction.
- Statistiques
- Titre (optionnel)
- Type
- Dépublié
- Dernière édition
- Date/heure à laquelle ce document a été édité
- Supprimer fichier(s)
- Lien vers un document
- Membre du/des groupe(s)
- Pas un membre du/des groupe(s)
- Elements enfants
- Cible
-
-
- Cliquez pour télécharger
- Faites glisser vos fichier ici...
-
-
- Où voulez-vous créer le nouveau %0%
- Créer un élément sous
- Choisissez un type et un titre
- "Types de documents".]]>
- "Types de médias".]]>
-
-
- Parcourir votre site
- - Cacher
- Si Umbraco ne s'ouvre pas, vous devriez peut-être autoriser l'ouverture des popups pour ce site.
- s'est ouvert dans une nouvelle fenêtre
- Redémarrer
- Visiter
- Bienvenue
-
-
- Stay
- Discard changes
- You have unsaved changes
- Are you sure you want to navigate away from this page? - you have unsaved changes
-
-
- Done
-
- Deleted %0% item
- Deleted %0% items
- Deleted %0% out of %1% item
- Deleted %0% out of %1% items
-
- Published %0% item
- Published %0% items
- Published %0% out of %1% item
- Published %0% out of %1% items
-
- Unpublished %0% item
- Unpublished %0% items
- Unpublished %0% out of %1% item
- Unpublished %0% out of %1% items
-
- Moved %0% item
- Moved %0% items
- Moved %0% out of %1% item
- Moved %0% out of %1% items
-
- Copied %0% item
- Copied %0% items
- Copied %0% out of %1% item
- Copied %0% out of %1% items
-
-
- Name
- Gérer les noms d'hôtes
- Fermer cette fenêtre
- Êtes-vous sûr de vouloir supprimer
- Êtes-vous sûr de vouloir désactiver
- Cochez cette case pour confirmer la suppression de %0% élément(s)
- Êtes-vous sûr ?
- Êtes-vous sûr ?
- Couper
- Editer une entrée du Dictionnaire
- Editer le langage
- Insérer une ancre
- Insérer un caractère
- Insérer une entête graphique
- Insérer une image
- Insérer un lien
- Insérer une macro
- Insérer un tableau
- Dernière modification
- Lien
- Lien interne :
- Si vous utilisez des ancres, insérer # avant le lien
- Ouvrir dans une nouvelle fenêtre ?
- Paramètres de macro
- Cette macro ne contient aucune propriété éditable
- Coller
- Editer les permissions pour
- Les éléments dans la corbeille sont en cours de suppression. Ne fermez pas cette fenêtre avant que cette opération soit terminée.
- La corbeille est maintenant vide
- Les éléments supprimés de la corbeille sont supprimés définitivement
- regexlib.com a actuellement des problèmes sur lesquels nous n'avons aucun contrôle. Excusez-nous pour le désagrément.]]>
- Rechercher une expression régulière Search for a regular expression to add validation to a form field. Example: 'email, 'zip-code' 'url'
- Supprimer la macro
- Champ requis
- Le site a été réindéxé
- Le cache du site a été mis à jour. Tous les contenus publiés sont à jour. Et tous les contenus dépubliés sont rendus invisibles.
- Le cache du site va être mis à jour. Tous les contenus publiés seront à jour. Et tous les contenus dépubliés seront rendus invisibles.
- Nombre de colonnes
- Nombre de lignes
- Définir un placeholder id en mettant un ID sur votre placeholder vous pouvez injecter du contenu à cet endroit depuis vos modèles enfants,
- en faisant référence à cet id au sein d'un élément <asp:content />.]]>
- Séléctionnez un placeholder id depuis la liste ci-dessous. Vous pouvez seulement
- choisir un ID depuis le modèle parent.]]>
- Cliquez pour voir l'image en taille maximale
- Séléctionner un élément
- Voir l'élément de cache
-
-
- %0%' ci-dessous Vous pouvez ajouter d'autres langages depuis le menu ci-dessous "Langages".
- ]]>
- Nom de Culture
-
-
- Votre nom d'utilisateur
- Votre mot de passe
- Nommer %0%...
- Entrez un nom...
- Rechercher...
- Filtrer...
-
-
- Types de noeuds enfants autorisés
- Créer
- Supprimer onglet
- Description
- Nouvel onglet
- Onglet
- Miniature
- Activer la vue liste
-
-
- Ajouter une prévaleur
- Type de données en base de donées
- GUID du Property Editor
- Property editor
- Boutons
- Activer les paramètres avancés pour
- Activer le menu contextuel
- Taille maximale par défaut des images insérées
- CSS relatives
- Afficher le libellé
- Largeur et hauteur
-
-
- Vos données ont été sauvegardées, mais avant de publier votre page il y a des erreurs que vous devez corriger :
- Le Membership Provider n'autorise pas le changement des mots de passe (EnablePasswordRetrieval doit être définit à true)
- %0% existe déjà
- Il y a des erreurs :
- Il y a des erreurs :
- Le mot de passe doit contenir un minimum de %0% caractères et contenir au moins %1% caractère(s) non-alphanumerique
- %0% doit être un entier
- Le champ %0% dans l'onglet %1% est obligatoire
- %0% est un champ obligatoire
- %0% dans %1% n'est pas correctement formaté
- %0% n'est pas correctement formaté
-
-
- Le type de fichier spécifié n'est pas autorisé par l'administrateur
- NOTE ! Même si CodeMirror est activé dans la configuration, il est désactivé sur Internet Explorer car il n'est pas stable sur ce navigateur.
- Remplissez l'alias et le nom de la nouvelle propriété
- Il y a un problème de droits de lecture/écriture sur un fichier ou dossier spécifique
- Entrez un titre
- Choisissez un type
- Vous allez définir une taille d'image supérieure à sa taille d'origine. Êtes-vous sûr ?
- Erreur dans le script Python
- Le script Python n'a pas été sauvegardé, car il contient des erreur(s)
- Noeud de départ supprimé, contactez votre administrateur
- Séléctionnez du contenu avant de changer le style
- Aucun style actif disponible
- Placez le curseur à gauche des deux cellules que vous voulez fusionner
- Vous ne pouvez pas scinder une cellule que vous n'avez pas fusionné.
- Erreur dans le code source XSLT
- Le XSLT n'a pas été sauvegardé, car il contient des erreur(s)
- Il y a une erreur de configuration du type de données de cette propriété. Vérifiez ce type de données.
-
-
- A propos
- Action
- Actions
- Ajouter
- Alias
- Êtes-vous sûr ?
- Bordure
- par
- Annuler
- Marge de cellule
- Choisir
- Fermer
- Fermer la fenêtre
- Commenter
- Confirmer
- Contraindre les proportions
- Continuer
- Copier
- Créer
- Base de données
- Date
- Defaut
- Supprimer
- Supprimé
- Suppression...
- Design
- Dimensions
- Bas
- Télécharger
- Editer
- Edité
- Elements
- Email
- Erreur
- Trouver
- Hauteur
- Aide
- Icone
- Importer
- Marge intérieure
- Insérer
- Installer
- Justifier
- Langage
- Layout
- Chargement
- Fermé
- Connexion
- Déconnexion
- Déconnexion
- Macro
- Déplacer
- Plus
- Nom
- Nouveau
- Suivant
- Non
- de
- OK
- Ouvrir
- ou
- Mot de passe
- Chemin
- Placeholder ID
- Un moment s'il vous plaît...
- Précédent
- Propriétés
- Email de réception des données de formulaire
- Corbeille
- Restant
- Renommer
- Renouveller
- Requis
- Réessayer
- Permissions
- Rechercher
- Serveur
- Montrer
- Afficher la page à l'envoi
- Taille
- Trier
- Submit
- Type
- Rechercher...
- Haut
- Mettre à jour
- Upgrader
- Télécharger
- Url
- Utilisateur
- Nom d'utilisateur
- Valeur
- Voir
- Bienvenue...
- Largeur
- Oui
- Dossier
- Résultats de recherche
- Reorder
- I am done reordering
-
-
- Background color
- Gras
- Couleur de texte
- Police
- Texte
-
-
- Page
-
-
- L'installeur n'a pas pu se connecter à la base de données.
- Impossible de modifier le fichier web.config file. Modifiez s'il vous plait la "connection string" manuellement.
- Votre base de données a été détectée et identifiée telle que
- Configurtion de la base de données
- install pour installer la base de données Umbraco %0%
- ]]>
- Suivant pour procéder.]]>
- Base de données non trouvée ! Vérifiez les informations de la "connection string" dans le fichier web.config.
- Pour poursuivre, éditez le fichier "web.config" (avec Visual Studio ou votre éditeur de texte favori), scrollez jusqu'en bas, ajoutez une "connection string" dans la ligne "umbracoDbDSN" et sauvegardez votre fichier.
-
- Cliquez sur le bouton Réessayer lorsque cela est fait.
-
- Plus d'informations sur l'édition du fichier web.config ici.
]]>
-
- Contactez votre administrateur système si nécessaire.
- Si vous installez Umbraco sur votre ordinateur, vous aurez probablement besoin de consulter votre administrateur système.]]>
-
- Appuyez sur le bouton Upgrader pour mettre à jour votre base de données vers Umbraco %0%
-
- Ne vous inquiétez pas : aucun contenu ne sera supprimé et tout continuera à fonctionner parfaitement ensuite !
-
- ]]>
- Appuyez sur Suivant pour
- poursuivre. ]]>
- Suivant pour poursuivre la configuration]]>
- Le mot de passe par défaut doit être changé !]]>
- L'utilisateur par défaut a été désactivé ou n'a pas accès à Umbraco!Aucune action n'est requise. Cliquez sur Suivant pour poursuivre.]]>
- Le mot de passe par défaut a été modifié avec succès !Aucune action n'est requise. Cliquez sur Suivant pour poursuivre.]]>
- Le mot de passe a été changé !
-
- Umbraco créer un utilisateur par défaut avec le login ('admin') et le mot de passe ('default') .
- Il est important que ce mot de passe soit changé pour quelque-chose de sécurisé et unique.
-
-
- Cette étape va vérifier le mot de passe par défaut et vérifier s'il est nécessaire de le changer.
-
- ]]>
- Pour bien commencer, regardez nos vidéos d'introduction
- En cliquant sur le bouton Suvant (ou en modifiant umbracoConfigurationStatus dans le fichier web.config), vous acceptez la licence de ce logiciel telle que spécifiée dans le champ ci-dessous. Remarque : cette distribution Umbraco consiste en deux licences différentes, la licence open source MIT pour le framework et la licence Umbraco freewarequi couvre l'UI.
- Pas encore installé.
- Fichiers et dossiers affectés
- Plus d'informations sur la définition des permissions
- Vous devez donner à ASP.NET les droits de modification sur les fichiers/dossiers suivants
- Vos permissions sont presques parfaites !
- Vous pouvez faire fonctionner Umbraco sans problèmes, mais vous ne serez pas en mesure d'installer des packages, ce qui est hautement recommandé pour tirer pleinement parti d'Umbraco.]]>
- Comment le résoudre
- Cliquez ici pour lire la version texte
- tutoriel vidéo sur la définition des permissions pour Umbraco, ou lisez la version texte.]]>
- Vos permissions pourraient être problématiques !
-
- Vous pouvez faire fonctionner Umbraco sans problèmes, mais vous ne serez pas en mesure d'installer des packages, ce qui est hautement recommandé pour tirer pleinement parti d'Umbraco.]]>
- Vos permissions ne sont pas prêtes pour Umbraco !
-
- Pour faire fonctionner Umbraco, vous aurez besoin de mettre à jour les permissions sur les fichiers/dossiers.]]>
- Vos permissions sont parfaites !
- Vous êtes prêt à faire fonctionner Umbraco et installer des packages !]]>
- Résoudre un problème sur un dossier
- Suivz ce lien pour plus d'informations sur ASP.NET et la création de dossiers
- Définir les permissions de dossier
-
- Je veux démarrer "from scratch"
- Apprenez comment)
- Vous pouvez toujours choisir d'installer Runway plus tard. Pour cela allez dans la séction "Développeur" et séléctionnez "Packages".
- ]]>
- Vous avez mis en oeuvre une plateforme Umbraco clean. Que voulez-vous faire ensuite ?
- Runway est installé
-
- Voici la liste des modules recommandés, cochez ceux que vous souhaitez installer, ou regardez la liste complète des modules
- ]]>
- Recommandé uniquement pour les utilisateurs expérimentés
- Je veux commencer avec un site simple
-
- "Runway" est un simple site fournissant des types de documents et modèles basiques. L'installeur peut mettre en oeuvre Runway automatiquement pour vous,
- mais vous pouvez facilement léditer, lenrichir, ou le supprimer ensuite. Il n'est pas nécessaire et vous pouvez parfaitement utiliser Umbraco sans. Pour autant,
- Runway offre un socle facile basé sur des bonnes pratiques pour vous permettre de commencer rapidement.
- Si vous choisissez d'installer Runway, vous pouvez, de manière optionnelle, choisir des blocks appelés Runway Modules pour enrichir les pages du site.
-
-
- Inclus avec Runway : Home page, Getting Started page, Installing Modules page.
- Modules optionnels : Top Navigation, Sitemap, Contact, Gallery.
-
- ]]>
- Qu'est ce que Runway
- Step 1/5 : Licence
- Step 2/5 : Configuration base de données
- Step 3/5 : Validation des permissions de fichiers
- Step 4/5 : Sécurité Umbraco
- Step 5/5 : Umbraco est prêt
- Merci d'avoir choisi Umbraco
- Parcourir votre nouveau site
-Vous avez installé Runway, alors pourquoi pas jeter un oeil au look de votre nouveau site ?]]>
- Aide et information
-Obtenez de l'aide de notre award winning communauté, parcourez la documentation our regardez quelques vidéos sur "Comemnt construire un site simple", "Comment utiliser les packages" et un guide rapide sur la terminologie Umbraco]]>
- Umbraco %0% est installé et prêt à être utilisé
- /web.config file et mettre à jour le paramètre AppSetting dans umbracoConfigurationStatus en bas de la valeur de '%0%' .]]>
- démarrer maintenant en cliquant sur le bouton "Lancer Umbraco" ci-dessous.
-Si vous débutez sur Umbraco, vous pouvez trouver plein de ressources sur nos pages "Getting Started".]]>
- Lancer Umbraco
-Pour gérer votre site, ouvrez simplement le backoffice Umbraco et commencez à ajouter du contenu, mettez à jour les templates et feuilles de styles ou ajoutez ds nouvelles fonctionnalités]]>
- La connexion à la base de données a échoué.
- Umbraco Version 3
- Umbraco Version 4
- Regarder
- umbraco %0%, qu'il s'agisse d'une installation récente ou de la version 3.0
-
- Appuyez sur Press "suivant" pour commencer.]]>
-
-
- Code de la Culture
- Nom de la culture
-
-
- Vous avez été inactif, la déconnexion automatique se fera dans
- Renouvellez votre session maintenant pour sauvegarder votre travail
-
-
- Joyeux dimanche
- Joyeux lundi
- Joyeux mardi
- Joyeux mercredi
- Joyeux jeudi
- Joyeux vendredi
- Joyeux samedi
- Connectez-vous ci-dessous
- La session a expiré
- © 2001 - %0% umbraco.com ]]>
-
-
- Tableau de bord
- Sections
- Contenu
-
-
- Choisissez une page ci-dessous...
- %0% a été copié dans %1%
- Choisissez, ci-dessous, où le document %0% doit être copié
- %0% a été déplacé dans %1%
- Choisissez, ci-dessous, où le document %0% doit être déplacé
- a été choisi comme racine de votre contenu, cliquez sur 'ok' ci-dessous.
- Aucun noeud choisi, choisissez s'il vous plait un noeud dans la liste ci-dessus avant de cliquer sur 'ok'.
- Le noeud actuel n'est pas autorisé dans le noeud choisi à cause de son type
- Le noeud actuel ne peut pas être déplacé dans une de ses propres sous-pages
- Le noeud actuel ne peut pas exister à la racine
- L'action n'est pas autorisée car vous n'avez pas les droits sur un ou plus des noeuds enfants.
- Relier les items copiés à l'original
-
-
- Editer vos notifications pour %0%
-
- Hi %0%
-
- Ceci est un email automatique pour vous informer que la tâche '%1%'
- a été executée sur la page '%2%'
- par l'utilisateur '%3%'
-
-
-
-
Update summary:
-
-
-
-
-
- Bonne journée !
- Le Robot Umbraco vous salue
-
]]>
- La notification [%0%] à propos de %1% a été executée sur %2%
- Notifications
-
-
-
- localisez le package. Les packages Umbraco ont généralement une extension .umb ou .zip.
- ]]>
- Auteur
- Demon
- Documentation
- Meta data du package
- Nom du package
- Le package ne contient aucun éléments
-
- Vous pouvez supprimer tranquillement le package de votre installation en cliquant sur "Désinstaller" ci-dessous.]]>
- Aucune mises à jour disponibles
- Options de package
- Package readme
- Package repository
- Confirmation de désinstallation
- Package was uninstalled
- Le package a été désinstallé avec succès
- Désintaller le package
-
- Remarque : tous les documents, media etc dépendants des éléments que vous supprimerez, arrêteront de fonctionner, ce qui peut provoquer une instabilité du système,
- désinstallez avec prudence. En cas de doute, contactez l'auteur du package.]]>
- Télécharger la mise à jour depuis le repository
- Mettre à jour le package
- Instructions de mise à jour
- Il y a une mise à jour disponible pour ce package. Vous pouvez la télécharger directement depuis le repository.
- Version de package
- Historique des version de package
- Voir le site internet du package
-
-
- Coller en conservant le formatage (non recommandé)
- Le texte que vous tentez de coller contient des caractères spéciaux ou de formatage. Cela peut être dû à une copie d'un texte de Microsoft Word. Umbraco peut supprimer les caractères spéciaux et le formatage automatiquement, de manière à ce que le texte collé soit plus utilisable pour le Web.
- Coller en tant que texte brut sans formatage
- Coller, mais supprimer le formatage (recommendé)
-
-
- Protection basée sur les rôles
- via les groupes de membres Umbraco.]]>
- l'authentification basée sur les rôles.]]>
- Page d'erreur
- Utilisé quand les gens sont connectés, mais n'ont pas accès
- Choisissez comment restreindre l'accès à cette page
- %0% est maintenant protégée
- Protection supprimée de %0%
- Page de connexion
- Choisissez la page qui a le formulaire de login
- Supprimer la protection
- Choisissez la page qui contient le formulaire de login et les messages d'erreur
- Piochez les roles qui ont accès à cette page
- Définissez l'identifiant et mot de passe pour cette page
- Protection utilisateur unique
- Si vous souhaitez simplement mettre en place une protection par identifiant et mot de passe
-
-
-
-
-
-
-
-
- Inclure les pages enfants non publiées
- Publication en cours - veuillez patienter...
- %0% sur %1% des pages ont été publiées...
- %0% a été publié
- %0% et ses pages enfants ont été publiées
- Publier %0% et ses pages enfants
- ok pour publier %0% et le rendre ainsi accessible publiquement.
- Vous pouvez publier cette page et ses sous pages en cochant publier tous les enfants ci-dessous.
- ]]>
-
-
- Vous n'avez configuré aucune couleurs approuvées
-
-
- Ajouter un lien externe
- Ajouter un lien interne
- Ajouter
- Légende
- Page interne
- URL
- Descendre
- Monter
- Ouvrir dans une nouvelle fenêtre
- Supprimer le lien
-
-
- Version actuelle
- Le texte en Rouge signifit qu'il a été supprimé de la version choisie, vert signifie ajouté ]]>
- Le document est passé à une version antérieure
- Ceci affiche la version choisie en tant que HTML, si vous souhaitez voir les différences entre les deux versions en même temps, utilisez la vue différentielle
- Revenir à
- Choisissez une version
- Voir
-
-
- Editer le fichier de script
-
-
- Concierge
- Contenu
- Courier
- Développeur
- Assistant de configuration Umbraco
- Medias
- Membres
- Newsletters
- Paramètres
- Statistiques
- Traduction
- Utilisateurs
- Aide
-
-
- Template par défaut
- Clé de dictionnaire
- Pour importer un type de document, trouvez le fichier ".udt" sur votre ordinateur en cliquant sur le bouton "Parcourir" et cliquez sur "Importer" (une confirmation vous sera demandé à l'écran d'après)
- Titre du nouvel onglet
- Type de noeud
- Type
- Feuille de style
- Script
- Propriété de feuille de style
- Onglet
- Titre de l'onglet
- Onglets
- Type de contenu master activé
- Ce type de contenu utilise
- en tant que type de contenu master, les onglets du type de contenu master ne sont pas affichés et peuvent seulement être modifiés dans le type de contenu master lui-même.
- Aucune propriétés définies dans cet onglet. Cliquez sur le lien "Ajouter une nouvelle propriété" en haut pour créer une nouvelle propriété.
- Type de contenu parent
- Créer le template correspondant
-
-
- Sort order
- Creation date
- Tri achevé.
- Faites glisser les différents éléments ci-dessous vers le haut ou le bas pour définir comment ils doivent être triés. Ou cliquez sur les entêtes de colonne pour trier la collection complète d'éléments
- Ne fermez pas cette fenêtre durant le tri.]]>
-
-
- La publication a été annulée par un extension tierce.
- Le type de propriété existe déjà
- Type de propriété créé
- Type de données : %1%]]>
- Type de propriété supprimé
- Type de documet sauvegardé
- Onglet créé
- Onglet supprimé
- Onglet d'ID : %0% supprimé
- Feuille de style non sauvegardée
- Feuille de style sauvegardée
- Feuille de style sauvegardée sans erreurs
- Type de données sauvegardée
- Element de dictionnaire sauvegardé
- La publication a échoué car la page parent n'est pas publiée
- Contenu publié
- et visible sur le site
- Content sauvegardé
- N'oubliez pas de publier pour rendre les changements visibles
- Envoyer pour approbation
- Les changements ont été envoyés pour approbation
- Media sauvegardé
- Media sauvegardé sans erreurs
- Membre sauvegardé
- Propriété de feuille de style sauvegardé
- Feuille de style sauvegardé
- Template sauvegardé
- Erreur lors de la sauvegarde de l'utilisateur
- Utilisateur sauvegardé
- Type d'utilisateur sauvegardé
- Fichier non sauvegardé
- Le fichier n'a pas pu être sauvegardé. Vérifiez les permissions de fichier.
- Fichier sauvegardé
- Fichier sauvegardé sans erreurs
- Langage sauvegardé
- Le script Python n'a pas été sauvegardé
- Le script Python n'a pas été sauvegardé à cause d'erreurs
- Le script Python a été sauvegardé
- Aucune erreur dans le script Python
- Modèle non sauvegardé
- Assurez-vous de ne pas avoir 2 modèles avec le même alias.
- Modèle sauvegardé
- Modèle sauvegardé sans aucune erreurs !
- Le XSLT n'a pas été sauvegardé
- Le XSLT contenait une erreur
- Le XSLT n'a pas pu être sauvegardé, vérifiez les permissions de fichier
- Le XSLT a été sauvegardé
- Aucune erreurs dans le XSLT
- Contenu publié
- Vue partielle sauvegardée
- Vue partielle sauvegardée sans erreurs !
- Vue partielle non sauvegardée
- Une erreur est survenue lors de la sauvegarde du fichier.
-
-
- Utilise la synthaxe CSS. Ex : h1, .redHeader, .blueTex
- Editer la feuille de style
- Editer la propriété de feuille de style
- Nommer pour identifier la propriété dans le Rich Text Editor
- Prévisualiser
- Styles
-
-
- Editer le modèle template
- Insérer une zone de contenu
- Insérer un placeholder de zone de contenu
- Insérer un élément de dictionnaire
- Insert Macro
- Insert umbraco page field
- Modèle master
- Guide rapide aux tags des modèles Umbraco
- Modèle
-
-
- Choisissez le type de contenu
- Choisissez une mise en page
- Ajouter une ligne
- Ajouter du contenu
- Contenu goutte
- Paramètres appliqués
-
- Ce contenu est pas autorisée ici
- Ce contenu est permis ici
-
- Cliquez pour intégrer
- Cliquez pour insérer l'image
- Légende de l'image...
- Ecrire ici...
-
- Layouts Grid
- Layouts sont la superficie totale de travail pour l'éditeur de grille, en général, vous avez seulement besoin d'une ou deux configurations différentes
- Ajouter Grid Layout
- Ajustez la mise en page en définissant la largeur des colonnes et ajouter des sections supplémentaires
- Configurations des lignes
- Les lignes sont des cellules prédéfinies disposées horizontalement
- Ajouter une configuration de la ligne
- Ajustez la ligne en réglant la largeur des cellules et en ajoutant des cellules supplémentaires
-
- Colonnes
- Nombre total combiné de colonnes dans la configuration de la grille
-
- Paramètres
- Configurer quels paramètres éditeurs peuvent changer
-
- Modes
- Configurer ce style éditeurs peuvent changer
-
- Les réglages seulement économiser si la configuration du json saisi est valide
-
- Autoriser tous les éditeurs
- Autoriser toutes les configurations de lignes
-
-
- Champ alternatif
- Texte alternatif
- Casse
- Encodage
- Choisir un champ
- Convertir les sauts de ligne
- Remplace les sauts de ligne avec des balises <br>
- Champs particuliers
- Oui, la date seulement
- Formater comme une date
- Encoder en HTML
- Remplacera les caractères spéciaux par leur équivalent HTML.
- Sera insérer après la valeur du champ
- Sera inséré après la valeur du champ
- Minuscules
- Aucun
- Inserer après le champ
- Inserer après le champ
- Recursif
- Supprimer les balises paragraphes
- Supprimera tous les <P>
- Champs standards
- Majuscules
- Encode en URL
- Formatera les caractères spéciaux de manière à ce qu'ils soient utilisés dans une URL
- Sera seulement utilisé quand toutes les valeurs ci-dessous seront vides
- Ce champ sera utilisé seulement si le champ primaire est vide
- Yes, with time. Separator:
-
-
- Tâches qui vous sont assignées
- vous sont assignées. Pour voir une vue détaillée incluant les commentaires, cliquez sur "Details" ou juste le nom de la page.
- Vous pouvez télécharger la format au format XML en cliquant sur le lien "Télécharger XML".
- Pour terminer une tâche de traduction, allez sur Details, puis cliquer sur le bouton "Terminer tâche".
- ]]>
- Terminer tâche
- Détails
- Télécharger toutes les traductions au format XML
- Télécharger XML
- Télécharger la DTD XML
- Champs
- Inclure les pages enfants
-
- [%0%] tâches de traductions pour %1%
- Aucun utilisateurs traducteurs trouvés. Vous devez créer un utilisateur traducteur avant d'envoyer votre contenu pour traduction
- Tâches que vous avez créé
- créées par vous. Pour voir une vue détaillée incluant les commentaires,
- cliquez sur "Détails" ou juste le nom de la page. Vous pouvez aussi télécharger la page au format XML en cliquant sur le lien "Télécharger XML".
- Pour terminer une tâche de traduction, allez sur Details, puis cliquer sur le bouton "Terminer tâche".
- ]]>
- La page '%0%' a été envoyé pour traduction
- Envoyer la page '%0%' pour traduction
- Assignée par
- Tâches ouvertures
- Nombre total de mots
- Traduire en
- Traduction complétée.
- Vous pouvez prévisualiser les pages que vous avez traduites, en cliquant ci-dessous. Si la page originale est trouvée, vous aurez la comparaison entre les deux pages.
- Traductio échouée, il semble que le fichier XML soit corrompu
- Options de traduction
- Traducteur
- Uploader le fichier de traduction XML
-
-
- Navigateur de cache
- Corbeille
- Packages créés
- Typesde données
- Dictionnaire
- Packages installés
- Installer un skin
- Installer un starter kit
- Langages
- Installer un package local
- Macros
- Types de médias
- Membres
- Groupes de membres
- Rôles
- Types de membres
- Types de documents
- Packages
- Packages
- Fichiers Python
- Installer depuis le repository
- Installer Runway
- Modules Runway
- Fichiers de script
- Scripts
- Feuilles de style
- Modèles
- Fichiers XSLT
-
-
- Nouvelle mise à jour prête
- %0% est prêt, cliquez ici pour télécharger
- Aucune connexion au serveur
- Erreur lors de la recherche de mises à jour. Vérifiez la stack trace pour obtenir plus d'informations sur l'erreur.
-
-
- Administrateur
- Champ catégorie
- Changer le mot de passe
- Changez votre mot de passe
- Confirmez votre nouveau mot de passe
- Vous pouvez changer votre mot de passe d'accès à Umbraco en remplissant le formulaire ci-dessous puis en cliquant sur le bouton "Changer le mot de passe"
- Canal de contenu
- Champ description
- Désactiver l'utilisateur
- Type de document
- Editeur
- Champ extrait
- Langage
- Identifiant
- Noeud de départ dans la librarie de médias
- Sections
- Désactiver l'accès Umbraco
- Mot de passe
- Réinitialiser le mot de passe
- Your password has been changed!
- Confirmez s'il vous plait votre nouveau mot de passe
- Entrez votre nouveau mot de passe
- Votre nouveau mot de passe ne peut être vide !
- Mot de passe actuel
- Mot de passe actuel invalide
- Il y avait une différence entre le nouveau mot de passe et le mot de passe confirmé. Veuillez réessayer
- Le mot de passe confirmé ne match pas le nouveau mot de passe saisi
- Remplacer les permissions des noeuds enfants
- Vous modifiez actuellement les permissions pour les pages :
- Choisissez les pages pour lesquelles modifier les permissions
- Rechercher tous les enfants
- Noeud de départ du contenu
- Nom d'utilisateur
- Permissions utilisateur
- Type d'utilisateur
- Types d'utilisateur
- Rédacteur
- Votre profil
- Votre historique récent
- La session expire dans
-
-
+
+
+
+ The Umbraco community
+ http://our.umbraco.org/documentation/Extending-Umbraco/Language-Files
+
+
+ Gérer les noms d'hôtes
+ Informations d'audit
+ Parcourir
+ Changer le type de document
+ Copier
+ Créer
+ Créer un package
+ Supprimer
+ Désactiver
+ Vider la corbeille
+ Exporter un type
+ Importer un type
+ Importer un package
+ Editer dans Canvas
+ Déconnexion
+ Déplacer
+ Notifications
+ Accès public
+ Publier
+ Dépublier
+ Rafraîchir
+ Republier le site entier
+ Permissions
+ Version antérieure
+ Envoyer pour publication
+ Envoyer pour traduction
+ Trier
+ Envoyer pour publication
+ Traduire
+ Mettre à jour
+ Valeur par défaut
+
+
+ Permission refusée.
+ Ajouter nouveau domaine
+ Supprimer
+ Noeud invalide.
+ Domaine invalide.
+ Domaine déjà assigné.
+ Domaine
+ Langage
+ Nouveau domaine '%0%' créé
+ Domaine '%0%' supprimé
+ Domaine '%0%' déjà assigné
+ Les domaines contenant un chemin d'un niveau sont autorisés, ex : "example.com/en". Pour autant, cela
+ devrait être évité. Utilisez plutôt la gestion des noms d'hôte.]]>
+ Domaine '%0%' mis à jour
+ Editer les domaines
+ Hériter
+ Culture
+ ou hériter la culture des noeuds parent. S'appliquera aussi'
+ au noeud courant, à moins qu'un domaine soit appliqué aussi.]]>
+ Domaines
+
+
+ Voir pour
+
+
+ Choisir
+ Choisir le répertoire courant
+ Faire autre chose
+ Gras
+ Annuler l'indentation de paragraphe
+ Insérer champ de formulaire
+ Insérer une entête graphique
+ Editer le HTML
+ Indenter le paragraphe
+ Italique
+ Centrer
+ Justifier à gauche
+ Justifier à droite
+ Insérer un lien
+ Insérer une ancre
+ Liste à puces
+ Liste numérique
+ Insérer une macro
+ Insérer une image
+ Editer les relations
+ Sauver
+ Sauver et publier
+ Sauver et envoyer pour approbation
+ Prévisualiser
+ La prévisualisation est désactivée car aucun modèle n'a été assigné.
+ Choisir un style
+ Afficher les styles
+ Insérer un tableau
+
+
+ Pour changer le type de document du contenu séléctionné, choisissez un type valide pour cet emplacement, qui soit conforme à la structure des types de documents.
+ Puis modifiez si nécessaire le mappage des propriétés du type actuel vers le nouveau, et cliquez sur Sauver
+ Le contenu a été republié.
+ Propriété actuelle
+ Type actuel
+ Le type de document ne peut être changé, il n'y a pas d'alternatives valides pour cet emplacement.
+ Type de document modifié
+ Mapper les propriétés
+ Mapper à la propriété
+ Nouveau modèle
+ Nouveau type
+ aucun
+ Contenu
+ Choisir le nouveau Type de Document
+ Le type de document du contenu séléctionné a a bien été changé en [new type] et les propriétés suivantes mappées :
+ en
+ Impossible de terminer le mappage des propriétés car une ou plus des propriétés ont plus de un mappage défini.
+ Seuls les types de documents valides pour cet emplacement sont affichés.
+
+
+ A propos de cette page
+ Alias
+ (comment décririez-vous l'image oralement)
+ Liens alternatifs
+ Cliquez pour éditer cet élément
+ Créé par
+ Auteur original
+ Mis à jour par
+ Créé
+ Date/heure à laquelle ce document a été créé
+ Type de Document
+ Edition
+ Expire le
+ Cet élément a été changé après la publication
+ Cet élément n'est pas publié
+ Dernière publication
+ Il n'y a aucun élément à afficher dans cette liste.
+ Type de Média
+ Lien vers des média(s)
+ Groupe de membres
+ Rôle
+ Type de membre
+ Aucune date choisie
+ Titre de page
+ Propriétés
+ Ce document est publié mais n'est pas visible car son parent '%0%' est dépublié
+ Oups : ce document est publié mais n'est pas présent dans le cache (erreur interne Umbraco)
+ Publier
+ Statut de publication
+ Publié le
+ Dépublié le
+ Supprimer la date
+ Ordre de tri mis à jour
+ Pour trier les noeuds, faites les glisser à l'aide de la souris ou cliquez sur les entêtes de colonne. Vous pouvez séléctionner plusieurs noeuds en gardant la touche "shift" ou "ctrl" enfoncée pendant votre séléction.
+ Statistiques
+ Titre (optionnel)
+ Type
+ Dépublié
+ Dernière édition
+ Date/heure à laquelle ce document a été édité
+ Supprimer fichier(s)
+ Lien vers un document
+ Membre du/des groupe(s)
+ Pas un membre du/des groupe(s)
+ Elements enfants
+ Cible
+
+
+ Cliquez pour télécharger
+ Faites glisser vos fichier ici...
+
+
+ Où voulez-vous créer le nouveau %0%
+ Créer un élément sous
+ Choisissez un type et un titre
+ "Types de documents".]]>
+ "Types de médias".]]>
+
+
+ Parcourir votre site
+ - Cacher
+ Si Umbraco ne s'ouvre pas, vous devriez peut-être autoriser l'ouverture des popups pour ce site.
+ s'est ouvert dans une nouvelle fenêtre
+ Redémarrer
+ Visiter
+ Bienvenue
+
+
+ Stay
+ Discard changes
+ You have unsaved changes
+ Are you sure you want to navigate away from this page? - you have unsaved changes
+
+
+ Done
+
+ Deleted %0% item
+ Deleted %0% items
+ Deleted %0% out of %1% item
+ Deleted %0% out of %1% items
+
+ Published %0% item
+ Published %0% items
+ Published %0% out of %1% item
+ Published %0% out of %1% items
+
+ Unpublished %0% item
+ Unpublished %0% items
+ Unpublished %0% out of %1% item
+ Unpublished %0% out of %1% items
+
+ Moved %0% item
+ Moved %0% items
+ Moved %0% out of %1% item
+ Moved %0% out of %1% items
+
+ Copied %0% item
+ Copied %0% items
+ Copied %0% out of %1% item
+ Copied %0% out of %1% items
+
+
+ Name
+ Gérer les noms d'hôtes
+ Fermer cette fenêtre
+ Êtes-vous sûr de vouloir supprimer
+ Êtes-vous sûr de vouloir désactiver
+ Cochez cette case pour confirmer la suppression de %0% élément(s)
+ Êtes-vous sûr ?
+ Êtes-vous sûr ?
+ Couper
+ Editer une entrée du Dictionnaire
+ Editer le langage
+ Insérer une ancre
+ Insérer un caractère
+ Insérer une entête graphique
+ Insérer une image
+ Insérer un lien
+ Insérer une macro
+ Insérer un tableau
+ Dernière modification
+ Lien
+ Lien interne :
+ Si vous utilisez des ancres, insérer # avant le lien
+ Ouvrir dans une nouvelle fenêtre ?
+ Paramètres de macro
+ Cette macro ne contient aucune propriété éditable
+ Coller
+ Editer les permissions pour
+ Les éléments dans la corbeille sont en cours de suppression. Ne fermez pas cette fenêtre avant que cette opération soit terminée.
+ La corbeille est maintenant vide
+ Les éléments supprimés de la corbeille sont supprimés définitivement
+ regexlib.com a actuellement des problèmes sur lesquels nous n'avons aucun contrôle. Excusez-nous pour le désagrément.]]>
+ Rechercher une expression régulière Search for a regular expression to add validation to a form field. Example: 'email, 'zip-code' 'url'
+ Supprimer la macro
+ Champ requis
+ Le site a été réindéxé
+ Le cache du site a été mis à jour. Tous les contenus publiés sont à jour. Et tous les contenus dépubliés sont rendus invisibles.
+ Le cache du site va être mis à jour. Tous les contenus publiés seront à jour. Et tous les contenus dépubliés seront rendus invisibles.
+ Nombre de colonnes
+ Nombre de lignes
+ Définir un placeholder id en mettant un ID sur votre placeholder vous pouvez injecter du contenu à cet endroit depuis vos modèles enfants,
+ en faisant référence à cet id au sein d'un élément <asp:content />.]]>
+ Séléctionnez un placeholder id depuis la liste ci-dessous. Vous pouvez seulement
+ choisir un ID depuis le modèle parent.]]>
+ Cliquez pour voir l'image en taille maximale
+ Séléctionner un élément
+ Voir l'élément de cache
+
+
+ %0%' ci-dessous Vous pouvez ajouter d'autres langages depuis le menu ci-dessous "Langages".
+ ]]>
+ Nom de Culture
+
+
+ Votre nom d'utilisateur
+ Votre mot de passe
+ Nommer %0%...
+ Entrez un nom...
+ Rechercher...
+ Filtrer...
+
+
+ Types de noeuds enfants autorisés
+ Créer
+ Supprimer onglet
+ Description
+ Nouvel onglet
+ Onglet
+ Miniature
+ Activer la vue liste
+
+
+ Ajouter une prévaleur
+ Type de données en base de donées
+ GUID du Property Editor
+ Property editor
+ Boutons
+ Activer les paramètres avancés pour
+ Activer le menu contextuel
+ Taille maximale par défaut des images insérées
+ CSS relatives
+ Afficher le libellé
+ Largeur et hauteur
+
+
+ Vos données ont été sauvegardées, mais avant de publier votre page il y a des erreurs que vous devez corriger :
+ Le Membership Provider n'autorise pas le changement des mots de passe (EnablePasswordRetrieval doit être définit à true)
+ %0% existe déjà
+ Il y a des erreurs :
+ Il y a des erreurs :
+ Le mot de passe doit contenir un minimum de %0% caractères et contenir au moins %1% caractère(s) non-alphanumerique
+ %0% doit être un entier
+ Le champ %0% dans l'onglet %1% est obligatoire
+ %0% est un champ obligatoire
+ %0% dans %1% n'est pas correctement formaté
+ %0% n'est pas correctement formaté
+
+
+ Le type de fichier spécifié n'est pas autorisé par l'administrateur
+ NOTE ! Même si CodeMirror est activé dans la configuration, il est désactivé sur Internet Explorer car il n'est pas stable sur ce navigateur.
+ Remplissez l'alias et le nom de la nouvelle propriété
+ Il y a un problème de droits de lecture/écriture sur un fichier ou dossier spécifique
+ Entrez un titre
+ Choisissez un type
+ Vous allez définir une taille d'image supérieure à sa taille d'origine. Êtes-vous sûr ?
+ Erreur dans le script Python
+ Le script Python n'a pas été sauvegardé, car il contient des erreur(s)
+ Noeud de départ supprimé, contactez votre administrateur
+ Séléctionnez du contenu avant de changer le style
+ Aucun style actif disponible
+ Placez le curseur à gauche des deux cellules que vous voulez fusionner
+ Vous ne pouvez pas scinder une cellule que vous n'avez pas fusionné.
+ Erreur dans le code source XSLT
+ Le XSLT n'a pas été sauvegardé, car il contient des erreur(s)
+ Il y a une erreur de configuration du type de données de cette propriété. Vérifiez ce type de données.
+
+
+ A propos
+ Action
+ Actions
+ Ajouter
+ Alias
+ Êtes-vous sûr ?
+ Bordure
+ par
+ Annuler
+ Marge de cellule
+ Choisir
+ Fermer
+ Fermer la fenêtre
+ Commenter
+ Confirmer
+ Contraindre les proportions
+ Continuer
+ Copier
+ Créer
+ Base de données
+ Date
+ Defaut
+ Supprimer
+ Supprimé
+ Suppression...
+ Design
+ Dimensions
+ Bas
+ Télécharger
+ Editer
+ Edité
+ Elements
+ Email
+ Erreur
+ Trouver
+ Hauteur
+ Aide
+ Icone
+ Importer
+ Marge intérieure
+ Insérer
+ Installer
+ Justifier
+ Langage
+ Layout
+ Chargement
+ Fermé
+ Connexion
+ Déconnexion
+ Déconnexion
+ Macro
+ Déplacer
+ Plus
+ Nom
+ Nouveau
+ Suivant
+ Non
+ de
+ OK
+ Ouvrir
+ ou
+ Mot de passe
+ Chemin
+ Placeholder ID
+ Un moment s'il vous plaît...
+ Précédent
+ Propriétés
+ Email de réception des données de formulaire
+ Corbeille
+ Restant
+ Renommer
+ Renouveller
+ Requis
+ Réessayer
+ Permissions
+ Rechercher
+ Serveur
+ Montrer
+ Afficher la page à l'envoi
+ Taille
+ Trier
+ Submit
+ Type
+ Rechercher...
+ Haut
+ Mettre à jour
+ Upgrader
+ Télécharger
+ Url
+ Utilisateur
+ Nom d'utilisateur
+ Valeur
+ Voir
+ Bienvenue...
+ Largeur
+ Oui
+ Dossier
+ Résultats de recherche
+ Reorder
+ I am done reordering
+
+
+ Background color
+ Gras
+ Couleur de texte
+ Police
+ Texte
+
+
+ Page
+
+
+ L'installeur n'a pas pu se connecter à la base de données.
+ Impossible de modifier le fichier web.config file. Modifiez s'il vous plait la "connection string" manuellement.
+ Votre base de données a été détectée et identifiée telle que
+ Configurtion de la base de données
+ install pour installer la base de données Umbraco %0%
+ ]]>
+ Suivant pour procéder.]]>
+ Base de données non trouvée ! Vérifiez les informations de la "connection string" dans le fichier web.config.
+ Pour poursuivre, éditez le fichier "web.config" (avec Visual Studio ou votre éditeur de texte favori), scrollez jusqu'en bas, ajoutez une "connection string" dans la ligne "umbracoDbDSN" et sauvegardez votre fichier.
+
+ Cliquez sur le bouton Réessayer lorsque cela est fait.
+
+ Plus d'informations sur l'édition du fichier web.config ici.
]]>
+
+ Contactez votre administrateur système si nécessaire.
+ Si vous installez Umbraco sur votre ordinateur, vous aurez probablement besoin de consulter votre administrateur système.]]>
+
+ Appuyez sur le bouton Upgrader pour mettre à jour votre base de données vers Umbraco %0%
+
+ Ne vous inquiétez pas : aucun contenu ne sera supprimé et tout continuera à fonctionner parfaitement ensuite !
+
+ ]]>
+ Appuyez sur Suivant pour
+ poursuivre. ]]>
+ Suivant pour poursuivre la configuration]]>
+ Le mot de passe par défaut doit être changé !]]>
+ L'utilisateur par défaut a été désactivé ou n'a pas accès à Umbraco!Aucune action n'est requise. Cliquez sur Suivant pour poursuivre.]]>
+ Le mot de passe par défaut a été modifié avec succès !Aucune action n'est requise. Cliquez sur Suivant pour poursuivre.]]>
+ Le mot de passe a été changé !
+
+ Umbraco créer un utilisateur par défaut avec le login ('admin') et le mot de passe ('default') .
+ Il est important que ce mot de passe soit changé pour quelque-chose de sécurisé et unique.
+
+
+ Cette étape va vérifier le mot de passe par défaut et vérifier s'il est nécessaire de le changer.
+
+ ]]>
+ Pour bien commencer, regardez nos vidéos d'introduction
+ En cliquant sur le bouton Suvant (ou en modifiant umbracoConfigurationStatus dans le fichier web.config), vous acceptez la licence de ce logiciel telle que spécifiée dans le champ ci-dessous. Remarque : cette distribution Umbraco consiste en deux licences différentes, la licence open source MIT pour le framework et la licence Umbraco freewarequi couvre l'UI.
+ Pas encore installé.
+ Fichiers et dossiers affectés
+ Plus d'informations sur la définition des permissions
+ Vous devez donner à ASP.NET les droits de modification sur les fichiers/dossiers suivants
+ Vos permissions sont presques parfaites !
+ Vous pouvez faire fonctionner Umbraco sans problèmes, mais vous ne serez pas en mesure d'installer des packages, ce qui est hautement recommandé pour tirer pleinement parti d'Umbraco.]]>
+ Comment le résoudre
+ Cliquez ici pour lire la version texte
+ tutoriel vidéo sur la définition des permissions pour Umbraco, ou lisez la version texte.]]>
+ Vos permissions pourraient être problématiques !
+
+ Vous pouvez faire fonctionner Umbraco sans problèmes, mais vous ne serez pas en mesure d'installer des packages, ce qui est hautement recommandé pour tirer pleinement parti d'Umbraco.]]>
+ Vos permissions ne sont pas prêtes pour Umbraco !
+
+ Pour faire fonctionner Umbraco, vous aurez besoin de mettre à jour les permissions sur les fichiers/dossiers.]]>
+ Vos permissions sont parfaites !
+ Vous êtes prêt à faire fonctionner Umbraco et installer des packages !]]>
+ Résoudre un problème sur un dossier
+ Suivz ce lien pour plus d'informations sur ASP.NET et la création de dossiers
+ Définir les permissions de dossier
+
+ Je veux démarrer "from scratch"
+ Apprenez comment)
+ Vous pouvez toujours choisir d'installer Runway plus tard. Pour cela allez dans la séction "Développeur" et séléctionnez "Packages".
+ ]]>
+ Vous avez mis en oeuvre une plateforme Umbraco clean. Que voulez-vous faire ensuite ?
+ Runway est installé
+
+ Voici la liste des modules recommandés, cochez ceux que vous souhaitez installer, ou regardez la liste complète des modules
+ ]]>
+ Recommandé uniquement pour les utilisateurs expérimentés
+ Je veux commencer avec un site simple
+
+ "Runway" est un simple site fournissant des types de documents et modèles basiques. L'installeur peut mettre en oeuvre Runway automatiquement pour vous,
+ mais vous pouvez facilement léditer, lenrichir, ou le supprimer ensuite. Il n'est pas nécessaire et vous pouvez parfaitement utiliser Umbraco sans. Pour autant,
+ Runway offre un socle facile basé sur des bonnes pratiques pour vous permettre de commencer rapidement.
+ Si vous choisissez d'installer Runway, vous pouvez, de manière optionnelle, choisir des blocks appelés Runway Modules pour enrichir les pages du site.
+
+
+ Inclus avec Runway : Home page, Getting Started page, Installing Modules page.
+ Modules optionnels : Top Navigation, Sitemap, Contact, Gallery.
+
+ ]]>
+ Qu'est ce que Runway
+ Step 1/5 : Licence
+ Step 2/5 : Configuration base de données
+ Step 3/5 : Validation des permissions de fichiers
+ Step 4/5 : Sécurité Umbraco
+ Step 5/5 : Umbraco est prêt
+ Merci d'avoir choisi Umbraco
+ Parcourir votre nouveau site
+Vous avez installé Runway, alors pourquoi pas jeter un oeil au look de votre nouveau site ?]]>
+ Aide et information
+Obtenez de l'aide de notre award winning communauté, parcourez la documentation our regardez quelques vidéos sur "Comemnt construire un site simple", "Comment utiliser les packages" et un guide rapide sur la terminologie Umbraco]]>
+ Umbraco %0% est installé et prêt à être utilisé
+ /web.config file et mettre à jour le paramètre AppSetting dans umbracoConfigurationStatus en bas de la valeur de '%0%' .]]>
+ démarrer maintenant en cliquant sur le bouton "Lancer Umbraco" ci-dessous.
+Si vous débutez sur Umbraco, vous pouvez trouver plein de ressources sur nos pages "Getting Started".]]>
+ Lancer Umbraco
+Pour gérer votre site, ouvrez simplement le backoffice Umbraco et commencez à ajouter du contenu, mettez à jour les templates et feuilles de styles ou ajoutez ds nouvelles fonctionnalités]]>
+ La connexion à la base de données a échoué.
+ Umbraco Version 3
+ Umbraco Version 4
+ Regarder
+ umbraco %0%, qu'il s'agisse d'une installation récente ou de la version 3.0
+
+ Appuyez sur Press "suivant" pour commencer.]]>
+
+
+ Code de la Culture
+ Nom de la culture
+
+
+ Vous avez été inactif, la déconnexion automatique se fera dans
+ Renouvellez votre session maintenant pour sauvegarder votre travail
+
+
+ Joyeux dimanche
+ Joyeux lundi
+ Joyeux mardi
+ Joyeux mercredi
+ Joyeux jeudi
+ Joyeux vendredi
+ Joyeux samedi
+ Connectez-vous ci-dessous
+ La session a expiré
+ © 2001 - %0% umbraco.com ]]>
+
+
+ Tableau de bord
+ Sections
+ Contenu
+
+
+ Choisissez une page ci-dessous...
+ %0% a été copié dans %1%
+ Choisissez, ci-dessous, où le document %0% doit être copié
+ %0% a été déplacé dans %1%
+ Choisissez, ci-dessous, où le document %0% doit être déplacé
+ a été choisi comme racine de votre contenu, cliquez sur 'ok' ci-dessous.
+ Aucun noeud choisi, choisissez s'il vous plait un noeud dans la liste ci-dessus avant de cliquer sur 'ok'.
+ Le noeud actuel n'est pas autorisé dans le noeud choisi à cause de son type
+ Le noeud actuel ne peut pas être déplacé dans une de ses propres sous-pages
+ Le noeud actuel ne peut pas exister à la racine
+ L'action n'est pas autorisée car vous n'avez pas les droits sur un ou plus des noeuds enfants.
+ Relier les items copiés à l'original
+
+
+ Editer vos notifications pour %0%
+
+ Hi %0%
+
+ Ceci est un email automatique pour vous informer que la tâche '%1%'
+ a été executée sur la page '%2%'
+ par l'utilisateur '%3%'
+
+
+
+
Update summary:
+
+
+
+
+
+ Bonne journée !
+ Le Robot Umbraco vous salue
+
]]>
+ La notification [%0%] à propos de %1% a été executée sur %2%
+ Notifications
+
+
+
+ localisez le package. Les packages Umbraco ont généralement une extension .umb ou .zip.
+ ]]>
+ Auteur
+ Demon
+ Documentation
+ Meta data du package
+ Nom du package
+ Le package ne contient aucun éléments
+
+ Vous pouvez supprimer tranquillement le package de votre installation en cliquant sur "Désinstaller" ci-dessous.]]>
+ Aucune mises à jour disponibles
+ Options de package
+ Package readme
+ Package repository
+ Confirmation de désinstallation
+ Package was uninstalled
+ Le package a été désinstallé avec succès
+ Désintaller le package
+
+ Remarque : tous les documents, media etc dépendants des éléments que vous supprimerez, arrêteront de fonctionner, ce qui peut provoquer une instabilité du système,
+ désinstallez avec prudence. En cas de doute, contactez l'auteur du package.]]>
+ Télécharger la mise à jour depuis le repository
+ Mettre à jour le package
+ Instructions de mise à jour
+ Il y a une mise à jour disponible pour ce package. Vous pouvez la télécharger directement depuis le repository.
+ Version de package
+ Historique des version de package
+ Voir le site internet du package
+
+
+ Coller en conservant le formatage (non recommandé)
+ Le texte que vous tentez de coller contient des caractères spéciaux ou de formatage. Cela peut être dû à une copie d'un texte de Microsoft Word. Umbraco peut supprimer les caractères spéciaux et le formatage automatiquement, de manière à ce que le texte collé soit plus utilisable pour le Web.
+ Coller en tant que texte brut sans formatage
+ Coller, mais supprimer le formatage (recommendé)
+
+
+ Protection basée sur les rôles
+ via les groupes de membres Umbraco.]]>
+ l'authentification basée sur les rôles.]]>
+ Page d'erreur
+ Utilisé quand les gens sont connectés, mais n'ont pas accès
+ Choisissez comment restreindre l'accès à cette page
+ %0% est maintenant protégée
+ Protection supprimée de %0%
+ Page de connexion
+ Choisissez la page qui a le formulaire de login
+ Supprimer la protection
+ Choisissez la page qui contient le formulaire de login et les messages d'erreur
+ Piochez les roles qui ont accès à cette page
+ Définissez l'identifiant et mot de passe pour cette page
+ Protection utilisateur unique
+ Si vous souhaitez simplement mettre en place une protection par identifiant et mot de passe
+
+
+
+
+
+
+
+
+ Inclure les pages enfants non publiées
+ Publication en cours - veuillez patienter...
+ %0% sur %1% des pages ont été publiées...
+ %0% a été publié
+ %0% et ses pages enfants ont été publiées
+ Publier %0% et ses pages enfants
+ ok pour publier %0% et le rendre ainsi accessible publiquement.
+ Vous pouvez publier cette page et ses sous pages en cochant publier tous les enfants ci-dessous.
+ ]]>
+
+
+ Vous n'avez configuré aucune couleurs approuvées
+
+
+ Ajouter un lien externe
+ Ajouter un lien interne
+ Ajouter
+ Légende
+ Page interne
+ URL
+ Descendre
+ Monter
+ Ouvrir dans une nouvelle fenêtre
+ Supprimer le lien
+
+
+ Version actuelle
+ Le texte en Rouge signifit qu'il a été supprimé de la version choisie, vert signifie ajouté ]]>
+ Le document est passé à une version antérieure
+ Ceci affiche la version choisie en tant que HTML, si vous souhaitez voir les différences entre les deux versions en même temps, utilisez la vue différentielle
+ Revenir à
+ Choisissez une version
+ Voir
+
+
+ Editer le fichier de script
+
+
+ Concierge
+ Contenu
+ Courier
+ Développeur
+ Assistant de configuration Umbraco
+ Medias
+ Membres
+ Newsletters
+ Paramètres
+ Statistiques
+ Traduction
+ Utilisateurs
+ Aide
+
+
+ Template par défaut
+ Clé de dictionnaire
+ Pour importer un type de document, trouvez le fichier ".udt" sur votre ordinateur en cliquant sur le bouton "Parcourir" et cliquez sur "Importer" (une confirmation vous sera demandé à l'écran d'après)
+ Titre du nouvel onglet
+ Type de noeud
+ Type
+ Feuille de style
+ Script
+ Propriété de feuille de style
+ Onglet
+ Titre de l'onglet
+ Onglets
+ Type de contenu master activé
+ Ce type de contenu utilise
+ en tant que type de contenu master, les onglets du type de contenu master ne sont pas affichés et peuvent seulement être modifiés dans le type de contenu master lui-même.
+ Aucune propriétés définies dans cet onglet. Cliquez sur le lien "Ajouter une nouvelle propriété" en haut pour créer une nouvelle propriété.
+ Type de contenu parent
+ Créer le template correspondant
+
+
+ Sort order
+ Creation date
+ Tri achevé.
+ Faites glisser les différents éléments ci-dessous vers le haut ou le bas pour définir comment ils doivent être triés. Ou cliquez sur les entêtes de colonne pour trier la collection complète d'éléments
+ Ne fermez pas cette fenêtre durant le tri.]]>
+
+
+ La publication a été annulée par un extension tierce.
+ Le type de propriété existe déjà
+ Type de propriété créé
+ Type de données : %1%]]>
+ Type de propriété supprimé
+ Type de documet sauvegardé
+ Onglet créé
+ Onglet supprimé
+ Onglet d'ID : %0% supprimé
+ Feuille de style non sauvegardée
+ Feuille de style sauvegardée
+ Feuille de style sauvegardée sans erreurs
+ Type de données sauvegardée
+ Element de dictionnaire sauvegardé
+ La publication a échoué car la page parent n'est pas publiée
+ Contenu publié
+ et visible sur le site
+ Content sauvegardé
+ N'oubliez pas de publier pour rendre les changements visibles
+ Envoyer pour approbation
+ Les changements ont été envoyés pour approbation
+ Media sauvegardé
+ Media sauvegardé sans erreurs
+ Membre sauvegardé
+ Propriété de feuille de style sauvegardé
+ Feuille de style sauvegardé
+ Template sauvegardé
+ Erreur lors de la sauvegarde de l'utilisateur
+ Utilisateur sauvegardé
+ Type d'utilisateur sauvegardé
+ Fichier non sauvegardé
+ Le fichier n'a pas pu être sauvegardé. Vérifiez les permissions de fichier.
+ Fichier sauvegardé
+ Fichier sauvegardé sans erreurs
+ Langage sauvegardé
+ Le script Python n'a pas été sauvegardé
+ Le script Python n'a pas été sauvegardé à cause d'erreurs
+ Le script Python a été sauvegardé
+ Aucune erreur dans le script Python
+ Modèle non sauvegardé
+ Assurez-vous de ne pas avoir 2 modèles avec le même alias.
+ Modèle sauvegardé
+ Modèle sauvegardé sans aucune erreurs !
+ Le XSLT n'a pas été sauvegardé
+ Le XSLT contenait une erreur
+ Le XSLT n'a pas pu être sauvegardé, vérifiez les permissions de fichier
+ Le XSLT a été sauvegardé
+ Aucune erreurs dans le XSLT
+ Contenu publié
+ Vue partielle sauvegardée
+ Vue partielle sauvegardée sans erreurs !
+ Vue partielle non sauvegardée
+ Une erreur est survenue lors de la sauvegarde du fichier.
+
+
+ Utilise la synthaxe CSS. Ex : h1, .redHeader, .blueTex
+ Editer la feuille de style
+ Editer la propriété de feuille de style
+ Nommer pour identifier la propriété dans le Rich Text Editor
+ Prévisualiser
+ Styles
+
+
+ Editer le modèle template
+ Insérer une zone de contenu
+ Insérer un placeholder de zone de contenu
+ Insérer un élément de dictionnaire
+ Insert Macro
+ Insert umbraco page field
+ Modèle master
+ Guide rapide aux tags des modèles Umbraco
+ Modèle
+
+
+ Choisissez le type de contenu
+ Choisissez une mise en page
+ Ajouter une ligne
+ Ajouter du contenu
+ Contenu goutte
+ Paramètres appliqués
+
+ Ce contenu est pas autorisée ici
+ Ce contenu est permis ici
+
+ Cliquez pour intégrer
+ Cliquez pour insérer l'image
+ Légende de l'image...
+ Ecrire ici...
+
+ Layouts Grid
+ Layouts sont la superficie totale de travail pour l'éditeur de grille, en général, vous avez seulement besoin d'une ou deux configurations différentes
+ Ajouter Grid Layout
+ Ajustez la mise en page en définissant la largeur des colonnes et ajouter des sections supplémentaires
+ Configurations des lignes
+ Les lignes sont des cellules prédéfinies disposées horizontalement
+ Ajouter une configuration de la ligne
+ Ajustez la ligne en réglant la largeur des cellules et en ajoutant des cellules supplémentaires
+
+ Colonnes
+ Nombre total combiné de colonnes dans la configuration de la grille
+
+ Paramètres
+ Configurer quels paramètres éditeurs peuvent changer
+
+ Modes
+ Configurer ce style éditeurs peuvent changer
+
+ Les réglages seulement économiser si la configuration du json saisi est valide
+
+ Autoriser tous les éditeurs
+ Autoriser toutes les configurations de lignes
+
+
+ Champ alternatif
+ Texte alternatif
+ Casse
+ Encodage
+ Choisir un champ
+ Convertir les sauts de ligne
+ Remplace les sauts de ligne avec des balises <br>
+ Champs particuliers
+ Oui, la date seulement
+ Formater comme une date
+ Encoder en HTML
+ Remplacera les caractères spéciaux par leur équivalent HTML.
+ Sera insérer après la valeur du champ
+ Sera inséré après la valeur du champ
+ Minuscules
+ Aucun
+ Inserer après le champ
+ Inserer après le champ
+ Recursif
+ Supprimer les balises paragraphes
+ Supprimera tous les <P>
+ Champs standards
+ Majuscules
+ Encode en URL
+ Formatera les caractères spéciaux de manière à ce qu'ils soient utilisés dans une URL
+ Sera seulement utilisé quand toutes les valeurs ci-dessous seront vides
+ Ce champ sera utilisé seulement si le champ primaire est vide
+ Yes, with time. Separator:
+
+
+ Tâches qui vous sont assignées
+ vous sont assignées. Pour voir une vue détaillée incluant les commentaires, cliquez sur "Details" ou juste le nom de la page.
+ Vous pouvez télécharger la format au format XML en cliquant sur le lien "Télécharger XML".
+ Pour terminer une tâche de traduction, allez sur Details, puis cliquer sur le bouton "Terminer tâche".
+ ]]>
+ Terminer tâche
+ Détails
+ Télécharger toutes les traductions au format XML
+ Télécharger XML
+ Télécharger la DTD XML
+ Champs
+ Inclure les pages enfants
+
+ [%0%] tâches de traductions pour %1%
+ Aucun utilisateurs traducteurs trouvés. Vous devez créer un utilisateur traducteur avant d'envoyer votre contenu pour traduction
+ Tâches que vous avez créé
+ créées par vous. Pour voir une vue détaillée incluant les commentaires,
+ cliquez sur "Détails" ou juste le nom de la page. Vous pouvez aussi télécharger la page au format XML en cliquant sur le lien "Télécharger XML".
+ Pour terminer une tâche de traduction, allez sur Details, puis cliquer sur le bouton "Terminer tâche".
+ ]]>
+ La page '%0%' a été envoyé pour traduction
+ Envoyer la page '%0%' pour traduction
+ Assignée par
+ Tâches ouvertures
+ Nombre total de mots
+ Traduire en
+ Traduction complétée.
+ Vous pouvez prévisualiser les pages que vous avez traduites, en cliquant ci-dessous. Si la page originale est trouvée, vous aurez la comparaison entre les deux pages.
+ Traductio échouée, il semble que le fichier XML soit corrompu
+ Options de traduction
+ Traducteur
+ Uploader le fichier de traduction XML
+
+
+ Navigateur de cache
+ Corbeille
+ Packages créés
+ Typesde données
+ Dictionnaire
+ Packages installés
+ Installer un skin
+ Installer un starter kit
+ Langages
+ Installer un package local
+ Macros
+ Types de médias
+ Membres
+ Groupes de membres
+ Rôles
+ Types de membres
+ Types de documents
+ Packages
+ Packages
+ Fichiers Python
+ Installer depuis le repository
+ Installer Runway
+ Modules Runway
+ Fichiers de script
+ Scripts
+ Feuilles de style
+ Modèles
+ Fichiers XSLT
+
+
+ Nouvelle mise à jour prête
+ %0% est prêt, cliquez ici pour télécharger
+ Aucune connexion au serveur
+ Erreur lors de la recherche de mises à jour. Vérifiez la stack trace pour obtenir plus d'informations sur l'erreur.
+
+
+ Administrateur
+ Champ catégorie
+ Changer le mot de passe
+ Changez votre mot de passe
+ Confirmez votre nouveau mot de passe
+ Vous pouvez changer votre mot de passe d'accès à Umbraco en remplissant le formulaire ci-dessous puis en cliquant sur le bouton "Changer le mot de passe"
+ Canal de contenu
+ Champ description
+ Désactiver l'utilisateur
+ Type de document
+ Editeur
+ Champ extrait
+ Langage
+ Identifiant
+ Noeud de départ dans la librarie de médias
+ Sections
+ Désactiver l'accès Umbraco
+ Mot de passe
+ Réinitialiser le mot de passe
+ Your password has been changed!
+ Confirmez s'il vous plait votre nouveau mot de passe
+ Entrez votre nouveau mot de passe
+ Votre nouveau mot de passe ne peut être vide !
+ Mot de passe actuel
+ Mot de passe actuel invalide
+ Il y avait une différence entre le nouveau mot de passe et le mot de passe confirmé. Veuillez réessayer
+ Le mot de passe confirmé ne match pas le nouveau mot de passe saisi
+ Remplacer les permissions des noeuds enfants
+ Vous modifiez actuellement les permissions pour les pages :
+ Choisissez les pages pour lesquelles modifier les permissions
+ Rechercher tous les enfants
+ Noeud de départ du contenu
+ Nom d'utilisateur
+ Permissions utilisateur
+ Type d'utilisateur
+ Types d'utilisateur
+ Rédacteur
+ Votre profil
+ Votre historique récent
+ La session expire dans
+
+
diff --git a/OurUmbraco.Site/umbraco/config/lang/it.xml b/OurUmbraco.Site/umbraco/config/lang/it.xml
index 9cd916de..8be7261a 100644
--- a/OurUmbraco.Site/umbraco/config/lang/it.xml
+++ b/OurUmbraco.Site/umbraco/config/lang/it.xml
@@ -1,924 +1,924 @@
-
-
-
- The Umbraco community
- http://our.umbraco.org/documentation/Extending-Umbraco/Language-Files
-
-
- Gestisci hostnames
- Audit Trail
- Sfoglia
- Copia
- Crea
- Crea pacchetto
- Cancella
- Disabilita
- Svuota il cestino
- Esporta il tipo di documento
- Importa il tipo di documento
- Importa il pacchetto
- Modifica in Area di Lavoro
- Uscita
- Sposta
- Notifiche
- Accesso pubblico
- Pubblica
- Aggiorna nodi
- Ripubblica intero sito
- Permessi
- Annulla ultima modifica
- Invia per la pubblicazione
- Invia per la traduzione
- Ordina
- Invia la pubblicazione
- Traduci
- Annulla pubblicazione
- Aggiorna
-
-
- Aggiungi nuovo dominio
- Dominio
-
-
-
-
-
- Hostname non valido
- Modifica il dominio corrente
-
-
- Visualizzazione per
-
-
- Grassetto
- Cancella rientro paragrafo
- Inserisci dal file
- Inserisci intestazione grafica
- Modifica Html
- Inserisci rientro paragrafo
- Corsivo
- Centra
- Allinea testo a sinistra
- Allinea testo a destra
- Inserisci Link
- Inserisci local link (ancora)
- Elenco puntato
- Elenco numerato
- Inserisci macro
- Inserisci immagine
- Modifica relazioni
- Salva
- Salva e pubblica
- Salva e invia per approvazione
- Anteprima
-
- Scegli lo stile
- Mostra gli stili
- Inserisci tabella
-
-
- Informazioni su questa pagina
- Link alternativo
-
- Links alternativi
- Clicca per modificare questo elemento
- Creato da
- Creato il
- Tipo di documento
- Modifica
- Attivo fino al
-
-
- Ultima pubblicazione
- Link ai media
- Tipo di media
- Gruppo di membri
- Ruolo
- Tipologia Membro
-
- Titolo della Pagina
-
-
- Pubblicato
- Stato della pubblicazione
- Pubblicato il
- Rimuovi data
- Ordinamento dei nodi aggiornato
-
- Statistiche
- Titolo (opzionale)
- Tipo
- Non pubblicare
- Ultima modifica
- Rimuovi il file
- Link al documento
-
-
-
- Crea al
- Scegli il tipo ed il titolo
-
-
-
-
-
- hai aperto una nuova finestra
- Riavvia
- Visita
- Benvenuto
-
-
- Stay
- Discard changes
- You have unsaved changes
- Are you sure you want to navigate away from this page? - you have unsaved changes
-
-
- Done
-
- Deleted %0% item
- Deleted %0% items
- Deleted %0% out of %1% item
- Deleted %0% out of %1% items
-
- Published %0% item
- Published %0% items
- Published %0% out of %1% item
- Published %0% out of %1% items
-
- Unpublished %0% item
- Unpublished %0% items
- Unpublished %0% out of %1% item
- Unpublished %0% out of %1% items
-
- Moved %0% item
- Moved %0% items
- Moved %0% out of %1% item
- Moved %0% out of %1% items
-
- Copied %0% item
- Copied %0% items
- Copied %0% out of %1% item
- Copied %0% out of %1% items
-
-
- Nome
- Gestione alias Hostnames
- Chiudi questa finestra
-
-
-
-
-
- Taglia
- Modifica elemento Dictionary
- Modifica il linguaggio
- Inserisci il link locale
- Inserisci carattere
-
-
- Inserisci link
- Inserisci macro
- Inserisci tabella
- Ultima modifica
- Link
-
-
-
- Impostazioni Macro
-
- Incolla
- Modifica il Permesso per
-
-
-
- regexlib.com ha attualmente qualche problema, di cui non abbiamo il controllo. Siamo spiacevoli dell'inconveniente.]]>
-
- Elimina Macro
- Campo obbligatorio
-
-
-
- Numero di colonne
- Numero di righe
- Imposta identificativo del placeholder. Settando tale ID puoi inserire il contenuto in questo template dai template figli, facendo riferimento a questo ID usando il codice <asp:content />.]]>
- Seleziona Identificativo del placeholder dalla lista seguente. Puoi scegliere solo l'ID appartenente al template master corrente.]]>
-
- Seleziona elemento
- Visualizza gli elementi in cache
-
-
-
-
-
-
- Possibili nodetypes figli
- Crea
- Cancella tab
- Descrizione
- Nuova tab
- Tab
- Miniatura
-
-
-
-
-
- Rendering controllo
- Bottoni
- Abilita impostazioni avanzate per
- Abilita menu contestuale
- Dimensione massima delle immagini inserite
- Fogli di stile collegati
- Visualizza etichetta
- Larghezza e altezza
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Info
- Azione
- Aggiungi
- Alias
-
- Bordo
- o
- Annulla
-
- Scegli
- Chiudi
- Chiudi la finestra
- Commento
- Conferma
- Blocca le proporzioni
- Continua
- Copia
- Crea
- Base di dati
- Data
- Default
- Elimina
- Eliminato
- Elimina...
- Design
- Dimensioni
-
- Scarica
- Modifica
- Modificato
- Elementi
- Email
- Errore
- Trova
- Cartella
- Altezza
- Guida
- Icona
- Importa
-
- Inserisci
- Installa
- Giustificato
- Lingua
- Layout
- Caricamento
- Bloccato
- Login
- Log off
- Logout
- Macro
- Sposta
- Nome
- Nuovo
- Successivo
- No
- di
- Ok
- Apri
- o
- Password
- Percorso
-
-
- Precedente
-
-
- Cestino
- Rimangono
- Rinomina
- Rinnova
- Riprova
- Permessi
- Cerca
- Server
- Mostra
- Mostra la pagina inviata
- Dimensione
- Ordina
- Submit
- Tipo
-
- Su
- Aggiorna
- Aggiornamento
- Carica
- Url
- Utente
-
- Valore
- Vedi
- Benvenuto...
- Larghezza
- Si
- Reorder
- I am done reordering
-
-
- Colore di sfondo
- Grassetto
- Colore del testo
- Carattere
- Testo
-
-
- Pagina
-
-
-
-
-
-
- installa per installare il database Umbraco %0% ]]>
- Avanti per proseguire.]]>
-
- Database non trovato! Perfavore, controlla che le informazioni della stringa di connessione nel file "web.config" siano corrette.
-Per procedere, edita il file "web.config" (utilizzando Visual Studio o l'editor di testo che preferisci), scorri in basso, aggiungi la stringa di connessione per il database chiamato "umbracoDbDSN" e salva il file.
Clicca il tasto riprova quando hai finito. Maggiori dettagli per la modifica del file web.config qui.
]]>
-
-
- Premi il tasto aggiorna per aggiornare il database ad Umbraco %0%Non preoccuparti, il contenuto non verrà perso e tutto continuerà a funzionare dopo l'aggiornamento!
]]>
- Premi il tasto Avanti per continuare.]]>
- Avanti per continuare la configurazione.]]>
- La password predefinita per l'utente di default deve essere cambiata!]]>
- L'utente di default è stato disabilitato o non ha accesso ad Umbraco!Non è necessario eseguire altre operazioni. Clicca il tasto Avanti per continuare.]]>
- La password è stata modificata con successoNon è necessario eseguire altre operazioni. Clicca il tasto Avanti per continuare.]]>
-
- Umbraco crea un utente ('admin') predefinito e password ('default') . E' importante modificare la password con una personale.Questo passaggio controlla la password predefinita e ricorda, se necessario, di modificarla.
]]>
-
-
-
-
-
-
- Le impostazioni dei permessi sono perfette! Puoi eseguire Umbraco senza problemi, ma potresti non poter installare i pacchetti che sono consigliati per sfruttare tutti i vantaggi offerti da Umbraco.]]>
-
-
- video tutorial su come impostare i permessi delle cartelle per Umbraco o leggi la versione testuale.]]>
- Le impostazioni dei permessi potrebbero avere dei problemi! Puoi eseguire Umbraco, ma potresti non essere in grado di creare cartelle o installare pacchetti che sono raccomandati per sfruttare tutti i vantaggi di Umbraco.]]>
- Le impostazioni dei permessi non sono corrette per Umbraco! Per eseguire Umbraco, devi aggiornare le impostazioni dei permessi.]]>
- La configurazione dei permessi è perfetta! Sei pronto per avviare Umbraco e installare i pacchetti!]]>
-
-
-
-
-
- Guarda come) Puoi anche installare eventuali Runway in un secondo momento. Vai nella sezione Developer e scegli Pacchetti.]]>
-
- Runway è installato
-
- Questa è la lista dei nostri moduli raccomandati, seleziona quali vorresti installare, o vedi l'intera lista di moduli
- ]]>
- Raccommandato solo per utenti esperti
- Vorrei iniziare da un sito semplice
-
- "Runway" è un semplice sito web contenente alcuni tipi di documento e alcuni templates di base. L'installer configurerà Runway per te automaticamente,
- ma tu potrai facilmente modificarlo, estenderlo o eliminarlo. Non è necessario installarlo e potrai usare Umbraco anche senza di esso, ma
- Runway ti offre le basi e le best practices per cominciare velocemente.
- Se sceglierai di installare Runway, volendo potrai anche selezionare i moduli di Runway per migliorare le pagine.
-
-
- Inclusi in Runway: Home page, pagina Guida introduttiva, pagina Installazione moduli
- Moduli opzionali: Top Navigation, Sitemap, Contatti, Gallery.
-
- ]]>
- Cosa è Runway
- Passo 1/5 Accettazione licenza
- Passo 2/5: Configurazione database
- Passo 3/5: Controllo permessi dei file
- Passo 4/5: Controllo impostazioni sicurezza
- Passo 5/5: Umbraco è pronto per iniziare
- Grazie per aver scelto Umbraco
- Naviga per il tuo nuovo sito
-Hai installato Runway, quindi perché non dare uno sguardo al vostro nuovo sito web.]]>
- Ulteriori informazioni e assistenza
-Fatti aiutare dalla nostra community, consulta la documentazione o guarda alcuni video gratuiti su come costruire un semplice sito web, come usare i pacchetti e una guida rapida alla terminologia Umbraco]]>
-
- /web.config e aggiornare la chiave AppSetting UmbracoConfigurationStatus impostando il valore '%0%' .]]>
-
- iniziare immediatamente cliccando sul bottone "Avvia Umbraco". Se sei nuovo a Umbraco , si possono trovare un sacco di risorse sulle nostre pagine Getting Started.]]>
-
- Avvia Umbraco
-Per gestire il tuo sito web, è sufficiente aprire il back office di Umbraco e iniziare ad aggiungere i contenuti, aggiornando i modelli e i fogli di stile o aggiungere nuove funzionalità]]>
- Connessione al database non riuscita.
- Umbraco Versione 3
- Umbraco Versione 4
- Guarda
- Umbraco %0% per una nuova installazione o per l'aggiornamento dalla versione 3.0.
-
- Clicca "avanti" per avviare la procedura.]]>
-
-
- Codice cultura
- Nome cultura
-
-
-
- Riconnetti adesso per salvare il tuo lavoro
-
-
- © 2001 - %0% umbraco.com ]]>
- Benvenuti in Umbraco, digita il tuo username e la tua password nelle caselle seguenti:
-
-
- Dashboard
- Sezioni
- Contenuto
-
-
- Scegli la pagina sopra...
-
- Seleziona dove il documento %0% deve essere copiato
-
- Seleziona dove il documento %0% deve essere spostato
-
-
-
-
-
-
-
-
-
-
-
- Salve %0%
-
- Questa è un'email automatica per informare che l'azione '%1%'
- è stata eseguita sulla pagina '%2%'
- dall'utente '%3%'
-
-
-
-
Riepilogo aggiornamento:
-
-
-
-
-
- Buona giornata!
- Grazie da Umbraco
-
]]>
- [%0%] Notifica per %1% eseguita su %2%
- Notifiche
-
-
-
- e selezionando il pacchetto. I pacchetti Umbraco generalmente hanno l'estensione ".umb" o ".zip".
- ]]>
- Autore
- Dimostrazione
- Documentazione
- Meta dati pacchetto
- Nome del pacchetto
- Il pacchetto non contiene tutti gli elementi
-
- E' possibile rimuovere questo pacchetto dal sistema cliccando "rimuovi pacchetto" in basso.]]>
- Non ci sono aggiornamenti disponibili
- Opzioni pacchetto
- Pacchetto leggimi
- Pacchetto repository
- Conferma eliminazione
-
-
- Disinstalla pacchetto
-
- Avviso: tutti i documenti, i media, etc a seconda degli elementi che rimuoverai, smetteranno di funzionare, e potrebbero portare a un'instabilità del sistema,
- perciò disinstalla con cautela. In caso di dubbio contattare l'autore del pacchetto.]]>
-
- Aggiorna pacchetto
-
-
- Versione del pacchetto
- Vedi sito web pacchetto
-
-
-
-
-
-
-
-
-
- usando i gruppi di membri di Umbraco.]]>
- l'autenticazione basata sui ruoli.]]>
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- ok per pubblicare %0% e rendere questo contenuto accessibile al pubblico. Puoi pubblicare questa pagina e tutte le sue sottopagine selezionando pubblica tutti i figli qui sotto.]]>
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Il testo in rosso non verrà mostrato nella versione selezionata, quello in verde verrà aggiunto ]]>
-
-
-
-
-
-
-
-
-
-
- Concierge
- Contenuto
- Courier
- Sviluppo
- Configurazione guidata Umbraco
- Media
- Membri
- Newsletters
- Impostazioni
- Statistiche
- Traduzione
- Utenti
-
-
-
- Tipo di contenuto master abilitato
- Questo tipo di contenuto usa
-
-
-
-
-
- Tipo
- Foglio di stile
-
- Tab
- Titolo tab
- Tabs
-
-
- Sort order
- Creation date
-
-
- Non chiudere questa finestra durante l'operazione]]>
-
-
-
-
-
- Tipo di dati: %1%]]>
-
- Tipo di documento salvato
- Tab creata
- Tab eliminata
- Tab con id: %0% eliminata
- Contenuto non pubblicare
-
-
-
- Tipo di dato salvato
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Tipo utente salvato
-
-
-
-
-
- Partial view salvata
- Partial view salvata senza errori!
- Partial view non salvata
- Errore durante il salvataggio del file.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Anteprima
- Stili
-
-
-
-
-
-
-
-
- Master template
-
- Template
-
-
- Choose type of content
- Choose a layout
- Add a row
- Add content
- Drop content
- Settings applied
-
- This content is not allowed here
- This content is allowed here
-
- Click to embed
- Click to insert image
- Image caption...
- Write here...
-
- Grid Layouts
- Layouts are the overall work area for the grid editor, usually you only need one or two different layouts
- Add Grid Layout
- Adjust the layout by setting column widths and adding additional sections
- Row configurations
- Rows are predefined cells arranged horizontally
- Add row configuration
- Adjust the row by setting cell widths and adding additional cells
-
- Columns
- Total combined number of columns in the grid layout
-
- Settings
- Configure what settings editors can change
-
- Styles
- Configure what styling editors can change
-
- Settings will only save if the entered json configuration is valid
-
- Allow all editors
- Allow all row configurations
-
-
-
-
-
- Scegli il campo
- Converte le interruzioni di linea
-
- Campi Personalizzati
-
-
-
-
-
-
- Minuscolo
- Nessuno
-
-
- Ricorsivo
-
-
- Campi Standard
- Maiuscolo
-
-
-
-
-
-
-
- Task assegnati a te
- assegnate a te. Per vedere i dettagli, commenti inclusi, clicca su "Dettagli" o sul nome della pagina.
- Puoi anche scaricare la pagina direttamente in formato XML cliccando sul link "Scarica Xml".
- Per chiudere una traduzione, vai sulla vista Dettagli e clicca sul pulsante "Chiudi".
- ]]>
- chiudi task
- Dettagli
- Scarica tutte le traduzioni in formato xml
- Scarica xml
- Scarica xml DTD
- Campi
- Includi le sottopagine
-
- [%0%] Traduzione per %1%
-
-
- create da te. Per vedere i dettagli, inclusi i commenti,
- clicca su "Dettagli" o sul nome della pagina. Puoi anche scaricare la pagina direttamente in formato XML cliccando sul link "Scarica Xml".
- Per chiudere una traduzione, vai sulla vista Dettagli e clicca sul pulsante "Chiudi".
- ]]>
-
-
-
-
-
-
-
-
-
-
- Traduttore
-
-
-
- Cache Browser
- Cestino
- Pacchetti creati
- Tipi di dato
- Dizionario
- Pacchetti installati
- Installare skin
- Installare starter kit
- Lingue
- Installa un pacchetto locale
- Macros
- Tipi di media
- Membri
- Gruppi di Membri
- Ruoli
- Tipologia Membri
- Tipi di documento
- Pacchetti
- Pacchetti
- Files Python
- Installa dal repository
- Installa Runway
- Moduli Runway
- Files di scripting
- Scripts
- Fogli di stile
- Templates
- Files XSLT
-
-
-
-
-
-
-
-
- Amministratore
- Campo Categoria
- Cambia la tua password
-
- Conferma la nuova password
- Contenuto del canale
- Campo Descrizione
- Disabilita l'utente
- Tipo di Documento
- Editor
- Campo Eccezione
- Lingua
- Login
-
- Sezioni
- Modifica la tua password
-
- Password
-
-
- Password attuale
-
-
-
-
-
-
-
-
-
-
- Username
-
-
-
- Writer
-
-
+
+
+
+ The Umbraco community
+ http://our.umbraco.org/documentation/Extending-Umbraco/Language-Files
+
+
+ Gestisci hostnames
+ Audit Trail
+ Sfoglia
+ Copia
+ Crea
+ Crea pacchetto
+ Cancella
+ Disabilita
+ Svuota il cestino
+ Esporta il tipo di documento
+ Importa il tipo di documento
+ Importa il pacchetto
+ Modifica in Area di Lavoro
+ Uscita
+ Sposta
+ Notifiche
+ Accesso pubblico
+ Pubblica
+ Aggiorna nodi
+ Ripubblica intero sito
+ Permessi
+ Annulla ultima modifica
+ Invia per la pubblicazione
+ Invia per la traduzione
+ Ordina
+ Invia la pubblicazione
+ Traduci
+ Annulla pubblicazione
+ Aggiorna
+
+
+ Aggiungi nuovo dominio
+ Dominio
+
+
+
+
+
+ Hostname non valido
+ Modifica il dominio corrente
+
+
+ Visualizzazione per
+
+
+ Grassetto
+ Cancella rientro paragrafo
+ Inserisci dal file
+ Inserisci intestazione grafica
+ Modifica Html
+ Inserisci rientro paragrafo
+ Corsivo
+ Centra
+ Allinea testo a sinistra
+ Allinea testo a destra
+ Inserisci Link
+ Inserisci local link (ancora)
+ Elenco puntato
+ Elenco numerato
+ Inserisci macro
+ Inserisci immagine
+ Modifica relazioni
+ Salva
+ Salva e pubblica
+ Salva e invia per approvazione
+ Anteprima
+
+ Scegli lo stile
+ Mostra gli stili
+ Inserisci tabella
+
+
+ Informazioni su questa pagina
+ Link alternativo
+
+ Links alternativi
+ Clicca per modificare questo elemento
+ Creato da
+ Creato il
+ Tipo di documento
+ Modifica
+ Attivo fino al
+
+
+ Ultima pubblicazione
+ Link ai media
+ Tipo di media
+ Gruppo di membri
+ Ruolo
+ Tipologia Membro
+
+ Titolo della Pagina
+
+
+ Pubblicato
+ Stato della pubblicazione
+ Pubblicato il
+ Rimuovi data
+ Ordinamento dei nodi aggiornato
+
+ Statistiche
+ Titolo (opzionale)
+ Tipo
+ Non pubblicare
+ Ultima modifica
+ Rimuovi il file
+ Link al documento
+
+
+
+ Crea al
+ Scegli il tipo ed il titolo
+
+
+
+
+
+ hai aperto una nuova finestra
+ Riavvia
+ Visita
+ Benvenuto
+
+
+ Stay
+ Discard changes
+ You have unsaved changes
+ Are you sure you want to navigate away from this page? - you have unsaved changes
+
+
+ Done
+
+ Deleted %0% item
+ Deleted %0% items
+ Deleted %0% out of %1% item
+ Deleted %0% out of %1% items
+
+ Published %0% item
+ Published %0% items
+ Published %0% out of %1% item
+ Published %0% out of %1% items
+
+ Unpublished %0% item
+ Unpublished %0% items
+ Unpublished %0% out of %1% item
+ Unpublished %0% out of %1% items
+
+ Moved %0% item
+ Moved %0% items
+ Moved %0% out of %1% item
+ Moved %0% out of %1% items
+
+ Copied %0% item
+ Copied %0% items
+ Copied %0% out of %1% item
+ Copied %0% out of %1% items
+
+
+ Nome
+ Gestione alias Hostnames
+ Chiudi questa finestra
+
+
+
+
+
+ Taglia
+ Modifica elemento Dictionary
+ Modifica il linguaggio
+ Inserisci il link locale
+ Inserisci carattere
+
+
+ Inserisci link
+ Inserisci macro
+ Inserisci tabella
+ Ultima modifica
+ Link
+
+
+
+ Impostazioni Macro
+
+ Incolla
+ Modifica il Permesso per
+
+
+
+ regexlib.com ha attualmente qualche problema, di cui non abbiamo il controllo. Siamo spiacevoli dell'inconveniente.]]>
+
+ Elimina Macro
+ Campo obbligatorio
+
+
+
+ Numero di colonne
+ Numero di righe
+ Imposta identificativo del placeholder. Settando tale ID puoi inserire il contenuto in questo template dai template figli, facendo riferimento a questo ID usando il codice <asp:content />.]]>
+ Seleziona Identificativo del placeholder dalla lista seguente. Puoi scegliere solo l'ID appartenente al template master corrente.]]>
+
+ Seleziona elemento
+ Visualizza gli elementi in cache
+
+
+
+
+
+
+ Possibili nodetypes figli
+ Crea
+ Cancella tab
+ Descrizione
+ Nuova tab
+ Tab
+ Miniatura
+
+
+
+
+
+ Rendering controllo
+ Bottoni
+ Abilita impostazioni avanzate per
+ Abilita menu contestuale
+ Dimensione massima delle immagini inserite
+ Fogli di stile collegati
+ Visualizza etichetta
+ Larghezza e altezza
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Info
+ Azione
+ Aggiungi
+ Alias
+
+ Bordo
+ o
+ Annulla
+
+ Scegli
+ Chiudi
+ Chiudi la finestra
+ Commento
+ Conferma
+ Blocca le proporzioni
+ Continua
+ Copia
+ Crea
+ Base di dati
+ Data
+ Default
+ Elimina
+ Eliminato
+ Elimina...
+ Design
+ Dimensioni
+
+ Scarica
+ Modifica
+ Modificato
+ Elementi
+ Email
+ Errore
+ Trova
+ Cartella
+ Altezza
+ Guida
+ Icona
+ Importa
+
+ Inserisci
+ Installa
+ Giustificato
+ Lingua
+ Layout
+ Caricamento
+ Bloccato
+ Login
+ Log off
+ Logout
+ Macro
+ Sposta
+ Nome
+ Nuovo
+ Successivo
+ No
+ di
+ Ok
+ Apri
+ o
+ Password
+ Percorso
+
+
+ Precedente
+
+
+ Cestino
+ Rimangono
+ Rinomina
+ Rinnova
+ Riprova
+ Permessi
+ Cerca
+ Server
+ Mostra
+ Mostra la pagina inviata
+ Dimensione
+ Ordina
+ Submit
+ Tipo
+
+ Su
+ Aggiorna
+ Aggiornamento
+ Carica
+ Url
+ Utente
+
+ Valore
+ Vedi
+ Benvenuto...
+ Larghezza
+ Si
+ Reorder
+ I am done reordering
+
+
+ Colore di sfondo
+ Grassetto
+ Colore del testo
+ Carattere
+ Testo
+
+
+ Pagina
+
+
+
+
+
+
+ installa per installare il database Umbraco %0% ]]>
+ Avanti per proseguire.]]>
+
+ Database non trovato! Perfavore, controlla che le informazioni della stringa di connessione nel file "web.config" siano corrette.
+Per procedere, edita il file "web.config" (utilizzando Visual Studio o l'editor di testo che preferisci), scorri in basso, aggiungi la stringa di connessione per il database chiamato "umbracoDbDSN" e salva il file.
Clicca il tasto riprova quando hai finito. Maggiori dettagli per la modifica del file web.config qui.
]]>
+
+
+ Premi il tasto aggiorna per aggiornare il database ad Umbraco %0%Non preoccuparti, il contenuto non verrà perso e tutto continuerà a funzionare dopo l'aggiornamento!
]]>
+ Premi il tasto Avanti per continuare.]]>
+ Avanti per continuare la configurazione.]]>
+ La password predefinita per l'utente di default deve essere cambiata!]]>
+ L'utente di default è stato disabilitato o non ha accesso ad Umbraco!Non è necessario eseguire altre operazioni. Clicca il tasto Avanti per continuare.]]>
+ La password è stata modificata con successoNon è necessario eseguire altre operazioni. Clicca il tasto Avanti per continuare.]]>
+
+ Umbraco crea un utente ('admin') predefinito e password ('default') . E' importante modificare la password con una personale.Questo passaggio controlla la password predefinita e ricorda, se necessario, di modificarla.
]]>
+
+
+
+
+
+
+ Le impostazioni dei permessi sono perfette! Puoi eseguire Umbraco senza problemi, ma potresti non poter installare i pacchetti che sono consigliati per sfruttare tutti i vantaggi offerti da Umbraco.]]>
+
+
+ video tutorial su come impostare i permessi delle cartelle per Umbraco o leggi la versione testuale.]]>
+ Le impostazioni dei permessi potrebbero avere dei problemi! Puoi eseguire Umbraco, ma potresti non essere in grado di creare cartelle o installare pacchetti che sono raccomandati per sfruttare tutti i vantaggi di Umbraco.]]>
+ Le impostazioni dei permessi non sono corrette per Umbraco! Per eseguire Umbraco, devi aggiornare le impostazioni dei permessi.]]>
+ La configurazione dei permessi è perfetta! Sei pronto per avviare Umbraco e installare i pacchetti!]]>
+
+
+
+
+
+ Guarda come) Puoi anche installare eventuali Runway in un secondo momento. Vai nella sezione Developer e scegli Pacchetti.]]>
+
+ Runway è installato
+
+ Questa è la lista dei nostri moduli raccomandati, seleziona quali vorresti installare, o vedi l'intera lista di moduli
+ ]]>
+ Raccommandato solo per utenti esperti
+ Vorrei iniziare da un sito semplice
+
+ "Runway" è un semplice sito web contenente alcuni tipi di documento e alcuni templates di base. L'installer configurerà Runway per te automaticamente,
+ ma tu potrai facilmente modificarlo, estenderlo o eliminarlo. Non è necessario installarlo e potrai usare Umbraco anche senza di esso, ma
+ Runway ti offre le basi e le best practices per cominciare velocemente.
+ Se sceglierai di installare Runway, volendo potrai anche selezionare i moduli di Runway per migliorare le pagine.
+
+
+ Inclusi in Runway: Home page, pagina Guida introduttiva, pagina Installazione moduli
+ Moduli opzionali: Top Navigation, Sitemap, Contatti, Gallery.
+
+ ]]>
+ Cosa è Runway
+ Passo 1/5 Accettazione licenza
+ Passo 2/5: Configurazione database
+ Passo 3/5: Controllo permessi dei file
+ Passo 4/5: Controllo impostazioni sicurezza
+ Passo 5/5: Umbraco è pronto per iniziare
+ Grazie per aver scelto Umbraco
+ Naviga per il tuo nuovo sito
+Hai installato Runway, quindi perché non dare uno sguardo al vostro nuovo sito web.]]>
+ Ulteriori informazioni e assistenza
+Fatti aiutare dalla nostra community, consulta la documentazione o guarda alcuni video gratuiti su come costruire un semplice sito web, come usare i pacchetti e una guida rapida alla terminologia Umbraco]]>
+
+ /web.config e aggiornare la chiave AppSetting UmbracoConfigurationStatus impostando il valore '%0%' .]]>
+
+ iniziare immediatamente cliccando sul bottone "Avvia Umbraco". Se sei nuovo a Umbraco , si possono trovare un sacco di risorse sulle nostre pagine Getting Started.]]>
+
+ Avvia Umbraco
+Per gestire il tuo sito web, è sufficiente aprire il back office di Umbraco e iniziare ad aggiungere i contenuti, aggiornando i modelli e i fogli di stile o aggiungere nuove funzionalità]]>
+ Connessione al database non riuscita.
+ Umbraco Versione 3
+ Umbraco Versione 4
+ Guarda
+ Umbraco %0% per una nuova installazione o per l'aggiornamento dalla versione 3.0.
+
+ Clicca "avanti" per avviare la procedura.]]>
+
+
+ Codice cultura
+ Nome cultura
+
+
+
+ Riconnetti adesso per salvare il tuo lavoro
+
+
+ © 2001 - %0% umbraco.com ]]>
+ Benvenuti in Umbraco, digita il tuo username e la tua password nelle caselle seguenti:
+
+
+ Dashboard
+ Sezioni
+ Contenuto
+
+
+ Scegli la pagina sopra...
+
+ Seleziona dove il documento %0% deve essere copiato
+
+ Seleziona dove il documento %0% deve essere spostato
+
+
+
+
+
+
+
+
+
+
+
+ Salve %0%
+
+ Questa è un'email automatica per informare che l'azione '%1%'
+ è stata eseguita sulla pagina '%2%'
+ dall'utente '%3%'
+
+
+
+
Riepilogo aggiornamento:
+
+
+
+
+
+ Buona giornata!
+ Grazie da Umbraco
+
]]>
+ [%0%] Notifica per %1% eseguita su %2%
+ Notifiche
+
+
+
+ e selezionando il pacchetto. I pacchetti Umbraco generalmente hanno l'estensione ".umb" o ".zip".
+ ]]>
+ Autore
+ Dimostrazione
+ Documentazione
+ Meta dati pacchetto
+ Nome del pacchetto
+ Il pacchetto non contiene tutti gli elementi
+
+ E' possibile rimuovere questo pacchetto dal sistema cliccando "rimuovi pacchetto" in basso.]]>
+ Non ci sono aggiornamenti disponibili
+ Opzioni pacchetto
+ Pacchetto leggimi
+ Pacchetto repository
+ Conferma eliminazione
+
+
+ Disinstalla pacchetto
+
+ Avviso: tutti i documenti, i media, etc a seconda degli elementi che rimuoverai, smetteranno di funzionare, e potrebbero portare a un'instabilità del sistema,
+ perciò disinstalla con cautela. In caso di dubbio contattare l'autore del pacchetto.]]>
+
+ Aggiorna pacchetto
+
+
+ Versione del pacchetto
+ Vedi sito web pacchetto
+
+
+
+
+
+
+
+
+
+ usando i gruppi di membri di Umbraco.]]>
+ l'autenticazione basata sui ruoli.]]>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ok per pubblicare %0% e rendere questo contenuto accessibile al pubblico. Puoi pubblicare questa pagina e tutte le sue sottopagine selezionando pubblica tutti i figli qui sotto.]]>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Il testo in rosso non verrà mostrato nella versione selezionata, quello in verde verrà aggiunto ]]>
+
+
+
+
+
+
+
+
+
+
+ Concierge
+ Contenuto
+ Courier
+ Sviluppo
+ Configurazione guidata Umbraco
+ Media
+ Membri
+ Newsletters
+ Impostazioni
+ Statistiche
+ Traduzione
+ Utenti
+
+
+
+ Tipo di contenuto master abilitato
+ Questo tipo di contenuto usa
+
+
+
+
+
+ Tipo
+ Foglio di stile
+
+ Tab
+ Titolo tab
+ Tabs
+
+
+ Sort order
+ Creation date
+
+
+ Non chiudere questa finestra durante l'operazione]]>
+
+
+
+
+
+ Tipo di dati: %1%]]>
+
+ Tipo di documento salvato
+ Tab creata
+ Tab eliminata
+ Tab con id: %0% eliminata
+ Contenuto non pubblicare
+
+
+
+ Tipo di dato salvato
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Tipo utente salvato
+
+
+
+
+
+ Partial view salvata
+ Partial view salvata senza errori!
+ Partial view non salvata
+ Errore durante il salvataggio del file.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Anteprima
+ Stili
+
+
+
+
+
+
+
+
+ Master template
+
+ Template
+
+
+ Choose type of content
+ Choose a layout
+ Add a row
+ Add content
+ Drop content
+ Settings applied
+
+ This content is not allowed here
+ This content is allowed here
+
+ Click to embed
+ Click to insert image
+ Image caption...
+ Write here...
+
+ Grid Layouts
+ Layouts are the overall work area for the grid editor, usually you only need one or two different layouts
+ Add Grid Layout
+ Adjust the layout by setting column widths and adding additional sections
+ Row configurations
+ Rows are predefined cells arranged horizontally
+ Add row configuration
+ Adjust the row by setting cell widths and adding additional cells
+
+ Columns
+ Total combined number of columns in the grid layout
+
+ Settings
+ Configure what settings editors can change
+
+ Styles
+ Configure what styling editors can change
+
+ Settings will only save if the entered json configuration is valid
+
+ Allow all editors
+ Allow all row configurations
+
+
+
+
+
+ Scegli il campo
+ Converte le interruzioni di linea
+
+ Campi Personalizzati
+
+
+
+
+
+
+ Minuscolo
+ Nessuno
+
+
+ Ricorsivo
+
+
+ Campi Standard
+ Maiuscolo
+
+
+
+
+
+
+
+ Task assegnati a te
+ assegnate a te. Per vedere i dettagli, commenti inclusi, clicca su "Dettagli" o sul nome della pagina.
+ Puoi anche scaricare la pagina direttamente in formato XML cliccando sul link "Scarica Xml".
+ Per chiudere una traduzione, vai sulla vista Dettagli e clicca sul pulsante "Chiudi".
+ ]]>
+ chiudi task
+ Dettagli
+ Scarica tutte le traduzioni in formato xml
+ Scarica xml
+ Scarica xml DTD
+ Campi
+ Includi le sottopagine
+
+ [%0%] Traduzione per %1%
+
+
+ create da te. Per vedere i dettagli, inclusi i commenti,
+ clicca su "Dettagli" o sul nome della pagina. Puoi anche scaricare la pagina direttamente in formato XML cliccando sul link "Scarica Xml".
+ Per chiudere una traduzione, vai sulla vista Dettagli e clicca sul pulsante "Chiudi".
+ ]]>
+
+
+
+
+
+
+
+
+
+
+ Traduttore
+
+
+
+ Cache Browser
+ Cestino
+ Pacchetti creati
+ Tipi di dato
+ Dizionario
+ Pacchetti installati
+ Installare skin
+ Installare starter kit
+ Lingue
+ Installa un pacchetto locale
+ Macros
+ Tipi di media
+ Membri
+ Gruppi di Membri
+ Ruoli
+ Tipologia Membri
+ Tipi di documento
+ Pacchetti
+ Pacchetti
+ Files Python
+ Installa dal repository
+ Installa Runway
+ Moduli Runway
+ Files di scripting
+ Scripts
+ Fogli di stile
+ Templates
+ Files XSLT
+
+
+
+
+
+
+
+
+ Amministratore
+ Campo Categoria
+ Cambia la tua password
+
+ Conferma la nuova password
+ Contenuto del canale
+ Campo Descrizione
+ Disabilita l'utente
+ Tipo di Documento
+ Editor
+ Campo Eccezione
+ Lingua
+ Login
+
+ Sezioni
+ Modifica la tua password
+
+ Password
+
+
+ Password attuale
+
+
+
+
+
+
+
+
+
+
+ Username
+
+
+
+ Writer
+
+
diff --git a/OurUmbraco.Site/umbraco/config/lang/nl.xml b/OurUmbraco.Site/umbraco/config/lang/nl.xml
index 9ce9959e..2955ce71 100644
--- a/OurUmbraco.Site/umbraco/config/lang/nl.xml
+++ b/OurUmbraco.Site/umbraco/config/lang/nl.xml
@@ -1,1039 +1,1039 @@
-
-
-
- The Umbraco community
- http://our.umbraco.org/documentation/Extending-Umbraco/Language-Files
-
-
- Beheer domeinnamen
- Documentgeschiedenis
- Node bekijken
- Wijzig document type
- Kopiëren
- Nieuw
- Nieuwe package
- Verwijderen
- Uitschakelen
- Prullenbak leegmaken
- Documenttype exporteren
- Documenttype importeren
- Package importeren
- Aanpassen in Canvas
- Afsluiten
- Verplaatsen
- Meldingen
- Publieke toegang
- Publiceren
- Depubliceren
- Nodes opnieuw inladen
- Herpubliceer de site
- Rechten
- Vorige versies
- Klaar voor publicatie
- Klaar voor vertalen
- Sorteren
- Klaar voor publicatie
- Vertalen
- Bijwerken
- Standaardwaarde
-
-
- Permission denied.
- Nieuw domein toevoegen
- verwijderen
- Ongeldige node.
- Ongeldig domeinformaat.
- Domein is reeds aanwezig.
- Domein
- Taal
- Nieuw domein '%0%' is aangemaakt
- Domein '%0%' is verwijderd
- Domein '%0' is al aanwezig
- Domein '%0%' is bijgewerkt
- Bewerk huidige domeinen
- Zgn. 'one-level' paden in domeinen worden ondersteund, bijv. "example.com/en". Echter, ze
- zouden moeten worden vermeden. Gebruik bij voorkeur de cultuurinstelling hierboven.]]>
- Overerven
- Cultuur
- of erf de cultuur over van de ouder nodes. Zal ook van toepassing
- zijn op de huidige node, tenzij een domein hieronder ook van toepassing is.]]>
- Domeinen
-
-
- Tonen voor
-
-
- Selecteren
- Selecteer huidige map
- Doe iets anders
-
- Vet
- Paragraaf uitspringen
- Voeg formulierveld in
- Voeg grafische titel in
- Wijzig Html
- Paragraaf inspringen
- Cursief
- Centreren
- Links Uitlijnen
- Rechts Uitlijnen
- Link Invoegen
- Lokale link invoegen (anker)
- Opsomming
- Nummering
- Macro invoegen
- Afbeelding invoegen
- Relaties wijzigen
- Terug naar overzicht
- Opslaan
- Opslaan en publiceren
- Opslaan en verzenden voor goedkeuring
- voorbeeld bekijken
- Voorbeeld bekijken is uitgeschakeld omdat er geen template is geselecteerd
- Stijl kiezen
- Stijlen tonen
- Tabel invoegen
-
-
- Om het documenttype voor de geselecteerde inhoud te wijzigen, selecteert u eerst uit de lijst van geldige types voor deze locatie.
- Bevestig en/of wijzig vervolgens de toewijzing van eigenschappen van het huidige naar het nieuwe type en klik op Opslaan.
- De inhoud is opnieuw gepubliceerd.
- Huidige eigenschap
- Huidig type
- Het documenttype kan niet worden gewijzigd, omdat er geen alternatieven geldig zijn voor deze locatie.
- Documenttype gewijzigd
- Eigenschappen toewijzen
- Toewijzen aan eigenschap
- Nieuw sjabloon
- Nieuw type
- geen
- Inhoud
- Selecteer nieuw documenttype
- Het documenttype van de geselecteerde inhoud is succesvol gewijzigd naar [new type] en de volgende eigenschappen zijn toegekend:
- aan
- Toewijzen van eigenschappen kan niet worden afgerond, omdat één of meer eigenschappen meer dan één toewijzing hebben.
- Alleen alternatieve types geldig voor de huidige locatie worden weergegeven.
-
-
- Is gepubliceerd
- Over deze pagina
- Alternatieve link
- (hoe zou jij de foto beschrijven via de telefoon)
- Alternatieve links
- Klik om dit item te wijzigen
- Aangemaakt door
- Oorspronkelijke auteur
- Bijgewerkt door
- Aangemaakt op
- Datum/tijd waarop dit document is aangemaakt
- Documenttype
- Aanpassen
- Verloopt op
- Dit item is gewijzigd na publicatie
- Dit item is niet gepubliceerd
- Laatst gepubliceerd op
- Nog geen items om weer te geven.
- Mediatype
- Link naar media item(s)
- Ledengroep
- Rol
- Ledentype
- Geen datum gekozen
- Pagina Titel
- Eigenschappen
- Dit document is gepubliceerd maar niet zichtbaar omdat de bovenliggende node '%0%' niet gepubliceerd is
- Oeps: dit document is gepubliceerd, maar het is niet in de cache (interne serverfout)
- Publiceren
- Publicatiestatus
- Publiceren op
- Depubliceren op
- Verwijderdatum
- De sorteervolgorde is gewijzigd
- Om nodes te sorteren, sleep de nodes of klik op één van de kolomtitels. Je kan meerdere nodes tegelijk selecteren door de "shift"- of "control"knop in te drukken tijdens het selecteren.
- Statistieken
- Titel (optioneel)
- Alternatieve tekst (optioneel)
- Type
- Depubliceren
- Laatst gewijzigd
- Date/time this document was edited
- Bestand(en) verwijderen
- Link naar het document
- Lid van groep(en)
- Geen lid van groep(en)
-
- Kinderen
- Doel
-
-
- Klik om te uploaden
- Plaats je bestanden hier...
-
-
- Waar wil je de nieuwe %0% aanmaken?
- Aanmaken onder
- Kies een type en een titel
-
- "Documenttypes" strong>.]]>
-
- "Mediatypes".]]>
-
-
- Open je website
- - Verbergen
- Als Umbraco niet geopend wordt dan moet je misschien popups toelaten voor deze site.
- is geopend in een nieuw venster
- Herstarten
- Bezoek
- Welkom
-
-
- Stay
- Discard changes
- You have unsaved changes
- Are you sure you want to navigate away from this page? - you have unsaved changes
-
-
- Done
-
- Deleted %0% item
- Deleted %0% items
- Deleted %0% out of %1% item
- Deleted %0% out of %1% items
-
- Published %0% item
- Published %0% items
- Published %0% out of %1% item
- Published %0% out of %1% items
-
- Unpublished %0% item
- Unpublished %0% items
- Unpublished %0% out of %1% item
- Unpublished %0% out of %1% items
-
- Moved %0% item
- Moved %0% items
- Moved %0% out of %1% item
- Moved %0% out of %1% items
-
- Copied %0% item
- Copied %0% items
- Copied %0% out of %1% item
- Copied %0% out of %1% items
-
-
- Naam
- Beheer domeinnamen
- Sluit dit venster
- Weet je zeker dat je dit wilt verwijderen
- Weet je zeker dat je dit wilt uitschakelen
- Vink aub dit keuzevak aan om het verwijderen van %0% item(s) te bevestigen
- Weet je het zeker?
- Weet je het zeker?
- Knippen
- Pas woordenboekitem aan
- Taal aanpassen
- Lokale link invoegen
- Karakter invoegen
- Voeg grafische titel in
- Afbeelding invoegen
- Link invoegen
- Klik om een Macro toe te voegen
- Tabel invoegen
- Laatst aangepast op
- Link
- Interne link:
- Plaats een hekje (“#”) voor voor interne links.
- In nieuw venster openen?
- Macro Settings
- Deze macro heeft geen eigenschappen die u kunt bewerken
- Plakken
- Bewerk rechten voor
- De items worden nu uit de prullenbak verwijderd. Sluit dit venster niet terwijl de actie nog niet voltooid is.
- De prullenbak is nu leeg.
- Als items worden verwijderd uit de prullenbak, zijn ze voorgoed verwijderd.
- regexlib.com ondervindt momenteel prolemen waarover we geen controle hebben. Onze excuses voor het ongemak.]]>
- Zoek naar een regular expressie om validatie aan een formulierveld toe te voegen. Voorbeeld: 'email, 'post-code' 'url'
- Verwijder Macro
- Verplicht veld
- Site is opnieuw geïndexeerd
- De site is opnieuw gepubliceerd
- De cache zal worden vernieuwd. Alle gepubliceerde inhoud zal worden ge-update, terwijl ongepubliceerde inhoud ongepubliceerd zal blijven.
- Aantal kolommen
- Aantal regels
- Plaats een placeholder id door een ID op uw placeholder te zetten kunt u inhoud plaatsen in deze template vanuit onderliggende templates,
- door te referreren naar deze ID door gebruik te maken van een <asp:content /> element.]]>
- Selecteer een placeholder id uit onderstaande lijst. U kunt alleen
- Id's kiezen van de master van de huidige template..]]>
- Klik op de afbeelding voor volledige grootte
- Kies een item
- Toon cache item
-
-
-
- Cultuurnaam
-
-
- Typ je gebruikersnaam
- Typ je wachtwoord
- Benoem de %0%...
- Typ een naam...
- Typ om te zoeken...
- Typ om te filteren...
- Typ om tags toe te voegen (druk op enter na elke tag)...
-
-
-
- Toestaan op root-niveau
- Wanneer aangevinkt dan mag dit document type aangemaakt worden op het root-niveau van content of media trees.
- Toegelaten subnodetypes
- Document Type Composities
- Nieuw
- Tab verwijderen
- Omschrijving
- Nieuwe tab
- Tab
- Miniatuur
- Lijstweergave inschakelen
- Stelt het content item in zodat een sorteer- en zoekbare lijstweergave van onderliggende nodes wordt getoond. De onderliggende nodes worden niet in de tree getoond
- Huidige lijstweergave
- De actieve data type in lijstweergave
- Maak een aangepaste lijstweergave
- Verwijder aangepaste lijstweergave
-
-
- Prevalue toevoegen
- Datebase datatype
- Data Editor GUID
- Render control
- Buttons
- Geavanceerde instellingen inschakelen voor
- Context menu inschakelen
- Maximum standaard grootte van afbeeldingen
- Gerelateerde stylesheets
- Toon label
- Breedte en hoogte
-
-
- Je data is opgeslagen, maar voordat je deze pagina kunt publiceren moet je eerst aan paar problemen herstellen:
- Het wachtwoord veranderen wordt door de huidige Membership Provider niet ondersteund (EnablePasswordRetrieval moet op true staan)
- %0% bestaat al
- Er zijn fouten geconstateerd:
- Er zijn fouten geconstateerd:
- Het wachtwoord moet minstens %0% tekens lang zijn en moet minstens %1% cijfers bevatten
- %0% moet een geheel getal zijn
- %0% op tab %1% is een verplicht veld
- %0% is een verplicht veld
- %0% op tab %1% is niet in het correcte formaat
- %0% is niet in het correcte formaat
-
-
- Het opgegeven bestandstype is niet toegestaan door de beheerder
- OPMERKING! Ondanks dat CodeMiror is ingeschakeld, is het uitgeschakeld in Internet Explorer omdat het niet stabiel genoeg is.
- Zowel de alias als de naam van het nieuwe eigenschappen type moeten worden ingevuld!
- Er is een probleem met de lees/schrijf rechten op een bestand of map
- Vul een titel in
- Selecteer een type
- U wilt een afbeelding groter maken dan de originele afmetingen. Weet je zeker dat je wilt doorgaan?
- Fout in python script
- Het python script is niet opgeslagen omdat het fouten bevat
- Start node is verwijderd, neem contact op met uw systeembeheerder
- Markeer de inhoud voordat u de stijl aanpast
- Geen actieve stijlen beschikbaar
- Plaats de cursor links van de twee cellen die je wilt samenvoegen
- Je kunt een cel die is samengevoegd niet delen
- Fout in de XSLT bron
- De XSLT is niet opgeslagen omdat deze fout(en) bevat
- Er is een configuratiefout bij het gegevenstype dat wordt gebruikt voor deze eigenschap. Controleer het gegevenstype
-
-
- Over
- Actie
- Acties
- Toevoegen
- Alias
- Weet je het zeker?
- Rand
- of
- Annuleren
- Cel marge
- Kiezen
- Sluiten
- Venster sluiten
- Opmerking
- Bevestigen
- Verhouding behouden
- Doorgaan
- Kopiëren
- Aanmaken
- Databank
- Datum
- Standaard
- Verwijderen
- Verwijderd
- Verwijderen...
- Ontwerp
- Afmetingen
- Beneden
- Download
- Aanpassen
- Aangepast
- Elementen
- E-mail
- Fout
- Zoeken
- Hoogte
- Help
- Icoon
- Importeren
- Binnenmarge
- Invoegen
- Installeren
- Uitvullen
- Taal
- Lay-out
- Bezig met laden
- Geblokkeerd
- Inloggen
- Afmelden
- Afmelden
- Macro
- Verplaatsen
- Meer
- Naam
- Nieuw
- Volgende
- Nee
- van
- Ok
- Openen
- of
- Wachtwoord
- Pad
- Placeholder ID
- Een ogenblik geduld a.u.b.
- Vorige
- Eigenschappen
- E-mail om formulier te ontvangen
- Prullenbak
- Overgebleven
- Hernoemen
- Vernieuw
- Verplicht
- Opnieuw proberen
- Rechten
- Zoek
- Server
- Tonen
- Toon pagina bij versturen
- Formaat
- Sorteren
- Submit
- Type
- Type om te zoeken...
- Omhoog
- Bijwerken
- Upgrade
- Upload
- Url
- Gebruiker
- Gebruikersnaam
- Waarde
- Toon
- Welkom...
- Breedte
- Ja
- Map
- Reorder
- I am done reordering
-
- Zoekresultaten
-
-
- Achtergrondkleur
- Vet
- Tekstkleur
- Lettertype
- Tekst
-
-
- Pagina
-
-
- De installer kan geen connectie met de database maken.
- De web.config kon niet worden opgeslagen. Gelieve de connectiestring handmatig aan te passen.
- Je database is gevonden en is geïdentificeerd als
- Database configuratie
- installeren om de Umbraco %0% database te installeren]]>
- Volgende om door te gaan.]]>
- De database kon niet gevonden worden! Gelieve na te kijken of de informatie in de "connection string" van het "web.config" bestand correct is. Om door te gaan, gelieve het "web.config" bestand aan te passen (met behulp van Visual Studio of je favoriete tekstverwerker), scroll in het bestand naar beneden, voeg de connection string voor je database toe in de key met naam "umbracoDbDSN" en sla het bestand op.
Klik op de knop opnieuw proberen als je hiermee klaar bent. Meer informatie over het aanpassen van de web.config vind je hier.
]]>
- Gelieve contact op te nemen met je ISP indien nodig. Wanneer je installeert op een lokale computer of server, dan heb je waarschijnlijk informatie nodig van je systeembeheerder.]]>
- Klik de upgrade knop om je database te upgraden naar Umbraco %0% Maak je geen zorgen - er zal geen inhoud worden gewist en alles blijft gewoon werken!
]]>
- Klik Volgende om verder te gaan.]]>
- volgende om door te gaan]]>
- Het wachtwoord van de default gebruiker dient veranderd te worden!]]>
- De default gebruiker is geblokkeerd of heeft geen toegang tot Umbraco!Geen verdere actie noodzakelijk. Klik Volgende om verder te gaan.]]>
- Het wachtwoord van de default gebruiker is sinds installatie met succes veranderd.Geen verdere actie noodzakelijk. Klik Volgende om verder te gaan.]]>
- Het wachtwoord is veranderd!
- Umbraco maakt een default gebruiker aan met login ('admin') and wachtwoord ('default') . Het is belangrijk dat dit wachtwoord wordt veranderd in iets unieks. Deze stap controleert het password van de default gebruiker en adviseert of het veranderd dient te worden.
]]>
- Neem een jumpstart en bekijk onze introductie videos
-
- Nog niet geïnstalleerd.
- Betreffende bestanden en mappen
- Meer informatie over het instellen van machtigingen voor Umbraco vind je hier
- Je dient ASP.NET 'modify' machtiging te geven voor de volgende bestanden/mappen
- Je machtigingen zijn bijna perfect! Je kunt Umbraco zonder problemen starten, maar je kunt nog geen packages installeren om volledig van Umbraco te profiteren.]]>
- Hoe op te lossen
- Klik hier om de tekst versie te lezen
- video tutorial over het instellen van machtigingen voor Umbraco, of lees de tekst versie.]]>
- Je machtigingen zijn misschien incorrect! Je kunt Umbraco probleemloos starten, maar je kunt nog geen mappen aanmaken of packages installeren om zo volledig van Umbraco te profiteren.]]>
- Je machtigingen zijn nog niet gereed gemaakt voor Umbraco! Om Umbraco te starten zul je je machtigingen moeten aanpassen.]]>
- Je machtigingen zijn perfect! Je bent nu klaar om Umbraco te starten en om packages te installeren!]]>
- Map probleem wordt opgelost
- Volg deze link voor meer informatie over problemen met ASP.NET en het aanmaken van mappen
- Machtigingen worden aangepast
- Umbraco heeft write/modify toegang nodig op bepaalde mappen om bestanden zoals plaatjes en PDF's op te slaan. Het slaat ook tijdelijke data (ook bekend als 'de cache') op om de snelheid van je website te verbeteren.
- Ik wil met een lege website beginnen
- leer hoe). Je kunt er later alsnog voor kiezen om Runway te installeren. Ga dan naar de Ontwikkelaar sectie en kies Packages.]]>
- Je hebt zojuist een blanco Umbraco platform geinstalleerd. Wat wil je nu doen?
- Runway is geinstalleerd
- Dit is onze lijst van aanbevolen modules. Vink de modules die je wilt installeren, of bekijk de volledige lijst modules ]]>
- Alleen aanbevolen voor gevorderde gebruikers
- Ik wil met een eenvoudige website beginnen
- "Runway" is een eenvoudige website die je van enkele elementaire documenttypes en templates voorziet. De installer kan Runway automatisch voor je opzetten, maar je kunt het gemakkelijk aanpassen, uitbreiden of verwijderen. Het is niet vereist en je kunt Umbraco prima zonder Runway gebruiken.
-
-Echter, Runway biedt een gemakkelijke basis om je snel op weg te helpen. Als je er voor kiest om Runway te installeren, dan kun je optioneel de bouwstenen (genaamd Runway Modules) kiezen om je Runway pagina's te verbeteren. Runway omvat: Home pagina, Getting Started pagina, Module installatie pagina. Optionele Modules: Top Navigatie, Sitemap, Contact, Gallery.
- ]]>
- Wat is Runway
- Stap 1/5: Licentie aanvaarden
- Stap 2/5: Database configureren
- Stap 3/5: Controleren van rechten op bestanden
- Stap 4/5: Umbraco beveiliging controleren
- Stap 5/5: Umbraco is klaar
- Bedankt dat je voor Umbraco hebt gekozen
- Browse je nieuwe site Je hebt Runway geinstalleerd, dus kijk eens hoe je nieuwe site eruit ziet.]]>
- Meer hulp en informatie Vind hulp in onze bekroonde community, blader door de documentatie of bekijk enkele gratis videos over het bouwen van een eenvoudige site, het gebruiken van packages en een overzicht van Umbraco terminologie]]>
- Umbraco %0% is geïnstalleerd en klaar voor gebruik.
- /web.config bestand aanpassen, en de Appsetting key UmbracoConfigurationStatus onder in het bestand veranderen naar '%0%' .]]>
- meteen beginnen door de "Launch Umbraco" knop hieronder te klikken. Als je een beginnende Umbraco gebruiker bent, dan kun je you can find veel informatie op onze "getting started" pagina's vinden.]]>
- Launch Umbraco Om je website te beheren open je simpelweg de Umbraco back office en begin je inhoud toe te voegen, templates en stylesheets aan te passen of nieuwe functionaliteit toe te voegen]]>
- Verbinding met de database mislukt.
- Umbraco versie 3
- Umbraco versie 4
- Bekijken
- Umbraco %0% voor een nieuwe installatie of een upgrade van versie 3.0. Druk op "volgende" om de wizard te starten.]]>
-
-
- Cultuurcode
- Cultuurnaam
-
-
- Je bent inactief en zult automatisch worden uitgelogd over
- Vernieuw je sessie om je wijzigingen te behouden
-
-
- Goede zondag
- Fijne maandag
- Fijne dinsdag
- Fijne woensdag
- Fijne donderdag
- Fijne vrijdag
- Fijne zaterdag
-
- log hieronder in
- Sessie is verlopen
-
- © 2001 - %0% umbraco.com ]]>
-
-
- Dashboard
- Secties
- Inhoud
-
-
- Selecteer pagina boven...
- %0% is gekopieerd naar %1%
- Kopieer naar
- %0% is verplaatst naar %1%
- Verplaats naar
- is geselecteerd als root van je nieuwe pagina, klik hieronder op 'ok'.
- Nog geen node geselecteerd, selecteer eerst een node in bovenstaade lijst voordat je op 'volgende' klikt
- De huidige node is niet toegestaan onder de geselecteerde node vanwege het node type
- De huidige node kan niet naar een van zijn subpagina’s worden verplaatst.
- De huidige node kan niet worden gebruikt op root-niveau
- Deze actie is niet toegestaan omdat je onvoldoende rechten hebt op 1 of meer kinderen.
- Relateer gekopieerde items aan het origineel
-
-
- Bewerk de notificatie voor %0%
-
- Hi %0%
-
- Dit is een geautomatiseerde mail om u op de hoogte te brengen dat de taak '%1%'
- is uitgevoerd op pagina '%2%'
- door gebruiker '%3%'
-
-
-
-
Update samenvatting:
-
-
-
-
-
- Een prettige dag!
- Dit is een bericht van uw Content Management Systeem.
-
- ]]>
- [%0%] Notificatie over %1% uitgevoerd op %2%
- Notificaties
-
-
- Kies een package op je computer door op "Bladeren" te klikken en de package te selecteren. Umbraco packages hebben meestal ".umb" of ".zip" als extensie.
- Auteur
- Demonstratie
- Documentatie
- Package meta data
- Package naam
- Package bevat geen inhoud
-
- Je kunt dit package veilig verwijderen door 'verwijder package' te klikken.
- ]]>
- Geen upgrades beschikbaar
- Package opties
- Package lees mij
- Package repository
- Bevestig verwijderen
- Package is verwijderd
- De package is succesvol verwijderd
- Verwijder package
-
- Waarschuwing: alle documenten, media etc, die afhankelijk zijn van de items die je verwijderd, zullen niet meer werken en kan leiden tot een instabiele installatie,
- wees dus voorzichtig met verwijderen. Als je niet zeker bent, neem dan contact op met de auteur van de package.
- ]]>
- Download update uit de repository
- Upgrade package
- Upgrade instructies
- Er is een upgrade beschikbaar voor deze package. Je kunt het direct downloaden uit de Umbraco package repository.
- Package versie
- Package versiehistorie
- Bekijk de package website
-
-
- Plakken met alle opmaak (Niet aanbevolen)
- De tekst die je probeert te plakken bevat speciale karakters en/of opmaak. Dit kan veroorzaakt worden doordat de tekst vanuit Microsoft Word is gekopieerd. Umbraco kan deze speciale karakters en formattering automatisch verwijderen zodat de geplakte tekst geschikt is voor het web.
- Plakken als ruwe tekst en alle opmaak verwijderen
- Plakken, en verwijder de opmaak (aanbevolen)
-
-
- Geavanceerd: Beveilig door de Member Groups te seecteren die toegang hebben op de pagina
- gebruik makend van Umbraco's member groups.]]>
- role-based authentication.]]>
- Error Pagina
- Gebruikt om te tonen als een gebruiker is ingelogd, maar geen rechten heeft om de pagina te bekijken
- Hoe wil je de pagina beveiligen?
- %0% is nu beveiligd
- Beveiliging verwijderd van %0%
- Login Pagina
- Kies de pagina met het login-formulier
- Verwijder beveiliging
- Kies de pagina's die het login-formulier en de error-berichten bevatten
- Kies de roles wie toegang hebben tot deze pagina
- Geef de gebruikersnaam en wachtwoord voor deze pagina
- Eenvoudig: Beveilig door middel van gebruikersnaam en wachtwoord
- Als je eenvoudige beveiliging wilt gebruiken met behulp van een enkele gebruikersnaam en wachtwoord
-
-
-
-
-
-
-
- Inclusief ongepubliceerde kinderen
- Publicatie in uitvoering - even geduld...
- %0% van %1% pagina’s zijn gepubliceerd...
- %0% is gepubliceerd
- %0% en onderliggende pagina’s zijn gepubliceerd
- Publiceer %0% en alle kinderen
- ok om %0% te publiceren en de wijzigingen zichtbaar te maken voor bezoekers.
- Je kunt deze pagina publiceren en alle onderliggende sub-pagina's door publiceer alle kinderen aan te vinken hieronder.
- ]]>
-
-
- Je hebt geen goedgekeurde kleuren geconfigureerd
-
-
- Externe link toevoegen
- Interne link toevoegen
- Toevoegen
- Bijschrift
- Interne pagina
- URL
- Verplaats omlaag
- Verplaats omhoog
- Open in nieuw venster
- Verwijder link
-
-
- Reset
-
-
- Huidige versie
- Rode tekst wordt niet getoond in de geselecteerde versie , groen betekent toegevoegd ]]>
- Document is teruggezet
- Hiermee wordt de geselecteerde versie als html getoond, als u de verschillen tussen de 2 versies tegelijk wilt zien, gebruik dan de diff view
- Terugzetten naar
- Selecteer versie
- Bekijk
-
-
- Bewerk script-bestand
-
-
- Concierge
- Inhoud
- Courier
- Ontwikkelaar
- Umbraco configuratiewizard
- Media
- Leden
- Nieuwsbrieven
- Instellingen
- Statistieken
- Vertaling
- Gebruikers
- Umbraco Contour
-
- Help
- Formulieren
- Analytics
-
-
- Standaard template
- Woordenboek sleutel
- Om een bestaand documenttype te importeren, zoek het betreffende “.udt” bestand door op browse en import te klikken. (Je ziet een bevestigingspagina voordat de import start. Als het documenttype al bestaat dan wordt het bijgewerkt.)
- Nieuwe tabtitel
- Node type
- Type
- Stylesheet
- Script
- Stylesheet eigenschap
- Tab
- Tab titel
- Tabs
- Basis inhoudstype ingeschakeld
- Dit inhoudstype gebruikt
- als basis inhoudstype. Tabs van basis inhoudstypes worden niet getoond en kunnen alleen worden aangepast op het basis inhoudstype zelf
- Geen eigenschappen gedefinieerd op dit tabblad. Klik op de link "voeg een nieuwe eigenschap" aan de bovenkant om een nieuwe eigenschap te creëren.
- Master Document Type
- Maak een bijbehorend template
-
-
- Sort order
- Creation date
- Sorteren gereed.
- Sleep de pagina's omhoog of omlaag om de volgorde te veranderen. Of klik op de kolom-header om alle pagina's daarop te sorteren.
- Sluit dit venster niet tijdens het sorteren]]>
-
-
- Publicatie werd geannuleerd door een 3rd party plug-in
- Eigenschappen type bestaat al
- Eigenschappen type aangemaakt
- Data type: %1%]]>
- Eigenschappen type verwijderd
- Inhoudstype opgeslagen
- Tab aangemaakt
- Tab verwijderd
- Tab met id: %0% verwijderd
- Stylesheet niet opgeslagen
- Stylesheet opgeslagen
- Stylesheet opgeslagen zonder fouten
- Datatype opgeslagen
- Woordenboek item opgeslagen
- Publicatie is mislukt omdat de bovenliggende pagina niet gepubliceerd is
- Inhoud gepubliceerd
- en zichtbaar op de website
- Inhoud opgeslagen
- Vergeet niet te publiceren om de wijzigingen zichtbaar te maken
- Verzend voor goedkeuring
- Verandering zijn verstuurd voor goedkeuring
- Media opgeslagen
- Media opgeslagen zonder fouten
- Lid opgeslagen
- Stijlsheet eigenschap opgeslagen
- Stijlsheet opgeslagen
- Template opgeslagen
- Fout bij opslaan gebruiker (zie logboek)
- Gebruiker opgeslagen
- Gebruikerstype opgeslagen
- Bestand niet opgeslagen
- bestand kon niet worden opgeslagen. Controleer de bestandsbeveiliging
- Bestand opgeslagen
- Bestand opgeslagen zonder fouten
- Taal opgeslagen
- Python script niet opgeslagen
- Python script kon niet worden opgeslagen door een fout
- Python script opeslagen!
- Geen fouten in python script!
- Template niet opgeslagen
- Controleer dat je geen 2 tamplates met dezelfde naam hebt
- Template opgeslagen
- Template opgeslagen zonder fouten!
- XSLT niet opgeslagen
- XSLT bevat een fout
- XSLT kon niet worden opgeslagen, controleer de bestandsbeveiliging
- XSLT opgeslagen
- Geen fouten in de XSLT!
- Inhoud gedepubliceerd
- Partial view opgeslagen
- Partial view opgeslagen zonder fouten!
- Partial view niet opgeslagen
- Er is een fout opgetreden bij het opslaan van het bestand.
-
-
- Gebruik CSS syntax bijv: h1, .redHeader, .blueTex
- Stijlsheet aanpassen
- Bewerk stylesheet eigenschap
- Naam waarmee de stijl in de editor te kiezen is
- Voorbeeld
- Stijlen
-
-
- Template aanpassen
- Invoegen inhoudsgebied
- Invoegen inhoudsgebied placeholder
- Invoegen dictionary item
- Invoegen Macro
- Invoegen Umbraco page field
- Basis sjabloon
- Quick Guide voor Umbraco template tags
- Sjabloon
-
-
- Item toevoegen
- Choose a layout
- Een rij aan de lay-out toevoegen
- teken onderaan en voeg je eerste item toe]]>
- Drop content
- Settings applied
-
- This content is not allowed here
- This content is allowed here
-
- Klik om een item te embedden
- Klik om een afbeelding in te voegen
- Afbeelding ondertitel...
- Typ hier......
- Grid lay-outs
- Lay-outs zijn het globale werkgebied voor de grid editor. Je hebt meestal maar één of twee verschillende lay-outs nodig
- Een grid layout toevoegen
- De lay-out aanpassen door de kolombreedte aan te passen en extra kolommen toe te voegen
-
- Rijconfiguratie
- Rijen zijn voorgedefinieerde cellen die horizontaal zijn gerangschikt
- Een rijconfiguratie toevoegen
- De rijconfiguratie aanpassen door de breedte van de cel in te stellen en extra cellen toe te voegen
-
- Kolommen
- Het totaal aantal gecombineerde kolommen in de grid layout
-
- Instellingen
- Configureren welke instellingen de editors kunnen aanpassen
-
-
- Styles
- Configureren welke stijlen de editors kunnen aanpassen
-
- De instellingen worden enkel bewaard indien de ingevoerde Json geldig is
-
- Alle editors toelaten
- Alle rijconfiguraties toelaten
-
-
- Alternatief veld
- Alternatieve tekst
- Kapitalisatie
- Encoding
- Selecteer veld
- Converteer regelafbreking
- ]]>
- Aangepaste velden
- Ja, alleen datum
- Opmaken als datum
- HTML-encoderen
- Speciale karakters worden geëncodeerd naar HTML.
- Zal worden ingevoegd na de veld waarde
- Zal worden ingevoegd voor de veld waarde
- Kleine letters
- Geen
- Invoegen na veld
- Invoegen voor veld
- Recursief
- Verwijder paragraaf tags
- tags aan het begin en einde van de tekst worden verwijderd]]>
- Standaard velden
- Hoofdletters
- URL-encoderen
- Speciale karakters in URL's worden geëncodeerd
- Zal alleen worden gebruikt waneer de bovenstaande veld waardes leeg zijn
- Dit veld zal alleen worden gebruikt als het primaire veld leeg is
- Ja, met tijd. Scheidingsteken:
-
-
- Taken aan jou toegewezen
-
- Sluit taak
- Details van vertaling
- Download alle vertalingstaken als xml
- Download xml
- Download xml DTD
- Velden
- Inclusief onderliggende pagina's
-
- [%0%] Vertaalopdracht voor %1%
- Geen vertaal-gebruikers gevonden. Maak eerst een vertaal-gebruiker aan voordat je pagina's voor vertaling verstuurd
- Taken aangemaakt door jou
- die je aanmaakte. Om een detailweergave met opmerkingen te zien, klik op "Detail" of op de paginanaam. Je kan ook de pagina in XML-formaat downloaden door op de "Download XML"-link te klikken. Om een vertalingstaak te sluiten, klik je op de "Sluiten"-knop in detailweergave.]]>
- De pagina '%0%' is verstuurd voor vertaling
- Stuur voor vertaling
- Toegewezen door
- Taak geopend
- Totaal aantal woorden
- Vertaal naar
- Vertaling voltooid.
- Je kan een voorbeeld van vertaalde pagina's bekijken door hieronder te klikken. Als de originele pagina gevonden werd, wordt een vergelijking van beide pagina's getoond.
- Vertalen niet gelukt, het XML-bestand is mogelijk beschadigd.
- Vertalingsopties
- Vertaler
- Vertaald XML-document uploaden
-
-
- Cachebrowser
- Prullenbak
- Gemaakte packages
- Datatypes
- Woordenboek
- Geïnstalleerde packages
- Installeer skin
- Installeer starter kit
- Talen
- Installeer een lokale package
- Macro's
- Mediatypes
- Leden
- Ledengroepen
- Rollen
- Ledentypes
- Documenttypes
- Packages
- Packages
- Python-bestanden
- Installeer uit repository
- Installeer Runway
- Runway modules
- Script bestanden
- Scripts
- Stylesheets
- Sjablonen
- XSLT Bestanden
-
-
- Nieuwe update beschikbaar
- %0% is gereed, klik hier om te downloaden
- Er is geen verbinding met de server
- Er is een fout opgetreden bij het zoeken naar een update. Bekijk de trace-stack voor verdere informatie.
-
-
- Beheerders
- Categorieveld
- Verander je wachtwoord
- Wijzig je wachtwoord
- Bevestig nieuw password
- Je kunt je wachtwoord veranderen door onderstaan formulier in te vullen en op de knop 'Verander wachtwoord' te klikken
- Inhoudskanaal
- Omschrijving
- Geblokkeerde gebruiker
- Documenttype
- Redacteur
- Samenvattingsveld
- Taal
- Loginnaam
- Startnode in Mediabibliotheek
- Secties
- Blokkeer Umbraco toegang
- Wachtwoord
- Reset wachtwoord
- Je wachtwoord is veranderd!
- Herhaal nieuwe wachtwoord
- Voer nieuwe wachtwoord in
- Je nieuwe wachtwoord mag niet leeg zijn!
- Huidig wachtwoord
- Ongeldig huidig wachtwoord
- Beide wachtwoorden waren niet hetzelfde. Probeer opnieuw!
- Beide wachtwoorden zijn niet hetzelfde!
- Vervang rechten op de subnodes
- U bent momenteel rechten aan het aanpassen voor volgende pagina's:
- Selecteer pagina's om hun rechten aan te passen
- Doorzoek alle subnodes
- Startnode in Content
- Gebruikersnaam
- Gebruikersrechten
- Gebruikerstype
- Gebruikerstypes
- Auteur
- Wijzig
-
- Je profiel
- Je recente historie
- Sessie verloopt over
-
-
+
+
+
+ The Umbraco community
+ http://our.umbraco.org/documentation/Extending-Umbraco/Language-Files
+
+
+ Beheer domeinnamen
+ Documentgeschiedenis
+ Node bekijken
+ Wijzig document type
+ Kopiëren
+ Nieuw
+ Nieuwe package
+ Verwijderen
+ Uitschakelen
+ Prullenbak leegmaken
+ Documenttype exporteren
+ Documenttype importeren
+ Package importeren
+ Aanpassen in Canvas
+ Afsluiten
+ Verplaatsen
+ Meldingen
+ Publieke toegang
+ Publiceren
+ Depubliceren
+ Nodes opnieuw inladen
+ Herpubliceer de site
+ Rechten
+ Vorige versies
+ Klaar voor publicatie
+ Klaar voor vertalen
+ Sorteren
+ Klaar voor publicatie
+ Vertalen
+ Bijwerken
+ Standaardwaarde
+
+
+ Permission denied.
+ Nieuw domein toevoegen
+ verwijderen
+ Ongeldige node.
+ Ongeldig domeinformaat.
+ Domein is reeds aanwezig.
+ Domein
+ Taal
+ Nieuw domein '%0%' is aangemaakt
+ Domein '%0%' is verwijderd
+ Domein '%0' is al aanwezig
+ Domein '%0%' is bijgewerkt
+ Bewerk huidige domeinen
+ Zgn. 'one-level' paden in domeinen worden ondersteund, bijv. "example.com/en". Echter, ze
+ zouden moeten worden vermeden. Gebruik bij voorkeur de cultuurinstelling hierboven.]]>
+ Overerven
+ Cultuur
+ of erf de cultuur over van de ouder nodes. Zal ook van toepassing
+ zijn op de huidige node, tenzij een domein hieronder ook van toepassing is.]]>
+ Domeinen
+
+
+ Tonen voor
+
+
+ Selecteren
+ Selecteer huidige map
+ Doe iets anders
+
+ Vet
+ Paragraaf uitspringen
+ Voeg formulierveld in
+ Voeg grafische titel in
+ Wijzig Html
+ Paragraaf inspringen
+ Cursief
+ Centreren
+ Links Uitlijnen
+ Rechts Uitlijnen
+ Link Invoegen
+ Lokale link invoegen (anker)
+ Opsomming
+ Nummering
+ Macro invoegen
+ Afbeelding invoegen
+ Relaties wijzigen
+ Terug naar overzicht
+ Opslaan
+ Opslaan en publiceren
+ Opslaan en verzenden voor goedkeuring
+ voorbeeld bekijken
+ Voorbeeld bekijken is uitgeschakeld omdat er geen template is geselecteerd
+ Stijl kiezen
+ Stijlen tonen
+ Tabel invoegen
+
+
+ Om het documenttype voor de geselecteerde inhoud te wijzigen, selecteert u eerst uit de lijst van geldige types voor deze locatie.
+ Bevestig en/of wijzig vervolgens de toewijzing van eigenschappen van het huidige naar het nieuwe type en klik op Opslaan.
+ De inhoud is opnieuw gepubliceerd.
+ Huidige eigenschap
+ Huidig type
+ Het documenttype kan niet worden gewijzigd, omdat er geen alternatieven geldig zijn voor deze locatie.
+ Documenttype gewijzigd
+ Eigenschappen toewijzen
+ Toewijzen aan eigenschap
+ Nieuw sjabloon
+ Nieuw type
+ geen
+ Inhoud
+ Selecteer nieuw documenttype
+ Het documenttype van de geselecteerde inhoud is succesvol gewijzigd naar [new type] en de volgende eigenschappen zijn toegekend:
+ aan
+ Toewijzen van eigenschappen kan niet worden afgerond, omdat één of meer eigenschappen meer dan één toewijzing hebben.
+ Alleen alternatieve types geldig voor de huidige locatie worden weergegeven.
+
+
+ Is gepubliceerd
+ Over deze pagina
+ Alternatieve link
+ (hoe zou jij de foto beschrijven via de telefoon)
+ Alternatieve links
+ Klik om dit item te wijzigen
+ Aangemaakt door
+ Oorspronkelijke auteur
+ Bijgewerkt door
+ Aangemaakt op
+ Datum/tijd waarop dit document is aangemaakt
+ Documenttype
+ Aanpassen
+ Verloopt op
+ Dit item is gewijzigd na publicatie
+ Dit item is niet gepubliceerd
+ Laatst gepubliceerd op
+ Nog geen items om weer te geven.
+ Mediatype
+ Link naar media item(s)
+ Ledengroep
+ Rol
+ Ledentype
+ Geen datum gekozen
+ Pagina Titel
+ Eigenschappen
+ Dit document is gepubliceerd maar niet zichtbaar omdat de bovenliggende node '%0%' niet gepubliceerd is
+ Oeps: dit document is gepubliceerd, maar het is niet in de cache (interne serverfout)
+ Publiceren
+ Publicatiestatus
+ Publiceren op
+ Depubliceren op
+ Verwijderdatum
+ De sorteervolgorde is gewijzigd
+ Om nodes te sorteren, sleep de nodes of klik op één van de kolomtitels. Je kan meerdere nodes tegelijk selecteren door de "shift"- of "control"knop in te drukken tijdens het selecteren.
+ Statistieken
+ Titel (optioneel)
+ Alternatieve tekst (optioneel)
+ Type
+ Depubliceren
+ Laatst gewijzigd
+ Date/time this document was edited
+ Bestand(en) verwijderen
+ Link naar het document
+ Lid van groep(en)
+ Geen lid van groep(en)
+
+ Kinderen
+ Doel
+
+
+ Klik om te uploaden
+ Plaats je bestanden hier...
+
+
+ Waar wil je de nieuwe %0% aanmaken?
+ Aanmaken onder
+ Kies een type en een titel
+
+ "Documenttypes" strong>.]]>
+
+ "Mediatypes".]]>
+
+
+ Open je website
+ - Verbergen
+ Als Umbraco niet geopend wordt dan moet je misschien popups toelaten voor deze site.
+ is geopend in een nieuw venster
+ Herstarten
+ Bezoek
+ Welkom
+
+
+ Stay
+ Discard changes
+ You have unsaved changes
+ Are you sure you want to navigate away from this page? - you have unsaved changes
+
+
+ Done
+
+ Deleted %0% item
+ Deleted %0% items
+ Deleted %0% out of %1% item
+ Deleted %0% out of %1% items
+
+ Published %0% item
+ Published %0% items
+ Published %0% out of %1% item
+ Published %0% out of %1% items
+
+ Unpublished %0% item
+ Unpublished %0% items
+ Unpublished %0% out of %1% item
+ Unpublished %0% out of %1% items
+
+ Moved %0% item
+ Moved %0% items
+ Moved %0% out of %1% item
+ Moved %0% out of %1% items
+
+ Copied %0% item
+ Copied %0% items
+ Copied %0% out of %1% item
+ Copied %0% out of %1% items
+
+
+ Naam
+ Beheer domeinnamen
+ Sluit dit venster
+ Weet je zeker dat je dit wilt verwijderen
+ Weet je zeker dat je dit wilt uitschakelen
+ Vink aub dit keuzevak aan om het verwijderen van %0% item(s) te bevestigen
+ Weet je het zeker?
+ Weet je het zeker?
+ Knippen
+ Pas woordenboekitem aan
+ Taal aanpassen
+ Lokale link invoegen
+ Karakter invoegen
+ Voeg grafische titel in
+ Afbeelding invoegen
+ Link invoegen
+ Klik om een Macro toe te voegen
+ Tabel invoegen
+ Laatst aangepast op
+ Link
+ Interne link:
+ Plaats een hekje (“#”) voor voor interne links.
+ In nieuw venster openen?
+ Macro Settings
+ Deze macro heeft geen eigenschappen die u kunt bewerken
+ Plakken
+ Bewerk rechten voor
+ De items worden nu uit de prullenbak verwijderd. Sluit dit venster niet terwijl de actie nog niet voltooid is.
+ De prullenbak is nu leeg.
+ Als items worden verwijderd uit de prullenbak, zijn ze voorgoed verwijderd.
+ regexlib.com ondervindt momenteel prolemen waarover we geen controle hebben. Onze excuses voor het ongemak.]]>
+ Zoek naar een regular expressie om validatie aan een formulierveld toe te voegen. Voorbeeld: 'email, 'post-code' 'url'
+ Verwijder Macro
+ Verplicht veld
+ Site is opnieuw geïndexeerd
+ De site is opnieuw gepubliceerd
+ De cache zal worden vernieuwd. Alle gepubliceerde inhoud zal worden ge-update, terwijl ongepubliceerde inhoud ongepubliceerd zal blijven.
+ Aantal kolommen
+ Aantal regels
+ Plaats een placeholder id door een ID op uw placeholder te zetten kunt u inhoud plaatsen in deze template vanuit onderliggende templates,
+ door te referreren naar deze ID door gebruik te maken van een <asp:content /> element.]]>
+ Selecteer een placeholder id uit onderstaande lijst. U kunt alleen
+ Id's kiezen van de master van de huidige template..]]>
+ Klik op de afbeelding voor volledige grootte
+ Kies een item
+ Toon cache item
+
+
+
+ Cultuurnaam
+
+
+ Typ je gebruikersnaam
+ Typ je wachtwoord
+ Benoem de %0%...
+ Typ een naam...
+ Typ om te zoeken...
+ Typ om te filteren...
+ Typ om tags toe te voegen (druk op enter na elke tag)...
+
+
+
+ Toestaan op root-niveau
+ Wanneer aangevinkt dan mag dit document type aangemaakt worden op het root-niveau van content of media trees.
+ Toegelaten subnodetypes
+ Document Type Composities
+ Nieuw
+ Tab verwijderen
+ Omschrijving
+ Nieuwe tab
+ Tab
+ Miniatuur
+ Lijstweergave inschakelen
+ Stelt het content item in zodat een sorteer- en zoekbare lijstweergave van onderliggende nodes wordt getoond. De onderliggende nodes worden niet in de tree getoond
+ Huidige lijstweergave
+ De actieve data type in lijstweergave
+ Maak een aangepaste lijstweergave
+ Verwijder aangepaste lijstweergave
+
+
+ Prevalue toevoegen
+ Datebase datatype
+ Data Editor GUID
+ Render control
+ Buttons
+ Geavanceerde instellingen inschakelen voor
+ Context menu inschakelen
+ Maximum standaard grootte van afbeeldingen
+ Gerelateerde stylesheets
+ Toon label
+ Breedte en hoogte
+
+
+ Je data is opgeslagen, maar voordat je deze pagina kunt publiceren moet je eerst aan paar problemen herstellen:
+ Het wachtwoord veranderen wordt door de huidige Membership Provider niet ondersteund (EnablePasswordRetrieval moet op true staan)
+ %0% bestaat al
+ Er zijn fouten geconstateerd:
+ Er zijn fouten geconstateerd:
+ Het wachtwoord moet minstens %0% tekens lang zijn en moet minstens %1% cijfers bevatten
+ %0% moet een geheel getal zijn
+ %0% op tab %1% is een verplicht veld
+ %0% is een verplicht veld
+ %0% op tab %1% is niet in het correcte formaat
+ %0% is niet in het correcte formaat
+
+
+ Het opgegeven bestandstype is niet toegestaan door de beheerder
+ OPMERKING! Ondanks dat CodeMiror is ingeschakeld, is het uitgeschakeld in Internet Explorer omdat het niet stabiel genoeg is.
+ Zowel de alias als de naam van het nieuwe eigenschappen type moeten worden ingevuld!
+ Er is een probleem met de lees/schrijf rechten op een bestand of map
+ Vul een titel in
+ Selecteer een type
+ U wilt een afbeelding groter maken dan de originele afmetingen. Weet je zeker dat je wilt doorgaan?
+ Fout in python script
+ Het python script is niet opgeslagen omdat het fouten bevat
+ Start node is verwijderd, neem contact op met uw systeembeheerder
+ Markeer de inhoud voordat u de stijl aanpast
+ Geen actieve stijlen beschikbaar
+ Plaats de cursor links van de twee cellen die je wilt samenvoegen
+ Je kunt een cel die is samengevoegd niet delen
+ Fout in de XSLT bron
+ De XSLT is niet opgeslagen omdat deze fout(en) bevat
+ Er is een configuratiefout bij het gegevenstype dat wordt gebruikt voor deze eigenschap. Controleer het gegevenstype
+
+
+ Over
+ Actie
+ Acties
+ Toevoegen
+ Alias
+ Weet je het zeker?
+ Rand
+ of
+ Annuleren
+ Cel marge
+ Kiezen
+ Sluiten
+ Venster sluiten
+ Opmerking
+ Bevestigen
+ Verhouding behouden
+ Doorgaan
+ Kopiëren
+ Aanmaken
+ Databank
+ Datum
+ Standaard
+ Verwijderen
+ Verwijderd
+ Verwijderen...
+ Ontwerp
+ Afmetingen
+ Beneden
+ Download
+ Aanpassen
+ Aangepast
+ Elementen
+ E-mail
+ Fout
+ Zoeken
+ Hoogte
+ Help
+ Icoon
+ Importeren
+ Binnenmarge
+ Invoegen
+ Installeren
+ Uitvullen
+ Taal
+ Lay-out
+ Bezig met laden
+ Geblokkeerd
+ Inloggen
+ Afmelden
+ Afmelden
+ Macro
+ Verplaatsen
+ Meer
+ Naam
+ Nieuw
+ Volgende
+ Nee
+ van
+ Ok
+ Openen
+ of
+ Wachtwoord
+ Pad
+ Placeholder ID
+ Een ogenblik geduld a.u.b.
+ Vorige
+ Eigenschappen
+ E-mail om formulier te ontvangen
+ Prullenbak
+ Overgebleven
+ Hernoemen
+ Vernieuw
+ Verplicht
+ Opnieuw proberen
+ Rechten
+ Zoek
+ Server
+ Tonen
+ Toon pagina bij versturen
+ Formaat
+ Sorteren
+ Submit
+ Type
+ Type om te zoeken...
+ Omhoog
+ Bijwerken
+ Upgrade
+ Upload
+ Url
+ Gebruiker
+ Gebruikersnaam
+ Waarde
+ Toon
+ Welkom...
+ Breedte
+ Ja
+ Map
+ Reorder
+ I am done reordering
+
+ Zoekresultaten
+
+
+ Achtergrondkleur
+ Vet
+ Tekstkleur
+ Lettertype
+ Tekst
+
+
+ Pagina
+
+
+ De installer kan geen connectie met de database maken.
+ De web.config kon niet worden opgeslagen. Gelieve de connectiestring handmatig aan te passen.
+ Je database is gevonden en is geïdentificeerd als
+ Database configuratie
+ installeren om de Umbraco %0% database te installeren]]>
+ Volgende om door te gaan.]]>
+ De database kon niet gevonden worden! Gelieve na te kijken of de informatie in de "connection string" van het "web.config" bestand correct is. Om door te gaan, gelieve het "web.config" bestand aan te passen (met behulp van Visual Studio of je favoriete tekstverwerker), scroll in het bestand naar beneden, voeg de connection string voor je database toe in de key met naam "umbracoDbDSN" en sla het bestand op.
Klik op de knop opnieuw proberen als je hiermee klaar bent. Meer informatie over het aanpassen van de web.config vind je hier.
]]>
+ Gelieve contact op te nemen met je ISP indien nodig. Wanneer je installeert op een lokale computer of server, dan heb je waarschijnlijk informatie nodig van je systeembeheerder.]]>
+ Klik de upgrade knop om je database te upgraden naar Umbraco %0% Maak je geen zorgen - er zal geen inhoud worden gewist en alles blijft gewoon werken!
]]>
+ Klik Volgende om verder te gaan.]]>
+ volgende om door te gaan]]>
+ Het wachtwoord van de default gebruiker dient veranderd te worden!]]>
+ De default gebruiker is geblokkeerd of heeft geen toegang tot Umbraco!Geen verdere actie noodzakelijk. Klik Volgende om verder te gaan.]]>
+ Het wachtwoord van de default gebruiker is sinds installatie met succes veranderd.Geen verdere actie noodzakelijk. Klik Volgende om verder te gaan.]]>
+ Het wachtwoord is veranderd!
+ Umbraco maakt een default gebruiker aan met login ('admin') and wachtwoord ('default') . Het is belangrijk dat dit wachtwoord wordt veranderd in iets unieks. Deze stap controleert het password van de default gebruiker en adviseert of het veranderd dient te worden.
]]>
+ Neem een jumpstart en bekijk onze introductie videos
+
+ Nog niet geïnstalleerd.
+ Betreffende bestanden en mappen
+ Meer informatie over het instellen van machtigingen voor Umbraco vind je hier
+ Je dient ASP.NET 'modify' machtiging te geven voor de volgende bestanden/mappen
+ Je machtigingen zijn bijna perfect! Je kunt Umbraco zonder problemen starten, maar je kunt nog geen packages installeren om volledig van Umbraco te profiteren.]]>
+ Hoe op te lossen
+ Klik hier om de tekst versie te lezen
+ video tutorial over het instellen van machtigingen voor Umbraco, of lees de tekst versie.]]>
+ Je machtigingen zijn misschien incorrect! Je kunt Umbraco probleemloos starten, maar je kunt nog geen mappen aanmaken of packages installeren om zo volledig van Umbraco te profiteren.]]>
+ Je machtigingen zijn nog niet gereed gemaakt voor Umbraco! Om Umbraco te starten zul je je machtigingen moeten aanpassen.]]>
+ Je machtigingen zijn perfect! Je bent nu klaar om Umbraco te starten en om packages te installeren!]]>
+ Map probleem wordt opgelost
+ Volg deze link voor meer informatie over problemen met ASP.NET en het aanmaken van mappen
+ Machtigingen worden aangepast
+ Umbraco heeft write/modify toegang nodig op bepaalde mappen om bestanden zoals plaatjes en PDF's op te slaan. Het slaat ook tijdelijke data (ook bekend als 'de cache') op om de snelheid van je website te verbeteren.
+ Ik wil met een lege website beginnen
+ leer hoe). Je kunt er later alsnog voor kiezen om Runway te installeren. Ga dan naar de Ontwikkelaar sectie en kies Packages.]]>
+ Je hebt zojuist een blanco Umbraco platform geinstalleerd. Wat wil je nu doen?
+ Runway is geinstalleerd
+ Dit is onze lijst van aanbevolen modules. Vink de modules die je wilt installeren, of bekijk de volledige lijst modules ]]>
+ Alleen aanbevolen voor gevorderde gebruikers
+ Ik wil met een eenvoudige website beginnen
+ "Runway" is een eenvoudige website die je van enkele elementaire documenttypes en templates voorziet. De installer kan Runway automatisch voor je opzetten, maar je kunt het gemakkelijk aanpassen, uitbreiden of verwijderen. Het is niet vereist en je kunt Umbraco prima zonder Runway gebruiken.
+
+Echter, Runway biedt een gemakkelijke basis om je snel op weg te helpen. Als je er voor kiest om Runway te installeren, dan kun je optioneel de bouwstenen (genaamd Runway Modules) kiezen om je Runway pagina's te verbeteren. Runway omvat: Home pagina, Getting Started pagina, Module installatie pagina. Optionele Modules: Top Navigatie, Sitemap, Contact, Gallery.
+ ]]>
+ Wat is Runway
+ Stap 1/5: Licentie aanvaarden
+ Stap 2/5: Database configureren
+ Stap 3/5: Controleren van rechten op bestanden
+ Stap 4/5: Umbraco beveiliging controleren
+ Stap 5/5: Umbraco is klaar
+ Bedankt dat je voor Umbraco hebt gekozen
+ Browse je nieuwe site Je hebt Runway geinstalleerd, dus kijk eens hoe je nieuwe site eruit ziet.]]>
+ Meer hulp en informatie Vind hulp in onze bekroonde community, blader door de documentatie of bekijk enkele gratis videos over het bouwen van een eenvoudige site, het gebruiken van packages en een overzicht van Umbraco terminologie]]>
+ Umbraco %0% is geïnstalleerd en klaar voor gebruik.
+ /web.config bestand aanpassen, en de Appsetting key UmbracoConfigurationStatus onder in het bestand veranderen naar '%0%' .]]>
+ meteen beginnen door de "Launch Umbraco" knop hieronder te klikken. Als je een beginnende Umbraco gebruiker bent, dan kun je you can find veel informatie op onze "getting started" pagina's vinden.]]>
+ Launch Umbraco Om je website te beheren open je simpelweg de Umbraco back office en begin je inhoud toe te voegen, templates en stylesheets aan te passen of nieuwe functionaliteit toe te voegen]]>
+ Verbinding met de database mislukt.
+ Umbraco versie 3
+ Umbraco versie 4
+ Bekijken
+ Umbraco %0% voor een nieuwe installatie of een upgrade van versie 3.0. Druk op "volgende" om de wizard te starten.]]>
+
+
+ Cultuurcode
+ Cultuurnaam
+
+
+ Je bent inactief en zult automatisch worden uitgelogd over
+ Vernieuw je sessie om je wijzigingen te behouden
+
+
+ Goede zondag
+ Fijne maandag
+ Fijne dinsdag
+ Fijne woensdag
+ Fijne donderdag
+ Fijne vrijdag
+ Fijne zaterdag
+
+ log hieronder in
+ Sessie is verlopen
+
+ © 2001 - %0% umbraco.com ]]>
+
+
+ Dashboard
+ Secties
+ Inhoud
+
+
+ Selecteer pagina boven...
+ %0% is gekopieerd naar %1%
+ Kopieer naar
+ %0% is verplaatst naar %1%
+ Verplaats naar
+ is geselecteerd als root van je nieuwe pagina, klik hieronder op 'ok'.
+ Nog geen node geselecteerd, selecteer eerst een node in bovenstaade lijst voordat je op 'volgende' klikt
+ De huidige node is niet toegestaan onder de geselecteerde node vanwege het node type
+ De huidige node kan niet naar een van zijn subpagina’s worden verplaatst.
+ De huidige node kan niet worden gebruikt op root-niveau
+ Deze actie is niet toegestaan omdat je onvoldoende rechten hebt op 1 of meer kinderen.
+ Relateer gekopieerde items aan het origineel
+
+
+ Bewerk de notificatie voor %0%
+
+ Hi %0%
+
+ Dit is een geautomatiseerde mail om u op de hoogte te brengen dat de taak '%1%'
+ is uitgevoerd op pagina '%2%'
+ door gebruiker '%3%'
+
+
+
+
Update samenvatting:
+
+
+
+
+
+ Een prettige dag!
+ Dit is een bericht van uw Content Management Systeem.
+
+ ]]>
+ [%0%] Notificatie over %1% uitgevoerd op %2%
+ Notificaties
+
+
+ Kies een package op je computer door op "Bladeren" te klikken en de package te selecteren. Umbraco packages hebben meestal ".umb" of ".zip" als extensie.
+ Auteur
+ Demonstratie
+ Documentatie
+ Package meta data
+ Package naam
+ Package bevat geen inhoud
+
+ Je kunt dit package veilig verwijderen door 'verwijder package' te klikken.
+ ]]>
+ Geen upgrades beschikbaar
+ Package opties
+ Package lees mij
+ Package repository
+ Bevestig verwijderen
+ Package is verwijderd
+ De package is succesvol verwijderd
+ Verwijder package
+
+ Waarschuwing: alle documenten, media etc, die afhankelijk zijn van de items die je verwijderd, zullen niet meer werken en kan leiden tot een instabiele installatie,
+ wees dus voorzichtig met verwijderen. Als je niet zeker bent, neem dan contact op met de auteur van de package.
+ ]]>
+ Download update uit de repository
+ Upgrade package
+ Upgrade instructies
+ Er is een upgrade beschikbaar voor deze package. Je kunt het direct downloaden uit de Umbraco package repository.
+ Package versie
+ Package versiehistorie
+ Bekijk de package website
+
+
+ Plakken met alle opmaak (Niet aanbevolen)
+ De tekst die je probeert te plakken bevat speciale karakters en/of opmaak. Dit kan veroorzaakt worden doordat de tekst vanuit Microsoft Word is gekopieerd. Umbraco kan deze speciale karakters en formattering automatisch verwijderen zodat de geplakte tekst geschikt is voor het web.
+ Plakken als ruwe tekst en alle opmaak verwijderen
+ Plakken, en verwijder de opmaak (aanbevolen)
+
+
+ Geavanceerd: Beveilig door de Member Groups te seecteren die toegang hebben op de pagina
+ gebruik makend van Umbraco's member groups.]]>
+ role-based authentication.]]>
+ Error Pagina
+ Gebruikt om te tonen als een gebruiker is ingelogd, maar geen rechten heeft om de pagina te bekijken
+ Hoe wil je de pagina beveiligen?
+ %0% is nu beveiligd
+ Beveiliging verwijderd van %0%
+ Login Pagina
+ Kies de pagina met het login-formulier
+ Verwijder beveiliging
+ Kies de pagina's die het login-formulier en de error-berichten bevatten
+ Kies de roles wie toegang hebben tot deze pagina
+ Geef de gebruikersnaam en wachtwoord voor deze pagina
+ Eenvoudig: Beveilig door middel van gebruikersnaam en wachtwoord
+ Als je eenvoudige beveiliging wilt gebruiken met behulp van een enkele gebruikersnaam en wachtwoord
+
+
+
+
+
+
+
+ Inclusief ongepubliceerde kinderen
+ Publicatie in uitvoering - even geduld...
+ %0% van %1% pagina’s zijn gepubliceerd...
+ %0% is gepubliceerd
+ %0% en onderliggende pagina’s zijn gepubliceerd
+ Publiceer %0% en alle kinderen
+ ok om %0% te publiceren en de wijzigingen zichtbaar te maken voor bezoekers.
+ Je kunt deze pagina publiceren en alle onderliggende sub-pagina's door publiceer alle kinderen aan te vinken hieronder.
+ ]]>
+
+
+ Je hebt geen goedgekeurde kleuren geconfigureerd
+
+
+ Externe link toevoegen
+ Interne link toevoegen
+ Toevoegen
+ Bijschrift
+ Interne pagina
+ URL
+ Verplaats omlaag
+ Verplaats omhoog
+ Open in nieuw venster
+ Verwijder link
+
+
+ Reset
+
+
+ Huidige versie
+ Rode tekst wordt niet getoond in de geselecteerde versie , groen betekent toegevoegd ]]>
+ Document is teruggezet
+ Hiermee wordt de geselecteerde versie als html getoond, als u de verschillen tussen de 2 versies tegelijk wilt zien, gebruik dan de diff view
+ Terugzetten naar
+ Selecteer versie
+ Bekijk
+
+
+ Bewerk script-bestand
+
+
+ Concierge
+ Inhoud
+ Courier
+ Ontwikkelaar
+ Umbraco configuratiewizard
+ Media
+ Leden
+ Nieuwsbrieven
+ Instellingen
+ Statistieken
+ Vertaling
+ Gebruikers
+ Umbraco Contour
+
+ Help
+ Formulieren
+ Analytics
+
+
+ Standaard template
+ Woordenboek sleutel
+ Om een bestaand documenttype te importeren, zoek het betreffende “.udt” bestand door op browse en import te klikken. (Je ziet een bevestigingspagina voordat de import start. Als het documenttype al bestaat dan wordt het bijgewerkt.)
+ Nieuwe tabtitel
+ Node type
+ Type
+ Stylesheet
+ Script
+ Stylesheet eigenschap
+ Tab
+ Tab titel
+ Tabs
+ Basis inhoudstype ingeschakeld
+ Dit inhoudstype gebruikt
+ als basis inhoudstype. Tabs van basis inhoudstypes worden niet getoond en kunnen alleen worden aangepast op het basis inhoudstype zelf
+ Geen eigenschappen gedefinieerd op dit tabblad. Klik op de link "voeg een nieuwe eigenschap" aan de bovenkant om een nieuwe eigenschap te creëren.
+ Master Document Type
+ Maak een bijbehorend template
+
+
+ Sort order
+ Creation date
+ Sorteren gereed.
+ Sleep de pagina's omhoog of omlaag om de volgorde te veranderen. Of klik op de kolom-header om alle pagina's daarop te sorteren.
+ Sluit dit venster niet tijdens het sorteren]]>
+
+
+ Publicatie werd geannuleerd door een 3rd party plug-in
+ Eigenschappen type bestaat al
+ Eigenschappen type aangemaakt
+ Data type: %1%]]>
+ Eigenschappen type verwijderd
+ Inhoudstype opgeslagen
+ Tab aangemaakt
+ Tab verwijderd
+ Tab met id: %0% verwijderd
+ Stylesheet niet opgeslagen
+ Stylesheet opgeslagen
+ Stylesheet opgeslagen zonder fouten
+ Datatype opgeslagen
+ Woordenboek item opgeslagen
+ Publicatie is mislukt omdat de bovenliggende pagina niet gepubliceerd is
+ Inhoud gepubliceerd
+ en zichtbaar op de website
+ Inhoud opgeslagen
+ Vergeet niet te publiceren om de wijzigingen zichtbaar te maken
+ Verzend voor goedkeuring
+ Verandering zijn verstuurd voor goedkeuring
+ Media opgeslagen
+ Media opgeslagen zonder fouten
+ Lid opgeslagen
+ Stijlsheet eigenschap opgeslagen
+ Stijlsheet opgeslagen
+ Template opgeslagen
+ Fout bij opslaan gebruiker (zie logboek)
+ Gebruiker opgeslagen
+ Gebruikerstype opgeslagen
+ Bestand niet opgeslagen
+ bestand kon niet worden opgeslagen. Controleer de bestandsbeveiliging
+ Bestand opgeslagen
+ Bestand opgeslagen zonder fouten
+ Taal opgeslagen
+ Python script niet opgeslagen
+ Python script kon niet worden opgeslagen door een fout
+ Python script opeslagen!
+ Geen fouten in python script!
+ Template niet opgeslagen
+ Controleer dat je geen 2 tamplates met dezelfde naam hebt
+ Template opgeslagen
+ Template opgeslagen zonder fouten!
+ XSLT niet opgeslagen
+ XSLT bevat een fout
+ XSLT kon niet worden opgeslagen, controleer de bestandsbeveiliging
+ XSLT opgeslagen
+ Geen fouten in de XSLT!
+ Inhoud gedepubliceerd
+ Partial view opgeslagen
+ Partial view opgeslagen zonder fouten!
+ Partial view niet opgeslagen
+ Er is een fout opgetreden bij het opslaan van het bestand.
+
+
+ Gebruik CSS syntax bijv: h1, .redHeader, .blueTex
+ Stijlsheet aanpassen
+ Bewerk stylesheet eigenschap
+ Naam waarmee de stijl in de editor te kiezen is
+ Voorbeeld
+ Stijlen
+
+
+ Template aanpassen
+ Invoegen inhoudsgebied
+ Invoegen inhoudsgebied placeholder
+ Invoegen dictionary item
+ Invoegen Macro
+ Invoegen Umbraco page field
+ Basis sjabloon
+ Quick Guide voor Umbraco template tags
+ Sjabloon
+
+
+ Item toevoegen
+ Choose a layout
+ Een rij aan de lay-out toevoegen
+ teken onderaan en voeg je eerste item toe]]>
+ Drop content
+ Settings applied
+
+ This content is not allowed here
+ This content is allowed here
+
+ Klik om een item te embedden
+ Klik om een afbeelding in te voegen
+ Afbeelding ondertitel...
+ Typ hier......
+ Grid lay-outs
+ Lay-outs zijn het globale werkgebied voor de grid editor. Je hebt meestal maar één of twee verschillende lay-outs nodig
+ Een grid layout toevoegen
+ De lay-out aanpassen door de kolombreedte aan te passen en extra kolommen toe te voegen
+
+ Rijconfiguratie
+ Rijen zijn voorgedefinieerde cellen die horizontaal zijn gerangschikt
+ Een rijconfiguratie toevoegen
+ De rijconfiguratie aanpassen door de breedte van de cel in te stellen en extra cellen toe te voegen
+
+ Kolommen
+ Het totaal aantal gecombineerde kolommen in de grid layout
+
+ Instellingen
+ Configureren welke instellingen de editors kunnen aanpassen
+
+
+ Styles
+ Configureren welke stijlen de editors kunnen aanpassen
+
+ De instellingen worden enkel bewaard indien de ingevoerde Json geldig is
+
+ Alle editors toelaten
+ Alle rijconfiguraties toelaten
+
+
+ Alternatief veld
+ Alternatieve tekst
+ Kapitalisatie
+ Encoding
+ Selecteer veld
+ Converteer regelafbreking
+ ]]>
+ Aangepaste velden
+ Ja, alleen datum
+ Opmaken als datum
+ HTML-encoderen
+ Speciale karakters worden geëncodeerd naar HTML.
+ Zal worden ingevoegd na de veld waarde
+ Zal worden ingevoegd voor de veld waarde
+ Kleine letters
+ Geen
+ Invoegen na veld
+ Invoegen voor veld
+ Recursief
+ Verwijder paragraaf tags
+ tags aan het begin en einde van de tekst worden verwijderd]]>
+ Standaard velden
+ Hoofdletters
+ URL-encoderen
+ Speciale karakters in URL's worden geëncodeerd
+ Zal alleen worden gebruikt waneer de bovenstaande veld waardes leeg zijn
+ Dit veld zal alleen worden gebruikt als het primaire veld leeg is
+ Ja, met tijd. Scheidingsteken:
+
+
+ Taken aan jou toegewezen
+
+ Sluit taak
+ Details van vertaling
+ Download alle vertalingstaken als xml
+ Download xml
+ Download xml DTD
+ Velden
+ Inclusief onderliggende pagina's
+
+ [%0%] Vertaalopdracht voor %1%
+ Geen vertaal-gebruikers gevonden. Maak eerst een vertaal-gebruiker aan voordat je pagina's voor vertaling verstuurd
+ Taken aangemaakt door jou
+ die je aanmaakte. Om een detailweergave met opmerkingen te zien, klik op "Detail" of op de paginanaam. Je kan ook de pagina in XML-formaat downloaden door op de "Download XML"-link te klikken. Om een vertalingstaak te sluiten, klik je op de "Sluiten"-knop in detailweergave.]]>
+ De pagina '%0%' is verstuurd voor vertaling
+ Stuur voor vertaling
+ Toegewezen door
+ Taak geopend
+ Totaal aantal woorden
+ Vertaal naar
+ Vertaling voltooid.
+ Je kan een voorbeeld van vertaalde pagina's bekijken door hieronder te klikken. Als de originele pagina gevonden werd, wordt een vergelijking van beide pagina's getoond.
+ Vertalen niet gelukt, het XML-bestand is mogelijk beschadigd.
+ Vertalingsopties
+ Vertaler
+ Vertaald XML-document uploaden
+
+
+ Cachebrowser
+ Prullenbak
+ Gemaakte packages
+ Datatypes
+ Woordenboek
+ Geïnstalleerde packages
+ Installeer skin
+ Installeer starter kit
+ Talen
+ Installeer een lokale package
+ Macro's
+ Mediatypes
+ Leden
+ Ledengroepen
+ Rollen
+ Ledentypes
+ Documenttypes
+ Packages
+ Packages
+ Python-bestanden
+ Installeer uit repository
+ Installeer Runway
+ Runway modules
+ Script bestanden
+ Scripts
+ Stylesheets
+ Sjablonen
+ XSLT Bestanden
+
+
+ Nieuwe update beschikbaar
+ %0% is gereed, klik hier om te downloaden
+ Er is geen verbinding met de server
+ Er is een fout opgetreden bij het zoeken naar een update. Bekijk de trace-stack voor verdere informatie.
+
+
+ Beheerders
+ Categorieveld
+ Verander je wachtwoord
+ Wijzig je wachtwoord
+ Bevestig nieuw password
+ Je kunt je wachtwoord veranderen door onderstaan formulier in te vullen en op de knop 'Verander wachtwoord' te klikken
+ Inhoudskanaal
+ Omschrijving
+ Geblokkeerde gebruiker
+ Documenttype
+ Redacteur
+ Samenvattingsveld
+ Taal
+ Loginnaam
+ Startnode in Mediabibliotheek
+ Secties
+ Blokkeer Umbraco toegang
+ Wachtwoord
+ Reset wachtwoord
+ Je wachtwoord is veranderd!
+ Herhaal nieuwe wachtwoord
+ Voer nieuwe wachtwoord in
+ Je nieuwe wachtwoord mag niet leeg zijn!
+ Huidig wachtwoord
+ Ongeldig huidig wachtwoord
+ Beide wachtwoorden waren niet hetzelfde. Probeer opnieuw!
+ Beide wachtwoorden zijn niet hetzelfde!
+ Vervang rechten op de subnodes
+ U bent momenteel rechten aan het aanpassen voor volgende pagina's:
+ Selecteer pagina's om hun rechten aan te passen
+ Doorzoek alle subnodes
+ Startnode in Content
+ Gebruikersnaam
+ Gebruikersrechten
+ Gebruikerstype
+ Gebruikerstypes
+ Auteur
+ Wijzig
+
+ Je profiel
+ Je recente historie
+ Sessie verloopt over
+
+
diff --git a/OurUmbraco.Site/umbraco/config/lang/pt.xml b/OurUmbraco.Site/umbraco/config/lang/pt.xml
index f02415ef..e67a4c4b 100644
--- a/OurUmbraco.Site/umbraco/config/lang/pt.xml
+++ b/OurUmbraco.Site/umbraco/config/lang/pt.xml
@@ -1,908 +1,908 @@
-
-
-
- The Umbraco community
- http://our.umbraco.org/documentation/Extending-Umbraco/Language-Files
-
-
- Gerenciar hostnames
- Caminho de Auditoria
- Navegar o Nó
- Copiar
- Criar
- Criar Pacote
- Remover
- Desabilitar
- Esvaziar Lixeira
- Exportar Tipo de Documento
- Exportar para .NET
- Exportar para .NET
- Importar Tipo de Documento
- Importar Pacote
- Editar na Tela
- Sair
- Mover
- Notificações
- Acesso público
- Publicar
- Recarregar nós
- Republicar site inteiro
- Permissões
- Reversão
- Enviar para Publicação
- Enviar para Tradução
- Classificar
- Enviar para publicação
- Traduzir
- Atualizar
-
-
- Adicionar novo Domínio
- Domínio
- Novo domínio '%0%' foi criado
- Domínio '%0%' foi removido
- Domínio '%0%' já foi designado
- ou seja: seudominio.com, www.seudominio.com
- Domínio '%0%' foi atualizado
- Editar Domínios Atuais
-
-
- Visão para
-
-
- Negrito
- Remover Travessão de Parágrafo
- Inserir campo de formulário
- Inserir manchete de gráfico
- Editar Html
- Travessão de Parágrafo
- Itálico
- Centro
- Justificar à Esquerda
- Justificar à Direita
- Inserir Link
- Inserir link local (âncora)
- Lista de tópicos
- Lista numérica
- Inserir macro
- Inserir figura
- Editar relacionamentos
- Salvar
- Salvar e publicar
- Salvar e mandar para aprovação
- Prévia
- Escolha estilo
- Mostrar estilos
- Inserir tabela
-
-
- Sobre esta página
- Link alternativo
- (como você descreveria a imagem pelo telefone)
- Links Alternativos
- Clique para editar este item
- Criado por
- Criado
- Tipo de Documento
- Editando
- Remover em
- Este item foi alterado após a publicação
- Este item não está publicado
- Última publicação
- Tipo de Mídia
- Grupo do Membro
- Função
- Tipo de Membro
- Nenhuma data escolhida
- Título da Página
- Propriedades
- Este documento está publicado mas não está visível porque o pai '%0%' não está publicado
- Publicar
- Status da Publicação
- Publicado em
- Remover Data
- Ordem de classificação está atualizada
- Para classificar os nós simplesmente arraste os nós ou clique em um dos títulos de colunas. Você pode selecionar múltiplos nós ao pressionar e segurar 'shift' ou 'control' durante a seleção
- Estatísticas
- Título (opcional)
- Tipo
- Des-Publicar
- Última edição
- Remover arquivo
- Link ao documento
-
-
- Onde você quer criar seu novo(a) %0%
- Criado em
- Escolha um tipo e um título
-
-
- Navegue seu site
- - Esconder
- Se Umbraco não estiver abrindo talvez você precise hablitar pop-ups para este site
- foi aberto em uma nova janela
- Reiniciar
- Visitar
- Bem Vindo(a)
-
-
- Stay
- Discard changes
- You have unsaved changes
- Are you sure you want to navigate away from this page? - you have unsaved changes
-
-
- Done
-
- Deleted %0% item
- Deleted %0% items
- Deleted %0% out of %1% item
- Deleted %0% out of %1% items
-
- Published %0% item
- Published %0% items
- Published %0% out of %1% item
- Published %0% out of %1% items
-
- Unpublished %0% item
- Unpublished %0% items
- Unpublished %0% out of %1% item
- Unpublished %0% out of %1% items
-
- Moved %0% item
- Moved %0% items
- Moved %0% out of %1% item
- Moved %0% out of %1% items
-
- Copied %0% item
- Copied %0% items
- Copied %0% out of %1% item
- Copied %0% out of %1% items
-
-
- Nome
- Gerenciar hostnames
- Fechar esta janela
- Certeza em remover
- Certeza em desabilitar
- Favor selecionar esta caixa para confirmar a remoção de %0% item(s)
- Tem certeza
- Tem certeza?
- Cortar
- Editar Item de Dicionário
- Editar Linguagem
- Inserir link local
- Inserir charactere
- Inserir manchete de gráfico
- Inserir figura
- Inserir Link
- Inserir Macro
- Inserir tabela
- Última Edição
- Link
- Link interno:
- Ao usar links locais insira "#" na frente do link
- Abrir em nova janela?
- Configurações de Macro
- Este macro não contém nenhuma propriedade que possa ser editada
- Colar
- Editar Permissões para
- Os itens na lixeira agora estão sendo removidos. Favor não fechar esta janela enquanto este processo é concluído
- A lixeira agora está vazia
- Quando itens são removidos da lixeira estes somem para sempre
- regexlib.com está no momento sofrendo dificuldades dos quais não temos controle. Pedimos desculpas pela inconveniência.]]>
- Busque por uma expressão regular para adicionar validação à um campo de formulário. Exemplo: 'email', 'zip-code' (código postal), 'url'
- Remover Macro
- Campo obrigatório
- Site foi re-indexado
- O cache do website foi atualizado. Todo conteúdo publicado está atualizado agora. No entanto, todo conteúdo não publicado ainda permanecerá invisível
- O cache do website será atualizado. Todo conteúdo publicado será atualizado, enquanto o conteúdo que não foi publicado permanecerá invisível
- Número de colunas
- Número de linhas
- Defina uma id de espaço reservado definindo uma ID em seu espaço reservado você pode injetar conteúdo dentro deste modelo desde modelos filhos usando esta ID como referência dentro de um elemento <asp:content />]]>
- Selecione uma id de espaço reservado da lista abaixo. Você pode escolher somente as IDs em seu modelo mestre atual.]]>
- Clique para ver a imagem em seu tamanho original
- Escolha item
- Ver Item em Cache
-
-
- %0%' abaixo Você pode adicionar mais linguagens sob 'linguagens' no menu à esquerda]]>
- Nome da Cultura
-
-
- Tipos de nós filhos permitidos
- Criar
- Remover guia
- Descrição
- Nova guia
- Guia
- Miniatura
-
-
- Adicionar valor prévio
- Tipo de Dados do Banco de Dados
- GUID do Editor de Propriedades
- Editor de Propriedades
- Botões
- Habilitar configurações avançadas para
- Habilitar menu de contexto
- Tamanho padrão máximo para imagens inseridas
- Stylesheets relacionadas
- Mostrar Rótulo
- Largura e altura
-
-
- Seus dados foram salvos mas antes que possa publicar esta página existem alguns erros que precisam ser concertados:
- O provedor de membros (Membership provider) atual não suporta alterações de senha (EnablePasswordRetrieval tem que estar definica como true)
- %0% já existe
- Houve erros:
- Houve erros:
- A senha deve ter no mínimo %0% caracteres e conter pelo menos %1% caractere(s) não alfa-númérico
- %0% tem que ser um inteiro
- O campo %0% na guia %1% é mandatório
- %0% é um campo mandatório
- %0% em %1% não está no formato correto
- %0% não está em um formato correto
-
-
- NOTA! Mesmo que CodeMirror esteja habilitado pela configuração o mesmo foi desabilitado em Internet Explorer pois não é estável o suficiente.
- Favor preencher ambos apelidos e nome na sua nova propriedade de tipo!
- Houve um erro com o acesso de ler/escrever em um arquivo ou pasta específica
- Favor digitar um título
- Favor escolher um tipo
- Você está prestes a tornar esta figura maior que o tamanho original. Tem certeza que deseja proceguir?
- Erro no script python
- O script pyton não foi salvo por que contém erro(s)
- Nó inicial removido, favor entrar em contato com seu administrador
- Favor marcar conteúdo antes de alterar o estilo
- Nenhum estilo ativo disponível
- Favor colocar o cursos à esquerda das duas células que deseja mesclar
- Você não pode dividir uma célula que não foi mesclada.
- Erro na fonta XSLT
- O XSLT não foi salvo porque contém erro(s)
-
-
- Sobre
- Ação
- Adicionar
- Apelido
- Tem certeza?
- Borda
- por
- Cancelar
- Margem da célula
- Escolher
- Fechar
- Fechar Janela
- Comentário
- Confirmar
- Restrições de proporções
- Continuar
- Copiar
- Criar
- Banco de Dados
- Data
- Padrão
- Remover
- Removido
- Removendo...
- Desenho
- Dimensões
- Abaixo
- Download
- Editar
- Editado
- Elementos
- Email
- Erro
- Buscar
- Altura
- Ajuda
- Ícone
- Importar
- Margem interna
- Inserir
- Instalar
- Justificar
- Idioma
- Esboço
- Carregando
- Travado
- Login
- Sair
- Logout
- Macro
- Mover
- Nome
- Novo
- Próximo
- Não
- de
- OK
- Abrir
- ou
- Senha
- Caminho
- ID do Espaço Reservado
- Um momento por favor...
- Prévio
- Propriedades
- Email para receber dados do formulário
- Lixeira
- Remanescentes
- Renomear
- Renovar
- Tentar novamente
- Permissões
- Busca
- Servidor
- Mostrar
- Mostrar página durante envio
- Tamanho
- Classificar
- Submit
- Tipo
- Digite para buscar...
- Acima
- Atualizar
- Atualizar
- Subir (Upload)
- Url
- Usuário
- Usuário
- Valor
- Ver
- Bem Vindo(a)...
- Largura
- Sim
- Reorder
- I am done reordering
-
-
- Cor de fundo
- Negrito
- Cor do Texto
- Fonte
- Texto
-
-
- Página
-
-
- O instalador não pôde conectar-se ao banco de dados.
- Não foi possível salvar o arquivo web.config. Favor modificar a linha de conexão manualmente.
- Seu banco de dados foi encontrado e identificado como
- Configuração do Banco de Dados
- instalar para instalar o banco de dados do Umbraco %0%]]>
- Próximo para prosseguir.]]>
- Banco de dados não encontrado! Favor checar se a informação no "connection string" do "web.config" esteja correta.
-Para prosseguir, favor editar o arquivo "web.config" (usando Visual Studio ou seu editor de texto favorito), role até embaixo, adicione a connection string para seu banco de dados com a chave de nome "UmbracoDbDSN" e salve o arquivo
-Clique o botão tentar novamente quando terminar.
- Mais informações em como editar o web.config aqui.
]]>
- Favor contatar seu provedor de internet ou hospedagem web se necessário. Se você estiver instalando em uma máquina ou servidor local é possível que você precise dessas informações por um administrador de sistema.]]>
-
- Pressione o botão atualizar para atualizar seu banco de dados para Umbraco %0%
-
- Não se preocupe - nenhum conteúdo será removido e tudo estará funcionando depois disto!
-
- ]]>
- Pressione Próximo para prosseguir.]]>
- próximo para continuar com o assistente de configuração]]>
- A senha do usuário padrão precisa ser alterada!]]>
- O usuário padrão foi desabilitado ou não tem acesso à Umbraco!Nenhuma ação posterior precisa ser tomada. Clique Próximo para prosseguir.]]>
- A senha do usuário padrão foi alterada com sucesso desde a instalação!Nenhuma ação posterior é necessária. Clique Próximo para prosseguir.]]>
- Senha foi alterada!
-
- Umbraco cria um usuário padrão com o login ('admin') e senha ('default') . É importante que a senha seja alterada para algo único.
-
-
- Este passo irá checar a senha do usuário padrão e sugerir uma alteração se necessário.
-
-
- ]]>
- Comece com o pé direito, assista nossos vídeos introdutórios
- Ao clicar no próximo botão (ou modificando o UmbracoConfigurationStatus no web.config), você aceita a licença deste software cmo especificado na caixa abaixo. Note que esta distribuição de Umbraco consiste em duas licenças diferentes, a licença aberta MIT para a framework e a licença de software livre (freeware) Umbraco que cobre o UI.
- Nenhum instalado ainda.
- Pastas e arquivos afetados
- Mais informações em como configurar permissões para Umbraco aqui
- Você precisa conceder permissão de modificação ASP.NET aos seguintes arquivos/pastas
- Suas permissões estão quase perfeitas!
-Você pode correr Umbraco sem problemas, mas não vai ser capaz de instalar pacotes que são recomendados para tirar total vantagem de Umbraco.]]>
- Como Resolver
- Clique aqui para ler a versão texto
- vídeo tutorial sobre configuração de permissões de pastas para Umbraco ou leia a versão texto.]]>
- Suas permissões podem ser um problema!
-
-Você pode correr Umbraco sem problemas mas não será capaz de criar pastas ou instalar pacotes que são recomendados para tirar total vantagem de Umbraco.]]>
- Suas permissões não estão prontas para Umbraco!
-
-Para correr Umbraco você vai precisar atualizar as configurações de permissões.]]>
- Suas configurações de permissões estão perfeitas! Você está pronto para correr o Umbraco e instalar pacotes!]]>
- Resolvendo problemas de pastas
- Siga este link para mais informações sobre problemas com ASP.NET e criação de pastas
- Configurando permissões de pastas
-
- Eu quero começar do zero
- learn how)
- Você ainda pode escolher instalar Runway mais tarde. Favor ir à seção Desenvolvedor e selecione pacotes.]]>
- Você acabou de configurar uma plataforma Umbraco limpa. O que deseja fazer a seguir?
- Runway está instalado
-
-Esta é nossa lista de módulos recomendados, selecione os que gostaria de instalar, ou veja a lista completa de módulos ]]>
- Somente recomendado para usuários experientes
- Eu quero começar com um site simples
-
- "Runway" é um website simples que provê alguns documentos básicos e modelos. O instalador pode configurar Runway automaticamente mas você pode editar facilmente, extender ou removê-lo. Não é necessário e você pode perfeitamente usar Umbraco sem ele.
-No entanto, Runway oferece uma fundação básica sobre melhores práticas em como começar o mais rápido possível.
-Se escolher instalar Runway você pode opcionalmente selecionar blocos de construção básicos chamados módulos Runway para melhorar suas páginas Runway.
-
- Incluso com Runway: Página Inicial, Começando, Instalando Módulos.
- Módulos Opcionais: Navegação de Topo, Mapa de Site, Contato, Galeria.
-
-
- ]]>
- O que é Runway
- Passo 1/5 Aceitar Licença
- Passo 2/5: Configuração do Banco de Dados
- Passo 3/5: Validando Permissões de Arquivos
- Passo 4/5: Checar segurança Umbraco
- Passo 5/5: Umbraco está pronto para ser usado
- Obrigado por escolher Umbraco
- Navegue seu site
-Você instalou Runway, então por que não ver como é seu novo website.]]>
- Ajuda adicional e informações
-Consiga ajuda de nossa comunidade ganhadora de prêmios, navegue a documentação e assista alguns vídeos grátis sobre como construir um site simples, como usar pacotes e um guia prático sobre a terminologia Umbraco]]>
- Umbraco %0% está instalado e pronto para uso
- web.config e atualizar a chave AppSettings UmbracoConfigurationStatus no final para '%0%' .]]>
- iniciar instantâneamente clicando em "Lançar Umbraco" abaixo. Se você é novo com Umbraco você pode encontrar vários recursos em nossa página para iniciantes.]]>
- Lançar Umbraco
-Para gerenciar seu website, simplesmente abra a área administrativa do Umbraco para começar adicionando conteúdo, atualizando modelos e stylesheets e adicionando nova funcionalidade]]>
- Conexão ao banco falhou.
- Umbraco Versão 3
- Umbraco Versão 4
- Assistir
- Umbraco %0% para uma nova instalação ou atualizando desde verão 3.0.
-
-Pressione "próximo" para iniciar o assistente.]]>
-
-
- Código da Cultura
- Nome da Cultura
-
-
- Você está inativo e logout irá ocorrer automaticamente em
- Renovar agora para salvar seu trabalho
-
-
- © 2001 - %0% umbraco.com ]]>
- Bem vindo(a) à Umbraco, digite seu nome de usuário e senha nas caixas abaixo:
-
-
- Painel
- Seções
- Conteúdo
-
-
- Escolha página acima...
- %0% foi copiado para %1%
- Selecione onde o documento %0% deve ser copiado abaixo
- %0% foi movido para %1%
- Selecione onde o documento %0% dever ser movido abaixo
- foi selecionado como raíz do seu novo conteúdo, clique 'ok' abaixo.
- Nenhum nó selecionado, favor selecionar um nó na lista acima antes de clicar em 'ok'
- O nó atual não é permitido embaixo do nó escolhido por causa de seu tipo
- O nó atual não pode ser movido para uma de suas sub-páginas
- TRANSLATE ME: 'The action isn't allowed since you have insufficient permissions on 1 or more child documents.'
-
-
- Editar sua notificação para %0%
-
- Olá %0%
-
- Esta é uma mensagem automatizada para informar que a tarefa '%1%'
- foi completada na página '%2%'
- pelo usuário '%3%'
-
-
-
-
Resumo da Atualização:
-
-
-
-
-
- Tenha um bom dia!
- Saudações do robô Umbraco
-
- ]]>
- [%0%] Notificação sobre %1% realizada em %2%
- Notificações
-
-
- e localizando o pacote. Pacotes Umbraco tem extensão ".umb" ou ".zip".]]>
- Autor
- Demonstração
- Documentação
- Dado meta do pacote
- Nome do pacote
- Pacote não contém nenhum item
-
-Você pode remover com segurança do seu sistema clicando em "desinstalar pacote" abaixo.]]>
- Nenhuma atualização disponível
- Oções do pacote
- Leia-me do pacote
- Repositório do pacote
- Confirmar desinstalação
- Pacote foi desinstalado
- O pacote foi desinstalado com sucesso
- Desinstalar pacote
-
-Aviso: quaisquer documentos, mídia, etc dependentes dos itens que forem removidos vão parar de funcionar e podem levar à instabilidade do sistema. Então desinstale com cuidado. Se tiver dúvidas, contate o autor do pacote]]>
- Baixar atualização pelo repositório
- Atualizar pacote
- Instruções de atualização
- Há uma atualizaçào disponível para este pacote. Você pode baixá-lo diretamente do repositório de pacotes do Umbraco.
- Versão do pacote
- Ver website do pacote
-
-
- Colar com formatação completa (Não recomendado)
- O texto que você está tentando colar contém caracteres ou formatação especial. Isto pode ser causado ao copiar textos diretamente do Microsoft Word. Umbraco pode remover os caracteres ou formatação especial automaticamente para que o conteúdo colado seja mais adequado para a internet.
- Colar como texto crú sem nenhuma formatação
- Colar, mas remover formatação (Recomendado)
-
-
- Proteção baseada em função
- usando grupos de membros do Umbraco.]]>
- autenticação baseada em função.]]>
- Página de Erro
- Usado quando as pessoas estão logadas, mas não para ter acesso
- Escolha como restringir o acesso à esta página
- %0% agora está protegido
- Proteção removida de %0%
- Página de Login
- Escolha a página que tem o formulário de login
- Remover Proteção
- Selecione as páginas que contém o formulário de login e mensagens de erro
- Escolha as funções que terão acesso à esta página
- Defina o login e senha para esta página
- Proteção à um usuário específico
- Se você deseja configurar proteção simples usando somente um usuário e senha
-
-
- %0% não pode ser publicado devido à uma extensão de terceiros que cancelou a ação.
- Incluir páginas filhas ainda não publicadas
- Publicação em progresso - favor aguardar...
- %0% de %1% páginas foram publicadas...
- %0% foi publicada
- %0% e sub-páginas foram publicadas
- Publicar %0% e todoas suas sub-páginas
- ok para publicar %0% e assim fazer com que seu conteúdo se torne disponível.
-Você pode publicar esta página e todas suas sub-páginas ao selecionar publicar todos filhos abaixo.]]>
-
-
- Adicionar link externo
- Adicionar link interno
- Adicionar
- Legenda
- Página interna
- URL
- Mover Abaixo
- Mover Acima
- Abrir em nova janela
- Remover Link
-
-
- Versão atual
- Texto vermelho não será mostrado na versão selecionada; verde significa adicionado ]]>
- Documento foi revertido
- Isto mostra a versão selecionada como html se você deseja ver as diferenças entre as 2 versões ao mesmo tempo use a visão em diff
- Reverter à
- Selecione versão
- Ver
-
-
- Editar arquivo de script
-
-
- Porteiro
- Conteúdo
- Mensageiro
- Desenvolvedor
- Assistente de Configuração Umbraco
- Mídia
- Membros
- Boletins Informativos
- Configurações
- Estatísticas
- Tradução
- Usuários
-
-
- Modelo padrão
- Chave do Dicionário
- Para importar um tipo de documento encontre o arquivo ".udt" em seu computador clicando em "Navegar" e depois clicando em "Importar"(você pode confirmar na próxima tela)
- Novo Título da Guia
- Tipo de Nó
- Tipo
- Stylesheet
- Propriedade de Stylesheet
- Guia
- Título da Guia
- Guias
-
-
- Sort order
- Creation date
- Classificação concluída.
- Arraste os diferentes itens para cima ou para baixo para definir como os mesmos serão arranjados. Ou clique no título da coluna para classificar a coleção completa de itens
- Não feche esta janela durante a classificação]]>
-
-
- Publicação foi cancelada por add-in de terceiros
- Tipo de propriedade já existe
- Tipo de propriedade criada
- Tipo de Dado: %1%]]>
- Tipo de propriedade removido
- Tipo de Documento salvo
- Guia criada
- Guia removida
- Guia com ID: %0% removida
- Stylesheet não salva
- Stylesheet salva
- Stylesheet salva sem nenhum erro
- Typo de Dado salvo
- Item de Dicionário salvo
- Publicação falhou porque a página pai não está publicada
- Conteúdo publicado
- e visível no website
- Conteúdo salvo
- Lembre-se de publicar para tornar as mudanças visíveis
- Enviado para Aprovação
- Alterações foram enviadas para aprovação
- Membro salvo
- Propriedade de Stylesheet salva
- Stylesheet salva
- Modelo salvo
- Erro ao salvar usuário (verificar log)
- Usuário Salvo
- Arquivo não salvo
- Arquivo não pode ser salvo. Favor checar as permissões do arquivo
- Arquivo salvo
- Arquivo salvo sem nenhum erro
- Linguagem salva
- Script Python não salvo
- Script python não pode ser salvo devido à erro
- Script Python salvo
- Nenhum erro no script python
- Modelo não salvo
- Favor confirmar que não existem 2 modelos com o mesmo apelido
- Modelo salvo
- Modelo salvo sem nenhum erro!
- XSLT não salvo
- XSLT continha um erro
- XSLT não pode ser salvo, cheque as permissões do arquivo
- XSLT salvo
- Nenhum erro no XSLT
-
-
- Use sintaxe CSS ex: h1, .redHeader, .blueTex
- Editar stylesheet
- Editar propriedade do stylesheet
- Nome para identificar a propriedade de estilo no editor de texto rico (richtext)
- Prévia
- Estilos
-
-
- Editar modelo
- Inserir área de conteúdo
- Inserir área de conteúdo em espaço reservado
- Inserir item de dicionário
- Inserir Macro
- Inserir campo de página Umbraco
- Modelo mestre
- Guia rápido para etiquetas de modelos Umbraco
- Modelo
-
-
- Choose type of content
- Choose a layout
- Add a row
- Add content
- Drop content
- Settings applied
-
- This content is not allowed here
- This content is allowed here
-
- Click to embed
- Click to insert image
- Image caption...
- Write here...
-
- Grid Layouts
- Layouts are the overall work area for the grid editor, usually you only need one or two different layouts
- Add Grid Layout
- Adjust the layout by setting column widths and adding additional sections
- Row configurations
- Rows are predefined cells arranged horizontally
- Add row configuration
- Adjust the row by setting cell widths and adding additional cells
-
- Columns
- Total combined number of columns in the grid layout
-
- Settings
- Configure what settings editors can change
-
- Styles
- Configure what styling editors can change
-
- Settings will only save if the entered json configuration is valid
-
- Allow all editors
- Allow all row configurations
-
-
- Campo alternativo
- Texto alternativo
- Letra Maíscula ou minúscula
- Escolha campo
- Converter Quebra de Linhas
- Substitui quebra de linhas com a etiqueta html <br>
- Sim, Data somente
- Formatar como data
- Codificar HTML
- Vai substituir caracteres especiais por seus equivalentes em HTML.
- Será inserida após o valor do campo
- Será inserida antes do valor do campo
- Minúscula
- Nenhum
- Inserir após campo
- Inserir antes do campo
- Recursivo
- Remover etiquetas de parágrafo
- Removerá quaisquer <P> do começo ao fim do texto
- Maiúscula
- Codificar URL
- Vai formatar caracteres especiais em URLs
- Será usado somente quando os valores nos campos acima estiverem vazios
- Este campo somente será usado se o campo primário estiver em vazio
- Sim, com hora. Separador:
-
-
- Tarefas designadas à você
- designadas à você. Para ver os detalhes, incluinddo comentários, clique em "Detalhes" ou no nome da página.
-Você também pode baixar a página como XML ao clicar no link "Download XML".
-Para fechar a tarefa de tradução vá até os detalhes e clique no botão "Fechar".]]>
- fechar tarefa
- Detalhes da Tradução
- Download todas as tarefas de tradução como xml
- Download Xml
- Download Xml DTD
- Campos
- Incluir sub-páginas
-
- Tarefa de tradução [%0%] para %1%
- Nenhum usuário tradutor encontrado. Favor criar um usuário tradutor antes que possa começar a enviar conteúdo para tradução
- Tarefas criadas por você
- criadas por você. Para ver os detalhes, incluindo comentários, clique em "Detalhes" ou no nome da página. Você também pode baixar a página em XML ao clicar no link "Download XML".
-Para fechar a tarefa de tradução vá até os detalhes e clique no botão "Fechar".]]>
- A página '%0%' foi enviada para tradução
- Enviar página '%0%' para tradução
- Designada por
- Tarefa aberta
- Total de palavras
- Traduzir para
- Tradução concluída.
- Você pode visualizar as páginas que acaba de traduzir ao clicar abaixo. Se a página original for encontrada você poderá fazer a comparação entre as 2 páginas.
- Tradução falhou, o arquivo xml pode estar corrupto
- Opções de Tradução
- Tradutor
- Upload Xml de Tradução
-
-
- Navegador de Cache
- Lixeira
- Pacotes criados
- Tipo de Dado
- Dicionário
- Pacotes instalados
- Instalar tema
- Instalar kit de iniciante
- Linguagens
- Instalar pacote local
- Macros
- Tipos de Mídia
- Membros
- Grupos de Membros
- Funções
- Tipo de Membro
- Tipos de Documentos
- Pacotes
- Pacotes
- Arquivos Python
- Instalar desde o repositório
- Instalar Runway
- Módulos Runway
- Arquivos de Script
- Scripts
- Stylesheets
- Modelos
- Arquivos XSLT
-
-
- Nova atualização pronta
- %0% está pronto, clique aqui para download
- Nenhuma conexão ao servidor
- Erro ao procurar por atualização. Favor revisar os detalhes (stack-trace) para mais informações
-
-
- Administrador
- Campo de Categoria
- Alterar Sua Senha
- você pode alterar sua senha para acessar a área administrativa do Umbraco preenchendo o formulário abaixo e clicando no botão 'Alterar Senha'
- Canal de Conteúdo
- Campo de descrição
- Desabilitar Usuário
- Tipo de Documento
- Editor
- Campo de excerto
- Linguagem
- Login
- Nó Inicial na Biblioteca de Mídia
- Seções
- Desabilitar Acesso Umbraco
- Senha
- Sua senha foi alterada!
- Favor confirmar sua nova senha
- Digite sua nova senha
- Sua nova senha não pode estar em branco!
- Há uma diferença entre a nova senha e a confirmação da senha. Favor tentar novamente!
- A confirmação da senha não é igual à nova senha!
- Substituir permissões do nó filho
- Vocês está modificando permissões para as páginas no momento:
- Selecione páginas para modificar suas permissões
- Buscar todos filhos
- Nó Inicial do Conteúdo
- Nome de Usuário
- Permissões de usuário
- Tipo de usuário
- Tipos de usuários
- Escrevente
-
-
+
+
+
+ The Umbraco community
+ http://our.umbraco.org/documentation/Extending-Umbraco/Language-Files
+
+
+ Gerenciar hostnames
+ Caminho de Auditoria
+ Navegar o Nó
+ Copiar
+ Criar
+ Criar Pacote
+ Remover
+ Desabilitar
+ Esvaziar Lixeira
+ Exportar Tipo de Documento
+ Exportar para .NET
+ Exportar para .NET
+ Importar Tipo de Documento
+ Importar Pacote
+ Editar na Tela
+ Sair
+ Mover
+ Notificações
+ Acesso público
+ Publicar
+ Recarregar nós
+ Republicar site inteiro
+ Permissões
+ Reversão
+ Enviar para Publicação
+ Enviar para Tradução
+ Classificar
+ Enviar para publicação
+ Traduzir
+ Atualizar
+
+
+ Adicionar novo Domínio
+ Domínio
+ Novo domínio '%0%' foi criado
+ Domínio '%0%' foi removido
+ Domínio '%0%' já foi designado
+ ou seja: seudominio.com, www.seudominio.com
+ Domínio '%0%' foi atualizado
+ Editar Domínios Atuais
+
+
+ Visão para
+
+
+ Negrito
+ Remover Travessão de Parágrafo
+ Inserir campo de formulário
+ Inserir manchete de gráfico
+ Editar Html
+ Travessão de Parágrafo
+ Itálico
+ Centro
+ Justificar à Esquerda
+ Justificar à Direita
+ Inserir Link
+ Inserir link local (âncora)
+ Lista de tópicos
+ Lista numérica
+ Inserir macro
+ Inserir figura
+ Editar relacionamentos
+ Salvar
+ Salvar e publicar
+ Salvar e mandar para aprovação
+ Prévia
+ Escolha estilo
+ Mostrar estilos
+ Inserir tabela
+
+
+ Sobre esta página
+ Link alternativo
+ (como você descreveria a imagem pelo telefone)
+ Links Alternativos
+ Clique para editar este item
+ Criado por
+ Criado
+ Tipo de Documento
+ Editando
+ Remover em
+ Este item foi alterado após a publicação
+ Este item não está publicado
+ Última publicação
+ Tipo de Mídia
+ Grupo do Membro
+ Função
+ Tipo de Membro
+ Nenhuma data escolhida
+ Título da Página
+ Propriedades
+ Este documento está publicado mas não está visível porque o pai '%0%' não está publicado
+ Publicar
+ Status da Publicação
+ Publicado em
+ Remover Data
+ Ordem de classificação está atualizada
+ Para classificar os nós simplesmente arraste os nós ou clique em um dos títulos de colunas. Você pode selecionar múltiplos nós ao pressionar e segurar 'shift' ou 'control' durante a seleção
+ Estatísticas
+ Título (opcional)
+ Tipo
+ Des-Publicar
+ Última edição
+ Remover arquivo
+ Link ao documento
+
+
+ Onde você quer criar seu novo(a) %0%
+ Criado em
+ Escolha um tipo e um título
+
+
+ Navegue seu site
+ - Esconder
+ Se Umbraco não estiver abrindo talvez você precise hablitar pop-ups para este site
+ foi aberto em uma nova janela
+ Reiniciar
+ Visitar
+ Bem Vindo(a)
+
+
+ Stay
+ Discard changes
+ You have unsaved changes
+ Are you sure you want to navigate away from this page? - you have unsaved changes
+
+
+ Done
+
+ Deleted %0% item
+ Deleted %0% items
+ Deleted %0% out of %1% item
+ Deleted %0% out of %1% items
+
+ Published %0% item
+ Published %0% items
+ Published %0% out of %1% item
+ Published %0% out of %1% items
+
+ Unpublished %0% item
+ Unpublished %0% items
+ Unpublished %0% out of %1% item
+ Unpublished %0% out of %1% items
+
+ Moved %0% item
+ Moved %0% items
+ Moved %0% out of %1% item
+ Moved %0% out of %1% items
+
+ Copied %0% item
+ Copied %0% items
+ Copied %0% out of %1% item
+ Copied %0% out of %1% items
+
+
+ Nome
+ Gerenciar hostnames
+ Fechar esta janela
+ Certeza em remover
+ Certeza em desabilitar
+ Favor selecionar esta caixa para confirmar a remoção de %0% item(s)
+ Tem certeza
+ Tem certeza?
+ Cortar
+ Editar Item de Dicionário
+ Editar Linguagem
+ Inserir link local
+ Inserir charactere
+ Inserir manchete de gráfico
+ Inserir figura
+ Inserir Link
+ Inserir Macro
+ Inserir tabela
+ Última Edição
+ Link
+ Link interno:
+ Ao usar links locais insira "#" na frente do link
+ Abrir em nova janela?
+ Configurações de Macro
+ Este macro não contém nenhuma propriedade que possa ser editada
+ Colar
+ Editar Permissões para
+ Os itens na lixeira agora estão sendo removidos. Favor não fechar esta janela enquanto este processo é concluído
+ A lixeira agora está vazia
+ Quando itens são removidos da lixeira estes somem para sempre
+ regexlib.com está no momento sofrendo dificuldades dos quais não temos controle. Pedimos desculpas pela inconveniência.]]>
+ Busque por uma expressão regular para adicionar validação à um campo de formulário. Exemplo: 'email', 'zip-code' (código postal), 'url'
+ Remover Macro
+ Campo obrigatório
+ Site foi re-indexado
+ O cache do website foi atualizado. Todo conteúdo publicado está atualizado agora. No entanto, todo conteúdo não publicado ainda permanecerá invisível
+ O cache do website será atualizado. Todo conteúdo publicado será atualizado, enquanto o conteúdo que não foi publicado permanecerá invisível
+ Número de colunas
+ Número de linhas
+ Defina uma id de espaço reservado definindo uma ID em seu espaço reservado você pode injetar conteúdo dentro deste modelo desde modelos filhos usando esta ID como referência dentro de um elemento <asp:content />]]>
+ Selecione uma id de espaço reservado da lista abaixo. Você pode escolher somente as IDs em seu modelo mestre atual.]]>
+ Clique para ver a imagem em seu tamanho original
+ Escolha item
+ Ver Item em Cache
+
+
+ %0%' abaixo Você pode adicionar mais linguagens sob 'linguagens' no menu à esquerda]]>
+ Nome da Cultura
+
+
+ Tipos de nós filhos permitidos
+ Criar
+ Remover guia
+ Descrição
+ Nova guia
+ Guia
+ Miniatura
+
+
+ Adicionar valor prévio
+ Tipo de Dados do Banco de Dados
+ GUID do Editor de Propriedades
+ Editor de Propriedades
+ Botões
+ Habilitar configurações avançadas para
+ Habilitar menu de contexto
+ Tamanho padrão máximo para imagens inseridas
+ Stylesheets relacionadas
+ Mostrar Rótulo
+ Largura e altura
+
+
+ Seus dados foram salvos mas antes que possa publicar esta página existem alguns erros que precisam ser concertados:
+ O provedor de membros (Membership provider) atual não suporta alterações de senha (EnablePasswordRetrieval tem que estar definica como true)
+ %0% já existe
+ Houve erros:
+ Houve erros:
+ A senha deve ter no mínimo %0% caracteres e conter pelo menos %1% caractere(s) não alfa-númérico
+ %0% tem que ser um inteiro
+ O campo %0% na guia %1% é mandatório
+ %0% é um campo mandatório
+ %0% em %1% não está no formato correto
+ %0% não está em um formato correto
+
+
+ NOTA! Mesmo que CodeMirror esteja habilitado pela configuração o mesmo foi desabilitado em Internet Explorer pois não é estável o suficiente.
+ Favor preencher ambos apelidos e nome na sua nova propriedade de tipo!
+ Houve um erro com o acesso de ler/escrever em um arquivo ou pasta específica
+ Favor digitar um título
+ Favor escolher um tipo
+ Você está prestes a tornar esta figura maior que o tamanho original. Tem certeza que deseja proceguir?
+ Erro no script python
+ O script pyton não foi salvo por que contém erro(s)
+ Nó inicial removido, favor entrar em contato com seu administrador
+ Favor marcar conteúdo antes de alterar o estilo
+ Nenhum estilo ativo disponível
+ Favor colocar o cursos à esquerda das duas células que deseja mesclar
+ Você não pode dividir uma célula que não foi mesclada.
+ Erro na fonta XSLT
+ O XSLT não foi salvo porque contém erro(s)
+
+
+ Sobre
+ Ação
+ Adicionar
+ Apelido
+ Tem certeza?
+ Borda
+ por
+ Cancelar
+ Margem da célula
+ Escolher
+ Fechar
+ Fechar Janela
+ Comentário
+ Confirmar
+ Restrições de proporções
+ Continuar
+ Copiar
+ Criar
+ Banco de Dados
+ Data
+ Padrão
+ Remover
+ Removido
+ Removendo...
+ Desenho
+ Dimensões
+ Abaixo
+ Download
+ Editar
+ Editado
+ Elementos
+ Email
+ Erro
+ Buscar
+ Altura
+ Ajuda
+ Ícone
+ Importar
+ Margem interna
+ Inserir
+ Instalar
+ Justificar
+ Idioma
+ Esboço
+ Carregando
+ Travado
+ Login
+ Sair
+ Logout
+ Macro
+ Mover
+ Nome
+ Novo
+ Próximo
+ Não
+ de
+ OK
+ Abrir
+ ou
+ Senha
+ Caminho
+ ID do Espaço Reservado
+ Um momento por favor...
+ Prévio
+ Propriedades
+ Email para receber dados do formulário
+ Lixeira
+ Remanescentes
+ Renomear
+ Renovar
+ Tentar novamente
+ Permissões
+ Busca
+ Servidor
+ Mostrar
+ Mostrar página durante envio
+ Tamanho
+ Classificar
+ Submit
+ Tipo
+ Digite para buscar...
+ Acima
+ Atualizar
+ Atualizar
+ Subir (Upload)
+ Url
+ Usuário
+ Usuário
+ Valor
+ Ver
+ Bem Vindo(a)...
+ Largura
+ Sim
+ Reorder
+ I am done reordering
+
+
+ Cor de fundo
+ Negrito
+ Cor do Texto
+ Fonte
+ Texto
+
+
+ Página
+
+
+ O instalador não pôde conectar-se ao banco de dados.
+ Não foi possível salvar o arquivo web.config. Favor modificar a linha de conexão manualmente.
+ Seu banco de dados foi encontrado e identificado como
+ Configuração do Banco de Dados
+ instalar para instalar o banco de dados do Umbraco %0%]]>
+ Próximo para prosseguir.]]>
+ Banco de dados não encontrado! Favor checar se a informação no "connection string" do "web.config" esteja correta.
+Para prosseguir, favor editar o arquivo "web.config" (usando Visual Studio ou seu editor de texto favorito), role até embaixo, adicione a connection string para seu banco de dados com a chave de nome "UmbracoDbDSN" e salve o arquivo
+Clique o botão tentar novamente quando terminar.
+ Mais informações em como editar o web.config aqui.
]]>
+ Favor contatar seu provedor de internet ou hospedagem web se necessário. Se você estiver instalando em uma máquina ou servidor local é possível que você precise dessas informações por um administrador de sistema.]]>
+
+ Pressione o botão atualizar para atualizar seu banco de dados para Umbraco %0%
+
+ Não se preocupe - nenhum conteúdo será removido e tudo estará funcionando depois disto!
+
+ ]]>
+ Pressione Próximo para prosseguir.]]>
+ próximo para continuar com o assistente de configuração]]>
+ A senha do usuário padrão precisa ser alterada!]]>
+ O usuário padrão foi desabilitado ou não tem acesso à Umbraco!Nenhuma ação posterior precisa ser tomada. Clique Próximo para prosseguir.]]>
+ A senha do usuário padrão foi alterada com sucesso desde a instalação!Nenhuma ação posterior é necessária. Clique Próximo para prosseguir.]]>
+ Senha foi alterada!
+
+ Umbraco cria um usuário padrão com o login ('admin') e senha ('default') . É importante que a senha seja alterada para algo único.
+
+
+ Este passo irá checar a senha do usuário padrão e sugerir uma alteração se necessário.
+
+
+ ]]>
+ Comece com o pé direito, assista nossos vídeos introdutórios
+ Ao clicar no próximo botão (ou modificando o UmbracoConfigurationStatus no web.config), você aceita a licença deste software cmo especificado na caixa abaixo. Note que esta distribuição de Umbraco consiste em duas licenças diferentes, a licença aberta MIT para a framework e a licença de software livre (freeware) Umbraco que cobre o UI.
+ Nenhum instalado ainda.
+ Pastas e arquivos afetados
+ Mais informações em como configurar permissões para Umbraco aqui
+ Você precisa conceder permissão de modificação ASP.NET aos seguintes arquivos/pastas
+ Suas permissões estão quase perfeitas!
+Você pode correr Umbraco sem problemas, mas não vai ser capaz de instalar pacotes que são recomendados para tirar total vantagem de Umbraco.]]>
+ Como Resolver
+ Clique aqui para ler a versão texto
+ vídeo tutorial sobre configuração de permissões de pastas para Umbraco ou leia a versão texto.]]>
+ Suas permissões podem ser um problema!
+
+Você pode correr Umbraco sem problemas mas não será capaz de criar pastas ou instalar pacotes que são recomendados para tirar total vantagem de Umbraco.]]>
+ Suas permissões não estão prontas para Umbraco!
+
+Para correr Umbraco você vai precisar atualizar as configurações de permissões.]]>
+ Suas configurações de permissões estão perfeitas! Você está pronto para correr o Umbraco e instalar pacotes!]]>
+ Resolvendo problemas de pastas
+ Siga este link para mais informações sobre problemas com ASP.NET e criação de pastas
+ Configurando permissões de pastas
+
+ Eu quero começar do zero
+ learn how)
+ Você ainda pode escolher instalar Runway mais tarde. Favor ir à seção Desenvolvedor e selecione pacotes.]]>
+ Você acabou de configurar uma plataforma Umbraco limpa. O que deseja fazer a seguir?
+ Runway está instalado
+
+Esta é nossa lista de módulos recomendados, selecione os que gostaria de instalar, ou veja a lista completa de módulos ]]>
+ Somente recomendado para usuários experientes
+ Eu quero começar com um site simples
+
+ "Runway" é um website simples que provê alguns documentos básicos e modelos. O instalador pode configurar Runway automaticamente mas você pode editar facilmente, extender ou removê-lo. Não é necessário e você pode perfeitamente usar Umbraco sem ele.
+No entanto, Runway oferece uma fundação básica sobre melhores práticas em como começar o mais rápido possível.
+Se escolher instalar Runway você pode opcionalmente selecionar blocos de construção básicos chamados módulos Runway para melhorar suas páginas Runway.
+
+ Incluso com Runway: Página Inicial, Começando, Instalando Módulos.
+ Módulos Opcionais: Navegação de Topo, Mapa de Site, Contato, Galeria.
+
+
+ ]]>
+ O que é Runway
+ Passo 1/5 Aceitar Licença
+ Passo 2/5: Configuração do Banco de Dados
+ Passo 3/5: Validando Permissões de Arquivos
+ Passo 4/5: Checar segurança Umbraco
+ Passo 5/5: Umbraco está pronto para ser usado
+ Obrigado por escolher Umbraco
+ Navegue seu site
+Você instalou Runway, então por que não ver como é seu novo website.]]>
+ Ajuda adicional e informações
+Consiga ajuda de nossa comunidade ganhadora de prêmios, navegue a documentação e assista alguns vídeos grátis sobre como construir um site simples, como usar pacotes e um guia prático sobre a terminologia Umbraco]]>
+ Umbraco %0% está instalado e pronto para uso
+ web.config e atualizar a chave AppSettings UmbracoConfigurationStatus no final para '%0%' .]]>
+ iniciar instantâneamente clicando em "Lançar Umbraco" abaixo. Se você é novo com Umbraco você pode encontrar vários recursos em nossa página para iniciantes.]]>
+ Lançar Umbraco
+Para gerenciar seu website, simplesmente abra a área administrativa do Umbraco para começar adicionando conteúdo, atualizando modelos e stylesheets e adicionando nova funcionalidade]]>
+ Conexão ao banco falhou.
+ Umbraco Versão 3
+ Umbraco Versão 4
+ Assistir
+ Umbraco %0% para uma nova instalação ou atualizando desde verão 3.0.
+
+Pressione "próximo" para iniciar o assistente.]]>
+
+
+ Código da Cultura
+ Nome da Cultura
+
+
+ Você está inativo e logout irá ocorrer automaticamente em
+ Renovar agora para salvar seu trabalho
+
+
+ © 2001 - %0% umbraco.com ]]>
+ Bem vindo(a) à Umbraco, digite seu nome de usuário e senha nas caixas abaixo:
+
+
+ Painel
+ Seções
+ Conteúdo
+
+
+ Escolha página acima...
+ %0% foi copiado para %1%
+ Selecione onde o documento %0% deve ser copiado abaixo
+ %0% foi movido para %1%
+ Selecione onde o documento %0% dever ser movido abaixo
+ foi selecionado como raíz do seu novo conteúdo, clique 'ok' abaixo.
+ Nenhum nó selecionado, favor selecionar um nó na lista acima antes de clicar em 'ok'
+ O nó atual não é permitido embaixo do nó escolhido por causa de seu tipo
+ O nó atual não pode ser movido para uma de suas sub-páginas
+ TRANSLATE ME: 'The action isn't allowed since you have insufficient permissions on 1 or more child documents.'
+
+
+ Editar sua notificação para %0%
+
+ Olá %0%
+
+ Esta é uma mensagem automatizada para informar que a tarefa '%1%'
+ foi completada na página '%2%'
+ pelo usuário '%3%'
+
+
+
+
Resumo da Atualização:
+
+
+
+
+
+ Tenha um bom dia!
+ Saudações do robô Umbraco
+
+ ]]>
+ [%0%] Notificação sobre %1% realizada em %2%
+ Notificações
+
+
+ e localizando o pacote. Pacotes Umbraco tem extensão ".umb" ou ".zip".]]>
+ Autor
+ Demonstração
+ Documentação
+ Dado meta do pacote
+ Nome do pacote
+ Pacote não contém nenhum item
+
+Você pode remover com segurança do seu sistema clicando em "desinstalar pacote" abaixo.]]>
+ Nenhuma atualização disponível
+ Oções do pacote
+ Leia-me do pacote
+ Repositório do pacote
+ Confirmar desinstalação
+ Pacote foi desinstalado
+ O pacote foi desinstalado com sucesso
+ Desinstalar pacote
+
+Aviso: quaisquer documentos, mídia, etc dependentes dos itens que forem removidos vão parar de funcionar e podem levar à instabilidade do sistema. Então desinstale com cuidado. Se tiver dúvidas, contate o autor do pacote]]>
+ Baixar atualização pelo repositório
+ Atualizar pacote
+ Instruções de atualização
+ Há uma atualizaçào disponível para este pacote. Você pode baixá-lo diretamente do repositório de pacotes do Umbraco.
+ Versão do pacote
+ Ver website do pacote
+
+
+ Colar com formatação completa (Não recomendado)
+ O texto que você está tentando colar contém caracteres ou formatação especial. Isto pode ser causado ao copiar textos diretamente do Microsoft Word. Umbraco pode remover os caracteres ou formatação especial automaticamente para que o conteúdo colado seja mais adequado para a internet.
+ Colar como texto crú sem nenhuma formatação
+ Colar, mas remover formatação (Recomendado)
+
+
+ Proteção baseada em função
+ usando grupos de membros do Umbraco.]]>
+ autenticação baseada em função.]]>
+ Página de Erro
+ Usado quando as pessoas estão logadas, mas não para ter acesso
+ Escolha como restringir o acesso à esta página
+ %0% agora está protegido
+ Proteção removida de %0%
+ Página de Login
+ Escolha a página que tem o formulário de login
+ Remover Proteção
+ Selecione as páginas que contém o formulário de login e mensagens de erro
+ Escolha as funções que terão acesso à esta página
+ Defina o login e senha para esta página
+ Proteção à um usuário específico
+ Se você deseja configurar proteção simples usando somente um usuário e senha
+
+
+ %0% não pode ser publicado devido à uma extensão de terceiros que cancelou a ação.
+ Incluir páginas filhas ainda não publicadas
+ Publicação em progresso - favor aguardar...
+ %0% de %1% páginas foram publicadas...
+ %0% foi publicada
+ %0% e sub-páginas foram publicadas
+ Publicar %0% e todoas suas sub-páginas
+ ok para publicar %0% e assim fazer com que seu conteúdo se torne disponível.
+Você pode publicar esta página e todas suas sub-páginas ao selecionar publicar todos filhos abaixo.]]>
+
+
+ Adicionar link externo
+ Adicionar link interno
+ Adicionar
+ Legenda
+ Página interna
+ URL
+ Mover Abaixo
+ Mover Acima
+ Abrir em nova janela
+ Remover Link
+
+
+ Versão atual
+ Texto vermelho não será mostrado na versão selecionada; verde significa adicionado ]]>
+ Documento foi revertido
+ Isto mostra a versão selecionada como html se você deseja ver as diferenças entre as 2 versões ao mesmo tempo use a visão em diff
+ Reverter à
+ Selecione versão
+ Ver
+
+
+ Editar arquivo de script
+
+
+ Porteiro
+ Conteúdo
+ Mensageiro
+ Desenvolvedor
+ Assistente de Configuração Umbraco
+ Mídia
+ Membros
+ Boletins Informativos
+ Configurações
+ Estatísticas
+ Tradução
+ Usuários
+
+
+ Modelo padrão
+ Chave do Dicionário
+ Para importar um tipo de documento encontre o arquivo ".udt" em seu computador clicando em "Navegar" e depois clicando em "Importar"(você pode confirmar na próxima tela)
+ Novo Título da Guia
+ Tipo de Nó
+ Tipo
+ Stylesheet
+ Propriedade de Stylesheet
+ Guia
+ Título da Guia
+ Guias
+
+
+ Sort order
+ Creation date
+ Classificação concluída.
+ Arraste os diferentes itens para cima ou para baixo para definir como os mesmos serão arranjados. Ou clique no título da coluna para classificar a coleção completa de itens
+ Não feche esta janela durante a classificação]]>
+
+
+ Publicação foi cancelada por add-in de terceiros
+ Tipo de propriedade já existe
+ Tipo de propriedade criada
+ Tipo de Dado: %1%]]>
+ Tipo de propriedade removido
+ Tipo de Documento salvo
+ Guia criada
+ Guia removida
+ Guia com ID: %0% removida
+ Stylesheet não salva
+ Stylesheet salva
+ Stylesheet salva sem nenhum erro
+ Typo de Dado salvo
+ Item de Dicionário salvo
+ Publicação falhou porque a página pai não está publicada
+ Conteúdo publicado
+ e visível no website
+ Conteúdo salvo
+ Lembre-se de publicar para tornar as mudanças visíveis
+ Enviado para Aprovação
+ Alterações foram enviadas para aprovação
+ Membro salvo
+ Propriedade de Stylesheet salva
+ Stylesheet salva
+ Modelo salvo
+ Erro ao salvar usuário (verificar log)
+ Usuário Salvo
+ Arquivo não salvo
+ Arquivo não pode ser salvo. Favor checar as permissões do arquivo
+ Arquivo salvo
+ Arquivo salvo sem nenhum erro
+ Linguagem salva
+ Script Python não salvo
+ Script python não pode ser salvo devido à erro
+ Script Python salvo
+ Nenhum erro no script python
+ Modelo não salvo
+ Favor confirmar que não existem 2 modelos com o mesmo apelido
+ Modelo salvo
+ Modelo salvo sem nenhum erro!
+ XSLT não salvo
+ XSLT continha um erro
+ XSLT não pode ser salvo, cheque as permissões do arquivo
+ XSLT salvo
+ Nenhum erro no XSLT
+
+
+ Use sintaxe CSS ex: h1, .redHeader, .blueTex
+ Editar stylesheet
+ Editar propriedade do stylesheet
+ Nome para identificar a propriedade de estilo no editor de texto rico (richtext)
+ Prévia
+ Estilos
+
+
+ Editar modelo
+ Inserir área de conteúdo
+ Inserir área de conteúdo em espaço reservado
+ Inserir item de dicionário
+ Inserir Macro
+ Inserir campo de página Umbraco
+ Modelo mestre
+ Guia rápido para etiquetas de modelos Umbraco
+ Modelo
+
+
+ Choose type of content
+ Choose a layout
+ Add a row
+ Add content
+ Drop content
+ Settings applied
+
+ This content is not allowed here
+ This content is allowed here
+
+ Click to embed
+ Click to insert image
+ Image caption...
+ Write here...
+
+ Grid Layouts
+ Layouts are the overall work area for the grid editor, usually you only need one or two different layouts
+ Add Grid Layout
+ Adjust the layout by setting column widths and adding additional sections
+ Row configurations
+ Rows are predefined cells arranged horizontally
+ Add row configuration
+ Adjust the row by setting cell widths and adding additional cells
+
+ Columns
+ Total combined number of columns in the grid layout
+
+ Settings
+ Configure what settings editors can change
+
+ Styles
+ Configure what styling editors can change
+
+ Settings will only save if the entered json configuration is valid
+
+ Allow all editors
+ Allow all row configurations
+
+
+ Campo alternativo
+ Texto alternativo
+ Letra Maíscula ou minúscula
+ Escolha campo
+ Converter Quebra de Linhas
+ Substitui quebra de linhas com a etiqueta html <br>
+ Sim, Data somente
+ Formatar como data
+ Codificar HTML
+ Vai substituir caracteres especiais por seus equivalentes em HTML.
+ Será inserida após o valor do campo
+ Será inserida antes do valor do campo
+ Minúscula
+ Nenhum
+ Inserir após campo
+ Inserir antes do campo
+ Recursivo
+ Remover etiquetas de parágrafo
+ Removerá quaisquer <P> do começo ao fim do texto
+ Maiúscula
+ Codificar URL
+ Vai formatar caracteres especiais em URLs
+ Será usado somente quando os valores nos campos acima estiverem vazios
+ Este campo somente será usado se o campo primário estiver em vazio
+ Sim, com hora. Separador:
+
+
+ Tarefas designadas à você
+ designadas à você. Para ver os detalhes, incluinddo comentários, clique em "Detalhes" ou no nome da página.
+Você também pode baixar a página como XML ao clicar no link "Download XML".
+Para fechar a tarefa de tradução vá até os detalhes e clique no botão "Fechar".]]>
+ fechar tarefa
+ Detalhes da Tradução
+ Download todas as tarefas de tradução como xml
+ Download Xml
+ Download Xml DTD
+ Campos
+ Incluir sub-páginas
+
+ Tarefa de tradução [%0%] para %1%
+ Nenhum usuário tradutor encontrado. Favor criar um usuário tradutor antes que possa começar a enviar conteúdo para tradução
+ Tarefas criadas por você
+ criadas por você. Para ver os detalhes, incluindo comentários, clique em "Detalhes" ou no nome da página. Você também pode baixar a página em XML ao clicar no link "Download XML".
+Para fechar a tarefa de tradução vá até os detalhes e clique no botão "Fechar".]]>
+ A página '%0%' foi enviada para tradução
+ Enviar página '%0%' para tradução
+ Designada por
+ Tarefa aberta
+ Total de palavras
+ Traduzir para
+ Tradução concluída.
+ Você pode visualizar as páginas que acaba de traduzir ao clicar abaixo. Se a página original for encontrada você poderá fazer a comparação entre as 2 páginas.
+ Tradução falhou, o arquivo xml pode estar corrupto
+ Opções de Tradução
+ Tradutor
+ Upload Xml de Tradução
+
+
+ Navegador de Cache
+ Lixeira
+ Pacotes criados
+ Tipo de Dado
+ Dicionário
+ Pacotes instalados
+ Instalar tema
+ Instalar kit de iniciante
+ Linguagens
+ Instalar pacote local
+ Macros
+ Tipos de Mídia
+ Membros
+ Grupos de Membros
+ Funções
+ Tipo de Membro
+ Tipos de Documentos
+ Pacotes
+ Pacotes
+ Arquivos Python
+ Instalar desde o repositório
+ Instalar Runway
+ Módulos Runway
+ Arquivos de Script
+ Scripts
+ Stylesheets
+ Modelos
+ Arquivos XSLT
+
+
+ Nova atualização pronta
+ %0% está pronto, clique aqui para download
+ Nenhuma conexão ao servidor
+ Erro ao procurar por atualização. Favor revisar os detalhes (stack-trace) para mais informações
+
+
+ Administrador
+ Campo de Categoria
+ Alterar Sua Senha
+ você pode alterar sua senha para acessar a área administrativa do Umbraco preenchendo o formulário abaixo e clicando no botão 'Alterar Senha'
+ Canal de Conteúdo
+ Campo de descrição
+ Desabilitar Usuário
+ Tipo de Documento
+ Editor
+ Campo de excerto
+ Linguagem
+ Login
+ Nó Inicial na Biblioteca de Mídia
+ Seções
+ Desabilitar Acesso Umbraco
+ Senha
+ Sua senha foi alterada!
+ Favor confirmar sua nova senha
+ Digite sua nova senha
+ Sua nova senha não pode estar em branco!
+ Há uma diferença entre a nova senha e a confirmação da senha. Favor tentar novamente!
+ A confirmação da senha não é igual à nova senha!
+ Substituir permissões do nó filho
+ Vocês está modificando permissões para as páginas no momento:
+ Selecione páginas para modificar suas permissões
+ Buscar todos filhos
+ Nó Inicial do Conteúdo
+ Nome de Usuário
+ Permissões de usuário
+ Tipo de usuário
+ Tipos de usuários
+ Escrevente
+
+
diff --git a/OurUmbraco.Site/umbraco/config/lang/ru.xml b/OurUmbraco.Site/umbraco/config/lang/ru.xml
index ff3c94b7..75c56306 100644
--- a/OurUmbraco.Site/umbraco/config/lang/ru.xml
+++ b/OurUmbraco.Site/umbraco/config/lang/ru.xml
@@ -499,6 +499,7 @@
Установить
Неверно
Выравнивание
+ Название
Язык
Макет
Загрузка
@@ -654,6 +655,7 @@
Медиа - всего в XML: %0%, всего: %1%Б с ошибками: %2%
Содержимое - всего в XML: %0%, всего опубликовано: %1%, с ошибками: %2%
+ Сертификат Вашего сайта отмечен как проверенный.
Ошибка проверки сертификата: '%0%'
Ошибка проверки адреса URL %0% - '%1%'
Сейчас Вы %0% просматриваете сайт, используя протокол HTTPS.
@@ -1065,6 +1067,23 @@
Чтобы опубликовать ранее неопубликованные документы среди дочерних, отметьте опцию Включая неопубликованные дочерние документы .
]]>
+
+ Остановить отслеживание URL
+ Запустить отслеживание URL
+ Первоначальный URL
+ Перенаправлен в
+ На данный момент нет ни одного перенаправления
+ Если опубликованный документ переименовывается или меняет свое расположение в дереве, а следовательно, меняется адрес (URL), автоматически создается перенаправление на новое местоположение этого документа.
+ Удалить
+ Вы уверены, что хотите удалить перенаправление с '%0%' на '%1%'?
+ Перенаправление удалено.
+ Ошибка удаления перенаправления.
+ Вы уверены, что хотите остановить отслеживание URL?
+ Отслеживание URL в настоящий момент остановлено.
+ Ошибка остановки отслеживания URL, более подробные сведения находятся в системном журнале.
+ Отслеживание URL в настоящий момент запущено.
+ Ошибка запуска отслеживания URL, более подробные сведения находятся в системном журнале.
+
Заголовок
Укажите заголовок
diff --git a/OurUmbraco.Site/umbraco/create/PartialView.ascx b/OurUmbraco.Site/umbraco/create/PartialView.ascx
index 9b76d6cb..8e8e53e1 100644
--- a/OurUmbraco.Site/umbraco/create/PartialView.ascx
+++ b/OurUmbraco.Site/umbraco/create/PartialView.ascx
@@ -1,31 +1,31 @@
-<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="PartialView.ascx.cs" Inherits="Umbraco.Web.UI.Umbraco.Create.PartialView" %>
-<%@ Import Namespace="umbraco" %>
-<%@ Register TagPrefix="cc1" Namespace="umbraco.uicontrols" Assembly="controls" %>
-
-
-
-
- *
-
- Cannot end with '/' or '.'
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- <%=umbraco.ui.Text("cancel")%>
-
-
+<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="PartialView.ascx.cs" Inherits="Umbraco.Web.UI.Umbraco.Create.PartialView" %>
+<%@ Import Namespace="umbraco" %>
+<%@ Register TagPrefix="cc1" Namespace="umbraco.uicontrols" Assembly="controls" %>
+
+
+
+
+ *
+
+ Cannot end with '/' or '.'
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ <%=umbraco.ui.Text("cancel")%>
+
+
diff --git a/OurUmbraco.Site/umbraco/create/PartialViewMacro.ascx b/OurUmbraco.Site/umbraco/create/PartialViewMacro.ascx
index 75bb8ad9..7ceea234 100644
--- a/OurUmbraco.Site/umbraco/create/PartialViewMacro.ascx
+++ b/OurUmbraco.Site/umbraco/create/PartialViewMacro.ascx
@@ -1,38 +1,38 @@
-<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="PartialViewMacro.ascx.cs" Inherits="Umbraco.Web.UI.Umbraco.Create.PartialViewMacro" %>
-<%@ Import Namespace="umbraco" %>
-<%@ Register TagPrefix="cc1" Namespace="umbraco.uicontrols" Assembly="controls" %>
-<%@ Register TagPrefix="umb" Namespace="ClientDependency.Core.Controls" Assembly="ClientDependency.Core" %>
-
-
-
-
- *
-
- Cannot end with '/' or '.'
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- <%=umbraco.ui.Text("cancel")%>
-
-
+<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="PartialViewMacro.ascx.cs" Inherits="Umbraco.Web.UI.Umbraco.Create.PartialViewMacro" %>
+<%@ Import Namespace="umbraco" %>
+<%@ Register TagPrefix="cc1" Namespace="umbraco.uicontrols" Assembly="controls" %>
+<%@ Register TagPrefix="umb" Namespace="ClientDependency.Core.Controls" Assembly="ClientDependency.Core" %>
+
+
+
+
+ *
+
+ Cannot end with '/' or '.'
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ <%=umbraco.ui.Text("cancel")%>
+
+
diff --git a/OurUmbraco.Site/umbraco/dashboard/ExamineManagement.ascx b/OurUmbraco.Site/umbraco/dashboard/ExamineManagement.ascx
index 419b3487..f713f35b 100644
--- a/OurUmbraco.Site/umbraco/dashboard/ExamineManagement.ascx
+++ b/OurUmbraco.Site/umbraco/dashboard/ExamineManagement.ascx
@@ -1,216 +1,216 @@
-<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="ExamineManagement.ascx.cs" Inherits="Umbraco.Web.UI.Umbraco.Dashboard.ExamineManagement" %>
-<%@ Import Namespace="Umbraco.Core" %>
-<%@ Import Namespace="Umbraco.Web" %>
-<%@ Import Namespace="umbraco" %>
-<%@ Register TagPrefix="cc1" Namespace="Umbraco.Web.UI.Controls" Assembly="umbraco" %>
-<%@ Register TagPrefix="umb" Namespace="ClientDependency.Core.Controls" Assembly="ClientDependency.Core" %>
-
-
-
-
-
-
-
-
-
-
-
-
-
-
Examine Management
-
-
-
-
-
-
Indexers
-
-
-
-
-
-
-
-
-
-
-
Node types
-
-
- Include node types
-
-
-
- Exclude node types
-
-
-
- Parent node id
-
-
-
-
-
-
-
System fields
-
-
-
- Name
- Enable sorting
- Type
-
-
-
-
-
-
-
-
-
-
-
-
-
-
User fields
-
-
-
- Name
- Enable sorting
- Type
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
Searchers
-
-
-
-
-
-
-
+<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="ExamineManagement.ascx.cs" Inherits="Umbraco.Web.UI.Umbraco.Dashboard.ExamineManagement" %>
+<%@ Import Namespace="Umbraco.Core" %>
+<%@ Import Namespace="Umbraco.Web" %>
+<%@ Import Namespace="umbraco" %>
+<%@ Register TagPrefix="cc1" Namespace="Umbraco.Web.UI.Controls" Assembly="umbraco" %>
+<%@ Register TagPrefix="umb" Namespace="ClientDependency.Core.Controls" Assembly="ClientDependency.Core" %>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Examine Management
+
+
+
+
+
+
Indexers
+
+
+
+
+
+
+
+
+
+
+
Node types
+
+
+ Include node types
+
+
+
+ Exclude node types
+
+
+
+ Parent node id
+
+
+
+
+
+
+
System fields
+
+
+
+ Name
+ Enable sorting
+ Type
+
+
+
+
+
+
+
+
+
+
+
+
+
+
User fields
+
+
+
+ Name
+ Enable sorting
+ Type
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Searchers
+
+
+
+
+
+
+
diff --git a/OurUmbraco.Site/umbraco/dashboard/UserControlProxy.aspx b/OurUmbraco.Site/umbraco/dashboard/UserControlProxy.aspx
index e1c897cf..59a96e9a 100644
--- a/OurUmbraco.Site/umbraco/dashboard/UserControlProxy.aspx
+++ b/OurUmbraco.Site/umbraco/dashboard/UserControlProxy.aspx
@@ -1,30 +1,30 @@
-<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="UserControlProxy.aspx.cs" Inherits="Umbraco.Web.UI.Umbraco.Dashboard.UserControlProxy" %>
-<%@ Register TagPrefix="umb" Namespace="ClientDependency.Core.Controls" Assembly="ClientDependency.Core" %>
-<%@ Register TagPrefix="cc1" Namespace="umbraco.uicontrols" Assembly="controls" %>
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="UserControlProxy.aspx.cs" Inherits="Umbraco.Web.UI.Umbraco.Dashboard.UserControlProxy" %>
+<%@ Register TagPrefix="umb" Namespace="ClientDependency.Core.Controls" Assembly="ClientDependency.Core" %>
+<%@ Register TagPrefix="cc1" Namespace="umbraco.uicontrols" Assembly="controls" %>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/OurUmbraco.Site/umbraco/dialogs/AssignDomain2.aspx b/OurUmbraco.Site/umbraco/dialogs/AssignDomain2.aspx
index 56df5066..3346927b 100644
--- a/OurUmbraco.Site/umbraco/dialogs/AssignDomain2.aspx
+++ b/OurUmbraco.Site/umbraco/dialogs/AssignDomain2.aspx
@@ -1,79 +1,79 @@
-<%@ Page Language="c#" MasterPageFile="../masterpages/umbracoDialog.Master" Codebehind="AssignDomain2.aspx.cs" AutoEventWireup="True" Inherits="umbraco.dialogs.AssignDomain2" %>
-<%@ Import Namespace="Umbraco.Web" %>
-<%@ Register TagPrefix="umb" Namespace="ClientDependency.Core.Controls" Assembly="ClientDependency.Core" %>
-<%@ Register TagPrefix="cc1" Namespace="umbraco.uicontrols" Assembly="controls" %>
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- '">
-
-
-
-
-
-
- <%=umbraco.ui.Text("assignDomain", "domainHelp") %>
-
-
-
-
-
- <%=umbraco.ui.Text("assignDomain", "addNew") %>
-
-
-
-
-
-
-
-
-
-
-
+<%@ Page Language="c#" MasterPageFile="../masterpages/umbracoDialog.Master" Codebehind="AssignDomain2.aspx.cs" AutoEventWireup="True" Inherits="umbraco.dialogs.AssignDomain2" %>
+<%@ Import Namespace="Umbraco.Web" %>
+<%@ Register TagPrefix="umb" Namespace="ClientDependency.Core.Controls" Assembly="ClientDependency.Core" %>
+<%@ Register TagPrefix="cc1" Namespace="umbraco.uicontrols" Assembly="controls" %>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ '">
+
+
+
+
+
+
+ <%=umbraco.ui.Text("assignDomain", "domainHelp") %>
+
+
+
+
+
+ <%=umbraco.ui.Text("assignDomain", "addNew") %>
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/OurUmbraco.Site/umbraco/dialogs/ChangeDocType.aspx b/OurUmbraco.Site/umbraco/dialogs/ChangeDocType.aspx
index 234b39ad..77deab27 100644
--- a/OurUmbraco.Site/umbraco/dialogs/ChangeDocType.aspx
+++ b/OurUmbraco.Site/umbraco/dialogs/ChangeDocType.aspx
@@ -1,123 +1,121 @@
-<%@ Page Language="c#" MasterPageFile="../masterpages/umbracoDialog.Master"Codebehind="ChangeDocType.aspx.cs" AutoEventWireup="True" Inherits="Umbraco.Web.UI.Umbraco.Dialogs.ChangeDocType" %>
-<%@ Register TagPrefix="cc1" Namespace="umbraco.uicontrols" Assembly="controls" %>
-<%@ Register TagPrefix="umb" Namespace="ClientDependency.Core.Controls" Assembly="ClientDependency.Core" %>
-
-
-
-
-
-
-
-
-
-
-
- <%= umbraco.ui.Text("changeDocType", "changeDocTypeInstruction") %>
-
-
-
-
-
-
-
-
-
-
-
-
-
- <%=umbraco.ui.Text("changeDocType", "validDocTypesNote") %>
-
-
-
-
-
-
-
-
-
<%=umbraco.ui.Text("changeDocType", "docTypeCannotBeChanged") %>
-
-
-
-
-
-
-
- <%= umbraco.ui.Text("changeDocType", "changeDocTypeInstruction2") %>
-
-
-
-
-
-
-
- <%= umbraco.ui.Text("changeDocType", "currentProperty") %>
- <%= umbraco.ui.Text("changeDocType", "mapToProperty") %>
-
-
-
-
-
-
- <%# DataBinder.Eval(Container, "DataItem.Name") %>
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- <%=umbraco.ui.Text("changeDocType", "docTypeChanged") %>
-
-
-
-
-
- <%=umbraco.ui.Text("defaultdialogs", "closeThisWindow") %>
-
-
-
-
-
-
-
-
-
-
-
-
-
- <%= umbraco.ui.Text("or") %>
-
- <%=umbraco.ui.Text("general", "cancel", Security.CurrentUser)%>
-
-
-
-
+<%@ Page Language="c#" MasterPageFile="../masterpages/umbracoDialog.Master"Codebehind="ChangeDocType.aspx.cs" AutoEventWireup="True" Inherits="Umbraco.Web.UI.Umbraco.Dialogs.ChangeDocType" %>
+<%@ Register TagPrefix="cc1" Namespace="umbraco.uicontrols" Assembly="controls" %>
+<%@ Register TagPrefix="umb" Namespace="ClientDependency.Core.Controls" Assembly="ClientDependency.Core" %>
+
+
+
+
+
+
+
+
+
+
+
+ <%= umbraco.ui.Text("changeDocType", "changeDocTypeInstruction") %>
+
+
+
+
+
+
+
+
+
+
+
+
+
+ <%=umbraco.ui.Text("changeDocType", "validDocTypesNote") %>
+
+
+
+
+
+
+
+
+
<%=umbraco.ui.Text("changeDocType", "docTypeCannotBeChanged") %>
+
+
+
+
+
+
+
+ <%= umbraco.ui.Text("changeDocType", "changeDocTypeInstruction2") %>
+
+
+
+
+
+
+
+ <%= umbraco.ui.Text("changeDocType", "currentProperty") %>
+ <%= umbraco.ui.Text("changeDocType", "mapToProperty") %>
+
+
+
+
+
+
+ <%# DataBinder.Eval(Container, "DataItem.Name") %>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ <%=umbraco.ui.Text("changeDocType", "docTypeChanged") %>
+
+
+
+
+
+ <%=umbraco.ui.Text("defaultdialogs", "closeThisWindow") %>
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/OurUmbraco.Site/umbraco/installer.html b/OurUmbraco.Site/umbraco/installer.html
index 70073a23..72fdf9d3 100644
--- a/OurUmbraco.Site/umbraco/installer.html
+++ b/OurUmbraco.Site/umbraco/installer.html
@@ -1,24 +1,24 @@
-
-
-
-
-
-
-
- Install Umbraco
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+ Install Umbraco
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/OurUmbraco.Site/umbraco/js/app.js b/OurUmbraco.Site/umbraco/js/app.js
index 36243abd..64f46871 100644
--- a/OurUmbraco.Site/umbraco/js/app.js
+++ b/OurUmbraco.Site/umbraco/js/app.js
@@ -1,61 +1,61 @@
-var app = angular.module('umbraco', [
- 'umbraco.filters',
- 'umbraco.directives',
- 'umbraco.resources',
- 'umbraco.services',
- 'umbraco.packages',
- 'umbraco.views',
-
- 'ngCookies',
- 'ngSanitize',
- 'ngMobile',
- 'tmh.dynamicLocale',
- 'ngFileUpload',
- 'LocalStorageModule'
-]);
-
-var packages = angular.module("umbraco.packages", []);
-
-//this ensures we can inject our own views into templateCache and clear
-//the entire cache before the app runs, due to the module
-//order, clearing will always happen before umbraco.views and umbraco
-//module is initilized.
-angular.module("umbraco.views", ["umbraco.viewcache"]);
-angular.module("umbraco.viewcache", [])
- .run(function($rootScope, $templateCache) {
- /** For debug mode, always clear template cache to cut down on
- dev frustration and chrome cache on templates */
- if (Umbraco.Sys.ServerVariables.isDebuggingEnabled) {
- $templateCache.removeAll();
- }
- })
- .config([
- //This ensures that all of our angular views are cache busted, if the path starts with views/ and ends with .html, then
- // we will append the cache busting value to it. This way all upgraded sites will not have to worry about browser cache.
- "$provide", function($provide) {
- return $provide.decorator("$http", [
- "$delegate", function($delegate) {
- var get = $delegate.get;
- $delegate.get = function (url, config) {
-
- if (Umbraco.Sys.ServerVariables.application && url.startsWith("views/") && url.endsWith(".html")) {
- var rnd = Umbraco.Sys.ServerVariables.application.version + "." + Umbraco.Sys.ServerVariables.application.cdf;
- var _op = (url.indexOf("?") > 0) ? "&" : "?";
- url += _op + "umb__rnd=" + rnd;
- }
-
- return get(url, config);
- };
- return $delegate;
- }
- ]);
- }
- ]);
-
-//Call a document callback if defined, this is sort of a dodgy hack to
-// be able to configure angular values in the Default.cshtml
-// view which is much easier to do that configuring values by injecting them in the back office controller
-// to follow through to the js initialization stuff
-if (angular.isFunction(document.angularReady)) {
- document.angularReady.apply(this, [app]);
-}
+var app = angular.module('umbraco', [
+ 'umbraco.filters',
+ 'umbraco.directives',
+ 'umbraco.resources',
+ 'umbraco.services',
+ 'umbraco.packages',
+ 'umbraco.views',
+
+ 'ngCookies',
+ 'ngSanitize',
+ 'ngMobile',
+ 'tmh.dynamicLocale',
+ 'ngFileUpload',
+ 'LocalStorageModule'
+]);
+
+var packages = angular.module("umbraco.packages", []);
+
+//this ensures we can inject our own views into templateCache and clear
+//the entire cache before the app runs, due to the module
+//order, clearing will always happen before umbraco.views and umbraco
+//module is initilized.
+angular.module("umbraco.views", ["umbraco.viewcache"]);
+angular.module("umbraco.viewcache", [])
+ .run(function($rootScope, $templateCache) {
+ /** For debug mode, always clear template cache to cut down on
+ dev frustration and chrome cache on templates */
+ if (Umbraco.Sys.ServerVariables.isDebuggingEnabled) {
+ $templateCache.removeAll();
+ }
+ })
+ .config([
+ //This ensures that all of our angular views are cache busted, if the path starts with views/ and ends with .html, then
+ // we will append the cache busting value to it. This way all upgraded sites will not have to worry about browser cache.
+ "$provide", function($provide) {
+ return $provide.decorator("$http", [
+ "$delegate", function($delegate) {
+ var get = $delegate.get;
+ $delegate.get = function (url, config) {
+
+ if (Umbraco.Sys.ServerVariables.application && url.startsWith("views/") && url.endsWith(".html")) {
+ var rnd = Umbraco.Sys.ServerVariables.application.version + "." + Umbraco.Sys.ServerVariables.application.cdf;
+ var _op = (url.indexOf("?") > 0) ? "&" : "?";
+ url += _op + "umb__rnd=" + rnd;
+ }
+
+ return get(url, config);
+ };
+ return $delegate;
+ }
+ ]);
+ }
+ ]);
+
+//Call a document callback if defined, this is sort of a dodgy hack to
+// be able to configure angular values in the Default.cshtml
+// view which is much easier to do that configuring values by injecting them in the back office controller
+// to follow through to the js initialization stuff
+if (angular.isFunction(document.angularReady)) {
+ document.angularReady.apply(this, [app]);
+}
diff --git a/OurUmbraco.Site/umbraco/js/canvasdesigner.panel.js b/OurUmbraco.Site/umbraco/js/canvasdesigner.panel.js
index b54bd1db..599f39ce 100644
--- a/OurUmbraco.Site/umbraco/js/canvasdesigner.panel.js
+++ b/OurUmbraco.Site/umbraco/js/canvasdesigner.panel.js
@@ -59,7 +59,7 @@ var iframeBodyClick = function () {
scope.closeFloatPanels();
}
-
+
/*********************************************************************************************************/
/* Canvasdesigner panel app and controller */
@@ -575,7 +575,7 @@ var app = angular.module("Umbraco.canvasdesigner", ['colorpicker', 'ui.slider',
}
};
})
-
+
/*********************************************************************************************************/
/* Background editor */
@@ -756,7 +756,7 @@ angular.module("Umbraco.canvasdesigner")
}
})
-
+
/*********************************************************************************************************/
/* Background editor */
@@ -880,7 +880,7 @@ angular.module("Umbraco.canvasdesigner")
}, true)
-})
+})
/*********************************************************************************************************/
/* color editor */
@@ -896,7 +896,7 @@ angular.module("Umbraco.canvasdesigner")
};
}
-})
+})
/*********************************************************************************************************/
/* google font editor */
@@ -1092,7 +1092,7 @@ angular.module("Umbraco.canvasdesigner")
});
}
-});
+});
/*********************************************************************************************************/
/* grid row editor */
@@ -1108,7 +1108,7 @@ angular.module("Umbraco.canvasdesigner")
};
}
-})
+})
/*********************************************************************************************************/
/* Layout */
@@ -1124,7 +1124,7 @@ angular.module("Umbraco.canvasdesigner")
}
}
-})
+})
/*********************************************************************************************************/
/* margin editor */
@@ -1222,7 +1222,7 @@ angular.module("Umbraco.canvasdesigner")
-})
+})
/*********************************************************************************************************/
/* padding editor */
@@ -1320,7 +1320,7 @@ angular.module("Umbraco.canvasdesigner")
-})
+})
/*********************************************************************************************************/
/* radius editor */
@@ -1416,7 +1416,7 @@ angular.module("Umbraco.canvasdesigner")
}, true)
-})
+})
/*********************************************************************************************************/
/* shadow editor */
@@ -1432,7 +1432,7 @@ angular.module("Umbraco.canvasdesigner")
}
}
-})
+})
/*********************************************************************************************************/
/* slider editor */
@@ -1448,7 +1448,7 @@ angular.module("Umbraco.canvasdesigner")
}
}
-})
+})
/*********************************************************************************************************/
/* spectrum color picker directive */
@@ -1517,7 +1517,7 @@ angular.module('colorpicker', ['spectrumcolorpicker'])
' ',
replace: true
};
- }])
+ }])
/*********************************************************************************************************/
/* jQuery UI Slider plugin wrapper */
@@ -1632,7 +1632,7 @@ angular.module("Umbraco.canvasdesigner").factory('dialogService', function ($roo
}
-});
+});
/*********************************************************************************************************/
/* jQuery UI Slider plugin wrapper */
@@ -1789,7 +1789,7 @@ angular.module('ui.slider', []).value('uiSliderConfig', {}).directive('uiSlider'
};
}]);
-
+
/*********************************************************************************************************/
/* spectrum color picker directive */
diff --git a/OurUmbraco.Site/umbraco/js/routes.js b/OurUmbraco.Site/umbraco/js/routes.js
index c388ff58..69e6779a 100644
--- a/OurUmbraco.Site/umbraco/js/routes.js
+++ b/OurUmbraco.Site/umbraco/js/routes.js
@@ -1,173 +1,173 @@
-app.config(function ($routeProvider) {
-
- /** This checks if the user is authenticated for a route and what the isRequired is set to.
- Depending on whether isRequired = true, it first check if the user is authenticated and will resolve successfully
- otherwise the route will fail and the $routeChangeError event will execute, in that handler we will redirect to the rejected
- path that is resolved from this method and prevent default (prevent the route from executing) */
- var canRoute = function(isRequired) {
-
- return {
- /** Checks that the user is authenticated, then ensures that are requires assets are loaded */
- isAuthenticatedAndReady: function ($q, userService, $route, assetsService, appState) {
- var deferred = $q.defer();
-
- //don't need to check if we've redirected to login and we've already checked auth
- if (!$route.current.params.section
- && ($route.current.params.check === false || $route.current.params.check === "false")) {
- deferred.resolve(true);
- return deferred.promise;
- }
-
- userService.isAuthenticated()
- .then(function () {
-
- assetsService._loadInitAssets().then(function() {
-
- //This could be the first time has loaded after the user has logged in, in this case
- // we need to broadcast the authenticated event - this will be handled by the startup (init)
- // handler to set/broadcast the ready state
- var broadcast = appState.getGlobalState("isReady") !== true;
-
- userService.getCurrentUser({ broadcastEvent: broadcast }).then(function (user) {
- //is auth, check if we allow or reject
- if (isRequired) {
- // U4-5430, Benjamin Howarth
- // We need to change the current route params if the user only has access to a single section
- // To do this we need to grab the current user's allowed sections, then reject the promise with the correct path.
- if (user.allowedSections.indexOf($route.current.params.section) > -1) {
- //this will resolve successfully so the route will continue
- deferred.resolve(true);
- } else {
- deferred.reject({ path: "/" + user.allowedSections[0] });
- }
- }
- else {
- deferred.reject({ path: "/" });
- }
- });
-
- });
-
- }, function () {
- //not auth, check if we allow or reject
- if (isRequired) {
- //the check=false is checked above so that we don't have to make another http call to check
- //if they are logged in since we already know they are not.
- deferred.reject({ path: "/login/false" });
- }
- else {
- //this will resolve successfully so the route will continue
- deferred.resolve(true);
- }
- });
- return deferred.promise;
- }
- };
- };
-
- /** When this is used to resolve it will attempt to log the current user out */
- var doLogout = function() {
- return {
- isLoggedOut: function ($q, userService) {
- var deferred = $q.defer();
- userService.logout().then(function () {
- //success so continue
- deferred.resolve(true);
- }, function() {
- //logout failed somehow ? we'll reject with the login page i suppose
- deferred.reject({ path: "/login/false" });
- });
- return deferred.promise;
- }
- }
- }
-
- $routeProvider
- .when('/login', {
- templateUrl: 'views/common/login.html',
- //ensure auth is *not* required so it will redirect to /
- resolve: canRoute(false)
- })
- .when('/login/:check', {
- templateUrl: 'views/common/login.html',
- //ensure auth is *not* required so it will redirect to /
- resolve: canRoute(false)
- })
- .when('/logout', {
- redirectTo: '/login/false',
- resolve: doLogout()
- })
- .when('/:section', {
- templateUrl: function (rp) {
- if (rp.section.toLowerCase() === "default" || rp.section.toLowerCase() === "umbraco" || rp.section === "")
- {
- rp.section = "content";
- }
-
- rp.url = "dashboard.aspx?app=" + rp.section;
- return 'views/common/dashboard.html';
- },
- resolve: canRoute(true)
- })
- .when('/:section/framed/:url', {
- //This occurs when we need to launch some content in an iframe
- templateUrl: function (rp) {
- if (!rp.url)
- throw "A framed resource must have a url route parameter";
-
- return 'views/common/legacy.html';
- },
- resolve: canRoute(true)
- })
- .when('/:section/:tree/:method', {
- templateUrl: function (rp) {
- if (!rp.method)
- return "views/common/dashboard.html";
-
- //NOTE: This current isn't utilized by anything but does open up some cool opportunities for
- // us since we'll be able to have specialized views for individual sections which is something
- // we've never had before. So could utilize this for a new dashboard model when we get native
- // angular dashboards working. Perhaps a normal section dashboard would list out the registered
- // dashboards (as tabs if we wanted) and each tab could actually be a route link to one of these views?
-
- return ('views/' + rp.tree + '/' + rp.method + '.html');
- },
- resolve: canRoute(true)
- })
- .when('/:section/:tree/:method/:id', {
- //This allows us to dynamically change the template for this route since you cannot inject services into the templateUrl method.
- template: "
",
- //This controller will execute for this route, then we replace the template dynamnically based on the current tree.
- controller: function ($scope, $route, $routeParams, treeService) {
-
- if (!$routeParams.tree || !$routeParams.method) {
- $scope.templateUrl = "views/common/dashboard.html";
- }
-
- // Here we need to figure out if this route is for a package tree and if so then we need
- // to change it's convention view path to:
- // /App_Plugins/{mypackage}/backoffice/{treetype}/{method}.html
-
- // otherwise if it is a core tree we use the core paths:
- // views/{treetype}/{method}.html
-
- var packageTreeFolder = treeService.getTreePackageFolder($routeParams.tree);
-
- if (packageTreeFolder) {
- $scope.templateUrl = (Umbraco.Sys.ServerVariables.umbracoSettings.appPluginsPath +
- "/" + packageTreeFolder +
- "/backoffice/" + $routeParams.tree + "/" + $routeParams.method + ".html");
- }
- else {
- $scope.templateUrl = ('views/' + $routeParams.tree + '/' + $routeParams.method + '.html');
- }
-
- },
- resolve: canRoute(true)
- })
- .otherwise({ redirectTo: '/login' });
- }).config(function ($locationProvider) {
-
- //$locationProvider.html5Mode(false).hashPrefix('!'); //turn html5 mode off
- // $locationProvider.html5Mode(true); //turn html5 mode on
- });
+app.config(function ($routeProvider) {
+
+ /** This checks if the user is authenticated for a route and what the isRequired is set to.
+ Depending on whether isRequired = true, it first check if the user is authenticated and will resolve successfully
+ otherwise the route will fail and the $routeChangeError event will execute, in that handler we will redirect to the rejected
+ path that is resolved from this method and prevent default (prevent the route from executing) */
+ var canRoute = function(isRequired) {
+
+ return {
+ /** Checks that the user is authenticated, then ensures that are requires assets are loaded */
+ isAuthenticatedAndReady: function ($q, userService, $route, assetsService, appState) {
+ var deferred = $q.defer();
+
+ //don't need to check if we've redirected to login and we've already checked auth
+ if (!$route.current.params.section
+ && ($route.current.params.check === false || $route.current.params.check === "false")) {
+ deferred.resolve(true);
+ return deferred.promise;
+ }
+
+ userService.isAuthenticated()
+ .then(function () {
+
+ assetsService._loadInitAssets().then(function() {
+
+ //This could be the first time has loaded after the user has logged in, in this case
+ // we need to broadcast the authenticated event - this will be handled by the startup (init)
+ // handler to set/broadcast the ready state
+ var broadcast = appState.getGlobalState("isReady") !== true;
+
+ userService.getCurrentUser({ broadcastEvent: broadcast }).then(function (user) {
+ //is auth, check if we allow or reject
+ if (isRequired) {
+ // U4-5430, Benjamin Howarth
+ // We need to change the current route params if the user only has access to a single section
+ // To do this we need to grab the current user's allowed sections, then reject the promise with the correct path.
+ if (user.allowedSections.indexOf($route.current.params.section) > -1) {
+ //this will resolve successfully so the route will continue
+ deferred.resolve(true);
+ } else {
+ deferred.reject({ path: "/" + user.allowedSections[0] });
+ }
+ }
+ else {
+ deferred.reject({ path: "/" });
+ }
+ });
+
+ });
+
+ }, function () {
+ //not auth, check if we allow or reject
+ if (isRequired) {
+ //the check=false is checked above so that we don't have to make another http call to check
+ //if they are logged in since we already know they are not.
+ deferred.reject({ path: "/login/false" });
+ }
+ else {
+ //this will resolve successfully so the route will continue
+ deferred.resolve(true);
+ }
+ });
+ return deferred.promise;
+ }
+ };
+ };
+
+ /** When this is used to resolve it will attempt to log the current user out */
+ var doLogout = function() {
+ return {
+ isLoggedOut: function ($q, userService) {
+ var deferred = $q.defer();
+ userService.logout().then(function () {
+ //success so continue
+ deferred.resolve(true);
+ }, function() {
+ //logout failed somehow ? we'll reject with the login page i suppose
+ deferred.reject({ path: "/login/false" });
+ });
+ return deferred.promise;
+ }
+ }
+ }
+
+ $routeProvider
+ .when('/login', {
+ templateUrl: 'views/common/login.html',
+ //ensure auth is *not* required so it will redirect to /
+ resolve: canRoute(false)
+ })
+ .when('/login/:check', {
+ templateUrl: 'views/common/login.html',
+ //ensure auth is *not* required so it will redirect to /
+ resolve: canRoute(false)
+ })
+ .when('/logout', {
+ redirectTo: '/login/false',
+ resolve: doLogout()
+ })
+ .when('/:section', {
+ templateUrl: function (rp) {
+ if (rp.section.toLowerCase() === "default" || rp.section.toLowerCase() === "umbraco" || rp.section === "")
+ {
+ rp.section = "content";
+ }
+
+ rp.url = "dashboard.aspx?app=" + rp.section;
+ return 'views/common/dashboard.html';
+ },
+ resolve: canRoute(true)
+ })
+ .when('/:section/framed/:url', {
+ //This occurs when we need to launch some content in an iframe
+ templateUrl: function (rp) {
+ if (!rp.url)
+ throw "A framed resource must have a url route parameter";
+
+ return 'views/common/legacy.html';
+ },
+ resolve: canRoute(true)
+ })
+ .when('/:section/:tree/:method', {
+ templateUrl: function (rp) {
+ if (!rp.method)
+ return "views/common/dashboard.html";
+
+ //NOTE: This current isn't utilized by anything but does open up some cool opportunities for
+ // us since we'll be able to have specialized views for individual sections which is something
+ // we've never had before. So could utilize this for a new dashboard model when we get native
+ // angular dashboards working. Perhaps a normal section dashboard would list out the registered
+ // dashboards (as tabs if we wanted) and each tab could actually be a route link to one of these views?
+
+ return ('views/' + rp.tree + '/' + rp.method + '.html');
+ },
+ resolve: canRoute(true)
+ })
+ .when('/:section/:tree/:method/:id', {
+ //This allows us to dynamically change the template for this route since you cannot inject services into the templateUrl method.
+ template: "
",
+ //This controller will execute for this route, then we replace the template dynamnically based on the current tree.
+ controller: function ($scope, $route, $routeParams, treeService) {
+
+ if (!$routeParams.tree || !$routeParams.method) {
+ $scope.templateUrl = "views/common/dashboard.html";
+ }
+
+ // Here we need to figure out if this route is for a package tree and if so then we need
+ // to change it's convention view path to:
+ // /App_Plugins/{mypackage}/backoffice/{treetype}/{method}.html
+
+ // otherwise if it is a core tree we use the core paths:
+ // views/{treetype}/{method}.html
+
+ var packageTreeFolder = treeService.getTreePackageFolder($routeParams.tree);
+
+ if (packageTreeFolder) {
+ $scope.templateUrl = (Umbraco.Sys.ServerVariables.umbracoSettings.appPluginsPath +
+ "/" + packageTreeFolder +
+ "/backoffice/" + $routeParams.tree + "/" + $routeParams.method + ".html");
+ }
+ else {
+ $scope.templateUrl = ('views/' + $routeParams.tree + '/' + $routeParams.method + '.html');
+ }
+
+ },
+ resolve: canRoute(true)
+ })
+ .otherwise({ redirectTo: '/login' });
+ }).config(function ($locationProvider) {
+
+ //$locationProvider.html5Mode(false).hashPrefix('!'); //turn html5 mode off
+ // $locationProvider.html5Mode(true); //turn html5 mode on
+ });
diff --git a/OurUmbraco.Site/umbraco/js/umbraco.controllers.js b/OurUmbraco.Site/umbraco/js/umbraco.controllers.js
index cf11f9e9..221f05d0 100644
--- a/OurUmbraco.Site/umbraco/js/umbraco.controllers.js
+++ b/OurUmbraco.Site/umbraco/js/umbraco.controllers.js
@@ -5322,9 +5322,42 @@ function startUpVideosDashboardController($scope, xmlhelper, $log, $http) {
});
};
}
+
angular.module("umbraco").controller("Umbraco.Dashboard.StartupVideosController", startUpVideosDashboardController);
+function startUpDynamicContentController(dashboardResource, assetsService) {
+ var vm = this;
+ vm.loading = true;
+ vm.showDefault = false;
+
+ //proxy remote css through the local server
+ assetsService.loadCss( dashboardResource.getRemoteDashboardCssUrl("content") );
+ dashboardResource.getRemoteDashboardContent("content").then(
+ function (data) {
+
+ vm.loading = false;
+
+ //test if we have received valid data
+ //we capture it like this, so we avoid UI errors - which automatically triggers ui based on http response code
+ if (data && data.sections) {
+ vm.dashboard = data;
+ } else{
+ vm.showDefault = true;
+ }
+
+ },
+
+ function (exception) {
+ console.error(exception);
+ vm.loading = false;
+ vm.showDefault = true;
+ });
+}
+
+angular.module("umbraco").controller("Umbraco.Dashboard.StartUpDynamicContentController", startUpDynamicContentController);
+
+
function FormsController($scope, $route, $cookieStore, packageResource, localizationService) {
$scope.installForms = function(){
$scope.state = localizationService.localize("packager_installStateDownloading");
@@ -5500,27 +5533,43 @@ function startupLatestEditsController($scope) {
}
angular.module("umbraco").controller("Umbraco.Dashboard.StartupLatestEditsController", startupLatestEditsController);
-function MediaFolderBrowserDashboardController($rootScope, $scope, contentTypeResource) {
+function MediaFolderBrowserDashboardController($rootScope, $scope, $location, contentTypeResource, userService) {
- //get the system media listview
- contentTypeResource.getPropertyTypeScaffold(-96)
- .then(function(dt) {
+ var currentUser = {};
- $scope.fakeProperty = {
- alias: "contents",
- config: dt.config,
- description: "",
- editor: dt.editor,
- hideLabel: true,
- id: 1,
- label: "Contents:",
- validation: {
- mandatory: false,
- pattern: null
- },
- value: "",
- view: dt.view
- };
+ userService.getCurrentUser().then(function (user) {
+
+ currentUser = user;
+
+ // check if the user start node is the dashboard
+ if(currentUser.startMediaId === -1) {
+
+ //get the system media listview
+ contentTypeResource.getPropertyTypeScaffold(-96)
+ .then(function(dt) {
+
+ $scope.fakeProperty = {
+ alias: "contents",
+ config: dt.config,
+ description: "",
+ editor: dt.editor,
+ hideLabel: true,
+ id: 1,
+ label: "Contents:",
+ validation: {
+ mandatory: false,
+ pattern: null
+ },
+ value: "",
+ view: dt.view
+ };
+
+ });
+
+ } else {
+ // redirect to start node
+ $location.path("/media/media/edit/" + currentUser.startMediaId);
+ }
});
@@ -11112,7 +11161,7 @@ angular.module("umbraco")
};
$scope.scaleDown = function(section){
- var remove = (section.grid > 1) ? 1 : section.grid;
+ var remove = (section.grid > 1) ? 1 : 0;
section.grid = section.grid-remove;
};
@@ -11145,9 +11194,12 @@ angular.module("umbraco")
$scope.currentSection = section;
};
-
- $scope.deleteSection = function(index){
- $scope.currentTemplate.sections.splice(index, 1);
+ $scope.deleteSection = function(section, template) {
+ if ($scope.currentSection === section) {
+ $scope.currentSection = undefined;
+ }
+ var index = template.sections.indexOf(section)
+ template.sections.splice(index, 1);
};
$scope.closeSection = function(){
@@ -11182,7 +11234,7 @@ function RowConfigController($scope) {
};
$scope.scaleDown = function(section) {
- var remove = (section.grid > 1) ? 1 : section.grid;
+ var remove = (section.grid > 1) ? 1 : 0;
section.grid = section.grid - remove;
};
@@ -11226,9 +11278,14 @@ function RowConfigController($scope) {
}
};
- $scope.deleteArea = function(index) {
- $scope.currentRow.areas.splice(index, 1);
+ $scope.deleteArea = function (cell, row) {
+ if ($scope.currentCell === cell) {
+ $scope.currentCell = undefined;
+ }
+ var index = row.areas.indexOf(cell)
+ row.areas.splice(index, 1);
};
+
$scope.closeArea = function() {
$scope.currentCell = undefined;
};
@@ -11852,6 +11909,37 @@ angular.module("umbraco")
}
};
+ var shouldApply = function(item, itemType, gridItem) {
+ if (item.applyTo === undefined || item.applyTo === null || item.applyTo === "") {
+ return true;
+ }
+
+ if (typeof (item.applyTo) === "string") {
+ return item.applyTo === itemType;
+ }
+
+ if (itemType === "row") {
+ if (item.applyTo.row === undefined) {
+ return false;
+ }
+ if (item.applyTo.row === null || item.applyTo.row === "") {
+ return true;
+ }
+ var rows = item.applyTo.row.split(',');
+ return _.indexOf(rows, gridItem.name) !== -1;
+ } else if (itemType === "cell") {
+ if (item.applyTo.cell === undefined) {
+ return false;
+ }
+ if (item.applyTo.cell === null || item.applyTo.cell === "") {
+ return true;
+ }
+ var cells = item.applyTo.cell.split(',');
+ var cellSize = gridItem.grid.toString();
+ return _.indexOf(cells, cellSize) !== -1;
+ }
+ }
+
$scope.editGridItemSettings = function (gridItem, itemType) {
placeHolder = "{0}";
@@ -11861,8 +11949,8 @@ angular.module("umbraco")
styles = null;
config = angular.copy(gridItem.editor.config.settings);
} else {
- styles = _.filter(angular.copy($scope.model.config.items.styles), function (item) { return (item.applyTo === undefined || item.applyTo === itemType); });
- config = _.filter(angular.copy($scope.model.config.items.config), function (item) { return (item.applyTo === undefined || item.applyTo === itemType); });
+ styles = _.filter(angular.copy($scope.model.config.items.styles), function (item) { return shouldApply(item, itemType, gridItem); });
+ config = _.filter(angular.copy($scope.model.config.items.config), function (item) { return shouldApply(item, itemType, gridItem); });
}
if(angular.isObject(gridItem.config)){
@@ -12437,6 +12525,7 @@ angular.module("umbraco")
layouts:[
{
+ label: "Headline",
name: "Headline",
areas: [
{
@@ -12446,6 +12535,7 @@ angular.module("umbraco")
]
},
{
+ label: "Article",
name: "Article",
areas: [
{
@@ -12809,7 +12899,7 @@ angular.module('umbraco')
//NOTE: The 'entity' can be either a normal media entity or an "entity" returned from the entityResource
// they contain different data structures so if we need to query against it we need to be aware of this.
mediaHelper.registerFileResolver("Umbraco.ImageCropper", function (property, entity, thumbnail) {
- if (property.value.src) {
+ if (property.value && property.value.src) {
if (thumbnail === true) {
return property.value.src + "?width=500&mode=max&animationprocessmode=first";
diff --git a/OurUmbraco.Site/umbraco/js/umbraco.directives.js b/OurUmbraco.Site/umbraco/js/umbraco.directives.js
index 3cde58df..8d2c1cdf 100644
--- a/OurUmbraco.Site/umbraco/js/umbraco.directives.js
+++ b/OurUmbraco.Site/umbraco/js/umbraco.directives.js
@@ -4275,9 +4275,13 @@ angular.module("umbraco.directives")
$timeout(function(){
setDimensions();
});
- var offsetX = $overlay[0].offsetLeft;
- var offsetY = $overlay[0].offsetTop;
- calculateGravity(offsetX, offsetY);
+ // Make sure we can find the offset values for the overlay(dot) before calculating
+ // fixes issue with resize event when printing the page (ex. hitting ctrl+p inside the rte)
+ if($overlay.is(':visible')) {
+ var offsetX = $overlay[0].offsetLeft;
+ var offsetY = $overlay[0].offsetTop;
+ calculateGravity(offsetX, offsetY);
+ }
});
});
@@ -5338,6 +5342,8 @@ angular.module("umbraco.directives")
var curr = $(event.target); // active tab
var prev = $(event.relatedTarget); // previous tab
+ $scope.$apply();
+
for (var c in callbacks) {
callbacks[c].apply(this, [{current: curr, previous: prev}]);
}
diff --git a/OurUmbraco.Site/umbraco/js/umbraco.filters.js b/OurUmbraco.Site/umbraco/js/umbraco.filters.js
index 3d9e7fb0..d9bfd464 100644
--- a/OurUmbraco.Site/umbraco/js/umbraco.filters.js
+++ b/OurUmbraco.Site/umbraco/js/umbraco.filters.js
@@ -1,12 +1,12 @@
-/*! umbraco
- * https://github.com/umbraco/umbraco-cms/
- * Copyright (c) 2016 Umbraco HQ;
- * Licensed
- */
-
-(function() {
-
-angular.module('umbraco.filters', []);
+/*! umbraco
+ * https://github.com/umbraco/umbraco-cms/
+ * Copyright (c) 2016 Umbraco HQ;
+ * Licensed
+ */
+
+(function() {
+
+angular.module('umbraco.filters', []);
angular.module("umbraco.filters")
.filter('compareArrays', function() {
return function inArray(array, compareArray, compareProperty) {
@@ -33,7 +33,7 @@ angular.module("umbraco.filters")
};
});
-
+
angular.module("umbraco.filters").filter('timespan', function() {
return function(input) {
var sec_num = parseInt(input, 10);
@@ -48,6 +48,6 @@ angular.module("umbraco.filters").filter('timespan', function() {
return time;
};
});
-
-
+
+
})();
\ No newline at end of file
diff --git a/OurUmbraco.Site/umbraco/js/umbraco.httpbackend.js b/OurUmbraco.Site/umbraco/js/umbraco.httpbackend.js
index 92c2a67d..caccb92d 100644
--- a/OurUmbraco.Site/umbraco/js/umbraco.httpbackend.js
+++ b/OurUmbraco.Site/umbraco/js/umbraco.httpbackend.js
@@ -1,31 +1,31 @@
-var umbracoAppDev = angular.module('umbraco.httpbackend', ['umbraco', 'ngMockE2E', 'umbraco.mocks']);
-
-
-function initBackEnd($httpBackend, contentMocks, mediaMocks, treeMocks, userMocks, contentTypeMocks, sectionMocks, entityMocks, dataTypeMocks, dashboardMocks, macroMocks, utilMocks, localizationMocks, prevaluesMocks) {
-
- console.log("httpBackend inited");
-
- //Register mocked http responses
- contentMocks.register();
- mediaMocks.register();
- sectionMocks.register();
- treeMocks.register();
- dataTypeMocks.register();
- dashboardMocks.register();
- userMocks.register();
- macroMocks.register();
- contentTypeMocks.register();
- utilMocks.register();
- localizationMocks.register();
- prevaluesMocks.register();
- entityMocks.register();
-
- $httpBackend.whenGET(/^..\/config\//).passThrough();
- $httpBackend.whenGET(/^views\//).passThrough();
- $httpBackend.whenGET(/^js\//).passThrough();
- $httpBackend.whenGET(/^lib\//).passThrough();
- $httpBackend.whenGET(/^assets\//).passThrough();
-}
-
-
-umbracoAppDev.run(initBackEnd);
+var umbracoAppDev = angular.module('umbraco.httpbackend', ['umbraco', 'ngMockE2E', 'umbraco.mocks']);
+
+
+function initBackEnd($httpBackend, contentMocks, mediaMocks, treeMocks, userMocks, contentTypeMocks, sectionMocks, entityMocks, dataTypeMocks, dashboardMocks, macroMocks, utilMocks, localizationMocks, prevaluesMocks) {
+
+ console.log("httpBackend inited");
+
+ //Register mocked http responses
+ contentMocks.register();
+ mediaMocks.register();
+ sectionMocks.register();
+ treeMocks.register();
+ dataTypeMocks.register();
+ dashboardMocks.register();
+ userMocks.register();
+ macroMocks.register();
+ contentTypeMocks.register();
+ utilMocks.register();
+ localizationMocks.register();
+ prevaluesMocks.register();
+ entityMocks.register();
+
+ $httpBackend.whenGET(/^..\/config\//).passThrough();
+ $httpBackend.whenGET(/^views\//).passThrough();
+ $httpBackend.whenGET(/^js\//).passThrough();
+ $httpBackend.whenGET(/^lib\//).passThrough();
+ $httpBackend.whenGET(/^assets\//).passThrough();
+}
+
+
+umbracoAppDev.run(initBackEnd);
diff --git a/OurUmbraco.Site/umbraco/js/umbraco.installer.js b/OurUmbraco.Site/umbraco/js/umbraco.installer.js
index e7eb30f6..90538bf3 100644
--- a/OurUmbraco.Site/umbraco/js/umbraco.installer.js
+++ b/OurUmbraco.Site/umbraco/js/umbraco.installer.js
@@ -1,12 +1,12 @@
-/*! umbraco
- * https://github.com/umbraco/umbraco-cms/
- * Copyright (c) 2016 Umbraco HQ;
- * Licensed
- */
-
-(function() {
-
- angular.module('umbraco.install', []);
+/*! umbraco
+ * https://github.com/umbraco/umbraco-cms/
+ * Copyright (c) 2016 Umbraco HQ;
+ * Licensed
+ */
+
+(function() {
+
+ angular.module('umbraco.install', []);
angular.module("umbraco.install").controller("Umbraco.InstallerController",
function ($scope, installerService) {
@@ -49,7 +49,7 @@ angular.module("umbraco.install").controller("Umbraco.InstallerController",
//this ensure that we start with a clean slate on every install and upgrade
angular.module("umbraco.install").run(function ($templateCache) {
$templateCache.removeAll();
-});
+});
angular.module("umbraco.install").factory('installerService', function($rootScope, $q, $timeout, $http, $location, $log){
var _status = {
@@ -389,7 +389,7 @@ angular.module("umbraco.install").factory('installerService', function($rootScop
return service;
});
-
+
angular.module("umbraco.install").controller("Umbraco.Installer.DataBaseController", function($scope, $http, installerService){
$scope.checking = false;
@@ -425,7 +425,7 @@ angular.module("umbraco.install").controller("Umbraco.Installer.DataBaseControll
});
}
};
-});
+});
angular.module("umbraco.install").controller("Umbraco.Installer.PackagesController", function ($scope, installerService) {
installerService.getPackages().then(function (response) {
@@ -437,7 +437,7 @@ angular.module("umbraco.install").controller("Umbraco.Installer.PackagesControll
installerService.forward();
};
-});
+});
angular.module("umbraco.install").controller("Umbraco.Install.UserController", function($scope, installerService) {
$scope.passwordPattern = /.*/;
@@ -463,6 +463,6 @@ angular.module("umbraco.install").controller("Umbraco.Install.UserController", f
}
};
-});
-
+});
+
})();
\ No newline at end of file
diff --git a/OurUmbraco.Site/umbraco/js/umbraco.resources.js b/OurUmbraco.Site/umbraco/js/umbraco.resources.js
index 9a62fcab..437868e7 100644
--- a/OurUmbraco.Site/umbraco/js/umbraco.resources.js
+++ b/OurUmbraco.Site/umbraco/js/umbraco.resources.js
@@ -1,1318 +1,1318 @@
-/*! umbraco
- * https://github.com/umbraco/umbraco-cms/
- * Copyright (c) 2016 Umbraco HQ;
- * Licensed
- */
-
-(function() {
-
-angular.module("umbraco.resources", []);
-/**
- * @ngdoc service
- * @name umbraco.resources.authResource
- * @description
- * This Resource perfomrs actions to common authentication tasks for the Umbraco backoffice user
- *
- * @requires $q
- * @requires $http
- * @requires umbRequestHelper
- * @requires angularHelper
- */
-function authResource($q, $http, umbRequestHelper, angularHelper) {
-
- return {
-
- /**
- * @ngdoc method
- * @name umbraco.resources.authResource#performLogin
- * @methodOf umbraco.resources.authResource
- *
- * @description
- * Logs the Umbraco backoffice user in if the credentials are good
- *
- * ##usage
- *
- * authResource.performLogin(login, password)
- * .then(function(data) {
- * //Do stuff for login...
- * });
- *
- * @param {string} login Username of backoffice user
- * @param {string} password Password of backoffice user
- * @returns {Promise} resourcePromise object
- *
- */
- performLogin: function (username, password) {
-
- if (!username || !password) {
- return angularHelper.rejectedPromise({
- errorMsg: 'Username or password cannot be empty'
- });
- }
-
- return umbRequestHelper.resourcePromise(
- $http.post(
- umbRequestHelper.getApiUrl(
- "authenticationApiBaseUrl",
- "PostLogin"), {
- username: username,
- password: password
- }),
- 'Login failed for user ' + username);
- },
-
- /**
- * @ngdoc method
- * @name umbraco.resources.authResource#performRequestPasswordReset
- * @methodOf umbraco.resources.authResource
- *
- * @description
- * Checks to see if the provided email address is a valid user account and sends a link
- * to allow them to reset their password
- *
- * ##usage
- *
- * authResource.performRequestPasswordReset(email)
- * .then(function(data) {
- * //Do stuff for password reset request...
- * });
- *
- * @param {string} email Email address of backoffice user
- * @returns {Promise} resourcePromise object
- *
- */
- performRequestPasswordReset: function (email) {
-
- if (!email) {
- return angularHelper.rejectedPromise({
- errorMsg: 'Email address cannot be empty'
- });
- }
-
- //TODO: This validation shouldn't really be done here, the validation on the login dialog
- // is pretty hacky which is why this is here, ideally validation on the login dialog would
- // be done properly.
- var emailRegex = /\S+@\S+\.\S+/;
- if (!emailRegex.test(email)) {
- return angularHelper.rejectedPromise({
- errorMsg: 'Email address is not valid'
- });
- }
-
- return umbRequestHelper.resourcePromise(
- $http.post(
- umbRequestHelper.getApiUrl(
- "authenticationApiBaseUrl",
- "PostRequestPasswordReset"), {
- email: email
- }),
- 'Request password reset failed for email ' + email);
- },
-
- /**
- * @ngdoc method
- * @name umbraco.resources.authResource#performValidatePasswordResetCode
- * @methodOf umbraco.resources.authResource
- *
- * @description
- * Checks to see if the provided password reset code is valid
- *
- * ##usage
- *
- * authResource.performValidatePasswordResetCode(resetCode)
- * .then(function(data) {
- * //Allow reset of password
- * });
- *
- * @param {integer} userId User Id
- * @param {string} resetCode Password reset code
- * @returns {Promise} resourcePromise object
- *
- */
- performValidatePasswordResetCode: function (userId, resetCode) {
-
- if (!userId) {
- return angularHelper.rejectedPromise({
- errorMsg: 'User Id cannot be empty'
- });
- }
-
- if (!resetCode) {
- return angularHelper.rejectedPromise({
- errorMsg: 'Reset code cannot be empty'
- });
- }
-
- return umbRequestHelper.resourcePromise(
- $http.post(
- umbRequestHelper.getApiUrl(
- "authenticationApiBaseUrl",
- "PostValidatePasswordResetCode"),
- {
- userId: userId,
- resetCode: resetCode
- }),
- 'Password reset code validation failed for userId ' + userId + ', code' + resetCode);
- },
-
- /**
- * @ngdoc method
- * @name umbraco.resources.authResource#performSetPassword
- * @methodOf umbraco.resources.authResource
- *
- * @description
- * Checks to see if the provided password reset code is valid and sets the user's password
- *
- * ##usage
- *
- * authResource.performSetPassword(userId, password, confirmPassword, resetCode)
- * .then(function(data) {
- * //Password set
- * });
- *
- * @param {integer} userId User Id
- * @param {string} password New password
- * @param {string} confirmPassword Confirmation of new password
- * @param {string} resetCode Password reset code
- * @returns {Promise} resourcePromise object
- *
- */
- performSetPassword: function (userId, password, confirmPassword, resetCode) {
-
- if (userId === undefined || userId === null) {
- return angularHelper.rejectedPromise({
- errorMsg: 'User Id cannot be empty'
- });
- }
-
- if (!password) {
- return angularHelper.rejectedPromise({
- errorMsg: 'Password cannot be empty'
- });
- }
-
- if (password !== confirmPassword) {
- return angularHelper.rejectedPromise({
- errorMsg: 'Password and confirmation do not match'
- });
- }
-
- if (!resetCode) {
- return angularHelper.rejectedPromise({
- errorMsg: 'Reset code cannot be empty'
- });
- }
-
- return umbRequestHelper.resourcePromise(
- $http.post(
- umbRequestHelper.getApiUrl(
- "authenticationApiBaseUrl",
- "PostSetPassword"),
- {
- userId: userId,
- password: password,
- resetCode: resetCode
- }),
- 'Password reset code validation failed for userId ' + userId);
- },
-
- unlinkLogin: function (loginProvider, providerKey) {
- if (!loginProvider || !providerKey) {
- return angularHelper.rejectedPromise({
- errorMsg: 'loginProvider or providerKey cannot be empty'
- });
- }
-
- return umbRequestHelper.resourcePromise(
- $http.post(
- umbRequestHelper.getApiUrl(
- "authenticationApiBaseUrl",
- "PostUnLinkLogin"), {
- loginProvider: loginProvider,
- providerKey: providerKey
- }),
- 'Unlinking login provider failed');
- },
-
- /**
- * @ngdoc method
- * @name umbraco.resources.authResource#performLogout
- * @methodOf umbraco.resources.authResource
- *
- * @description
- * Logs out the Umbraco backoffice user
- *
- * ##usage
- *
- * authResource.performLogout()
- * .then(function(data) {
- * //Do stuff for logging out...
- * });
- *
- * @returns {Promise} resourcePromise object
- *
- */
- performLogout: function() {
- return umbRequestHelper.resourcePromise(
- $http.post(
- umbRequestHelper.getApiUrl(
- "authenticationApiBaseUrl",
- "PostLogout")));
- },
-
- /**
- * @ngdoc method
- * @name umbraco.resources.authResource#getCurrentUser
- * @methodOf umbraco.resources.authResource
- *
- * @description
- * Sends a request to the server to get the current user details, will return a 401 if the user is not logged in
- *
- * ##usage
- *
- * authResource.getCurrentUser()
- * .then(function(data) {
- * //Do stuff for fetching the current logged in Umbraco backoffice user
- * });
- *
- * @returns {Promise} resourcePromise object
- *
- */
- getCurrentUser: function () {
-
- return umbRequestHelper.resourcePromise(
- $http.get(
- umbRequestHelper.getApiUrl(
- "authenticationApiBaseUrl",
- "GetCurrentUser")),
- 'Server call failed for getting current user');
- },
-
- getCurrentUserLinkedLogins: function () {
-
- return umbRequestHelper.resourcePromise(
- $http.get(
- umbRequestHelper.getApiUrl(
- "authenticationApiBaseUrl",
- "GetCurrentUserLinkedLogins")),
- 'Server call failed for getting current users linked logins');
- },
-
- /**
- * @ngdoc method
- * @name umbraco.resources.authResource#isAuthenticated
- * @methodOf umbraco.resources.authResource
- *
- * @description
- * Checks if the user is logged in or not - does not return 401 or 403
- *
- * ##usage
- *
- * authResource.isAuthenticated()
- * .then(function(data) {
- * //Do stuff to check if user is authenticated
- * });
- *
- * @returns {Promise} resourcePromise object
- *
- */
- isAuthenticated: function () {
-
- return umbRequestHelper.resourcePromise(
- $http.get(
- umbRequestHelper.getApiUrl(
- "authenticationApiBaseUrl",
- "IsAuthenticated")),
- {
- success: function (data, status, headers, config) {
- //if the response is false, they are not logged in so return a rejection
- if (data === false || data === "false") {
- return $q.reject('User is not logged in');
- }
- return data;
- },
- error: function (data, status, headers, config) {
- return {
- errorMsg: 'Server call failed for checking authentication',
- data: data,
- status: status
- };
- }
- });
- },
-
- /**
- * @ngdoc method
- * @name umbraco.resources.authResource#getRemainingTimeoutSeconds
- * @methodOf umbraco.resources.authResource
- *
- * @description
- * Gets the user's remaining seconds before their login times out
- *
- * ##usage
- *
- * authResource.getRemainingTimeoutSeconds()
- * .then(function(data) {
- * //Number of seconds is returned
- * });
- *
- * @returns {Promise} resourcePromise object
- *
- */
- getRemainingTimeoutSeconds: function () {
-
- return umbRequestHelper.resourcePromise(
- $http.get(
- umbRequestHelper.getApiUrl(
- "authenticationApiBaseUrl",
- "GetRemainingTimeoutSeconds")),
- 'Server call failed for checking remaining seconds');
- }
-
- };
-}
-
-angular.module('umbraco.resources').factory('authResource', authResource);
-
-/**
- * @ngdoc service
- * @name umbraco.resources.contentResource
- * @description Handles all transactions of content data
- * from the angular application to the Umbraco database, using the Content WebApi controller
- *
- * all methods returns a resource promise async, so all operations won't complete untill .then() is completed.
- *
- * @requires $q
- * @requires $http
- * @requires umbDataFormatter
- * @requires umbRequestHelper
- *
- * ##usage
- * To use, simply inject the contentResource into any controller or service that needs it, and make
- * sure the umbraco.resources module is accesible - which it should be by default.
- *
- *
- * contentResource.getById(1234)
- * .then(function(data) {
- * $scope.content = data;
- * });
- *
- **/
-
-function contentResource($q, $http, umbDataFormatter, umbRequestHelper) {
-
- /** internal method process the saving of data and post processing the result */
- function saveContentItem(content, action, files) {
- return umbRequestHelper.postSaveContent({
- restApiUrl: umbRequestHelper.getApiUrl(
- "contentApiBaseUrl",
- "PostSave"),
- content: content,
- action: action,
- files: files,
- dataFormatter: function (c, a) {
- return umbDataFormatter.formatContentPostData(c, a);
- }
- });
- }
-
- return {
-
- getRecycleBin: function () {
- return umbRequestHelper.resourcePromise(
- $http.get(
- umbRequestHelper.getApiUrl(
- "contentApiBaseUrl",
- "GetRecycleBin")),
- 'Failed to retrieve data for content recycle bin');
- },
-
- /**
- * @ngdoc method
- * @name umbraco.resources.contentResource#sort
- * @methodOf umbraco.resources.contentResource
- *
- * @description
- * Sorts all children below a given parent node id, based on a collection of node-ids
- *
- * ##usage
- *
- * var ids = [123,34533,2334,23434];
- * contentResource.sort({ parentId: 1244, sortedIds: ids })
- * .then(function() {
- * $scope.complete = true;
- * });
- *
- * @param {Object} args arguments object
- * @param {Int} args.parentId the ID of the parent node
- * @param {Array} options.sortedIds array of node IDs as they should be sorted
- * @returns {Promise} resourcePromise object.
- *
- */
- sort: function (args) {
- if (!args) {
- throw "args cannot be null";
- }
- if (!args.parentId) {
- throw "args.parentId cannot be null";
- }
- if (!args.sortedIds) {
- throw "args.sortedIds cannot be null";
- }
-
- return umbRequestHelper.resourcePromise(
- $http.post(umbRequestHelper.getApiUrl("contentApiBaseUrl", "PostSort"),
- {
- parentId: args.parentId,
- idSortOrder: args.sortedIds
- }),
- 'Failed to sort content');
- },
-
- /**
- * @ngdoc method
- * @name umbraco.resources.contentResource#move
- * @methodOf umbraco.resources.contentResource
- *
- * @description
- * Moves a node underneath a new parentId
- *
- * ##usage
- *
- * contentResource.move({ parentId: 1244, id: 123 })
- * .then(function() {
- * alert("node was moved");
- * }, function(err){
- * alert("node didnt move:" + err.data.Message);
- * });
- *
- * @param {Object} args arguments object
- * @param {Int} args.idd the ID of the node to move
- * @param {Int} args.parentId the ID of the parent node to move to
- * @returns {Promise} resourcePromise object.
- *
- */
- move: function (args) {
- if (!args) {
- throw "args cannot be null";
- }
- if (!args.parentId) {
- throw "args.parentId cannot be null";
- }
- if (!args.id) {
- throw "args.id cannot be null";
- }
-
- return umbRequestHelper.resourcePromise(
- $http.post(umbRequestHelper.getApiUrl("contentApiBaseUrl", "PostMove"),
- {
- parentId: args.parentId,
- id: args.id
- }),
- 'Failed to move content');
- },
-
- /**
- * @ngdoc method
- * @name umbraco.resources.contentResource#copy
- * @methodOf umbraco.resources.contentResource
- *
- * @description
- * Copies a node underneath a new parentId
- *
- * ##usage
- *
- * contentResource.copy({ parentId: 1244, id: 123 })
- * .then(function() {
- * alert("node was copied");
- * }, function(err){
- * alert("node wasnt copy:" + err.data.Message);
- * });
- *
- * @param {Object} args arguments object
- * @param {Int} args.id the ID of the node to copy
- * @param {Int} args.parentId the ID of the parent node to copy to
- * @param {Boolean} args.relateToOriginal if true, relates the copy to the original through the relation api
- * @returns {Promise} resourcePromise object.
- *
- */
- copy: function (args) {
- if (!args) {
- throw "args cannot be null";
- }
- if (!args.parentId) {
- throw "args.parentId cannot be null";
- }
- if (!args.id) {
- throw "args.id cannot be null";
- }
-
- return umbRequestHelper.resourcePromise(
- $http.post(umbRequestHelper.getApiUrl("contentApiBaseUrl", "PostCopy"),
- args),
- 'Failed to copy content');
- },
-
- /**
- * @ngdoc method
- * @name umbraco.resources.contentResource#unPublish
- * @methodOf umbraco.resources.contentResource
- *
- * @description
- * Unpublishes a content item with a given Id
- *
- * ##usage
- *
- * contentResource.unPublish(1234)
- * .then(function() {
- * alert("node was unpulished");
- * }, function(err){
- * alert("node wasnt unpublished:" + err.data.Message);
- * });
- *
- * @param {Int} id the ID of the node to unpublish
- * @returns {Promise} resourcePromise object.
- *
- */
- unPublish: function (id) {
- if (!id) {
- throw "id cannot be null";
- }
-
- return umbRequestHelper.resourcePromise(
- $http.post(
- umbRequestHelper.getApiUrl(
- "contentApiBaseUrl",
- "PostUnPublish",
- [{ id: id }])),
- 'Failed to publish content with id ' + id);
- },
- /**
- * @ngdoc method
- * @name umbraco.resources.contentResource#emptyRecycleBin
- * @methodOf umbraco.resources.contentResource
- *
- * @description
- * Empties the content recycle bin
- *
- * ##usage
- *
- * contentResource.emptyRecycleBin()
- * .then(function() {
- * alert('its empty!');
- * });
- *
- *
- * @returns {Promise} resourcePromise object.
- *
- */
- emptyRecycleBin: function () {
- return umbRequestHelper.resourcePromise(
- $http.post(
- umbRequestHelper.getApiUrl(
- "contentApiBaseUrl",
- "EmptyRecycleBin")),
- 'Failed to empty the recycle bin');
- },
-
- /**
- * @ngdoc method
- * @name umbraco.resources.contentResource#deleteById
- * @methodOf umbraco.resources.contentResource
- *
- * @description
- * Deletes a content item with a given id
- *
- * ##usage
- *
- * contentResource.deleteById(1234)
- * .then(function() {
- * alert('its gone!');
- * });
- *
- *
- * @param {Int} id id of content item to delete
- * @returns {Promise} resourcePromise object.
- *
- */
- deleteById: function (id) {
- return umbRequestHelper.resourcePromise(
- $http.post(
- umbRequestHelper.getApiUrl(
- "contentApiBaseUrl",
- "DeleteById",
- [{ id: id }])),
- 'Failed to delete item ' + id);
- },
-
- /**
- * @ngdoc method
- * @name umbraco.resources.contentResource#getById
- * @methodOf umbraco.resources.contentResource
- *
- * @description
- * Gets a content item with a given id
- *
- * ##usage
- *
- * contentResource.getById(1234)
- * .then(function(content) {
- * var myDoc = content;
- * alert('its here!');
- * });
- *
- *
- * @param {Int} id id of content item to return
- * @returns {Promise} resourcePromise object containing the content item.
- *
- */
- getById: function (id) {
- return umbRequestHelper.resourcePromise(
- $http.get(
- umbRequestHelper.getApiUrl(
- "contentApiBaseUrl",
- "GetById",
- [{ id: id }])),
- 'Failed to retrieve data for content id ' + id);
- },
-
- /**
- * @ngdoc method
- * @name umbraco.resources.contentResource#getByIds
- * @methodOf umbraco.resources.contentResource
- *
- * @description
- * Gets an array of content items, given a collection of ids
- *
- * ##usage
- *
- * contentResource.getByIds( [1234,2526,28262])
- * .then(function(contentArray) {
- * var myDoc = contentArray;
- * alert('they are here!');
- * });
- *
- *
- * @param {Array} ids ids of content items to return as an array
- * @returns {Promise} resourcePromise object containing the content items array.
- *
- */
- getByIds: function (ids) {
-
- var idQuery = "";
- _.each(ids, function (item) {
- idQuery += "ids=" + item + "&";
- });
-
- return umbRequestHelper.resourcePromise(
- $http.get(
- umbRequestHelper.getApiUrl(
- "contentApiBaseUrl",
- "GetByIds",
- idQuery)),
- 'Failed to retrieve data for content with multiple ids');
- },
-
-
- /**
- * @ngdoc method
- * @name umbraco.resources.contentResource#getScaffold
- * @methodOf umbraco.resources.contentResource
- *
- * @description
- * Returns a scaffold of an empty content item, given the id of the content item to place it underneath and the content type alias.
- *
- * - Parent Id must be provided so umbraco knows where to store the content
- * - Content Type alias must be provided so umbraco knows which properties to put on the content scaffold
- *
- * The scaffold is used to build editors for content that has not yet been populated with data.
- *
- * ##usage
- *
- * contentResource.getScaffold(1234, 'homepage')
- * .then(function(scaffold) {
- * var myDoc = scaffold;
- * myDoc.name = "My new document";
- *
- * contentResource.publish(myDoc, true)
- * .then(function(content){
- * alert("Retrieved, updated and published again");
- * });
- * });
- *
- *
- * @param {Int} parentId id of content item to return
- * @param {String} alias contenttype alias to base the scaffold on
- * @returns {Promise} resourcePromise object containing the content scaffold.
- *
- */
- getScaffold: function (parentId, alias) {
-
- return umbRequestHelper.resourcePromise(
- $http.get(
- umbRequestHelper.getApiUrl(
- "contentApiBaseUrl",
- "GetEmpty",
- [{ contentTypeAlias: alias }, { parentId: parentId }])),
- 'Failed to retrieve data for empty content item type ' + alias);
- },
-
- /**
- * @ngdoc method
- * @name umbraco.resources.contentResource#getNiceUrl
- * @methodOf umbraco.resources.contentResource
- *
- * @description
- * Returns a url, given a node ID
- *
- * ##usage
- *
- * contentResource.getNiceUrl(id)
- * .then(function(url) {
- * alert('its here!');
- * });
- *
- *
- * @param {Int} id Id of node to return the public url to
- * @returns {Promise} resourcePromise object containing the url.
- *
- */
- getNiceUrl: function (id) {
- return umbRequestHelper.resourcePromise(
- $http.get(
- umbRequestHelper.getApiUrl(
- "contentApiBaseUrl",
- "GetNiceUrl", [{ id: id }])),
- 'Failed to retrieve url for id:' + id);
- },
-
- /**
- * @ngdoc method
- * @name umbraco.resources.contentResource#getChildren
- * @methodOf umbraco.resources.contentResource
- *
- * @description
- * Gets children of a content item with a given id
- *
- * ##usage
- *
- * contentResource.getChildren(1234, {pageSize: 10, pageNumber: 2})
- * .then(function(contentArray) {
- * var children = contentArray;
- * alert('they are here!');
- * });
- *
- *
- * @param {Int} parentid id of content item to return children of
- * @param {Object} options optional options object
- * @param {Int} options.pageSize if paging data, number of nodes per page, default = 0
- * @param {Int} options.pageNumber if paging data, current page index, default = 0
- * @param {String} options.filter if provided, query will only return those with names matching the filter
- * @param {String} options.orderDirection can be `Ascending` or `Descending` - Default: `Ascending`
- * @param {String} options.orderBy property to order items by, default: `SortOrder`
- * @returns {Promise} resourcePromise object containing an array of content items.
- *
- */
- getChildren: function (parentId, options) {
-
- var defaults = {
- pageSize: 0,
- pageNumber: 0,
- filter: '',
- orderDirection: "Ascending",
- orderBy: "SortOrder",
- orderBySystemField: true
- };
- if (options === undefined) {
- options = {};
- }
- //overwrite the defaults if there are any specified
- angular.extend(defaults, options);
- //now copy back to the options we will use
- options = defaults;
- //change asc/desct
- if (options.orderDirection === "asc") {
- options.orderDirection = "Ascending";
- }
- else if (options.orderDirection === "desc") {
- options.orderDirection = "Descending";
- }
-
- //converts the value to a js bool
- function toBool(v) {
- if (angular.isNumber(v)) {
- return v > 0;
- }
- if (angular.isString(v)) {
- return v === "true";
- }
- if (typeof v === "boolean") {
- return v;
- }
- return false;
- }
-
- return umbRequestHelper.resourcePromise(
- $http.get(
- umbRequestHelper.getApiUrl(
- "contentApiBaseUrl",
- "GetChildren",
- [
- { id: parentId },
- { pageNumber: options.pageNumber },
- { pageSize: options.pageSize },
- { orderBy: options.orderBy },
- { orderDirection: options.orderDirection },
- { orderBySystemField: toBool(options.orderBySystemField) },
- { filter: options.filter }
- ])),
- 'Failed to retrieve children for content item ' + parentId);
- },
-
- /**
- * @ngdoc method
- * @name umbraco.resources.contentResource#hasPermission
- * @methodOf umbraco.resources.contentResource
- *
- * @description
- * Returns true/false given a permission char to check against a nodeID
- * for the current user
- *
- * ##usage
- *
- * contentResource.hasPermission('p',1234)
- * .then(function() {
- * alert('You are allowed to publish this item');
- * });
- *
- *
- * @param {String} permission char representing the permission to check
- * @param {Int} id id of content item to delete
- * @returns {Promise} resourcePromise object.
- *
- */
- checkPermission: function (permission, id) {
- return umbRequestHelper.resourcePromise(
- $http.get(
- umbRequestHelper.getApiUrl(
- "contentApiBaseUrl",
- "HasPermission",
- [{ permissionToCheck: permission }, { nodeId: id }])),
- 'Failed to check permission for item ' + id);
- },
-
- getPermissions: function (nodeIds) {
- return umbRequestHelper.resourcePromise(
- $http.post(
- umbRequestHelper.getApiUrl(
- "contentApiBaseUrl",
- "GetPermissions"),
- nodeIds),
- 'Failed to get permissions');
- },
-
- /**
- * @ngdoc method
- * @name umbraco.resources.contentResource#save
- * @methodOf umbraco.resources.contentResource
- *
- * @description
- * Saves changes made to a content item to its current version, if the content item is new, the isNew paramater must be passed to force creation
- * if the content item needs to have files attached, they must be provided as the files param and passed separately
- *
- *
- * ##usage
- *
- * contentResource.getById(1234)
- * .then(function(content) {
- * content.name = "I want a new name!";
- * contentResource.save(content, false)
- * .then(function(content){
- * alert("Retrieved, updated and saved again");
- * });
- * });
- *
- *
- * @param {Object} content The content item object with changes applied
- * @param {Bool} isNew set to true to create a new item or to update an existing
- * @param {Array} files collection of files for the document
- * @returns {Promise} resourcePromise object containing the saved content item.
- *
- */
- save: function (content, isNew, files) {
- return saveContentItem(content, "save" + (isNew ? "New" : ""), files);
- },
-
-
- /**
- * @ngdoc method
- * @name umbraco.resources.contentResource#publish
- * @methodOf umbraco.resources.contentResource
- *
- * @description
- * Saves and publishes changes made to a content item to a new version, if the content item is new, the isNew paramater must be passed to force creation
- * if the content item needs to have files attached, they must be provided as the files param and passed separately
- *
- *
- * ##usage
- *
- * contentResource.getById(1234)
- * .then(function(content) {
- * content.name = "I want a new name, and be published!";
- * contentResource.publish(content, false)
- * .then(function(content){
- * alert("Retrieved, updated and published again");
- * });
- * });
- *
- *
- * @param {Object} content The content item object with changes applied
- * @param {Bool} isNew set to true to create a new item or to update an existing
- * @param {Array} files collection of files for the document
- * @returns {Promise} resourcePromise object containing the saved content item.
- *
- */
- publish: function (content, isNew, files) {
- return saveContentItem(content, "publish" + (isNew ? "New" : ""), files);
- },
-
-
- /**
- * @ngdoc method
- * @name umbraco.resources.contentResource#sendToPublish
- * @methodOf umbraco.resources.contentResource
- *
- * @description
- * Saves changes made to a content item, and notifies any subscribers about a pending publication
- *
- * ##usage
- *
- * contentResource.getById(1234)
- * .then(function(content) {
- * content.name = "I want a new name, and be published!";
- * contentResource.sendToPublish(content, false)
- * .then(function(content){
- * alert("Retrieved, updated and notication send off");
- * });
- * });
- *
- *
- * @param {Object} content The content item object with changes applied
- * @param {Bool} isNew set to true to create a new item or to update an existing
- * @param {Array} files collection of files for the document
- * @returns {Promise} resourcePromise object containing the saved content item.
- *
- */
- sendToPublish: function (content, isNew, files) {
- return saveContentItem(content, "sendPublish" + (isNew ? "New" : ""), files);
- },
-
- /**
- * @ngdoc method
- * @name umbraco.resources.contentResource#publishByid
- * @methodOf umbraco.resources.contentResource
- *
- * @description
- * Publishes a content item with a given ID
- *
- * ##usage
- *
- * contentResource.publishById(1234)
- * .then(function(content) {
- * alert("published");
- * });
- *
- *
- * @param {Int} id The ID of the conten to publish
- * @returns {Promise} resourcePromise object containing the published content item.
- *
- */
- publishById: function (id) {
-
- if (!id) {
- throw "id cannot be null";
- }
-
- return umbRequestHelper.resourcePromise(
- $http.post(
- umbRequestHelper.getApiUrl(
- "contentApiBaseUrl",
- "PostPublishById",
- [{ id: id }])),
- 'Failed to publish content with id ' + id);
-
- }
-
-
- };
-}
-
-angular.module('umbraco.resources').factory('contentResource', contentResource);
-
-/**
- * @ngdoc service
- * @name umbraco.resources.contentTypeResource
- * @description Loads in data for content types
- **/
-function contentTypeResource($q, $http, umbRequestHelper, umbDataFormatter) {
-
- return {
-
- getCount: function () {
- return umbRequestHelper.resourcePromise(
- $http.get(
- umbRequestHelper.getApiUrl(
- "contentTypeApiBaseUrl",
- "GetCount")),
- 'Failed to retrieve count');
- },
-
- getAvailableCompositeContentTypes: function (contentTypeId, filterContentTypes, filterPropertyTypes) {
- if (!filterContentTypes) {
- filterContentTypes = [];
- }
- if (!filterPropertyTypes) {
- filterPropertyTypes = [];
- }
-
- var query = {
- contentTypeId: contentTypeId,
- filterContentTypes: filterContentTypes,
- filterPropertyTypes: filterPropertyTypes
- };
-
- return umbRequestHelper.resourcePromise(
- $http.post(
- umbRequestHelper.getApiUrl(
- "contentTypeApiBaseUrl",
- "GetAvailableCompositeContentTypes"),
- query),
- 'Failed to retrieve data for content type id ' + contentTypeId);
- },
-
-
- /**
- * @ngdoc method
- * @name umbraco.resources.contentTypeResource#getAllowedTypes
- * @methodOf umbraco.resources.contentTypeResource
- *
- * @description
- * Returns a list of allowed content types underneath a content item with a given ID
- *
- * ##usage
- *
- * contentTypeResource.getAllowedTypes(1234)
- * .then(function(array) {
- * $scope.type = type;
- * });
- *
- * @param {Int} contentTypeId id of the content item to retrive allowed child types for
- * @returns {Promise} resourcePromise object.
- *
- */
- getAllowedTypes: function (contentTypeId) {
-
- return umbRequestHelper.resourcePromise(
- $http.get(
- umbRequestHelper.getApiUrl(
- "contentTypeApiBaseUrl",
- "GetAllowedChildren",
- [{ contentId: contentTypeId }])),
- 'Failed to retrieve data for content id ' + contentTypeId);
- },
-
-
- /**
- * @ngdoc method
- * @name umbraco.resources.contentTypeResource#getAllPropertyTypeAliases
- * @methodOf umbraco.resources.contentTypeResource
- *
- * @description
- * Returns a list of defined property type aliases
- *
- * @returns {Promise} resourcePromise object.
- *
- */
- getAllPropertyTypeAliases: function () {
-
- return umbRequestHelper.resourcePromise(
- $http.get(
- umbRequestHelper.getApiUrl(
- "contentTypeApiBaseUrl",
- "GetAllPropertyTypeAliases")),
- 'Failed to retrieve property type aliases');
- },
-
- getPropertyTypeScaffold : function (id) {
- return umbRequestHelper.resourcePromise(
- $http.get(
- umbRequestHelper.getApiUrl(
- "contentTypeApiBaseUrl",
- "GetPropertyTypeScaffold",
- [{ id: id }])),
- 'Failed to retrieve property type scaffold');
- },
-
- getById: function (id) {
-
- return umbRequestHelper.resourcePromise(
- $http.get(
- umbRequestHelper.getApiUrl(
- "contentTypeApiBaseUrl",
- "GetById",
- [{ id: id }])),
- 'Failed to retrieve content type');
- },
-
- deleteById: function (id) {
-
- return umbRequestHelper.resourcePromise(
- $http.post(
- umbRequestHelper.getApiUrl(
- "contentTypeApiBaseUrl",
- "DeleteById",
- [{ id: id }])),
- 'Failed to delete content type');
- },
-
- deleteContainerById: function (id) {
-
- return umbRequestHelper.resourcePromise(
- $http.post(
- umbRequestHelper.getApiUrl(
- "contentTypeApiBaseUrl",
- "DeleteContainer",
- [{ id: id }])),
- 'Failed to delete content type contaier');
- },
-
- /**
- * @ngdoc method
- * @name umbraco.resources.contentTypeResource#getAll
- * @methodOf umbraco.resources.contentTypeResource
- *
- * @description
- * Returns a list of all content types
- *
- * @returns {Promise} resourcePromise object.
- *
- */
- getAll: function () {
-
- return umbRequestHelper.resourcePromise(
- $http.get(
- umbRequestHelper.getApiUrl(
- "contentTypeApiBaseUrl",
- "GetAll")),
- 'Failed to retrieve all content types');
- },
-
- getScaffold: function (parentId) {
-
- return umbRequestHelper.resourcePromise(
- $http.get(
- umbRequestHelper.getApiUrl(
- "contentTypeApiBaseUrl",
- "GetEmpty", { parentId: parentId })),
- 'Failed to retrieve content type scaffold');
- },
-
- /**
- * @ngdoc method
- * @name umbraco.resources.contentTypeResource#save
- * @methodOf umbraco.resources.contentTypeResource
- *
- * @description
- * Saves or update a content type
- *
- * @param {Object} content data type object to create/update
- * @returns {Promise} resourcePromise object.
- *
- */
- save: function (contentType) {
-
- var saveModel = umbDataFormatter.formatContentTypePostData(contentType);
-
- return umbRequestHelper.resourcePromise(
- $http.post(umbRequestHelper.getApiUrl("contentTypeApiBaseUrl", "PostSave"), saveModel),
- 'Failed to save data for content type id ' + contentType.id);
- },
-
- /**
- * @ngdoc method
- * @name umbraco.resources.contentTypeResource#move
- * @methodOf umbraco.resources.contentTypeResource
- *
- * @description
- * Moves a node underneath a new parentId
- *
- * ##usage
- *
- * contentTypeResource.move({ parentId: 1244, id: 123 })
- * .then(function() {
- * alert("node was moved");
- * }, function(err){
- * alert("node didnt move:" + err.data.Message);
- * });
- *
- * @param {Object} args arguments object
- * @param {Int} args.idd the ID of the node to move
- * @param {Int} args.parentId the ID of the parent node to move to
- * @returns {Promise} resourcePromise object.
- *
- */
- move: function (args) {
- if (!args) {
- throw "args cannot be null";
- }
- if (!args.parentId) {
- throw "args.parentId cannot be null";
- }
- if (!args.id) {
- throw "args.id cannot be null";
- }
-
- return umbRequestHelper.resourcePromise(
- $http.post(umbRequestHelper.getApiUrl("contentTypeApiBaseUrl", "PostMove"),
- {
- parentId: args.parentId,
- id: args.id
- }),
- 'Failed to move content');
- },
-
- copy: function(args) {
- if (!args) {
- throw "args cannot be null";
- }
- if (!args.parentId) {
- throw "args.parentId cannot be null";
- }
- if (!args.id) {
- throw "args.id cannot be null";
- }
-
- return umbRequestHelper.resourcePromise(
- $http.post(umbRequestHelper.getApiUrl("contentTypeApiBaseUrl", "PostCopy"),
- {
- parentId: args.parentId,
- id: args.id
- }),
- 'Failed to copy content');
- },
-
- createContainer: function(parentId, name) {
-
- return umbRequestHelper.resourcePromise(
- $http.post(umbRequestHelper.getApiUrl("contentTypeApiBaseUrl", "PostCreateContainer", { parentId: parentId, name: name })),
- 'Failed to create a folder under parent id ' + parentId);
-
- }
-
- };
-}
-angular.module('umbraco.resources').factory('contentTypeResource', contentTypeResource);
-
+/*! umbraco
+ * https://github.com/umbraco/umbraco-cms/
+ * Copyright (c) 2016 Umbraco HQ;
+ * Licensed
+ */
+
+(function() {
+
+angular.module("umbraco.resources", []);
+/**
+ * @ngdoc service
+ * @name umbraco.resources.authResource
+ * @description
+ * This Resource perfomrs actions to common authentication tasks for the Umbraco backoffice user
+ *
+ * @requires $q
+ * @requires $http
+ * @requires umbRequestHelper
+ * @requires angularHelper
+ */
+function authResource($q, $http, umbRequestHelper, angularHelper) {
+
+ return {
+
+ /**
+ * @ngdoc method
+ * @name umbraco.resources.authResource#performLogin
+ * @methodOf umbraco.resources.authResource
+ *
+ * @description
+ * Logs the Umbraco backoffice user in if the credentials are good
+ *
+ * ##usage
+ *
+ * authResource.performLogin(login, password)
+ * .then(function(data) {
+ * //Do stuff for login...
+ * });
+ *
+ * @param {string} login Username of backoffice user
+ * @param {string} password Password of backoffice user
+ * @returns {Promise} resourcePromise object
+ *
+ */
+ performLogin: function (username, password) {
+
+ if (!username || !password) {
+ return angularHelper.rejectedPromise({
+ errorMsg: 'Username or password cannot be empty'
+ });
+ }
+
+ return umbRequestHelper.resourcePromise(
+ $http.post(
+ umbRequestHelper.getApiUrl(
+ "authenticationApiBaseUrl",
+ "PostLogin"), {
+ username: username,
+ password: password
+ }),
+ 'Login failed for user ' + username);
+ },
+
+ /**
+ * @ngdoc method
+ * @name umbraco.resources.authResource#performRequestPasswordReset
+ * @methodOf umbraco.resources.authResource
+ *
+ * @description
+ * Checks to see if the provided email address is a valid user account and sends a link
+ * to allow them to reset their password
+ *
+ * ##usage
+ *
+ * authResource.performRequestPasswordReset(email)
+ * .then(function(data) {
+ * //Do stuff for password reset request...
+ * });
+ *
+ * @param {string} email Email address of backoffice user
+ * @returns {Promise} resourcePromise object
+ *
+ */
+ performRequestPasswordReset: function (email) {
+
+ if (!email) {
+ return angularHelper.rejectedPromise({
+ errorMsg: 'Email address cannot be empty'
+ });
+ }
+
+ //TODO: This validation shouldn't really be done here, the validation on the login dialog
+ // is pretty hacky which is why this is here, ideally validation on the login dialog would
+ // be done properly.
+ var emailRegex = /\S+@\S+\.\S+/;
+ if (!emailRegex.test(email)) {
+ return angularHelper.rejectedPromise({
+ errorMsg: 'Email address is not valid'
+ });
+ }
+
+ return umbRequestHelper.resourcePromise(
+ $http.post(
+ umbRequestHelper.getApiUrl(
+ "authenticationApiBaseUrl",
+ "PostRequestPasswordReset"), {
+ email: email
+ }),
+ 'Request password reset failed for email ' + email);
+ },
+
+ /**
+ * @ngdoc method
+ * @name umbraco.resources.authResource#performValidatePasswordResetCode
+ * @methodOf umbraco.resources.authResource
+ *
+ * @description
+ * Checks to see if the provided password reset code is valid
+ *
+ * ##usage
+ *
+ * authResource.performValidatePasswordResetCode(resetCode)
+ * .then(function(data) {
+ * //Allow reset of password
+ * });
+ *
+ * @param {integer} userId User Id
+ * @param {string} resetCode Password reset code
+ * @returns {Promise} resourcePromise object
+ *
+ */
+ performValidatePasswordResetCode: function (userId, resetCode) {
+
+ if (!userId) {
+ return angularHelper.rejectedPromise({
+ errorMsg: 'User Id cannot be empty'
+ });
+ }
+
+ if (!resetCode) {
+ return angularHelper.rejectedPromise({
+ errorMsg: 'Reset code cannot be empty'
+ });
+ }
+
+ return umbRequestHelper.resourcePromise(
+ $http.post(
+ umbRequestHelper.getApiUrl(
+ "authenticationApiBaseUrl",
+ "PostValidatePasswordResetCode"),
+ {
+ userId: userId,
+ resetCode: resetCode
+ }),
+ 'Password reset code validation failed for userId ' + userId + ', code' + resetCode);
+ },
+
+ /**
+ * @ngdoc method
+ * @name umbraco.resources.authResource#performSetPassword
+ * @methodOf umbraco.resources.authResource
+ *
+ * @description
+ * Checks to see if the provided password reset code is valid and sets the user's password
+ *
+ * ##usage
+ *
+ * authResource.performSetPassword(userId, password, confirmPassword, resetCode)
+ * .then(function(data) {
+ * //Password set
+ * });
+ *
+ * @param {integer} userId User Id
+ * @param {string} password New password
+ * @param {string} confirmPassword Confirmation of new password
+ * @param {string} resetCode Password reset code
+ * @returns {Promise} resourcePromise object
+ *
+ */
+ performSetPassword: function (userId, password, confirmPassword, resetCode) {
+
+ if (userId === undefined || userId === null) {
+ return angularHelper.rejectedPromise({
+ errorMsg: 'User Id cannot be empty'
+ });
+ }
+
+ if (!password) {
+ return angularHelper.rejectedPromise({
+ errorMsg: 'Password cannot be empty'
+ });
+ }
+
+ if (password !== confirmPassword) {
+ return angularHelper.rejectedPromise({
+ errorMsg: 'Password and confirmation do not match'
+ });
+ }
+
+ if (!resetCode) {
+ return angularHelper.rejectedPromise({
+ errorMsg: 'Reset code cannot be empty'
+ });
+ }
+
+ return umbRequestHelper.resourcePromise(
+ $http.post(
+ umbRequestHelper.getApiUrl(
+ "authenticationApiBaseUrl",
+ "PostSetPassword"),
+ {
+ userId: userId,
+ password: password,
+ resetCode: resetCode
+ }),
+ 'Password reset code validation failed for userId ' + userId);
+ },
+
+ unlinkLogin: function (loginProvider, providerKey) {
+ if (!loginProvider || !providerKey) {
+ return angularHelper.rejectedPromise({
+ errorMsg: 'loginProvider or providerKey cannot be empty'
+ });
+ }
+
+ return umbRequestHelper.resourcePromise(
+ $http.post(
+ umbRequestHelper.getApiUrl(
+ "authenticationApiBaseUrl",
+ "PostUnLinkLogin"), {
+ loginProvider: loginProvider,
+ providerKey: providerKey
+ }),
+ 'Unlinking login provider failed');
+ },
+
+ /**
+ * @ngdoc method
+ * @name umbraco.resources.authResource#performLogout
+ * @methodOf umbraco.resources.authResource
+ *
+ * @description
+ * Logs out the Umbraco backoffice user
+ *
+ * ##usage
+ *
+ * authResource.performLogout()
+ * .then(function(data) {
+ * //Do stuff for logging out...
+ * });
+ *
+ * @returns {Promise} resourcePromise object
+ *
+ */
+ performLogout: function() {
+ return umbRequestHelper.resourcePromise(
+ $http.post(
+ umbRequestHelper.getApiUrl(
+ "authenticationApiBaseUrl",
+ "PostLogout")));
+ },
+
+ /**
+ * @ngdoc method
+ * @name umbraco.resources.authResource#getCurrentUser
+ * @methodOf umbraco.resources.authResource
+ *
+ * @description
+ * Sends a request to the server to get the current user details, will return a 401 if the user is not logged in
+ *
+ * ##usage
+ *
+ * authResource.getCurrentUser()
+ * .then(function(data) {
+ * //Do stuff for fetching the current logged in Umbraco backoffice user
+ * });
+ *
+ * @returns {Promise} resourcePromise object
+ *
+ */
+ getCurrentUser: function () {
+
+ return umbRequestHelper.resourcePromise(
+ $http.get(
+ umbRequestHelper.getApiUrl(
+ "authenticationApiBaseUrl",
+ "GetCurrentUser")),
+ 'Server call failed for getting current user');
+ },
+
+ getCurrentUserLinkedLogins: function () {
+
+ return umbRequestHelper.resourcePromise(
+ $http.get(
+ umbRequestHelper.getApiUrl(
+ "authenticationApiBaseUrl",
+ "GetCurrentUserLinkedLogins")),
+ 'Server call failed for getting current users linked logins');
+ },
+
+ /**
+ * @ngdoc method
+ * @name umbraco.resources.authResource#isAuthenticated
+ * @methodOf umbraco.resources.authResource
+ *
+ * @description
+ * Checks if the user is logged in or not - does not return 401 or 403
+ *
+ * ##usage
+ *
+ * authResource.isAuthenticated()
+ * .then(function(data) {
+ * //Do stuff to check if user is authenticated
+ * });
+ *
+ * @returns {Promise} resourcePromise object
+ *
+ */
+ isAuthenticated: function () {
+
+ return umbRequestHelper.resourcePromise(
+ $http.get(
+ umbRequestHelper.getApiUrl(
+ "authenticationApiBaseUrl",
+ "IsAuthenticated")),
+ {
+ success: function (data, status, headers, config) {
+ //if the response is false, they are not logged in so return a rejection
+ if (data === false || data === "false") {
+ return $q.reject('User is not logged in');
+ }
+ return data;
+ },
+ error: function (data, status, headers, config) {
+ return {
+ errorMsg: 'Server call failed for checking authentication',
+ data: data,
+ status: status
+ };
+ }
+ });
+ },
+
+ /**
+ * @ngdoc method
+ * @name umbraco.resources.authResource#getRemainingTimeoutSeconds
+ * @methodOf umbraco.resources.authResource
+ *
+ * @description
+ * Gets the user's remaining seconds before their login times out
+ *
+ * ##usage
+ *
+ * authResource.getRemainingTimeoutSeconds()
+ * .then(function(data) {
+ * //Number of seconds is returned
+ * });
+ *
+ * @returns {Promise} resourcePromise object
+ *
+ */
+ getRemainingTimeoutSeconds: function () {
+
+ return umbRequestHelper.resourcePromise(
+ $http.get(
+ umbRequestHelper.getApiUrl(
+ "authenticationApiBaseUrl",
+ "GetRemainingTimeoutSeconds")),
+ 'Server call failed for checking remaining seconds');
+ }
+
+ };
+}
+
+angular.module('umbraco.resources').factory('authResource', authResource);
+
+/**
+ * @ngdoc service
+ * @name umbraco.resources.contentResource
+ * @description Handles all transactions of content data
+ * from the angular application to the Umbraco database, using the Content WebApi controller
+ *
+ * all methods returns a resource promise async, so all operations won't complete untill .then() is completed.
+ *
+ * @requires $q
+ * @requires $http
+ * @requires umbDataFormatter
+ * @requires umbRequestHelper
+ *
+ * ##usage
+ * To use, simply inject the contentResource into any controller or service that needs it, and make
+ * sure the umbraco.resources module is accesible - which it should be by default.
+ *
+ *
+ * contentResource.getById(1234)
+ * .then(function(data) {
+ * $scope.content = data;
+ * });
+ *
+ **/
+
+function contentResource($q, $http, umbDataFormatter, umbRequestHelper) {
+
+ /** internal method process the saving of data and post processing the result */
+ function saveContentItem(content, action, files) {
+ return umbRequestHelper.postSaveContent({
+ restApiUrl: umbRequestHelper.getApiUrl(
+ "contentApiBaseUrl",
+ "PostSave"),
+ content: content,
+ action: action,
+ files: files,
+ dataFormatter: function (c, a) {
+ return umbDataFormatter.formatContentPostData(c, a);
+ }
+ });
+ }
+
+ return {
+
+ getRecycleBin: function () {
+ return umbRequestHelper.resourcePromise(
+ $http.get(
+ umbRequestHelper.getApiUrl(
+ "contentApiBaseUrl",
+ "GetRecycleBin")),
+ 'Failed to retrieve data for content recycle bin');
+ },
+
+ /**
+ * @ngdoc method
+ * @name umbraco.resources.contentResource#sort
+ * @methodOf umbraco.resources.contentResource
+ *
+ * @description
+ * Sorts all children below a given parent node id, based on a collection of node-ids
+ *
+ * ##usage
+ *
+ * var ids = [123,34533,2334,23434];
+ * contentResource.sort({ parentId: 1244, sortedIds: ids })
+ * .then(function() {
+ * $scope.complete = true;
+ * });
+ *
+ * @param {Object} args arguments object
+ * @param {Int} args.parentId the ID of the parent node
+ * @param {Array} options.sortedIds array of node IDs as they should be sorted
+ * @returns {Promise} resourcePromise object.
+ *
+ */
+ sort: function (args) {
+ if (!args) {
+ throw "args cannot be null";
+ }
+ if (!args.parentId) {
+ throw "args.parentId cannot be null";
+ }
+ if (!args.sortedIds) {
+ throw "args.sortedIds cannot be null";
+ }
+
+ return umbRequestHelper.resourcePromise(
+ $http.post(umbRequestHelper.getApiUrl("contentApiBaseUrl", "PostSort"),
+ {
+ parentId: args.parentId,
+ idSortOrder: args.sortedIds
+ }),
+ 'Failed to sort content');
+ },
+
+ /**
+ * @ngdoc method
+ * @name umbraco.resources.contentResource#move
+ * @methodOf umbraco.resources.contentResource
+ *
+ * @description
+ * Moves a node underneath a new parentId
+ *
+ * ##usage
+ *
+ * contentResource.move({ parentId: 1244, id: 123 })
+ * .then(function() {
+ * alert("node was moved");
+ * }, function(err){
+ * alert("node didnt move:" + err.data.Message);
+ * });
+ *
+ * @param {Object} args arguments object
+ * @param {Int} args.idd the ID of the node to move
+ * @param {Int} args.parentId the ID of the parent node to move to
+ * @returns {Promise} resourcePromise object.
+ *
+ */
+ move: function (args) {
+ if (!args) {
+ throw "args cannot be null";
+ }
+ if (!args.parentId) {
+ throw "args.parentId cannot be null";
+ }
+ if (!args.id) {
+ throw "args.id cannot be null";
+ }
+
+ return umbRequestHelper.resourcePromise(
+ $http.post(umbRequestHelper.getApiUrl("contentApiBaseUrl", "PostMove"),
+ {
+ parentId: args.parentId,
+ id: args.id
+ }),
+ 'Failed to move content');
+ },
+
+ /**
+ * @ngdoc method
+ * @name umbraco.resources.contentResource#copy
+ * @methodOf umbraco.resources.contentResource
+ *
+ * @description
+ * Copies a node underneath a new parentId
+ *
+ * ##usage
+ *
+ * contentResource.copy({ parentId: 1244, id: 123 })
+ * .then(function() {
+ * alert("node was copied");
+ * }, function(err){
+ * alert("node wasnt copy:" + err.data.Message);
+ * });
+ *
+ * @param {Object} args arguments object
+ * @param {Int} args.id the ID of the node to copy
+ * @param {Int} args.parentId the ID of the parent node to copy to
+ * @param {Boolean} args.relateToOriginal if true, relates the copy to the original through the relation api
+ * @returns {Promise} resourcePromise object.
+ *
+ */
+ copy: function (args) {
+ if (!args) {
+ throw "args cannot be null";
+ }
+ if (!args.parentId) {
+ throw "args.parentId cannot be null";
+ }
+ if (!args.id) {
+ throw "args.id cannot be null";
+ }
+
+ return umbRequestHelper.resourcePromise(
+ $http.post(umbRequestHelper.getApiUrl("contentApiBaseUrl", "PostCopy"),
+ args),
+ 'Failed to copy content');
+ },
+
+ /**
+ * @ngdoc method
+ * @name umbraco.resources.contentResource#unPublish
+ * @methodOf umbraco.resources.contentResource
+ *
+ * @description
+ * Unpublishes a content item with a given Id
+ *
+ * ##usage
+ *
+ * contentResource.unPublish(1234)
+ * .then(function() {
+ * alert("node was unpulished");
+ * }, function(err){
+ * alert("node wasnt unpublished:" + err.data.Message);
+ * });
+ *
+ * @param {Int} id the ID of the node to unpublish
+ * @returns {Promise} resourcePromise object.
+ *
+ */
+ unPublish: function (id) {
+ if (!id) {
+ throw "id cannot be null";
+ }
+
+ return umbRequestHelper.resourcePromise(
+ $http.post(
+ umbRequestHelper.getApiUrl(
+ "contentApiBaseUrl",
+ "PostUnPublish",
+ [{ id: id }])),
+ 'Failed to publish content with id ' + id);
+ },
+ /**
+ * @ngdoc method
+ * @name umbraco.resources.contentResource#emptyRecycleBin
+ * @methodOf umbraco.resources.contentResource
+ *
+ * @description
+ * Empties the content recycle bin
+ *
+ * ##usage
+ *
+ * contentResource.emptyRecycleBin()
+ * .then(function() {
+ * alert('its empty!');
+ * });
+ *
+ *
+ * @returns {Promise} resourcePromise object.
+ *
+ */
+ emptyRecycleBin: function () {
+ return umbRequestHelper.resourcePromise(
+ $http.post(
+ umbRequestHelper.getApiUrl(
+ "contentApiBaseUrl",
+ "EmptyRecycleBin")),
+ 'Failed to empty the recycle bin');
+ },
+
+ /**
+ * @ngdoc method
+ * @name umbraco.resources.contentResource#deleteById
+ * @methodOf umbraco.resources.contentResource
+ *
+ * @description
+ * Deletes a content item with a given id
+ *
+ * ##usage
+ *
+ * contentResource.deleteById(1234)
+ * .then(function() {
+ * alert('its gone!');
+ * });
+ *
+ *
+ * @param {Int} id id of content item to delete
+ * @returns {Promise} resourcePromise object.
+ *
+ */
+ deleteById: function (id) {
+ return umbRequestHelper.resourcePromise(
+ $http.post(
+ umbRequestHelper.getApiUrl(
+ "contentApiBaseUrl",
+ "DeleteById",
+ [{ id: id }])),
+ 'Failed to delete item ' + id);
+ },
+
+ /**
+ * @ngdoc method
+ * @name umbraco.resources.contentResource#getById
+ * @methodOf umbraco.resources.contentResource
+ *
+ * @description
+ * Gets a content item with a given id
+ *
+ * ##usage
+ *
+ * contentResource.getById(1234)
+ * .then(function(content) {
+ * var myDoc = content;
+ * alert('its here!');
+ * });
+ *
+ *
+ * @param {Int} id id of content item to return
+ * @returns {Promise} resourcePromise object containing the content item.
+ *
+ */
+ getById: function (id) {
+ return umbRequestHelper.resourcePromise(
+ $http.get(
+ umbRequestHelper.getApiUrl(
+ "contentApiBaseUrl",
+ "GetById",
+ [{ id: id }])),
+ 'Failed to retrieve data for content id ' + id);
+ },
+
+ /**
+ * @ngdoc method
+ * @name umbraco.resources.contentResource#getByIds
+ * @methodOf umbraco.resources.contentResource
+ *
+ * @description
+ * Gets an array of content items, given a collection of ids
+ *
+ * ##usage
+ *
+ * contentResource.getByIds( [1234,2526,28262])
+ * .then(function(contentArray) {
+ * var myDoc = contentArray;
+ * alert('they are here!');
+ * });
+ *
+ *
+ * @param {Array} ids ids of content items to return as an array
+ * @returns {Promise} resourcePromise object containing the content items array.
+ *
+ */
+ getByIds: function (ids) {
+
+ var idQuery = "";
+ _.each(ids, function (item) {
+ idQuery += "ids=" + item + "&";
+ });
+
+ return umbRequestHelper.resourcePromise(
+ $http.get(
+ umbRequestHelper.getApiUrl(
+ "contentApiBaseUrl",
+ "GetByIds",
+ idQuery)),
+ 'Failed to retrieve data for content with multiple ids');
+ },
+
+
+ /**
+ * @ngdoc method
+ * @name umbraco.resources.contentResource#getScaffold
+ * @methodOf umbraco.resources.contentResource
+ *
+ * @description
+ * Returns a scaffold of an empty content item, given the id of the content item to place it underneath and the content type alias.
+ *
+ * - Parent Id must be provided so umbraco knows where to store the content
+ * - Content Type alias must be provided so umbraco knows which properties to put on the content scaffold
+ *
+ * The scaffold is used to build editors for content that has not yet been populated with data.
+ *
+ * ##usage
+ *
+ * contentResource.getScaffold(1234, 'homepage')
+ * .then(function(scaffold) {
+ * var myDoc = scaffold;
+ * myDoc.name = "My new document";
+ *
+ * contentResource.publish(myDoc, true)
+ * .then(function(content){
+ * alert("Retrieved, updated and published again");
+ * });
+ * });
+ *
+ *
+ * @param {Int} parentId id of content item to return
+ * @param {String} alias contenttype alias to base the scaffold on
+ * @returns {Promise} resourcePromise object containing the content scaffold.
+ *
+ */
+ getScaffold: function (parentId, alias) {
+
+ return umbRequestHelper.resourcePromise(
+ $http.get(
+ umbRequestHelper.getApiUrl(
+ "contentApiBaseUrl",
+ "GetEmpty",
+ [{ contentTypeAlias: alias }, { parentId: parentId }])),
+ 'Failed to retrieve data for empty content item type ' + alias);
+ },
+
+ /**
+ * @ngdoc method
+ * @name umbraco.resources.contentResource#getNiceUrl
+ * @methodOf umbraco.resources.contentResource
+ *
+ * @description
+ * Returns a url, given a node ID
+ *
+ * ##usage
+ *
+ * contentResource.getNiceUrl(id)
+ * .then(function(url) {
+ * alert('its here!');
+ * });
+ *
+ *
+ * @param {Int} id Id of node to return the public url to
+ * @returns {Promise} resourcePromise object containing the url.
+ *
+ */
+ getNiceUrl: function (id) {
+ return umbRequestHelper.resourcePromise(
+ $http.get(
+ umbRequestHelper.getApiUrl(
+ "contentApiBaseUrl",
+ "GetNiceUrl", [{ id: id }])),
+ 'Failed to retrieve url for id:' + id);
+ },
+
+ /**
+ * @ngdoc method
+ * @name umbraco.resources.contentResource#getChildren
+ * @methodOf umbraco.resources.contentResource
+ *
+ * @description
+ * Gets children of a content item with a given id
+ *
+ * ##usage
+ *
+ * contentResource.getChildren(1234, {pageSize: 10, pageNumber: 2})
+ * .then(function(contentArray) {
+ * var children = contentArray;
+ * alert('they are here!');
+ * });
+ *
+ *
+ * @param {Int} parentid id of content item to return children of
+ * @param {Object} options optional options object
+ * @param {Int} options.pageSize if paging data, number of nodes per page, default = 0
+ * @param {Int} options.pageNumber if paging data, current page index, default = 0
+ * @param {String} options.filter if provided, query will only return those with names matching the filter
+ * @param {String} options.orderDirection can be `Ascending` or `Descending` - Default: `Ascending`
+ * @param {String} options.orderBy property to order items by, default: `SortOrder`
+ * @returns {Promise} resourcePromise object containing an array of content items.
+ *
+ */
+ getChildren: function (parentId, options) {
+
+ var defaults = {
+ pageSize: 0,
+ pageNumber: 0,
+ filter: '',
+ orderDirection: "Ascending",
+ orderBy: "SortOrder",
+ orderBySystemField: true
+ };
+ if (options === undefined) {
+ options = {};
+ }
+ //overwrite the defaults if there are any specified
+ angular.extend(defaults, options);
+ //now copy back to the options we will use
+ options = defaults;
+ //change asc/desct
+ if (options.orderDirection === "asc") {
+ options.orderDirection = "Ascending";
+ }
+ else if (options.orderDirection === "desc") {
+ options.orderDirection = "Descending";
+ }
+
+ //converts the value to a js bool
+ function toBool(v) {
+ if (angular.isNumber(v)) {
+ return v > 0;
+ }
+ if (angular.isString(v)) {
+ return v === "true";
+ }
+ if (typeof v === "boolean") {
+ return v;
+ }
+ return false;
+ }
+
+ return umbRequestHelper.resourcePromise(
+ $http.get(
+ umbRequestHelper.getApiUrl(
+ "contentApiBaseUrl",
+ "GetChildren",
+ [
+ { id: parentId },
+ { pageNumber: options.pageNumber },
+ { pageSize: options.pageSize },
+ { orderBy: options.orderBy },
+ { orderDirection: options.orderDirection },
+ { orderBySystemField: toBool(options.orderBySystemField) },
+ { filter: options.filter }
+ ])),
+ 'Failed to retrieve children for content item ' + parentId);
+ },
+
+ /**
+ * @ngdoc method
+ * @name umbraco.resources.contentResource#hasPermission
+ * @methodOf umbraco.resources.contentResource
+ *
+ * @description
+ * Returns true/false given a permission char to check against a nodeID
+ * for the current user
+ *
+ * ##usage
+ *
+ * contentResource.hasPermission('p',1234)
+ * .then(function() {
+ * alert('You are allowed to publish this item');
+ * });
+ *
+ *
+ * @param {String} permission char representing the permission to check
+ * @param {Int} id id of content item to delete
+ * @returns {Promise} resourcePromise object.
+ *
+ */
+ checkPermission: function (permission, id) {
+ return umbRequestHelper.resourcePromise(
+ $http.get(
+ umbRequestHelper.getApiUrl(
+ "contentApiBaseUrl",
+ "HasPermission",
+ [{ permissionToCheck: permission }, { nodeId: id }])),
+ 'Failed to check permission for item ' + id);
+ },
+
+ getPermissions: function (nodeIds) {
+ return umbRequestHelper.resourcePromise(
+ $http.post(
+ umbRequestHelper.getApiUrl(
+ "contentApiBaseUrl",
+ "GetPermissions"),
+ nodeIds),
+ 'Failed to get permissions');
+ },
+
+ /**
+ * @ngdoc method
+ * @name umbraco.resources.contentResource#save
+ * @methodOf umbraco.resources.contentResource
+ *
+ * @description
+ * Saves changes made to a content item to its current version, if the content item is new, the isNew paramater must be passed to force creation
+ * if the content item needs to have files attached, they must be provided as the files param and passed separately
+ *
+ *
+ * ##usage
+ *
+ * contentResource.getById(1234)
+ * .then(function(content) {
+ * content.name = "I want a new name!";
+ * contentResource.save(content, false)
+ * .then(function(content){
+ * alert("Retrieved, updated and saved again");
+ * });
+ * });
+ *
+ *
+ * @param {Object} content The content item object with changes applied
+ * @param {Bool} isNew set to true to create a new item or to update an existing
+ * @param {Array} files collection of files for the document
+ * @returns {Promise} resourcePromise object containing the saved content item.
+ *
+ */
+ save: function (content, isNew, files) {
+ return saveContentItem(content, "save" + (isNew ? "New" : ""), files);
+ },
+
+
+ /**
+ * @ngdoc method
+ * @name umbraco.resources.contentResource#publish
+ * @methodOf umbraco.resources.contentResource
+ *
+ * @description
+ * Saves and publishes changes made to a content item to a new version, if the content item is new, the isNew paramater must be passed to force creation
+ * if the content item needs to have files attached, they must be provided as the files param and passed separately
+ *
+ *
+ * ##usage
+ *
+ * contentResource.getById(1234)
+ * .then(function(content) {
+ * content.name = "I want a new name, and be published!";
+ * contentResource.publish(content, false)
+ * .then(function(content){
+ * alert("Retrieved, updated and published again");
+ * });
+ * });
+ *
+ *
+ * @param {Object} content The content item object with changes applied
+ * @param {Bool} isNew set to true to create a new item or to update an existing
+ * @param {Array} files collection of files for the document
+ * @returns {Promise} resourcePromise object containing the saved content item.
+ *
+ */
+ publish: function (content, isNew, files) {
+ return saveContentItem(content, "publish" + (isNew ? "New" : ""), files);
+ },
+
+
+ /**
+ * @ngdoc method
+ * @name umbraco.resources.contentResource#sendToPublish
+ * @methodOf umbraco.resources.contentResource
+ *
+ * @description
+ * Saves changes made to a content item, and notifies any subscribers about a pending publication
+ *
+ * ##usage
+ *
+ * contentResource.getById(1234)
+ * .then(function(content) {
+ * content.name = "I want a new name, and be published!";
+ * contentResource.sendToPublish(content, false)
+ * .then(function(content){
+ * alert("Retrieved, updated and notication send off");
+ * });
+ * });
+ *
+ *
+ * @param {Object} content The content item object with changes applied
+ * @param {Bool} isNew set to true to create a new item or to update an existing
+ * @param {Array} files collection of files for the document
+ * @returns {Promise} resourcePromise object containing the saved content item.
+ *
+ */
+ sendToPublish: function (content, isNew, files) {
+ return saveContentItem(content, "sendPublish" + (isNew ? "New" : ""), files);
+ },
+
+ /**
+ * @ngdoc method
+ * @name umbraco.resources.contentResource#publishByid
+ * @methodOf umbraco.resources.contentResource
+ *
+ * @description
+ * Publishes a content item with a given ID
+ *
+ * ##usage
+ *
+ * contentResource.publishById(1234)
+ * .then(function(content) {
+ * alert("published");
+ * });
+ *
+ *
+ * @param {Int} id The ID of the conten to publish
+ * @returns {Promise} resourcePromise object containing the published content item.
+ *
+ */
+ publishById: function (id) {
+
+ if (!id) {
+ throw "id cannot be null";
+ }
+
+ return umbRequestHelper.resourcePromise(
+ $http.post(
+ umbRequestHelper.getApiUrl(
+ "contentApiBaseUrl",
+ "PostPublishById",
+ [{ id: id }])),
+ 'Failed to publish content with id ' + id);
+
+ }
+
+
+ };
+}
+
+angular.module('umbraco.resources').factory('contentResource', contentResource);
+
+/**
+ * @ngdoc service
+ * @name umbraco.resources.contentTypeResource
+ * @description Loads in data for content types
+ **/
+function contentTypeResource($q, $http, umbRequestHelper, umbDataFormatter) {
+
+ return {
+
+ getCount: function () {
+ return umbRequestHelper.resourcePromise(
+ $http.get(
+ umbRequestHelper.getApiUrl(
+ "contentTypeApiBaseUrl",
+ "GetCount")),
+ 'Failed to retrieve count');
+ },
+
+ getAvailableCompositeContentTypes: function (contentTypeId, filterContentTypes, filterPropertyTypes) {
+ if (!filterContentTypes) {
+ filterContentTypes = [];
+ }
+ if (!filterPropertyTypes) {
+ filterPropertyTypes = [];
+ }
+
+ var query = {
+ contentTypeId: contentTypeId,
+ filterContentTypes: filterContentTypes,
+ filterPropertyTypes: filterPropertyTypes
+ };
+
+ return umbRequestHelper.resourcePromise(
+ $http.post(
+ umbRequestHelper.getApiUrl(
+ "contentTypeApiBaseUrl",
+ "GetAvailableCompositeContentTypes"),
+ query),
+ 'Failed to retrieve data for content type id ' + contentTypeId);
+ },
+
+
+ /**
+ * @ngdoc method
+ * @name umbraco.resources.contentTypeResource#getAllowedTypes
+ * @methodOf umbraco.resources.contentTypeResource
+ *
+ * @description
+ * Returns a list of allowed content types underneath a content item with a given ID
+ *
+ * ##usage
+ *
+ * contentTypeResource.getAllowedTypes(1234)
+ * .then(function(array) {
+ * $scope.type = type;
+ * });
+ *
+ * @param {Int} contentTypeId id of the content item to retrive allowed child types for
+ * @returns {Promise} resourcePromise object.
+ *
+ */
+ getAllowedTypes: function (contentTypeId) {
+
+ return umbRequestHelper.resourcePromise(
+ $http.get(
+ umbRequestHelper.getApiUrl(
+ "contentTypeApiBaseUrl",
+ "GetAllowedChildren",
+ [{ contentId: contentTypeId }])),
+ 'Failed to retrieve data for content id ' + contentTypeId);
+ },
+
+
+ /**
+ * @ngdoc method
+ * @name umbraco.resources.contentTypeResource#getAllPropertyTypeAliases
+ * @methodOf umbraco.resources.contentTypeResource
+ *
+ * @description
+ * Returns a list of defined property type aliases
+ *
+ * @returns {Promise} resourcePromise object.
+ *
+ */
+ getAllPropertyTypeAliases: function () {
+
+ return umbRequestHelper.resourcePromise(
+ $http.get(
+ umbRequestHelper.getApiUrl(
+ "contentTypeApiBaseUrl",
+ "GetAllPropertyTypeAliases")),
+ 'Failed to retrieve property type aliases');
+ },
+
+ getPropertyTypeScaffold : function (id) {
+ return umbRequestHelper.resourcePromise(
+ $http.get(
+ umbRequestHelper.getApiUrl(
+ "contentTypeApiBaseUrl",
+ "GetPropertyTypeScaffold",
+ [{ id: id }])),
+ 'Failed to retrieve property type scaffold');
+ },
+
+ getById: function (id) {
+
+ return umbRequestHelper.resourcePromise(
+ $http.get(
+ umbRequestHelper.getApiUrl(
+ "contentTypeApiBaseUrl",
+ "GetById",
+ [{ id: id }])),
+ 'Failed to retrieve content type');
+ },
+
+ deleteById: function (id) {
+
+ return umbRequestHelper.resourcePromise(
+ $http.post(
+ umbRequestHelper.getApiUrl(
+ "contentTypeApiBaseUrl",
+ "DeleteById",
+ [{ id: id }])),
+ 'Failed to delete content type');
+ },
+
+ deleteContainerById: function (id) {
+
+ return umbRequestHelper.resourcePromise(
+ $http.post(
+ umbRequestHelper.getApiUrl(
+ "contentTypeApiBaseUrl",
+ "DeleteContainer",
+ [{ id: id }])),
+ 'Failed to delete content type contaier');
+ },
+
+ /**
+ * @ngdoc method
+ * @name umbraco.resources.contentTypeResource#getAll
+ * @methodOf umbraco.resources.contentTypeResource
+ *
+ * @description
+ * Returns a list of all content types
+ *
+ * @returns {Promise} resourcePromise object.
+ *
+ */
+ getAll: function () {
+
+ return umbRequestHelper.resourcePromise(
+ $http.get(
+ umbRequestHelper.getApiUrl(
+ "contentTypeApiBaseUrl",
+ "GetAll")),
+ 'Failed to retrieve all content types');
+ },
+
+ getScaffold: function (parentId) {
+
+ return umbRequestHelper.resourcePromise(
+ $http.get(
+ umbRequestHelper.getApiUrl(
+ "contentTypeApiBaseUrl",
+ "GetEmpty", { parentId: parentId })),
+ 'Failed to retrieve content type scaffold');
+ },
+
+ /**
+ * @ngdoc method
+ * @name umbraco.resources.contentTypeResource#save
+ * @methodOf umbraco.resources.contentTypeResource
+ *
+ * @description
+ * Saves or update a content type
+ *
+ * @param {Object} content data type object to create/update
+ * @returns {Promise} resourcePromise object.
+ *
+ */
+ save: function (contentType) {
+
+ var saveModel = umbDataFormatter.formatContentTypePostData(contentType);
+
+ return umbRequestHelper.resourcePromise(
+ $http.post(umbRequestHelper.getApiUrl("contentTypeApiBaseUrl", "PostSave"), saveModel),
+ 'Failed to save data for content type id ' + contentType.id);
+ },
+
+ /**
+ * @ngdoc method
+ * @name umbraco.resources.contentTypeResource#move
+ * @methodOf umbraco.resources.contentTypeResource
+ *
+ * @description
+ * Moves a node underneath a new parentId
+ *
+ * ##usage
+ *
+ * contentTypeResource.move({ parentId: 1244, id: 123 })
+ * .then(function() {
+ * alert("node was moved");
+ * }, function(err){
+ * alert("node didnt move:" + err.data.Message);
+ * });
+ *
+ * @param {Object} args arguments object
+ * @param {Int} args.idd the ID of the node to move
+ * @param {Int} args.parentId the ID of the parent node to move to
+ * @returns {Promise} resourcePromise object.
+ *
+ */
+ move: function (args) {
+ if (!args) {
+ throw "args cannot be null";
+ }
+ if (!args.parentId) {
+ throw "args.parentId cannot be null";
+ }
+ if (!args.id) {
+ throw "args.id cannot be null";
+ }
+
+ return umbRequestHelper.resourcePromise(
+ $http.post(umbRequestHelper.getApiUrl("contentTypeApiBaseUrl", "PostMove"),
+ {
+ parentId: args.parentId,
+ id: args.id
+ }),
+ 'Failed to move content');
+ },
+
+ copy: function(args) {
+ if (!args) {
+ throw "args cannot be null";
+ }
+ if (!args.parentId) {
+ throw "args.parentId cannot be null";
+ }
+ if (!args.id) {
+ throw "args.id cannot be null";
+ }
+
+ return umbRequestHelper.resourcePromise(
+ $http.post(umbRequestHelper.getApiUrl("contentTypeApiBaseUrl", "PostCopy"),
+ {
+ parentId: args.parentId,
+ id: args.id
+ }),
+ 'Failed to copy content');
+ },
+
+ createContainer: function(parentId, name) {
+
+ return umbRequestHelper.resourcePromise(
+ $http.post(umbRequestHelper.getApiUrl("contentTypeApiBaseUrl", "PostCreateContainer", { parentId: parentId, name: name })),
+ 'Failed to create a folder under parent id ' + parentId);
+
+ }
+
+ };
+}
+angular.module('umbraco.resources').factory('contentTypeResource', contentTypeResource);
+
/**
* @ngdoc service
* @name umbraco.resources.currentUserResource
@@ -1366,7 +1366,7 @@ function currentUserResource($q, $http, umbRequestHelper) {
}
angular.module('umbraco.resources').factory('currentUserResource', currentUserResource);
-
+
/**
* @ngdoc service
* @name umbraco.resources.dashboardResource
@@ -1389,7 +1389,6 @@ function dashboardResource($q, $http, umbRequestHelper) {
*
*/
getDashboard: function (section) {
-
return umbRequestHelper.resourcePromise(
$http.get(
umbRequestHelper.getApiUrl(
@@ -1397,748 +1396,794 @@ function dashboardResource($q, $http, umbRequestHelper) {
"GetDashboard",
[{ section: section }])),
'Failed to get dashboard ' + section);
- }
- };
-}
-
-angular.module('umbraco.resources').factory('dashboardResource', dashboardResource);
-/**
- * @ngdoc service
- * @name umbraco.resources.dataTypeResource
- * @description Loads in data for data types
- **/
-function dataTypeResource($q, $http, umbDataFormatter, umbRequestHelper) {
-
- return {
-
- /**
- * @ngdoc method
- * @name umbraco.resources.dataTypeResource#getPreValues
- * @methodOf umbraco.resources.dataTypeResource
- *
- * @description
- * Retrieves available prevalues for a given data type + editor
- *
- * ##usage
- *
- * dataTypeResource.getPreValues("Umbraco.MediaPicker", 1234)
- * .then(function(prevalues) {
- * alert('its gone!');
- * });
- *
- *
- * @param {String} editorAlias string alias of editor type to retrive prevalues configuration for
- * @param {Int} id id of datatype to retrieve prevalues for
- * @returns {Promise} resourcePromise object.
- *
- */
- getPreValues: function (editorAlias, dataTypeId) {
-
- if (!dataTypeId) {
- dataTypeId = -1;
- }
-
- return umbRequestHelper.resourcePromise(
- $http.get(
- umbRequestHelper.getApiUrl(
- "dataTypeApiBaseUrl",
- "GetPreValues",
- [{ editorAlias: editorAlias }, { dataTypeId: dataTypeId }])),
- "Failed to retrieve pre values for editor alias " + editorAlias);
},
- /**
- * @ngdoc method
- * @name umbraco.resources.dataTypeResource#getById
- * @methodOf umbraco.resources.dataTypeResource
- *
- * @description
- * Gets a data type item with a given id
- *
- * ##usage
- *
- * dataTypeResource.getById(1234)
- * .then(function(datatype) {
- * alert('its here!');
- * });
- *
- *
- * @param {Int} id id of data type to retrieve
- * @returns {Promise} resourcePromise object.
- *
- */
- getById: function (id) {
-
- return umbRequestHelper.resourcePromise(
- $http.get(
- umbRequestHelper.getApiUrl(
- "dataTypeApiBaseUrl",
- "GetById",
- [{ id: id }])),
- "Failed to retrieve data for data type id " + id);
- },
-
- /**
- * @ngdoc method
- * @name umbraco.resources.dataTypeResource#getByName
- * @methodOf umbraco.resources.dataTypeResource
- *
- * @description
- * Gets a data type item with a given name
- *
- * ##usage
- *
- * dataTypeResource.getByName("upload")
- * .then(function(datatype) {
- * alert('its here!');
- * });
- *
- *
- * @param {String} name Name of data type to retrieve
- * @returns {Promise} resourcePromise object.
- *
- */
- getByName: function (name) {
-
- return umbRequestHelper.resourcePromise(
- $http.get(
- umbRequestHelper.getApiUrl(
- "dataTypeApiBaseUrl",
- "GetByName",
- [{ name: name }])),
- "Failed to retrieve data for data type with name: " + name);
- },
-
- getAll: function () {
-
- return umbRequestHelper.resourcePromise(
- $http.get(
- umbRequestHelper.getApiUrl(
- "dataTypeApiBaseUrl",
- "GetAll")),
- "Failed to retrieve data");
- },
-
- getGroupedDataTypes: function () {
- return umbRequestHelper.resourcePromise(
- $http.get(
- umbRequestHelper.getApiUrl(
- "dataTypeApiBaseUrl",
- "GetGroupedDataTypes")),
- "Failed to retrieve data");
- },
-
- getGroupedPropertyEditors : function(){
- return umbRequestHelper.resourcePromise(
- $http.get(
- umbRequestHelper.getApiUrl(
- "dataTypeApiBaseUrl",
- "GetGroupedPropertyEditors")),
- "Failed to retrieve data");
- },
-
- getAllPropertyEditors: function () {
-
- return umbRequestHelper.resourcePromise(
- $http.get(
- umbRequestHelper.getApiUrl(
- "dataTypeApiBaseUrl",
- "GetAllPropertyEditors")),
- "Failed to retrieve data");
- },
-
- /**
- * @ngdoc method
- * @name umbraco.resources.contentResource#getScaffold
- * @methodOf umbraco.resources.contentResource
- *
- * @description
- * Returns a scaffold of an empty data type item
- *
- * The scaffold is used to build editors for data types that has not yet been populated with data.
- *
- * ##usage
- *
- * dataTypeResource.getScaffold()
- * .then(function(scaffold) {
- * var myType = scaffold;
- * myType.name = "My new data type";
- *
- * dataTypeResource.save(myType, myType.preValues, true)
- * .then(function(type){
- * alert("Retrieved, updated and saved again");
- * });
- * });
- *
- *
- * @returns {Promise} resourcePromise object containing the data type scaffold.
- *
- */
- getScaffold: function (parentId) {
-
- return umbRequestHelper.resourcePromise(
- $http.get(
- umbRequestHelper.getApiUrl(
- "dataTypeApiBaseUrl",
- "GetEmpty", { parentId: parentId })),
- "Failed to retrieve data for empty datatype");
- },
- /**
- * @ngdoc method
- * @name umbraco.resources.dataTypeResource#deleteById
- * @methodOf umbraco.resources.dataTypeResource
- *
- * @description
- * Deletes a data type with a given id
- *
- * ##usage
- *
- * dataTypeResource.deleteById(1234)
- * .then(function() {
- * alert('its gone!');
- * });
- *
- *
- * @param {Int} id id of content item to delete
- * @returns {Promise} resourcePromise object.
- *
- */
- deleteById: function(id) {
- return umbRequestHelper.resourcePromise(
- $http.post(
- umbRequestHelper.getApiUrl(
- "dataTypeApiBaseUrl",
- "DeleteById",
- [{ id: id }])),
- "Failed to delete item " + id);
- },
-
- deleteContainerById: function (id) {
-
- return umbRequestHelper.resourcePromise(
- $http.post(
- umbRequestHelper.getApiUrl(
- "dataTypeApiBaseUrl",
- "DeleteContainer",
- [{ id: id }])),
- 'Failed to delete content type contaier');
- },
-
-
-
- /**
- * @ngdoc method
- * @name umbraco.resources.dataTypeResource#getCustomListView
- * @methodOf umbraco.resources.dataTypeResource
- *
- * @description
- * Returns a custom listview, given a content types alias
- *
- *
- * ##usage
- *
- * dataTypeResource.getCustomListView("home")
- * .then(function(listview) {
- * });
- *
- *
- * @returns {Promise} resourcePromise object containing the listview datatype.
- *
- */
-
- getCustomListView: function (contentTypeAlias) {
- return umbRequestHelper.resourcePromise(
- $http.get(
- umbRequestHelper.getApiUrl(
- "dataTypeApiBaseUrl",
- "GetCustomListView",
- { contentTypeAlias: contentTypeAlias }
- )),
- "Failed to retrieve data for custom listview datatype");
- },
-
/**
* @ngdoc method
- * @name umbraco.resources.dataTypeResource#createCustomListView
- * @methodOf umbraco.resources.dataTypeResource
+ * @name umbraco.resources.dashboardResource#getRemoteDashboardContent
+ * @methodOf umbraco.resources.dashboardResource
*
* @description
- * Creates and returns a custom listview, given a content types alias
- *
- * ##usage
- *
- * dataTypeResource.createCustomListView("home")
- * .then(function(listview) {
- * });
- *
- *
- * @returns {Promise} resourcePromise object containing the listview datatype.
+ * Retrieves dashboard content from a remote source for a given section
+ *
+ * @param {string} section Alias of section to retrieve dashboard content for
+ * @returns {Promise} resourcePromise object containing the user array.
*
*/
- createCustomListView: function (contentTypeAlias) {
- return umbRequestHelper.resourcePromise(
- $http.post(
+ getRemoteDashboardContent: function (section, baseurl) {
+
+ //build request values with optional params
+ var values = [{ section: section }];
+ if (baseurl)
+ {
+ values.push({ baseurl: baseurl });
+ }
+
+ return umbRequestHelper.resourcePromise(
+ $http.get(
umbRequestHelper.getApiUrl(
- "dataTypeApiBaseUrl",
- "PostCreateCustomListView",
- { contentTypeAlias: contentTypeAlias }
- )),
- "Failed to create a custom listview datatype");
- },
-
- /**
- * @ngdoc method
- * @name umbraco.resources.dataTypeResource#save
- * @methodOf umbraco.resources.dataTypeResource
- *
- * @description
- * Saves or update a data type
- *
- * @param {Object} dataType data type object to create/update
- * @param {Array} preValues collection of prevalues on the datatype
- * @param {Bool} isNew set to true if type should be create instead of updated
- * @returns {Promise} resourcePromise object.
- *
- */
- save: function (dataType, preValues, isNew) {
-
- var saveModel = umbDataFormatter.formatDataTypePostData(dataType, preValues, "save" + (isNew ? "New" : ""));
-
- return umbRequestHelper.resourcePromise(
- $http.post(umbRequestHelper.getApiUrl("dataTypeApiBaseUrl", "PostSave"), saveModel),
- "Failed to save data for data type id " + dataType.id);
+ "dashboardApiBaseUrl",
+ "GetRemoteDashboardContent",
+ values)), "Failed to get dashboard content");
},
- /**
- * @ngdoc method
- * @name umbraco.resources.dataTypeResource#move
- * @methodOf umbraco.resources.dataTypeResource
- *
- * @description
- * Moves a node underneath a new parentId
- *
- * ##usage
- *
- * dataTypeResource.move({ parentId: 1244, id: 123 })
- * .then(function() {
- * alert("node was moved");
- * }, function(err){
- * alert("node didnt move:" + err.data.Message);
- * });
- *
- * @param {Object} args arguments object
- * @param {Int} args.idd the ID of the node to move
- * @param {Int} args.parentId the ID of the parent node to move to
- * @returns {Promise} resourcePromise object.
- *
- */
- move: function (args) {
- if (!args) {
- throw "args cannot be null";
- }
- if (!args.parentId) {
- throw "args.parentId cannot be null";
- }
- if (!args.id) {
- throw "args.id cannot be null";
+ getRemoteDashboardCssUrl: function (section, baseurl) {
+
+ //build request values with optional params
+ var values = [{ section: section }];
+ if (baseurl) {
+ values.push({ baseurl: baseurl });
}
- return umbRequestHelper.resourcePromise(
- $http.post(umbRequestHelper.getApiUrl("dataTypeApiBaseUrl", "PostMove"),
- {
- parentId: args.parentId,
- id: args.id
- }),
- 'Failed to move content');
- },
-
- createContainer: function (parentId, name) {
-
- return umbRequestHelper.resourcePromise(
- $http.post(
- umbRequestHelper.getApiUrl(
- "dataTypeApiBaseUrl",
- "PostCreateContainer",
- { parentId: parentId, name: name })),
- 'Failed to create a folder under parent id ' + parentId);
+ return umbRequestHelper.getApiUrl(
+ "dashboardApiBaseUrl",
+ "GetRemoteDashboardCss",
+ values);
}
+
+
+
};
}
-angular.module("umbraco.resources").factory("dataTypeResource", dataTypeResource);
-
-/**
- * @ngdoc service
- * @name umbraco.resources.entityResource
- * @description Loads in basic data for all entities
- *
- * ##What is an entity?
- * An entity is a basic **read-only** representation of an Umbraco node. It contains only the most
- * basic properties used to display the item in trees, lists and navigation.
- *
- * ##What is the difference between entity and content/media/etc...?
- * the entity only contains the basic node data, name, id and guid, whereas content
- * nodes fetched through the content service also contains additional all of the content property data, etc..
- * This is the same principal for all entity types. Any user that is logged in to the back office will have access
- * to view the basic entity information for all entities since the basic entity information does not contain sensitive information.
- *
- * ##Entity object types?
- * You need to specify the type of object you want returned.
- *
- * The core object types are:
- *
- * - Document
- * - Media
- * - Member
- * - Template
- * - DocumentType
- * - MediaType
- * - MemberType
- * - Macro
- * - User
- * - Language
- * - Domain
- * - DataType
- **/
-function entityResource($q, $http, umbRequestHelper) {
-
- //the factory object returned
- return {
-
- getSafeAlias: function (value, camelCase) {
-
- return umbRequestHelper.resourcePromise(
- $http.get(
- umbRequestHelper.getApiUrl(
- "entityApiBaseUrl",
- "GetSafeAlias", { value: value, camelCase: camelCase })),
- 'Failed to retrieve content type scaffold');
- },
-
- /**
- * @ngdoc method
- * @name umbraco.resources.entityResource#getPath
- * @methodOf umbraco.resources.entityResource
- *
- * @description
- * Returns a path, given a node ID and type
- *
- * ##usage
- *
- * entityResource.getPath(id)
- * .then(function(pathArray) {
- * alert('its here!');
- * });
- *
- *
- * @param {Int} id Id of node to return the public url to
- * @param {string} type Object type name
- * @returns {Promise} resourcePromise object containing the url.
- *
- */
- getPath: function (id, type) {
- return umbRequestHelper.resourcePromise(
- $http.get(
- umbRequestHelper.getApiUrl(
- "entityApiBaseUrl",
- "GetPath",
- [{ id: id }, {type: type }])),
- 'Failed to retrieve path for id:' + id);
- },
-
- /**
- * @ngdoc method
- * @name umbraco.resources.entityResource#getById
- * @methodOf umbraco.resources.entityResource
- *
- * @description
- * Gets an entity with a given id
- *
- * ##usage
- *
- * //get media by id
- * entityResource.getEntityById(0, "Media")
- * .then(function(ent) {
- * var myDoc = ent;
- * alert('its here!');
- * });
- *
- *
- * @param {Int} id id of entity to return
- * @param {string} type Object type name
- * @returns {Promise} resourcePromise object containing the entity.
- *
- */
- getById: function (id, type) {
- return umbRequestHelper.resourcePromise(
- $http.get(
- umbRequestHelper.getApiUrl(
- "entityApiBaseUrl",
- "GetById",
- [{ id: id}, {type: type }])),
- 'Failed to retrieve entity data for id ' + id);
- },
-
- /**
- * @ngdoc method
- * @name umbraco.resources.entityResource#getByIds
- * @methodOf umbraco.resources.entityResource
- *
- * @description
- * Gets an array of entities, given a collection of ids
- *
- * ##usage
- *
- * //Get templates for ids
- * entityResource.getEntitiesByIds( [1234,2526,28262], "Template")
- * .then(function(templateArray) {
- * var myDoc = contentArray;
- * alert('they are here!');
- * });
- *
- *
- * @param {Array} ids ids of entities to return as an array
- * @param {string} type type name
- * @returns {Promise} resourcePromise object containing the entity array.
- *
- */
- getByIds: function (ids, type) {
-
- var query = "";
- _.each(ids, function(item) {
- query += "ids=" + item + "&";
- });
-
+angular.module('umbraco.resources').factory('dashboardResource', dashboardResource);
+/**
+ * @ngdoc service
+ * @name umbraco.resources.dataTypeResource
+ * @description Loads in data for data types
+ **/
+function dataTypeResource($q, $http, umbDataFormatter, umbRequestHelper) {
+
+ return {
+
+ /**
+ * @ngdoc method
+ * @name umbraco.resources.dataTypeResource#getPreValues
+ * @methodOf umbraco.resources.dataTypeResource
+ *
+ * @description
+ * Retrieves available prevalues for a given data type + editor
+ *
+ * ##usage
+ *
+ * dataTypeResource.getPreValues("Umbraco.MediaPicker", 1234)
+ * .then(function(prevalues) {
+ * alert('its gone!');
+ * });
+ *
+ *
+ * @param {String} editorAlias string alias of editor type to retrive prevalues configuration for
+ * @param {Int} id id of datatype to retrieve prevalues for
+ * @returns {Promise} resourcePromise object.
+ *
+ */
+ getPreValues: function (editorAlias, dataTypeId) {
+
+ if (!dataTypeId) {
+ dataTypeId = -1;
+ }
+
+ return umbRequestHelper.resourcePromise(
+ $http.get(
+ umbRequestHelper.getApiUrl(
+ "dataTypeApiBaseUrl",
+ "GetPreValues",
+ [{ editorAlias: editorAlias }, { dataTypeId: dataTypeId }])),
+ "Failed to retrieve pre values for editor alias " + editorAlias);
+ },
+
+ /**
+ * @ngdoc method
+ * @name umbraco.resources.dataTypeResource#getById
+ * @methodOf umbraco.resources.dataTypeResource
+ *
+ * @description
+ * Gets a data type item with a given id
+ *
+ * ##usage
+ *
+ * dataTypeResource.getById(1234)
+ * .then(function(datatype) {
+ * alert('its here!');
+ * });
+ *
+ *
+ * @param {Int} id id of data type to retrieve
+ * @returns {Promise} resourcePromise object.
+ *
+ */
+ getById: function (id) {
+
+ return umbRequestHelper.resourcePromise(
+ $http.get(
+ umbRequestHelper.getApiUrl(
+ "dataTypeApiBaseUrl",
+ "GetById",
+ [{ id: id }])),
+ "Failed to retrieve data for data type id " + id);
+ },
+
+ /**
+ * @ngdoc method
+ * @name umbraco.resources.dataTypeResource#getByName
+ * @methodOf umbraco.resources.dataTypeResource
+ *
+ * @description
+ * Gets a data type item with a given name
+ *
+ * ##usage
+ *
+ * dataTypeResource.getByName("upload")
+ * .then(function(datatype) {
+ * alert('its here!');
+ * });
+ *
+ *
+ * @param {String} name Name of data type to retrieve
+ * @returns {Promise} resourcePromise object.
+ *
+ */
+ getByName: function (name) {
+
+ return umbRequestHelper.resourcePromise(
+ $http.get(
+ umbRequestHelper.getApiUrl(
+ "dataTypeApiBaseUrl",
+ "GetByName",
+ [{ name: name }])),
+ "Failed to retrieve data for data type with name: " + name);
+ },
+
+ getAll: function () {
+
+ return umbRequestHelper.resourcePromise(
+ $http.get(
+ umbRequestHelper.getApiUrl(
+ "dataTypeApiBaseUrl",
+ "GetAll")),
+ "Failed to retrieve data");
+ },
+
+ getGroupedDataTypes: function () {
+ return umbRequestHelper.resourcePromise(
+ $http.get(
+ umbRequestHelper.getApiUrl(
+ "dataTypeApiBaseUrl",
+ "GetGroupedDataTypes")),
+ "Failed to retrieve data");
+ },
+
+ getGroupedPropertyEditors : function(){
+ return umbRequestHelper.resourcePromise(
+ $http.get(
+ umbRequestHelper.getApiUrl(
+ "dataTypeApiBaseUrl",
+ "GetGroupedPropertyEditors")),
+ "Failed to retrieve data");
+ },
+
+ getAllPropertyEditors: function () {
+
+ return umbRequestHelper.resourcePromise(
+ $http.get(
+ umbRequestHelper.getApiUrl(
+ "dataTypeApiBaseUrl",
+ "GetAllPropertyEditors")),
+ "Failed to retrieve data");
+ },
+
+ /**
+ * @ngdoc method
+ * @name umbraco.resources.contentResource#getScaffold
+ * @methodOf umbraco.resources.contentResource
+ *
+ * @description
+ * Returns a scaffold of an empty data type item
+ *
+ * The scaffold is used to build editors for data types that has not yet been populated with data.
+ *
+ * ##usage
+ *
+ * dataTypeResource.getScaffold()
+ * .then(function(scaffold) {
+ * var myType = scaffold;
+ * myType.name = "My new data type";
+ *
+ * dataTypeResource.save(myType, myType.preValues, true)
+ * .then(function(type){
+ * alert("Retrieved, updated and saved again");
+ * });
+ * });
+ *
+ *
+ * @returns {Promise} resourcePromise object containing the data type scaffold.
+ *
+ */
+ getScaffold: function (parentId) {
+
+ return umbRequestHelper.resourcePromise(
+ $http.get(
+ umbRequestHelper.getApiUrl(
+ "dataTypeApiBaseUrl",
+ "GetEmpty", { parentId: parentId })),
+ "Failed to retrieve data for empty datatype");
+ },
+ /**
+ * @ngdoc method
+ * @name umbraco.resources.dataTypeResource#deleteById
+ * @methodOf umbraco.resources.dataTypeResource
+ *
+ * @description
+ * Deletes a data type with a given id
+ *
+ * ##usage
+ *
+ * dataTypeResource.deleteById(1234)
+ * .then(function() {
+ * alert('its gone!');
+ * });
+ *
+ *
+ * @param {Int} id id of content item to delete
+ * @returns {Promise} resourcePromise object.
+ *
+ */
+ deleteById: function(id) {
+ return umbRequestHelper.resourcePromise(
+ $http.post(
+ umbRequestHelper.getApiUrl(
+ "dataTypeApiBaseUrl",
+ "DeleteById",
+ [{ id: id }])),
+ "Failed to delete item " + id);
+ },
+
+ deleteContainerById: function (id) {
+
+ return umbRequestHelper.resourcePromise(
+ $http.post(
+ umbRequestHelper.getApiUrl(
+ "dataTypeApiBaseUrl",
+ "DeleteContainer",
+ [{ id: id }])),
+ 'Failed to delete content type contaier');
+ },
+
+
+
+ /**
+ * @ngdoc method
+ * @name umbraco.resources.dataTypeResource#getCustomListView
+ * @methodOf umbraco.resources.dataTypeResource
+ *
+ * @description
+ * Returns a custom listview, given a content types alias
+ *
+ *
+ * ##usage
+ *
+ * dataTypeResource.getCustomListView("home")
+ * .then(function(listview) {
+ * });
+ *
+ *
+ * @returns {Promise} resourcePromise object containing the listview datatype.
+ *
+ */
+
+ getCustomListView: function (contentTypeAlias) {
+ return umbRequestHelper.resourcePromise(
+ $http.get(
+ umbRequestHelper.getApiUrl(
+ "dataTypeApiBaseUrl",
+ "GetCustomListView",
+ { contentTypeAlias: contentTypeAlias }
+ )),
+ "Failed to retrieve data for custom listview datatype");
+ },
+
+ /**
+ * @ngdoc method
+ * @name umbraco.resources.dataTypeResource#createCustomListView
+ * @methodOf umbraco.resources.dataTypeResource
+ *
+ * @description
+ * Creates and returns a custom listview, given a content types alias
+ *
+ * ##usage
+ *
+ * dataTypeResource.createCustomListView("home")
+ * .then(function(listview) {
+ * });
+ *
+ *
+ * @returns {Promise} resourcePromise object containing the listview datatype.
+ *
+ */
+ createCustomListView: function (contentTypeAlias) {
+ return umbRequestHelper.resourcePromise(
+ $http.post(
+ umbRequestHelper.getApiUrl(
+ "dataTypeApiBaseUrl",
+ "PostCreateCustomListView",
+ { contentTypeAlias: contentTypeAlias }
+ )),
+ "Failed to create a custom listview datatype");
+ },
+
+ /**
+ * @ngdoc method
+ * @name umbraco.resources.dataTypeResource#save
+ * @methodOf umbraco.resources.dataTypeResource
+ *
+ * @description
+ * Saves or update a data type
+ *
+ * @param {Object} dataType data type object to create/update
+ * @param {Array} preValues collection of prevalues on the datatype
+ * @param {Bool} isNew set to true if type should be create instead of updated
+ * @returns {Promise} resourcePromise object.
+ *
+ */
+ save: function (dataType, preValues, isNew) {
+
+ var saveModel = umbDataFormatter.formatDataTypePostData(dataType, preValues, "save" + (isNew ? "New" : ""));
+
+ return umbRequestHelper.resourcePromise(
+ $http.post(umbRequestHelper.getApiUrl("dataTypeApiBaseUrl", "PostSave"), saveModel),
+ "Failed to save data for data type id " + dataType.id);
+ },
+
+ /**
+ * @ngdoc method
+ * @name umbraco.resources.dataTypeResource#move
+ * @methodOf umbraco.resources.dataTypeResource
+ *
+ * @description
+ * Moves a node underneath a new parentId
+ *
+ * ##usage
+ *
+ * dataTypeResource.move({ parentId: 1244, id: 123 })
+ * .then(function() {
+ * alert("node was moved");
+ * }, function(err){
+ * alert("node didnt move:" + err.data.Message);
+ * });
+ *
+ * @param {Object} args arguments object
+ * @param {Int} args.idd the ID of the node to move
+ * @param {Int} args.parentId the ID of the parent node to move to
+ * @returns {Promise} resourcePromise object.
+ *
+ */
+ move: function (args) {
+ if (!args) {
+ throw "args cannot be null";
+ }
+ if (!args.parentId) {
+ throw "args.parentId cannot be null";
+ }
+ if (!args.id) {
+ throw "args.id cannot be null";
+ }
+
+ return umbRequestHelper.resourcePromise(
+ $http.post(umbRequestHelper.getApiUrl("dataTypeApiBaseUrl", "PostMove"),
+ {
+ parentId: args.parentId,
+ id: args.id
+ }),
+ 'Failed to move content');
+ },
+
+ createContainer: function (parentId, name) {
+
+ return umbRequestHelper.resourcePromise(
+ $http.post(
+ umbRequestHelper.getApiUrl(
+ "dataTypeApiBaseUrl",
+ "PostCreateContainer",
+ { parentId: parentId, name: name })),
+ 'Failed to create a folder under parent id ' + parentId);
+ }
+ };
+}
+
+angular.module("umbraco.resources").factory("dataTypeResource", dataTypeResource);
+
+/**
+ * @ngdoc service
+ * @name umbraco.resources.entityResource
+ * @description Loads in basic data for all entities
+ *
+ * ##What is an entity?
+ * An entity is a basic **read-only** representation of an Umbraco node. It contains only the most
+ * basic properties used to display the item in trees, lists and navigation.
+ *
+ * ##What is the difference between entity and content/media/etc...?
+ * the entity only contains the basic node data, name, id and guid, whereas content
+ * nodes fetched through the content service also contains additional all of the content property data, etc..
+ * This is the same principal for all entity types. Any user that is logged in to the back office will have access
+ * to view the basic entity information for all entities since the basic entity information does not contain sensitive information.
+ *
+ * ##Entity object types?
+ * You need to specify the type of object you want returned.
+ *
+ * The core object types are:
+ *
+ * - Document
+ * - Media
+ * - Member
+ * - Template
+ * - DocumentType
+ * - MediaType
+ * - MemberType
+ * - Macro
+ * - User
+ * - Language
+ * - Domain
+ * - DataType
+ **/
+function entityResource($q, $http, umbRequestHelper) {
+
+ //the factory object returned
+ return {
+
+ getSafeAlias: function (value, camelCase) {
+
+ return umbRequestHelper.resourcePromise(
+ $http.get(
+ umbRequestHelper.getApiUrl(
+ "entityApiBaseUrl",
+ "GetSafeAlias", { value: value, camelCase: camelCase })),
+ 'Failed to retrieve content type scaffold');
+ },
+
+ /**
+ * @ngdoc method
+ * @name umbraco.resources.entityResource#getPath
+ * @methodOf umbraco.resources.entityResource
+ *
+ * @description
+ * Returns a path, given a node ID and type
+ *
+ * ##usage
+ *
+ * entityResource.getPath(id)
+ * .then(function(pathArray) {
+ * alert('its here!');
+ * });
+ *
+ *
+ * @param {Int} id Id of node to return the public url to
+ * @param {string} type Object type name
+ * @returns {Promise} resourcePromise object containing the url.
+ *
+ */
+ getPath: function (id, type) {
+ return umbRequestHelper.resourcePromise(
+ $http.get(
+ umbRequestHelper.getApiUrl(
+ "entityApiBaseUrl",
+ "GetPath",
+ [{ id: id }, {type: type }])),
+ 'Failed to retrieve path for id:' + id);
+ },
+
+ /**
+ * @ngdoc method
+ * @name umbraco.resources.entityResource#getById
+ * @methodOf umbraco.resources.entityResource
+ *
+ * @description
+ * Gets an entity with a given id
+ *
+ * ##usage
+ *
+ * //get media by id
+ * entityResource.getEntityById(0, "Media")
+ * .then(function(ent) {
+ * var myDoc = ent;
+ * alert('its here!');
+ * });
+ *
+ *
+ * @param {Int} id id of entity to return
+ * @param {string} type Object type name
+ * @returns {Promise} resourcePromise object containing the entity.
+ *
+ */
+ getById: function (id, type) {
+ return umbRequestHelper.resourcePromise(
+ $http.get(
+ umbRequestHelper.getApiUrl(
+ "entityApiBaseUrl",
+ "GetById",
+ [{ id: id}, {type: type }])),
+ 'Failed to retrieve entity data for id ' + id);
+ },
+
+ /**
+ * @ngdoc method
+ * @name umbraco.resources.entityResource#getByIds
+ * @methodOf umbraco.resources.entityResource
+ *
+ * @description
+ * Gets an array of entities, given a collection of ids
+ *
+ * ##usage
+ *
+ * //Get templates for ids
+ * entityResource.getEntitiesByIds( [1234,2526,28262], "Template")
+ * .then(function(templateArray) {
+ * var myDoc = contentArray;
+ * alert('they are here!');
+ * });
+ *
+ *
+ * @param {Array} ids ids of entities to return as an array
+ * @param {string} type type name
+ * @returns {Promise} resourcePromise object containing the entity array.
+ *
+ */
+ getByIds: function (ids, type) {
+
+ var query = "";
+ _.each(ids, function(item) {
+ query += "ids=" + item + "&";
+ });
+
// if ids array is empty we need a empty variable in the querystring otherwise the service returns a error
- if (ids.length === 0) {
- query += "ids=&";
- }
-
- query += "type=" + type;
-
- return umbRequestHelper.resourcePromise(
- $http.get(
- umbRequestHelper.getApiUrl(
- "entityApiBaseUrl",
- "GetByIds",
- query)),
- 'Failed to retrieve entity data for ids ' + ids);
- },
-
- /**
- * @ngdoc method
- * @name umbraco.resources.entityResource#getByQuery
- * @methodOf umbraco.resources.entityResource
- *
- * @description
- * Gets an entity from a given xpath
- *
- * ##usage
- *
- * //get content by xpath
- * entityResource.getByQuery("$current", -1, "Document")
- * .then(function(ent) {
- * var myDoc = ent;
- * alert('its here!');
- * });
- *
- *
- * @param {string} query xpath to use in query
- * @param {Int} nodeContextId id id to start from
- * @param {string} type Object type name
- * @returns {Promise} resourcePromise object containing the entity.
- *
- */
- getByQuery: function (query, nodeContextId, type) {
- return umbRequestHelper.resourcePromise(
- $http.get(
- umbRequestHelper.getApiUrl(
- "entityApiBaseUrl",
- "GetByQuery",
- [{ query: query }, { nodeContextId: nodeContextId }, { type: type }])),
- 'Failed to retrieve entity data for query ' + query);
- },
-
- /**
- * @ngdoc method
- * @name umbraco.resources.entityResource#getAll
- * @methodOf umbraco.resources.entityResource
- *
- * @description
- * Gets an entity with a given id
- *
- * ##usage
- *
- *
- * //Only return media
- * entityResource.getAll("Media")
- * .then(function(ent) {
- * var myDoc = ent;
- * alert('its here!');
- * });
- *
- *
- * @param {string} type Object type name
- * @param {string} postFilter optional filter expression which will execute a dynamic where clause on the server
- * @param {string} postFilterParams optional parameters for the postFilter expression
- * @returns {Promise} resourcePromise object containing the entity.
- *
- */
- getAll: function (type, postFilter, postFilterParams) {
-
- //need to build the query string manually
- var query = "type=" + type + "&postFilter=" + (postFilter ? postFilter : "");
- if (postFilter && postFilterParams) {
- var counter = 0;
- _.each(postFilterParams, function(val, key) {
- query += "&postFilterParams[" + counter + "].key=" + key + "&postFilterParams[" + counter + "].value=" + val;
- counter++;
- });
- }
-
- return umbRequestHelper.resourcePromise(
- $http.get(
- umbRequestHelper.getApiUrl(
- "entityApiBaseUrl",
- "GetAll",
- query)),
- 'Failed to retrieve entity data for type ' + type);
- },
-
- /**
- * @ngdoc method
- * @name umbraco.resources.entityResource#getAncestors
- * @methodOf umbraco.resources.entityResource
- *
- * @description
- * Gets ancestor entities for a given item
- *
- *
- * @param {string} type Object type name
- * @returns {Promise} resourcePromise object containing the entity.
- *
- */
- getAncestors: function (id, type) {
- return umbRequestHelper.resourcePromise(
- $http.get(
- umbRequestHelper.getApiUrl(
- "entityApiBaseUrl",
- "GetAncestors",
- [{id: id}, {type: type}])),
- 'Failed to retrieve ancestor data for id ' + id);
- },
-
- /**
- * @ngdoc method
- * @name umbraco.resources.entityResource#getAncestors
- * @methodOf umbraco.resources.entityResource
- *
- * @description
- * Gets children entities for a given item
- *
- *
- * @param {string} type Object type name
- * @returns {Promise} resourcePromise object containing the entity.
- *
- */
- getChildren: function (id, type) {
- return umbRequestHelper.resourcePromise(
- $http.get(
- umbRequestHelper.getApiUrl(
- "entityApiBaseUrl",
- "GetChildren",
- [{ id: id }, { type: type }])),
- 'Failed to retrieve child data for id ' + id);
- },
-
- /**
- * @ngdoc method
- * @name umbraco.resources.entityResource#search
- * @methodOf umbraco.resources.entityResource
- *
- * @description
- * Gets an array of entities, given a lucene query and a type
- *
- * ##usage
- *
- * entityResource.search("news", "Media")
- * .then(function(mediaArray) {
- * var myDoc = mediaArray;
- * alert('they are here!');
- * });
- *
- *
- * @param {String} Query search query
- * @param {String} Type type of conten to search
- * @returns {Promise} resourcePromise object containing the entity array.
- *
- */
- search: function (query, type, searchFrom, canceler) {
-
- var args = [{ query: query }, { type: type }];
- if (searchFrom) {
- args.push({ searchFrom: searchFrom });
- }
-
- var httpConfig = {};
- if (canceler) {
- httpConfig["timeout"] = canceler;
- }
-
- return umbRequestHelper.resourcePromise(
- $http.get(
- umbRequestHelper.getApiUrl(
- "entityApiBaseUrl",
- "Search",
- args),
- httpConfig),
- 'Failed to retrieve entity data for query ' + query);
- },
-
-
- /**
- * @ngdoc method
- * @name umbraco.resources.entityResource#searchAll
- * @methodOf umbraco.resources.entityResource
- *
- * @description
- * Gets an array of entities from all available search indexes, given a lucene query
- *
- * ##usage
- *
- * entityResource.searchAll("bob")
- * .then(function(array) {
- * var myDoc = array;
- * alert('they are here!');
- * });
- *
- *
- * @param {String} Query search query
- * @returns {Promise} resourcePromise object containing the entity array.
- *
- */
- searchAll: function (query, canceler) {
-
- var httpConfig = {};
- if (canceler) {
- httpConfig["timeout"] = canceler;
- }
-
- return umbRequestHelper.resourcePromise(
- $http.get(
- umbRequestHelper.getApiUrl(
- "entityApiBaseUrl",
- "SearchAll",
- [{ query: query }]),
- httpConfig),
- 'Failed to retrieve entity data for query ' + query);
- }
-
- };
-}
-
-angular.module('umbraco.resources').factory('entityResource', entityResource);
-
+ if (ids.length === 0) {
+ query += "ids=&";
+ }
+
+ query += "type=" + type;
+
+ return umbRequestHelper.resourcePromise(
+ $http.get(
+ umbRequestHelper.getApiUrl(
+ "entityApiBaseUrl",
+ "GetByIds",
+ query)),
+ 'Failed to retrieve entity data for ids ' + ids);
+ },
+
+ /**
+ * @ngdoc method
+ * @name umbraco.resources.entityResource#getByQuery
+ * @methodOf umbraco.resources.entityResource
+ *
+ * @description
+ * Gets an entity from a given xpath
+ *
+ * ##usage
+ *
+ * //get content by xpath
+ * entityResource.getByQuery("$current", -1, "Document")
+ * .then(function(ent) {
+ * var myDoc = ent;
+ * alert('its here!');
+ * });
+ *
+ *
+ * @param {string} query xpath to use in query
+ * @param {Int} nodeContextId id id to start from
+ * @param {string} type Object type name
+ * @returns {Promise} resourcePromise object containing the entity.
+ *
+ */
+ getByQuery: function (query, nodeContextId, type) {
+ return umbRequestHelper.resourcePromise(
+ $http.get(
+ umbRequestHelper.getApiUrl(
+ "entityApiBaseUrl",
+ "GetByQuery",
+ [{ query: query }, { nodeContextId: nodeContextId }, { type: type }])),
+ 'Failed to retrieve entity data for query ' + query);
+ },
+
+ /**
+ * @ngdoc method
+ * @name umbraco.resources.entityResource#getAll
+ * @methodOf umbraco.resources.entityResource
+ *
+ * @description
+ * Gets an entity with a given id
+ *
+ * ##usage
+ *
+ *
+ * //Only return media
+ * entityResource.getAll("Media")
+ * .then(function(ent) {
+ * var myDoc = ent;
+ * alert('its here!');
+ * });
+ *
+ *
+ * @param {string} type Object type name
+ * @param {string} postFilter optional filter expression which will execute a dynamic where clause on the server
+ * @param {string} postFilterParams optional parameters for the postFilter expression
+ * @returns {Promise} resourcePromise object containing the entity.
+ *
+ */
+ getAll: function (type, postFilter, postFilterParams) {
+
+ //need to build the query string manually
+ var query = "type=" + type + "&postFilter=" + (postFilter ? postFilter : "");
+ if (postFilter && postFilterParams) {
+ var counter = 0;
+ _.each(postFilterParams, function(val, key) {
+ query += "&postFilterParams[" + counter + "].key=" + key + "&postFilterParams[" + counter + "].value=" + val;
+ counter++;
+ });
+ }
+
+ return umbRequestHelper.resourcePromise(
+ $http.get(
+ umbRequestHelper.getApiUrl(
+ "entityApiBaseUrl",
+ "GetAll",
+ query)),
+ 'Failed to retrieve entity data for type ' + type);
+ },
+
+ /**
+ * @ngdoc method
+ * @name umbraco.resources.entityResource#getAncestors
+ * @methodOf umbraco.resources.entityResource
+ *
+ * @description
+ * Gets ancestor entities for a given item
+ *
+ *
+ * @param {string} type Object type name
+ * @returns {Promise} resourcePromise object containing the entity.
+ *
+ */
+ getAncestors: function (id, type) {
+ return umbRequestHelper.resourcePromise(
+ $http.get(
+ umbRequestHelper.getApiUrl(
+ "entityApiBaseUrl",
+ "GetAncestors",
+ [{id: id}, {type: type}])),
+ 'Failed to retrieve ancestor data for id ' + id);
+ },
+
+ /**
+ * @ngdoc method
+ * @name umbraco.resources.entityResource#getAncestors
+ * @methodOf umbraco.resources.entityResource
+ *
+ * @description
+ * Gets children entities for a given item
+ *
+ *
+ * @param {string} type Object type name
+ * @returns {Promise} resourcePromise object containing the entity.
+ *
+ */
+ getChildren: function (id, type) {
+ return umbRequestHelper.resourcePromise(
+ $http.get(
+ umbRequestHelper.getApiUrl(
+ "entityApiBaseUrl",
+ "GetChildren",
+ [{ id: id }, { type: type }])),
+ 'Failed to retrieve child data for id ' + id);
+ },
+
+ /**
+ * @ngdoc method
+ * @name umbraco.resources.entityResource#search
+ * @methodOf umbraco.resources.entityResource
+ *
+ * @description
+ * Gets an array of entities, given a lucene query and a type
+ *
+ * ##usage
+ *
+ * entityResource.search("news", "Media")
+ * .then(function(mediaArray) {
+ * var myDoc = mediaArray;
+ * alert('they are here!');
+ * });
+ *
+ *
+ * @param {String} Query search query
+ * @param {String} Type type of conten to search
+ * @returns {Promise} resourcePromise object containing the entity array.
+ *
+ */
+ search: function (query, type, searchFrom, canceler) {
+
+ var args = [{ query: query }, { type: type }];
+ if (searchFrom) {
+ args.push({ searchFrom: searchFrom });
+ }
+
+ var httpConfig = {};
+ if (canceler) {
+ httpConfig["timeout"] = canceler;
+ }
+
+ return umbRequestHelper.resourcePromise(
+ $http.get(
+ umbRequestHelper.getApiUrl(
+ "entityApiBaseUrl",
+ "Search",
+ args),
+ httpConfig),
+ 'Failed to retrieve entity data for query ' + query);
+ },
+
+
+ /**
+ * @ngdoc method
+ * @name umbraco.resources.entityResource#searchAll
+ * @methodOf umbraco.resources.entityResource
+ *
+ * @description
+ * Gets an array of entities from all available search indexes, given a lucene query
+ *
+ * ##usage
+ *
+ * entityResource.searchAll("bob")
+ * .then(function(array) {
+ * var myDoc = array;
+ * alert('they are here!');
+ * });
+ *
+ *
+ * @param {String} Query search query
+ * @returns {Promise} resourcePromise object containing the entity array.
+ *
+ */
+ searchAll: function (query, canceler) {
+
+ var httpConfig = {};
+ if (canceler) {
+ httpConfig["timeout"] = canceler;
+ }
+
+ return umbRequestHelper.resourcePromise(
+ $http.get(
+ umbRequestHelper.getApiUrl(
+ "entityApiBaseUrl",
+ "SearchAll",
+ [{ query: query }]),
+ httpConfig),
+ 'Failed to retrieve entity data for query ' + query);
+ }
+
+ };
+}
+
+angular.module('umbraco.resources').factory('entityResource', entityResource);
+
/**
* @ngdoc service
* @name umbraco.resources.healthCheckResource
@@ -2215,1269 +2260,1269 @@ angular.module('umbraco.resources').factory('entityResource', entityResource);
})();
-
-/**
- * @ngdoc service
- * @name umbraco.resources.legacyResource
- * @description Handles legacy dialog requests
- **/
-function legacyResource($q, $http, umbRequestHelper) {
-
- //the factory object returned
- return {
- /** Loads in the data to display the section list */
- deleteItem: function (args) {
-
- if (!args.nodeId || !args.nodeType || !args.alias) {
- throw "The args parameter is not formatted correct, it requires properties: nodeId, nodeType, alias";
- }
-
- return umbRequestHelper.resourcePromise(
- $http.post(
- umbRequestHelper.getApiUrl(
- "legacyApiBaseUrl",
- "DeleteLegacyItem",
- [{ nodeId: args.nodeId }, { nodeType: args.nodeType }, { alias: args.alias }])),
- 'Failed to delete item ' + args.nodeId);
-
- }
- };
-}
-
-angular.module('umbraco.resources').factory('legacyResource', legacyResource);
-/**
- * @ngdoc service
- * @name umbraco.resources.logResource
- * @description Retrives log history from umbraco
- *
- *
- **/
-function logResource($q, $http, umbRequestHelper) {
-
- //the factory object returned
- return {
-
- /**
- * @ngdoc method
- * @name umbraco.resources.logResource#getEntityLog
- * @methodOf umbraco.resources.logResource
- *
- * @description
- * Gets the log history for a give entity id
- *
- * ##usage
- *
- * logResource.getEntityLog(1234)
- * .then(function(log) {
- * alert('its here!');
- * });
- *
- *
- * @param {Int} id id of entity to return log history
- * @returns {Promise} resourcePromise object containing the log.
- *
- */
- getEntityLog: function (id) {
- return umbRequestHelper.resourcePromise(
- $http.get(
- umbRequestHelper.getApiUrl(
- "logApiBaseUrl",
- "GetEntityLog",
- [{ id: id }])),
- 'Failed to retrieve user data for id ' + id);
- },
-
- /**
- * @ngdoc method
- * @name umbraco.resources.logResource#getUserLog
- * @methodOf umbraco.resources.logResource
- *
- * @description
- * Gets the current users' log history for a given type of log entry
- *
- * ##usage
- *
- * logResource.getUserLog("save", new Date())
- * .then(function(log) {
- * alert('its here!');
- * });
- *
- *
- * @param {String} type logtype to query for
- * @param {DateTime} since query the log back to this date, by defalt 7 days ago
- * @returns {Promise} resourcePromise object containing the log.
- *
- */
- getUserLog: function (type, since) {
- return umbRequestHelper.resourcePromise(
- $http.get(
- umbRequestHelper.getApiUrl(
- "logApiBaseUrl",
- "GetCurrentUserLog",
- [{ logtype: type, sinceDate: since }])),
- 'Failed to retrieve user data for id ' + id);
- },
-
- /**
- * @ngdoc method
- * @name umbraco.resources.logResource#getLog
- * @methodOf umbraco.resources.logResource
- *
- * @description
- * Gets the log history for a given type of log entry
- *
- * ##usage
- *
- * logResource.getLog("save", new Date())
- * .then(function(log) {
- * alert('its here!');
- * });
- *
- *
- * @param {String} type logtype to query for
- * @param {DateTime} since query the log back to this date, by defalt 7 days ago
- * @returns {Promise} resourcePromise object containing the log.
- *
- */
- getLog: function (type, since) {
- return umbRequestHelper.resourcePromise(
- $http.get(
- umbRequestHelper.getApiUrl(
- "logApiBaseUrl",
- "GetLog",
- [{ logtype: type, sinceDate: since }])),
- 'Failed to retrieve user data for id ' + id);
- }
- };
-}
-
-angular.module('umbraco.resources').factory('logResource', logResource);
-
-/**
- * @ngdoc service
- * @name umbraco.resources.macroResource
- * @description Deals with data for macros
- *
- **/
-function macroResource($q, $http, umbRequestHelper) {
-
- //the factory object returned
- return {
-
- /**
- * @ngdoc method
- * @name umbraco.resources.macroResource#getMacroParameters
- * @methodOf umbraco.resources.macroResource
- *
- * @description
- * Gets the editable macro parameters for the specified macro alias
- *
- * @param {int} macroId The macro id to get parameters for
- *
- */
- getMacroParameters: function (macroId) {
- return umbRequestHelper.resourcePromise(
- $http.get(
- umbRequestHelper.getApiUrl(
- "macroApiBaseUrl",
- "GetMacroParameters",
- [{ macroId: macroId }])),
- 'Failed to retrieve macro parameters for macro with id ' + macroId);
- },
-
- /**
- * @ngdoc method
- * @name umbraco.resources.macroResource#getMacroResult
- * @methodOf umbraco.resources.macroResource
- *
- * @description
- * Gets the result of a macro as html to display in the rich text editor or in the Grid
- *
- * @param {int} macroId The macro id to get parameters for
- * @param {int} pageId The current page id
- * @param {Array} macroParamDictionary A dictionary of macro parameters
- *
- */
- getMacroResultAsHtmlForEditor: function (macroAlias, pageId, macroParamDictionary) {
-
- return umbRequestHelper.resourcePromise(
- $http.post(
- umbRequestHelper.getApiUrl(
- "macroApiBaseUrl",
- "GetMacroResultAsHtmlForEditor"), {
- macroAlias: macroAlias,
- pageId: pageId,
- macroParams: macroParamDictionary
- }),
- 'Failed to retrieve macro result for macro with alias ' + macroAlias);
- }
- };
-}
-
-angular.module('umbraco.resources').factory('macroResource', macroResource);
-
-/**
- * @ngdoc service
- * @name umbraco.resources.mediaResource
- * @description Loads in data for media
- **/
-function mediaResource($q, $http, umbDataFormatter, umbRequestHelper) {
-
- /** internal method process the saving of data and post processing the result */
- function saveMediaItem(content, action, files) {
- return umbRequestHelper.postSaveContent({
- restApiUrl: umbRequestHelper.getApiUrl(
- "mediaApiBaseUrl",
- "PostSave"),
- content: content,
- action: action,
- files: files,
- dataFormatter: function (c, a) {
- return umbDataFormatter.formatMediaPostData(c, a);
- }
- });
- }
-
- return {
-
- getRecycleBin: function () {
- return umbRequestHelper.resourcePromise(
- $http.get(
- umbRequestHelper.getApiUrl(
- "mediaApiBaseUrl",
- "GetRecycleBin")),
- 'Failed to retrieve data for media recycle bin');
- },
-
- /**
- * @ngdoc method
- * @name umbraco.resources.mediaResource#sort
- * @methodOf umbraco.resources.mediaResource
- *
- * @description
- * Sorts all children below a given parent node id, based on a collection of node-ids
- *
- * ##usage
- *
- * var ids = [123,34533,2334,23434];
- * mediaResource.sort({ sortedIds: ids })
- * .then(function() {
- * $scope.complete = true;
- * });
- *
- * @param {Object} args arguments object
- * @param {Int} args.parentId the ID of the parent node
- * @param {Array} options.sortedIds array of node IDs as they should be sorted
- * @returns {Promise} resourcePromise object.
- *
- */
- sort: function (args) {
- if (!args) {
- throw "args cannot be null";
- }
- if (!args.parentId) {
- throw "args.parentId cannot be null";
- }
- if (!args.sortedIds) {
- throw "args.sortedIds cannot be null";
- }
-
- return umbRequestHelper.resourcePromise(
- $http.post(umbRequestHelper.getApiUrl("mediaApiBaseUrl", "PostSort"),
- {
- parentId: args.parentId,
- idSortOrder: args.sortedIds
- }),
- 'Failed to sort media');
- },
-
- /**
- * @ngdoc method
- * @name umbraco.resources.mediaResource#move
- * @methodOf umbraco.resources.mediaResource
- *
- * @description
- * Moves a node underneath a new parentId
- *
- * ##usage
- *
- * mediaResource.move({ parentId: 1244, id: 123 })
- * .then(function() {
- * alert("node was moved");
- * }, function(err){
- * alert("node didnt move:" + err.data.Message);
- * });
- *
- * @param {Object} args arguments object
- * @param {Int} args.idd the ID of the node to move
- * @param {Int} args.parentId the ID of the parent node to move to
- * @returns {Promise} resourcePromise object.
- *
- */
- move: function (args) {
- if (!args) {
- throw "args cannot be null";
- }
- if (!args.parentId) {
- throw "args.parentId cannot be null";
- }
- if (!args.id) {
- throw "args.id cannot be null";
- }
-
- return umbRequestHelper.resourcePromise(
- $http.post(umbRequestHelper.getApiUrl("mediaApiBaseUrl", "PostMove"),
- {
- parentId: args.parentId,
- id: args.id
- }),
- 'Failed to move media');
- },
-
-
- /**
- * @ngdoc method
- * @name umbraco.resources.mediaResource#getById
- * @methodOf umbraco.resources.mediaResource
- *
- * @description
- * Gets a media item with a given id
- *
- * ##usage
- *
- * mediaResource.getById(1234)
- * .then(function(media) {
- * var myMedia = media;
- * alert('its here!');
- * });
- *
- *
- * @param {Int} id id of media item to return
- * @returns {Promise} resourcePromise object containing the media item.
- *
- */
- getById: function (id) {
-
- return umbRequestHelper.resourcePromise(
- $http.get(
- umbRequestHelper.getApiUrl(
- "mediaApiBaseUrl",
- "GetById",
- [{ id: id }])),
- 'Failed to retrieve data for media id ' + id);
- },
-
- /**
- * @ngdoc method
- * @name umbraco.resources.mediaResource#deleteById
- * @methodOf umbraco.resources.mediaResource
- *
- * @description
- * Deletes a media item with a given id
- *
- * ##usage
- *
- * mediaResource.deleteById(1234)
- * .then(function() {
- * alert('its gone!');
- * });
- *
- *
- * @param {Int} id id of media item to delete
- * @returns {Promise} resourcePromise object.
- *
- */
- deleteById: function (id) {
- return umbRequestHelper.resourcePromise(
- $http.post(
- umbRequestHelper.getApiUrl(
- "mediaApiBaseUrl",
- "DeleteById",
- [{ id: id }])),
- 'Failed to delete item ' + id);
- },
-
- /**
- * @ngdoc method
- * @name umbraco.resources.mediaResource#getByIds
- * @methodOf umbraco.resources.mediaResource
- *
- * @description
- * Gets an array of media items, given a collection of ids
- *
- * ##usage
- *
- * mediaResource.getByIds( [1234,2526,28262])
- * .then(function(mediaArray) {
- * var myDoc = contentArray;
- * alert('they are here!');
- * });
- *
- *
- * @param {Array} ids ids of media items to return as an array
- * @returns {Promise} resourcePromise object containing the media items array.
- *
- */
- getByIds: function (ids) {
-
- var idQuery = "";
- _.each(ids, function (item) {
- idQuery += "ids=" + item + "&";
- });
-
- return umbRequestHelper.resourcePromise(
- $http.get(
- umbRequestHelper.getApiUrl(
- "mediaApiBaseUrl",
- "GetByIds",
- idQuery)),
- 'Failed to retrieve data for media ids ' + ids);
- },
-
- /**
- * @ngdoc method
- * @name umbraco.resources.mediaResource#getScaffold
- * @methodOf umbraco.resources.mediaResource
- *
- * @description
- * Returns a scaffold of an empty media item, given the id of the media item to place it underneath and the media type alias.
- *
- * - Parent Id must be provided so umbraco knows where to store the media
- * - Media Type alias must be provided so umbraco knows which properties to put on the media scaffold
- *
- * The scaffold is used to build editors for media that has not yet been populated with data.
- *
- * ##usage
- *
- * mediaResource.getScaffold(1234, 'folder')
- * .then(function(scaffold) {
- * var myDoc = scaffold;
- * myDoc.name = "My new media item";
- *
- * mediaResource.save(myDoc, true)
- * .then(function(media){
- * alert("Retrieved, updated and saved again");
- * });
- * });
- *
- *
- * @param {Int} parentId id of media item to return
- * @param {String} alias mediatype alias to base the scaffold on
- * @returns {Promise} resourcePromise object containing the media scaffold.
- *
- */
- getScaffold: function (parentId, alias) {
-
- return umbRequestHelper.resourcePromise(
- $http.get(
- umbRequestHelper.getApiUrl(
- "mediaApiBaseUrl",
- "GetEmpty",
- [{ contentTypeAlias: alias }, { parentId: parentId }])),
- 'Failed to retrieve data for empty media item type ' + alias);
-
- },
-
- rootMedia: function () {
-
- return umbRequestHelper.resourcePromise(
- $http.get(
- umbRequestHelper.getApiUrl(
- "mediaApiBaseUrl",
- "GetRootMedia")),
- 'Failed to retrieve data for root media');
-
- },
-
- /**
- * @ngdoc method
- * @name umbraco.resources.mediaResource#getChildren
- * @methodOf umbraco.resources.mediaResource
- *
- * @description
- * Gets children of a media item with a given id
- *
- * ##usage
- *
- * mediaResource.getChildren(1234, {pageSize: 10, pageNumber: 2})
- * .then(function(contentArray) {
- * var children = contentArray;
- * alert('they are here!');
- * });
- *
- *
- * @param {Int} parentid id of content item to return children of
- * @param {Object} options optional options object
- * @param {Int} options.pageSize if paging data, number of nodes per page, default = 0
- * @param {Int} options.pageNumber if paging data, current page index, default = 0
- * @param {String} options.filter if provided, query will only return those with names matching the filter
- * @param {String} options.orderDirection can be `Ascending` or `Descending` - Default: `Ascending`
- * @param {String} options.orderBy property to order items by, default: `SortOrder`
- * @returns {Promise} resourcePromise object containing an array of content items.
- *
- */
- getChildren: function (parentId, options) {
-
- var defaults = {
- pageSize: 0,
- pageNumber: 0,
- filter: '',
- orderDirection: "Ascending",
- orderBy: "SortOrder",
- orderBySystemField: true
- };
- if (options === undefined) {
- options = {};
- }
- //overwrite the defaults if there are any specified
- angular.extend(defaults, options);
- //now copy back to the options we will use
- options = defaults;
- //change asc/desct
- if (options.orderDirection === "asc") {
- options.orderDirection = "Ascending";
- }
- else if (options.orderDirection === "desc") {
- options.orderDirection = "Descending";
- }
-
- //converts the value to a js bool
- function toBool(v) {
- if (angular.isNumber(v)) {
- return v > 0;
- }
- if (angular.isString(v)) {
- return v === "true";
- }
- if (typeof v === "boolean") {
- return v;
- }
- return false;
- }
-
- return umbRequestHelper.resourcePromise(
- $http.get(
- umbRequestHelper.getApiUrl(
- "mediaApiBaseUrl",
- "GetChildren",
- [
- { id: parentId },
- { pageNumber: options.pageNumber },
- { pageSize: options.pageSize },
- { orderBy: options.orderBy },
- { orderDirection: options.orderDirection },
- { orderBySystemField: toBool(options.orderBySystemField) },
- { filter: options.filter }
- ])),
- 'Failed to retrieve children for media item ' + parentId);
- },
-
- /**
- * @ngdoc method
- * @name umbraco.resources.mediaResource#save
- * @methodOf umbraco.resources.mediaResource
- *
- * @description
- * Saves changes made to a media item, if the media item is new, the isNew paramater must be passed to force creation
- * if the media item needs to have files attached, they must be provided as the files param and passed separately
- *
- *
- * ##usage
- *
- * mediaResource.getById(1234)
- * .then(function(media) {
- * media.name = "I want a new name!";
- * mediaResource.save(media, false)
- * .then(function(media){
- * alert("Retrieved, updated and saved again");
- * });
- * });
- *
- *
- * @param {Object} media The media item object with changes applied
- * @param {Bool} isNew set to true to create a new item or to update an existing
- * @param {Array} files collection of files for the media item
- * @returns {Promise} resourcePromise object containing the saved media item.
- *
- */
- save: function (media, isNew, files) {
- return saveMediaItem(media, "save" + (isNew ? "New" : ""), files);
- },
-
- /**
- * @ngdoc method
- * @name umbraco.resources.mediaResource#addFolder
- * @methodOf umbraco.resources.mediaResource
- *
- * @description
- * Shorthand for adding a media item of the type "Folder" under a given parent ID
- *
- * ##usage
- *
- * mediaResource.addFolder("My gallery", 1234)
- * .then(function(folder) {
- * alert('New folder');
- * });
- *
- *
- * @param {string} name Name of the folder to create
- * @param {int} parentId Id of the media item to create the folder underneath
- * @returns {Promise} resourcePromise object.
- *
- */
- addFolder: function (name, parentId) {
- return umbRequestHelper.resourcePromise(
- $http.post(umbRequestHelper
- .getApiUrl("mediaApiBaseUrl", "PostAddFolder"),
- {
- name: name,
- parentId: parentId
- }),
- 'Failed to add folder');
- },
-
- /**
- * @ngdoc method
- * @name umbraco.resources.mediaResource#getChildFolders
- * @methodOf umbraco.resources.mediaResource
- *
- * @description
- * Retrieves all media children with types used as folders.
- * Uses the convention of looking for media items with mediaTypes ending in
- * *Folder so will match "Folder", "bannerFolder", "secureFolder" etc,
- *
- * ##usage
- *
- * mediaResource.getChildFolders(1234)
- * .then(function(data) {
- * alert('folders');
- * });
- *
- *
- * @param {int} parentId Id of the media item to query for child folders
- * @returns {Promise} resourcePromise object.
- *
- */
- getChildFolders: function (parentId) {
- if (!parentId) {
- parentId = -1;
- }
-
- return umbRequestHelper.resourcePromise(
- $http.get(
- umbRequestHelper.getApiUrl(
- "mediaApiBaseUrl",
- "GetChildFolders",
- [
- { id: parentId }
- ])),
- 'Failed to retrieve child folders for media item ' + parentId);
- },
-
- /**
- * @ngdoc method
- * @name umbraco.resources.mediaResource#emptyRecycleBin
- * @methodOf umbraco.resources.mediaResource
- *
- * @description
- * Empties the media recycle bin
- *
- * ##usage
- *
- * mediaResource.emptyRecycleBin()
- * .then(function() {
- * alert('its empty!');
- * });
- *
- *
- * @returns {Promise} resourcePromise object.
- *
- */
- emptyRecycleBin: function () {
- return umbRequestHelper.resourcePromise(
- $http.post(
- umbRequestHelper.getApiUrl(
- "mediaApiBaseUrl",
- "EmptyRecycleBin")),
- 'Failed to empty the recycle bin');
- }
- };
-}
-
-angular.module('umbraco.resources').factory('mediaResource', mediaResource);
-
-/**
- * @ngdoc service
- * @name umbraco.resources.mediaTypeResource
- * @description Loads in data for media types
- **/
-function mediaTypeResource($q, $http, umbRequestHelper, umbDataFormatter) {
-
- return {
-
- getCount: function () {
- return umbRequestHelper.resourcePromise(
- $http.get(
- umbRequestHelper.getApiUrl(
- "mediaTypeApiBaseUrl",
- "GetCount")),
- 'Failed to retrieve count');
- },
-
- getAvailableCompositeContentTypes: function (contentTypeId, filterContentTypes, filterPropertyTypes) {
- if (!filterContentTypes) {
- filterContentTypes = [];
- }
- if (!filterPropertyTypes) {
- filterPropertyTypes = [];
- }
-
- var query = {
- contentTypeId: contentTypeId,
- filterContentTypes: filterContentTypes,
- filterPropertyTypes: filterPropertyTypes
- };
-
- return umbRequestHelper.resourcePromise(
- $http.post(
- umbRequestHelper.getApiUrl(
- "mediaTypeApiBaseUrl",
- "GetAvailableCompositeMediaTypes"),
- query),
- 'Failed to retrieve data for content type id ' + contentTypeId);
- },
-
- /**
- * @ngdoc method
- * @name umbraco.resources.mediaTypeResource#getAllowedTypes
- * @methodOf umbraco.resources.mediaTypeResource
- *
- * @description
- * Returns a list of allowed media types underneath a media item with a given ID
- *
- * ##usage
- *
- * mediaTypeResource.getAllowedTypes(1234)
- * .then(function(array) {
- * $scope.type = type;
- * });
- *
- * @param {Int} mediaId id of the media item to retrive allowed child types for
- * @returns {Promise} resourcePromise object.
- *
- */
- getAllowedTypes: function (mediaId) {
-
- return umbRequestHelper.resourcePromise(
- $http.get(
- umbRequestHelper.getApiUrl(
- "mediaTypeApiBaseUrl",
- "GetAllowedChildren",
- [{ contentId: mediaId }])),
- 'Failed to retrieve allowed types for media id ' + mediaId);
- },
-
- getById: function (id) {
-
- return umbRequestHelper.resourcePromise(
- $http.get(
- umbRequestHelper.getApiUrl(
- "mediaTypeApiBaseUrl",
- "GetById",
- [{ id: id }])),
- 'Failed to retrieve content type');
- },
-
- getAll: function () {
-
- return umbRequestHelper.resourcePromise(
- $http.get(
- umbRequestHelper.getApiUrl(
- "mediaTypeApiBaseUrl",
- "GetAll")),
- 'Failed to retrieve all content types');
- },
-
- getScaffold: function (parentId) {
-
- return umbRequestHelper.resourcePromise(
- $http.get(
- umbRequestHelper.getApiUrl(
- "mediaTypeApiBaseUrl",
- "GetEmpty", { parentId: parentId })),
- 'Failed to retrieve content type scaffold');
- },
-
- deleteById: function (id) {
-
- return umbRequestHelper.resourcePromise(
- $http.post(
- umbRequestHelper.getApiUrl(
- "mediaTypeApiBaseUrl",
- "DeleteById",
- [{ id: id }])),
- 'Failed to retrieve content type');
- },
-
- deleteContainerById: function (id) {
-
- return umbRequestHelper.resourcePromise(
- $http.post(
- umbRequestHelper.getApiUrl(
- "mediaTypeApiBaseUrl",
- "DeleteContainer",
- [{ id: id }])),
- 'Failed to delete content type contaier');
- },
-
- save: function (contentType) {
-
- var saveModel = umbDataFormatter.formatContentTypePostData(contentType);
-
- return umbRequestHelper.resourcePromise(
- $http.post(umbRequestHelper.getApiUrl("mediaTypeApiBaseUrl", "PostSave"), saveModel),
- 'Failed to save data for content type id ' + contentType.id);
- },
-
- /**
- * @ngdoc method
- * @name umbraco.resources.mediaTypeResource#move
- * @methodOf umbraco.resources.mediaTypeResource
- *
- * @description
- * Moves a node underneath a new parentId
- *
- * ##usage
- *
- * mediaTypeResource.move({ parentId: 1244, id: 123 })
- * .then(function() {
- * alert("node was moved");
- * }, function(err){
- * alert("node didnt move:" + err.data.Message);
- * });
- *
- * @param {Object} args arguments object
- * @param {Int} args.idd the ID of the node to move
- * @param {Int} args.parentId the ID of the parent node to move to
- * @returns {Promise} resourcePromise object.
- *
- */
- move: function (args) {
- if (!args) {
- throw "args cannot be null";
- }
- if (!args.parentId) {
- throw "args.parentId cannot be null";
- }
- if (!args.id) {
- throw "args.id cannot be null";
- }
-
- return umbRequestHelper.resourcePromise(
- $http.post(umbRequestHelper.getApiUrl("mediaTypeApiBaseUrl", "PostMove"),
- {
- parentId: args.parentId,
- id: args.id
- }),
- 'Failed to move content');
- },
-
- copy: function (args) {
- if (!args) {
- throw "args cannot be null";
- }
- if (!args.parentId) {
- throw "args.parentId cannot be null";
- }
- if (!args.id) {
- throw "args.id cannot be null";
- }
-
- return umbRequestHelper.resourcePromise(
- $http.post(umbRequestHelper.getApiUrl("mediaTypeApiBaseUrl", "PostCopy"),
- {
- parentId: args.parentId,
- id: args.id
- }),
- 'Failed to copy content');
- },
-
- createContainer: function(parentId, name) {
-
- return umbRequestHelper.resourcePromise(
- $http.post(
- umbRequestHelper.getApiUrl(
- "mediaTypeApiBaseUrl",
- "PostCreateContainer",
- { parentId: parentId, name: name })),
- 'Failed to create a folder under parent id ' + parentId);
- }
-
- };
-}
-angular.module('umbraco.resources').factory('mediaTypeResource', mediaTypeResource);
-
-/**
- * @ngdoc service
- * @name umbraco.resources.memberResource
- * @description Loads in data for members
- **/
-function memberResource($q, $http, umbDataFormatter, umbRequestHelper) {
-
- /** internal method process the saving of data and post processing the result */
- function saveMember(content, action, files) {
-
- return umbRequestHelper.postSaveContent({
- restApiUrl: umbRequestHelper.getApiUrl(
- "memberApiBaseUrl",
- "PostSave"),
- content: content,
- action: action,
- files: files,
- dataFormatter: function (c, a) {
- return umbDataFormatter.formatMemberPostData(c, a);
- }
- });
- }
-
- return {
-
- getPagedResults: function (memberTypeAlias, options) {
-
- if (memberTypeAlias === 'all-members') {
- memberTypeAlias = null;
- }
-
- var defaults = {
- pageSize: 25,
- pageNumber: 1,
- filter: '',
- orderDirection: "Ascending",
- orderBy: "LoginName",
- orderBySystemField: true
- };
- if (options === undefined) {
- options = {};
- }
- //overwrite the defaults if there are any specified
- angular.extend(defaults, options);
- //now copy back to the options we will use
- options = defaults;
- //change asc/desct
- if (options.orderDirection === "asc") {
- options.orderDirection = "Ascending";
- }
- else if (options.orderDirection === "desc") {
- options.orderDirection = "Descending";
- }
-
- //converts the value to a js bool
- function toBool(v) {
- if (angular.isNumber(v)) {
- return v > 0;
- }
- if (angular.isString(v)) {
- return v === "true";
- }
- if (typeof v === "boolean") {
- return v;
- }
- return false;
- }
-
- var params = [
- { pageNumber: options.pageNumber },
- { pageSize: options.pageSize },
- { orderBy: options.orderBy },
- { orderDirection: options.orderDirection },
- { orderBySystemField: toBool(options.orderBySystemField) },
- { filter: options.filter }
- ];
- if (memberTypeAlias != null) {
- params.push({ memberTypeAlias: memberTypeAlias });
- }
-
- return umbRequestHelper.resourcePromise(
- $http.get(
- umbRequestHelper.getApiUrl(
- "memberApiBaseUrl",
- "GetPagedResults",
- params)),
- 'Failed to retrieve member paged result');
- },
-
- getListNode: function (listName) {
-
- return umbRequestHelper.resourcePromise(
- $http.get(
- umbRequestHelper.getApiUrl(
- "memberApiBaseUrl",
- "GetListNodeDisplay",
- [{ listName: listName }])),
- 'Failed to retrieve data for member list ' + listName);
- },
-
- /**
- * @ngdoc method
- * @name umbraco.resources.memberResource#getByKey
- * @methodOf umbraco.resources.memberResource
- *
- * @description
- * Gets a member item with a given key
- *
- * ##usage
- *
- * memberResource.getByKey("0000-0000-000-00000-000")
- * .then(function(member) {
- * var mymember = member;
- * alert('its here!');
- * });
- *
- *
- * @param {Guid} key key of member item to return
- * @returns {Promise} resourcePromise object containing the member item.
- *
- */
- getByKey: function (key) {
-
- return umbRequestHelper.resourcePromise(
- $http.get(
- umbRequestHelper.getApiUrl(
- "memberApiBaseUrl",
- "GetByKey",
- [{ key: key }])),
- 'Failed to retrieve data for member id ' + key);
- },
-
- /**
- * @ngdoc method
- * @name umbraco.resources.memberResource#deleteByKey
- * @methodOf umbraco.resources.memberResource
- *
- * @description
- * Deletes a member item with a given key
- *
- * ##usage
- *
- * memberResource.deleteByKey("0000-0000-000-00000-000")
- * .then(function() {
- * alert('its gone!');
- * });
- *
- *
- * @param {Guid} key id of member item to delete
- * @returns {Promise} resourcePromise object.
- *
- */
- deleteByKey: function (key) {
- return umbRequestHelper.resourcePromise(
- $http.post(
- umbRequestHelper.getApiUrl(
- "memberApiBaseUrl",
- "DeleteByKey",
- [{ key: key }])),
- 'Failed to delete item ' + key);
- },
-
- /**
- * @ngdoc method
- * @name umbraco.resources.memberResource#getScaffold
- * @methodOf umbraco.resources.memberResource
- *
- * @description
- * Returns a scaffold of an empty member item, given the id of the member item to place it underneath and the member type alias.
- *
- * - Member Type alias must be provided so umbraco knows which properties to put on the member scaffold
- *
- * The scaffold is used to build editors for member that has not yet been populated with data.
- *
- * ##usage
- *
- * memberResource.getScaffold('client')
- * .then(function(scaffold) {
- * var myDoc = scaffold;
- * myDoc.name = "My new member item";
- *
- * memberResource.save(myDoc, true)
- * .then(function(member){
- * alert("Retrieved, updated and saved again");
- * });
- * });
- *
- *
- * @param {String} alias membertype alias to base the scaffold on
- * @returns {Promise} resourcePromise object containing the member scaffold.
- *
- */
- getScaffold: function (alias) {
-
- if (alias) {
- return umbRequestHelper.resourcePromise(
- $http.get(
- umbRequestHelper.getApiUrl(
- "memberApiBaseUrl",
- "GetEmpty",
- [{ contentTypeAlias: alias }])),
- 'Failed to retrieve data for empty member item type ' + alias);
- }
- else {
- return umbRequestHelper.resourcePromise(
- $http.get(
- umbRequestHelper.getApiUrl(
- "memberApiBaseUrl",
- "GetEmpty")),
- 'Failed to retrieve data for empty member item type ' + alias);
- }
-
- },
-
- /**
- * @ngdoc method
- * @name umbraco.resources.memberResource#save
- * @methodOf umbraco.resources.memberResource
- *
- * @description
- * Saves changes made to a member, if the member is new, the isNew paramater must be passed to force creation
- * if the member needs to have files attached, they must be provided as the files param and passed separately
- *
- *
- * ##usage
- *
- * memberResource.getBykey("23234-sd8djsd-3h8d3j-sdh8d")
- * .then(function(member) {
- * member.name = "Bob";
- * memberResource.save(member, false)
- * .then(function(member){
- * alert("Retrieved, updated and saved again");
- * });
- * });
- *
- *
- * @param {Object} media The member item object with changes applied
- * @param {Bool} isNew set to true to create a new item or to update an existing
- * @param {Array} files collection of files for the media item
- * @returns {Promise} resourcePromise object containing the saved media item.
- *
- */
- save: function (member, isNew, files) {
- return saveMember(member, "save" + (isNew ? "New" : ""), files);
- }
- };
-}
-
-angular.module('umbraco.resources').factory('memberResource', memberResource);
-
-/**
- * @ngdoc service
- * @name umbraco.resources.memberTypeResource
- * @description Loads in data for member types
- **/
-function memberTypeResource($q, $http, umbRequestHelper, umbDataFormatter) {
-
- return {
-
- getAvailableCompositeContentTypes: function (contentTypeId, filterContentTypes, filterPropertyTypes) {
- if (!filterContentTypes) {
- filterContentTypes = [];
- }
- if (!filterPropertyTypes) {
- filterPropertyTypes = [];
- }
-
- var query = "";
- _.each(filterContentTypes, function (item) {
- query += "filterContentTypes=" + item + "&";
- });
+
+/**
+ * @ngdoc service
+ * @name umbraco.resources.legacyResource
+ * @description Handles legacy dialog requests
+ **/
+function legacyResource($q, $http, umbRequestHelper) {
+
+ //the factory object returned
+ return {
+ /** Loads in the data to display the section list */
+ deleteItem: function (args) {
+
+ if (!args.nodeId || !args.nodeType || !args.alias) {
+ throw "The args parameter is not formatted correct, it requires properties: nodeId, nodeType, alias";
+ }
+
+ return umbRequestHelper.resourcePromise(
+ $http.post(
+ umbRequestHelper.getApiUrl(
+ "legacyApiBaseUrl",
+ "DeleteLegacyItem",
+ [{ nodeId: args.nodeId }, { nodeType: args.nodeType }, { alias: args.alias }])),
+ 'Failed to delete item ' + args.nodeId);
+
+ }
+ };
+}
+
+angular.module('umbraco.resources').factory('legacyResource', legacyResource);
+/**
+ * @ngdoc service
+ * @name umbraco.resources.logResource
+ * @description Retrives log history from umbraco
+ *
+ *
+ **/
+function logResource($q, $http, umbRequestHelper) {
+
+ //the factory object returned
+ return {
+
+ /**
+ * @ngdoc method
+ * @name umbraco.resources.logResource#getEntityLog
+ * @methodOf umbraco.resources.logResource
+ *
+ * @description
+ * Gets the log history for a give entity id
+ *
+ * ##usage
+ *
+ * logResource.getEntityLog(1234)
+ * .then(function(log) {
+ * alert('its here!');
+ * });
+ *
+ *
+ * @param {Int} id id of entity to return log history
+ * @returns {Promise} resourcePromise object containing the log.
+ *
+ */
+ getEntityLog: function (id) {
+ return umbRequestHelper.resourcePromise(
+ $http.get(
+ umbRequestHelper.getApiUrl(
+ "logApiBaseUrl",
+ "GetEntityLog",
+ [{ id: id }])),
+ 'Failed to retrieve user data for id ' + id);
+ },
+
+ /**
+ * @ngdoc method
+ * @name umbraco.resources.logResource#getUserLog
+ * @methodOf umbraco.resources.logResource
+ *
+ * @description
+ * Gets the current users' log history for a given type of log entry
+ *
+ * ##usage
+ *
+ * logResource.getUserLog("save", new Date())
+ * .then(function(log) {
+ * alert('its here!');
+ * });
+ *
+ *
+ * @param {String} type logtype to query for
+ * @param {DateTime} since query the log back to this date, by defalt 7 days ago
+ * @returns {Promise} resourcePromise object containing the log.
+ *
+ */
+ getUserLog: function (type, since) {
+ return umbRequestHelper.resourcePromise(
+ $http.get(
+ umbRequestHelper.getApiUrl(
+ "logApiBaseUrl",
+ "GetCurrentUserLog",
+ [{ logtype: type, sinceDate: since }])),
+ 'Failed to retrieve user data for id ' + id);
+ },
+
+ /**
+ * @ngdoc method
+ * @name umbraco.resources.logResource#getLog
+ * @methodOf umbraco.resources.logResource
+ *
+ * @description
+ * Gets the log history for a given type of log entry
+ *
+ * ##usage
+ *
+ * logResource.getLog("save", new Date())
+ * .then(function(log) {
+ * alert('its here!');
+ * });
+ *
+ *
+ * @param {String} type logtype to query for
+ * @param {DateTime} since query the log back to this date, by defalt 7 days ago
+ * @returns {Promise} resourcePromise object containing the log.
+ *
+ */
+ getLog: function (type, since) {
+ return umbRequestHelper.resourcePromise(
+ $http.get(
+ umbRequestHelper.getApiUrl(
+ "logApiBaseUrl",
+ "GetLog",
+ [{ logtype: type, sinceDate: since }])),
+ 'Failed to retrieve user data for id ' + id);
+ }
+ };
+}
+
+angular.module('umbraco.resources').factory('logResource', logResource);
+
+/**
+ * @ngdoc service
+ * @name umbraco.resources.macroResource
+ * @description Deals with data for macros
+ *
+ **/
+function macroResource($q, $http, umbRequestHelper) {
+
+ //the factory object returned
+ return {
+
+ /**
+ * @ngdoc method
+ * @name umbraco.resources.macroResource#getMacroParameters
+ * @methodOf umbraco.resources.macroResource
+ *
+ * @description
+ * Gets the editable macro parameters for the specified macro alias
+ *
+ * @param {int} macroId The macro id to get parameters for
+ *
+ */
+ getMacroParameters: function (macroId) {
+ return umbRequestHelper.resourcePromise(
+ $http.get(
+ umbRequestHelper.getApiUrl(
+ "macroApiBaseUrl",
+ "GetMacroParameters",
+ [{ macroId: macroId }])),
+ 'Failed to retrieve macro parameters for macro with id ' + macroId);
+ },
+
+ /**
+ * @ngdoc method
+ * @name umbraco.resources.macroResource#getMacroResult
+ * @methodOf umbraco.resources.macroResource
+ *
+ * @description
+ * Gets the result of a macro as html to display in the rich text editor or in the Grid
+ *
+ * @param {int} macroId The macro id to get parameters for
+ * @param {int} pageId The current page id
+ * @param {Array} macroParamDictionary A dictionary of macro parameters
+ *
+ */
+ getMacroResultAsHtmlForEditor: function (macroAlias, pageId, macroParamDictionary) {
+
+ return umbRequestHelper.resourcePromise(
+ $http.post(
+ umbRequestHelper.getApiUrl(
+ "macroApiBaseUrl",
+ "GetMacroResultAsHtmlForEditor"), {
+ macroAlias: macroAlias,
+ pageId: pageId,
+ macroParams: macroParamDictionary
+ }),
+ 'Failed to retrieve macro result for macro with alias ' + macroAlias);
+ }
+ };
+}
+
+angular.module('umbraco.resources').factory('macroResource', macroResource);
+
+/**
+ * @ngdoc service
+ * @name umbraco.resources.mediaResource
+ * @description Loads in data for media
+ **/
+function mediaResource($q, $http, umbDataFormatter, umbRequestHelper) {
+
+ /** internal method process the saving of data and post processing the result */
+ function saveMediaItem(content, action, files) {
+ return umbRequestHelper.postSaveContent({
+ restApiUrl: umbRequestHelper.getApiUrl(
+ "mediaApiBaseUrl",
+ "PostSave"),
+ content: content,
+ action: action,
+ files: files,
+ dataFormatter: function (c, a) {
+ return umbDataFormatter.formatMediaPostData(c, a);
+ }
+ });
+ }
+
+ return {
+
+ getRecycleBin: function () {
+ return umbRequestHelper.resourcePromise(
+ $http.get(
+ umbRequestHelper.getApiUrl(
+ "mediaApiBaseUrl",
+ "GetRecycleBin")),
+ 'Failed to retrieve data for media recycle bin');
+ },
+
+ /**
+ * @ngdoc method
+ * @name umbraco.resources.mediaResource#sort
+ * @methodOf umbraco.resources.mediaResource
+ *
+ * @description
+ * Sorts all children below a given parent node id, based on a collection of node-ids
+ *
+ * ##usage
+ *
+ * var ids = [123,34533,2334,23434];
+ * mediaResource.sort({ sortedIds: ids })
+ * .then(function() {
+ * $scope.complete = true;
+ * });
+ *
+ * @param {Object} args arguments object
+ * @param {Int} args.parentId the ID of the parent node
+ * @param {Array} options.sortedIds array of node IDs as they should be sorted
+ * @returns {Promise} resourcePromise object.
+ *
+ */
+ sort: function (args) {
+ if (!args) {
+ throw "args cannot be null";
+ }
+ if (!args.parentId) {
+ throw "args.parentId cannot be null";
+ }
+ if (!args.sortedIds) {
+ throw "args.sortedIds cannot be null";
+ }
+
+ return umbRequestHelper.resourcePromise(
+ $http.post(umbRequestHelper.getApiUrl("mediaApiBaseUrl", "PostSort"),
+ {
+ parentId: args.parentId,
+ idSortOrder: args.sortedIds
+ }),
+ 'Failed to sort media');
+ },
+
+ /**
+ * @ngdoc method
+ * @name umbraco.resources.mediaResource#move
+ * @methodOf umbraco.resources.mediaResource
+ *
+ * @description
+ * Moves a node underneath a new parentId
+ *
+ * ##usage
+ *
+ * mediaResource.move({ parentId: 1244, id: 123 })
+ * .then(function() {
+ * alert("node was moved");
+ * }, function(err){
+ * alert("node didnt move:" + err.data.Message);
+ * });
+ *
+ * @param {Object} args arguments object
+ * @param {Int} args.idd the ID of the node to move
+ * @param {Int} args.parentId the ID of the parent node to move to
+ * @returns {Promise} resourcePromise object.
+ *
+ */
+ move: function (args) {
+ if (!args) {
+ throw "args cannot be null";
+ }
+ if (!args.parentId) {
+ throw "args.parentId cannot be null";
+ }
+ if (!args.id) {
+ throw "args.id cannot be null";
+ }
+
+ return umbRequestHelper.resourcePromise(
+ $http.post(umbRequestHelper.getApiUrl("mediaApiBaseUrl", "PostMove"),
+ {
+ parentId: args.parentId,
+ id: args.id
+ }),
+ 'Failed to move media');
+ },
+
+
+ /**
+ * @ngdoc method
+ * @name umbraco.resources.mediaResource#getById
+ * @methodOf umbraco.resources.mediaResource
+ *
+ * @description
+ * Gets a media item with a given id
+ *
+ * ##usage
+ *
+ * mediaResource.getById(1234)
+ * .then(function(media) {
+ * var myMedia = media;
+ * alert('its here!');
+ * });
+ *
+ *
+ * @param {Int} id id of media item to return
+ * @returns {Promise} resourcePromise object containing the media item.
+ *
+ */
+ getById: function (id) {
+
+ return umbRequestHelper.resourcePromise(
+ $http.get(
+ umbRequestHelper.getApiUrl(
+ "mediaApiBaseUrl",
+ "GetById",
+ [{ id: id }])),
+ 'Failed to retrieve data for media id ' + id);
+ },
+
+ /**
+ * @ngdoc method
+ * @name umbraco.resources.mediaResource#deleteById
+ * @methodOf umbraco.resources.mediaResource
+ *
+ * @description
+ * Deletes a media item with a given id
+ *
+ * ##usage
+ *
+ * mediaResource.deleteById(1234)
+ * .then(function() {
+ * alert('its gone!');
+ * });
+ *
+ *
+ * @param {Int} id id of media item to delete
+ * @returns {Promise} resourcePromise object.
+ *
+ */
+ deleteById: function (id) {
+ return umbRequestHelper.resourcePromise(
+ $http.post(
+ umbRequestHelper.getApiUrl(
+ "mediaApiBaseUrl",
+ "DeleteById",
+ [{ id: id }])),
+ 'Failed to delete item ' + id);
+ },
+
+ /**
+ * @ngdoc method
+ * @name umbraco.resources.mediaResource#getByIds
+ * @methodOf umbraco.resources.mediaResource
+ *
+ * @description
+ * Gets an array of media items, given a collection of ids
+ *
+ * ##usage
+ *
+ * mediaResource.getByIds( [1234,2526,28262])
+ * .then(function(mediaArray) {
+ * var myDoc = contentArray;
+ * alert('they are here!');
+ * });
+ *
+ *
+ * @param {Array} ids ids of media items to return as an array
+ * @returns {Promise} resourcePromise object containing the media items array.
+ *
+ */
+ getByIds: function (ids) {
+
+ var idQuery = "";
+ _.each(ids, function (item) {
+ idQuery += "ids=" + item + "&";
+ });
+
+ return umbRequestHelper.resourcePromise(
+ $http.get(
+ umbRequestHelper.getApiUrl(
+ "mediaApiBaseUrl",
+ "GetByIds",
+ idQuery)),
+ 'Failed to retrieve data for media ids ' + ids);
+ },
+
+ /**
+ * @ngdoc method
+ * @name umbraco.resources.mediaResource#getScaffold
+ * @methodOf umbraco.resources.mediaResource
+ *
+ * @description
+ * Returns a scaffold of an empty media item, given the id of the media item to place it underneath and the media type alias.
+ *
+ * - Parent Id must be provided so umbraco knows where to store the media
+ * - Media Type alias must be provided so umbraco knows which properties to put on the media scaffold
+ *
+ * The scaffold is used to build editors for media that has not yet been populated with data.
+ *
+ * ##usage
+ *
+ * mediaResource.getScaffold(1234, 'folder')
+ * .then(function(scaffold) {
+ * var myDoc = scaffold;
+ * myDoc.name = "My new media item";
+ *
+ * mediaResource.save(myDoc, true)
+ * .then(function(media){
+ * alert("Retrieved, updated and saved again");
+ * });
+ * });
+ *
+ *
+ * @param {Int} parentId id of media item to return
+ * @param {String} alias mediatype alias to base the scaffold on
+ * @returns {Promise} resourcePromise object containing the media scaffold.
+ *
+ */
+ getScaffold: function (parentId, alias) {
+
+ return umbRequestHelper.resourcePromise(
+ $http.get(
+ umbRequestHelper.getApiUrl(
+ "mediaApiBaseUrl",
+ "GetEmpty",
+ [{ contentTypeAlias: alias }, { parentId: parentId }])),
+ 'Failed to retrieve data for empty media item type ' + alias);
+
+ },
+
+ rootMedia: function () {
+
+ return umbRequestHelper.resourcePromise(
+ $http.get(
+ umbRequestHelper.getApiUrl(
+ "mediaApiBaseUrl",
+ "GetRootMedia")),
+ 'Failed to retrieve data for root media');
+
+ },
+
+ /**
+ * @ngdoc method
+ * @name umbraco.resources.mediaResource#getChildren
+ * @methodOf umbraco.resources.mediaResource
+ *
+ * @description
+ * Gets children of a media item with a given id
+ *
+ * ##usage
+ *
+ * mediaResource.getChildren(1234, {pageSize: 10, pageNumber: 2})
+ * .then(function(contentArray) {
+ * var children = contentArray;
+ * alert('they are here!');
+ * });
+ *
+ *
+ * @param {Int} parentid id of content item to return children of
+ * @param {Object} options optional options object
+ * @param {Int} options.pageSize if paging data, number of nodes per page, default = 0
+ * @param {Int} options.pageNumber if paging data, current page index, default = 0
+ * @param {String} options.filter if provided, query will only return those with names matching the filter
+ * @param {String} options.orderDirection can be `Ascending` or `Descending` - Default: `Ascending`
+ * @param {String} options.orderBy property to order items by, default: `SortOrder`
+ * @returns {Promise} resourcePromise object containing an array of content items.
+ *
+ */
+ getChildren: function (parentId, options) {
+
+ var defaults = {
+ pageSize: 0,
+ pageNumber: 0,
+ filter: '',
+ orderDirection: "Ascending",
+ orderBy: "SortOrder",
+ orderBySystemField: true
+ };
+ if (options === undefined) {
+ options = {};
+ }
+ //overwrite the defaults if there are any specified
+ angular.extend(defaults, options);
+ //now copy back to the options we will use
+ options = defaults;
+ //change asc/desct
+ if (options.orderDirection === "asc") {
+ options.orderDirection = "Ascending";
+ }
+ else if (options.orderDirection === "desc") {
+ options.orderDirection = "Descending";
+ }
+
+ //converts the value to a js bool
+ function toBool(v) {
+ if (angular.isNumber(v)) {
+ return v > 0;
+ }
+ if (angular.isString(v)) {
+ return v === "true";
+ }
+ if (typeof v === "boolean") {
+ return v;
+ }
+ return false;
+ }
+
+ return umbRequestHelper.resourcePromise(
+ $http.get(
+ umbRequestHelper.getApiUrl(
+ "mediaApiBaseUrl",
+ "GetChildren",
+ [
+ { id: parentId },
+ { pageNumber: options.pageNumber },
+ { pageSize: options.pageSize },
+ { orderBy: options.orderBy },
+ { orderDirection: options.orderDirection },
+ { orderBySystemField: toBool(options.orderBySystemField) },
+ { filter: options.filter }
+ ])),
+ 'Failed to retrieve children for media item ' + parentId);
+ },
+
+ /**
+ * @ngdoc method
+ * @name umbraco.resources.mediaResource#save
+ * @methodOf umbraco.resources.mediaResource
+ *
+ * @description
+ * Saves changes made to a media item, if the media item is new, the isNew paramater must be passed to force creation
+ * if the media item needs to have files attached, they must be provided as the files param and passed separately
+ *
+ *
+ * ##usage
+ *
+ * mediaResource.getById(1234)
+ * .then(function(media) {
+ * media.name = "I want a new name!";
+ * mediaResource.save(media, false)
+ * .then(function(media){
+ * alert("Retrieved, updated and saved again");
+ * });
+ * });
+ *
+ *
+ * @param {Object} media The media item object with changes applied
+ * @param {Bool} isNew set to true to create a new item or to update an existing
+ * @param {Array} files collection of files for the media item
+ * @returns {Promise} resourcePromise object containing the saved media item.
+ *
+ */
+ save: function (media, isNew, files) {
+ return saveMediaItem(media, "save" + (isNew ? "New" : ""), files);
+ },
+
+ /**
+ * @ngdoc method
+ * @name umbraco.resources.mediaResource#addFolder
+ * @methodOf umbraco.resources.mediaResource
+ *
+ * @description
+ * Shorthand for adding a media item of the type "Folder" under a given parent ID
+ *
+ * ##usage
+ *
+ * mediaResource.addFolder("My gallery", 1234)
+ * .then(function(folder) {
+ * alert('New folder');
+ * });
+ *
+ *
+ * @param {string} name Name of the folder to create
+ * @param {int} parentId Id of the media item to create the folder underneath
+ * @returns {Promise} resourcePromise object.
+ *
+ */
+ addFolder: function (name, parentId) {
+ return umbRequestHelper.resourcePromise(
+ $http.post(umbRequestHelper
+ .getApiUrl("mediaApiBaseUrl", "PostAddFolder"),
+ {
+ name: name,
+ parentId: parentId
+ }),
+ 'Failed to add folder');
+ },
+
+ /**
+ * @ngdoc method
+ * @name umbraco.resources.mediaResource#getChildFolders
+ * @methodOf umbraco.resources.mediaResource
+ *
+ * @description
+ * Retrieves all media children with types used as folders.
+ * Uses the convention of looking for media items with mediaTypes ending in
+ * *Folder so will match "Folder", "bannerFolder", "secureFolder" etc,
+ *
+ * ##usage
+ *
+ * mediaResource.getChildFolders(1234)
+ * .then(function(data) {
+ * alert('folders');
+ * });
+ *
+ *
+ * @param {int} parentId Id of the media item to query for child folders
+ * @returns {Promise} resourcePromise object.
+ *
+ */
+ getChildFolders: function (parentId) {
+ if (!parentId) {
+ parentId = -1;
+ }
+
+ return umbRequestHelper.resourcePromise(
+ $http.get(
+ umbRequestHelper.getApiUrl(
+ "mediaApiBaseUrl",
+ "GetChildFolders",
+ [
+ { id: parentId }
+ ])),
+ 'Failed to retrieve child folders for media item ' + parentId);
+ },
+
+ /**
+ * @ngdoc method
+ * @name umbraco.resources.mediaResource#emptyRecycleBin
+ * @methodOf umbraco.resources.mediaResource
+ *
+ * @description
+ * Empties the media recycle bin
+ *
+ * ##usage
+ *
+ * mediaResource.emptyRecycleBin()
+ * .then(function() {
+ * alert('its empty!');
+ * });
+ *
+ *
+ * @returns {Promise} resourcePromise object.
+ *
+ */
+ emptyRecycleBin: function () {
+ return umbRequestHelper.resourcePromise(
+ $http.post(
+ umbRequestHelper.getApiUrl(
+ "mediaApiBaseUrl",
+ "EmptyRecycleBin")),
+ 'Failed to empty the recycle bin');
+ }
+ };
+}
+
+angular.module('umbraco.resources').factory('mediaResource', mediaResource);
+
+/**
+ * @ngdoc service
+ * @name umbraco.resources.mediaTypeResource
+ * @description Loads in data for media types
+ **/
+function mediaTypeResource($q, $http, umbRequestHelper, umbDataFormatter) {
+
+ return {
+
+ getCount: function () {
+ return umbRequestHelper.resourcePromise(
+ $http.get(
+ umbRequestHelper.getApiUrl(
+ "mediaTypeApiBaseUrl",
+ "GetCount")),
+ 'Failed to retrieve count');
+ },
+
+ getAvailableCompositeContentTypes: function (contentTypeId, filterContentTypes, filterPropertyTypes) {
+ if (!filterContentTypes) {
+ filterContentTypes = [];
+ }
+ if (!filterPropertyTypes) {
+ filterPropertyTypes = [];
+ }
+
+ var query = {
+ contentTypeId: contentTypeId,
+ filterContentTypes: filterContentTypes,
+ filterPropertyTypes: filterPropertyTypes
+ };
+
+ return umbRequestHelper.resourcePromise(
+ $http.post(
+ umbRequestHelper.getApiUrl(
+ "mediaTypeApiBaseUrl",
+ "GetAvailableCompositeMediaTypes"),
+ query),
+ 'Failed to retrieve data for content type id ' + contentTypeId);
+ },
+
+ /**
+ * @ngdoc method
+ * @name umbraco.resources.mediaTypeResource#getAllowedTypes
+ * @methodOf umbraco.resources.mediaTypeResource
+ *
+ * @description
+ * Returns a list of allowed media types underneath a media item with a given ID
+ *
+ * ##usage
+ *
+ * mediaTypeResource.getAllowedTypes(1234)
+ * .then(function(array) {
+ * $scope.type = type;
+ * });
+ *
+ * @param {Int} mediaId id of the media item to retrive allowed child types for
+ * @returns {Promise} resourcePromise object.
+ *
+ */
+ getAllowedTypes: function (mediaId) {
+
+ return umbRequestHelper.resourcePromise(
+ $http.get(
+ umbRequestHelper.getApiUrl(
+ "mediaTypeApiBaseUrl",
+ "GetAllowedChildren",
+ [{ contentId: mediaId }])),
+ 'Failed to retrieve allowed types for media id ' + mediaId);
+ },
+
+ getById: function (id) {
+
+ return umbRequestHelper.resourcePromise(
+ $http.get(
+ umbRequestHelper.getApiUrl(
+ "mediaTypeApiBaseUrl",
+ "GetById",
+ [{ id: id }])),
+ 'Failed to retrieve content type');
+ },
+
+ getAll: function () {
+
+ return umbRequestHelper.resourcePromise(
+ $http.get(
+ umbRequestHelper.getApiUrl(
+ "mediaTypeApiBaseUrl",
+ "GetAll")),
+ 'Failed to retrieve all content types');
+ },
+
+ getScaffold: function (parentId) {
+
+ return umbRequestHelper.resourcePromise(
+ $http.get(
+ umbRequestHelper.getApiUrl(
+ "mediaTypeApiBaseUrl",
+ "GetEmpty", { parentId: parentId })),
+ 'Failed to retrieve content type scaffold');
+ },
+
+ deleteById: function (id) {
+
+ return umbRequestHelper.resourcePromise(
+ $http.post(
+ umbRequestHelper.getApiUrl(
+ "mediaTypeApiBaseUrl",
+ "DeleteById",
+ [{ id: id }])),
+ 'Failed to retrieve content type');
+ },
+
+ deleteContainerById: function (id) {
+
+ return umbRequestHelper.resourcePromise(
+ $http.post(
+ umbRequestHelper.getApiUrl(
+ "mediaTypeApiBaseUrl",
+ "DeleteContainer",
+ [{ id: id }])),
+ 'Failed to delete content type contaier');
+ },
+
+ save: function (contentType) {
+
+ var saveModel = umbDataFormatter.formatContentTypePostData(contentType);
+
+ return umbRequestHelper.resourcePromise(
+ $http.post(umbRequestHelper.getApiUrl("mediaTypeApiBaseUrl", "PostSave"), saveModel),
+ 'Failed to save data for content type id ' + contentType.id);
+ },
+
+ /**
+ * @ngdoc method
+ * @name umbraco.resources.mediaTypeResource#move
+ * @methodOf umbraco.resources.mediaTypeResource
+ *
+ * @description
+ * Moves a node underneath a new parentId
+ *
+ * ##usage
+ *
+ * mediaTypeResource.move({ parentId: 1244, id: 123 })
+ * .then(function() {
+ * alert("node was moved");
+ * }, function(err){
+ * alert("node didnt move:" + err.data.Message);
+ * });
+ *
+ * @param {Object} args arguments object
+ * @param {Int} args.idd the ID of the node to move
+ * @param {Int} args.parentId the ID of the parent node to move to
+ * @returns {Promise} resourcePromise object.
+ *
+ */
+ move: function (args) {
+ if (!args) {
+ throw "args cannot be null";
+ }
+ if (!args.parentId) {
+ throw "args.parentId cannot be null";
+ }
+ if (!args.id) {
+ throw "args.id cannot be null";
+ }
+
+ return umbRequestHelper.resourcePromise(
+ $http.post(umbRequestHelper.getApiUrl("mediaTypeApiBaseUrl", "PostMove"),
+ {
+ parentId: args.parentId,
+ id: args.id
+ }),
+ 'Failed to move content');
+ },
+
+ copy: function (args) {
+ if (!args) {
+ throw "args cannot be null";
+ }
+ if (!args.parentId) {
+ throw "args.parentId cannot be null";
+ }
+ if (!args.id) {
+ throw "args.id cannot be null";
+ }
+
+ return umbRequestHelper.resourcePromise(
+ $http.post(umbRequestHelper.getApiUrl("mediaTypeApiBaseUrl", "PostCopy"),
+ {
+ parentId: args.parentId,
+ id: args.id
+ }),
+ 'Failed to copy content');
+ },
+
+ createContainer: function(parentId, name) {
+
+ return umbRequestHelper.resourcePromise(
+ $http.post(
+ umbRequestHelper.getApiUrl(
+ "mediaTypeApiBaseUrl",
+ "PostCreateContainer",
+ { parentId: parentId, name: name })),
+ 'Failed to create a folder under parent id ' + parentId);
+ }
+
+ };
+}
+angular.module('umbraco.resources').factory('mediaTypeResource', mediaTypeResource);
+
+/**
+ * @ngdoc service
+ * @name umbraco.resources.memberResource
+ * @description Loads in data for members
+ **/
+function memberResource($q, $http, umbDataFormatter, umbRequestHelper) {
+
+ /** internal method process the saving of data and post processing the result */
+ function saveMember(content, action, files) {
+
+ return umbRequestHelper.postSaveContent({
+ restApiUrl: umbRequestHelper.getApiUrl(
+ "memberApiBaseUrl",
+ "PostSave"),
+ content: content,
+ action: action,
+ files: files,
+ dataFormatter: function (c, a) {
+ return umbDataFormatter.formatMemberPostData(c, a);
+ }
+ });
+ }
+
+ return {
+
+ getPagedResults: function (memberTypeAlias, options) {
+
+ if (memberTypeAlias === 'all-members') {
+ memberTypeAlias = null;
+ }
+
+ var defaults = {
+ pageSize: 25,
+ pageNumber: 1,
+ filter: '',
+ orderDirection: "Ascending",
+ orderBy: "LoginName",
+ orderBySystemField: true
+ };
+ if (options === undefined) {
+ options = {};
+ }
+ //overwrite the defaults if there are any specified
+ angular.extend(defaults, options);
+ //now copy back to the options we will use
+ options = defaults;
+ //change asc/desct
+ if (options.orderDirection === "asc") {
+ options.orderDirection = "Ascending";
+ }
+ else if (options.orderDirection === "desc") {
+ options.orderDirection = "Descending";
+ }
+
+ //converts the value to a js bool
+ function toBool(v) {
+ if (angular.isNumber(v)) {
+ return v > 0;
+ }
+ if (angular.isString(v)) {
+ return v === "true";
+ }
+ if (typeof v === "boolean") {
+ return v;
+ }
+ return false;
+ }
+
+ var params = [
+ { pageNumber: options.pageNumber },
+ { pageSize: options.pageSize },
+ { orderBy: options.orderBy },
+ { orderDirection: options.orderDirection },
+ { orderBySystemField: toBool(options.orderBySystemField) },
+ { filter: options.filter }
+ ];
+ if (memberTypeAlias != null) {
+ params.push({ memberTypeAlias: memberTypeAlias });
+ }
+
+ return umbRequestHelper.resourcePromise(
+ $http.get(
+ umbRequestHelper.getApiUrl(
+ "memberApiBaseUrl",
+ "GetPagedResults",
+ params)),
+ 'Failed to retrieve member paged result');
+ },
+
+ getListNode: function (listName) {
+
+ return umbRequestHelper.resourcePromise(
+ $http.get(
+ umbRequestHelper.getApiUrl(
+ "memberApiBaseUrl",
+ "GetListNodeDisplay",
+ [{ listName: listName }])),
+ 'Failed to retrieve data for member list ' + listName);
+ },
+
+ /**
+ * @ngdoc method
+ * @name umbraco.resources.memberResource#getByKey
+ * @methodOf umbraco.resources.memberResource
+ *
+ * @description
+ * Gets a member item with a given key
+ *
+ * ##usage
+ *
+ * memberResource.getByKey("0000-0000-000-00000-000")
+ * .then(function(member) {
+ * var mymember = member;
+ * alert('its here!');
+ * });
+ *
+ *
+ * @param {Guid} key key of member item to return
+ * @returns {Promise} resourcePromise object containing the member item.
+ *
+ */
+ getByKey: function (key) {
+
+ return umbRequestHelper.resourcePromise(
+ $http.get(
+ umbRequestHelper.getApiUrl(
+ "memberApiBaseUrl",
+ "GetByKey",
+ [{ key: key }])),
+ 'Failed to retrieve data for member id ' + key);
+ },
+
+ /**
+ * @ngdoc method
+ * @name umbraco.resources.memberResource#deleteByKey
+ * @methodOf umbraco.resources.memberResource
+ *
+ * @description
+ * Deletes a member item with a given key
+ *
+ * ##usage
+ *
+ * memberResource.deleteByKey("0000-0000-000-00000-000")
+ * .then(function() {
+ * alert('its gone!');
+ * });
+ *
+ *
+ * @param {Guid} key id of member item to delete
+ * @returns {Promise} resourcePromise object.
+ *
+ */
+ deleteByKey: function (key) {
+ return umbRequestHelper.resourcePromise(
+ $http.post(
+ umbRequestHelper.getApiUrl(
+ "memberApiBaseUrl",
+ "DeleteByKey",
+ [{ key: key }])),
+ 'Failed to delete item ' + key);
+ },
+
+ /**
+ * @ngdoc method
+ * @name umbraco.resources.memberResource#getScaffold
+ * @methodOf umbraco.resources.memberResource
+ *
+ * @description
+ * Returns a scaffold of an empty member item, given the id of the member item to place it underneath and the member type alias.
+ *
+ * - Member Type alias must be provided so umbraco knows which properties to put on the member scaffold
+ *
+ * The scaffold is used to build editors for member that has not yet been populated with data.
+ *
+ * ##usage
+ *
+ * memberResource.getScaffold('client')
+ * .then(function(scaffold) {
+ * var myDoc = scaffold;
+ * myDoc.name = "My new member item";
+ *
+ * memberResource.save(myDoc, true)
+ * .then(function(member){
+ * alert("Retrieved, updated and saved again");
+ * });
+ * });
+ *
+ *
+ * @param {String} alias membertype alias to base the scaffold on
+ * @returns {Promise} resourcePromise object containing the member scaffold.
+ *
+ */
+ getScaffold: function (alias) {
+
+ if (alias) {
+ return umbRequestHelper.resourcePromise(
+ $http.get(
+ umbRequestHelper.getApiUrl(
+ "memberApiBaseUrl",
+ "GetEmpty",
+ [{ contentTypeAlias: alias }])),
+ 'Failed to retrieve data for empty member item type ' + alias);
+ }
+ else {
+ return umbRequestHelper.resourcePromise(
+ $http.get(
+ umbRequestHelper.getApiUrl(
+ "memberApiBaseUrl",
+ "GetEmpty")),
+ 'Failed to retrieve data for empty member item type ' + alias);
+ }
+
+ },
+
+ /**
+ * @ngdoc method
+ * @name umbraco.resources.memberResource#save
+ * @methodOf umbraco.resources.memberResource
+ *
+ * @description
+ * Saves changes made to a member, if the member is new, the isNew paramater must be passed to force creation
+ * if the member needs to have files attached, they must be provided as the files param and passed separately
+ *
+ *
+ * ##usage
+ *
+ * memberResource.getBykey("23234-sd8djsd-3h8d3j-sdh8d")
+ * .then(function(member) {
+ * member.name = "Bob";
+ * memberResource.save(member, false)
+ * .then(function(member){
+ * alert("Retrieved, updated and saved again");
+ * });
+ * });
+ *
+ *
+ * @param {Object} media The member item object with changes applied
+ * @param {Bool} isNew set to true to create a new item or to update an existing
+ * @param {Array} files collection of files for the media item
+ * @returns {Promise} resourcePromise object containing the saved media item.
+ *
+ */
+ save: function (member, isNew, files) {
+ return saveMember(member, "save" + (isNew ? "New" : ""), files);
+ }
+ };
+}
+
+angular.module('umbraco.resources').factory('memberResource', memberResource);
+
+/**
+ * @ngdoc service
+ * @name umbraco.resources.memberTypeResource
+ * @description Loads in data for member types
+ **/
+function memberTypeResource($q, $http, umbRequestHelper, umbDataFormatter) {
+
+ return {
+
+ getAvailableCompositeContentTypes: function (contentTypeId, filterContentTypes, filterPropertyTypes) {
+ if (!filterContentTypes) {
+ filterContentTypes = [];
+ }
+ if (!filterPropertyTypes) {
+ filterPropertyTypes = [];
+ }
+
+ var query = "";
+ _.each(filterContentTypes, function (item) {
+ query += "filterContentTypes=" + item + "&";
+ });
// if filterContentTypes array is empty we need a empty variable in the querystring otherwise the service returns a error
- if (filterContentTypes.length === 0) {
- query += "filterContentTypes=&";
- }
- _.each(filterPropertyTypes, function (item) {
- query += "filterPropertyTypes=" + item + "&";
- });
+ if (filterContentTypes.length === 0) {
+ query += "filterContentTypes=&";
+ }
+ _.each(filterPropertyTypes, function (item) {
+ query += "filterPropertyTypes=" + item + "&";
+ });
// if filterPropertyTypes array is empty we need a empty variable in the querystring otherwise the service returns a error
- if (filterPropertyTypes.length === 0) {
- query += "filterPropertyTypes=&";
- }
- query += "contentTypeId=" + contentTypeId;
-
- return umbRequestHelper.resourcePromise(
- $http.get(
- umbRequestHelper.getApiUrl(
- "memberTypeApiBaseUrl",
- "GetAvailableCompositeMemberTypes",
- query)),
- 'Failed to retrieve data for content type id ' + contentTypeId);
- },
-
- //return all member types
- getTypes: function () {
-
- return umbRequestHelper.resourcePromise(
- $http.get(
- umbRequestHelper.getApiUrl(
- "memberTypeApiBaseUrl",
- "GetAllTypes")),
- 'Failed to retrieve data for member types id');
- },
-
- getById: function (id) {
-
- return umbRequestHelper.resourcePromise(
- $http.get(
- umbRequestHelper.getApiUrl(
- "memberTypeApiBaseUrl",
- "GetById",
- [{ id: id }])),
- 'Failed to retrieve content type');
- },
-
- deleteById: function (id) {
-
- return umbRequestHelper.resourcePromise(
- $http.post(
- umbRequestHelper.getApiUrl(
- "memberTypeApiBaseUrl",
- "DeleteById",
- [{ id: id }])),
- 'Failed to delete member type');
- },
-
- getScaffold: function () {
-
- return umbRequestHelper.resourcePromise(
- $http.get(
- umbRequestHelper.getApiUrl(
- "memberTypeApiBaseUrl",
- "GetEmpty")),
- 'Failed to retrieve content type scaffold');
- },
-
- /**
- * @ngdoc method
- * @name umbraco.resources.contentTypeResource#save
- * @methodOf umbraco.resources.contentTypeResource
- *
- * @description
- * Saves or update a member type
- *
- * @param {Object} content data type object to create/update
- * @returns {Promise} resourcePromise object.
- *
- */
- save: function (contentType) {
-
- var saveModel = umbDataFormatter.formatContentTypePostData(contentType);
-
- return umbRequestHelper.resourcePromise(
- $http.post(umbRequestHelper.getApiUrl("memberTypeApiBaseUrl", "PostSave"), saveModel),
- 'Failed to save data for member type id ' + contentType.id);
- }
-
- };
-}
-angular.module('umbraco.resources').factory('memberTypeResource', memberTypeResource);
-
+ if (filterPropertyTypes.length === 0) {
+ query += "filterPropertyTypes=&";
+ }
+ query += "contentTypeId=" + contentTypeId;
+
+ return umbRequestHelper.resourcePromise(
+ $http.get(
+ umbRequestHelper.getApiUrl(
+ "memberTypeApiBaseUrl",
+ "GetAvailableCompositeMemberTypes",
+ query)),
+ 'Failed to retrieve data for content type id ' + contentTypeId);
+ },
+
+ //return all member types
+ getTypes: function () {
+
+ return umbRequestHelper.resourcePromise(
+ $http.get(
+ umbRequestHelper.getApiUrl(
+ "memberTypeApiBaseUrl",
+ "GetAllTypes")),
+ 'Failed to retrieve data for member types id');
+ },
+
+ getById: function (id) {
+
+ return umbRequestHelper.resourcePromise(
+ $http.get(
+ umbRequestHelper.getApiUrl(
+ "memberTypeApiBaseUrl",
+ "GetById",
+ [{ id: id }])),
+ 'Failed to retrieve content type');
+ },
+
+ deleteById: function (id) {
+
+ return umbRequestHelper.resourcePromise(
+ $http.post(
+ umbRequestHelper.getApiUrl(
+ "memberTypeApiBaseUrl",
+ "DeleteById",
+ [{ id: id }])),
+ 'Failed to delete member type');
+ },
+
+ getScaffold: function () {
+
+ return umbRequestHelper.resourcePromise(
+ $http.get(
+ umbRequestHelper.getApiUrl(
+ "memberTypeApiBaseUrl",
+ "GetEmpty")),
+ 'Failed to retrieve content type scaffold');
+ },
+
+ /**
+ * @ngdoc method
+ * @name umbraco.resources.contentTypeResource#save
+ * @methodOf umbraco.resources.contentTypeResource
+ *
+ * @description
+ * Saves or update a member type
+ *
+ * @param {Object} content data type object to create/update
+ * @returns {Promise} resourcePromise object.
+ *
+ */
+ save: function (contentType) {
+
+ var saveModel = umbDataFormatter.formatContentTypePostData(contentType);
+
+ return umbRequestHelper.resourcePromise(
+ $http.post(umbRequestHelper.getApiUrl("memberTypeApiBaseUrl", "PostSave"), saveModel),
+ 'Failed to save data for member type id ' + contentType.id);
+ }
+
+ };
+}
+angular.module('umbraco.resources').factory('memberTypeResource', memberTypeResource);
+
/**
* @ngdoc service
* @name umbraco.resources.ourPackageRepositoryResource
@@ -3546,7 +3591,7 @@ function ourPackageRepositoryResource($q, $http, umbDataFormatter, umbRequestHel
}
angular.module('umbraco.resources').factory('ourPackageRepositoryResource', ourPackageRepositoryResource);
-
+
/**
* @ngdoc service
* @name umbraco.resources.packageInstallResource
@@ -3695,7 +3740,7 @@ function packageResource($q, $http, umbDataFormatter, umbRequestHelper) {
}
angular.module('umbraco.resources').factory('packageResource', packageResource);
-
+
/**
* @ngdoc service
* @name umbraco.resources.redirectUrlResource
@@ -3815,7 +3860,7 @@ angular.module('umbraco.resources').factory('packageResource', packageResource);
angular.module('umbraco.resources').factory('redirectUrlsResource', redirectUrlsResource);
})();
-
+
/**
* @ngdoc service
* @name umbraco.resources.relationResource
@@ -3880,37 +3925,37 @@ function relationResource($q, $http, umbRequestHelper) {
};
}
-angular.module('umbraco.resources').factory('relationResource', relationResource);
-/**
- * @ngdoc service
- * @name umbraco.resources.sectionResource
- * @description Loads in data for section
- **/
-function sectionResource($q, $http, umbRequestHelper) {
-
- /** internal method to get the tree app url */
- function getSectionsUrl(section) {
- return Umbraco.Sys.ServerVariables.sectionApiBaseUrl + "GetSections";
- }
-
- //the factory object returned
- return {
- /** Loads in the data to display the section list */
- getSections: function () {
-
- return umbRequestHelper.resourcePromise(
- $http.get(
- umbRequestHelper.getApiUrl(
- "sectionApiBaseUrl",
- "GetSections")),
- 'Failed to retrieve data for sections');
-
- }
- };
-}
-
-angular.module('umbraco.resources').factory('sectionResource', sectionResource);
-
+angular.module('umbraco.resources').factory('relationResource', relationResource);
+/**
+ * @ngdoc service
+ * @name umbraco.resources.sectionResource
+ * @description Loads in data for section
+ **/
+function sectionResource($q, $http, umbRequestHelper) {
+
+ /** internal method to get the tree app url */
+ function getSectionsUrl(section) {
+ return Umbraco.Sys.ServerVariables.sectionApiBaseUrl + "GetSections";
+ }
+
+ //the factory object returned
+ return {
+ /** Loads in the data to display the section list */
+ getSections: function () {
+
+ return umbRequestHelper.resourcePromise(
+ $http.get(
+ umbRequestHelper.getApiUrl(
+ "sectionApiBaseUrl",
+ "GetSections")),
+ 'Failed to retrieve data for sections');
+
+ }
+ };
+}
+
+angular.module('umbraco.resources').factory('sectionResource', sectionResource);
+
/**
* @ngdoc service
* @name umbraco.resources.stylesheetResource
@@ -3983,94 +4028,94 @@ function stylesheetResource($q, $http, umbRequestHelper) {
}
angular.module('umbraco.resources').factory('stylesheetResource', stylesheetResource);
-
-/**
- * @ngdoc service
- * @name umbraco.resources.treeResource
- * @description Loads in data for trees
- **/
-function treeResource($q, $http, umbRequestHelper) {
-
- /** internal method to get the tree node's children url */
- function getTreeNodesUrl(node) {
- if (!node.childNodesUrl) {
- throw "No childNodesUrl property found on the tree node, cannot load child nodes";
- }
- return node.childNodesUrl;
- }
-
- /** internal method to get the tree menu url */
- function getTreeMenuUrl(node) {
- if (!node.menuUrl) {
- return null;
- }
- return node.menuUrl;
- }
-
- //the factory object returned
- return {
-
- /** Loads in the data to display the nodes menu */
- loadMenu: function (node) {
- var treeMenuUrl = getTreeMenuUrl(node);
- if (treeMenuUrl !== undefined && treeMenuUrl !== null && treeMenuUrl.length > 0) {
- return umbRequestHelper.resourcePromise(
- $http.get(getTreeMenuUrl(node)),
- "Failed to retrieve data for a node's menu " + node.id);
- } else {
- return $q.reject({
- errorMsg: "No tree menu url defined for node " + node.id
- });
- }
- },
-
- /** Loads in the data to display the nodes for an application */
- loadApplication: function (options) {
-
- if (!options || !options.section) {
- throw "The object specified for does not contain a 'section' property";
- }
-
- if(!options.tree){
- options.tree = "";
- }
- if (!options.isDialog) {
- options.isDialog = false;
- }
-
- //create the query string for the tree request, these are the mandatory options:
- var query = "application=" + options.section + "&tree=" + options.tree + "&isDialog=" + options.isDialog;
-
- //the options can contain extra query string parameters
- if (options.queryString) {
- query += "&" + options.queryString;
- }
-
- return umbRequestHelper.resourcePromise(
- $http.get(
- umbRequestHelper.getApiUrl(
- "treeApplicationApiBaseUrl",
- "GetApplicationTrees",
- query)),
- 'Failed to retrieve data for application tree ' + options.section);
- },
-
- /** Loads in the data to display the child nodes for a given node */
- loadNodes: function (options) {
-
- if (!options || !options.node) {
- throw "The options parameter object does not contain the required properties: 'node'";
- }
-
- return umbRequestHelper.resourcePromise(
- $http.get(getTreeNodesUrl(options.node)),
- 'Failed to retrieve data for child nodes ' + options.node.nodeId);
- }
- };
-}
-
-angular.module('umbraco.resources').factory('treeResource', treeResource);
-
+
+/**
+ * @ngdoc service
+ * @name umbraco.resources.treeResource
+ * @description Loads in data for trees
+ **/
+function treeResource($q, $http, umbRequestHelper) {
+
+ /** internal method to get the tree node's children url */
+ function getTreeNodesUrl(node) {
+ if (!node.childNodesUrl) {
+ throw "No childNodesUrl property found on the tree node, cannot load child nodes";
+ }
+ return node.childNodesUrl;
+ }
+
+ /** internal method to get the tree menu url */
+ function getTreeMenuUrl(node) {
+ if (!node.menuUrl) {
+ return null;
+ }
+ return node.menuUrl;
+ }
+
+ //the factory object returned
+ return {
+
+ /** Loads in the data to display the nodes menu */
+ loadMenu: function (node) {
+ var treeMenuUrl = getTreeMenuUrl(node);
+ if (treeMenuUrl !== undefined && treeMenuUrl !== null && treeMenuUrl.length > 0) {
+ return umbRequestHelper.resourcePromise(
+ $http.get(getTreeMenuUrl(node)),
+ "Failed to retrieve data for a node's menu " + node.id);
+ } else {
+ return $q.reject({
+ errorMsg: "No tree menu url defined for node " + node.id
+ });
+ }
+ },
+
+ /** Loads in the data to display the nodes for an application */
+ loadApplication: function (options) {
+
+ if (!options || !options.section) {
+ throw "The object specified for does not contain a 'section' property";
+ }
+
+ if(!options.tree){
+ options.tree = "";
+ }
+ if (!options.isDialog) {
+ options.isDialog = false;
+ }
+
+ //create the query string for the tree request, these are the mandatory options:
+ var query = "application=" + options.section + "&tree=" + options.tree + "&isDialog=" + options.isDialog;
+
+ //the options can contain extra query string parameters
+ if (options.queryString) {
+ query += "&" + options.queryString;
+ }
+
+ return umbRequestHelper.resourcePromise(
+ $http.get(
+ umbRequestHelper.getApiUrl(
+ "treeApplicationApiBaseUrl",
+ "GetApplicationTrees",
+ query)),
+ 'Failed to retrieve data for application tree ' + options.section);
+ },
+
+ /** Loads in the data to display the child nodes for a given node */
+ loadNodes: function (options) {
+
+ if (!options || !options.node) {
+ throw "The options parameter object does not contain the required properties: 'node'";
+ }
+
+ return umbRequestHelper.resourcePromise(
+ $http.get(getTreeNodesUrl(options.node)),
+ 'Failed to retrieve data for child nodes ' + options.node.nodeId);
+ }
+ };
+}
+
+angular.module('umbraco.resources').factory('treeResource', treeResource);
+
/**
* @ngdoc service
* @name umbraco.resources.userResource
@@ -4096,6 +4141,6 @@ function userResource($q, $http, umbDataFormatter, umbRequestHelper) {
}
angular.module('umbraco.resources').factory('userResource', userResource);
-
-
+
+
})();
\ No newline at end of file
diff --git a/OurUmbraco.Site/umbraco/js/umbraco.security.js b/OurUmbraco.Site/umbraco/js/umbraco.security.js
index dca763f5..59c4d215 100644
--- a/OurUmbraco.Site/umbraco/js/umbraco.security.js
+++ b/OurUmbraco.Site/umbraco/js/umbraco.security.js
@@ -1,85 +1,105 @@
-/*! umbraco
- * https://github.com/umbraco/umbraco-cms/
- * Copyright (c) 2016 Umbraco HQ;
- * Licensed
- */
-
-(function() {
-
-//TODO: This is silly and unecessary to have a separate module for this
-angular.module('umbraco.security.retryQueue', []);
-angular.module('umbraco.security.interceptor', ['umbraco.security.retryQueue']);
-angular.module('umbraco.security', ['umbraco.security.retryQueue', 'umbraco.security.interceptor']);
-//TODO: This is silly and unecessary to have a separate module for this
-angular.module('umbraco.security.retryQueue', [])
-
-// This is a generic retry queue for security failures. Each item is expected to expose two functions: retry and cancel.
-.factory('securityRetryQueue', ['$q', '$log', function ($q, $log) {
-
- var retryQueue = [];
- var service = {
- // The security service puts its own handler in here!
- onItemAddedCallbacks: [],
-
- hasMore: function() {
- return retryQueue.length > 0;
- },
- push: function(retryItem) {
- retryQueue.push(retryItem);
- // Call all the onItemAdded callbacks
- angular.forEach(service.onItemAddedCallbacks, function(cb) {
- try {
- cb(retryItem);
- } catch(e) {
- $log.error('securityRetryQueue.push(retryItem): callback threw an error' + e);
- }
- });
- },
- pushRetryFn: function(reason, retryFn) {
- // The reason parameter is optional
- if ( arguments.length === 1) {
- retryFn = reason;
- reason = undefined;
- }
-
- // The deferred object that will be resolved or rejected by calling retry or cancel
- var deferred = $q.defer();
- var retryItem = {
- reason: reason,
- retry: function() {
- // Wrap the result of the retryFn into a promise if it is not already
- $q.when(retryFn()).then(function(value) {
- // If it was successful then resolve our deferred
- deferred.resolve(value);
- }, function(value) {
- // Othewise reject it
- deferred.reject(value);
- });
- },
- cancel: function() {
- // Give up on retrying and reject our deferred
- deferred.reject();
- }
- };
- service.push(retryItem);
- return deferred.promise;
- },
- retryReason: function() {
- return service.hasMore() && retryQueue[0].reason;
- },
- cancelAll: function() {
- while(service.hasMore()) {
- retryQueue.shift().cancel();
- }
- },
- retryAll: function() {
- while(service.hasMore()) {
- retryQueue.shift().retry();
- }
- }
- };
- return service;
-}]);
+/*! umbraco
+ * https://github.com/umbraco/umbraco-cms/
+ * Copyright (c) 2016 Umbraco HQ;
+ * Licensed
+ */
+
+(function() {
+
+//TODO: This is silly and unecessary to have a separate module for this
+angular.module('umbraco.security.retryQueue', []);
+angular.module('umbraco.security.interceptor', ['umbraco.security.retryQueue']);
+angular.module('umbraco.security', ['umbraco.security.retryQueue', 'umbraco.security.interceptor']);
+//TODO: This is silly and unecessary to have a separate module for this
+angular.module('umbraco.security.retryQueue', [])
+
+// This is a generic retry queue for security failures. Each item is expected to expose two functions: retry and cancel.
+.factory('securityRetryQueue', ['$q', '$log', function ($q, $log) {
+
+ var retryQueue = [];
+ var retryUser = null;
+
+ var service = {
+ // The security service puts its own handler in here!
+ onItemAddedCallbacks: [],
+
+ hasMore: function() {
+ return retryQueue.length > 0;
+ },
+ push: function(retryItem) {
+ retryQueue.push(retryItem);
+ // Call all the onItemAdded callbacks
+ angular.forEach(service.onItemAddedCallbacks, function(cb) {
+ try {
+ cb(retryItem);
+ } catch(e) {
+ $log.error('securityRetryQueue.push(retryItem): callback threw an error' + e);
+ }
+ });
+ },
+ pushRetryFn: function(reason, userName, retryFn) {
+ // The reason parameter is optional
+ if ( arguments.length === 2) {
+ retryFn = userName;
+ userName = reason;
+ reason = undefined;
+ }
+
+ if ((retryUser && retryUser !== userName) || userName === null) {
+ throw new Error('invalid user');
+ }
+
+ retryUser = userName;
+
+ // The deferred object that will be resolved or rejected by calling retry or cancel
+ var deferred = $q.defer();
+ var retryItem = {
+ reason: reason,
+ retry: function() {
+ // Wrap the result of the retryFn into a promise if it is not already
+ $q.when(retryFn()).then(function(value) {
+ // If it was successful then resolve our deferred
+ deferred.resolve(value);
+ }, function(value) {
+ // Othewise reject it
+ deferred.reject(value);
+ });
+ },
+ cancel: function() {
+ // Give up on retrying and reject our deferred
+ deferred.reject();
+ }
+ };
+ service.push(retryItem);
+ return deferred.promise;
+ },
+ retryReason: function() {
+ return service.hasMore() && retryQueue[0].reason;
+ },
+ cancelAll: function() {
+ while(service.hasMore()) {
+ retryQueue.shift().cancel();
+ }
+ retryUser = null;
+ },
+ retryAll: function (userName) {
+
+ if (retryUser == null) {
+ return;
+ }
+
+ if (retryUser !== userName) {
+ service.cancelAll();
+ return;
+ }
+
+ while(service.hasMore()) {
+ retryQueue.shift().retry();
+ }
+ }
+ };
+ return service;
+}]);
angular.module('umbraco.security.interceptor')
// This http interceptor listens for authentication successes and failures
.factory('securityInterceptor', ['$injector', 'securityRetryQueue', 'notificationsService', 'requestInterceptorFilter', function ($injector, queue, notifications, requestInterceptorFilter) {
@@ -88,7 +108,7 @@ angular.module('umbraco.security.interceptor')
return promise.then(
function(originalResponse) {
// Intercept successful requests
-
+
//Here we'll check if our custom header is in the response which indicates how many seconds the user's session has before it
//expires. Then we'll update the user in the user service accordingly.
var headers = originalResponse.headers();
@@ -97,11 +117,11 @@ angular.module('umbraco.security.interceptor')
var userService = $injector.get('userService');
userService.setUserTimeout(headers["x-umb-user-seconds"]);
}
-
+
return promise;
}, function(originalResponse) {
// Intercept failed requests
-
+
//Here we'll check if we should ignore the error, this will be based on an original header set
var headers = originalResponse.config ? originalResponse.config.headers : {};
if (headers["x-umb-ignore-error"] === "ignore") {
@@ -118,17 +138,24 @@ angular.module('umbraco.security.interceptor')
//A 401 means that the user is not logged in
if (originalResponse.status === 401) {
- // The request bounced because it was not authorized - add a new request to the retry queue
- promise = queue.pushRetryFn('unauthorized-server', function retryRequest() {
+ var userService = $injector.get('userService'); // see above
+
+ //Associate the user name with the retry to ensure we retry for the right user
+ promise = userService.getCurrentUser()
+ .then(function (user) {
+ var userName = user ? user.name : null;
+ //The request bounced because it was not authorized - add a new request to the retry queue
+ return queue.pushRetryFn('unauthorized-server', userName, function retryRequest() {
// We must use $injector to get the $http service to prevent circular dependency
return $injector.get('$http')(originalResponse.config);
+ });
});
}
else if (originalResponse.status === 404) {
//a 404 indicates that the request was not found - this could be due to a non existing url, or it could
//be due to accessing a url with a parameter that doesn't exist, either way we should notifiy the user about it
-
+
var errMsg = "The URL returned a 404 (not found):
" + originalResponse.config.url.split('?')[0] + " ";
if (originalResponse.data && originalResponse.data.ExceptionMessage) {
errMsg += "
with error:
" + originalResponse.data.ExceptionMessage + " ";
@@ -140,17 +167,17 @@ angular.module('umbraco.security.interceptor')
notifications.error(
"Request error",
errMsg);
-
+
}
else if (originalResponse.status === 403) {
//if the status was a 403 it means the user didn't have permission to do what the request was trying to do.
- //How do we deal with this now, need to tell the user somehow that they don't have permission to do the thing that was
+ //How do we deal with this now, need to tell the user somehow that they don't have permission to do the thing that was
//requested. We can either deal with this globally here, or we can deal with it globally for individual requests on the umbRequestHelper,
// or completely custom for services calling resources.
//http://issues.umbraco.org/issue/U4-2749
- //It was decided to just put these messages into the normal status messages.
+ //It was decided to just put these messages into the normal status messages.
var msg = "Unauthorized access to URL:
" + originalResponse.config.url.split('?')[0] + " ";
if (originalResponse.config.data) {
@@ -174,6 +201,6 @@ angular.module('umbraco.security.interceptor')
// We have to add the interceptor to the queue as a string because the interceptor depends upon service instances that are not available in the config block.
.config(['$httpProvider', function ($httpProvider) {
$httpProvider.responseInterceptors.push('securityInterceptor');
- }]);
-
+ }]);
+
})();
\ No newline at end of file
diff --git a/OurUmbraco.Site/umbraco/js/umbraco.servervariables.js b/OurUmbraco.Site/umbraco/js/umbraco.servervariables.js
index 7ba14485..a68606ef 100644
--- a/OurUmbraco.Site/umbraco/js/umbraco.servervariables.js
+++ b/OurUmbraco.Site/umbraco/js/umbraco.servervariables.js
@@ -1,42 +1,42 @@
-//create the namespace (NOTE: This loads before any dependencies so we don't have a namespace mgr so we just create it manually)
-var Umbraco = {};
-Umbraco.Sys = {};
-//define a global static object
-Umbraco.Sys.ServerVariables = {
- umbracoUrls: {
- "contentApiBaseUrl": "/umbraco/UmbracoApi/Content/",
- "mediaApiBaseUrl": "/umbraco/UmbracoApi/Media/",
- "dataTypeApiBaseUrl": "/umbraco/UmbracoApi/DataType/",
- "sectionApiBaseUrl": "/umbraco/UmbracoApi/Section/",
- "treeApplicationApiBaseUrl": "/umbraco/UmbracoTrees/ApplicationTreeApi/",
- "contentTypeApiBaseUrl": "/umbraco/Api/ContentType/",
- "mediaTypeApiBaseUrl": "/umbraco/Api/MediaType/",
- "macroApiBaseUrl": "/umbraco/Api/Macro/",
- "authenticationApiBaseUrl": "/umbraco/UmbracoApi/Authentication/",
- //For this we'll just provide a file that exists during the mock session since we don't really have legay js tree stuff
- "legacyTreeJs": "/belle/lib/lazyload/empty.js",
- "serverVarsJs": "/belle/lib/lazyload/empty.js",
- "imagesApiBaseUrl": "/umbraco/UmbracoApi/Images/",
- "entityApiBaseUrl": "/umbraco/UmbracoApi/Entity/",
- "dashboardApiBaseUrl": "/umbraco/UmbracoApi/Dashboard/",
- "updateCheckApiBaseUrl": "/umbraco/Api/UpdateCheck/",
- "relationApiBaseUrl": "/umbraco/UmbracoApi/Relation/",
- "rteApiBaseUrl": "/umbraco/UmbracoApi/RichTextPreValue/"
- },
- umbracoSettings: {
- "umbracoPath": "/umbraco",
- "appPluginsPath" : "/App_Plugins",
- "imageFileTypes": "jpeg,jpg,gif,bmp,png,tiff,tif",
- "keepUserLoggedIn": true
- },
- umbracoPlugins: {
- trees: [
- { alias: "myTree", packageFolder: "MyPackage" }
- ]
- },
- isDebuggingEnabled: true,
- application: {
- assemblyVersion: "1",
- version: "7"
- }
+//create the namespace (NOTE: This loads before any dependencies so we don't have a namespace mgr so we just create it manually)
+var Umbraco = {};
+Umbraco.Sys = {};
+//define a global static object
+Umbraco.Sys.ServerVariables = {
+ umbracoUrls: {
+ "contentApiBaseUrl": "/umbraco/UmbracoApi/Content/",
+ "mediaApiBaseUrl": "/umbraco/UmbracoApi/Media/",
+ "dataTypeApiBaseUrl": "/umbraco/UmbracoApi/DataType/",
+ "sectionApiBaseUrl": "/umbraco/UmbracoApi/Section/",
+ "treeApplicationApiBaseUrl": "/umbraco/UmbracoTrees/ApplicationTreeApi/",
+ "contentTypeApiBaseUrl": "/umbraco/Api/ContentType/",
+ "mediaTypeApiBaseUrl": "/umbraco/Api/MediaType/",
+ "macroApiBaseUrl": "/umbraco/Api/Macro/",
+ "authenticationApiBaseUrl": "/umbraco/UmbracoApi/Authentication/",
+ //For this we'll just provide a file that exists during the mock session since we don't really have legay js tree stuff
+ "legacyTreeJs": "/belle/lib/lazyload/empty.js",
+ "serverVarsJs": "/belle/lib/lazyload/empty.js",
+ "imagesApiBaseUrl": "/umbraco/UmbracoApi/Images/",
+ "entityApiBaseUrl": "/umbraco/UmbracoApi/Entity/",
+ "dashboardApiBaseUrl": "/umbraco/UmbracoApi/Dashboard/",
+ "updateCheckApiBaseUrl": "/umbraco/Api/UpdateCheck/",
+ "relationApiBaseUrl": "/umbraco/UmbracoApi/Relation/",
+ "rteApiBaseUrl": "/umbraco/UmbracoApi/RichTextPreValue/"
+ },
+ umbracoSettings: {
+ "umbracoPath": "/umbraco",
+ "appPluginsPath" : "/App_Plugins",
+ "imageFileTypes": "jpeg,jpg,gif,bmp,png,tiff,tif",
+ "keepUserLoggedIn": true
+ },
+ umbracoPlugins: {
+ trees: [
+ { alias: "myTree", packageFolder: "MyPackage" }
+ ]
+ },
+ isDebuggingEnabled: true,
+ application: {
+ assemblyVersion: "1",
+ version: "7"
+ }
};
\ No newline at end of file
diff --git a/OurUmbraco.Site/umbraco/js/umbraco.services.js b/OurUmbraco.Site/umbraco/js/umbraco.services.js
index 61d867f9..13b5cd5f 100644
--- a/OurUmbraco.Site/umbraco/js/umbraco.services.js
+++ b/OurUmbraco.Site/umbraco/js/umbraco.services.js
@@ -2195,7 +2195,7 @@ angular.module('umbraco.services')
* @description
* Opens a content picker tree in a modal, the callback returns an array of selected documents
* @param {Object} options content picker dialog options object
- * @param {Boolean} options.multipicker should the picker return one or multiple items
+ * @param {Boolean} options.multiPicker should the picker return one or multiple items
* @param {Function} options.callback callback function
* @returns {Object} modal object
*/
@@ -8512,7 +8512,7 @@ angular.module('umbraco.services')
loginDialog = null;
if (success) {
- securityRetryQueue.retryAll();
+ securityRetryQueue.retryAll(currentUser.name);
}
else {
securityRetryQueue.cancelAll();
@@ -8520,9 +8520,9 @@ angular.module('umbraco.services')
}
}
- /**
- This methods will set the current user when it is resolved and
- will then start the counter to count in-memory how many seconds they have
+ /**
+ This methods will set the current user when it is resolved and
+ will then start the counter to count in-memory how many seconds they have
remaining on the auth session
*/
function setCurrentUser(usr) {
@@ -8535,8 +8535,8 @@ angular.module('umbraco.services')
countdownUserTimeout();
}
- /**
- Method to count down the current user's timeout seconds,
+ /**
+ Method to count down the current user's timeout seconds,
this will continually count down their current remaining seconds every 5 seconds until
there are no more seconds remaining.
*/
@@ -8551,8 +8551,8 @@ angular.module('umbraco.services')
//if there are more than 30 remaining seconds, recurse!
if (currentUser.remainingAuthSeconds > 30) {
- //we need to check when the last time the timeout was set from the server, if
- // it has been more than 30 seconds then we'll manually go and retrieve it from the
+ //we need to check when the last time the timeout was set from the server, if
+ // it has been more than 30 seconds then we'll manually go and retrieve it from the
// server - this helps to keep our local countdown in check with the true timeout.
if (lastServerTimeoutSet != null) {
var now = new Date();
@@ -8560,7 +8560,7 @@ angular.module('umbraco.services')
if (seconds > 30) {
- //first we'll set the lastServerTimeoutSet to null - this is so we don't get back in to this loop while we
+ //first we'll set the lastServerTimeoutSet to null - this is so we don't get back in to this loop while we
// wait for a response from the server otherwise we'll be making double/triple/etc... calls while we wait.
lastServerTimeoutSet = null;
@@ -8579,7 +8579,7 @@ angular.module('umbraco.services')
}
else {
- //we are either timed out or very close to timing out so we need to show the login dialog.
+ //we are either timed out or very close to timing out so we need to show the login dialog.
if (Umbraco.Sys.ServerVariables.umbracoSettings.keepUserLoggedIn !== true) {
//NOTE: the safeApply because our timeout is set to not run digests (performance reasons)
angularHelper.safeApply($rootScope, function () {
@@ -8590,14 +8590,14 @@ angular.module('umbraco.services')
}
finally {
userAuthExpired();
- }
+ }
});
}
else {
//we've got less than 30 seconds remaining so let's check the server
if (lastServerTimeoutSet != null) {
- //first we'll set the lastServerTimeoutSet to null - this is so we don't get back in to this loop while we
+ //first we'll set the lastServerTimeoutSet to null - this is so we don't get back in to this loop while we
// wait for a response from the server otherwise we'll be making double/triple/etc... calls while we wait.
lastServerTimeoutSet = null;
@@ -8692,8 +8692,8 @@ angular.module('umbraco.services')
return result;
});
},
-
- /** Logs the user out
+
+ /** Logs the user out
*/
logout: function () {
diff --git a/OurUmbraco.Site/umbraco/js/umbraco.testing.js b/OurUmbraco.Site/umbraco/js/umbraco.testing.js
index 62d3c12d..eed826e8 100644
--- a/OurUmbraco.Site/umbraco/js/umbraco.testing.js
+++ b/OurUmbraco.Site/umbraco/js/umbraco.testing.js
@@ -1,1323 +1,1323 @@
-/*! umbraco
- * https://github.com/umbraco/umbraco-cms/
- * Copyright (c) 2016 Umbraco HQ;
- * Licensed
- */
-
-(function() {
-
+/*! umbraco
+ * https://github.com/umbraco/umbraco-cms/
+ * Copyright (c) 2016 Umbraco HQ;
+ * Licensed
+ */
+
+(function() {
+
angular.module("umbraco.mocks", ['ngCookies']);
-angular.module("umbraco.mocks.services", []);
-angular.module('umbraco.mocks').
- factory('prevaluesMocks', ['$httpBackend', 'mocksUtils', function ($httpBackend, mocksUtils) {
- 'use strict';
-
- function getRichTextConfiguration(status, data, headers) {
- if (!mocksUtils.checkAuth()) {
- return [401, null, null];
- }
- else {
- return [200, { "plugins": [{ "name": "code", "useOnFrontend": true }, { "name": "paste", "useOnFrontend": true }, { "name": "umbracolink", "useOnFrontend": true }], "commands": [{ "icon": "images/editor/code.gif", "command": "code", "alias": "code", "userInterface": "false", "frontEndCommand": "code", "value": "", "priority": 1, "isStylePicker": false }, { "icon": "images/editor/removeformat.gif", "command": "removeformat", "alias": "removeformat", "userInterface": "false", "frontEndCommand": "removeformat", "value": "", "priority": 2, "isStylePicker": false }, { "icon": "images/editor/undo.gif", "command": "undo", "alias": "undo", "userInterface": "false", "frontEndCommand": "undo", "value": "", "priority": 11, "isStylePicker": false }, { "icon": "images/editor/redo.gif", "command": "redo", "alias": "redo", "userInterface": "false", "frontEndCommand": "redo", "value": "", "priority": 12, "isStylePicker": false }, { "icon": "images/editor/cut.gif", "command": "cut", "alias": "cut", "userInterface": "false", "frontEndCommand": "cut", "value": "", "priority": 13, "isStylePicker": false }, { "icon": "images/editor/copy.gif", "command": "copy", "alias": "copy", "userInterface": "false", "frontEndCommand": "copy", "value": "", "priority": 14, "isStylePicker": false }, { "icon": "images/editor/showStyles.png", "command": "styleselect", "alias": "styleselect", "userInterface": "false", "frontEndCommand": "styleselect", "value": "", "priority": 20, "isStylePicker": false }, { "icon": "images/editor/bold.gif", "command": "bold", "alias": "bold", "userInterface": "false", "frontEndCommand": "bold", "value": "", "priority": 21, "isStylePicker": false }, { "icon": "images/editor/italic.gif", "command": "italic", "alias": "italic", "userInterface": "false", "frontEndCommand": "italic", "value": "", "priority": 22, "isStylePicker": false }, { "icon": "images/editor/underline.gif", "command": "underline", "alias": "underline", "userInterface": "false", "frontEndCommand": "underline", "value": "", "priority": 23, "isStylePicker": false }, { "icon": "images/editor/strikethrough.gif", "command": "strikethrough", "alias": "strikethrough", "userInterface": "false", "frontEndCommand": "strikethrough", "value": "", "priority": 24, "isStylePicker": false }, { "icon": "images/editor/justifyleft.gif", "command": "justifyleft", "alias": "justifyleft", "userInterface": "false", "frontEndCommand": "alignleft", "value": "", "priority": 31, "isStylePicker": false }, { "icon": "images/editor/justifycenter.gif", "command": "justifycenter", "alias": "justifycenter", "userInterface": "false", "frontEndCommand": "aligncenter", "value": "", "priority": 32, "isStylePicker": false }, { "icon": "images/editor/justifyright.gif", "command": "justifyright", "alias": "justifyright", "userInterface": "false", "frontEndCommand": "alignright", "value": "", "priority": 33, "isStylePicker": false }, { "icon": "images/editor/justifyfull.gif", "command": "justifyfull", "alias": "justifyfull", "userInterface": "false", "frontEndCommand": "alignfull", "value": "", "priority": 34, "isStylePicker": false }, { "icon": "images/editor/bullist.gif", "command": "bullist", "alias": "bullist", "userInterface": "false", "frontEndCommand": "bullist", "value": "", "priority": 41, "isStylePicker": false }, { "icon": "images/editor/numlist.gif", "command": "numlist", "alias": "numlist", "userInterface": "false", "frontEndCommand": "numlist", "value": "", "priority": 42, "isStylePicker": false }, { "icon": "images/editor/outdent.gif", "command": "outdent", "alias": "outdent", "userInterface": "false", "frontEndCommand": "outdent", "value": "", "priority": 43, "isStylePicker": false }, { "icon": "images/editor/indent.gif", "command": "indent", "alias": "indent", "userInterface": "false", "frontEndCommand": "indent", "value": "", "priority": 44, "isStylePicker": false }, { "icon": "images/editor/link.gif", "command": "link", "alias": "mcelink", "userInterface": "true", "frontEndCommand": "link", "value": "", "priority": 51, "isStylePicker": false }, { "icon": "images/editor/unLink.gif", "command": "unlink", "alias": "unlink", "userInterface": "false", "frontEndCommand": "unlink", "value": "", "priority": 52, "isStylePicker": false }, { "icon": "images/editor/anchor.gif", "command": "anchor", "alias": "mceinsertanchor", "userInterface": "false", "frontEndCommand": "anchor", "value": "", "priority": 53, "isStylePicker": false }, { "icon": "images/editor/image.gif", "command": "image", "alias": "mceimage", "userInterface": "true", "frontEndCommand": "umbmediapicker", "value": "", "priority": 61, "isStylePicker": false }, { "icon": "images/editor/insMacro.gif", "command": "umbracomacro", "alias": "umbracomacro", "userInterface": "true", "frontEndCommand": "umbmacro", "value": "", "priority": 62, "isStylePicker": false }, { "icon": "images/editor/table.gif", "command": "table", "alias": "mceinserttable", "userInterface": "true", "frontEndCommand": "table", "value": "", "priority": 63, "isStylePicker": false }, { "icon": "images/editor/media.gif", "command": "umbracoembed", "alias": "umbracoembed", "userInterface": "true", "frontEndCommand": "umbembeddialog", "value": "", "priority": 66, "isStylePicker": false }, { "icon": "images/editor/hr.gif", "command": "hr", "alias": "inserthorizontalrule", "userInterface": "false", "frontEndCommand": "hr", "value": "", "priority": 71, "isStylePicker": false }, { "icon": "images/editor/sub.gif", "command": "sub", "alias": "subscript", "userInterface": "false", "frontEndCommand": "sub", "value": "", "priority": 72, "isStylePicker": false }, { "icon": "images/editor/sup.gif", "command": "sup", "alias": "superscript", "userInterface": "false", "frontEndCommand": "sup", "value": "", "priority": 73, "isStylePicker": false }, { "icon": "images/editor/charmap.gif", "command": "charmap", "alias": "mcecharmap", "userInterface": "false", "frontEndCommand": "charmap", "value": "", "priority": 74, "isStylePicker": false }], "validElements": "+a[id|style|rel|rev|charset|hreflang|dir|lang|tabindex|accesskey|type|name|href|target|title|class|onfocus|onblur|onclick|ondblclick|onmousedown|onmouseup|onmouseover|onmousemove|onmouseout|onkeypress|onkeydown|onkeyup],-strong/-b[class|style],-em/-i[class|style],-strike[class|style],-u[class|style],#p[id|style|dir|class|align],-ol[class|reversed|start|style|type],-ul[class|style],-li[class|style],br[class],img[id|dir|lang|longdesc|usemap|style|class|src|onmouseover|onmouseout|border|alt=|title|hspace|vspace|width|height|align|umbracoorgwidth|umbracoorgheight|onresize|onresizestart|onresizeend|rel],-sub[style|class],-sup[style|class],-blockquote[dir|style|class],-table[border=0|cellspacing|cellpadding|width|height|class|align|summary|style|dir|id|lang|bgcolor|background|bordercolor],-tr[id|lang|dir|class|rowspan|width|height|align|valign|style|bgcolor|background|bordercolor],tbody[id|class],thead[id|class],tfoot[id|class],#td[id|lang|dir|class|colspan|rowspan|width|height|align|valign|style|bgcolor|background|bordercolor|scope],-th[id|lang|dir|class|colspan|rowspan|width|height|align|valign|style|scope],caption[id|lang|dir|class|style],-div[id|dir|class|align|style],-span[class|align|style],-pre[class|align|style],address[class|align|style],-h1[id|dir|class|align],-h2[id|dir|class|align],-h3[id|dir|class|align],-h4[id|dir|class|align],-h5[id|dir|class|align],-h6[id|style|dir|class|align],hr[class|style],dd[id|class|title|style|dir|lang],dl[id|class|title|style|dir|lang],dt[id|class|title|style|dir|lang],object[class|id|width|height|codebase|*],param[name|value|_value|class],embed[type|width|height|src|class|*],map[name|class],area[shape|coords|href|alt|target|class],bdo[class],button[class],iframe[*]", "inValidElements": "font", "customConfig": { "entity_encoding": "raw" } }, null];
- }
- }
-
- function getCanvasEditorConfiguration(status, data, headers){
- if (!mocksUtils.checkAuth()) {
- return [401, null, null];
- }
- else {
- return [200,
- [
- {
- "name": "Rich text editor",
- "alias": "rte",
- "view": "rte",
- "icon": "icon-article"
- },
- {
- "name": "Image",
- "alias": "media",
- "view": "media",
- "icon": "icon-picture"
- },
- {
- "name": "Macro",
- "alias": "macro",
- "view": "macro",
- "icon": "icon-settings-alt"
- },
- {
- "name": "Embed",
- "alias": "embed",
- "view": "embed",
- "icon": "icon-movie-alt"
- },
- {
- "name": "Headline",
- "alias": "headline",
- "view": "textstring",
- "icon": "icon-coin",
- "config": {
- "style": "font-size: 36px; line-height: 45px; font-weight: bold",
- "markup": "
#value# "
- }
- },
- {
- "name": "Quote",
- "alias": "quote",
- "view": "textstring",
- "icon": "icon-quote",
- "config": {
- "style": "border-left: 3px solid #ccc; padding: 10px; color: #ccc; font-family: serif; font-variant: italic; font-size: 18px",
- "markup": "
#value# "
- }
- }
- ], null];
- }
-
- }
-
-
- return {
- register: function() {
- $httpBackend
- .whenGET(mocksUtils.urlRegex('/umbraco/UmbracoApi/RichTextPreValue/GetConfiguration'))
- .respond(getRichTextConfiguration);
- $httpBackend
- .whenGET(mocksUtils.urlRegex('../config/canvas.editors.config.js'))
- .respond(getCanvasEditorConfiguration);
- }
- };
- }]);
-angular.module('umbraco.mocks').
- factory('mocksUtils', ['$cookieStore', function($cookieStore) {
- 'use strict';
-
- //by default we will perform authorization
- var doAuth = true;
-
- return {
-
- getMockDataType: function(id, selectedId) {
- var dataType = {
- id: id,
- name: "Simple editor " + id,
- selectedEditor: selectedId,
- availableEditors: [
- { name: "Simple editor 1", editorId: String.CreateGuid() },
- { name: "Simple editor 2", editorId: String.CreateGuid() },
- { name: "Simple editor " + id, editorId: selectedId },
- { name: "Simple editor 4", editorId: String.CreateGuid() },
- { name: "Simple editor 5", editorId: String.CreateGuid() },
- { name: "Simple editor 6", editorId: String.CreateGuid() }
- ],
- preValues: [
- {
- label: "Custom pre value 1 for editor " + selectedId,
- description: "Enter a value for this pre-value",
- key: "myPreVal1",
- view: "requiredfield"
- },
- {
- label: "Custom pre value 2 for editor " + selectedId,
- description: "Enter a value for this pre-value",
- key: "myPreVal2",
- view: "requiredfield"
- }
- ]
-
- };
- return dataType;
- },
-
- /** Creats a mock content object */
- getMockContent: function(id) {
- var node = {
- name: "My content with id: " + id,
- updateDate: new Date().toIsoDateTimeString(),
- publishDate: new Date().toIsoDateTimeString(),
- createDate: new Date().toIsoDateTimeString(),
- id: id,
- parentId: 1234,
- icon: "icon-umb-content",
- owner: { name: "Administrator", id: 0 },
- updater: { name: "Per Ploug Krogslund", id: 1 },
- path: "-1,1234,2455",
- allowedActions: ["U", "H", "A"],
- tabs: [
- {
- label: "Grid",
- id: 1,
- active: true,
- properties: [
- { alias: "grid",
- label: "Grid",
- view: "grid",
- value: "",
- hideLabel: true,
- config: {
- items:{
-
- styles:[
- {
- label: "Set a background image",
- description: "Set a row background",
- key: "background-image",
- view: "imagepicker",
- modifier: "url({0})"
- }
- ],
- config:[
- {
- label: "Class",
- description: "Set a css class",
- key: "class",
- view: "textstring"
- }
- ],
- columns: 12,
- templates:[
- {
- name: "1 column layout",
- sections: [
- {
- grid: 12,
- }
- ]
- },
- {
- name: "2 column layout",
- sections: [
- {
- grid: 4,
- },
- {
- grid: 8
- }
- ]
- }
- ],
-
-
- layouts:[
- {
- name: "Headline",
- areas: [
- {
- grid: 12,
- editors: ["headline"]
- }
- ]
- },
- {
- name: "Article",
- areas: [
- {
- grid: 12
- },
- {
- grid: 4
- },
- {
- grid: 8
- },
- {
- grid: 12
- }
- ]
- }
- ]
- }
-
- }
- },
- ]
- },
- {
- label: "Content",
- id: 2,
- properties: [
- { alias: "valTest", label: "Validation test", view: "validationtest", value: "asdfasdf" },
- { alias: "bodyText", label: "Body Text", description: "Here you enter the primary article contents", view: "rte", value: "
askjdkasj lasjd
", config: {} },
- { alias: "textarea", label: "textarea", view: "textarea", value: "ajsdka sdjkds", config: { rows: 4 } },
- { alias: "media", label: "Media picker", view: "mediapicker", value: "1234,23242,23232,23231", config: {multiPicker: 1} }
- ]
- },
- {
- label: "Sample Editor",
- id: 3,
- properties: [
- { alias: "datepicker", label: "Datepicker", view: "datepicker", config: { pickTime: false, format: "yyyy-MM-dd" } },
- { alias: "tags", label: "Tags", view: "tags", value: "" }
- ]
- },
- {
- label: "This",
- id: 4,
- properties: [
- { alias: "valTest4", label: "Validation test", view: "validationtest", value: "asdfasdf" },
- { alias: "bodyText4", label: "Body Text", description: "Here you enter the primary article contents", view: "rte", value: "
askjdkasj lasjd
", config: {} },
- { alias: "textarea4", label: "textarea", view: "textarea", value: "ajsdka sdjkds", config: { rows: 4 } },
- { alias: "content4", label: "Content picker", view: "contentpicker", value: "1234,23242,23232,23231" }
- ]
- },
- {
- label: "Is",
- id: 5,
- properties: [
- { alias: "valTest5", label: "Validation test", view: "validationtest", value: "asdfasdf" },
- { alias: "bodyText5", label: "Body Text", description: "Here you enter the primary article contents", view: "rte", value: "
askjdkasj lasjd
", config: {} },
- { alias: "textarea5", label: "textarea", view: "textarea", value: "ajsdka sdjkds", config: { rows: 4 } },
- { alias: "content5", label: "Content picker", view: "contentpicker", value: "1234,23242,23232,23231" }
- ]
- },
- {
- label: "Overflown",
- id: 6,
- properties: [
- { alias: "valTest6", label: "Validation test", view: "validationtest", value: "asdfasdf" },
- { alias: "bodyText6", label: "Body Text", description: "Here you enter the primary article contents", view: "rte", value: "
askjdkasj lasjd
", config: {} },
- { alias: "textarea6", label: "textarea", view: "textarea", value: "ajsdka sdjkds", config: { rows: 4 } },
- { alias: "content6", label: "Content picker", view: "contentpicker", value: "1234,23242,23232,23231" }
- ]
- },
- {
- label: "Generic Properties",
- id: 0,
- properties: [
- {
- label: 'Id',
- value: 1234,
- view: "readonlyvalue",
- alias: "_umb_id"
- },
- {
- label: 'Created by',
- description: 'Original author',
- value: "Administrator",
- view: "readonlyvalue",
- alias: "_umb_createdby"
- },
- {
- label: 'Created',
- description: 'Date/time this document was created',
- value: new Date().toIsoDateTimeString(),
- view: "readonlyvalue",
- alias: "_umb_createdate"
- },
- {
- label: 'Updated',
- description: 'Date/time this document was created',
- value: new Date().toIsoDateTimeString(),
- view: "readonlyvalue",
- alias: "_umb_updatedate"
- },
- {
- label: 'Document Type',
- value: "Home page",
- view: "readonlyvalue",
- alias: "_umb_doctype"
- },
- {
- label: 'Publish at',
- description: 'Date/time to publish this document',
- value: new Date().toIsoDateTimeString(),
- view: "datepicker",
- alias: "_umb_releasedate"
- },
- {
- label: 'Unpublish at',
- description: 'Date/time to un-publish this document',
- value: new Date().toIsoDateTimeString(),
- view: "datepicker",
- alias: "_umb_expiredate"
- },
- {
- label: 'Template',
- value: "myTemplate",
- view: "dropdown",
- alias: "_umb_template",
- config: {
- items: {
- "" : "-- Choose template --",
- "myTemplate" : "My Templates",
- "home" : "Home Page",
- "news" : "News Page"
- }
- }
- },
- {
- label: 'Link to document',
- value: ["/testing" + id, "http://localhost/testing" + id, "http://mydomain.com/testing" + id].join(),
- view: "urllist",
- alias: "_umb_urllist"
- },
- {
- alias: "test", label: "Stuff", view: "test", value: "",
- config: {
- fields: [
- { alias: "embedded", label: "Embbeded", view: "textstring", value: "" },
- { alias: "embedded2", label: "Embbeded 2", view: "contentpicker", value: "" },
- { alias: "embedded3", label: "Embbeded 3", view: "textarea", value: "" },
- { alias: "embedded4", label: "Embbeded 4", view: "datepicker", value: "" }
- ]
- }
- }
- ]
- }
- ]
- };
-
- return node;
- },
-
- getMockEntity : function(id){
- return {name: "hello", id: id, icon: "icon-file"};
- },
-
- /** generally used for unit tests, calling this will disable the auth check and always return true */
- disableAuth: function() {
- doAuth = false;
- },
-
- /** generally used for unit tests, calling this will enabled the auth check */
- enabledAuth: function() {
- doAuth = true;
- },
-
- /** Checks for our mock auth cookie, if it's not there, returns false */
- checkAuth: function () {
- if (doAuth) {
- var mockAuthCookie = $cookieStore.get("mockAuthCookie");
- if (!mockAuthCookie) {
- return false;
- }
- return true;
- }
- else {
- return true;
- }
- },
-
- /** Creates/sets the auth cookie with a value indicating the user is now authenticated */
- setAuth: function() {
- //set the cookie for loging
- $cookieStore.put("mockAuthCookie", "Logged in!");
- },
-
- /** removes the auth cookie */
- clearAuth: function() {
- $cookieStore.remove("mockAuthCookie");
- },
-
- urlRegex: function(url) {
- url = url.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&");
- return new RegExp("^" + url);
- },
-
- getParameterByName: function(url, name) {
- name = name.replace(/[\[]/, "\\[").replace(/[\]]/, "\\]");
-
- var regex = new RegExp("[\\?&]" + name + "=([^]*)"),
- results = regex.exec(url);
-
- return results === null ? "" : decodeURIComponent(results[1].replace(/\+/g, " "));
- },
-
- getParametersByName: function(url, name) {
- name = name.replace(/[\[]/, "\\[").replace(/[\]]/, "\\]");
-
- var regex = new RegExp(name + "=([^]*)", "mg"), results = [];
- var match;
-
- while ( ( match = regex.exec(url) ) !== null )
- {
- results.push(decodeURIComponent(match[1].replace(/\+/g, " ")));
- }
-
- return results;
- }
- };
- }]);
-
-angular.module('umbraco.mocks').
- factory('contentMocks', ['$httpBackend', 'mocksUtils', function ($httpBackend, mocksUtils) {
- 'use strict';
-
- function returnChildren(status, data, headers) {
- if (!mocksUtils.checkAuth()) {
- return [401, null, null];
- }
-
- var pageNumber = Number(mocksUtils.getParameterByName(data, "pageNumber"));
- var filter = mocksUtils.getParameterByName(data, "filter");
- var pageSize = Number(mocksUtils.getParameterByName(data, "pageSize"));
- var parentId = Number(mocksUtils.getParameterByName(data, "id"));
-
- if (pageNumber === 0) {
- pageNumber = 1;
- }
- var collection = { pageSize: pageSize, totalItems: 68, totalPages: 7, pageNumber: pageNumber, filter: filter };
- collection.totalItems = 56 - (filter.length);
- if (pageSize > 0) {
- collection.totalPages = Math.round(collection.totalItems / collection.pageSize);
- }
- else {
- collection.totalPages = 1;
- }
- collection.items = [];
-
- if (collection.totalItems < pageSize || pageSize < 1) {
- collection.pageSize = collection.totalItems;
- } else {
- collection.pageSize = pageSize;
- }
-
- var id = 0;
- for (var i = 0; i < collection.pageSize; i++) {
- id = (parentId + i) * pageNumber;
- var cnt = mocksUtils.getMockContent(id);
-
- //here we fake filtering
- if (filter !== '') {
- cnt.name = filter + cnt.name;
- }
-
- //set a fake sortOrder
- cnt.sortOrder = i + 1;
-
- collection.items.push(cnt);
- }
-
- return [200, collection, null];
- }
-
- function returnDeletedNode(status, data, headers) {
- if (!mocksUtils.checkAuth()) {
- return [401, null, null];
- }
-
- return [200, null, null];
- }
-
- function returnEmptyNode(status, data, headers) {
-
- if (!mocksUtils.checkAuth()) {
- return [401, null, null];
- }
-
- var response = returnNodebyId(200, "", null);
- var node = response[1];
- var parentId = mocksUtils.getParameterByName(data, "parentId") || 1234;
-
- node.name = "";
- node.id = 0;
- node.parentId = parentId;
-
- $(node.tabs).each(function(i,tab){
- $(tab.properties).each(function(i, property){
- property.value = "";
- });
- });
-
- return response;
- }
-
- function returnNodebyId(status, data, headers) {
-
- if (!mocksUtils.checkAuth()) {
- return [401, null, null];
- }
-
- var id = mocksUtils.getParameterByName(data, "id") || "1234";
- id = parseInt(id, 10);
-
- var node = mocksUtils.getMockContent(id);
-
- return [200, node, null];
- }
-
- function returnNodebyIds(status, data, headers) {
-
- if (!mocksUtils.checkAuth()) {
- return [401, null, null];
- }
-
- var ids = mocksUtils.getParameterByName(data, "ids") || [1234,23324,2323,23424];
- var nodes = [];
-
- $(ids).each(function(i, id){
- var _id = parseInt(id, 10);
- nodes.push(mocksUtils.getMockContent(_id));
- });
-
- return [200, nodes, null];
- }
-
- function returnSort(status, data, headers) {
- if (!mocksUtils.checkAuth()) {
- return [401, null, null];
- }
-
- return [200, null, null];
- }
-
- function returnSave(status, data, headers) {
- if (!mocksUtils.checkAuth()) {
- return [401, null, null];
- }
-
- return [200, null, null];
- }
-
- return {
- register: function () {
-
- $httpBackend
- .whenPOST(mocksUtils.urlRegex('/umbraco/UmbracoApi/Content/PostSave'))
- .respond(returnSave);
-
- $httpBackend
- .whenPOST(mocksUtils.urlRegex('/umbraco/UmbracoApi/Content/PostSort'))
- .respond(returnSort);
-
- $httpBackend
- .whenGET(mocksUtils.urlRegex('/umbraco/UmbracoApi/Content/GetChildren'))
- .respond(returnChildren);
-
- $httpBackend
- .whenGET(mocksUtils.urlRegex('/umbraco/UmbracoApi/Content/GetByIds'))
- .respond(returnNodebyIds);
-
- $httpBackend
- .whenGET(mocksUtils.urlRegex('/umbraco/UmbracoApi/Content/GetById?'))
- .respond(returnNodebyId);
-
- $httpBackend
- .whenGET(mocksUtils.urlRegex('/umbraco/UmbracoApi/Content/GetEmpty'))
- .respond(returnEmptyNode);
-
- $httpBackend
- .whenDELETE(mocksUtils.urlRegex('/umbraco/UmbracoApi/Content/DeleteById'))
- .respond(returnDeletedNode);
-
- $httpBackend
- .whenDELETE(mocksUtils.urlRegex('/umbraco/UmbracoApi/Content/EmptyRecycleBin'))
- .respond(returnDeletedNode);
- },
-
- expectGetById: function() {
- $httpBackend
- .expectGET(mocksUtils.urlRegex('/umbraco/UmbracoApi/Content/GetById'));
- }
- };
- }]);
-angular.module('umbraco.mocks').
- factory('contentTypeMocks', ['$httpBackend', 'mocksUtils', function ($httpBackend, mocksUtils) {
- 'use strict';
-
- function returnAllowedChildren(status, data, headers) {
-
- if (!mocksUtils.checkAuth()) {
- return [401, null, null];
- }
-
- var types = [
- { name: "News Article", description: "Standard news article", alias: "newsArticle", id: 1234, icon: "icon-file", thumbnail: "icon-file" },
- { name: "News Area", description: "Area to hold all news articles, there should be only one", alias: "newsArea", id: 1234, icon: "icon-suitcase", thumbnail: "icon-suitcase" },
- { name: "Employee", description: "Employee profile information page", alias: "employee", id: 1234, icon: "icon-user", thumbnail: "icon-user" }
- ];
- return [200, types, null];
- }
-
- return {
- register: function() {
- $httpBackend
- .whenGET(mocksUtils.urlRegex('/umbraco/Api/ContentType/GetAllowedChildren'))
- .respond(returnAllowedChildren);
-
- },
- expectAllowedChildren: function(){
- console.log("expecting get");
- $httpBackend.expectGET(mocksUtils.urlRegex('/umbraco/Api/ContentType/GetAllowedChildren'));
- }
- };
- }]);
-angular.module('umbraco.mocks').
- factory('dashboardMocks', ['$httpBackend', 'mocksUtils', function ($httpBackend, mocksUtils) {
- 'use strict';
-
- function getDashboard(status, data, headers) {
- //check for existence of a cookie so we can do login/logout in the belle app (ignore for tests).
- if (!mocksUtils.checkAuth()) {
- return [401, null, null];
- }
- else {
- //TODO: return real mocked data
- return [200, [], null];
- }
- }
-
- return {
- register: function() {
-
- $httpBackend
- .whenGET(mocksUtils.urlRegex('/umbraco/UmbracoApi/Dashboard/GetDashboard'))
- .respond(getDashboard);
- }
- };
- }]);
-angular.module('umbraco.mocks').
- factory('dataTypeMocks', ['$httpBackend', 'mocksUtils', function ($httpBackend, mocksUtils) {
- 'use strict';
-
- function returnById(status, data, headers) {
-
- if (!mocksUtils.checkAuth()) {
- return [401, null, null];
- }
-
- var id = mocksUtils.getParameterByName(data, "id") || 1234;
-
- var selectedId = String.CreateGuid();
-
- var dataType = mocksUtils.getMockDataType(id, selectedId);
-
- return [200, dataType, null];
- }
-
- function returnEmpty(status, data, headers) {
-
- if (!mocksUtils.checkAuth()) {
- return [401, null, null];
- }
-
- var response = returnById(200, "", null);
- var node = response[1];
-
- node.name = "";
- node.selectedEditor = "";
- node.id = 0;
- node.preValues = [];
-
- return response;
- }
-
- function returnPreValues(status, data, headers) {
-
- if (!mocksUtils.checkAuth()) {
- return [401, null, null];
- }
-
- var editorId = mocksUtils.getParameterByName(data, "editorId") || "83E9AD36-51A7-4440-8C07-8A5623AC6979";
-
- var preValues = [
- {
- label: "Custom pre value 1 for editor " + editorId,
- description: "Enter a value for this pre-value",
- key: "myPreVal",
- view: "requiredfield",
- validation: [
- {
- type: "Required"
- }
- ]
- },
- {
- label: "Custom pre value 2 for editor " + editorId,
- description: "Enter a value for this pre-value",
- key: "myPreVal",
- view: "requiredfield",
- validation: [
- {
- type: "Required"
- }
- ]
- }
- ];
- return [200, preValues, null];
- }
-
- function returnSave(status, data, headers) {
- if (!mocksUtils.checkAuth()) {
- return [401, null, null];
- }
-
- var postedData = angular.fromJson(headers);
-
- var dataType = mocksUtils.getMockDataType(postedData.id, postedData.selectedEditor);
- dataType.notifications = [{
- header: "Saved",
- message: "Data type saved",
- type: 0
- }];
-
- return [200, dataType, null];
- }
-
- return {
- register: function() {
-
- $httpBackend
- .whenPOST(mocksUtils.urlRegex('/umbraco/UmbracoApi/DataType/PostSave'))
- .respond(returnSave);
-
- $httpBackend
- .whenGET(mocksUtils.urlRegex('/umbraco/UmbracoApi/DataType/GetById'))
- .respond(returnById);
-
- $httpBackend
- .whenGET(mocksUtils.urlRegex('/umbraco/UmbracoApi/DataType/GetEmpty'))
- .respond(returnEmpty);
-
- $httpBackend
- .whenGET(mocksUtils.urlRegex('/umbraco/UmbracoApi/DataType/GetPreValues'))
- .respond(returnPreValues);
- },
- expectGetById: function() {
- $httpBackend
- .expectGET(mocksUtils.urlRegex('/umbraco/UmbracoApi/DataType/GetById'));
- }
- };
- }]);
-
-angular.module('umbraco.mocks').
- factory('entityMocks', ['$httpBackend', 'mocksUtils', function ($httpBackend, mocksUtils) {
- 'use strict';
-
- function returnEntitybyId(status, data, headers) {
-
- if (!mocksUtils.checkAuth()) {
- return [401, null, null];
- }
-
- var id = mocksUtils.getParameterByName(data, "id") || "1234";
- id = parseInt(id, 10);
-
- var node = mocksUtils.getMockEntity(id);
-
- return [200, node, null];
- }
-
- function returnEntitybyIds(status, data, headers) {
-
- if (!mocksUtils.checkAuth()) {
- return [401, null, null];
- }
-
- var ids = mocksUtils.getParametersByName(data, "ids") || [1234, 23324, 2323, 23424];
- var nodes = [];
-
- $(ids).each(function (i, id) {
- var _id = parseInt(id, 10);
- nodes.push(mocksUtils.getMockEntity(_id));
- });
-
- return [200, nodes, null];
- }
-
-
- return {
- register: function () {
-
- $httpBackend
- .whenGET(mocksUtils.urlRegex('/umbraco/UmbracoApi/Entity/GetByIds'))
- .respond(returnEntitybyIds);
-
- $httpBackend
- .whenGET(mocksUtils.urlRegex('/umbraco/UmbracoApi/Entity/GetAncestors'))
- .respond(returnEntitybyIds);
-
- $httpBackend
- .whenGET(mocksUtils.urlRegex('/umbraco/UmbracoApi/Entity/GetById?'))
- .respond(returnEntitybyId);
- }
- };
- }]);
-angular.module('umbraco.mocks').
- factory('macroMocks', ['$httpBackend', 'mocksUtils', function ($httpBackend, mocksUtils) {
- 'use strict';
-
- function returnParameters(status, data, headers) {
-
- if (!mocksUtils.checkAuth()) {
- return [401, null, null];
- }
-
- var nodes = [{
- alias: "parameter1",
- name: "Parameter 1"
- }, {
- alias: "parameter2",
- name: "Parameter 2"
- }];
-
- return [200, nodes, null];
- }
-
-
- return {
- register: function () {
-
- $httpBackend
- .whenGET(mocksUtils.urlRegex('/umbraco/UmbracoApi/Macro/GetMacroParameters'))
- .respond(returnParameters);
-
- }
- };
- }]);
-angular.module('umbraco.mocks').
- factory('mediaMocks', ['$httpBackend', 'mocksUtils', function ($httpBackend, mocksUtils) {
- 'use strict';
-
- function returnNodeCollection(status, data, headers){
- var nodes = [{"properties":[{"id":348,"value":"/media/1045/windows95.jpg","alias":"umbracoFile"},{"id":349,"value":"640","alias":"umbracoWidth"},{"id":350,"value":"472","alias":"umbracoHeight"},{"id":351,"value":"53472","alias":"umbracoBytes"},{"id":352,"value":"jpg","alias":"umbracoExtension"}],"updateDate":"2013-08-27 15:50:08","createDate":"2013-08-27 15:50:08","owner":{"id":0,"name":"admin"},"updater":null,"contentTypeAlias":"Image","sortOrder":0,"name":"windows95.jpg","id":1128,"icon":"mediaPhoto.gif","parentId":1127},{"properties":[{"id":353,"value":"/media/1046/pete.png","alias":"umbracoFile"},{"id":354,"value":"240","alias":"umbracoWidth"},{"id":355,"value":"240","alias":"umbracoHeight"},{"id":356,"value":"87408","alias":"umbracoBytes"},{"id":357,"value":"png","alias":"umbracoExtension"}],"updateDate":"2013-08-27 15:50:08","createDate":"2013-08-27 15:50:08","owner":{"id":0,"name":"admin"},"updater":null,"contentTypeAlias":"Image","sortOrder":1,"name":"pete.png","id":1129,"icon":"mediaPhoto.gif","parentId":1127},{"properties":[{"id":358,"value":"/media/1047/unicorn.jpg","alias":"umbracoFile"},{"id":359,"value":"640","alias":"umbracoWidth"},{"id":360,"value":"640","alias":"umbracoHeight"},{"id":361,"value":"577380","alias":"umbracoBytes"},{"id":362,"value":"jpg","alias":"umbracoExtension"}],"updateDate":"2013-08-27 15:50:09","createDate":"2013-08-27 15:50:09","owner":{"id":0,"name":"admin"},"updater":null,"contentTypeAlias":"Image","sortOrder":2,"name":"unicorn.jpg","id":1130,"icon":"mediaPhoto.gif","parentId":1127},{"properties":[{"id":363,"value":"/media/1049/exploding-head.gif","alias":"umbracoFile"},{"id":364,"value":"500","alias":"umbracoWidth"},{"id":365,"value":"279","alias":"umbracoHeight"},{"id":366,"value":"451237","alias":"umbracoBytes"},{"id":367,"value":"gif","alias":"umbracoExtension"}],"updateDate":"2013-08-27 15:50:09","createDate":"2013-08-27 15:50:09","owner":{"id":0,"name":"admin"},"updater":null,"contentTypeAlias":"Image","sortOrder":3,"name":"exploding head.gif","id":1131,"icon":"mediaPhoto.gif","parentId":1127},{"properties":[{"id":368,"value":"/media/1048/bighead.jpg","alias":"umbracoFile"},{"id":369,"value":"1240","alias":"umbracoWidth"},{"id":370,"value":"1655","alias":"umbracoHeight"},{"id":371,"value":"836261","alias":"umbracoBytes"},{"id":372,"value":"jpg","alias":"umbracoExtension"}],"updateDate":"2013-08-27 15:50:09","createDate":"2013-08-27 15:50:09","owner":{"id":0,"name":"admin"},"updater":null,"contentTypeAlias":"Image","sortOrder":4,"name":"bighead.jpg","id":1132,"icon":"mediaPhoto.gif","parentId":1127},{"properties":[{"id":373,"value":"/media/1050/powerlines.jpg","alias":"umbracoFile"},{"id":374,"value":"636","alias":"umbracoWidth"},{"id":375,"value":"423","alias":"umbracoHeight"},{"id":376,"value":"79874","alias":"umbracoBytes"},{"id":377,"value":"jpg","alias":"umbracoExtension"}],"updateDate":"2013-08-27 15:50:09","createDate":"2013-08-27 15:50:09","owner":{"id":0,"name":"admin"},"updater":null,"contentTypeAlias":"Image","sortOrder":5,"name":"powerlines.jpg","id":1133,"icon":"mediaPhoto.gif","parentId":1127},{"properties":[{"id":430,"value":"","alias":"contents"}],"updateDate":"2013-08-30 08:53:22","createDate":"2013-08-30 08:53:22","owner":{"id":0,"name":"admin"},"updater":null,"contentTypeAlias":"Folder","sortOrder":6,"name":"new folder","id":1146,"icon":"folder.gif","parentId":1127}];
- return [200, nodes, null];
- }
-
- function returnNodebyIds(status, data, headers) {
- var ids = mocksUtils.getParameterByName(data, "ids") || "1234,1234,4234";
- var items = [];
-
- _.each(ids, function(id){
- items.push(_getNode( parseInt( id, 10 )) );
- });
-
- return [200, items, null];
- }
-
- function returnNodebyId(status, data, headers) {
-
- if (!mocksUtils.checkAuth()) {
- return [401, null, null];
- }
-
- var id = mocksUtils.getParameterByName(data, "id") || 1234;
- id = parseInt(id, 10);
-
-
-
- return [200, _getNode(id), null];
- }
-
- function _getNode(id){
- var node = {
- name: "My media with id: " + id,
- updateDate: new Date(),
- publishDate: new Date(),
- id: id,
- parentId: 1234,
- icon: "icon-file-alt",
- owner: {name: "Administrator", id: 0},
- updater: {name: "Per Ploug Krogslund", id: 1},
- path: "-1,1234,2455",
- tabs: [
- {
- label: "Media",
- alias: "tab0",
- id: 0,
- properties: [
- { alias: "umbracoFile", label: "File", description:"Some file", view: "rte", value: "/media/1234/random.jpg" }
- ]
- }
- ]
- };
-
- return node;
- }
-
- return {
- register: function() {
- $httpBackend
- .whenGET(mocksUtils.urlRegex('/umbraco/UmbracoApi/Media/GetById?'))
- .respond(returnNodebyId);
-
- $httpBackend
- .whenGET(mocksUtils.urlRegex('/umbraco/UmbracoApi/Media/GetByIds?'))
- .respond(returnNodebyIds);
-
- $httpBackend
- .whenGET(mocksUtils.urlRegex('/umbraco/UmbracoApi/Media/GetChildren'))
- .respond(returnNodeCollection);
-
- },
- expectGetById: function() {
- $httpBackend
- .expectGET(mocksUtils.urlRegex('/umbraco/UmbracoApi/Media/GetById'));
- }
- };
- }]);
-
-/**
-* @ngdoc service
-* @name umbraco.mocks.sectionMocks
-* @description
-* Mocks data retrival for the sections
-**/
-function sectionMocks($httpBackend, mocksUtils) {
-
- /** internal method to mock the sections to be returned */
- function getSections() {
-
- if (!mocksUtils.checkAuth()) {
- return [401, null, null];
- }
-
- var sections = [
- { name: "Content", cssclass: "icon-umb-content", alias: "content" },
- { name: "Media", cssclass: "icon-umb-media", alias: "media" },
- { name: "Settings", cssclass: "icon-umb-settings", alias: "settings" },
- { name: "Developer", cssclass: "icon-umb-developer", alias: "developer" },
- { name: "Users", cssclass: "icon-umb-users", alias: "users" },
- { name: "Developer", cssclass: "icon-umb-developer", alias: "developer" },
- { name: "Users", cssclass: "icon-umb-users", alias: "users" }
- ];
-
- return [200, sections, null];
- }
-
- return {
- register: function () {
- $httpBackend
- .whenGET(mocksUtils.urlRegex('/umbraco/UmbracoApi/Section/GetSections'))
- .respond(getSections);
- }
- };
-}
-
-angular.module('umbraco.mocks').factory('sectionMocks', ['$httpBackend', 'mocksUtils', sectionMocks]);
-
-angular.module('umbraco.mocks').
- factory('treeMocks', ['$httpBackend', 'mocksUtils', function ($httpBackend, mocksUtils) {
- 'use strict';
-
- function getMenuItems() {
-
- if (!mocksUtils.checkAuth()) {
- return [401, null, null];
- }
-
- var menu = [
- { name: "Create", cssclass: "plus", alias: "create", metaData: {} },
-
- { seperator: true, name: "Delete", cssclass: "remove", alias: "delete", metaData: {} },
- { name: "Move", cssclass: "move", alias: "move", metaData: {} },
- { name: "Copy", cssclass: "copy", alias: "copy", metaData: {} },
- { name: "Sort", cssclass: "sort", alias: "sort", metaData: {} },
-
- { seperator: true, name: "Publish", cssclass: "globe", alias: "publish", metaData: {} },
- { name: "Rollback", cssclass: "undo", alias: "rollback", metaData: {} },
-
- { seperator: true, name: "Permissions", cssclass: "lock", alias: "permissions", metaData: {} },
- { name: "Audit Trail", cssclass: "time", alias: "audittrail", metaData: {} },
- { name: "Notifications", cssclass: "envelope", alias: "notifications", metaData: {} },
-
- { seperator: true, name: "Hostnames", cssclass: "home", alias: "hostnames", metaData: {} },
- { name: "Public Access", cssclass: "group", alias: "publicaccess", metaData: {} },
-
- { seperator: true, name: "Reload", cssclass: "refresh", alias: "users", metaData: {} },
-
- { seperator: true, name: "Empty Recycle Bin", cssclass: "trash", alias: "emptyrecyclebin", metaData: {} }
- ];
-
- var result = {
- menuItems: menu,
- defaultAlias: "create"
- };
-
- return [200, result, null];
- }
-
- function returnChildren(status, data, headers) {
-
- if (!mocksUtils.checkAuth()) {
- return [401, null, null];
- }
-
- var id = mocksUtils.getParameterByName(data, "id");
- var section = mocksUtils.getParameterByName(data, "treeType");
- var level = mocksUtils.getParameterByName(data, "level")+1;
-
- var url = "/umbraco/UmbracoTrees/ApplicationTreeApi/GetChildren?treeType=" + section + "&id=1234&level=" + level;
- var menuUrl = "/umbraco/UmbracoTrees/ApplicationTreeApi/GetMenu?treeType=" + section + "&id=1234&parentId=456";
-
- //hack to have create as default content action
- var action;
- if (section === "content") {
- action = "create";
- }
-
- var children = [
- { name: "child-of-" + section, childNodesUrl: url, id: level + "" + 1234, icon: "icon-document", children: [], expanded: false, hasChildren: true, level: level, menuUrl: menuUrl },
- { name: "random-name-" + section, childNodesUrl: url, id: level + "" + 1235, icon: "icon-document", children: [], expanded: false, hasChildren: true, level: level, menuUrl: menuUrl },
- { name: "random-name-" + section, childNodesUrl: url, id: level + "" + 1236, icon: "icon-document", children: [], expanded: false, hasChildren: true, level: level, menuUrl: menuUrl },
- { name: "random-name-" + section, childNodesUrl: url, id: level + "" + 1237, icon: "icon-document", routePath: "common/legacy/1237?p=" + encodeURI("developer/contentType.aspx?idequal1234"), children: [], expanded: false, hasChildren: true, level: level, menuUrl: menuUrl }
- ];
-
- return [200, children, null];
- }
-
- function returnDataTypes(status, data, headers) {
- if (!mocksUtils.checkAuth()) {
- return [401, null, null];
- }
-
- var children = [
- { name: "Textstring", childNodesUrl: null, id: 10, icon: "icon-document", children: [], expanded: false, hasChildren: false, level: 1, menuUrl: null },
- { name: "Multiple textstring", childNodesUrl: null, id: 11, icon: "icon-document", children: [], expanded: false, hasChildren: false, level: 1, menuUrl: null },
- { name: "Yes/No", childNodesUrl: null, id: 12, icon: "icon-document", children: [], expanded: false, hasChildren: false, level: 1, menuUrl: null },
- { name: "Rich Text Editor", childNodesUrl: null, id: 13, icon: "icon-document", children: [], expanded: false, hasChildren: false, level: 1, menuUrl: null }
- ];
-
- return [200, children, null];
- }
-
- function returnDataTypeMenu(status, data, headers) {
- if (!mocksUtils.checkAuth()) {
- return [401, null, null];
- }
-
- var menu = [
- {
- name: "Create", cssclass: "plus", alias: "create", metaData: {
- jsAction: "umbracoMenuActions.CreateChildEntity"
- }
- },
- { seperator: true, name: "Reload", cssclass: "refresh", alias: "users", metaData: {} }
- ];
-
- return [200, menu, null];
- }
-
- function returnApplicationTrees(status, data, headers) {
-
- if (!mocksUtils.checkAuth()) {
- return [401, null, null];
- }
-
- var section = mocksUtils.getParameterByName(data, "application");
- var url = "/umbraco/UmbracoTrees/ApplicationTreeApi/GetChildren?treeType=" + section + "&id=1234&level=1";
- var menuUrl = "/umbraco/UmbracoTrees/ApplicationTreeApi/GetMenu?treeType=" + section + "&id=1234&parentId=456";
- var t;
- switch (section) {
-
- case "content":
- t = {
- name: "content",
- id: -1,
- children: [
- { name: "My website", id: 1234, childNodesUrl: url, icon: "icon-home", children: [], expanded: false, hasChildren: true, level: 1, menuUrl: menuUrl },
- { name: "Components", id: 1235, childNodesUrl: url, icon: "icon-document", children: [], expanded: false, hasChildren: true, level: 1, menuUrl: menuUrl },
- { name: "Archieve", id: 1236, childNodesUrl: url, icon: "icon-document", children: [], expanded: false, hasChildren: true, level: 1, menuUrl: menuUrl },
- { name: "Recycle Bin", id: -20, childNodesUrl: url, icon: "icon-trash", routePath: section + "/recyclebin", children: [], expanded: false, hasChildren: true, level: 1, menuUrl: menuUrl }
- ],
- expanded: true,
- hasChildren: true,
- level: 0,
- menuUrl: menuUrl,
- metaData: { treeAlias: "content" }
- };
-
- break;
- case "media":
- t = {
- name: "media",
- id: -1,
- children: [
- { name: "random-name-" + section, childNodesUrl: url, id: 1234, icon: "icon-home", children: [], expanded: false, hasChildren: true, level: 1, menuUrl: menuUrl },
- { name: "random-name-" + section, childNodesUrl: url, id: 1235, icon: "icon-folder-close", children: [], expanded: false, hasChildren: true, level: 1, menuUrl: menuUrl },
- { name: "random-name-" + section, childNodesUrl: url, id: 1236, icon: "icon-folder-close", children: [], expanded: false, hasChildren: true, level: 1, menuUrl: menuUrl },
- { name: "random-name-" + section, childNodesUrl: url, id: 1237, icon: "icon-folder-close", children: [], expanded: false, hasChildren: true, level: 1, menuUrl: menuUrl }
- ],
- expanded: true,
- hasChildren: true,
- level: 0,
- menuUrl: menuUrl,
- metaData: { treeAlias: "media" }
- };
-
- break;
- case "developer":
-
- var dataTypeChildrenUrl = "/umbraco/UmbracoTrees/DataTypeTree/GetNodes?id=-1&application=developer";
- var dataTypeMenuUrl = "/umbraco/UmbracoTrees/DataTypeTree/GetMenu?id=-1&application=developer";
-
- t = {
- name: "developer",
- id: -1,
- children: [
- { name: "Data types", childNodesUrl: dataTypeChildrenUrl, id: -1, icon: "icon-folder-close", children: [], expanded: false, hasChildren: true, level: 1, menuUrl: dataTypeMenuUrl, metaData: { treeAlias: "dataTypes" } },
- { name: "Macros", childNodesUrl: url, id: -1, icon: "icon-folder-close", children: [], expanded: false, hasChildren: true, level: 1, menuUrl: menuUrl, metaData: { treeAlias: "macros" } },
- { name: "Packages", childNodesUrl: url, id: -1, icon: "icon-folder-close", children: [], expanded: false, hasChildren: true, level: 1, menuUrl: menuUrl, metaData: { treeAlias: "packager" } },
- { name: "XSLT Files", childNodesUrl: url, id: -1, icon: "icon-folder-close", children: [], expanded: false, hasChildren: true, level: 1, menuUrl: menuUrl, metaData: { treeAlias: "xslt" } },
- { name: "Partial View Macros", childNodesUrl: url, id: -1, icon: "icon-folder-close", children: [], expanded: false, hasChildren: true, level: 1, menuUrl: menuUrl, metaData: { treeAlias: "partialViewMacros" } }
- ],
- expanded: true,
- hasChildren: true,
- level: 0,
- isContainer: true
- };
-
- break;
- case "settings":
- t = {
- name: "settings",
- id: -1,
- children: [
- { name: "Stylesheets", childNodesUrl: url, id: -1, icon: "icon-folder-close", children: [], expanded: false, hasChildren: true, level: 1, menuUrl: menuUrl, metaData: { treeAlias: "stylesheets" } },
- { name: "Templates", childNodesUrl: url, id: -1, icon: "icon-folder-close", children: [], expanded: false, hasChildren: true, level: 1, menuUrl: menuUrl, metaData: { treeAlias: "templates" } },
- { name: "Dictionary", childNodesUrl: url, id: -1, icon: "icon-folder-close", children: [], expanded: false, hasChildren: true, level: 1, menuUrl: menuUrl, metaData: { treeAlias: "dictionary" } },
- { name: "Media types", childNodesUrl: url, id: -1, icon: "icon-folder-close", children: [], expanded: false, hasChildren: true, level: 1, menuUrl: menuUrl, metaData: { treeAlias: "mediaTypes" } },
- { name: "Document types", childNodesUrl: url, id: -1, icon: "icon-folder-close", children: [], expanded: false, hasChildren: true, level: 1, menuUrl: menuUrl, metaData: { treeAlias: "documentTypes" } }
- ],
- expanded: true,
- hasChildren: true,
- level: 0,
- isContainer: true
- };
-
- break;
- default:
-
- t = {
- name: "randomTree",
- id: -1,
- children: [
- { name: "random-name-" + section, childNodesUrl: url, id: 1234, icon: "icon-home", children: [], expanded: false, hasChildren: true, level: 1, menuUrl: menuUrl },
- { name: "random-name-" + section, childNodesUrl: url, id: 1235, icon: "icon-folder-close", children: [], expanded: false, hasChildren: true, level: 1, menuUrl: menuUrl },
- { name: "random-name-" + section, childNodesUrl: url, id: 1236, icon: "icon-folder-close", children: [], expanded: false, hasChildren: true, level: 1, menuUrl: menuUrl },
- { name: "random-name-" + section, childNodesUrl: url, id: 1237, icon: "icon-folder-close", children: [], expanded: false, hasChildren: true, level: 1, menuUrl: menuUrl }
- ],
- expanded: true,
- hasChildren: true,
- level: 0,
- menuUrl: menuUrl,
- metaData: { treeAlias: "randomTree" }
- };
-
- break;
- }
-
-
- return [200, t, null];
- }
-
-
- return {
- register: function() {
-
- $httpBackend
- .whenGET(mocksUtils.urlRegex('/umbraco/UmbracoTrees/ApplicationTreeApi/GetApplicationTrees'))
- .respond(returnApplicationTrees);
-
- $httpBackend
- .whenGET(mocksUtils.urlRegex('/umbraco/UmbracoTrees/ApplicationTreeApi/GetChildren'))
- .respond(returnChildren);
-
-
- $httpBackend
- .whenGET(mocksUtils.urlRegex('/umbraco/UmbracoTrees/DataTypeTree/GetNodes'))
- .respond(returnDataTypes);
-
- $httpBackend
- .whenGET(mocksUtils.urlRegex('/umbraco/UmbracoTrees/DataTypeTree/GetMenu'))
- .respond(returnDataTypeMenu);
-
- $httpBackend
- .whenGET(mocksUtils.urlRegex('/umbraco/UmbracoTrees/ApplicationTreeApi/GetMenu'))
- .respond(getMenuItems);
-
- }
- };
- }]);
-angular.module('umbraco.mocks').
- factory('userMocks', ['$httpBackend', 'mocksUtils', function ($httpBackend, mocksUtils) {
- 'use strict';
-
- function generateMockedUser() {
- // Ensure a new user object each call
- return {
- name: "Per Ploug",
- email: "test@test.com",
- emailHash: "f9879d71855b5ff21e4963273a886bfc",
- id: 0,
- locale: 'da-DK',
- remainingAuthSeconds: 600,
- allowedSections: ["content", "media"]
- };
- }
-
- function isAuthenticated() {
- //check for existence of a cookie so we can do login/logout in the belle app (ignore for tests).
- if (!mocksUtils.checkAuth()) {
- return [401, null, null];
- }
- else {
- return [200, null, null];
- }
- }
-
- function getCurrentUser(status, data, headers) {
- if (!mocksUtils.checkAuth()) {
- return [401, null, null];
- }
- else {
- return [200, generateMockedUser(), null];
- }
- }
-
- function getRemainingTimeoutSeconds(status, data, headers) {
- if (!mocksUtils.checkAuth()) {
- return [401, null, null];
- }
- else {
- return [200, 600, null];
- }
- }
-
- function returnUser(status, data, headers) {
-
- //set the cookie for loging
- mocksUtils.setAuth();
-
- return [200, generateMockedUser(), null];
- }
-
- function logout() {
-
- mocksUtils.clearAuth();
-
- return [200, null, null];
-
- }
-
- return {
- register: function() {
-
- $httpBackend
- .whenPOST(mocksUtils.urlRegex('/umbraco/UmbracoApi/Authentication/PostLogin'))
- .respond(returnUser);
-
- $httpBackend
- .whenPOST(mocksUtils.urlRegex('/umbraco/UmbracoApi/Authentication/PostLogout'))
- .respond(logout);
-
- $httpBackend
- .whenGET(mocksUtils.urlRegex('/umbraco/UmbracoApi/Authentication/IsAuthenticated'))
- .respond(isAuthenticated);
-
- $httpBackend
- .whenGET('/umbraco/UmbracoApi/Authentication/GetCurrentUser')
- .respond(getCurrentUser);
-
- $httpBackend
- .whenGET('/umbraco/UmbracoApi/Authentication/GetRemainingTimeoutSeconds')
- .respond(getRemainingTimeoutSeconds);
-
-
- }
- };
- }]);
+angular.module("umbraco.mocks.services", []);
+angular.module('umbraco.mocks').
+ factory('prevaluesMocks', ['$httpBackend', 'mocksUtils', function ($httpBackend, mocksUtils) {
+ 'use strict';
+
+ function getRichTextConfiguration(status, data, headers) {
+ if (!mocksUtils.checkAuth()) {
+ return [401, null, null];
+ }
+ else {
+ return [200, { "plugins": [{ "name": "code", "useOnFrontend": true }, { "name": "paste", "useOnFrontend": true }, { "name": "umbracolink", "useOnFrontend": true }], "commands": [{ "icon": "images/editor/code.gif", "command": "code", "alias": "code", "userInterface": "false", "frontEndCommand": "code", "value": "", "priority": 1, "isStylePicker": false }, { "icon": "images/editor/removeformat.gif", "command": "removeformat", "alias": "removeformat", "userInterface": "false", "frontEndCommand": "removeformat", "value": "", "priority": 2, "isStylePicker": false }, { "icon": "images/editor/undo.gif", "command": "undo", "alias": "undo", "userInterface": "false", "frontEndCommand": "undo", "value": "", "priority": 11, "isStylePicker": false }, { "icon": "images/editor/redo.gif", "command": "redo", "alias": "redo", "userInterface": "false", "frontEndCommand": "redo", "value": "", "priority": 12, "isStylePicker": false }, { "icon": "images/editor/cut.gif", "command": "cut", "alias": "cut", "userInterface": "false", "frontEndCommand": "cut", "value": "", "priority": 13, "isStylePicker": false }, { "icon": "images/editor/copy.gif", "command": "copy", "alias": "copy", "userInterface": "false", "frontEndCommand": "copy", "value": "", "priority": 14, "isStylePicker": false }, { "icon": "images/editor/showStyles.png", "command": "styleselect", "alias": "styleselect", "userInterface": "false", "frontEndCommand": "styleselect", "value": "", "priority": 20, "isStylePicker": false }, { "icon": "images/editor/bold.gif", "command": "bold", "alias": "bold", "userInterface": "false", "frontEndCommand": "bold", "value": "", "priority": 21, "isStylePicker": false }, { "icon": "images/editor/italic.gif", "command": "italic", "alias": "italic", "userInterface": "false", "frontEndCommand": "italic", "value": "", "priority": 22, "isStylePicker": false }, { "icon": "images/editor/underline.gif", "command": "underline", "alias": "underline", "userInterface": "false", "frontEndCommand": "underline", "value": "", "priority": 23, "isStylePicker": false }, { "icon": "images/editor/strikethrough.gif", "command": "strikethrough", "alias": "strikethrough", "userInterface": "false", "frontEndCommand": "strikethrough", "value": "", "priority": 24, "isStylePicker": false }, { "icon": "images/editor/justifyleft.gif", "command": "justifyleft", "alias": "justifyleft", "userInterface": "false", "frontEndCommand": "alignleft", "value": "", "priority": 31, "isStylePicker": false }, { "icon": "images/editor/justifycenter.gif", "command": "justifycenter", "alias": "justifycenter", "userInterface": "false", "frontEndCommand": "aligncenter", "value": "", "priority": 32, "isStylePicker": false }, { "icon": "images/editor/justifyright.gif", "command": "justifyright", "alias": "justifyright", "userInterface": "false", "frontEndCommand": "alignright", "value": "", "priority": 33, "isStylePicker": false }, { "icon": "images/editor/justifyfull.gif", "command": "justifyfull", "alias": "justifyfull", "userInterface": "false", "frontEndCommand": "alignfull", "value": "", "priority": 34, "isStylePicker": false }, { "icon": "images/editor/bullist.gif", "command": "bullist", "alias": "bullist", "userInterface": "false", "frontEndCommand": "bullist", "value": "", "priority": 41, "isStylePicker": false }, { "icon": "images/editor/numlist.gif", "command": "numlist", "alias": "numlist", "userInterface": "false", "frontEndCommand": "numlist", "value": "", "priority": 42, "isStylePicker": false }, { "icon": "images/editor/outdent.gif", "command": "outdent", "alias": "outdent", "userInterface": "false", "frontEndCommand": "outdent", "value": "", "priority": 43, "isStylePicker": false }, { "icon": "images/editor/indent.gif", "command": "indent", "alias": "indent", "userInterface": "false", "frontEndCommand": "indent", "value": "", "priority": 44, "isStylePicker": false }, { "icon": "images/editor/link.gif", "command": "link", "alias": "mcelink", "userInterface": "true", "frontEndCommand": "link", "value": "", "priority": 51, "isStylePicker": false }, { "icon": "images/editor/unLink.gif", "command": "unlink", "alias": "unlink", "userInterface": "false", "frontEndCommand": "unlink", "value": "", "priority": 52, "isStylePicker": false }, { "icon": "images/editor/anchor.gif", "command": "anchor", "alias": "mceinsertanchor", "userInterface": "false", "frontEndCommand": "anchor", "value": "", "priority": 53, "isStylePicker": false }, { "icon": "images/editor/image.gif", "command": "image", "alias": "mceimage", "userInterface": "true", "frontEndCommand": "umbmediapicker", "value": "", "priority": 61, "isStylePicker": false }, { "icon": "images/editor/insMacro.gif", "command": "umbracomacro", "alias": "umbracomacro", "userInterface": "true", "frontEndCommand": "umbmacro", "value": "", "priority": 62, "isStylePicker": false }, { "icon": "images/editor/table.gif", "command": "table", "alias": "mceinserttable", "userInterface": "true", "frontEndCommand": "table", "value": "", "priority": 63, "isStylePicker": false }, { "icon": "images/editor/media.gif", "command": "umbracoembed", "alias": "umbracoembed", "userInterface": "true", "frontEndCommand": "umbembeddialog", "value": "", "priority": 66, "isStylePicker": false }, { "icon": "images/editor/hr.gif", "command": "hr", "alias": "inserthorizontalrule", "userInterface": "false", "frontEndCommand": "hr", "value": "", "priority": 71, "isStylePicker": false }, { "icon": "images/editor/sub.gif", "command": "sub", "alias": "subscript", "userInterface": "false", "frontEndCommand": "sub", "value": "", "priority": 72, "isStylePicker": false }, { "icon": "images/editor/sup.gif", "command": "sup", "alias": "superscript", "userInterface": "false", "frontEndCommand": "sup", "value": "", "priority": 73, "isStylePicker": false }, { "icon": "images/editor/charmap.gif", "command": "charmap", "alias": "mcecharmap", "userInterface": "false", "frontEndCommand": "charmap", "value": "", "priority": 74, "isStylePicker": false }], "validElements": "+a[id|style|rel|rev|charset|hreflang|dir|lang|tabindex|accesskey|type|name|href|target|title|class|onfocus|onblur|onclick|ondblclick|onmousedown|onmouseup|onmouseover|onmousemove|onmouseout|onkeypress|onkeydown|onkeyup],-strong/-b[class|style],-em/-i[class|style],-strike[class|style],-u[class|style],#p[id|style|dir|class|align],-ol[class|reversed|start|style|type],-ul[class|style],-li[class|style],br[class],img[id|dir|lang|longdesc|usemap|style|class|src|onmouseover|onmouseout|border|alt=|title|hspace|vspace|width|height|align|umbracoorgwidth|umbracoorgheight|onresize|onresizestart|onresizeend|rel],-sub[style|class],-sup[style|class],-blockquote[dir|style|class],-table[border=0|cellspacing|cellpadding|width|height|class|align|summary|style|dir|id|lang|bgcolor|background|bordercolor],-tr[id|lang|dir|class|rowspan|width|height|align|valign|style|bgcolor|background|bordercolor],tbody[id|class],thead[id|class],tfoot[id|class],#td[id|lang|dir|class|colspan|rowspan|width|height|align|valign|style|bgcolor|background|bordercolor|scope],-th[id|lang|dir|class|colspan|rowspan|width|height|align|valign|style|scope],caption[id|lang|dir|class|style],-div[id|dir|class|align|style],-span[class|align|style],-pre[class|align|style],address[class|align|style],-h1[id|dir|class|align],-h2[id|dir|class|align],-h3[id|dir|class|align],-h4[id|dir|class|align],-h5[id|dir|class|align],-h6[id|style|dir|class|align],hr[class|style],dd[id|class|title|style|dir|lang],dl[id|class|title|style|dir|lang],dt[id|class|title|style|dir|lang],object[class|id|width|height|codebase|*],param[name|value|_value|class],embed[type|width|height|src|class|*],map[name|class],area[shape|coords|href|alt|target|class],bdo[class],button[class],iframe[*]", "inValidElements": "font", "customConfig": { "entity_encoding": "raw" } }, null];
+ }
+ }
+
+ function getCanvasEditorConfiguration(status, data, headers){
+ if (!mocksUtils.checkAuth()) {
+ return [401, null, null];
+ }
+ else {
+ return [200,
+ [
+ {
+ "name": "Rich text editor",
+ "alias": "rte",
+ "view": "rte",
+ "icon": "icon-article"
+ },
+ {
+ "name": "Image",
+ "alias": "media",
+ "view": "media",
+ "icon": "icon-picture"
+ },
+ {
+ "name": "Macro",
+ "alias": "macro",
+ "view": "macro",
+ "icon": "icon-settings-alt"
+ },
+ {
+ "name": "Embed",
+ "alias": "embed",
+ "view": "embed",
+ "icon": "icon-movie-alt"
+ },
+ {
+ "name": "Headline",
+ "alias": "headline",
+ "view": "textstring",
+ "icon": "icon-coin",
+ "config": {
+ "style": "font-size: 36px; line-height: 45px; font-weight: bold",
+ "markup": "
#value# "
+ }
+ },
+ {
+ "name": "Quote",
+ "alias": "quote",
+ "view": "textstring",
+ "icon": "icon-quote",
+ "config": {
+ "style": "border-left: 3px solid #ccc; padding: 10px; color: #ccc; font-family: serif; font-style: italic; font-size: 18px",
+ "markup": "
#value# "
+ }
+ }
+ ], null];
+ }
+
+ }
+
+
+ return {
+ register: function() {
+ $httpBackend
+ .whenGET(mocksUtils.urlRegex('/umbraco/UmbracoApi/RichTextPreValue/GetConfiguration'))
+ .respond(getRichTextConfiguration);
+ $httpBackend
+ .whenGET(mocksUtils.urlRegex('../config/canvas.editors.config.js'))
+ .respond(getCanvasEditorConfiguration);
+ }
+ };
+ }]);
+angular.module('umbraco.mocks').
+ factory('mocksUtils', ['$cookieStore', function($cookieStore) {
+ 'use strict';
+
+ //by default we will perform authorization
+ var doAuth = true;
+
+ return {
+
+ getMockDataType: function(id, selectedId) {
+ var dataType = {
+ id: id,
+ name: "Simple editor " + id,
+ selectedEditor: selectedId,
+ availableEditors: [
+ { name: "Simple editor 1", editorId: String.CreateGuid() },
+ { name: "Simple editor 2", editorId: String.CreateGuid() },
+ { name: "Simple editor " + id, editorId: selectedId },
+ { name: "Simple editor 4", editorId: String.CreateGuid() },
+ { name: "Simple editor 5", editorId: String.CreateGuid() },
+ { name: "Simple editor 6", editorId: String.CreateGuid() }
+ ],
+ preValues: [
+ {
+ label: "Custom pre value 1 for editor " + selectedId,
+ description: "Enter a value for this pre-value",
+ key: "myPreVal1",
+ view: "requiredfield"
+ },
+ {
+ label: "Custom pre value 2 for editor " + selectedId,
+ description: "Enter a value for this pre-value",
+ key: "myPreVal2",
+ view: "requiredfield"
+ }
+ ]
+
+ };
+ return dataType;
+ },
+
+ /** Creats a mock content object */
+ getMockContent: function(id) {
+ var node = {
+ name: "My content with id: " + id,
+ updateDate: new Date().toIsoDateTimeString(),
+ publishDate: new Date().toIsoDateTimeString(),
+ createDate: new Date().toIsoDateTimeString(),
+ id: id,
+ parentId: 1234,
+ icon: "icon-umb-content",
+ owner: { name: "Administrator", id: 0 },
+ updater: { name: "Per Ploug Krogslund", id: 1 },
+ path: "-1,1234,2455",
+ allowedActions: ["U", "H", "A"],
+ tabs: [
+ {
+ label: "Grid",
+ id: 1,
+ active: true,
+ properties: [
+ { alias: "grid",
+ label: "Grid",
+ view: "grid",
+ value: "",
+ hideLabel: true,
+ config: {
+ items:{
+
+ styles:[
+ {
+ label: "Set a background image",
+ description: "Set a row background",
+ key: "background-image",
+ view: "imagepicker",
+ modifier: "url({0})"
+ }
+ ],
+ config:[
+ {
+ label: "Class",
+ description: "Set a css class",
+ key: "class",
+ view: "textstring"
+ }
+ ],
+ columns: 12,
+ templates:[
+ {
+ name: "1 column layout",
+ sections: [
+ {
+ grid: 12,
+ }
+ ]
+ },
+ {
+ name: "2 column layout",
+ sections: [
+ {
+ grid: 4,
+ },
+ {
+ grid: 8
+ }
+ ]
+ }
+ ],
+
+
+ layouts:[
+ {
+ name: "Headline",
+ areas: [
+ {
+ grid: 12,
+ editors: ["headline"]
+ }
+ ]
+ },
+ {
+ name: "Article",
+ areas: [
+ {
+ grid: 12
+ },
+ {
+ grid: 4
+ },
+ {
+ grid: 8
+ },
+ {
+ grid: 12
+ }
+ ]
+ }
+ ]
+ }
+
+ }
+ },
+ ]
+ },
+ {
+ label: "Content",
+ id: 2,
+ properties: [
+ { alias: "valTest", label: "Validation test", view: "validationtest", value: "asdfasdf" },
+ { alias: "bodyText", label: "Body Text", description: "Here you enter the primary article contents", view: "rte", value: "
askjdkasj lasjd
", config: {} },
+ { alias: "textarea", label: "textarea", view: "textarea", value: "ajsdka sdjkds", config: { rows: 4 } },
+ { alias: "media", label: "Media picker", view: "mediapicker", value: "1234,23242,23232,23231", config: {multiPicker: 1} }
+ ]
+ },
+ {
+ label: "Sample Editor",
+ id: 3,
+ properties: [
+ { alias: "datepicker", label: "Datepicker", view: "datepicker", config: { pickTime: false, format: "yyyy-MM-dd" } },
+ { alias: "tags", label: "Tags", view: "tags", value: "" }
+ ]
+ },
+ {
+ label: "This",
+ id: 4,
+ properties: [
+ { alias: "valTest4", label: "Validation test", view: "validationtest", value: "asdfasdf" },
+ { alias: "bodyText4", label: "Body Text", description: "Here you enter the primary article contents", view: "rte", value: "
askjdkasj lasjd
", config: {} },
+ { alias: "textarea4", label: "textarea", view: "textarea", value: "ajsdka sdjkds", config: { rows: 4 } },
+ { alias: "content4", label: "Content picker", view: "contentpicker", value: "1234,23242,23232,23231" }
+ ]
+ },
+ {
+ label: "Is",
+ id: 5,
+ properties: [
+ { alias: "valTest5", label: "Validation test", view: "validationtest", value: "asdfasdf" },
+ { alias: "bodyText5", label: "Body Text", description: "Here you enter the primary article contents", view: "rte", value: "
askjdkasj lasjd
", config: {} },
+ { alias: "textarea5", label: "textarea", view: "textarea", value: "ajsdka sdjkds", config: { rows: 4 } },
+ { alias: "content5", label: "Content picker", view: "contentpicker", value: "1234,23242,23232,23231" }
+ ]
+ },
+ {
+ label: "Overflown",
+ id: 6,
+ properties: [
+ { alias: "valTest6", label: "Validation test", view: "validationtest", value: "asdfasdf" },
+ { alias: "bodyText6", label: "Body Text", description: "Here you enter the primary article contents", view: "rte", value: "
askjdkasj lasjd
", config: {} },
+ { alias: "textarea6", label: "textarea", view: "textarea", value: "ajsdka sdjkds", config: { rows: 4 } },
+ { alias: "content6", label: "Content picker", view: "contentpicker", value: "1234,23242,23232,23231" }
+ ]
+ },
+ {
+ label: "Generic Properties",
+ id: 0,
+ properties: [
+ {
+ label: 'Id',
+ value: 1234,
+ view: "readonlyvalue",
+ alias: "_umb_id"
+ },
+ {
+ label: 'Created by',
+ description: 'Original author',
+ value: "Administrator",
+ view: "readonlyvalue",
+ alias: "_umb_createdby"
+ },
+ {
+ label: 'Created',
+ description: 'Date/time this document was created',
+ value: new Date().toIsoDateTimeString(),
+ view: "readonlyvalue",
+ alias: "_umb_createdate"
+ },
+ {
+ label: 'Updated',
+ description: 'Date/time this document was created',
+ value: new Date().toIsoDateTimeString(),
+ view: "readonlyvalue",
+ alias: "_umb_updatedate"
+ },
+ {
+ label: 'Document Type',
+ value: "Home page",
+ view: "readonlyvalue",
+ alias: "_umb_doctype"
+ },
+ {
+ label: 'Publish at',
+ description: 'Date/time to publish this document',
+ value: new Date().toIsoDateTimeString(),
+ view: "datepicker",
+ alias: "_umb_releasedate"
+ },
+ {
+ label: 'Unpublish at',
+ description: 'Date/time to un-publish this document',
+ value: new Date().toIsoDateTimeString(),
+ view: "datepicker",
+ alias: "_umb_expiredate"
+ },
+ {
+ label: 'Template',
+ value: "myTemplate",
+ view: "dropdown",
+ alias: "_umb_template",
+ config: {
+ items: {
+ "" : "-- Choose template --",
+ "myTemplate" : "My Templates",
+ "home" : "Home Page",
+ "news" : "News Page"
+ }
+ }
+ },
+ {
+ label: 'Link to document',
+ value: ["/testing" + id, "http://localhost/testing" + id, "http://mydomain.com/testing" + id].join(),
+ view: "urllist",
+ alias: "_umb_urllist"
+ },
+ {
+ alias: "test", label: "Stuff", view: "test", value: "",
+ config: {
+ fields: [
+ { alias: "embedded", label: "Embbeded", view: "textstring", value: "" },
+ { alias: "embedded2", label: "Embbeded 2", view: "contentpicker", value: "" },
+ { alias: "embedded3", label: "Embbeded 3", view: "textarea", value: "" },
+ { alias: "embedded4", label: "Embbeded 4", view: "datepicker", value: "" }
+ ]
+ }
+ }
+ ]
+ }
+ ]
+ };
+
+ return node;
+ },
+
+ getMockEntity : function(id){
+ return {name: "hello", id: id, icon: "icon-file"};
+ },
+
+ /** generally used for unit tests, calling this will disable the auth check and always return true */
+ disableAuth: function() {
+ doAuth = false;
+ },
+
+ /** generally used for unit tests, calling this will enabled the auth check */
+ enabledAuth: function() {
+ doAuth = true;
+ },
+
+ /** Checks for our mock auth cookie, if it's not there, returns false */
+ checkAuth: function () {
+ if (doAuth) {
+ var mockAuthCookie = $cookieStore.get("mockAuthCookie");
+ if (!mockAuthCookie) {
+ return false;
+ }
+ return true;
+ }
+ else {
+ return true;
+ }
+ },
+
+ /** Creates/sets the auth cookie with a value indicating the user is now authenticated */
+ setAuth: function() {
+ //set the cookie for loging
+ $cookieStore.put("mockAuthCookie", "Logged in!");
+ },
+
+ /** removes the auth cookie */
+ clearAuth: function() {
+ $cookieStore.remove("mockAuthCookie");
+ },
+
+ urlRegex: function(url) {
+ url = url.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&");
+ return new RegExp("^" + url);
+ },
+
+ getParameterByName: function(url, name) {
+ name = name.replace(/[\[]/, "\\[").replace(/[\]]/, "\\]");
+
+ var regex = new RegExp("[\\?&]" + name + "=([^]*)"),
+ results = regex.exec(url);
+
+ return results === null ? "" : decodeURIComponent(results[1].replace(/\+/g, " "));
+ },
+
+ getParametersByName: function(url, name) {
+ name = name.replace(/[\[]/, "\\[").replace(/[\]]/, "\\]");
+
+ var regex = new RegExp(name + "=([^]*)", "mg"), results = [];
+ var match;
+
+ while ( ( match = regex.exec(url) ) !== null )
+ {
+ results.push(decodeURIComponent(match[1].replace(/\+/g, " ")));
+ }
+
+ return results;
+ }
+ };
+ }]);
+
+angular.module('umbraco.mocks').
+ factory('contentMocks', ['$httpBackend', 'mocksUtils', function ($httpBackend, mocksUtils) {
+ 'use strict';
+
+ function returnChildren(status, data, headers) {
+ if (!mocksUtils.checkAuth()) {
+ return [401, null, null];
+ }
+
+ var pageNumber = Number(mocksUtils.getParameterByName(data, "pageNumber"));
+ var filter = mocksUtils.getParameterByName(data, "filter");
+ var pageSize = Number(mocksUtils.getParameterByName(data, "pageSize"));
+ var parentId = Number(mocksUtils.getParameterByName(data, "id"));
+
+ if (pageNumber === 0) {
+ pageNumber = 1;
+ }
+ var collection = { pageSize: pageSize, totalItems: 68, totalPages: 7, pageNumber: pageNumber, filter: filter };
+ collection.totalItems = 56 - (filter.length);
+ if (pageSize > 0) {
+ collection.totalPages = Math.round(collection.totalItems / collection.pageSize);
+ }
+ else {
+ collection.totalPages = 1;
+ }
+ collection.items = [];
+
+ if (collection.totalItems < pageSize || pageSize < 1) {
+ collection.pageSize = collection.totalItems;
+ } else {
+ collection.pageSize = pageSize;
+ }
+
+ var id = 0;
+ for (var i = 0; i < collection.pageSize; i++) {
+ id = (parentId + i) * pageNumber;
+ var cnt = mocksUtils.getMockContent(id);
+
+ //here we fake filtering
+ if (filter !== '') {
+ cnt.name = filter + cnt.name;
+ }
+
+ //set a fake sortOrder
+ cnt.sortOrder = i + 1;
+
+ collection.items.push(cnt);
+ }
+
+ return [200, collection, null];
+ }
+
+ function returnDeletedNode(status, data, headers) {
+ if (!mocksUtils.checkAuth()) {
+ return [401, null, null];
+ }
+
+ return [200, null, null];
+ }
+
+ function returnEmptyNode(status, data, headers) {
+
+ if (!mocksUtils.checkAuth()) {
+ return [401, null, null];
+ }
+
+ var response = returnNodebyId(200, "", null);
+ var node = response[1];
+ var parentId = mocksUtils.getParameterByName(data, "parentId") || 1234;
+
+ node.name = "";
+ node.id = 0;
+ node.parentId = parentId;
+
+ $(node.tabs).each(function(i,tab){
+ $(tab.properties).each(function(i, property){
+ property.value = "";
+ });
+ });
+
+ return response;
+ }
+
+ function returnNodebyId(status, data, headers) {
+
+ if (!mocksUtils.checkAuth()) {
+ return [401, null, null];
+ }
+
+ var id = mocksUtils.getParameterByName(data, "id") || "1234";
+ id = parseInt(id, 10);
+
+ var node = mocksUtils.getMockContent(id);
+
+ return [200, node, null];
+ }
+
+ function returnNodebyIds(status, data, headers) {
+
+ if (!mocksUtils.checkAuth()) {
+ return [401, null, null];
+ }
+
+ var ids = mocksUtils.getParameterByName(data, "ids") || [1234,23324,2323,23424];
+ var nodes = [];
+
+ $(ids).each(function(i, id){
+ var _id = parseInt(id, 10);
+ nodes.push(mocksUtils.getMockContent(_id));
+ });
+
+ return [200, nodes, null];
+ }
+
+ function returnSort(status, data, headers) {
+ if (!mocksUtils.checkAuth()) {
+ return [401, null, null];
+ }
+
+ return [200, null, null];
+ }
+
+ function returnSave(status, data, headers) {
+ if (!mocksUtils.checkAuth()) {
+ return [401, null, null];
+ }
+
+ return [200, null, null];
+ }
+
+ return {
+ register: function () {
+
+ $httpBackend
+ .whenPOST(mocksUtils.urlRegex('/umbraco/UmbracoApi/Content/PostSave'))
+ .respond(returnSave);
+
+ $httpBackend
+ .whenPOST(mocksUtils.urlRegex('/umbraco/UmbracoApi/Content/PostSort'))
+ .respond(returnSort);
+
+ $httpBackend
+ .whenGET(mocksUtils.urlRegex('/umbraco/UmbracoApi/Content/GetChildren'))
+ .respond(returnChildren);
+
+ $httpBackend
+ .whenGET(mocksUtils.urlRegex('/umbraco/UmbracoApi/Content/GetByIds'))
+ .respond(returnNodebyIds);
+
+ $httpBackend
+ .whenGET(mocksUtils.urlRegex('/umbraco/UmbracoApi/Content/GetById?'))
+ .respond(returnNodebyId);
+
+ $httpBackend
+ .whenGET(mocksUtils.urlRegex('/umbraco/UmbracoApi/Content/GetEmpty'))
+ .respond(returnEmptyNode);
+
+ $httpBackend
+ .whenDELETE(mocksUtils.urlRegex('/umbraco/UmbracoApi/Content/DeleteById'))
+ .respond(returnDeletedNode);
+
+ $httpBackend
+ .whenDELETE(mocksUtils.urlRegex('/umbraco/UmbracoApi/Content/EmptyRecycleBin'))
+ .respond(returnDeletedNode);
+ },
+
+ expectGetById: function() {
+ $httpBackend
+ .expectGET(mocksUtils.urlRegex('/umbraco/UmbracoApi/Content/GetById'));
+ }
+ };
+ }]);
+angular.module('umbraco.mocks').
+ factory('contentTypeMocks', ['$httpBackend', 'mocksUtils', function ($httpBackend, mocksUtils) {
+ 'use strict';
+
+ function returnAllowedChildren(status, data, headers) {
+
+ if (!mocksUtils.checkAuth()) {
+ return [401, null, null];
+ }
+
+ var types = [
+ { name: "News Article", description: "Standard news article", alias: "newsArticle", id: 1234, icon: "icon-file", thumbnail: "icon-file" },
+ { name: "News Area", description: "Area to hold all news articles, there should be only one", alias: "newsArea", id: 1234, icon: "icon-suitcase", thumbnail: "icon-suitcase" },
+ { name: "Employee", description: "Employee profile information page", alias: "employee", id: 1234, icon: "icon-user", thumbnail: "icon-user" }
+ ];
+ return [200, types, null];
+ }
+
+ return {
+ register: function() {
+ $httpBackend
+ .whenGET(mocksUtils.urlRegex('/umbraco/Api/ContentType/GetAllowedChildren'))
+ .respond(returnAllowedChildren);
+
+ },
+ expectAllowedChildren: function(){
+ console.log("expecting get");
+ $httpBackend.expectGET(mocksUtils.urlRegex('/umbraco/Api/ContentType/GetAllowedChildren'));
+ }
+ };
+ }]);
+angular.module('umbraco.mocks').
+ factory('dashboardMocks', ['$httpBackend', 'mocksUtils', function ($httpBackend, mocksUtils) {
+ 'use strict';
+
+ function getDashboard(status, data, headers) {
+ //check for existence of a cookie so we can do login/logout in the belle app (ignore for tests).
+ if (!mocksUtils.checkAuth()) {
+ return [401, null, null];
+ }
+ else {
+ //TODO: return real mocked data
+ return [200, [], null];
+ }
+ }
+
+ return {
+ register: function() {
+
+ $httpBackend
+ .whenGET(mocksUtils.urlRegex('/umbraco/UmbracoApi/Dashboard/GetDashboard'))
+ .respond(getDashboard);
+ }
+ };
+ }]);
+angular.module('umbraco.mocks').
+ factory('dataTypeMocks', ['$httpBackend', 'mocksUtils', function ($httpBackend, mocksUtils) {
+ 'use strict';
+
+ function returnById(status, data, headers) {
+
+ if (!mocksUtils.checkAuth()) {
+ return [401, null, null];
+ }
+
+ var id = mocksUtils.getParameterByName(data, "id") || 1234;
+
+ var selectedId = String.CreateGuid();
+
+ var dataType = mocksUtils.getMockDataType(id, selectedId);
+
+ return [200, dataType, null];
+ }
+
+ function returnEmpty(status, data, headers) {
+
+ if (!mocksUtils.checkAuth()) {
+ return [401, null, null];
+ }
+
+ var response = returnById(200, "", null);
+ var node = response[1];
+
+ node.name = "";
+ node.selectedEditor = "";
+ node.id = 0;
+ node.preValues = [];
+
+ return response;
+ }
+
+ function returnPreValues(status, data, headers) {
+
+ if (!mocksUtils.checkAuth()) {
+ return [401, null, null];
+ }
+
+ var editorId = mocksUtils.getParameterByName(data, "editorId") || "83E9AD36-51A7-4440-8C07-8A5623AC6979";
+
+ var preValues = [
+ {
+ label: "Custom pre value 1 for editor " + editorId,
+ description: "Enter a value for this pre-value",
+ key: "myPreVal",
+ view: "requiredfield",
+ validation: [
+ {
+ type: "Required"
+ }
+ ]
+ },
+ {
+ label: "Custom pre value 2 for editor " + editorId,
+ description: "Enter a value for this pre-value",
+ key: "myPreVal",
+ view: "requiredfield",
+ validation: [
+ {
+ type: "Required"
+ }
+ ]
+ }
+ ];
+ return [200, preValues, null];
+ }
+
+ function returnSave(status, data, headers) {
+ if (!mocksUtils.checkAuth()) {
+ return [401, null, null];
+ }
+
+ var postedData = angular.fromJson(headers);
+
+ var dataType = mocksUtils.getMockDataType(postedData.id, postedData.selectedEditor);
+ dataType.notifications = [{
+ header: "Saved",
+ message: "Data type saved",
+ type: 0
+ }];
+
+ return [200, dataType, null];
+ }
+
+ return {
+ register: function() {
+
+ $httpBackend
+ .whenPOST(mocksUtils.urlRegex('/umbraco/UmbracoApi/DataType/PostSave'))
+ .respond(returnSave);
+
+ $httpBackend
+ .whenGET(mocksUtils.urlRegex('/umbraco/UmbracoApi/DataType/GetById'))
+ .respond(returnById);
+
+ $httpBackend
+ .whenGET(mocksUtils.urlRegex('/umbraco/UmbracoApi/DataType/GetEmpty'))
+ .respond(returnEmpty);
+
+ $httpBackend
+ .whenGET(mocksUtils.urlRegex('/umbraco/UmbracoApi/DataType/GetPreValues'))
+ .respond(returnPreValues);
+ },
+ expectGetById: function() {
+ $httpBackend
+ .expectGET(mocksUtils.urlRegex('/umbraco/UmbracoApi/DataType/GetById'));
+ }
+ };
+ }]);
+
+angular.module('umbraco.mocks').
+ factory('entityMocks', ['$httpBackend', 'mocksUtils', function ($httpBackend, mocksUtils) {
+ 'use strict';
+
+ function returnEntitybyId(status, data, headers) {
+
+ if (!mocksUtils.checkAuth()) {
+ return [401, null, null];
+ }
+
+ var id = mocksUtils.getParameterByName(data, "id") || "1234";
+ id = parseInt(id, 10);
+
+ var node = mocksUtils.getMockEntity(id);
+
+ return [200, node, null];
+ }
+
+ function returnEntitybyIds(status, data, headers) {
+
+ if (!mocksUtils.checkAuth()) {
+ return [401, null, null];
+ }
+
+ var ids = mocksUtils.getParametersByName(data, "ids") || [1234, 23324, 2323, 23424];
+ var nodes = [];
+
+ $(ids).each(function (i, id) {
+ var _id = parseInt(id, 10);
+ nodes.push(mocksUtils.getMockEntity(_id));
+ });
+
+ return [200, nodes, null];
+ }
+
+
+ return {
+ register: function () {
+
+ $httpBackend
+ .whenGET(mocksUtils.urlRegex('/umbraco/UmbracoApi/Entity/GetByIds'))
+ .respond(returnEntitybyIds);
+
+ $httpBackend
+ .whenGET(mocksUtils.urlRegex('/umbraco/UmbracoApi/Entity/GetAncestors'))
+ .respond(returnEntitybyIds);
+
+ $httpBackend
+ .whenGET(mocksUtils.urlRegex('/umbraco/UmbracoApi/Entity/GetById?'))
+ .respond(returnEntitybyId);
+ }
+ };
+ }]);
+angular.module('umbraco.mocks').
+ factory('macroMocks', ['$httpBackend', 'mocksUtils', function ($httpBackend, mocksUtils) {
+ 'use strict';
+
+ function returnParameters(status, data, headers) {
+
+ if (!mocksUtils.checkAuth()) {
+ return [401, null, null];
+ }
+
+ var nodes = [{
+ alias: "parameter1",
+ name: "Parameter 1"
+ }, {
+ alias: "parameter2",
+ name: "Parameter 2"
+ }];
+
+ return [200, nodes, null];
+ }
+
+
+ return {
+ register: function () {
+
+ $httpBackend
+ .whenGET(mocksUtils.urlRegex('/umbraco/UmbracoApi/Macro/GetMacroParameters'))
+ .respond(returnParameters);
+
+ }
+ };
+ }]);
+angular.module('umbraco.mocks').
+ factory('mediaMocks', ['$httpBackend', 'mocksUtils', function ($httpBackend, mocksUtils) {
+ 'use strict';
+
+ function returnNodeCollection(status, data, headers){
+ var nodes = [{"properties":[{"id":348,"value":"/media/1045/windows95.jpg","alias":"umbracoFile"},{"id":349,"value":"640","alias":"umbracoWidth"},{"id":350,"value":"472","alias":"umbracoHeight"},{"id":351,"value":"53472","alias":"umbracoBytes"},{"id":352,"value":"jpg","alias":"umbracoExtension"}],"updateDate":"2013-08-27 15:50:08","createDate":"2013-08-27 15:50:08","owner":{"id":0,"name":"admin"},"updater":null,"contentTypeAlias":"Image","sortOrder":0,"name":"windows95.jpg","id":1128,"icon":"mediaPhoto.gif","parentId":1127},{"properties":[{"id":353,"value":"/media/1046/pete.png","alias":"umbracoFile"},{"id":354,"value":"240","alias":"umbracoWidth"},{"id":355,"value":"240","alias":"umbracoHeight"},{"id":356,"value":"87408","alias":"umbracoBytes"},{"id":357,"value":"png","alias":"umbracoExtension"}],"updateDate":"2013-08-27 15:50:08","createDate":"2013-08-27 15:50:08","owner":{"id":0,"name":"admin"},"updater":null,"contentTypeAlias":"Image","sortOrder":1,"name":"pete.png","id":1129,"icon":"mediaPhoto.gif","parentId":1127},{"properties":[{"id":358,"value":"/media/1047/unicorn.jpg","alias":"umbracoFile"},{"id":359,"value":"640","alias":"umbracoWidth"},{"id":360,"value":"640","alias":"umbracoHeight"},{"id":361,"value":"577380","alias":"umbracoBytes"},{"id":362,"value":"jpg","alias":"umbracoExtension"}],"updateDate":"2013-08-27 15:50:09","createDate":"2013-08-27 15:50:09","owner":{"id":0,"name":"admin"},"updater":null,"contentTypeAlias":"Image","sortOrder":2,"name":"unicorn.jpg","id":1130,"icon":"mediaPhoto.gif","parentId":1127},{"properties":[{"id":363,"value":"/media/1049/exploding-head.gif","alias":"umbracoFile"},{"id":364,"value":"500","alias":"umbracoWidth"},{"id":365,"value":"279","alias":"umbracoHeight"},{"id":366,"value":"451237","alias":"umbracoBytes"},{"id":367,"value":"gif","alias":"umbracoExtension"}],"updateDate":"2013-08-27 15:50:09","createDate":"2013-08-27 15:50:09","owner":{"id":0,"name":"admin"},"updater":null,"contentTypeAlias":"Image","sortOrder":3,"name":"exploding head.gif","id":1131,"icon":"mediaPhoto.gif","parentId":1127},{"properties":[{"id":368,"value":"/media/1048/bighead.jpg","alias":"umbracoFile"},{"id":369,"value":"1240","alias":"umbracoWidth"},{"id":370,"value":"1655","alias":"umbracoHeight"},{"id":371,"value":"836261","alias":"umbracoBytes"},{"id":372,"value":"jpg","alias":"umbracoExtension"}],"updateDate":"2013-08-27 15:50:09","createDate":"2013-08-27 15:50:09","owner":{"id":0,"name":"admin"},"updater":null,"contentTypeAlias":"Image","sortOrder":4,"name":"bighead.jpg","id":1132,"icon":"mediaPhoto.gif","parentId":1127},{"properties":[{"id":373,"value":"/media/1050/powerlines.jpg","alias":"umbracoFile"},{"id":374,"value":"636","alias":"umbracoWidth"},{"id":375,"value":"423","alias":"umbracoHeight"},{"id":376,"value":"79874","alias":"umbracoBytes"},{"id":377,"value":"jpg","alias":"umbracoExtension"}],"updateDate":"2013-08-27 15:50:09","createDate":"2013-08-27 15:50:09","owner":{"id":0,"name":"admin"},"updater":null,"contentTypeAlias":"Image","sortOrder":5,"name":"powerlines.jpg","id":1133,"icon":"mediaPhoto.gif","parentId":1127},{"properties":[{"id":430,"value":"","alias":"contents"}],"updateDate":"2013-08-30 08:53:22","createDate":"2013-08-30 08:53:22","owner":{"id":0,"name":"admin"},"updater":null,"contentTypeAlias":"Folder","sortOrder":6,"name":"new folder","id":1146,"icon":"folder.gif","parentId":1127}];
+ return [200, nodes, null];
+ }
+
+ function returnNodebyIds(status, data, headers) {
+ var ids = mocksUtils.getParameterByName(data, "ids") || "1234,1234,4234";
+ var items = [];
+
+ _.each(ids, function(id){
+ items.push(_getNode( parseInt( id, 10 )) );
+ });
+
+ return [200, items, null];
+ }
+
+ function returnNodebyId(status, data, headers) {
+
+ if (!mocksUtils.checkAuth()) {
+ return [401, null, null];
+ }
+
+ var id = mocksUtils.getParameterByName(data, "id") || 1234;
+ id = parseInt(id, 10);
+
+
+
+ return [200, _getNode(id), null];
+ }
+
+ function _getNode(id){
+ var node = {
+ name: "My media with id: " + id,
+ updateDate: new Date(),
+ publishDate: new Date(),
+ id: id,
+ parentId: 1234,
+ icon: "icon-file-alt",
+ owner: {name: "Administrator", id: 0},
+ updater: {name: "Per Ploug Krogslund", id: 1},
+ path: "-1,1234,2455",
+ tabs: [
+ {
+ label: "Media",
+ alias: "tab0",
+ id: 0,
+ properties: [
+ { alias: "umbracoFile", label: "File", description:"Some file", view: "rte", value: "/media/1234/random.jpg" }
+ ]
+ }
+ ]
+ };
+
+ return node;
+ }
+
+ return {
+ register: function() {
+ $httpBackend
+ .whenGET(mocksUtils.urlRegex('/umbraco/UmbracoApi/Media/GetById?'))
+ .respond(returnNodebyId);
+
+ $httpBackend
+ .whenGET(mocksUtils.urlRegex('/umbraco/UmbracoApi/Media/GetByIds?'))
+ .respond(returnNodebyIds);
+
+ $httpBackend
+ .whenGET(mocksUtils.urlRegex('/umbraco/UmbracoApi/Media/GetChildren'))
+ .respond(returnNodeCollection);
+
+ },
+ expectGetById: function() {
+ $httpBackend
+ .expectGET(mocksUtils.urlRegex('/umbraco/UmbracoApi/Media/GetById'));
+ }
+ };
+ }]);
+
+/**
+* @ngdoc service
+* @name umbraco.mocks.sectionMocks
+* @description
+* Mocks data retrival for the sections
+**/
+function sectionMocks($httpBackend, mocksUtils) {
+
+ /** internal method to mock the sections to be returned */
+ function getSections() {
+
+ if (!mocksUtils.checkAuth()) {
+ return [401, null, null];
+ }
+
+ var sections = [
+ { name: "Content", cssclass: "icon-umb-content", alias: "content" },
+ { name: "Media", cssclass: "icon-umb-media", alias: "media" },
+ { name: "Settings", cssclass: "icon-umb-settings", alias: "settings" },
+ { name: "Developer", cssclass: "icon-umb-developer", alias: "developer" },
+ { name: "Users", cssclass: "icon-umb-users", alias: "users" },
+ { name: "Developer", cssclass: "icon-umb-developer", alias: "developer" },
+ { name: "Users", cssclass: "icon-umb-users", alias: "users" }
+ ];
+
+ return [200, sections, null];
+ }
+
+ return {
+ register: function () {
+ $httpBackend
+ .whenGET(mocksUtils.urlRegex('/umbraco/UmbracoApi/Section/GetSections'))
+ .respond(getSections);
+ }
+ };
+}
+
+angular.module('umbraco.mocks').factory('sectionMocks', ['$httpBackend', 'mocksUtils', sectionMocks]);
+
+angular.module('umbraco.mocks').
+ factory('treeMocks', ['$httpBackend', 'mocksUtils', function ($httpBackend, mocksUtils) {
+ 'use strict';
+
+ function getMenuItems() {
+
+ if (!mocksUtils.checkAuth()) {
+ return [401, null, null];
+ }
+
+ var menu = [
+ { name: "Create", cssclass: "plus", alias: "create", metaData: {} },
+
+ { seperator: true, name: "Delete", cssclass: "remove", alias: "delete", metaData: {} },
+ { name: "Move", cssclass: "move", alias: "move", metaData: {} },
+ { name: "Copy", cssclass: "copy", alias: "copy", metaData: {} },
+ { name: "Sort", cssclass: "sort", alias: "sort", metaData: {} },
+
+ { seperator: true, name: "Publish", cssclass: "globe", alias: "publish", metaData: {} },
+ { name: "Rollback", cssclass: "undo", alias: "rollback", metaData: {} },
+
+ { seperator: true, name: "Permissions", cssclass: "lock", alias: "permissions", metaData: {} },
+ { name: "Audit Trail", cssclass: "time", alias: "audittrail", metaData: {} },
+ { name: "Notifications", cssclass: "envelope", alias: "notifications", metaData: {} },
+
+ { seperator: true, name: "Hostnames", cssclass: "home", alias: "hostnames", metaData: {} },
+ { name: "Public Access", cssclass: "group", alias: "publicaccess", metaData: {} },
+
+ { seperator: true, name: "Reload", cssclass: "refresh", alias: "users", metaData: {} },
+
+ { seperator: true, name: "Empty Recycle Bin", cssclass: "trash", alias: "emptyrecyclebin", metaData: {} }
+ ];
+
+ var result = {
+ menuItems: menu,
+ defaultAlias: "create"
+ };
+
+ return [200, result, null];
+ }
+
+ function returnChildren(status, data, headers) {
+
+ if (!mocksUtils.checkAuth()) {
+ return [401, null, null];
+ }
+
+ var id = mocksUtils.getParameterByName(data, "id");
+ var section = mocksUtils.getParameterByName(data, "treeType");
+ var level = mocksUtils.getParameterByName(data, "level")+1;
+
+ var url = "/umbraco/UmbracoTrees/ApplicationTreeApi/GetChildren?treeType=" + section + "&id=1234&level=" + level;
+ var menuUrl = "/umbraco/UmbracoTrees/ApplicationTreeApi/GetMenu?treeType=" + section + "&id=1234&parentId=456";
+
+ //hack to have create as default content action
+ var action;
+ if (section === "content") {
+ action = "create";
+ }
+
+ var children = [
+ { name: "child-of-" + section, childNodesUrl: url, id: level + "" + 1234, icon: "icon-document", children: [], expanded: false, hasChildren: true, level: level, menuUrl: menuUrl },
+ { name: "random-name-" + section, childNodesUrl: url, id: level + "" + 1235, icon: "icon-document", children: [], expanded: false, hasChildren: true, level: level, menuUrl: menuUrl },
+ { name: "random-name-" + section, childNodesUrl: url, id: level + "" + 1236, icon: "icon-document", children: [], expanded: false, hasChildren: true, level: level, menuUrl: menuUrl },
+ { name: "random-name-" + section, childNodesUrl: url, id: level + "" + 1237, icon: "icon-document", routePath: "common/legacy/1237?p=" + encodeURI("developer/contentType.aspx?idequal1234"), children: [], expanded: false, hasChildren: true, level: level, menuUrl: menuUrl }
+ ];
+
+ return [200, children, null];
+ }
+
+ function returnDataTypes(status, data, headers) {
+ if (!mocksUtils.checkAuth()) {
+ return [401, null, null];
+ }
+
+ var children = [
+ { name: "Textstring", childNodesUrl: null, id: 10, icon: "icon-document", children: [], expanded: false, hasChildren: false, level: 1, menuUrl: null },
+ { name: "Multiple textstring", childNodesUrl: null, id: 11, icon: "icon-document", children: [], expanded: false, hasChildren: false, level: 1, menuUrl: null },
+ { name: "Yes/No", childNodesUrl: null, id: 12, icon: "icon-document", children: [], expanded: false, hasChildren: false, level: 1, menuUrl: null },
+ { name: "Rich Text Editor", childNodesUrl: null, id: 13, icon: "icon-document", children: [], expanded: false, hasChildren: false, level: 1, menuUrl: null }
+ ];
+
+ return [200, children, null];
+ }
+
+ function returnDataTypeMenu(status, data, headers) {
+ if (!mocksUtils.checkAuth()) {
+ return [401, null, null];
+ }
+
+ var menu = [
+ {
+ name: "Create", cssclass: "plus", alias: "create", metaData: {
+ jsAction: "umbracoMenuActions.CreateChildEntity"
+ }
+ },
+ { seperator: true, name: "Reload", cssclass: "refresh", alias: "users", metaData: {} }
+ ];
+
+ return [200, menu, null];
+ }
+
+ function returnApplicationTrees(status, data, headers) {
+
+ if (!mocksUtils.checkAuth()) {
+ return [401, null, null];
+ }
+
+ var section = mocksUtils.getParameterByName(data, "application");
+ var url = "/umbraco/UmbracoTrees/ApplicationTreeApi/GetChildren?treeType=" + section + "&id=1234&level=1";
+ var menuUrl = "/umbraco/UmbracoTrees/ApplicationTreeApi/GetMenu?treeType=" + section + "&id=1234&parentId=456";
+ var t;
+ switch (section) {
+
+ case "content":
+ t = {
+ name: "content",
+ id: -1,
+ children: [
+ { name: "My website", id: 1234, childNodesUrl: url, icon: "icon-home", children: [], expanded: false, hasChildren: true, level: 1, menuUrl: menuUrl },
+ { name: "Components", id: 1235, childNodesUrl: url, icon: "icon-document", children: [], expanded: false, hasChildren: true, level: 1, menuUrl: menuUrl },
+ { name: "Archieve", id: 1236, childNodesUrl: url, icon: "icon-document", children: [], expanded: false, hasChildren: true, level: 1, menuUrl: menuUrl },
+ { name: "Recycle Bin", id: -20, childNodesUrl: url, icon: "icon-trash", routePath: section + "/recyclebin", children: [], expanded: false, hasChildren: true, level: 1, menuUrl: menuUrl }
+ ],
+ expanded: true,
+ hasChildren: true,
+ level: 0,
+ menuUrl: menuUrl,
+ metaData: { treeAlias: "content" }
+ };
+
+ break;
+ case "media":
+ t = {
+ name: "media",
+ id: -1,
+ children: [
+ { name: "random-name-" + section, childNodesUrl: url, id: 1234, icon: "icon-home", children: [], expanded: false, hasChildren: true, level: 1, menuUrl: menuUrl },
+ { name: "random-name-" + section, childNodesUrl: url, id: 1235, icon: "icon-folder-close", children: [], expanded: false, hasChildren: true, level: 1, menuUrl: menuUrl },
+ { name: "random-name-" + section, childNodesUrl: url, id: 1236, icon: "icon-folder-close", children: [], expanded: false, hasChildren: true, level: 1, menuUrl: menuUrl },
+ { name: "random-name-" + section, childNodesUrl: url, id: 1237, icon: "icon-folder-close", children: [], expanded: false, hasChildren: true, level: 1, menuUrl: menuUrl }
+ ],
+ expanded: true,
+ hasChildren: true,
+ level: 0,
+ menuUrl: menuUrl,
+ metaData: { treeAlias: "media" }
+ };
+
+ break;
+ case "developer":
+
+ var dataTypeChildrenUrl = "/umbraco/UmbracoTrees/DataTypeTree/GetNodes?id=-1&application=developer";
+ var dataTypeMenuUrl = "/umbraco/UmbracoTrees/DataTypeTree/GetMenu?id=-1&application=developer";
+
+ t = {
+ name: "developer",
+ id: -1,
+ children: [
+ { name: "Data types", childNodesUrl: dataTypeChildrenUrl, id: -1, icon: "icon-folder-close", children: [], expanded: false, hasChildren: true, level: 1, menuUrl: dataTypeMenuUrl, metaData: { treeAlias: "dataTypes" } },
+ { name: "Macros", childNodesUrl: url, id: -1, icon: "icon-folder-close", children: [], expanded: false, hasChildren: true, level: 1, menuUrl: menuUrl, metaData: { treeAlias: "macros" } },
+ { name: "Packages", childNodesUrl: url, id: -1, icon: "icon-folder-close", children: [], expanded: false, hasChildren: true, level: 1, menuUrl: menuUrl, metaData: { treeAlias: "packager" } },
+ { name: "XSLT Files", childNodesUrl: url, id: -1, icon: "icon-folder-close", children: [], expanded: false, hasChildren: true, level: 1, menuUrl: menuUrl, metaData: { treeAlias: "xslt" } },
+ { name: "Partial View Macros", childNodesUrl: url, id: -1, icon: "icon-folder-close", children: [], expanded: false, hasChildren: true, level: 1, menuUrl: menuUrl, metaData: { treeAlias: "partialViewMacros" } }
+ ],
+ expanded: true,
+ hasChildren: true,
+ level: 0,
+ isContainer: true
+ };
+
+ break;
+ case "settings":
+ t = {
+ name: "settings",
+ id: -1,
+ children: [
+ { name: "Stylesheets", childNodesUrl: url, id: -1, icon: "icon-folder-close", children: [], expanded: false, hasChildren: true, level: 1, menuUrl: menuUrl, metaData: { treeAlias: "stylesheets" } },
+ { name: "Templates", childNodesUrl: url, id: -1, icon: "icon-folder-close", children: [], expanded: false, hasChildren: true, level: 1, menuUrl: menuUrl, metaData: { treeAlias: "templates" } },
+ { name: "Dictionary", childNodesUrl: url, id: -1, icon: "icon-folder-close", children: [], expanded: false, hasChildren: true, level: 1, menuUrl: menuUrl, metaData: { treeAlias: "dictionary" } },
+ { name: "Media types", childNodesUrl: url, id: -1, icon: "icon-folder-close", children: [], expanded: false, hasChildren: true, level: 1, menuUrl: menuUrl, metaData: { treeAlias: "mediaTypes" } },
+ { name: "Document types", childNodesUrl: url, id: -1, icon: "icon-folder-close", children: [], expanded: false, hasChildren: true, level: 1, menuUrl: menuUrl, metaData: { treeAlias: "documentTypes" } }
+ ],
+ expanded: true,
+ hasChildren: true,
+ level: 0,
+ isContainer: true
+ };
+
+ break;
+ default:
+
+ t = {
+ name: "randomTree",
+ id: -1,
+ children: [
+ { name: "random-name-" + section, childNodesUrl: url, id: 1234, icon: "icon-home", children: [], expanded: false, hasChildren: true, level: 1, menuUrl: menuUrl },
+ { name: "random-name-" + section, childNodesUrl: url, id: 1235, icon: "icon-folder-close", children: [], expanded: false, hasChildren: true, level: 1, menuUrl: menuUrl },
+ { name: "random-name-" + section, childNodesUrl: url, id: 1236, icon: "icon-folder-close", children: [], expanded: false, hasChildren: true, level: 1, menuUrl: menuUrl },
+ { name: "random-name-" + section, childNodesUrl: url, id: 1237, icon: "icon-folder-close", children: [], expanded: false, hasChildren: true, level: 1, menuUrl: menuUrl }
+ ],
+ expanded: true,
+ hasChildren: true,
+ level: 0,
+ menuUrl: menuUrl,
+ metaData: { treeAlias: "randomTree" }
+ };
+
+ break;
+ }
+
+
+ return [200, t, null];
+ }
+
+
+ return {
+ register: function() {
+
+ $httpBackend
+ .whenGET(mocksUtils.urlRegex('/umbraco/UmbracoTrees/ApplicationTreeApi/GetApplicationTrees'))
+ .respond(returnApplicationTrees);
+
+ $httpBackend
+ .whenGET(mocksUtils.urlRegex('/umbraco/UmbracoTrees/ApplicationTreeApi/GetChildren'))
+ .respond(returnChildren);
+
+
+ $httpBackend
+ .whenGET(mocksUtils.urlRegex('/umbraco/UmbracoTrees/DataTypeTree/GetNodes'))
+ .respond(returnDataTypes);
+
+ $httpBackend
+ .whenGET(mocksUtils.urlRegex('/umbraco/UmbracoTrees/DataTypeTree/GetMenu'))
+ .respond(returnDataTypeMenu);
+
+ $httpBackend
+ .whenGET(mocksUtils.urlRegex('/umbraco/UmbracoTrees/ApplicationTreeApi/GetMenu'))
+ .respond(getMenuItems);
+
+ }
+ };
+ }]);
+angular.module('umbraco.mocks').
+ factory('userMocks', ['$httpBackend', 'mocksUtils', function ($httpBackend, mocksUtils) {
+ 'use strict';
+
+ function generateMockedUser() {
+ // Ensure a new user object each call
+ return {
+ name: "Per Ploug",
+ email: "test@test.com",
+ emailHash: "f9879d71855b5ff21e4963273a886bfc",
+ id: 0,
+ locale: 'da-DK',
+ remainingAuthSeconds: 600,
+ allowedSections: ["content", "media"]
+ };
+ }
+
+ function isAuthenticated() {
+ //check for existence of a cookie so we can do login/logout in the belle app (ignore for tests).
+ if (!mocksUtils.checkAuth()) {
+ return [401, null, null];
+ }
+ else {
+ return [200, null, null];
+ }
+ }
+
+ function getCurrentUser(status, data, headers) {
+ if (!mocksUtils.checkAuth()) {
+ return [401, null, null];
+ }
+ else {
+ return [200, generateMockedUser(), null];
+ }
+ }
+
+ function getRemainingTimeoutSeconds(status, data, headers) {
+ if (!mocksUtils.checkAuth()) {
+ return [401, null, null];
+ }
+ else {
+ return [200, 600, null];
+ }
+ }
+
+ function returnUser(status, data, headers) {
+
+ //set the cookie for loging
+ mocksUtils.setAuth();
+
+ return [200, generateMockedUser(), null];
+ }
+
+ function logout() {
+
+ mocksUtils.clearAuth();
+
+ return [200, null, null];
+
+ }
+
+ return {
+ register: function() {
+
+ $httpBackend
+ .whenPOST(mocksUtils.urlRegex('/umbraco/UmbracoApi/Authentication/PostLogin'))
+ .respond(returnUser);
+
+ $httpBackend
+ .whenPOST(mocksUtils.urlRegex('/umbraco/UmbracoApi/Authentication/PostLogout'))
+ .respond(logout);
+
+ $httpBackend
+ .whenGET(mocksUtils.urlRegex('/umbraco/UmbracoApi/Authentication/IsAuthenticated'))
+ .respond(isAuthenticated);
+
+ $httpBackend
+ .whenGET('/umbraco/UmbracoApi/Authentication/GetCurrentUser')
+ .respond(getCurrentUser);
+
+ $httpBackend
+ .whenGET('/umbraco/UmbracoApi/Authentication/GetRemainingTimeoutSeconds')
+ .respond(getRemainingTimeoutSeconds);
+
+
+ }
+ };
+ }]);
angular.module('umbraco.mocks.services')
.factory('assetsService', function ($q) {
@@ -1341,7 +1341,7 @@ angular.module('umbraco.mocks.services')
return deferred.promise;
}
};
-});
+});
angular.module("umbraco.mocks").factory('externalLoginInfo',
function () {
return {
@@ -1349,775 +1349,775 @@ angular.module("umbraco.mocks").factory('externalLoginInfo',
providers: []
};
}
-);
-angular.module('umbraco.mocks').
- factory('localizationMocks', ['$httpBackend', 'mocksUtils', function ($httpBackend, mocksUtils) {
- 'use strict';
-
- function getLanguageResource(status, data, headers) {
- //check for existence of a cookie so we can do login/logout in the belle app (ignore for tests).
- if (!mocksUtils.checkAuth()) {
- return [401, null, null];
- }
- else {
- return [200, {
- "actions_assignDomain": "Culture and Hostnames",
- "actions_auditTrail": "Audit Trail",
- "actions_browse": "Browse Node",
- "actions_changeDocType": "Change Document Type",
- "actions_copy": "Copy",
- "actions_create": "Create",
- "actions_createPackage": "Create Package",
- "actions_delete": "Delete",
- "actions_disable": "Disable",
- "actions_emptyTrashcan": "Empty recycle bin",
- "actions_exportDocumentType": "Export Document Type",
- "actions_importDocumentType": "Import Document Type",
- "actions_importPackage": "Import Package",
- "actions_liveEdit": "Edit in Canvas",
- "actions_logout": "Exit",
- "actions_move": "Move",
- "actions_notify": "Notifications",
- "actions_protect": "Public access",
- "actions_publish": "Publish",
- "actions_unpublish": "Unpublish",
- "actions_refreshNode": "Reload nodes",
- "actions_republish": "Republish entire site",
- "actions_rights": "Permissions",
- "actions_rollback": "Rollback",
- "actions_sendtopublish": "Send To Publish",
- "actions_sendToTranslate": "Send To Translation",
- "actions_sort": "Sort",
- "actions_toPublish": "Send to publication",
- "actions_translate": "Translate",
- "actions_update": "Update",
- "actions_exportContourForm": "Export form",
- "actions_importContourForm": "Import form",
- "actions_archiveContourForm": "Archive form",
- "actions_unarchiveContourForm": "Unarchive form",
- "actions_defaultValue": "Default value",
- "assignDomain_permissionDenied": "Permission denied.",
- "assignDomain_addNew": "Add new Domain",
- "assignDomain_remove": "remove",
- "assignDomain_invalidNode": "Invalid node.",
- "assignDomain_invalidDomain": "Invalid domain format.",
- "assignDomain_duplicateDomain": "Domain has already been assigned.",
- "assignDomain_domain": "Domain",
- "assignDomain_language": "Language",
- "assignDomain_domainCreated": "New domain '%0%' has been created",
- "assignDomain_domainDeleted": "Domain '%0%' is deleted",
- "assignDomain_domainExists": "Domain '%0%' has already been assigned",
- "assignDomain_domainHelp": "Valid domain names are: 'example.com', 'www.example.com', 'example.com:8080' or 'https://www.example.com/'.
One-level paths in domains are supported, eg. 'example.com/en'. However, they should be avoided. Better use the culture setting above.",
- "assignDomain_domainUpdated": "Domain '%0%' has been updated",
- "assignDomain_orEdit": "Edit Current Domains",
- "assignDomain_inherit": "Inherit",
- "assignDomain_setLanguage": "Culture",
- "assignDomain_setLanguageHelp": "Set the culture for nodes below the current node,
or inherit culture from parent nodes. Will also apply
to the current node, unless a domain below applies too.",
- "assignDomain_setDomains": "Domains",
- "auditTrails_atViewingFor": "Viewing for",
- "buttons_select": "Select",
- "buttons_somethingElse": "Do something else",
- "buttons_bold": "Bold",
- "buttons_deindent": "Cancel Paragraph Indent",
- "buttons_formFieldInsert": "Insert form field",
- "buttons_graphicHeadline": "Insert graphic headline",
- "buttons_htmlEdit": "Edit Html",
- "buttons_indent": "Indent Paragraph",
- "buttons_italic": "Italic",
- "buttons_justifyCenter": "Center",
- "buttons_justifyLeft": "Justify Left",
- "buttons_justifyRight": "Justify Right",
- "buttons_linkInsert": "Insert Link",
- "buttons_linkLocal": "Insert local link (anchor)",
- "buttons_listBullet": "Bullet List",
- "buttons_listNumeric": "Numeric List",
- "buttons_macroInsert": "Insert macro",
- "buttons_pictureInsert": "Insert picture",
- "buttons_relations": "Edit relations",
- "buttons_save": "Save",
- "buttons_saveAndPublish": "Save and publish",
- "buttons_saveToPublish": "Save and send for approval",
- "buttons_showPage": "Preview",
- "buttons_showPageDisabled": "Preview is disabled because there's no template assigned",
- "buttons_styleChoose": "Choose style",
- "buttons_styleShow": "Show styles",
- "buttons_tableInsert": "Insert table",
- "changeDocType_changeDocTypeInstruction": "To change the document type for the selected content, first select from the list of valid types for this location.",
- "changeDocType_changeDocTypeInstruction2": "Then confirm and/or amend the mapping of properties from the current type to the new, and click Save.",
- "changeDocType_contentRepublished": "The content has been re-published.",
- "changeDocType_currentProperty": "Current Property",
- "changeDocType_currentType": "Current type",
- "changeDocType_docTypeCannotBeChanged": "The document type cannot be changed, as there are no alternatives valid for this location.",
- "changeDocType_docTypeChanged": "Document Type Changed",
- "changeDocType_mapProperties": "Map Properties",
- "changeDocType_mapToProperty": "Map to Property",
- "changeDocType_newTemplate": "New Template",
- "changeDocType_newType": "New Type",
- "changeDocType_none": "none",
- "changeDocType_selectedContent": "Content",
- "changeDocType_selectNewDocType": "Select New Document Type",
- "changeDocType_successMessage": "The document type of the selected content has been successfully changed to [new type] and the following properties mapped:",
- "changeDocType_to": "to",
- "changeDocType_validationErrorPropertyWithMoreThanOneMapping": "Could not complete property mapping as one or more properties have more than one mapping defined.",
- "changeDocType_validDocTypesNote": "Only alternate types valid for the current location are displayed.",
- "content_about": "About this page",
- "content_alias": "Alias",
- "content_alternativeTextHelp": "(how would you describe the picture over the phone)",
- "content_alternativeUrls": "Alternative Links",
- "content_clickToEdit": "Click to edit this item",
- "content_createBy": "Created by",
- "content_createByDesc": "Original autho",
- "content_updatedBy": "Updated by",
- "content_createDate": "Created",
- "content_createDateDesc": "Date/time this document was created",
- "content_documentType": "Document Type",
- "content_editing": "Editing",
- "content_expireDate": "Remove at",
- "content_itemChanged": "This item has been changed after publication",
- "content_itemNotPublished": "This item is not published",
- "content_lastPublished": "Last published",
- "content_listViewNoItems": "There are no items show in the list.",
- "content_mediatype": "Media Type",
- "content_mediaLinks": "Link to media item(s)",
- "content_membergroup": "Member Group",
- "content_memberrole": "Role",
- "content_membertype": "Member Type",
- "content_noDate": "No date chosen",
- "content_nodeName": "Page Title",
- "content_otherElements": "Properties",
- "content_parentNotPublished": "This document is published but is not visible because the parent '%0%' is unpublished",
- "content_parentNotPublishedAnomaly": "Oops: this document is published but is not in the cache (internal error)",
- "content_publish": "Publish",
- "content_publishStatus": "Publication Status",
- "content_releaseDate": "Publish at",
- "content_removeDate": "Clear Date",
- "content_sortDone": "Sortorder is updated",
- "content_sortHelp": "To sort the nodes, simply drag the nodes or click one of the column headers. You can select multiple nodes by holding the 'shift' or 'control' key while selecting",
- "content_statistics": "Statistics",
- "content_titleOptional": "Title (optional)",
- "content_type": "Type",
- "content_unPublish": "Unpublish",
- "content_updateDate": "Last edited",
- "content_updateDateDesc": "Date/time this document was created",
- "content_uploadClear": "Remove file",
- "content_urls": "Link to document",
- "content_memberof": "Member of group(s)",
- "content_notmemberof": "Not a member of group(s)",
- "content_childItems": "Child items",
- "create_chooseNode": "Where do you want to create the new %0%",
- "create_createUnder": "Create a page under",
- "create_updateData": "Choose a type and a title",
- "create_noDocumentTypes": "There are no allowed document types available. You must enable these in the settings section under
'document types' .",
- "create_noMediaTypes": "There are no allowed media types available. You must enable these in the settings section under
'media types' .",
- "dashboard_browser": "Browse your website",
- "dashboard_dontShowAgain": "- Hide",
- "dashboard_nothinghappens": "If Umbraco isn't opening, you might need to allow popups from this site",
- "dashboard_openinnew": "has opened in a new window",
- "dashboard_restart": "Restart",
- "dashboard_visit": "Visit",
- "dashboard_welcome": "Welcome",
- "defaultdialogs_anchorInsert": "Name",
- "defaultdialogs_assignDomain": "Manage hostnames",
- "defaultdialogs_closeThisWindow": "Close this window",
- "defaultdialogs_confirmdelete": "Are you sure you want to delete",
- "defaultdialogs_confirmdisable": "Are you sure you want to disable",
- "defaultdialogs_confirmEmptyTrashcan": "Please check this box to confirm deletion of %0% item(s)",
- "defaultdialogs_confirmlogout": "Are you sure?",
- "defaultdialogs_confirmSure": "Are you sure?",
- "defaultdialogs_cut": "Cut",
- "defaultdialogs_editdictionary": "Edit Dictionary Item",
- "defaultdialogs_editlanguage": "Edit Language",
- "defaultdialogs_insertAnchor": "Insert local link",
- "defaultdialogs_insertCharacter": "Insert character",
- "defaultdialogs_insertgraphicheadline": "Insert graphic headline",
- "defaultdialogs_insertimage": "Insert picture",
- "defaultdialogs_insertlink": "Insert link",
- "defaultdialogs_insertMacro": "Click to add a Macro",
- "defaultdialogs_inserttable": "Insert table",
- "defaultdialogs_lastEdited": "Last Edited",
- "defaultdialogs_link": "Link",
- "defaultdialogs_linkinternal": "Internal link:",
- "defaultdialogs_linklocaltip": "When using local links, insert '#' infront of link",
- "defaultdialogs_linknewwindow": "Open in new window?",
- "defaultdialogs_macroContainerSettings": "Macro Settings",
- "defaultdialogs_macroDoesNotHaveProperties": "This macro does not contain any properties you can edit",
- "defaultdialogs_paste": "Paste",
- "defaultdialogs_permissionsEdit": "Edit Permissions for",
- "defaultdialogs_recycleBinDeleting": "The items in the recycle bin are now being deleted. Please do not close this window while this operation takes place",
- "defaultdialogs_recycleBinIsEmpty": "The recycle bin is now empty",
- "defaultdialogs_recycleBinWarning": "When items are deleted from the recycle bin, they will be gone forever",
- "defaultdialogs_regexSearchError": "
regexlib.com 's webservice is currently experiencing some problems, which we have no control over. We are very sorry for this inconvenience.",
- "defaultdialogs_regexSearchHelp": "Search for a regular expression to add validation to a form field. Exemple: 'email, 'zip-code' 'url'",
- "defaultdialogs_removeMacro": "Remove Macro",
- "defaultdialogs_requiredField": "Required Field",
- "defaultdialogs_sitereindexed": "Site is reindexed",
- "defaultdialogs_siterepublished": "The website cache has been refreshed. All publish content is now uptodate. While all unpublished content is still unpublished",
- "defaultdialogs_siterepublishHelp": "The website cache will be refreshed. All published content will be updated, while unpublished content will stay unpublished.",
- "defaultdialogs_tableColumns": "Number of columns",
- "defaultdialogs_tableRows": "Number of rows",
- "defaultdialogs_templateContentAreaHelp": "
Set a placeholder id by setting an ID on your placeholder you can inject content into this template from child templates, by refering this ID using a
<asp:content /> element.",
- "defaultdialogs_templateContentPlaceHolderHelp": "
Select a placeholder id from the list below. You can only choose Id's from the current template's master.",
- "defaultdialogs_thumbnailimageclickfororiginal": "Click on the image to see full size",
- "defaultdialogs_treepicker": "Pick item",
- "defaultdialogs_viewCacheItem": "View Cache Item",
- "dictionaryItem_description": "Edit the different language versions for the dictionary item '
%0% ' below
You can add additional languages under the 'languages' in the menu on the left ",
- "dictionaryItem_displayName": "Culture Name",
- "placeholders_username": "Enter your username",
- "placeholders_password": "Enter your password",
- "placeholders_entername": "Enter a name...",
- "placeholders_nameentity": "Name the %0%...",
- "placeholders_search": "Type to search...",
- "placeholders_filter": "Type to filter...",
- "editcontenttype_allowedchildnodetypes": "Allowed child nodetypes",
- "editcontenttype_create": "Create",
- "editcontenttype_deletetab": "Delete tab",
- "editcontenttype_description": "Description",
- "editcontenttype_newtab": "New tab",
- "editcontenttype_tab": "Tab",
- "editcontenttype_thumbnail": "Thumbnail",
- "editcontenttype_iscontainercontenttype": "Use as container content type",
- "editdatatype_addPrevalue": "Add prevalue",
- "editdatatype_dataBaseDatatype": "Database datatype",
- "editdatatype_guid": "Property editor GUID",
- "editdatatype_renderControl": "Property editor",
- "editdatatype_rteButtons": "Buttons",
- "editdatatype_rteEnableAdvancedSettings": "Enable advanced settings for",
- "editdatatype_rteEnableContextMenu": "Enable context menu",
- "editdatatype_rteMaximumDefaultImgSize": "Maximum default size of inserted images",
- "editdatatype_rteRelatedStylesheets": "Related stylesheets",
- "editdatatype_rteShowLabel": "Show label",
- "editdatatype_rteWidthAndHeight": "Width and height",
- "errorHandling_errorButDataWasSaved": "Your data has been saved, but before you can publish this page there are some errors you need to fix first:",
- "errorHandling_errorChangingProviderPassword": "The current MemberShip Provider does not support changing password (EnablePasswordRetrieval need to be true)",
- "errorHandling_errorExistsWithoutTab": "%0% already exists",
- "errorHandling_errorHeader": "There were errors:",
- "errorHandling_errorHeaderWithoutTab": "There were errors:",
- "errorHandling_errorInPasswordFormat": "The password should be a minimum of %0% characters long and contain at least %1% non-alpha numeric character(s)",
- "errorHandling_errorIntegerWithoutTab": "%0% must be an integer",
- "errorHandling_errorMandatory": "The %0% field in the %1% tab is mandatory",
- "errorHandling_errorMandatoryWithoutTab": "%0% is a mandatory field",
- "errorHandling_errorRegExp": "%0% at %1% is not in a correct format",
- "errorHandling_errorRegExpWithoutTab": "%0% is not in a correct format",
- "errors_dissallowedMediaType": "The specified file type has been dissallowed by the administrator",
- "errors_codemirroriewarning": "NOTE! Even though CodeMirror is enabled by configuration, it is disabled in Internet Explorer because it's not stable enough.",
- "errors_contentTypeAliasAndNameNotNull": "Please fill both alias and name on the new propertytype!",
- "errors_filePermissionsError": "There is a problem with read/write access to a specific file or folder",
- "errors_missingTitle": "Please enter a title",
- "errors_missingType": "Please choose a type",
- "errors_pictureResizeBiggerThanOrg": "You're about to make the picture larger than the original size. Are you sure that you want to proceed?",
- "errors_pythonErrorHeader": "Error in python script",
- "errors_pythonErrorText": "The python script has not been saved, because it contained error(s)",
- "errors_startNodeDoesNotExists": "Startnode deleted, please contact your administrator",
- "errors_stylesMustMarkBeforeSelect": "Please mark content before changing style",
- "errors_stylesNoStylesOnPage": "No active styles available",
- "errors_tableColMergeLeft": "Please place cursor at the left of the two cells you wish to merge",
- "errors_tableSplitNotSplittable": "You cannot split a cell that hasn't been merged.",
- "errors_xsltErrorHeader": "Error in XSLT source",
- "errors_xsltErrorText": "The XSLT has not been saved, because it contained error(s)",
- "general_about": "About",
- "general_action": "Action",
- "general_add": "Add",
- "general_alias": "Alias",
- "general_areyousure": "Are you sure?",
- "general_border": "Border",
- "general_by": "or",
- "general_cancel": "Cancel",
- "general_cellMargin": "Cell margin",
- "general_choose": "Choose",
- "general_close": "Close",
- "general_closewindow": "Close Window",
- "general_comment": "Comment",
- "general_confirm": "Confirm",
- "general_constrainProportions": "Constrain proportions",
- "general_continue": "Continue",
- "general_copy": "Copy",
- "general_create": "Create",
- "general_database": "Database",
- "general_date": "Date",
- "general_default": "Default",
- "general_delete": "Delete",
- "general_deleted": "Deleted",
- "general_deleting": "Deleting...",
- "general_design": "Design",
- "general_dimensions": "Dimensions",
- "general_down": "Down",
- "general_download": "Download",
- "general_edit": "Edit",
- "general_edited": "Edited",
- "general_elements": "Elements",
- "general_email": "Email",
- "general_error": "Error",
- "general_findDocument": "Find",
- "general_height": "Height",
- "general_help": "Help",
- "general_icon": "Icon",
- "general_import": "Import",
- "general_innerMargin": "Inner margin",
- "general_insert": "Insert",
- "general_install": "Install",
- "general_justify": "Justify",
- "general_language": "Language",
- "general_layout": "Layout",
- "general_loading": "Loading",
- "general_locked": "Locked",
- "general_login": "Login",
- "general_logoff": "Log off",
- "general_logout": "Logout",
- "general_macro": "Macro",
- "general_move": "Move",
- "general_name": "Name",
- "general_new": "New",
- "general_next": "Next",
- "general_no": "No",
- "general_of": "of",
- "general_ok": "OK",
- "general_open": "Open",
- "general_or": "or",
- "general_password": "Password",
- "general_path": "Path",
- "general_placeHolderID": "Placeholder ID",
- "general_pleasewait": "One moment please...",
- "general_previous": "Previous",
- "general_properties": "Properties",
- "general_reciept": "Email to receive form data",
- "general_recycleBin": "Recycle Bin",
- "general_remaining": "Remaining",
- "general_rename": "Rename",
- "general_renew": "Renew",
- "general_required": "Required",
- "general_retry": "Retry",
- "general_rights": "Permissions",
- "general_search": "Search",
- "general_server": "Server",
- "general_show": "Show",
- "general_showPageOnSend": "Show page on Send",
- "general_size": "Size",
- "general_sort": "Sort",
- "general_type": "Type",
- "general_typeToSearch": "Type to search...",
- "general_up": "Up",
- "general_update": "Update",
- "general_upgrade": "Upgrade",
- "general_upload": "Upload",
- "general_url": "Url",
- "general_user": "User",
- "general_username": "Username",
- "general_value": "Value",
- "general_view": "View",
- "general_welcome": "Welcome...",
- "general_width": "Width",
- "general_yes": "Yes",
- "general_folder": "Folder",
- "general_searchResults": "Search results",
- "graphicheadline_backgroundcolor": "Background color",
- "graphicheadline_bold": "Bold",
- "graphicheadline_color": "Text color",
- "graphicheadline_font": "Font",
- "graphicheadline_text": "Text",
- "headers_page": "Page",
- "installer_databaseErrorCannotConnect": "The installer cannot connect to the database.",
- "installer_databaseErrorWebConfig": "Could not save the web.config file. Please modify the connection string manually.",
- "installer_databaseFound": "Your database has been found and is identified as",
- "installer_databaseHeader": "Database configuration",
- "installer_databaseInstall": " Press the
install button to install the Umbraco %0% database ",
- "installer_databaseInstallDone": "Umbraco %0% has now been copied to your database. Press
Next to proceed.",
- "installer_databaseNotFound": "
Database not found! Please check that the information in the 'connection string' of the \"web.config\" file is correct.
To proceed, please edit the 'web.config' file (using Visual Studio or your favourite text editor), scroll to the bottom, add the connection string for your database in the key named 'UmbracoDbDSN' and save the file.
Click the retry button when done. More information on editing web.config here.
",
- "installer_databaseText": "To complete this step, you must know some information regarding your database server ('connection string').
Please contact your ISP if necessary. If you're installing on a local machine or server you might need information from your system administrator.",
- "installer_databaseUpgrade": "
Press the upgrade button to upgrade your database to Umbraco %0%
Don't worry - no content will be deleted and everything will continue working afterwards!
",
- "installer_databaseUpgradeDone": "Your database has been upgraded to the final version %0%.
Press
Next to proceed. ",
- "installer_databaseUpToDate": "Your current database is up-to-date!. Click
next to continue the configuration wizard",
- "installer_defaultUserChangePass": "
The Default users' password needs to be changed! ",
- "installer_defaultUserDisabled": "
The Default user has been disabled or has no access to Umbraco! No further actions needs to be taken. Click Next to proceed.",
- "installer_defaultUserPassChanged": "The Default user's password has been successfully changed since the installation!
No further actions needs to be taken. Click Next to proceed.",
- "installer_defaultUserPasswordChanged": "The password is changed!",
- "installer_defaultUserText": "
Umbraco creates a default user with a login ('admin') and password ('default') . It's important that the password is changed to something unique.
This step will check the default user's password and suggest if it needs to be changed.
",
- "installer_greatStart": "Get a great start, watch our introduction videos",
- "installer_licenseText": "By clicking the next button (or modifying the UmbracoConfigurationStatus in web.config), you accept the license for this software as specified in the box below. Notice that this Umbraco distribution consists of two different licenses, the open source MIT license for the framework and the Umbraco freeware license that covers the UI.",
- "installer_None": "Not installed yet.",
- "installer_permissionsAffectedFolders": "Affected files and folders",
- "installer_permissionsAffectedFoldersMoreInfo": "More information on setting up permissions for Umbraco here",
- "installer_permissionsAffectedFoldersText": "You need to grant ASP.NET modify permissions to the following files/folders",
- "installer_permissionsAlmostPerfect": "
Your permission settings are almost perfect! You can run Umbraco without problems, but you will not be able to install packages which are recommended to take full advantage of Umbraco.",
- "installer_permissionsHowtoResolve": "How to Resolve",
- "installer_permissionsHowtoResolveLink": "Click here to read the text version",
- "installer_permissionsHowtoResolveText": "Watch our
video tutorial on setting up folder permissions for Umbraco or read the text version.",
- "installer_permissionsMaybeAnIssue": "
Your permission settings might be an issue! You can run Umbraco without problems, but you will not be able to create folders or install packages which are recommended to take full advantage of Umbraco.",
- "installer_permissionsNotReady": "
Your permission settings are not ready for Umbraco! In order to run Umbraco, you'll need to update your permission settings.",
- "installer_permissionsPerfect": "
Your permission settings are perfect! You are ready to run Umbraco and install packages!",
- "installer_permissionsResolveFolderIssues": "Resolving folder issue",
- "installer_permissionsResolveFolderIssuesLink": "Follow this link for more information on problems with ASP.NET and creating folders",
- "installer_permissionsSettingUpPermissions": "Setting up folder permissions",
- "installer_permissionsText": " Umbraco needs write/modify access to certain directories in order to store files like pictures and PDF's. It also stores temporary data (aka: cache) for enhancing the performance of your website. ",
- "installer_runwayFromScratch": "I want to start from scratch",
- "installer_runwayFromScratchText": " Your website is completely empty at the moment, so that's perfect if you want to start from scratch and create your own document types and templates. (
learn how ) You can still choose to install Runway later on. Please go to the Developer section and choose Packages. ",
- "installer_runwayHeader": "You've just set up a clean Umbraco platform. What do you want to do next?",
- "installer_runwayInstalled": "Runway is installed",
- "installer_runwayInstalledText": " You have the foundation in place. Select what modules you wish to install on top of it.
This is our list of recommended modules, check off the ones you would like to install, or view the
full list of modules ",
- "installer_runwayOnlyProUsers": "Only recommended for experienced users",
- "installer_runwaySimpleSite": "I want to start with a simple website",
- "installer_runwaySimpleSiteText": "
'Runway' is a simple website providing some basic document types and templates. The installer can set up Runway for you automatically, but you can easily edit, extend or remove it. It's not necessary and you can perfectly use Umbraco without it. However, Runway offers an easy foundation based on best practices to get you started faster than ever. If you choose to install Runway, you can optionally select basic building blocks called Runway Modules to enhance your Runway pages.
Included with Runway: Home page, Getting Started page, Installing Modules page. Optional Modules: Top Navigation, Sitemap, Contact, Gallery. ",
- "installer_runwayWhatIsRunway": "What is Runway",
- "installer_step1": "Step 1/5 Accept license",
- "installer_step2": "Step 2/5: Database configuration",
- "installer_step3": "Step 3/5: Validating File Permissions",
- "installer_step4": "Step 4/5: Check Umbraco security",
- "installer_step5": "Step 5/5: Umbraco is ready to get you started",
- "installer_thankYou": "Thank you for choosing Umbraco",
- "installer_theEndBrowseSite": "
Browse your new site You installed Runway, so why not see how your new website looks.",
- "installer_theEndFurtherHelp": "
Further help and information Get help from our award winning community, browse the documentation or watch some free videos on how to build a simple site, how to use packages and a quick guide to the Umbraco terminology",
- "installer_theEndHeader": "Umbraco %0% is installed and ready for use",
- "installer_theEndInstallFailed": "To finish the installation, you'll need to manually edit the
/web.config file and update the AppSetting key
UmbracoConfigurationStatus in the bottom to the value of
'%0%' .",
- "installer_theEndInstallSuccess": "You can get
started instantly by clicking the 'Launch Umbraco' button below.
If you are
new to Umbraco , you can find plenty of resources on our getting started pages.",
- "installer_theEndOpenUmbraco": "
Launch Umbraco To manage your website, simply open the Umbraco back office and start adding content, updating the templates and stylesheets or add new functionality",
- "installer_Unavailable": "Connection to database failed.",
- "installer_Version3": "Umbraco Version 3",
- "installer_Version4": "Umbraco Version 4",
- "installer_watch": "Watch",
- "installer_welcomeIntro": "This wizard will guide you through the process of configuring
Umbraco %0% for a fresh install or upgrading from version 3.0.
Press
'next' to start the wizard.",
- "language_cultureCode": "Culture Code",
- "language_displayName": "Culture Name",
- "lockout_lockoutWillOccur": "You've been idle and logout will automatically occur in",
- "lockout_renewSession": "Renew now to save your work",
- "login_greeting1": "Happy super Sunday",
- "login_greeting2": "Happy manic Monday ",
- "login_greeting3": "Happy tremendous Tuesday",
- "login_greeting4": "Happy wonderful Wednesday",
- "login_greeting5": "Happy thunderous Thursday",
- "login_greeting6": "Happy friendly Friday",
- "login_greeting7": "Happy shiny Saturday",
- "login_instruction": "Log in below:",
- "login_bottomText": "
© 2001 - %0% Umbraco.org
",
- "main_dashboard": "Dashboard",
- "main_sections": "Sections",
- "main_tree": "Content",
- "moveOrCopy_choose": "Choose page above...",
- "moveOrCopy_copyDone": "%0% has been copied to %1%",
- "moveOrCopy_copyTo": "Select where the document %0% should be copied to below",
- "moveOrCopy_moveDone": "%0% has been moved to %1%",
- "moveOrCopy_moveTo": "Select where the document %0% should be moved to below",
- "moveOrCopy_nodeSelected": "has been selected as the root of your new content, click 'ok' below.",
- "moveOrCopy_noNodeSelected": "No node selected yet, please select a node in the list above before clicking 'ok'",
- "moveOrCopy_notAllowedByContentType": "The current node is not allowed under the chosen node because of its type",
- "moveOrCopy_notAllowedByPath": "The current node cannot be moved to one of its subpages",
- "moveOrCopy_notAllowedAtRoot": "The current node cannot exist at the root",
- "moveOrCopy_notValid": "The action isn't allowed since you have insufficient permissions on 1 or more child documents.",
- "moveOrCopy_relateToOriginal": "Relate copied items to original",
- "notifications_editNotifications": "Edit your notification for %0%",
- "notifications_mailBody": " Hi %0% This is an automated mail to inform you that the task '%1%' has been performed on the page '%2%' by the user '%3%' Go to http://%4%/actions/editContent.aspx?id=%5% to edit. Have a nice day! Cheers from the Umbraco robot ",
- "notifications_mailBodyHtml": "
Hi %0%
This is an automated mail to inform you that the task '%1%' has been performed on the page '%2%' by the user '%3%'
Update summary: Have a nice day! Cheers from the Umbraco robot
",
- "notifications_mailSubject": "[%0%] Notification about %1% performed on %2%",
- "notifications_notifications": "Notifications",
- "packager_chooseLocalPackageText": " Choose Package from your machine, by clicking the Browse
button and locating the package. Umbraco packages usually have a '.umb' or '.zip' extension. ",
- "packager_packageAuthor": "Author",
- "packager_packageDemonstration": "Demonstration",
- "packager_packageDocumentation": "Documentation",
- "packager_packageMetaData": "Package meta data",
- "packager_packageName": "Package name",
- "packager_packageNoItemsHeader": "Package doesn't contain any items",
- "packager_packageNoItemsText": "This package file doesn't contain any items to uninstall.
You can safely remove this from the system by clicking 'uninstall package' below.",
- "packager_packageNoUpgrades": "No upgrades available",
- "packager_packageOptions": "Package options",
- "packager_packageReadme": "Package readme",
- "packager_packageRepository": "Package repository",
- "packager_packageUninstallConfirm": "Confirm uninstall",
- "packager_packageUninstalledHeader": "Package was uninstalled",
- "packager_packageUninstalledText": "The package was successfully uninstalled",
- "packager_packageUninstallHeader": "Uninstall package",
- "packager_packageUninstallText": "You can unselect items you do not wish to remove, at this time, below. When you click 'confirm uninstall' all checked-off items will be removed.
Notice: any documents, media etc depending on the items you remove, will stop working, and could lead to system instability, so uninstall with caution. If in doubt, contact the package author.",
- "packager_packageUpgradeDownload": "Download update from the repository",
- "packager_packageUpgradeHeader": "Upgrade package",
- "packager_packageUpgradeInstructions": "Upgrade instructions",
- "packager_packageUpgradeText": " There's an upgrade available for this package. You can download it directly from the Umbraco package repository.",
- "packager_packageVersion": "Package version",
- "packager_packageVersionHistory": "Package version history",
- "packager_viewPackageWebsite": "View package website",
- "paste_doNothing": "Paste with full formatting (Not recommended)",
- "paste_errorMessage": "The text you're trying to paste contains special characters or formatting. This could be caused by copying text from Microsoft Word. Umbraco can remove special characters or formatting automatically, so the pasted content will be more suitable for the web.",
- "paste_removeAll": "Paste as raw text without any formatting at all",
- "paste_removeSpecialFormattering": "Paste, but remove formatting (Recommended)",
- "publicAccess_paAdvanced": "Role based protection",
- "publicAccess_paAdvancedHelp": "If you wish to control access to the page using role-based authentication,
using Umbraco's member groups.",
- "publicAccess_paAdvancedNoGroups": "You need to create a membergroup before you can use
role-based authentication.",
- "publicAccess_paErrorPage": "Error Page",
- "publicAccess_paErrorPageHelp": "Used when people are logged on, but do not have access",
- "publicAccess_paHowWould": "Choose how to restict access to this page",
- "publicAccess_paIsProtected": "%0% is now protected",
- "publicAccess_paIsRemoved": "Protection removed from %0%",
- "publicAccess_paLoginPage": "Login Page",
- "publicAccess_paLoginPageHelp": "Choose the page that has the login formular",
- "publicAccess_paRemoveProtection": "Remove Protection",
- "publicAccess_paSelectPages": "Select the pages that contain login form and error messages",
- "publicAccess_paSelectRoles": "Pick the roles who have access to this page",
- "publicAccess_paSetLogin": "Set the login and password for this page",
- "publicAccess_paSimple": "Single user protection",
- "publicAccess_paSimpleHelp": "If you just want to setup simple protection using a single login and password",
- "publish_contentPublishedFailedInvalid": " %0% could not be published because these properties: %1% did not pass validation rules. ",
- "publish_contentPublishedFailedByEvent": " %0% could not be published, due to a 3rd party extension cancelling the action. ",
- "publish_contentPublishedFailedByParent": " %0% can not be published, because a parent page is not published. ",
- "publish_includeUnpublished": "Include unpublished child pages",
- "publish_inProgress": "Publishing in progress - please wait...",
- "publish_inProgressCounter": "%0% out of %1% pages have been published...",
- "publish_nodePublish": "%0% has been published",
- "publish_nodePublishAll": "%0% and subpages have been published",
- "publish_publishAll": "Publish %0% and all its subpages",
- "publish_publishHelp": "Click
ok to publish
%0% and thereby making it's content publicly available.
You can publish this page and all it's sub-pages by checking
publish all children below. ",
- "relatedlinks_addExternal": "Add external link",
- "relatedlinks_addInternal": "Add internal link",
- "relatedlinks_addlink": "Add",
- "relatedlinks_caption": "Caption",
- "relatedlinks_internalPage": "Internal page",
- "relatedlinks_linkurl": "URL",
- "relatedlinks_modeDown": "Move Down",
- "relatedlinks_modeUp": "Move Up",
- "relatedlinks_newWindow": "Open in new window",
- "relatedlinks_removeLink": "Remove link",
- "rollback_currentVersion": "Current version",
- "rollback_diffHelp": "This shows the differences between the current version and the selected version
Red text will not be shown in the selected version. ,
green means added ",
- "rollback_documentRolledBack": "Document has been rolled back",
- "rollback_htmlHelp": "This displays the selected version as html, if you wish to see the difference between 2 versions at the same time, use the diff view",
- "rollback_rollbackTo": "Rollback to",
- "rollback_selectVersion": "Select version",
- "rollback_view": "View",
- "scripts_editscript": "Edit script file",
- "sections_concierge": "Concierge",
- "sections_content": "Content",
- "sections_courier": "Courier",
- "sections_developer": "Developer",
- "sections_installer": "Umbraco Configuration Wizard",
- "sections_media": "Media",
- "sections_member": "Members",
- "sections_newsletters": "Newsletters",
- "sections_settings": "Settings",
- "sections_statistics": "Statistics",
- "sections_translation": "Translation",
- "sections_users": "Users",
- "sections_contour": "Umbraco Contour",
- "sections_help": "Help",
- "settings_defaulttemplate": "Default template",
- "settings_dictionary editor egenskab": "Dictionary Key",
- "settings_importDocumentTypeHelp": "To import a document type, find the '.udt' file on your computer by clicking the 'Browse' button and click 'Import' (you'll be asked for confirmation on the next screen)",
- "settings_newtabname": "New Tab Title",
- "settings_nodetype": "Nodetype",
- "settings_objecttype": "Type",
- "settings_stylesheet": "Stylesheet",
- "settings_stylesheet editor egenskab": "Stylesheet property",
- "settings_tab": "Tab",
- "settings_tabname": "Tab Title",
- "settings_tabs": "Tabs",
- "settings_contentTypeEnabled": "Master Content Type enabled",
- "settings_contentTypeUses": "This Content Type uses",
- "settings_asAContentMasterType": "as a Master Content Type. Tabs from Master Content Types are not shown and can only be edited on the Master Content Type itself",
- "settings_noPropertiesDefinedOnTab": "No properties defined on this tab. Click on the 'add a new property' link at the top to create a new property.",
- "sort_sortDone": "Sorting complete.",
- "sort_sortHelp": "Drag the different items up or down below to set how they should be arranged. Or click the column headers to sort the entire collection of items",
- "sort_sortPleaseWait": " Please wait. Items are being sorted, this can take a while.
Do not close this window during sorting",
- "speechBubbles_contentPublishedFailedByEvent": "Publishing was cancelled by a 3rd party add-in",
- "speechBubbles_contentTypeDublicatePropertyType": "Property type already exists",
- "speechBubbles_contentTypePropertyTypeCreated": "Property type created",
- "speechBubbles_contentTypePropertyTypeCreatedText": "Name: %0%
DataType: %1%",
- "speechBubbles_contentTypePropertyTypeDeleted": "Propertytype deleted",
- "speechBubbles_contentTypeSavedHeader": "Document Type saved",
- "speechBubbles_contentTypeTabCreated": "Tab created",
- "speechBubbles_contentTypeTabDeleted": "Tab deleted",
- "speechBubbles_contentTypeTabDeletedText": "Tab with id: %0% deleted",
- "speechBubbles_cssErrorHeader": "Stylesheet not saved",
- "speechBubbles_cssSavedHeader": "Stylesheet saved",
- "speechBubbles_cssSavedText": "Stylesheet saved without any errors",
- "speechBubbles_dataTypeSaved": "Datatype saved",
- "speechBubbles_dictionaryItemSaved": "Dictionary item saved",
- "speechBubbles_editContentPublishedFailedByParent": "Publishing failed because the parent page isn't published",
- "speechBubbles_editContentPublishedHeader": "Content published",
- "speechBubbles_editContentPublishedText": "and visible at the website",
- "speechBubbles_editContentSavedHeader": "Content saved",
- "speechBubbles_editContentSavedText": "Remember to publish to make changes visible",
- "speechBubbles_editContentSendToPublish": "Sent For Approval",
- "speechBubbles_editContentSendToPublishText": "Changes have been sent for approval",
- "speechBubbles_editMediaSaved": "Media saved",
- "speechBubbles_editMediaSavedText": "Media saved without any errors",
- "speechBubbles_editMemberSaved": "Member saved",
- "speechBubbles_editStylesheetPropertySaved": "Stylesheet Property Saved",
- "speechBubbles_editStylesheetSaved": "Stylesheet saved",
- "speechBubbles_editTemplateSaved": "Template saved",
- "speechBubbles_editUserError": "Error saving user (check log)",
- "speechBubbles_editUserSaved": "User Saved",
- "speechBubbles_editUserTypeSaved": "User type saved",
- "speechBubbles_fileErrorHeader": "File not saved",
- "speechBubbles_fileErrorText": "file could not be saved. Please check file permissions",
- "speechBubbles_fileSavedHeader": "File saved",
- "speechBubbles_fileSavedText": "File saved without any errors",
- "speechBubbles_languageSaved": "Language saved",
- "speechBubbles_pythonErrorHeader": "Python script not saved",
- "speechBubbles_pythonErrorText": "Python script could not be saved due to error",
- "speechBubbles_pythonSavedHeader": "Python script saved",
- "speechBubbles_pythonSavedText": "No errors in python script",
- "speechBubbles_templateErrorHeader": "Template not saved",
- "speechBubbles_templateErrorText": "Please make sure that you do not have 2 templates with the same alias",
- "speechBubbles_templateSavedHeader": "Template saved",
- "speechBubbles_templateSavedText": "Template saved without any errors!",
- "speechBubbles_xsltErrorHeader": "XSLT not saved",
- "speechBubbles_xsltErrorText": "XSLT contained an error",
- "speechBubbles_xsltPermissionErrorText": "XSLT could not be saved, check file permissions",
- "speechBubbles_xsltSavedHeader": "XSLT saved",
- "speechBubbles_xsltSavedText": "No errors in XSLT",
- "speechBubbles_contentUnpublished": "Content unpublished",
- "speechBubbles_partialViewSavedHeader": "Partial view saved",
- "speechBubbles_partialViewSavedText": "Partial view saved without any errors!",
- "speechBubbles_partialViewErrorHeader": "Partial view not saved",
- "speechBubbles_partialViewErrorText": "An error occurred saving the file.",
- "stylesheet_aliasHelp": "Uses CSS syntax ex: h1, .redHeader, .blueTex",
- "stylesheet_editstylesheet": "Edit stylesheet",
- "stylesheet_editstylesheetproperty": "Edit stylesheet property",
- "stylesheet_nameHelp": "Name to identify the style property in the rich text editor ",
- "stylesheet_preview": "Preview",
- "stylesheet_styles": "Styles",
- "template_edittemplate": "Edit template",
- "template_insertContentArea": "Insert content area",
- "template_insertContentAreaPlaceHolder": "Insert content area placeholder",
- "template_insertDictionaryItem": "Insert dictionary item",
- "template_insertMacro": "Insert Macro",
- "template_insertPageField": "Insert Umbraco page field",
- "template_mastertemplate": "Master template",
- "template_quickGuide": "Quick Guide to Umbraco template tags",
- "template_template": "Template",
- "templateEditor_alternativeField": "Alternative field",
- "templateEditor_alternativeText": "Alternative Text",
- "templateEditor_casing": "Casing",
- "templateEditor_encoding": "Encoding",
- "templateEditor_chooseField": "Choose field",
- "templateEditor_convertLineBreaks": "Convert Linebreaks",
- "templateEditor_convertLineBreaksHelp": "Replaces linebreaks with html-tag <br>",
- "templateEditor_customFields": "Custom Fields",
- "templateEditor_dateOnly": "Yes, Date only",
- "templateEditor_formatAsDate": "Format as date",
- "templateEditor_htmlEncode": "HTML encode",
- "templateEditor_htmlEncodeHelp": "Will replace special characters by their HTML equivalent.",
- "templateEditor_insertedAfter": "Will be inserted after the field value",
- "templateEditor_insertedBefore": "Will be inserted before the field value",
- "templateEditor_lowercase": "Lowercase",
- "templateEditor_none": "None",
- "templateEditor_postContent": "Insert after field",
- "templateEditor_preContent": "Insert before field",
- "templateEditor_recursive": "Recursive",
- "templateEditor_removeParagraph": "Remove Paragraph tags",
- "templateEditor_removeParagraphHelp": "Will remove any <P> in the beginning and end of the text",
- "templateEditor_standardFields": "Standard Fields",
- "templateEditor_uppercase": "Uppercase",
- "templateEditor_urlEncode": "URL encode",
- "templateEditor_urlEncodeHelp": "Will format special characters in URLs",
- "templateEditor_usedIfAllEmpty": "Will only be used when the field values above are empty",
- "templateEditor_usedIfEmpty": "This field will only be used if the primary field is empty",
- "templateEditor_withTime": "Yes, with time. Seperator: ",
- "translation_assignedTasks": "Tasks assigned to you",
- "translation_assignedTasksHelp": " The list below shows translation tasks
assigned to you . To see a detailed view including comments, click on 'Details' or just the page name. You can also download the page as XML directly by clicking the 'Download Xml' link.
To close a translation task, please go to the Details view and click the 'Close' button. ",
- "translation_closeTask": "close task",
- "translation_details": "Translation details",
- "translation_downloadAllAsXml": "Download all translation tasks as xml",
- "translation_downloadTaskAsXml": "Download xml",
- "translation_DownloadXmlDTD": "Download xml DTD",
- "translation_fields": "Fields",
- "translation_includeSubpages": "Include subpages",
- "translation_mailBody": " Hi %0% This is an automated mail to inform you that the document '%1%' has been requested for translation into '%5%' by %2%. Go to http://%3%/translation/details.aspx?id=%4% to edit. Or log into Umbraco to get an overview of your translation tasks http://%3% Have a nice day! Cheers from the Umbraco robot ",
- "translation_mailSubject": "[%0%] Translation task for %1%",
- "translation_noTranslators": "No translator users found. Please create a translator user before you start sending content to translation",
- "translation_ownedTasks": "Tasks created by you",
- "translation_ownedTasksHelp": " The list below shows pages
created by you . To see a detailed view including comments, click on 'Details' or just the page name. You can also download the page as XML directly by clicking the 'Download Xml' link. To close a translation task, please go to the Details view and click the 'Close' button. ",
- "translation_pageHasBeenSendToTranslation": "The page '%0%' has been send to translation",
- "translation_sendToTranslate": "Send the page '%0%' to translation",
- "translation_taskAssignedBy": "Assigned by",
- "translation_taskOpened": "Task opened",
- "translation_totalWords": "Total words",
- "translation_translateTo": "Translate to",
- "translation_translationDone": "Translation completed.",
- "translation_translationDoneHelp": "You can preview the pages, you've just translated, by clicking below. If the original page is found, you will get a comparison of the 2 pages.",
- "translation_translationFailed": "Translation failed, the xml file might be corrupt",
- "translation_translationOptions": "Translation options",
- "translation_translator": "Translator",
- "translation_uploadTranslationXml": "Upload translation xml",
- "treeHeaders_cacheBrowser": "Cache Browser",
- "treeHeaders_contentRecycleBin": "Recycle Bin",
- "treeHeaders_createdPackages": "Created packages",
- "treeHeaders_datatype": "Data Types",
- "treeHeaders_dictionary": "Dictionary",
- "treeHeaders_installedPackages": "Installed packages",
- "treeHeaders_installSkin": "Install skin",
- "treeHeaders_installStarterKit": "Install starter kit",
- "treeHeaders_languages": "Languages",
- "treeHeaders_localPackage": "Install local package",
- "treeHeaders_macros": "Macros",
- "treeHeaders_mediaTypes": "Media Types",
- "treeHeaders_member": "Members",
- "treeHeaders_memberGroup": "Member Groups",
- "treeHeaders_memberRoles": "Roles",
- "treeHeaders_memberType": "Member Types",
- "treeHeaders_nodeTypes": "Document Types",
- "treeHeaders_packager": "Packages",
- "treeHeaders_packages": "Packages",
- "treeHeaders_python": "Python Files",
- "treeHeaders_repositories": "Install from repository",
- "treeHeaders_runway": "Install Runway",
- "treeHeaders_runwayModules": "Runway modules",
- "treeHeaders_scripting": "Scripting Files",
- "treeHeaders_scripts": "Scripts",
- "treeHeaders_stylesheets": "Stylesheets",
- "treeHeaders_templates": "Templates",
- "treeHeaders_xslt": "XSLT Files",
- "update_updateAvailable": "New update ready",
- "update_updateDownloadText": "%0% is ready, click here for download",
- "update_updateNoServer": "No connection to server",
- "update_updateNoServerError": "Error checking for update. Please review trace-stack for further information",
- "user_administrators": "Administrator",
- "user_categoryField": "Category field",
- "user_changePassword": "Change Your Password",
- "user_newPassword": "New password",
- "user_confirmNewPassword": "Confirm new password",
- "user_changePasswordDescription": "You can change your password for accessing the Umbraco Back Office by filling out the form below and click the 'Change Password' button",
- "user_contentChannel": "Content Channel",
- "user_descriptionField": "Description field",
- "user_disabled": "Disable User",
- "user_documentType": "Document Type",
- "user_editors": "Editor",
- "user_excerptField": "Excerpt field",
- "user_language": "Language",
- "user_loginname": "Login",
- "user_mediastartnode": "Start Node in Media Library",
- "user_modules": "Sections",
- "user_noConsole": "Disable Umbraco Access",
- "user_oldPassword": "Old password",
- "user_password": "Password",
- "user_resetPassword": "Reset password",
- "user_passwordChanged": "Your password has been changed!",
- "user_passwordConfirm": "Please confirm the new password",
- "user_passwordEnterNew": "Enter your new password",
- "user_passwordIsBlank": "Your new password cannot be blank!",
- "user_passwordCurrent": "Current password",
- "user_passwordInvalid": "Invalid current password",
- "user_passwordIsDifferent": "There was a difference between the new password and the confirmed password. Please try again!",
- "user_passwordMismatch": "The confirmed password doesn't match the new password!",
- "user_permissionReplaceChildren": "Replace child node permssions",
- "user_permissionSelectedPages": "You are currently modifying permissions for the pages:",
- "user_permissionSelectPages": "Select pages to modify their permissions",
- "user_searchAllChildren": "Search all children",
- "user_startnode": "Start Node in Content",
- "user_username": "Username",
- "user_userPermissions": "User permissions",
- "user_usertype": "User type",
- "user_userTypes": "User types",
- "user_writer": "Writer",
- "user_yourProfile": "Your profile",
- "user_yourHistory": "Your recent history",
- "user_sessionExpires": "Session expires in"
- }, null];
- }
- }
-
- return {
- register: function() {
- $httpBackend
- .whenGET(mocksUtils.urlRegex('LocalizedText'))
- .respond(getLanguageResource);
- }
- };
- }]);
+);
+angular.module('umbraco.mocks').
+ factory('localizationMocks', ['$httpBackend', 'mocksUtils', function ($httpBackend, mocksUtils) {
+ 'use strict';
+
+ function getLanguageResource(status, data, headers) {
+ //check for existence of a cookie so we can do login/logout in the belle app (ignore for tests).
+ if (!mocksUtils.checkAuth()) {
+ return [401, null, null];
+ }
+ else {
+ return [200, {
+ "actions_assignDomain": "Culture and Hostnames",
+ "actions_auditTrail": "Audit Trail",
+ "actions_browse": "Browse Node",
+ "actions_changeDocType": "Change Document Type",
+ "actions_copy": "Copy",
+ "actions_create": "Create",
+ "actions_createPackage": "Create Package",
+ "actions_delete": "Delete",
+ "actions_disable": "Disable",
+ "actions_emptyTrashcan": "Empty recycle bin",
+ "actions_exportDocumentType": "Export Document Type",
+ "actions_importDocumentType": "Import Document Type",
+ "actions_importPackage": "Import Package",
+ "actions_liveEdit": "Edit in Canvas",
+ "actions_logout": "Exit",
+ "actions_move": "Move",
+ "actions_notify": "Notifications",
+ "actions_protect": "Public access",
+ "actions_publish": "Publish",
+ "actions_unpublish": "Unpublish",
+ "actions_refreshNode": "Reload nodes",
+ "actions_republish": "Republish entire site",
+ "actions_rights": "Permissions",
+ "actions_rollback": "Rollback",
+ "actions_sendtopublish": "Send To Publish",
+ "actions_sendToTranslate": "Send To Translation",
+ "actions_sort": "Sort",
+ "actions_toPublish": "Send to publication",
+ "actions_translate": "Translate",
+ "actions_update": "Update",
+ "actions_exportContourForm": "Export form",
+ "actions_importContourForm": "Import form",
+ "actions_archiveContourForm": "Archive form",
+ "actions_unarchiveContourForm": "Unarchive form",
+ "actions_defaultValue": "Default value",
+ "assignDomain_permissionDenied": "Permission denied.",
+ "assignDomain_addNew": "Add new Domain",
+ "assignDomain_remove": "remove",
+ "assignDomain_invalidNode": "Invalid node.",
+ "assignDomain_invalidDomain": "Invalid domain format.",
+ "assignDomain_duplicateDomain": "Domain has already been assigned.",
+ "assignDomain_domain": "Domain",
+ "assignDomain_language": "Language",
+ "assignDomain_domainCreated": "New domain '%0%' has been created",
+ "assignDomain_domainDeleted": "Domain '%0%' is deleted",
+ "assignDomain_domainExists": "Domain '%0%' has already been assigned",
+ "assignDomain_domainHelp": "Valid domain names are: 'example.com', 'www.example.com', 'example.com:8080' or 'https://www.example.com/'.
One-level paths in domains are supported, eg. 'example.com/en'. However, they should be avoided. Better use the culture setting above.",
+ "assignDomain_domainUpdated": "Domain '%0%' has been updated",
+ "assignDomain_orEdit": "Edit Current Domains",
+ "assignDomain_inherit": "Inherit",
+ "assignDomain_setLanguage": "Culture",
+ "assignDomain_setLanguageHelp": "Set the culture for nodes below the current node,
or inherit culture from parent nodes. Will also apply
to the current node, unless a domain below applies too.",
+ "assignDomain_setDomains": "Domains",
+ "auditTrails_atViewingFor": "Viewing for",
+ "buttons_select": "Select",
+ "buttons_somethingElse": "Do something else",
+ "buttons_bold": "Bold",
+ "buttons_deindent": "Cancel Paragraph Indent",
+ "buttons_formFieldInsert": "Insert form field",
+ "buttons_graphicHeadline": "Insert graphic headline",
+ "buttons_htmlEdit": "Edit Html",
+ "buttons_indent": "Indent Paragraph",
+ "buttons_italic": "Italic",
+ "buttons_justifyCenter": "Center",
+ "buttons_justifyLeft": "Justify Left",
+ "buttons_justifyRight": "Justify Right",
+ "buttons_linkInsert": "Insert Link",
+ "buttons_linkLocal": "Insert local link (anchor)",
+ "buttons_listBullet": "Bullet List",
+ "buttons_listNumeric": "Numeric List",
+ "buttons_macroInsert": "Insert macro",
+ "buttons_pictureInsert": "Insert picture",
+ "buttons_relations": "Edit relations",
+ "buttons_save": "Save",
+ "buttons_saveAndPublish": "Save and publish",
+ "buttons_saveToPublish": "Save and send for approval",
+ "buttons_showPage": "Preview",
+ "buttons_showPageDisabled": "Preview is disabled because there's no template assigned",
+ "buttons_styleChoose": "Choose style",
+ "buttons_styleShow": "Show styles",
+ "buttons_tableInsert": "Insert table",
+ "changeDocType_changeDocTypeInstruction": "To change the document type for the selected content, first select from the list of valid types for this location.",
+ "changeDocType_changeDocTypeInstruction2": "Then confirm and/or amend the mapping of properties from the current type to the new, and click Save.",
+ "changeDocType_contentRepublished": "The content has been re-published.",
+ "changeDocType_currentProperty": "Current Property",
+ "changeDocType_currentType": "Current type",
+ "changeDocType_docTypeCannotBeChanged": "The document type cannot be changed, as there are no alternatives valid for this location.",
+ "changeDocType_docTypeChanged": "Document Type Changed",
+ "changeDocType_mapProperties": "Map Properties",
+ "changeDocType_mapToProperty": "Map to Property",
+ "changeDocType_newTemplate": "New Template",
+ "changeDocType_newType": "New Type",
+ "changeDocType_none": "none",
+ "changeDocType_selectedContent": "Content",
+ "changeDocType_selectNewDocType": "Select New Document Type",
+ "changeDocType_successMessage": "The document type of the selected content has been successfully changed to [new type] and the following properties mapped:",
+ "changeDocType_to": "to",
+ "changeDocType_validationErrorPropertyWithMoreThanOneMapping": "Could not complete property mapping as one or more properties have more than one mapping defined.",
+ "changeDocType_validDocTypesNote": "Only alternate types valid for the current location are displayed.",
+ "content_about": "About this page",
+ "content_alias": "Alias",
+ "content_alternativeTextHelp": "(how would you describe the picture over the phone)",
+ "content_alternativeUrls": "Alternative Links",
+ "content_clickToEdit": "Click to edit this item",
+ "content_createBy": "Created by",
+ "content_createByDesc": "Original autho",
+ "content_updatedBy": "Updated by",
+ "content_createDate": "Created",
+ "content_createDateDesc": "Date/time this document was created",
+ "content_documentType": "Document Type",
+ "content_editing": "Editing",
+ "content_expireDate": "Remove at",
+ "content_itemChanged": "This item has been changed after publication",
+ "content_itemNotPublished": "This item is not published",
+ "content_lastPublished": "Last published",
+ "content_listViewNoItems": "There are no items show in the list.",
+ "content_mediatype": "Media Type",
+ "content_mediaLinks": "Link to media item(s)",
+ "content_membergroup": "Member Group",
+ "content_memberrole": "Role",
+ "content_membertype": "Member Type",
+ "content_noDate": "No date chosen",
+ "content_nodeName": "Page Title",
+ "content_otherElements": "Properties",
+ "content_parentNotPublished": "This document is published but is not visible because the parent '%0%' is unpublished",
+ "content_parentNotPublishedAnomaly": "This document is published but is not in the cache",
+ "content_publish": "Publish",
+ "content_publishStatus": "Publication Status",
+ "content_releaseDate": "Publish at",
+ "content_removeDate": "Clear Date",
+ "content_sortDone": "Sortorder is updated",
+ "content_sortHelp": "To sort the nodes, simply drag the nodes or click one of the column headers. You can select multiple nodes by holding the 'shift' or 'control' key while selecting",
+ "content_statistics": "Statistics",
+ "content_titleOptional": "Title (optional)",
+ "content_type": "Type",
+ "content_unPublish": "Unpublish",
+ "content_updateDate": "Last edited",
+ "content_updateDateDesc": "Date/time this document was created",
+ "content_uploadClear": "Remove file",
+ "content_urls": "Link to document",
+ "content_memberof": "Member of group(s)",
+ "content_notmemberof": "Not a member of group(s)",
+ "content_childItems": "Child items",
+ "create_chooseNode": "Where do you want to create the new %0%",
+ "create_createUnder": "Create a page under",
+ "create_updateData": "Choose a type and a title",
+ "create_noDocumentTypes": "There are no allowed document types available. You must enable these in the settings section under
'document types' .",
+ "create_noMediaTypes": "There are no allowed media types available. You must enable these in the settings section under
'media types' .",
+ "dashboard_browser": "Browse your website",
+ "dashboard_dontShowAgain": "- Hide",
+ "dashboard_nothinghappens": "If Umbraco isn't opening, you might need to allow popups from this site",
+ "dashboard_openinnew": "has opened in a new window",
+ "dashboard_restart": "Restart",
+ "dashboard_visit": "Visit",
+ "dashboard_welcome": "Welcome",
+ "defaultdialogs_anchorInsert": "Name",
+ "defaultdialogs_assignDomain": "Manage hostnames",
+ "defaultdialogs_closeThisWindow": "Close this window",
+ "defaultdialogs_confirmdelete": "Are you sure you want to delete",
+ "defaultdialogs_confirmdisable": "Are you sure you want to disable",
+ "defaultdialogs_confirmEmptyTrashcan": "Please check this box to confirm deletion of %0% item(s)",
+ "defaultdialogs_confirmlogout": "Are you sure?",
+ "defaultdialogs_confirmSure": "Are you sure?",
+ "defaultdialogs_cut": "Cut",
+ "defaultdialogs_editdictionary": "Edit Dictionary Item",
+ "defaultdialogs_editlanguage": "Edit Language",
+ "defaultdialogs_insertAnchor": "Insert local link",
+ "defaultdialogs_insertCharacter": "Insert character",
+ "defaultdialogs_insertgraphicheadline": "Insert graphic headline",
+ "defaultdialogs_insertimage": "Insert picture",
+ "defaultdialogs_insertlink": "Insert link",
+ "defaultdialogs_insertMacro": "Click to add a Macro",
+ "defaultdialogs_inserttable": "Insert table",
+ "defaultdialogs_lastEdited": "Last Edited",
+ "defaultdialogs_link": "Link",
+ "defaultdialogs_linkinternal": "Internal link:",
+ "defaultdialogs_linklocaltip": "When using local links, insert '#' infront of link",
+ "defaultdialogs_linknewwindow": "Open in new window?",
+ "defaultdialogs_macroContainerSettings": "Macro Settings",
+ "defaultdialogs_macroDoesNotHaveProperties": "This macro does not contain any properties you can edit",
+ "defaultdialogs_paste": "Paste",
+ "defaultdialogs_permissionsEdit": "Edit Permissions for",
+ "defaultdialogs_recycleBinDeleting": "The items in the recycle bin are now being deleted. Please do not close this window while this operation takes place",
+ "defaultdialogs_recycleBinIsEmpty": "The recycle bin is now empty",
+ "defaultdialogs_recycleBinWarning": "When items are deleted from the recycle bin, they will be gone forever",
+ "defaultdialogs_regexSearchError": "
regexlib.com 's webservice is currently experiencing some problems, which we have no control over. We are very sorry for this inconvenience.",
+ "defaultdialogs_regexSearchHelp": "Search for a regular expression to add validation to a form field. Exemple: 'email, 'zip-code' 'url'",
+ "defaultdialogs_removeMacro": "Remove Macro",
+ "defaultdialogs_requiredField": "Required Field",
+ "defaultdialogs_sitereindexed": "Site is reindexed",
+ "defaultdialogs_siterepublished": "The website cache has been refreshed. All publish content is now uptodate. While all unpublished content is still unpublished",
+ "defaultdialogs_siterepublishHelp": "The website cache will be refreshed. All published content will be updated, while unpublished content will stay unpublished.",
+ "defaultdialogs_tableColumns": "Number of columns",
+ "defaultdialogs_tableRows": "Number of rows",
+ "defaultdialogs_templateContentAreaHelp": "
Set a placeholder id by setting an ID on your placeholder you can inject content into this template from child templates, by refering this ID using a
<asp:content /> element.",
+ "defaultdialogs_templateContentPlaceHolderHelp": "
Select a placeholder id from the list below. You can only choose Id's from the current template's master.",
+ "defaultdialogs_thumbnailimageclickfororiginal": "Click on the image to see full size",
+ "defaultdialogs_treepicker": "Pick item",
+ "defaultdialogs_viewCacheItem": "View Cache Item",
+ "dictionaryItem_description": "Edit the different language versions for the dictionary item '
%0% ' below
You can add additional languages under the 'languages' in the menu on the left ",
+ "dictionaryItem_displayName": "Culture Name",
+ "placeholders_username": "Enter your username",
+ "placeholders_password": "Enter your password",
+ "placeholders_entername": "Enter a name...",
+ "placeholders_nameentity": "Name the %0%...",
+ "placeholders_search": "Type to search...",
+ "placeholders_filter": "Type to filter...",
+ "editcontenttype_allowedchildnodetypes": "Allowed child nodetypes",
+ "editcontenttype_create": "Create",
+ "editcontenttype_deletetab": "Delete tab",
+ "editcontenttype_description": "Description",
+ "editcontenttype_newtab": "New tab",
+ "editcontenttype_tab": "Tab",
+ "editcontenttype_thumbnail": "Thumbnail",
+ "editcontenttype_iscontainercontenttype": "Use as container content type",
+ "editdatatype_addPrevalue": "Add prevalue",
+ "editdatatype_dataBaseDatatype": "Database datatype",
+ "editdatatype_guid": "Property editor GUID",
+ "editdatatype_renderControl": "Property editor",
+ "editdatatype_rteButtons": "Buttons",
+ "editdatatype_rteEnableAdvancedSettings": "Enable advanced settings for",
+ "editdatatype_rteEnableContextMenu": "Enable context menu",
+ "editdatatype_rteMaximumDefaultImgSize": "Maximum default size of inserted images",
+ "editdatatype_rteRelatedStylesheets": "Related stylesheets",
+ "editdatatype_rteShowLabel": "Show label",
+ "editdatatype_rteWidthAndHeight": "Width and height",
+ "errorHandling_errorButDataWasSaved": "Your data has been saved, but before you can publish this page there are some errors you need to fix first:",
+ "errorHandling_errorChangingProviderPassword": "The current MemberShip Provider does not support changing password (EnablePasswordRetrieval need to be true)",
+ "errorHandling_errorExistsWithoutTab": "%0% already exists",
+ "errorHandling_errorHeader": "There were errors:",
+ "errorHandling_errorHeaderWithoutTab": "There were errors:",
+ "errorHandling_errorInPasswordFormat": "The password should be a minimum of %0% characters long and contain at least %1% non-alpha numeric character(s)",
+ "errorHandling_errorIntegerWithoutTab": "%0% must be an integer",
+ "errorHandling_errorMandatory": "The %0% field in the %1% tab is mandatory",
+ "errorHandling_errorMandatoryWithoutTab": "%0% is a mandatory field",
+ "errorHandling_errorRegExp": "%0% at %1% is not in a correct format",
+ "errorHandling_errorRegExpWithoutTab": "%0% is not in a correct format",
+ "errors_dissallowedMediaType": "The specified file type has been dissallowed by the administrator",
+ "errors_codemirroriewarning": "NOTE! Even though CodeMirror is enabled by configuration, it is disabled in Internet Explorer because it's not stable enough.",
+ "errors_contentTypeAliasAndNameNotNull": "Please fill both alias and name on the new propertytype!",
+ "errors_filePermissionsError": "There is a problem with read/write access to a specific file or folder",
+ "errors_missingTitle": "Please enter a title",
+ "errors_missingType": "Please choose a type",
+ "errors_pictureResizeBiggerThanOrg": "You're about to make the picture larger than the original size. Are you sure that you want to proceed?",
+ "errors_pythonErrorHeader": "Error in python script",
+ "errors_pythonErrorText": "The python script has not been saved, because it contained error(s)",
+ "errors_startNodeDoesNotExists": "Startnode deleted, please contact your administrator",
+ "errors_stylesMustMarkBeforeSelect": "Please mark content before changing style",
+ "errors_stylesNoStylesOnPage": "No active styles available",
+ "errors_tableColMergeLeft": "Please place cursor at the left of the two cells you wish to merge",
+ "errors_tableSplitNotSplittable": "You cannot split a cell that hasn't been merged.",
+ "errors_xsltErrorHeader": "Error in XSLT source",
+ "errors_xsltErrorText": "The XSLT has not been saved, because it contained error(s)",
+ "general_about": "About",
+ "general_action": "Action",
+ "general_add": "Add",
+ "general_alias": "Alias",
+ "general_areyousure": "Are you sure?",
+ "general_border": "Border",
+ "general_by": "or",
+ "general_cancel": "Cancel",
+ "general_cellMargin": "Cell margin",
+ "general_choose": "Choose",
+ "general_close": "Close",
+ "general_closewindow": "Close Window",
+ "general_comment": "Comment",
+ "general_confirm": "Confirm",
+ "general_constrainProportions": "Constrain proportions",
+ "general_continue": "Continue",
+ "general_copy": "Copy",
+ "general_create": "Create",
+ "general_database": "Database",
+ "general_date": "Date",
+ "general_default": "Default",
+ "general_delete": "Delete",
+ "general_deleted": "Deleted",
+ "general_deleting": "Deleting...",
+ "general_design": "Design",
+ "general_dimensions": "Dimensions",
+ "general_down": "Down",
+ "general_download": "Download",
+ "general_edit": "Edit",
+ "general_edited": "Edited",
+ "general_elements": "Elements",
+ "general_email": "Email",
+ "general_error": "Error",
+ "general_findDocument": "Find",
+ "general_height": "Height",
+ "general_help": "Help",
+ "general_icon": "Icon",
+ "general_import": "Import",
+ "general_innerMargin": "Inner margin",
+ "general_insert": "Insert",
+ "general_install": "Install",
+ "general_justify": "Justify",
+ "general_language": "Language",
+ "general_layout": "Layout",
+ "general_loading": "Loading",
+ "general_locked": "Locked",
+ "general_login": "Login",
+ "general_logoff": "Log off",
+ "general_logout": "Logout",
+ "general_macro": "Macro",
+ "general_move": "Move",
+ "general_name": "Name",
+ "general_new": "New",
+ "general_next": "Next",
+ "general_no": "No",
+ "general_of": "of",
+ "general_ok": "OK",
+ "general_open": "Open",
+ "general_or": "or",
+ "general_password": "Password",
+ "general_path": "Path",
+ "general_placeHolderID": "Placeholder ID",
+ "general_pleasewait": "One moment please...",
+ "general_previous": "Previous",
+ "general_properties": "Properties",
+ "general_reciept": "Email to receive form data",
+ "general_recycleBin": "Recycle Bin",
+ "general_remaining": "Remaining",
+ "general_rename": "Rename",
+ "general_renew": "Renew",
+ "general_required": "Required",
+ "general_retry": "Retry",
+ "general_rights": "Permissions",
+ "general_search": "Search",
+ "general_server": "Server",
+ "general_show": "Show",
+ "general_showPageOnSend": "Show page on Send",
+ "general_size": "Size",
+ "general_sort": "Sort",
+ "general_type": "Type",
+ "general_typeToSearch": "Type to search...",
+ "general_up": "Up",
+ "general_update": "Update",
+ "general_upgrade": "Upgrade",
+ "general_upload": "Upload",
+ "general_url": "Url",
+ "general_user": "User",
+ "general_username": "Username",
+ "general_value": "Value",
+ "general_view": "View",
+ "general_welcome": "Welcome...",
+ "general_width": "Width",
+ "general_yes": "Yes",
+ "general_folder": "Folder",
+ "general_searchResults": "Search results",
+ "graphicheadline_backgroundcolor": "Background color",
+ "graphicheadline_bold": "Bold",
+ "graphicheadline_color": "Text color",
+ "graphicheadline_font": "Font",
+ "graphicheadline_text": "Text",
+ "headers_page": "Page",
+ "installer_databaseErrorCannotConnect": "The installer cannot connect to the database.",
+ "installer_databaseErrorWebConfig": "Could not save the web.config file. Please modify the connection string manually.",
+ "installer_databaseFound": "Your database has been found and is identified as",
+ "installer_databaseHeader": "Database configuration",
+ "installer_databaseInstall": " Press the
install button to install the Umbraco %0% database ",
+ "installer_databaseInstallDone": "Umbraco %0% has now been copied to your database. Press
Next to proceed.",
+ "installer_databaseNotFound": "
Database not found! Please check that the information in the 'connection string' of the \"web.config\" file is correct.
To proceed, please edit the 'web.config' file (using Visual Studio or your favourite text editor), scroll to the bottom, add the connection string for your database in the key named 'UmbracoDbDSN' and save the file.
Click the retry button when done. More information on editing web.config here.
",
+ "installer_databaseText": "To complete this step, you must know some information regarding your database server ('connection string').
Please contact your ISP if necessary. If you're installing on a local machine or server you might need information from your system administrator.",
+ "installer_databaseUpgrade": "
Press the upgrade button to upgrade your database to Umbraco %0%
Don't worry - no content will be deleted and everything will continue working afterwards!
",
+ "installer_databaseUpgradeDone": "Your database has been upgraded to the final version %0%.
Press
Next to proceed. ",
+ "installer_databaseUpToDate": "Your current database is up-to-date!. Click
next to continue the configuration wizard",
+ "installer_defaultUserChangePass": "
The Default users' password needs to be changed! ",
+ "installer_defaultUserDisabled": "
The Default user has been disabled or has no access to Umbraco! No further actions needs to be taken. Click Next to proceed.",
+ "installer_defaultUserPassChanged": "The Default user's password has been successfully changed since the installation!
No further actions needs to be taken. Click Next to proceed.",
+ "installer_defaultUserPasswordChanged": "The password is changed!",
+ "installer_defaultUserText": "
Umbraco creates a default user with a login ('admin') and password ('default') . It's important that the password is changed to something unique.
This step will check the default user's password and suggest if it needs to be changed.
",
+ "installer_greatStart": "Get a great start, watch our introduction videos",
+ "installer_licenseText": "By clicking the next button (or modifying the UmbracoConfigurationStatus in web.config), you accept the license for this software as specified in the box below. Notice that this Umbraco distribution consists of two different licenses, the open source MIT license for the framework and the Umbraco freeware license that covers the UI.",
+ "installer_None": "Not installed yet.",
+ "installer_permissionsAffectedFolders": "Affected files and folders",
+ "installer_permissionsAffectedFoldersMoreInfo": "More information on setting up permissions for Umbraco here",
+ "installer_permissionsAffectedFoldersText": "You need to grant ASP.NET modify permissions to the following files/folders",
+ "installer_permissionsAlmostPerfect": "
Your permission settings are almost perfect! You can run Umbraco without problems, but you will not be able to install packages which are recommended to take full advantage of Umbraco.",
+ "installer_permissionsHowtoResolve": "How to Resolve",
+ "installer_permissionsHowtoResolveLink": "Click here to read the text version",
+ "installer_permissionsHowtoResolveText": "Watch our
video tutorial on setting up folder permissions for Umbraco or read the text version.",
+ "installer_permissionsMaybeAnIssue": "
Your permission settings might be an issue! You can run Umbraco without problems, but you will not be able to create folders or install packages which are recommended to take full advantage of Umbraco.",
+ "installer_permissionsNotReady": "
Your permission settings are not ready for Umbraco! In order to run Umbraco, you'll need to update your permission settings.",
+ "installer_permissionsPerfect": "
Your permission settings are perfect! You are ready to run Umbraco and install packages!",
+ "installer_permissionsResolveFolderIssues": "Resolving folder issue",
+ "installer_permissionsResolveFolderIssuesLink": "Follow this link for more information on problems with ASP.NET and creating folders",
+ "installer_permissionsSettingUpPermissions": "Setting up folder permissions",
+ "installer_permissionsText": " Umbraco needs write/modify access to certain directories in order to store files like pictures and PDF's. It also stores temporary data (aka: cache) for enhancing the performance of your website. ",
+ "installer_runwayFromScratch": "I want to start from scratch",
+ "installer_runwayFromScratchText": " Your website is completely empty at the moment, so that's perfect if you want to start from scratch and create your own document types and templates. (
learn how ) You can still choose to install Runway later on. Please go to the Developer section and choose Packages. ",
+ "installer_runwayHeader": "You've just set up a clean Umbraco platform. What do you want to do next?",
+ "installer_runwayInstalled": "Runway is installed",
+ "installer_runwayInstalledText": " You have the foundation in place. Select what modules you wish to install on top of it.
This is our list of recommended modules, check off the ones you would like to install, or view the
full list of modules ",
+ "installer_runwayOnlyProUsers": "Only recommended for experienced users",
+ "installer_runwaySimpleSite": "I want to start with a simple website",
+ "installer_runwaySimpleSiteText": "
'Runway' is a simple website providing some basic document types and templates. The installer can set up Runway for you automatically, but you can easily edit, extend or remove it. It's not necessary and you can perfectly use Umbraco without it. However, Runway offers an easy foundation based on best practices to get you started faster than ever. If you choose to install Runway, you can optionally select basic building blocks called Runway Modules to enhance your Runway pages.
Included with Runway: Home page, Getting Started page, Installing Modules page. Optional Modules: Top Navigation, Sitemap, Contact, Gallery. ",
+ "installer_runwayWhatIsRunway": "What is Runway",
+ "installer_step1": "Step 1/5 Accept license",
+ "installer_step2": "Step 2/5: Database configuration",
+ "installer_step3": "Step 3/5: Validating File Permissions",
+ "installer_step4": "Step 4/5: Check Umbraco security",
+ "installer_step5": "Step 5/5: Umbraco is ready to get you started",
+ "installer_thankYou": "Thank you for choosing Umbraco",
+ "installer_theEndBrowseSite": "
Browse your new site You installed Runway, so why not see how your new website looks.",
+ "installer_theEndFurtherHelp": "
Further help and information Get help from our award winning community, browse the documentation or watch some free videos on how to build a simple site, how to use packages and a quick guide to the Umbraco terminology",
+ "installer_theEndHeader": "Umbraco %0% is installed and ready for use",
+ "installer_theEndInstallFailed": "To finish the installation, you'll need to manually edit the
/web.config file and update the AppSetting key
UmbracoConfigurationStatus in the bottom to the value of
'%0%' .",
+ "installer_theEndInstallSuccess": "You can get
started instantly by clicking the 'Launch Umbraco' button below.
If you are
new to Umbraco , you can find plenty of resources on our getting started pages.",
+ "installer_theEndOpenUmbraco": "
Launch Umbraco To manage your website, simply open the Umbraco back office and start adding content, updating the templates and stylesheets or add new functionality",
+ "installer_Unavailable": "Connection to database failed.",
+ "installer_Version3": "Umbraco Version 3",
+ "installer_Version4": "Umbraco Version 4",
+ "installer_watch": "Watch",
+ "installer_welcomeIntro": "This wizard will guide you through the process of configuring
Umbraco %0% for a fresh install or upgrading from version 3.0.
Press
'next' to start the wizard.",
+ "language_cultureCode": "Culture Code",
+ "language_displayName": "Culture Name",
+ "lockout_lockoutWillOccur": "You've been idle and logout will automatically occur in",
+ "lockout_renewSession": "Renew now to save your work",
+ "login_greeting1": "Happy super Sunday",
+ "login_greeting2": "Happy manic Monday ",
+ "login_greeting3": "Happy tremendous Tuesday",
+ "login_greeting4": "Happy wonderful Wednesday",
+ "login_greeting5": "Happy thunderous Thursday",
+ "login_greeting6": "Happy friendly Friday",
+ "login_greeting7": "Happy shiny Saturday",
+ "login_instruction": "Log in below:",
+ "login_bottomText": "
© 2001 - %0% Umbraco.org
",
+ "main_dashboard": "Dashboard",
+ "main_sections": "Sections",
+ "main_tree": "Content",
+ "moveOrCopy_choose": "Choose page above...",
+ "moveOrCopy_copyDone": "%0% has been copied to %1%",
+ "moveOrCopy_copyTo": "Select where the document %0% should be copied to below",
+ "moveOrCopy_moveDone": "%0% has been moved to %1%",
+ "moveOrCopy_moveTo": "Select where the document %0% should be moved to below",
+ "moveOrCopy_nodeSelected": "has been selected as the root of your new content, click 'ok' below.",
+ "moveOrCopy_noNodeSelected": "No node selected yet, please select a node in the list above before clicking 'ok'",
+ "moveOrCopy_notAllowedByContentType": "The current node is not allowed under the chosen node because of its type",
+ "moveOrCopy_notAllowedByPath": "The current node cannot be moved to one of its subpages",
+ "moveOrCopy_notAllowedAtRoot": "The current node cannot exist at the root",
+ "moveOrCopy_notValid": "The action isn't allowed since you have insufficient permissions on 1 or more child documents.",
+ "moveOrCopy_relateToOriginal": "Relate copied items to original",
+ "notifications_editNotifications": "Edit your notification for %0%",
+ "notifications_mailBody": " Hi %0% This is an automated mail to inform you that the task '%1%' has been performed on the page '%2%' by the user '%3%' Go to http://%4%/actions/editContent.aspx?id=%5% to edit. Have a nice day! Cheers from the Umbraco robot ",
+ "notifications_mailBodyHtml": "
Hi %0%
This is an automated mail to inform you that the task '%1%' has been performed on the page '%2%' by the user '%3%'
Update summary: Have a nice day! Cheers from the Umbraco robot
",
+ "notifications_mailSubject": "[%0%] Notification about %1% performed on %2%",
+ "notifications_notifications": "Notifications",
+ "packager_chooseLocalPackageText": " Choose Package from your machine, by clicking the Browse
button and locating the package. Umbraco packages usually have a '.umb' or '.zip' extension. ",
+ "packager_packageAuthor": "Author",
+ "packager_packageDemonstration": "Demonstration",
+ "packager_packageDocumentation": "Documentation",
+ "packager_packageMetaData": "Package meta data",
+ "packager_packageName": "Package name",
+ "packager_packageNoItemsHeader": "Package doesn't contain any items",
+ "packager_packageNoItemsText": "This package file doesn't contain any items to uninstall.
You can safely remove this from the system by clicking 'uninstall package' below.",
+ "packager_packageNoUpgrades": "No upgrades available",
+ "packager_packageOptions": "Package options",
+ "packager_packageReadme": "Package readme",
+ "packager_packageRepository": "Package repository",
+ "packager_packageUninstallConfirm": "Confirm uninstall",
+ "packager_packageUninstalledHeader": "Package was uninstalled",
+ "packager_packageUninstalledText": "The package was successfully uninstalled",
+ "packager_packageUninstallHeader": "Uninstall package",
+ "packager_packageUninstallText": "You can unselect items you do not wish to remove, at this time, below. When you click 'confirm uninstall' all checked-off items will be removed.
Notice: any documents, media etc depending on the items you remove, will stop working, and could lead to system instability, so uninstall with caution. If in doubt, contact the package author.",
+ "packager_packageUpgradeDownload": "Download update from the repository",
+ "packager_packageUpgradeHeader": "Upgrade package",
+ "packager_packageUpgradeInstructions": "Upgrade instructions",
+ "packager_packageUpgradeText": " There's an upgrade available for this package. You can download it directly from the Umbraco package repository.",
+ "packager_packageVersion": "Package version",
+ "packager_packageVersionHistory": "Package version history",
+ "packager_viewPackageWebsite": "View package website",
+ "paste_doNothing": "Paste with full formatting (Not recommended)",
+ "paste_errorMessage": "The text you're trying to paste contains special characters or formatting. This could be caused by copying text from Microsoft Word. Umbraco can remove special characters or formatting automatically, so the pasted content will be more suitable for the web.",
+ "paste_removeAll": "Paste as raw text without any formatting at all",
+ "paste_removeSpecialFormattering": "Paste, but remove formatting (Recommended)",
+ "publicAccess_paAdvanced": "Role based protection",
+ "publicAccess_paAdvancedHelp": "If you wish to control access to the page using role-based authentication,
using Umbraco's member groups.",
+ "publicAccess_paAdvancedNoGroups": "You need to create a membergroup before you can use
role-based authentication.",
+ "publicAccess_paErrorPage": "Error Page",
+ "publicAccess_paErrorPageHelp": "Used when people are logged on, but do not have access",
+ "publicAccess_paHowWould": "Choose how to restict access to this page",
+ "publicAccess_paIsProtected": "%0% is now protected",
+ "publicAccess_paIsRemoved": "Protection removed from %0%",
+ "publicAccess_paLoginPage": "Login Page",
+ "publicAccess_paLoginPageHelp": "Choose the page that has the login formular",
+ "publicAccess_paRemoveProtection": "Remove Protection",
+ "publicAccess_paSelectPages": "Select the pages that contain login form and error messages",
+ "publicAccess_paSelectRoles": "Pick the roles who have access to this page",
+ "publicAccess_paSetLogin": "Set the login and password for this page",
+ "publicAccess_paSimple": "Single user protection",
+ "publicAccess_paSimpleHelp": "If you just want to setup simple protection using a single login and password",
+ "publish_contentPublishedFailedInvalid": " %0% could not be published because these properties: %1% did not pass validation rules. ",
+ "publish_contentPublishedFailedByEvent": " %0% could not be published, due to a 3rd party extension cancelling the action. ",
+ "publish_contentPublishedFailedByParent": " %0% can not be published, because a parent page is not published. ",
+ "publish_includeUnpublished": "Include unpublished child pages",
+ "publish_inProgress": "Publishing in progress - please wait...",
+ "publish_inProgressCounter": "%0% out of %1% pages have been published...",
+ "publish_nodePublish": "%0% has been published",
+ "publish_nodePublishAll": "%0% and subpages have been published",
+ "publish_publishAll": "Publish %0% and all its subpages",
+ "publish_publishHelp": "Click
ok to publish
%0% and thereby making it's content publicly available.
You can publish this page and all it's sub-pages by checking
publish all children below. ",
+ "relatedlinks_addExternal": "Add external link",
+ "relatedlinks_addInternal": "Add internal link",
+ "relatedlinks_addlink": "Add",
+ "relatedlinks_caption": "Caption",
+ "relatedlinks_internalPage": "Internal page",
+ "relatedlinks_linkurl": "URL",
+ "relatedlinks_modeDown": "Move Down",
+ "relatedlinks_modeUp": "Move Up",
+ "relatedlinks_newWindow": "Open in new window",
+ "relatedlinks_removeLink": "Remove link",
+ "rollback_currentVersion": "Current version",
+ "rollback_diffHelp": "This shows the differences between the current version and the selected version
Red text will not be shown in the selected version. ,
green means added ",
+ "rollback_documentRolledBack": "Document has been rolled back",
+ "rollback_htmlHelp": "This displays the selected version as html, if you wish to see the difference between 2 versions at the same time, use the diff view",
+ "rollback_rollbackTo": "Rollback to",
+ "rollback_selectVersion": "Select version",
+ "rollback_view": "View",
+ "scripts_editscript": "Edit script file",
+ "sections_concierge": "Concierge",
+ "sections_content": "Content",
+ "sections_courier": "Courier",
+ "sections_developer": "Developer",
+ "sections_installer": "Umbraco Configuration Wizard",
+ "sections_media": "Media",
+ "sections_member": "Members",
+ "sections_newsletters": "Newsletters",
+ "sections_settings": "Settings",
+ "sections_statistics": "Statistics",
+ "sections_translation": "Translation",
+ "sections_users": "Users",
+ "sections_contour": "Umbraco Contour",
+ "sections_help": "Help",
+ "settings_defaulttemplate": "Default template",
+ "settings_dictionary editor egenskab": "Dictionary Key",
+ "settings_importDocumentTypeHelp": "To import a document type, find the '.udt' file on your computer by clicking the 'Browse' button and click 'Import' (you'll be asked for confirmation on the next screen)",
+ "settings_newtabname": "New Tab Title",
+ "settings_nodetype": "Nodetype",
+ "settings_objecttype": "Type",
+ "settings_stylesheet": "Stylesheet",
+ "settings_stylesheet editor egenskab": "Stylesheet property",
+ "settings_tab": "Tab",
+ "settings_tabname": "Tab Title",
+ "settings_tabs": "Tabs",
+ "settings_contentTypeEnabled": "Master Content Type enabled",
+ "settings_contentTypeUses": "This Content Type uses",
+ "settings_asAContentMasterType": "as a Master Content Type. Tabs from Master Content Types are not shown and can only be edited on the Master Content Type itself",
+ "settings_noPropertiesDefinedOnTab": "No properties defined on this tab. Click on the 'add a new property' link at the top to create a new property.",
+ "sort_sortDone": "Sorting complete.",
+ "sort_sortHelp": "Drag the different items up or down below to set how they should be arranged. Or click the column headers to sort the entire collection of items",
+ "sort_sortPleaseWait": " Please wait. Items are being sorted, this can take a while.
Do not close this window during sorting",
+ "speechBubbles_contentPublishedFailedByEvent": "Publishing was cancelled by a 3rd party add-in",
+ "speechBubbles_contentTypeDublicatePropertyType": "Property type already exists",
+ "speechBubbles_contentTypePropertyTypeCreated": "Property type created",
+ "speechBubbles_contentTypePropertyTypeCreatedText": "Name: %0%
DataType: %1%",
+ "speechBubbles_contentTypePropertyTypeDeleted": "Propertytype deleted",
+ "speechBubbles_contentTypeSavedHeader": "Document Type saved",
+ "speechBubbles_contentTypeTabCreated": "Tab created",
+ "speechBubbles_contentTypeTabDeleted": "Tab deleted",
+ "speechBubbles_contentTypeTabDeletedText": "Tab with id: %0% deleted",
+ "speechBubbles_cssErrorHeader": "Stylesheet not saved",
+ "speechBubbles_cssSavedHeader": "Stylesheet saved",
+ "speechBubbles_cssSavedText": "Stylesheet saved without any errors",
+ "speechBubbles_dataTypeSaved": "Datatype saved",
+ "speechBubbles_dictionaryItemSaved": "Dictionary item saved",
+ "speechBubbles_editContentPublishedFailedByParent": "Publishing failed because the parent page isn't published",
+ "speechBubbles_editContentPublishedHeader": "Content published",
+ "speechBubbles_editContentPublishedText": "and visible at the website",
+ "speechBubbles_editContentSavedHeader": "Content saved",
+ "speechBubbles_editContentSavedText": "Remember to publish to make changes visible",
+ "speechBubbles_editContentSendToPublish": "Sent For Approval",
+ "speechBubbles_editContentSendToPublishText": "Changes have been sent for approval",
+ "speechBubbles_editMediaSaved": "Media saved",
+ "speechBubbles_editMediaSavedText": "Media saved without any errors",
+ "speechBubbles_editMemberSaved": "Member saved",
+ "speechBubbles_editStylesheetPropertySaved": "Stylesheet Property Saved",
+ "speechBubbles_editStylesheetSaved": "Stylesheet saved",
+ "speechBubbles_editTemplateSaved": "Template saved",
+ "speechBubbles_editUserError": "Error saving user (check log)",
+ "speechBubbles_editUserSaved": "User Saved",
+ "speechBubbles_editUserTypeSaved": "User type saved",
+ "speechBubbles_fileErrorHeader": "File not saved",
+ "speechBubbles_fileErrorText": "file could not be saved. Please check file permissions",
+ "speechBubbles_fileSavedHeader": "File saved",
+ "speechBubbles_fileSavedText": "File saved without any errors",
+ "speechBubbles_languageSaved": "Language saved",
+ "speechBubbles_pythonErrorHeader": "Python script not saved",
+ "speechBubbles_pythonErrorText": "Python script could not be saved due to error",
+ "speechBubbles_pythonSavedHeader": "Python script saved",
+ "speechBubbles_pythonSavedText": "No errors in python script",
+ "speechBubbles_templateErrorHeader": "Template not saved",
+ "speechBubbles_templateErrorText": "Please make sure that you do not have 2 templates with the same alias",
+ "speechBubbles_templateSavedHeader": "Template saved",
+ "speechBubbles_templateSavedText": "Template saved without any errors!",
+ "speechBubbles_xsltErrorHeader": "XSLT not saved",
+ "speechBubbles_xsltErrorText": "XSLT contained an error",
+ "speechBubbles_xsltPermissionErrorText": "XSLT could not be saved, check file permissions",
+ "speechBubbles_xsltSavedHeader": "XSLT saved",
+ "speechBubbles_xsltSavedText": "No errors in XSLT",
+ "speechBubbles_contentUnpublished": "Content unpublished",
+ "speechBubbles_partialViewSavedHeader": "Partial view saved",
+ "speechBubbles_partialViewSavedText": "Partial view saved without any errors!",
+ "speechBubbles_partialViewErrorHeader": "Partial view not saved",
+ "speechBubbles_partialViewErrorText": "An error occurred saving the file.",
+ "stylesheet_aliasHelp": "Uses CSS syntax ex: h1, .redHeader, .blueTex",
+ "stylesheet_editstylesheet": "Edit stylesheet",
+ "stylesheet_editstylesheetproperty": "Edit stylesheet property",
+ "stylesheet_nameHelp": "Name to identify the style property in the rich text editor ",
+ "stylesheet_preview": "Preview",
+ "stylesheet_styles": "Styles",
+ "template_edittemplate": "Edit template",
+ "template_insertContentArea": "Insert content area",
+ "template_insertContentAreaPlaceHolder": "Insert content area placeholder",
+ "template_insertDictionaryItem": "Insert dictionary item",
+ "template_insertMacro": "Insert Macro",
+ "template_insertPageField": "Insert Umbraco page field",
+ "template_mastertemplate": "Master template",
+ "template_quickGuide": "Quick Guide to Umbraco template tags",
+ "template_template": "Template",
+ "templateEditor_alternativeField": "Alternative field",
+ "templateEditor_alternativeText": "Alternative Text",
+ "templateEditor_casing": "Casing",
+ "templateEditor_encoding": "Encoding",
+ "templateEditor_chooseField": "Choose field",
+ "templateEditor_convertLineBreaks": "Convert Linebreaks",
+ "templateEditor_convertLineBreaksHelp": "Replaces linebreaks with html-tag <br>",
+ "templateEditor_customFields": "Custom Fields",
+ "templateEditor_dateOnly": "Yes, Date only",
+ "templateEditor_formatAsDate": "Format as date",
+ "templateEditor_htmlEncode": "HTML encode",
+ "templateEditor_htmlEncodeHelp": "Will replace special characters by their HTML equivalent.",
+ "templateEditor_insertedAfter": "Will be inserted after the field value",
+ "templateEditor_insertedBefore": "Will be inserted before the field value",
+ "templateEditor_lowercase": "Lowercase",
+ "templateEditor_none": "None",
+ "templateEditor_postContent": "Insert after field",
+ "templateEditor_preContent": "Insert before field",
+ "templateEditor_recursive": "Recursive",
+ "templateEditor_removeParagraph": "Remove Paragraph tags",
+ "templateEditor_removeParagraphHelp": "Will remove any <P> in the beginning and end of the text",
+ "templateEditor_standardFields": "Standard Fields",
+ "templateEditor_uppercase": "Uppercase",
+ "templateEditor_urlEncode": "URL encode",
+ "templateEditor_urlEncodeHelp": "Will format special characters in URLs",
+ "templateEditor_usedIfAllEmpty": "Will only be used when the field values above are empty",
+ "templateEditor_usedIfEmpty": "This field will only be used if the primary field is empty",
+ "templateEditor_withTime": "Yes, with time. Seperator: ",
+ "translation_assignedTasks": "Tasks assigned to you",
+ "translation_assignedTasksHelp": " The list below shows translation tasks
assigned to you . To see a detailed view including comments, click on 'Details' or just the page name. You can also download the page as XML directly by clicking the 'Download Xml' link.
To close a translation task, please go to the Details view and click the 'Close' button. ",
+ "translation_closeTask": "close task",
+ "translation_details": "Translation details",
+ "translation_downloadAllAsXml": "Download all translation tasks as xml",
+ "translation_downloadTaskAsXml": "Download xml",
+ "translation_DownloadXmlDTD": "Download xml DTD",
+ "translation_fields": "Fields",
+ "translation_includeSubpages": "Include subpages",
+ "translation_mailBody": " Hi %0% This is an automated mail to inform you that the document '%1%' has been requested for translation into '%5%' by %2%. Go to http://%3%/translation/details.aspx?id=%4% to edit. Or log into Umbraco to get an overview of your translation tasks http://%3% Have a nice day! Cheers from the Umbraco robot ",
+ "translation_mailSubject": "[%0%] Translation task for %1%",
+ "translation_noTranslators": "No translator users found. Please create a translator user before you start sending content to translation",
+ "translation_ownedTasks": "Tasks created by you",
+ "translation_ownedTasksHelp": " The list below shows pages
created by you . To see a detailed view including comments, click on 'Details' or just the page name. You can also download the page as XML directly by clicking the 'Download Xml' link. To close a translation task, please go to the Details view and click the 'Close' button. ",
+ "translation_pageHasBeenSendToTranslation": "The page '%0%' has been send to translation",
+ "translation_sendToTranslate": "Send the page '%0%' to translation",
+ "translation_taskAssignedBy": "Assigned by",
+ "translation_taskOpened": "Task opened",
+ "translation_totalWords": "Total words",
+ "translation_translateTo": "Translate to",
+ "translation_translationDone": "Translation completed.",
+ "translation_translationDoneHelp": "You can preview the pages, you've just translated, by clicking below. If the original page is found, you will get a comparison of the 2 pages.",
+ "translation_translationFailed": "Translation failed, the xml file might be corrupt",
+ "translation_translationOptions": "Translation options",
+ "translation_translator": "Translator",
+ "translation_uploadTranslationXml": "Upload translation xml",
+ "treeHeaders_cacheBrowser": "Cache Browser",
+ "treeHeaders_contentRecycleBin": "Recycle Bin",
+ "treeHeaders_createdPackages": "Created packages",
+ "treeHeaders_datatype": "Data Types",
+ "treeHeaders_dictionary": "Dictionary",
+ "treeHeaders_installedPackages": "Installed packages",
+ "treeHeaders_installSkin": "Install skin",
+ "treeHeaders_installStarterKit": "Install starter kit",
+ "treeHeaders_languages": "Languages",
+ "treeHeaders_localPackage": "Install local package",
+ "treeHeaders_macros": "Macros",
+ "treeHeaders_mediaTypes": "Media Types",
+ "treeHeaders_member": "Members",
+ "treeHeaders_memberGroup": "Member Groups",
+ "treeHeaders_memberRoles": "Roles",
+ "treeHeaders_memberType": "Member Types",
+ "treeHeaders_nodeTypes": "Document Types",
+ "treeHeaders_packager": "Packages",
+ "treeHeaders_packages": "Packages",
+ "treeHeaders_python": "Python Files",
+ "treeHeaders_repositories": "Install from repository",
+ "treeHeaders_runway": "Install Runway",
+ "treeHeaders_runwayModules": "Runway modules",
+ "treeHeaders_scripting": "Scripting Files",
+ "treeHeaders_scripts": "Scripts",
+ "treeHeaders_stylesheets": "Stylesheets",
+ "treeHeaders_templates": "Templates",
+ "treeHeaders_xslt": "XSLT Files",
+ "update_updateAvailable": "New update ready",
+ "update_updateDownloadText": "%0% is ready, click here for download",
+ "update_updateNoServer": "No connection to server",
+ "update_updateNoServerError": "Error checking for update. Please review trace-stack for further information",
+ "user_administrators": "Administrator",
+ "user_categoryField": "Category field",
+ "user_changePassword": "Change Your Password",
+ "user_newPassword": "New password",
+ "user_confirmNewPassword": "Confirm new password",
+ "user_changePasswordDescription": "You can change your password for accessing the Umbraco Back Office by filling out the form below and click the 'Change Password' button",
+ "user_contentChannel": "Content Channel",
+ "user_descriptionField": "Description field",
+ "user_disabled": "Disable User",
+ "user_documentType": "Document Type",
+ "user_editors": "Editor",
+ "user_excerptField": "Excerpt field",
+ "user_language": "Language",
+ "user_loginname": "Login",
+ "user_mediastartnode": "Start Node in Media Library",
+ "user_modules": "Sections",
+ "user_noConsole": "Disable Umbraco Access",
+ "user_oldPassword": "Old password",
+ "user_password": "Password",
+ "user_resetPassword": "Reset password",
+ "user_passwordChanged": "Your password has been changed!",
+ "user_passwordConfirm": "Please confirm the new password",
+ "user_passwordEnterNew": "Enter your new password",
+ "user_passwordIsBlank": "Your new password cannot be blank!",
+ "user_passwordCurrent": "Current password",
+ "user_passwordInvalid": "Invalid current password",
+ "user_passwordIsDifferent": "There was a difference between the new password and the confirmed password. Please try again!",
+ "user_passwordMismatch": "The confirmed password doesn't match the new password!",
+ "user_permissionReplaceChildren": "Replace child node permssions",
+ "user_permissionSelectedPages": "You are currently modifying permissions for the pages:",
+ "user_permissionSelectPages": "Select pages to modify their permissions",
+ "user_searchAllChildren": "Search all children",
+ "user_startnode": "Start Node in Content",
+ "user_username": "Username",
+ "user_userPermissions": "User permissions",
+ "user_usertype": "User type",
+ "user_userTypes": "User types",
+ "user_writer": "Writer",
+ "user_yourProfile": "Your profile",
+ "user_yourHistory": "Your recent history",
+ "user_sessionExpires": "Session expires in"
+ }, null];
+ }
+ }
+
+ return {
+ register: function() {
+ $httpBackend
+ .whenGET(mocksUtils.urlRegex('LocalizedText'))
+ .respond(getLanguageResource);
+ }
+ };
+ }]);
/**
* @ngdoc service
* @name umbraco.mocks.mediaHelperService
@@ -2258,28 +2258,28 @@ function mediaHelper(umbRequestHelper) {
}
};
}
-angular.module('umbraco.mocks').factory('mediaHelper', mediaHelper);
-angular.module('umbraco.mocks').
- factory('utilMocks', ['$httpBackend', 'mocksUtils', function ($httpBackend, mocksUtils) {
- 'use strict';
-
- function getUpdateCheck(status, data, headers) {
- //check for existence of a cookie so we can do login/logout in the belle app (ignore for tests).
- if (!mocksUtils.checkAuth()) {
- return [401, null, null];
- }
- else {
- return [200, null, null];
- }
- }
-
- return {
- register: function() {
- $httpBackend
- .whenGET(mocksUtils.urlRegex('/umbraco/Api/UpdateCheck/GetCheck'))
- .respond(getUpdateCheck);
- }
- };
- }]);
-
+angular.module('umbraco.mocks').factory('mediaHelper', mediaHelper);
+angular.module('umbraco.mocks').
+ factory('utilMocks', ['$httpBackend', 'mocksUtils', function ($httpBackend, mocksUtils) {
+ 'use strict';
+
+ function getUpdateCheck(status, data, headers) {
+ //check for existence of a cookie so we can do login/logout in the belle app (ignore for tests).
+ if (!mocksUtils.checkAuth()) {
+ return [401, null, null];
+ }
+ else {
+ return [200, null, null];
+ }
+ }
+
+ return {
+ register: function() {
+ $httpBackend
+ .whenGET(mocksUtils.urlRegex('/umbraco/Api/UpdateCheck/GetCheck'))
+ .respond(getUpdateCheck);
+ }
+ };
+ }]);
+
})();
\ No newline at end of file
diff --git a/OurUmbraco.Site/umbraco/lib/angular-dynamic-locale/tmhDynamicLocale.min.js b/OurUmbraco.Site/umbraco/lib/angular-dynamic-locale/tmhDynamicLocale.min.js
index 53478b99..eaf4b152 100644
--- a/OurUmbraco.Site/umbraco/lib/angular-dynamic-locale/tmhDynamicLocale.min.js
+++ b/OurUmbraco.Site/umbraco/lib/angular-dynamic-locale/tmhDynamicLocale.min.js
@@ -1,8 +1,8 @@
-/**
- * Angular Dynamic Locale - 0.1.27
- * https://github.com/lgalfaso/angular-dynamic-locale
- * License: MIT
- */
-
-!function(a,b){"function"==typeof define&&define.amd?define([],function(){return b()}):"object"==typeof exports?module.exports=b():b()}(this,function(){"use strict";return angular.module("tmh.dynamicLocale",[]).config(["$provide",function(a){function b(a){return a.$stateful=!0,a}a.decorator("dateFilter",["$delegate",b]),a.decorator("numberFilter",["$delegate",b]),a.decorator("currencyFilter",["$delegate",b])}]).constant("tmhDynamicLocale.STORAGE_KEY","tmhDynamicLocale.locale").provider("tmhDynamicLocale",["tmhDynamicLocale.STORAGE_KEY",function(a){function b(a,b,c,d){var e=document.createElement("script"),f=document.getElementsByTagName("body")[0],g=!1;e.type="text/javascript",e.readyState?e.onreadystatechange=function(){("complete"===e.readyState||"loaded"===e.readyState)&&(e.onreadystatechange=null,d(function(){g||(g=!0,f.removeChild(e),b())},30,!1))}:(e.onload=function(){g||(g=!0,f.removeChild(e),b())},e.onerror=function(){g||(g=!0,f.removeChild(e),c())}),e.src=a,e.async=!0,f.appendChild(e)}function c(a,c,d,g,h,k,l){function m(a,b){f===d&&(angular.forEach(a,function(c,d){b[d]?angular.isArray(b[d])&&(a[d].length=b[d].length):delete a[d]}),angular.forEach(b,function(c,d){angular.isArray(b[d])||angular.isObject(b[d])?(a[d]||(a[d]=angular.isArray(b[d])?[]:{}),m(a[d],b[d])):a[d]=b[d]}))}if(j[d])return f=d,j[d];var n,o=h.defer();return d===f?o.resolve(c):(n=k.get(d))?(f=d,g.$evalAsync(function(){m(c,n),e.put(i,d),g.$broadcast("$localeChangeSuccess",d,c),o.resolve(c)})):(f=d,j[d]=o.promise,b(a,function(){var a=angular.injector(["ngLocale"]),b=a.get("$locale");m(c,b),k.put(d,b),delete j[d],g.$apply(function(){e.put(i,d),g.$broadcast("$localeChangeSuccess",d,c),o.resolve(c)})},function(){delete j[d],g.$apply(function(){f===d&&(f=c.id),g.$broadcast("$localeChangeError",d),o.reject(d)})},l)),o.promise}var d,e,f,g="angular/i18n/angular-locale_{{locale}}.js",h="tmhDynamicLocaleStorageCache",i=a,j={};this.localeLocationPattern=function(a){return a?(g=a,this):g},this.useStorage=function(a){h=a},this.useCookieStorage=function(){this.useStorage("$cookieStore")},this.defaultLocale=function(a){d=a},this.storageKey=function(a){return a?(i=a,this):i},this.$get=["$rootScope","$injector","$interpolate","$locale","$q","tmhDynamicLocaleCache","$timeout",function(a,b,j,k,l,m,n){function o(b){return c(p({locale:b,angularVersion:angular.version.full}),k,b,a,l,m,n)}var p=j(g);return e=b.get(h),a.$evalAsync(function(){var a;(a=e.get(i)||d)&&o(a)}),{set:o,get:function(){return f}}}]}]).provider("tmhDynamicLocaleCache",function(){this.$get=["$cacheFactory",function(a){return a("tmh.dynamicLocales")}]}).provider("tmhDynamicLocaleStorageCache",function(){this.$get=["$cacheFactory",function(a){return a("tmh.dynamicLocales.store")}]}).run(["tmhDynamicLocale",angular.noop]),"tmh.dynamicLocale"});
+/**
+ * Angular Dynamic Locale - 0.1.27
+ * https://github.com/lgalfaso/angular-dynamic-locale
+ * License: MIT
+ */
+
+!function(a,b){"function"==typeof define&&define.amd?define([],function(){return b()}):"object"==typeof exports?module.exports=b():b()}(this,function(){"use strict";return angular.module("tmh.dynamicLocale",[]).config(["$provide",function(a){function b(a){return a.$stateful=!0,a}a.decorator("dateFilter",["$delegate",b]),a.decorator("numberFilter",["$delegate",b]),a.decorator("currencyFilter",["$delegate",b])}]).constant("tmhDynamicLocale.STORAGE_KEY","tmhDynamicLocale.locale").provider("tmhDynamicLocale",["tmhDynamicLocale.STORAGE_KEY",function(a){function b(a,b,c,d){var e=document.createElement("script"),f=document.getElementsByTagName("body")[0],g=!1;e.type="text/javascript",e.readyState?e.onreadystatechange=function(){("complete"===e.readyState||"loaded"===e.readyState)&&(e.onreadystatechange=null,d(function(){g||(g=!0,f.removeChild(e),b())},30,!1))}:(e.onload=function(){g||(g=!0,f.removeChild(e),b())},e.onerror=function(){g||(g=!0,f.removeChild(e),c())}),e.src=a,e.async=!0,f.appendChild(e)}function c(a,c,d,g,h,k,l){function m(a,b){f===d&&(angular.forEach(a,function(c,d){b[d]?angular.isArray(b[d])&&(a[d].length=b[d].length):delete a[d]}),angular.forEach(b,function(c,d){angular.isArray(b[d])||angular.isObject(b[d])?(a[d]||(a[d]=angular.isArray(b[d])?[]:{}),m(a[d],b[d])):a[d]=b[d]}))}if(j[d])return f=d,j[d];var n,o=h.defer();return d===f?o.resolve(c):(n=k.get(d))?(f=d,g.$evalAsync(function(){m(c,n),e.put(i,d),g.$broadcast("$localeChangeSuccess",d,c),o.resolve(c)})):(f=d,j[d]=o.promise,b(a,function(){var a=angular.injector(["ngLocale"]),b=a.get("$locale");m(c,b),k.put(d,b),delete j[d],g.$apply(function(){e.put(i,d),g.$broadcast("$localeChangeSuccess",d,c),o.resolve(c)})},function(){delete j[d],g.$apply(function(){f===d&&(f=c.id),g.$broadcast("$localeChangeError",d),o.reject(d)})},l)),o.promise}var d,e,f,g="angular/i18n/angular-locale_{{locale}}.js",h="tmhDynamicLocaleStorageCache",i=a,j={};this.localeLocationPattern=function(a){return a?(g=a,this):g},this.useStorage=function(a){h=a},this.useCookieStorage=function(){this.useStorage("$cookieStore")},this.defaultLocale=function(a){d=a},this.storageKey=function(a){return a?(i=a,this):i},this.$get=["$rootScope","$injector","$interpolate","$locale","$q","tmhDynamicLocaleCache","$timeout",function(a,b,j,k,l,m,n){function o(b){return c(p({locale:b,angularVersion:angular.version.full}),k,b,a,l,m,n)}var p=j(g);return e=b.get(h),a.$evalAsync(function(){var a;(a=e.get(i)||d)&&o(a)}),{set:o,get:function(){return f}}}]}]).provider("tmhDynamicLocaleCache",function(){this.$get=["$cacheFactory",function(a){return a("tmh.dynamicLocales")}]}).provider("tmhDynamicLocaleStorageCache",function(){this.$get=["$cacheFactory",function(a){return a("tmh.dynamicLocales.store")}]}).run(["tmhDynamicLocale",angular.noop]),"tmh.dynamicLocale"});
//# sourceMappingURL=tmhDynamicLocale.min.js.map
\ No newline at end of file
diff --git a/OurUmbraco.Site/umbraco/lib/angular-local-storage/angular-local-storage.min.js b/OurUmbraco.Site/umbraco/lib/angular-local-storage/angular-local-storage.min.js
index b0111f12..c4302a2d 100644
--- a/OurUmbraco.Site/umbraco/lib/angular-local-storage/angular-local-storage.min.js
+++ b/OurUmbraco.Site/umbraco/lib/angular-local-storage/angular-local-storage.min.js
@@ -1,9 +1,9 @@
-/**
- * An Angular module that gives you access to the browsers local storage
- * @version v0.2.6 - 2016-03-16
- * @link https://github.com/grevory/angular-local-storage
- * @author grevory
- * @license MIT License, http://www.opensource.org/licenses/MIT
- */
-!function(a,b){var c=b.isDefined,d=b.isUndefined,e=b.isNumber,f=b.isObject,g=b.isArray,h=b.extend,i=b.toJson;b.module("LocalStorageModule",[]).provider("localStorageService",function(){this.prefix="ls",this.storageType="localStorage",this.cookie={expiry:30,path:"/"},this.notify={setItem:!0,removeItem:!1},this.setPrefix=function(a){return this.prefix=a,this},this.setStorageType=function(a){return this.storageType=a,this},this.setStorageCookie=function(a,b){return this.cookie.expiry=a,this.cookie.path=b,this},this.setStorageCookieDomain=function(a){return this.cookie.domain=a,this},this.setNotify=function(a,b){return this.notify={setItem:a,removeItem:b},this},this.$get=["$rootScope","$window","$document","$parse",function(a,b,j,k){var l,m=this,n=m.prefix,o=m.cookie,p=m.notify,q=m.storageType;j?j[0]&&(j=j[0]):j=document,"."!==n.substr(-1)&&(n=n?n+".":"");var r=function(a){return n+a},s=function(){try{var c=q in b&&null!==b[q],d=r("__"+Math.round(1e7*Math.random()));return c&&(l=b[q],l.setItem(d,""),l.removeItem(d)),c}catch(e){return q="cookie",a.$broadcast("LocalStorageModule.notification.error",e.message),!1}}(),t=function(b,c){if(c=d(c)?null:i(c),!s||"cookie"===m.storageType)return s||a.$broadcast("LocalStorageModule.notification.warning","LOCAL_STORAGE_NOT_SUPPORTED"),p.setItem&&a.$broadcast("LocalStorageModule.notification.setitem",{key:b,newvalue:c,storageType:"cookie"}),z(b,c);try{l&&l.setItem(r(b),c),p.setItem&&a.$broadcast("LocalStorageModule.notification.setitem",{key:b,newvalue:c,storageType:m.storageType})}catch(e){return a.$broadcast("LocalStorageModule.notification.error",e.message),z(b,c)}return!0},u=function(b){if(!s||"cookie"===m.storageType)return s||a.$broadcast("LocalStorageModule.notification.warning","LOCAL_STORAGE_NOT_SUPPORTED"),A(b);var c=l?l.getItem(r(b)):null;if(!c||"null"===c)return null;try{return JSON.parse(c)}catch(d){return c}},v=function(){var b,c;for(b=0;b0||(j.cookie="test").indexOf.call(j.cookie,"test")>-1)}catch(c){return a.$broadcast("LocalStorageModule.notification.error",c.message),!1}}(),z=function(b,c,h){if(d(c))return!1;if((g(c)||f(c))&&(c=i(c)),!y)return a.$broadcast("LocalStorageModule.notification.error","COOKIES_NOT_SUPPORTED"),!1;try{var k="",l=new Date,m="";if(null===c?(l.setTime(l.getTime()+-864e5),k="; expires="+l.toGMTString(),c=""):e(h)&&0!==h?(l.setTime(l.getTime()+24*h*60*60*1e3),k="; expires="+l.toGMTString()):0!==o.expiry&&(l.setTime(l.getTime()+24*o.expiry*60*60*1e3),k="; expires="+l.toGMTString()),b){var n="; path="+o.path;o.domain&&(m="; domain="+o.domain),j.cookie=r(b)+"="+encodeURIComponent(c)+k+n+m}}catch(p){return a.$broadcast("LocalStorageModule.notification.error",p.message),!1}return!0},A=function(b){if(!y)return a.$broadcast("LocalStorageModule.notification.error","COOKIES_NOT_SUPPORTED"),!1;for(var c=j.cookie&&j.cookie.split(";")||[],d=0;d
+ * @license MIT License, http://www.opensource.org/licenses/MIT
+ */
+!function(a,b){var c=b.isDefined,d=b.isUndefined,e=b.isNumber,f=b.isObject,g=b.isArray,h=b.extend,i=b.toJson;b.module("LocalStorageModule",[]).provider("localStorageService",function(){this.prefix="ls",this.storageType="localStorage",this.cookie={expiry:30,path:"/"},this.notify={setItem:!0,removeItem:!1},this.setPrefix=function(a){return this.prefix=a,this},this.setStorageType=function(a){return this.storageType=a,this},this.setStorageCookie=function(a,b){return this.cookie.expiry=a,this.cookie.path=b,this},this.setStorageCookieDomain=function(a){return this.cookie.domain=a,this},this.setNotify=function(a,b){return this.notify={setItem:a,removeItem:b},this},this.$get=["$rootScope","$window","$document","$parse",function(a,b,j,k){var l,m=this,n=m.prefix,o=m.cookie,p=m.notify,q=m.storageType;j?j[0]&&(j=j[0]):j=document,"."!==n.substr(-1)&&(n=n?n+".":"");var r=function(a){return n+a},s=function(){try{var c=q in b&&null!==b[q],d=r("__"+Math.round(1e7*Math.random()));return c&&(l=b[q],l.setItem(d,""),l.removeItem(d)),c}catch(e){return q="cookie",a.$broadcast("LocalStorageModule.notification.error",e.message),!1}}(),t=function(b,c){if(c=d(c)?null:i(c),!s||"cookie"===m.storageType)return s||a.$broadcast("LocalStorageModule.notification.warning","LOCAL_STORAGE_NOT_SUPPORTED"),p.setItem&&a.$broadcast("LocalStorageModule.notification.setitem",{key:b,newvalue:c,storageType:"cookie"}),z(b,c);try{l&&l.setItem(r(b),c),p.setItem&&a.$broadcast("LocalStorageModule.notification.setitem",{key:b,newvalue:c,storageType:m.storageType})}catch(e){return a.$broadcast("LocalStorageModule.notification.error",e.message),z(b,c)}return!0},u=function(b){if(!s||"cookie"===m.storageType)return s||a.$broadcast("LocalStorageModule.notification.warning","LOCAL_STORAGE_NOT_SUPPORTED"),A(b);var c=l?l.getItem(r(b)):null;if(!c||"null"===c)return null;try{return JSON.parse(c)}catch(d){return c}},v=function(){var b,c;for(b=0;b0||(j.cookie="test").indexOf.call(j.cookie,"test")>-1)}catch(c){return a.$broadcast("LocalStorageModule.notification.error",c.message),!1}}(),z=function(b,c,h){if(d(c))return!1;if((g(c)||f(c))&&(c=i(c)),!y)return a.$broadcast("LocalStorageModule.notification.error","COOKIES_NOT_SUPPORTED"),!1;try{var k="",l=new Date,m="";if(null===c?(l.setTime(l.getTime()+-864e5),k="; expires="+l.toGMTString(),c=""):e(h)&&0!==h?(l.setTime(l.getTime()+24*h*60*60*1e3),k="; expires="+l.toGMTString()):0!==o.expiry&&(l.setTime(l.getTime()+24*o.expiry*60*60*1e3),k="; expires="+l.toGMTString()),b){var n="; path="+o.path;o.domain&&(m="; domain="+o.domain),j.cookie=r(b)+"="+encodeURIComponent(c)+k+n+m}}catch(p){return a.$broadcast("LocalStorageModule.notification.error",p.message),!1}return!0},A=function(b){if(!y)return a.$broadcast("LocalStorageModule.notification.error","COOKIES_NOT_SUPPORTED"),!1;for(var c=j.cookie&&j.cookie.split(";")||[],d=0;d
-
-
-
-
- */
- 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) {
- var value = $cookies[key];
- return value ? angular.fromJson(value) : value;
- },
-
- /**
- * @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);
+/**
+ * @license AngularJS v1.1.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) {
+ var value = $cookies[key];
+ return value ? angular.fromJson(value) : value;
+ },
+
+ /**
+ * @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/OurUmbraco.Site/umbraco/lib/angular/1.1.5/angular-cookies.min.js b/OurUmbraco.Site/umbraco/lib/angular/1.1.5/angular-cookies.min.js
index 9d908260..276bce05 100644
--- a/OurUmbraco.Site/umbraco/lib/angular/1.1.5/angular-cookies.min.js
+++ b/OurUmbraco.Site/umbraco/lib/angular/1.1.5/angular-cookies.min.js
@@ -1,7 +1,7 @@
-/*
- AngularJS v1.1.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,b){var c={},g={},h,i=!1,j=f.copy,k=f.isUndefined;b.addPollFn(function(){var a=b.cookies();h!=a&&(h=a,j(a,g),j(a,c),i&&d.$apply())})();i=!0;d.$watch(function(){var a,e,d;for(a in g)k(c[a])&&b.cookies(a,l);for(a in c)e=c[a],f.isString(e)?e!==g[a]&&(b.cookies(a,e),d=!0):f.isDefined(g[a])?c[a]=g[a]:delete c[a];if(d)for(a in e=b.cookies(),c)c[a]!==e[a]&&(k(e[a])?delete c[a]:c[a]=e[a])});return c}]).factory("$cookieStore",
-["$cookies",function(d){return{get:function(b){return(b=d[b])?f.fromJson(b):b},put:function(b,c){d[b]=f.toJson(c)},remove:function(b){delete d[b]}}}])})(window,window.angular);
+/*
+ AngularJS v1.1.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,b){var c={},g={},h,i=!1,j=f.copy,k=f.isUndefined;b.addPollFn(function(){var a=b.cookies();h!=a&&(h=a,j(a,g),j(a,c),i&&d.$apply())})();i=!0;d.$watch(function(){var a,e,d;for(a in g)k(c[a])&&b.cookies(a,l);for(a in c)e=c[a],f.isString(e)?e!==g[a]&&(b.cookies(a,e),d=!0):f.isDefined(g[a])?c[a]=g[a]:delete c[a];if(d)for(a in e=b.cookies(),c)c[a]!==e[a]&&(k(e[a])?delete c[a]:c[a]=e[a])});return c}]).factory("$cookieStore",
+["$cookies",function(d){return{get:function(b){return(b=d[b])?f.fromJson(b):b},put:function(b,c){d[b]=f.toJson(c)},remove:function(b){delete d[b]}}}])})(window,window.angular);
diff --git a/OurUmbraco.Site/umbraco/lib/angular/1.1.5/angular-loader.js b/OurUmbraco.Site/umbraco/lib/angular/1.1.5/angular-loader.js
index 4d7184f0..e4c31614 100644
--- a/OurUmbraco.Site/umbraco/lib/angular/1.1.5/angular-loader.js
+++ b/OurUmbraco.Site/umbraco/lib/angular/1.1.5/angular-loader.js
@@ -1,304 +1,304 @@
-/**
- * @license AngularJS v1.1.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#animation
- * @methodOf angular.Module
- * @param {string} name animation name
- * @param {Function} animationFactory Factory function for creating new instance of an animation.
- * @description
- *
- * Defines an animation hook that can be later used with {@link ng.directive:ngAnimate ngAnimate}
- * alongside {@link ng.directive:ngAnimate#Description common ng directives} as well as custom directives.
- *
- * module.animation('animation-name', function($inject1, $inject2) {
- * return {
- * //this gets called in preparation to setup an animation
- * setup : function(element) { ... },
- *
- * //this gets called once the animation is run
- * start : function(element, done, memo) { ... }
- * }
- * })
- *
- *
- * See {@link ng.$animationProvider#register $animationProvider.register()} and
- * {@link ng.directive:ngAnimate ngAnimate} for more information.
- */
- animation: invokeLater('$animationProvider', 'register'),
-
- /**
- * @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;
-
+/**
+ * @license AngularJS v1.1.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#animation
+ * @methodOf angular.Module
+ * @param {string} name animation name
+ * @param {Function} animationFactory Factory function for creating new instance of an animation.
+ * @description
+ *
+ * Defines an animation hook that can be later used with {@link ng.directive:ngAnimate ngAnimate}
+ * alongside {@link ng.directive:ngAnimate#Description common ng directives} as well as custom directives.
+ *
+ * module.animation('animation-name', function($inject1, $inject2) {
+ * return {
+ * //this gets called in preparation to setup an animation
+ * setup : function(element) { ... },
+ *
+ * //this gets called once the animation is run
+ * start : function(element, done, memo) { ... }
+ * }
+ * })
+ *
+ *
+ * See {@link ng.$animationProvider#register $animationProvider.register()} and
+ * {@link ng.directive:ngAnimate ngAnimate} for more information.
+ */
+ animation: invokeLater('$animationProvider', 'register'),
+
+ /**
+ * @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/OurUmbraco.Site/umbraco/lib/angular/1.1.5/angular-loader.min.js b/OurUmbraco.Site/umbraco/lib/angular/1.1.5/angular-loader.min.js
index 0c262d49..5d1e2538 100644
--- a/OurUmbraco.Site/umbraco/lib/angular/1.1.5/angular-loader.min.js
+++ b/OurUmbraco.Site/umbraco/lib/angular/1.1.5/angular-loader.min.js
@@ -1,7 +1,7 @@
-/*
- AngularJS v1.1.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"),animation:a("$animationProvider","register"),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);
+/*
+ AngularJS v1.1.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"),animation:a("$animationProvider","register"),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/OurUmbraco.Site/umbraco/lib/angular/1.1.5/angular-mobile.js b/OurUmbraco.Site/umbraco/lib/angular/1.1.5/angular-mobile.js
index 8cfb20cb..d335dcbd 100644
--- a/OurUmbraco.Site/umbraco/lib/angular/1.1.5/angular-mobile.js
+++ b/OurUmbraco.Site/umbraco/lib/angular/1.1.5/angular-mobile.js
@@ -1,462 +1,462 @@
-/**
- * @license AngularJS v1.1.5
- * (c) 2010-2012 Google, Inc. http://angularjs.org
- * License: MIT
- */
-(function(window, angular, undefined) {
-'use strict';
-
-/**
- * @ngdoc overview
- * @name ngMobile
- * @description
- * Touch events and other mobile helpers.
- * Based on jQuery Mobile touch event handling (jquerymobile.com)
- */
-
-// define ngMobile module
-var ngMobile = angular.module('ngMobile', []);
-
-/**
- * @ngdoc directive
- * @name ngMobile.directive:ngClick
- *
- * @description
- * A more powerful replacement for the default ngClick designed to be used on touchscreen
- * devices. Most mobile browsers wait about 300ms after a tap-and-release before sending
- * the click event. This version handles them immediately, and then prevents the
- * following click event from propagating.
- *
- * This directive can fall back to using an ordinary click event, and so works on desktop
- * browsers as well as mobile.
- *
- * This directive also sets the CSS class `ng-click-active` while the element is being held
- * down (by a mouse click or touch) so you can restyle the depressed element if you wish.
- *
- * @element ANY
- * @param {expression} ngClick {@link guide/expression Expression} to evaluate
- * upon tap. (Event object is available as `$event`)
- *
- * @example
-
-
-
- Increment
-
- count: {{ count }}
-
-
- */
-
-ngMobile.config(['$provide', function($provide) {
- $provide.decorator('ngClickDirective', ['$delegate', function($delegate) {
- // drop the default ngClick directive
- $delegate.shift();
- return $delegate;
- }]);
-}]);
-
-ngMobile.directive('ngClick', ['$parse', '$timeout', '$rootElement',
- function($parse, $timeout, $rootElement) {
- var TAP_DURATION = 750; // Shorter than 750ms is a tap, longer is a taphold or drag.
- var MOVE_TOLERANCE = 12; // 12px seems to work in most mobile browsers.
- var PREVENT_DURATION = 2500; // 2.5 seconds maximum from preventGhostClick call to click
- var CLICKBUSTER_THRESHOLD = 25; // 25 pixels in any dimension is the limit for busting clicks.
-
- var ACTIVE_CLASS_NAME = 'ng-click-active';
- var lastPreventedTime;
- var touchCoordinates;
-
-
- // TAP EVENTS AND GHOST CLICKS
- //
- // Why tap events?
- // Mobile browsers detect a tap, then wait a moment (usually ~300ms) to see if you're
- // double-tapping, and then fire a click event.
- //
- // This delay sucks and makes mobile apps feel unresponsive.
- // So we detect touchstart, touchmove, touchcancel and touchend ourselves and determine when
- // the user has tapped on something.
- //
- // What happens when the browser then generates a click event?
- // The browser, of course, also detects the tap and fires a click after a delay. This results in
- // tapping/clicking twice. So we do "clickbusting" to prevent it.
- //
- // How does it work?
- // We attach global touchstart and click handlers, that run during the capture (early) phase.
- // So the sequence for a tap is:
- // - global touchstart: Sets an "allowable region" at the point touched.
- // - element's touchstart: Starts a touch
- // (- touchmove or touchcancel ends the touch, no click follows)
- // - element's touchend: Determines if the tap is valid (didn't move too far away, didn't hold
- // too long) and fires the user's tap handler. The touchend also calls preventGhostClick().
- // - preventGhostClick() removes the allowable region the global touchstart created.
- // - The browser generates a click event.
- // - The global click handler catches the click, and checks whether it was in an allowable region.
- // - If preventGhostClick was called, the region will have been removed, the click is busted.
- // - If the region is still there, the click proceeds normally. Therefore clicks on links and
- // other elements without ngTap on them work normally.
- //
- // This is an ugly, terrible hack!
- // Yeah, tell me about it. The alternatives are using the slow click events, or making our users
- // deal with the ghost clicks, so I consider this the least of evils. Fortunately Angular
- // encapsulates this ugly logic away from the user.
- //
- // Why not just put click handlers on the element?
- // We do that too, just to be sure. The problem is that the tap event might have caused the DOM
- // to change, so that the click fires in the same position but something else is there now. So
- // the handlers are global and care only about coordinates and not elements.
-
- // Checks if the coordinates are close enough to be within the region.
- function hit(x1, y1, x2, y2) {
- return Math.abs(x1 - x2) < CLICKBUSTER_THRESHOLD && Math.abs(y1 - y2) < CLICKBUSTER_THRESHOLD;
- }
-
- // Checks a list of allowable regions against a click location.
- // Returns true if the click should be allowed.
- // Splices out the allowable region from the list after it has been used.
- function checkAllowableRegions(touchCoordinates, x, y) {
- for (var i = 0; i < touchCoordinates.length; i += 2) {
- if (hit(touchCoordinates[i], touchCoordinates[i+1], x, y)) {
- touchCoordinates.splice(i, i + 2);
- return true; // allowable region
- }
- }
- return false; // No allowable region; bust it.
- }
-
- // Global click handler that prevents the click if it's in a bustable zone and preventGhostClick
- // was called recently.
- function onClick(event) {
- if (Date.now() - lastPreventedTime > PREVENT_DURATION) {
- return; // Too old.
- }
-
- var touches = event.touches && event.touches.length ? event.touches : [event];
- var x = touches[0].clientX;
- var y = touches[0].clientY;
- // Work around desktop Webkit quirk where clicking a label will fire two clicks (on the label
- // and on the input element). Depending on the exact browser, this second click we don't want
- // to bust has either (0,0) or negative coordinates.
- if (x < 1 && y < 1) {
- return; // offscreen
- }
-
- // Look for an allowable region containing this click.
- // If we find one, that means it was created by touchstart and not removed by
- // preventGhostClick, so we don't bust it.
- if (checkAllowableRegions(touchCoordinates, x, y)) {
- return;
- }
-
- // If we didn't find an allowable region, bust the click.
- event.stopPropagation();
- event.preventDefault();
- }
-
-
- // Global touchstart handler that creates an allowable region for a click event.
- // This allowable region can be removed by preventGhostClick if we want to bust it.
- function onTouchStart(event) {
- var touches = event.touches && event.touches.length ? event.touches : [event];
- var x = touches[0].clientX;
- var y = touches[0].clientY;
- touchCoordinates.push(x, y);
-
- $timeout(function() {
- // Remove the allowable region.
- for (var i = 0; i < touchCoordinates.length; i += 2) {
- if (touchCoordinates[i] == x && touchCoordinates[i+1] == y) {
- touchCoordinates.splice(i, i + 2);
- return;
- }
- }
- }, PREVENT_DURATION, false);
- }
-
- // On the first call, attaches some event handlers. Then whenever it gets called, it creates a
- // zone around the touchstart where clicks will get busted.
- function preventGhostClick(x, y) {
- if (!touchCoordinates) {
- $rootElement[0].addEventListener('click', onClick, true);
- $rootElement[0].addEventListener('touchstart', onTouchStart, true);
- touchCoordinates = [];
- }
-
- lastPreventedTime = Date.now();
-
- checkAllowableRegions(touchCoordinates, x, y);
- }
-
- // Actual linking function.
- return function(scope, element, attr) {
- var clickHandler = $parse(attr.ngClick),
- tapping = false,
- tapElement, // Used to blur the element after a tap.
- startTime, // Used to check if the tap was held too long.
- touchStartX,
- touchStartY;
-
- function resetState() {
- tapping = false;
- element.removeClass(ACTIVE_CLASS_NAME);
- }
-
- element.bind('touchstart', function(event) {
- tapping = true;
- tapElement = event.target ? event.target : event.srcElement; // IE uses srcElement.
- // Hack for Safari, which can target text nodes instead of containers.
- if(tapElement.nodeType == 3) {
- tapElement = tapElement.parentNode;
- }
-
- element.addClass(ACTIVE_CLASS_NAME);
-
- startTime = Date.now();
-
- var touches = event.touches && event.touches.length ? event.touches : [event];
- var e = touches[0].originalEvent || touches[0];
- touchStartX = e.clientX;
- touchStartY = e.clientY;
- });
-
- element.bind('touchmove', function(event) {
- resetState();
- });
-
- element.bind('touchcancel', function(event) {
- resetState();
- });
-
- element.bind('touchend', function(event) {
- var diff = Date.now() - startTime;
-
- var touches = (event.changedTouches && event.changedTouches.length) ? event.changedTouches :
- ((event.touches && event.touches.length) ? event.touches : [event]);
- var e = touches[0].originalEvent || touches[0];
- var x = e.clientX;
- var y = e.clientY;
- var dist = Math.sqrt( Math.pow(x - touchStartX, 2) + Math.pow(y - touchStartY, 2) );
-
- if (tapping && diff < TAP_DURATION && dist < MOVE_TOLERANCE) {
- // Call preventGhostClick so the clickbuster will catch the corresponding click.
- preventGhostClick(x, y);
-
- // Blur the focused element (the button, probably) before firing the callback.
- // This doesn't work perfectly on Android Chrome, but seems to work elsewhere.
- // I couldn't get anything to work reliably on Android Chrome.
- if (tapElement) {
- tapElement.blur();
- }
-
- scope.$apply(function() {
- // TODO(braden): This is sending the touchend, not a tap or click. Is that kosher?
- clickHandler(scope, {$event: event});
- });
- }
-
- resetState();
- });
-
- // Hack for iOS Safari's benefit. It goes searching for onclick handlers and is liable to click
- // something else nearby.
- element.onclick = function(event) { };
-
- // Fallback click handler.
- // Busted clicks don't get this far, and adding this handler allows ng-tap to be used on
- // desktop as well, to allow more portable sites.
- element.bind('click', function(event) {
- scope.$apply(function() {
- clickHandler(scope, {$event: event});
- });
- });
-
-/*
- element.bind('mousedown', function(event) {
- element.addClass(ACTIVE_CLASS_NAME);
- });
-
- element.bind('mousemove mouseup', function(event) {
- element.removeClass(ACTIVE_CLASS_NAME);
- });
-*/
-
- };
-}]);
-
-/**
- * @ngdoc directive
- * @name ngMobile.directive:ngSwipeLeft
- *
- * @description
- * Specify custom behavior when an element is swiped to the left on a touchscreen device.
- * A leftward swipe is a quick, right-to-left slide of the finger.
- * Though ngSwipeLeft is designed for touch-based devices, it will work with a mouse click and drag too.
- *
- * @element ANY
- * @param {expression} ngSwipeLeft {@link guide/expression Expression} to evaluate
- * upon left swipe. (Event object is available as `$event`)
- *
- * @example
-
-
-
- Some list content, like an email in the inbox
-
-
- Reply
- Delete
-
-
-
- */
-
-/**
- * @ngdoc directive
- * @name ngMobile.directive:ngSwipeRight
- *
- * @description
- * Specify custom behavior when an element is swiped to the right on a touchscreen device.
- * A rightward swipe is a quick, left-to-right slide of the finger.
- * Though ngSwipeRight is designed for touch-based devices, it will work with a mouse click and drag too.
- *
- * @element ANY
- * @param {expression} ngSwipeRight {@link guide/expression Expression} to evaluate
- * upon right swipe. (Event object is available as `$event`)
- *
- * @example
-
-
-
- Some list content, like an email in the inbox
-
-
- Reply
- Delete
-
-
-
- */
-
-function makeSwipeDirective(directiveName, direction) {
- ngMobile.directive(directiveName, ['$parse', function($parse) {
- // The maximum vertical delta for a swipe should be less than 75px.
- var MAX_VERTICAL_DISTANCE = 75;
- // Vertical distance should not be more than a fraction of the horizontal distance.
- var MAX_VERTICAL_RATIO = 0.3;
- // At least a 30px lateral motion is necessary for a swipe.
- var MIN_HORIZONTAL_DISTANCE = 30;
- // The total distance in any direction before we make the call on swipe vs. scroll.
- var MOVE_BUFFER_RADIUS = 10;
-
- function getCoordinates(event) {
- var touches = event.touches && event.touches.length ? event.touches : [event];
- var e = (event.changedTouches && event.changedTouches[0]) ||
- (event.originalEvent && event.originalEvent.changedTouches &&
- event.originalEvent.changedTouches[0]) ||
- touches[0].originalEvent || touches[0];
-
- return {
- x: e.clientX,
- y: e.clientY
- };
- }
-
- return function(scope, element, attr) {
- var swipeHandler = $parse(attr[directiveName]);
- var startCoords, valid;
- var totalX, totalY;
- var lastX, lastY;
-
- function validSwipe(event) {
- // Check that it's within the coordinates.
- // Absolute vertical distance must be within tolerances.
- // Horizontal distance, we take the current X - the starting X.
- // This is negative for leftward swipes and positive for rightward swipes.
- // After multiplying by the direction (-1 for left, +1 for right), legal swipes
- // (ie. same direction as the directive wants) will have a positive delta and
- // illegal ones a negative delta.
- // Therefore this delta must be positive, and larger than the minimum.
- if (!startCoords) return false;
- var coords = getCoordinates(event);
- var deltaY = Math.abs(coords.y - startCoords.y);
- var deltaX = (coords.x - startCoords.x) * direction;
- return valid && // Short circuit for already-invalidated swipes.
- deltaY < MAX_VERTICAL_DISTANCE &&
- deltaX > 0 &&
- deltaX > MIN_HORIZONTAL_DISTANCE &&
- deltaY / deltaX < MAX_VERTICAL_RATIO;
- }
-
- element.bind('touchstart mousedown', function(event) {
- startCoords = getCoordinates(event);
- valid = true;
- totalX = 0;
- totalY = 0;
- lastX = startCoords.x;
- lastY = startCoords.y;
- });
-
- element.bind('touchcancel', function(event) {
- valid = false;
- });
-
- element.bind('touchmove mousemove', function(event) {
- if (!valid) return;
-
- // Android will send a touchcancel if it thinks we're starting to scroll.
- // So when the total distance (+ or - or both) exceeds 10px in either direction,
- // we either:
- // - On totalX > totalY, we send preventDefault() and treat this as a swipe.
- // - On totalY > totalX, we let the browser handle it as a scroll.
-
- // Invalidate a touch while it's in progress if it strays too far away vertically.
- // We don't want a scroll down and back up while drifting sideways to be a swipe just
- // because you happened to end up vertically close in the end.
- if (!startCoords) return;
- var coords = getCoordinates(event);
-
- if (Math.abs(coords.y - startCoords.y) > MAX_VERTICAL_DISTANCE) {
- valid = false;
- return;
- }
-
- totalX += Math.abs(coords.x - lastX);
- totalY += Math.abs(coords.y - lastY);
-
- lastX = coords.x;
- lastY = coords.y;
-
- if (totalX < MOVE_BUFFER_RADIUS && totalY < MOVE_BUFFER_RADIUS) {
- return;
- }
-
- // One of totalX or totalY has exceeded the buffer, so decide on swipe vs. scroll.
- if (totalY > totalX) {
- valid = false;
- return;
- } else {
- event.preventDefault();
- }
- });
-
- element.bind('touchend mouseup', function(event) {
- if (validSwipe(event)) {
- // Prevent this swipe from bubbling up to any other elements with ngSwipes.
- event.stopPropagation();
- scope.$apply(function() {
- swipeHandler(scope, {$event:event});
- });
- }
- });
- };
- }]);
-}
-
-// Left is negative X-coordinate, right is positive.
-makeSwipeDirective('ngSwipeLeft', -1);
-makeSwipeDirective('ngSwipeRight', 1);
-
-
-
-})(window, window.angular);
+/**
+ * @license AngularJS v1.1.5
+ * (c) 2010-2012 Google, Inc. http://angularjs.org
+ * License: MIT
+ */
+(function(window, angular, undefined) {
+'use strict';
+
+/**
+ * @ngdoc overview
+ * @name ngMobile
+ * @description
+ * Touch events and other mobile helpers.
+ * Based on jQuery Mobile touch event handling (jquerymobile.com)
+ */
+
+// define ngMobile module
+var ngMobile = angular.module('ngMobile', []);
+
+/**
+ * @ngdoc directive
+ * @name ngMobile.directive:ngClick
+ *
+ * @description
+ * A more powerful replacement for the default ngClick designed to be used on touchscreen
+ * devices. Most mobile browsers wait about 300ms after a tap-and-release before sending
+ * the click event. This version handles them immediately, and then prevents the
+ * following click event from propagating.
+ *
+ * This directive can fall back to using an ordinary click event, and so works on desktop
+ * browsers as well as mobile.
+ *
+ * This directive also sets the CSS class `ng-click-active` while the element is being held
+ * down (by a mouse click or touch) so you can restyle the depressed element if you wish.
+ *
+ * @element ANY
+ * @param {expression} ngClick {@link guide/expression Expression} to evaluate
+ * upon tap. (Event object is available as `$event`)
+ *
+ * @example
+
+
+
+ Increment
+
+ count: {{ count }}
+
+
+ */
+
+ngMobile.config(['$provide', function($provide) {
+ $provide.decorator('ngClickDirective', ['$delegate', function($delegate) {
+ // drop the default ngClick directive
+ $delegate.shift();
+ return $delegate;
+ }]);
+}]);
+
+ngMobile.directive('ngClick', ['$parse', '$timeout', '$rootElement',
+ function($parse, $timeout, $rootElement) {
+ var TAP_DURATION = 750; // Shorter than 750ms is a tap, longer is a taphold or drag.
+ var MOVE_TOLERANCE = 12; // 12px seems to work in most mobile browsers.
+ var PREVENT_DURATION = 2500; // 2.5 seconds maximum from preventGhostClick call to click
+ var CLICKBUSTER_THRESHOLD = 25; // 25 pixels in any dimension is the limit for busting clicks.
+
+ var ACTIVE_CLASS_NAME = 'ng-click-active';
+ var lastPreventedTime;
+ var touchCoordinates;
+
+
+ // TAP EVENTS AND GHOST CLICKS
+ //
+ // Why tap events?
+ // Mobile browsers detect a tap, then wait a moment (usually ~300ms) to see if you're
+ // double-tapping, and then fire a click event.
+ //
+ // This delay sucks and makes mobile apps feel unresponsive.
+ // So we detect touchstart, touchmove, touchcancel and touchend ourselves and determine when
+ // the user has tapped on something.
+ //
+ // What happens when the browser then generates a click event?
+ // The browser, of course, also detects the tap and fires a click after a delay. This results in
+ // tapping/clicking twice. So we do "clickbusting" to prevent it.
+ //
+ // How does it work?
+ // We attach global touchstart and click handlers, that run during the capture (early) phase.
+ // So the sequence for a tap is:
+ // - global touchstart: Sets an "allowable region" at the point touched.
+ // - element's touchstart: Starts a touch
+ // (- touchmove or touchcancel ends the touch, no click follows)
+ // - element's touchend: Determines if the tap is valid (didn't move too far away, didn't hold
+ // too long) and fires the user's tap handler. The touchend also calls preventGhostClick().
+ // - preventGhostClick() removes the allowable region the global touchstart created.
+ // - The browser generates a click event.
+ // - The global click handler catches the click, and checks whether it was in an allowable region.
+ // - If preventGhostClick was called, the region will have been removed, the click is busted.
+ // - If the region is still there, the click proceeds normally. Therefore clicks on links and
+ // other elements without ngTap on them work normally.
+ //
+ // This is an ugly, terrible hack!
+ // Yeah, tell me about it. The alternatives are using the slow click events, or making our users
+ // deal with the ghost clicks, so I consider this the least of evils. Fortunately Angular
+ // encapsulates this ugly logic away from the user.
+ //
+ // Why not just put click handlers on the element?
+ // We do that too, just to be sure. The problem is that the tap event might have caused the DOM
+ // to change, so that the click fires in the same position but something else is there now. So
+ // the handlers are global and care only about coordinates and not elements.
+
+ // Checks if the coordinates are close enough to be within the region.
+ function hit(x1, y1, x2, y2) {
+ return Math.abs(x1 - x2) < CLICKBUSTER_THRESHOLD && Math.abs(y1 - y2) < CLICKBUSTER_THRESHOLD;
+ }
+
+ // Checks a list of allowable regions against a click location.
+ // Returns true if the click should be allowed.
+ // Splices out the allowable region from the list after it has been used.
+ function checkAllowableRegions(touchCoordinates, x, y) {
+ for (var i = 0; i < touchCoordinates.length; i += 2) {
+ if (hit(touchCoordinates[i], touchCoordinates[i+1], x, y)) {
+ touchCoordinates.splice(i, i + 2);
+ return true; // allowable region
+ }
+ }
+ return false; // No allowable region; bust it.
+ }
+
+ // Global click handler that prevents the click if it's in a bustable zone and preventGhostClick
+ // was called recently.
+ function onClick(event) {
+ if (Date.now() - lastPreventedTime > PREVENT_DURATION) {
+ return; // Too old.
+ }
+
+ var touches = event.touches && event.touches.length ? event.touches : [event];
+ var x = touches[0].clientX;
+ var y = touches[0].clientY;
+ // Work around desktop Webkit quirk where clicking a label will fire two clicks (on the label
+ // and on the input element). Depending on the exact browser, this second click we don't want
+ // to bust has either (0,0) or negative coordinates.
+ if (x < 1 && y < 1) {
+ return; // offscreen
+ }
+
+ // Look for an allowable region containing this click.
+ // If we find one, that means it was created by touchstart and not removed by
+ // preventGhostClick, so we don't bust it.
+ if (checkAllowableRegions(touchCoordinates, x, y)) {
+ return;
+ }
+
+ // If we didn't find an allowable region, bust the click.
+ event.stopPropagation();
+ event.preventDefault();
+ }
+
+
+ // Global touchstart handler that creates an allowable region for a click event.
+ // This allowable region can be removed by preventGhostClick if we want to bust it.
+ function onTouchStart(event) {
+ var touches = event.touches && event.touches.length ? event.touches : [event];
+ var x = touches[0].clientX;
+ var y = touches[0].clientY;
+ touchCoordinates.push(x, y);
+
+ $timeout(function() {
+ // Remove the allowable region.
+ for (var i = 0; i < touchCoordinates.length; i += 2) {
+ if (touchCoordinates[i] == x && touchCoordinates[i+1] == y) {
+ touchCoordinates.splice(i, i + 2);
+ return;
+ }
+ }
+ }, PREVENT_DURATION, false);
+ }
+
+ // On the first call, attaches some event handlers. Then whenever it gets called, it creates a
+ // zone around the touchstart where clicks will get busted.
+ function preventGhostClick(x, y) {
+ if (!touchCoordinates) {
+ $rootElement[0].addEventListener('click', onClick, true);
+ $rootElement[0].addEventListener('touchstart', onTouchStart, true);
+ touchCoordinates = [];
+ }
+
+ lastPreventedTime = Date.now();
+
+ checkAllowableRegions(touchCoordinates, x, y);
+ }
+
+ // Actual linking function.
+ return function(scope, element, attr) {
+ var clickHandler = $parse(attr.ngClick),
+ tapping = false,
+ tapElement, // Used to blur the element after a tap.
+ startTime, // Used to check if the tap was held too long.
+ touchStartX,
+ touchStartY;
+
+ function resetState() {
+ tapping = false;
+ element.removeClass(ACTIVE_CLASS_NAME);
+ }
+
+ element.bind('touchstart', function(event) {
+ tapping = true;
+ tapElement = event.target ? event.target : event.srcElement; // IE uses srcElement.
+ // Hack for Safari, which can target text nodes instead of containers.
+ if(tapElement.nodeType == 3) {
+ tapElement = tapElement.parentNode;
+ }
+
+ element.addClass(ACTIVE_CLASS_NAME);
+
+ startTime = Date.now();
+
+ var touches = event.touches && event.touches.length ? event.touches : [event];
+ var e = touches[0].originalEvent || touches[0];
+ touchStartX = e.clientX;
+ touchStartY = e.clientY;
+ });
+
+ element.bind('touchmove', function(event) {
+ resetState();
+ });
+
+ element.bind('touchcancel', function(event) {
+ resetState();
+ });
+
+ element.bind('touchend', function(event) {
+ var diff = Date.now() - startTime;
+
+ var touches = (event.changedTouches && event.changedTouches.length) ? event.changedTouches :
+ ((event.touches && event.touches.length) ? event.touches : [event]);
+ var e = touches[0].originalEvent || touches[0];
+ var x = e.clientX;
+ var y = e.clientY;
+ var dist = Math.sqrt( Math.pow(x - touchStartX, 2) + Math.pow(y - touchStartY, 2) );
+
+ if (tapping && diff < TAP_DURATION && dist < MOVE_TOLERANCE) {
+ // Call preventGhostClick so the clickbuster will catch the corresponding click.
+ preventGhostClick(x, y);
+
+ // Blur the focused element (the button, probably) before firing the callback.
+ // This doesn't work perfectly on Android Chrome, but seems to work elsewhere.
+ // I couldn't get anything to work reliably on Android Chrome.
+ if (tapElement) {
+ tapElement.blur();
+ }
+
+ scope.$apply(function() {
+ // TODO(braden): This is sending the touchend, not a tap or click. Is that kosher?
+ clickHandler(scope, {$event: event});
+ });
+ }
+
+ resetState();
+ });
+
+ // Hack for iOS Safari's benefit. It goes searching for onclick handlers and is liable to click
+ // something else nearby.
+ element.onclick = function(event) { };
+
+ // Fallback click handler.
+ // Busted clicks don't get this far, and adding this handler allows ng-tap to be used on
+ // desktop as well, to allow more portable sites.
+ element.bind('click', function(event) {
+ scope.$apply(function() {
+ clickHandler(scope, {$event: event});
+ });
+ });
+
+/*
+ element.bind('mousedown', function(event) {
+ element.addClass(ACTIVE_CLASS_NAME);
+ });
+
+ element.bind('mousemove mouseup', function(event) {
+ element.removeClass(ACTIVE_CLASS_NAME);
+ });
+*/
+
+ };
+}]);
+
+/**
+ * @ngdoc directive
+ * @name ngMobile.directive:ngSwipeLeft
+ *
+ * @description
+ * Specify custom behavior when an element is swiped to the left on a touchscreen device.
+ * A leftward swipe is a quick, right-to-left slide of the finger.
+ * Though ngSwipeLeft is designed for touch-based devices, it will work with a mouse click and drag too.
+ *
+ * @element ANY
+ * @param {expression} ngSwipeLeft {@link guide/expression Expression} to evaluate
+ * upon left swipe. (Event object is available as `$event`)
+ *
+ * @example
+
+
+
+ Some list content, like an email in the inbox
+
+
+ Reply
+ Delete
+
+
+
+ */
+
+/**
+ * @ngdoc directive
+ * @name ngMobile.directive:ngSwipeRight
+ *
+ * @description
+ * Specify custom behavior when an element is swiped to the right on a touchscreen device.
+ * A rightward swipe is a quick, left-to-right slide of the finger.
+ * Though ngSwipeRight is designed for touch-based devices, it will work with a mouse click and drag too.
+ *
+ * @element ANY
+ * @param {expression} ngSwipeRight {@link guide/expression Expression} to evaluate
+ * upon right swipe. (Event object is available as `$event`)
+ *
+ * @example
+
+
+
+ Some list content, like an email in the inbox
+
+
+ Reply
+ Delete
+
+
+
+ */
+
+function makeSwipeDirective(directiveName, direction) {
+ ngMobile.directive(directiveName, ['$parse', function($parse) {
+ // The maximum vertical delta for a swipe should be less than 75px.
+ var MAX_VERTICAL_DISTANCE = 75;
+ // Vertical distance should not be more than a fraction of the horizontal distance.
+ var MAX_VERTICAL_RATIO = 0.3;
+ // At least a 30px lateral motion is necessary for a swipe.
+ var MIN_HORIZONTAL_DISTANCE = 30;
+ // The total distance in any direction before we make the call on swipe vs. scroll.
+ var MOVE_BUFFER_RADIUS = 10;
+
+ function getCoordinates(event) {
+ var touches = event.touches && event.touches.length ? event.touches : [event];
+ var e = (event.changedTouches && event.changedTouches[0]) ||
+ (event.originalEvent && event.originalEvent.changedTouches &&
+ event.originalEvent.changedTouches[0]) ||
+ touches[0].originalEvent || touches[0];
+
+ return {
+ x: e.clientX,
+ y: e.clientY
+ };
+ }
+
+ return function(scope, element, attr) {
+ var swipeHandler = $parse(attr[directiveName]);
+ var startCoords, valid;
+ var totalX, totalY;
+ var lastX, lastY;
+
+ function validSwipe(event) {
+ // Check that it's within the coordinates.
+ // Absolute vertical distance must be within tolerances.
+ // Horizontal distance, we take the current X - the starting X.
+ // This is negative for leftward swipes and positive for rightward swipes.
+ // After multiplying by the direction (-1 for left, +1 for right), legal swipes
+ // (ie. same direction as the directive wants) will have a positive delta and
+ // illegal ones a negative delta.
+ // Therefore this delta must be positive, and larger than the minimum.
+ if (!startCoords) return false;
+ var coords = getCoordinates(event);
+ var deltaY = Math.abs(coords.y - startCoords.y);
+ var deltaX = (coords.x - startCoords.x) * direction;
+ return valid && // Short circuit for already-invalidated swipes.
+ deltaY < MAX_VERTICAL_DISTANCE &&
+ deltaX > 0 &&
+ deltaX > MIN_HORIZONTAL_DISTANCE &&
+ deltaY / deltaX < MAX_VERTICAL_RATIO;
+ }
+
+ element.bind('touchstart mousedown', function(event) {
+ startCoords = getCoordinates(event);
+ valid = true;
+ totalX = 0;
+ totalY = 0;
+ lastX = startCoords.x;
+ lastY = startCoords.y;
+ });
+
+ element.bind('touchcancel', function(event) {
+ valid = false;
+ });
+
+ element.bind('touchmove mousemove', function(event) {
+ if (!valid) return;
+
+ // Android will send a touchcancel if it thinks we're starting to scroll.
+ // So when the total distance (+ or - or both) exceeds 10px in either direction,
+ // we either:
+ // - On totalX > totalY, we send preventDefault() and treat this as a swipe.
+ // - On totalY > totalX, we let the browser handle it as a scroll.
+
+ // Invalidate a touch while it's in progress if it strays too far away vertically.
+ // We don't want a scroll down and back up while drifting sideways to be a swipe just
+ // because you happened to end up vertically close in the end.
+ if (!startCoords) return;
+ var coords = getCoordinates(event);
+
+ if (Math.abs(coords.y - startCoords.y) > MAX_VERTICAL_DISTANCE) {
+ valid = false;
+ return;
+ }
+
+ totalX += Math.abs(coords.x - lastX);
+ totalY += Math.abs(coords.y - lastY);
+
+ lastX = coords.x;
+ lastY = coords.y;
+
+ if (totalX < MOVE_BUFFER_RADIUS && totalY < MOVE_BUFFER_RADIUS) {
+ return;
+ }
+
+ // One of totalX or totalY has exceeded the buffer, so decide on swipe vs. scroll.
+ if (totalY > totalX) {
+ valid = false;
+ return;
+ } else {
+ event.preventDefault();
+ }
+ });
+
+ element.bind('touchend mouseup', function(event) {
+ if (validSwipe(event)) {
+ // Prevent this swipe from bubbling up to any other elements with ngSwipes.
+ event.stopPropagation();
+ scope.$apply(function() {
+ swipeHandler(scope, {$event:event});
+ });
+ }
+ });
+ };
+ }]);
+}
+
+// Left is negative X-coordinate, right is positive.
+makeSwipeDirective('ngSwipeLeft', -1);
+makeSwipeDirective('ngSwipeRight', 1);
+
+
+
+})(window, window.angular);
diff --git a/OurUmbraco.Site/umbraco/lib/angular/1.1.5/angular-mobile.min.js b/OurUmbraco.Site/umbraco/lib/angular/1.1.5/angular-mobile.min.js
index bc777ea3..afac870a 100644
--- a/OurUmbraco.Site/umbraco/lib/angular/1.1.5/angular-mobile.min.js
+++ b/OurUmbraco.Site/umbraco/lib/angular/1.1.5/angular-mobile.min.js
@@ -1,11 +1,11 @@
-/*
- AngularJS v1.1.5
- (c) 2010-2012 Google, Inc. http://angularjs.org
- License: MIT
-*/
-(function(u,s){'use strict';function k(i,t){j.directive(i,["$parse",function(l){function g(b){var h=b.touches&&b.touches.length?b.touches:[b],b=b.changedTouches&&b.changedTouches[0]||b.originalEvent&&b.originalEvent.changedTouches&&b.originalEvent.changedTouches[0]||h[0].originalEvent||h[0];return{x:b.clientX,y:b.clientY}}var m=75,j=0.3,p=30;return function(b,h,n){function o(e){if(!a)return!1;var b=g(e),e=Math.abs(b.y-a.y),b=(b.x-a.x)*t;return c&&e0&&b>p&&e/bm?c=!1:(f+=Math.abs(d.x-q),e+=Math.abs(d.y-r),q=d.x,r=d.y,f<10&&e<10||(e>f?c=!1:b.preventDefault()))}});h.bind("touchend mouseup",function(a){o(a)&&(a.stopPropagation(),b.$apply(function(){d(b,{$event:a})}))})}}])}var j=s.module("ngMobile",[]);j.config(["$provide",function(i){i.decorator("ngClickDirective",["$delegate",function(i){i.shift();
-return i}])}]);j.directive("ngClick",["$parse","$timeout","$rootElement",function(i,j,l){function g(a,c,b){for(var e=0;eb)){var c=a.touches&&a.touches.length?a.touches:[a],f=c[0].clientX,c=c[0].clientY;!(f<1&&c<1)&&!g(d,f,c)&&(a.stopPropagation(),a.preventDefault())}}function k(a){var a=a.touches&&a.touches.length?a.touches:[a],c=a[0].clientX,f=a[0].clientY;d.push(c,f);j(function(){for(var a=
-0;a0&&b>p&&e/bm?c=!1:(f+=Math.abs(d.x-q),e+=Math.abs(d.y-r),q=d.x,r=d.y,f<10&&e<10||(e>f?c=!1:b.preventDefault()))}});h.bind("touchend mouseup",function(a){o(a)&&(a.stopPropagation(),b.$apply(function(){d(b,{$event:a})}))})}}])}var j=s.module("ngMobile",[]);j.config(["$provide",function(i){i.decorator("ngClickDirective",["$delegate",function(i){i.shift();
+return i}])}]);j.directive("ngClick",["$parse","$timeout","$rootElement",function(i,j,l){function g(a,c,b){for(var e=0;eb)){var c=a.touches&&a.touches.length?a.touches:[a],f=c[0].clientX,c=c[0].clientY;!(f<1&&c<1)&&!g(d,f,c)&&(a.stopPropagation(),a.preventDefault())}}function k(a){var a=a.touches&&a.touches.length?a.touches:[a],c=a[0].clientX,f=a[0].clientY;d.push(c,f);j(function(){for(var a=
+0;a
- * describe('$exceptionHandlerProvider', function() {
- *
- * it('should capture log messages and exceptions', function() {
- *
- * module(function($exceptionHandlerProvider) {
- * $exceptionHandlerProvider.mode('log');
- * });
- *
- * inject(function($log, $exceptionHandler, $timeout) {
- * $timeout(function() { $log.log(1); });
- * $timeout(function() { $log.log(2); throw 'banana peel'; });
- * $timeout(function() { $log.log(3); });
- * expect($exceptionHandler.errors).toEqual([]);
- * expect($log.assertEmpty());
- * $timeout.flush();
- * expect($exceptionHandler.errors).toEqual(['banana peel']);
- * expect($log.log.logs).toEqual([[1], [2], [3]]);
- * });
- * });
- * });
- *
- */
-
-angular.mock.$ExceptionHandlerProvider = function() {
- var handler;
-
- /**
- * @ngdoc method
- * @name ngMock.$exceptionHandlerProvider#mode
- * @methodOf ngMock.$exceptionHandlerProvider
- *
- * @description
- * Sets the logging mode.
- *
- * @param {string} mode Mode of operation, defaults to `rethrow`.
- *
- * - `rethrow`: If any errors are passed into the handler in tests, it typically
- * means that there is a bug in the application or test, so this mock will
- * make these tests fail.
- * - `log`: Sometimes it is desirable to test that an error is thrown, for this case the `log` mode stores an
- * array of errors in `$exceptionHandler.errors`, to allow later assertion of them.
- * See {@link ngMock.$log#assertEmpty assertEmpty()} and
- * {@link ngMock.$log#reset reset()}
- */
- this.mode = function(mode) {
- switch(mode) {
- case 'rethrow':
- handler = function(e) {
- throw e;
- };
- break;
- case 'log':
- var errors = [];
-
- handler = function(e) {
- if (arguments.length == 1) {
- errors.push(e);
- } else {
- errors.push([].slice.call(arguments, 0));
- }
- };
-
- handler.errors = errors;
- break;
- default:
- throw Error("Unknown mode '" + mode + "', only 'log'/'rethrow' modes are allowed!");
- }
- };
-
- this.$get = function() {
- return handler;
- };
-
- this.mode('rethrow');
-};
-
-
-/**
- * @ngdoc service
- * @name ngMock.$log
- *
- * @description
- * Mock implementation of {@link ng.$log} that gathers all logged messages in arrays
- * (one array per logging level). These arrays are exposed as `logs` property of each of the
- * level-specific log function, e.g. for level `error` the array is exposed as `$log.error.logs`.
- *
- */
-angular.mock.$LogProvider = function() {
-
- function concat(array1, array2, index) {
- return array1.concat(Array.prototype.slice.call(array2, index));
- }
-
-
- this.$get = function () {
- var $log = {
- log: function() { $log.log.logs.push(concat([], arguments, 0)); },
- warn: function() { $log.warn.logs.push(concat([], arguments, 0)); },
- info: function() { $log.info.logs.push(concat([], arguments, 0)); },
- error: function() { $log.error.logs.push(concat([], arguments, 0)); }
- };
-
- /**
- * @ngdoc method
- * @name ngMock.$log#reset
- * @methodOf ngMock.$log
- *
- * @description
- * Reset all of the logging arrays to empty.
- */
- $log.reset = function () {
- /**
- * @ngdoc property
- * @name ngMock.$log#log.logs
- * @propertyOf ngMock.$log
- *
- * @description
- * Array of messages logged using {@link ngMock.$log#log}.
- *
- * @example
- *
- * $log.log('Some Log');
- * var first = $log.log.logs.unshift();
- *
- */
- $log.log.logs = [];
- /**
- * @ngdoc property
- * @name ngMock.$log#warn.logs
- * @propertyOf ngMock.$log
- *
- * @description
- * Array of messages logged using {@link ngMock.$log#warn}.
- *
- * @example
- *
- * $log.warn('Some Warning');
- * var first = $log.warn.logs.unshift();
- *
- */
- $log.warn.logs = [];
- /**
- * @ngdoc property
- * @name ngMock.$log#info.logs
- * @propertyOf ngMock.$log
- *
- * @description
- * Array of messages logged using {@link ngMock.$log#info}.
- *
- * @example
- *
- * $log.info('Some Info');
- * var first = $log.info.logs.unshift();
- *
- */
- $log.info.logs = [];
- /**
- * @ngdoc property
- * @name ngMock.$log#error.logs
- * @propertyOf ngMock.$log
- *
- * @description
- * Array of messages logged using {@link ngMock.$log#error}.
- *
- * @example
- *
- * $log.log('Some Error');
- * var first = $log.error.logs.unshift();
- *
- */
- $log.error.logs = [];
- };
-
- /**
- * @ngdoc method
- * @name ngMock.$log#assertEmpty
- * @methodOf ngMock.$log
- *
- * @description
- * Assert that the all of the logging methods have no logged messages. If messages present, an exception is thrown.
- */
- $log.assertEmpty = function() {
- var errors = [];
- angular.forEach(['error', 'warn', 'info', 'log'], function(logLevel) {
- angular.forEach($log[logLevel].logs, function(log) {
- angular.forEach(log, function (logItem) {
- errors.push('MOCK $log (' + logLevel + '): ' + String(logItem) + '\n' + (logItem.stack || ''));
- });
- });
- });
- if (errors.length) {
- errors.unshift("Expected $log to be empty! Either a message was logged unexpectedly, or an expected " +
- "log message was not checked and removed:");
- errors.push('');
- throw new Error(errors.join('\n---------\n'));
- }
- };
-
- $log.reset();
- return $log;
- };
-};
-
-
-(function() {
- var R_ISO8061_STR = /^(\d{4})-?(\d\d)-?(\d\d)(?:T(\d\d)(?:\:?(\d\d)(?:\:?(\d\d)(?:\.(\d{3}))?)?)?(Z|([+-])(\d\d):?(\d\d)))?$/;
-
- function jsonStringToDate(string){
- var match;
- if (match = string.match(R_ISO8061_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;
- }
-
- function int(str) {
- return parseInt(str, 10);
- }
-
- 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;
- }
-
-
- /**
- * @ngdoc object
- * @name angular.mock.TzDate
- * @description
- *
- * *NOTE*: this is not an injectable instance, just a globally available mock class of `Date`.
- *
- * Mock of the Date type which has its timezone specified via constructor arg.
- *
- * The main purpose is to create Date-like instances with timezone fixed to the specified timezone
- * offset, so that we can test code that depends on local timezone settings without dependency on
- * the time zone settings of the machine where the code is running.
- *
- * @param {number} offset Offset of the *desired* timezone in hours (fractions will be honored)
- * @param {(number|string)} timestamp Timestamp representing the desired time in *UTC*
- *
- * @example
- * !!!! WARNING !!!!!
- * This is not a complete Date object so only methods that were implemented can be called safely.
- * To make matters worse, TzDate instances inherit stuff from Date via a prototype.
- *
- * We do our best to intercept calls to "unimplemented" methods, but since the list of methods is
- * incomplete we might be missing some non-standard methods. This can result in errors like:
- * "Date.prototype.foo called on incompatible Object".
- *
- *
- * var newYearInBratislava = new TzDate(-1, '2009-12-31T23:00:00Z');
- * newYearInBratislava.getTimezoneOffset() => -60;
- * newYearInBratislava.getFullYear() => 2010;
- * newYearInBratislava.getMonth() => 0;
- * newYearInBratislava.getDate() => 1;
- * newYearInBratislava.getHours() => 0;
- * newYearInBratislava.getMinutes() => 0;
- * newYearInBratislava.getSeconds() => 0;
- *
- *
- */
- angular.mock.TzDate = function (offset, timestamp) {
- var self = new Date(0);
- if (angular.isString(timestamp)) {
- var tsStr = timestamp;
-
- self.origDate = jsonStringToDate(timestamp);
-
- timestamp = self.origDate.getTime();
- if (isNaN(timestamp))
- throw {
- name: "Illegal Argument",
- message: "Arg '" + tsStr + "' passed into TzDate constructor is not a valid date string"
- };
- } else {
- self.origDate = new Date(timestamp);
- }
-
- var localOffset = new Date(timestamp).getTimezoneOffset();
- self.offsetDiff = localOffset*60*1000 - offset*1000*60*60;
- self.date = new Date(timestamp + self.offsetDiff);
-
- self.getTime = function() {
- return self.date.getTime() - self.offsetDiff;
- };
-
- self.toLocaleDateString = function() {
- return self.date.toLocaleDateString();
- };
-
- self.getFullYear = function() {
- return self.date.getFullYear();
- };
-
- self.getMonth = function() {
- return self.date.getMonth();
- };
-
- self.getDate = function() {
- return self.date.getDate();
- };
-
- self.getHours = function() {
- return self.date.getHours();
- };
-
- self.getMinutes = function() {
- return self.date.getMinutes();
- };
-
- self.getSeconds = function() {
- return self.date.getSeconds();
- };
-
- self.getMilliseconds = function() {
- return self.date.getMilliseconds();
- };
-
- self.getTimezoneOffset = function() {
- return offset * 60;
- };
-
- self.getUTCFullYear = function() {
- return self.origDate.getUTCFullYear();
- };
-
- self.getUTCMonth = function() {
- return self.origDate.getUTCMonth();
- };
-
- self.getUTCDate = function() {
- return self.origDate.getUTCDate();
- };
-
- self.getUTCHours = function() {
- return self.origDate.getUTCHours();
- };
-
- self.getUTCMinutes = function() {
- return self.origDate.getUTCMinutes();
- };
-
- self.getUTCSeconds = function() {
- return self.origDate.getUTCSeconds();
- };
-
- self.getUTCMilliseconds = function() {
- return self.origDate.getUTCMilliseconds();
- };
-
- self.getDay = function() {
- return self.date.getDay();
- };
-
- // provide this method only on browsers that already have it
- if (self.toISOString) {
- self.toISOString = function() {
- return padNumber(self.origDate.getUTCFullYear(), 4) + '-' +
- padNumber(self.origDate.getUTCMonth() + 1, 2) + '-' +
- padNumber(self.origDate.getUTCDate(), 2) + 'T' +
- padNumber(self.origDate.getUTCHours(), 2) + ':' +
- padNumber(self.origDate.getUTCMinutes(), 2) + ':' +
- padNumber(self.origDate.getUTCSeconds(), 2) + '.' +
- padNumber(self.origDate.getUTCMilliseconds(), 3) + 'Z'
- }
- }
-
- //hide all methods not implemented in this mock that the Date prototype exposes
- var unimplementedMethods = ['getUTCDay',
- 'getYear', 'setDate', 'setFullYear', 'setHours', 'setMilliseconds',
- 'setMinutes', 'setMonth', 'setSeconds', 'setTime', 'setUTCDate', 'setUTCFullYear',
- 'setUTCHours', 'setUTCMilliseconds', 'setUTCMinutes', 'setUTCMonth', 'setUTCSeconds',
- 'setYear', 'toDateString', 'toGMTString', 'toJSON', 'toLocaleFormat', 'toLocaleString',
- 'toLocaleTimeString', 'toSource', 'toString', 'toTimeString', 'toUTCString', 'valueOf'];
-
- angular.forEach(unimplementedMethods, function(methodName) {
- self[methodName] = function() {
- throw Error("Method '" + methodName + "' is not implemented in the TzDate mock");
- };
- });
-
- return self;
- };
-
- //make "tzDateInstance instanceof Date" return true
- angular.mock.TzDate.prototype = Date.prototype;
-})();
-
-/**
- * @ngdoc function
- * @name angular.mock.createMockWindow
- * @description
- *
- * This function creates a mock window object useful for controlling access ot setTimeout, but mocking out
- * sufficient window's properties to allow Angular to execute.
- *
- * @example
- *
- *
- beforeEach(module(function($provide) {
- $provide.value('$window', window = angular.mock.createMockWindow());
- }));
-
- it('should do something', inject(function($window) {
- var val = null;
- $window.setTimeout(function() { val = 123; }, 10);
- expect(val).toEqual(null);
- window.setTimeout.expect(10).process();
- expect(val).toEqual(123);
- });
- *
- *
- */
-angular.mock.createMockWindow = function() {
- var mockWindow = {};
- var setTimeoutQueue = [];
-
- mockWindow.document = window.document;
- mockWindow.getComputedStyle = angular.bind(window, window.getComputedStyle);
- mockWindow.scrollTo = angular.bind(window, window.scrollTo);
- mockWindow.navigator = window.navigator;
- mockWindow.setTimeout = function(fn, delay) {
- setTimeoutQueue.push({fn: fn, delay: delay});
- };
- mockWindow.setTimeout.queue = setTimeoutQueue;
- mockWindow.setTimeout.expect = function(delay) {
- if (setTimeoutQueue.length > 0) {
- return {
- process: function() {
- var tick = setTimeoutQueue.shift();
- expect(tick.delay).toEqual(delay);
- tick.fn();
- }
- };
- } else {
- expect('SetTimoutQueue empty. Expecting delay of ').toEqual(delay);
- }
- };
-
- return mockWindow;
-};
-
-/**
- * @ngdoc function
- * @name angular.mock.dump
- * @description
- *
- * *NOTE*: this is not an injectable instance, just a globally available function.
- *
- * Method for serializing common angular objects (scope, elements, etc..) into strings, useful for debugging.
- *
- * This method is also available on window, where it can be used to display objects on debug console.
- *
- * @param {*} object - any object to turn into string.
- * @return {string} a serialized string of the argument
- */
-angular.mock.dump = function(object) {
- return serialize(object);
-
- function serialize(object) {
- var out;
-
- if (angular.isElement(object)) {
- object = angular.element(object);
- out = angular.element('
');
- angular.forEach(object, function(element) {
- out.append(angular.element(element).clone());
- });
- out = out.html();
- } else if (angular.isArray(object)) {
- out = [];
- angular.forEach(object, function(o) {
- out.push(serialize(o));
- });
- out = '[ ' + out.join(', ') + ' ]';
- } else if (angular.isObject(object)) {
- if (angular.isFunction(object.$eval) && angular.isFunction(object.$apply)) {
- out = serializeScope(object);
- } else if (object instanceof Error) {
- out = object.stack || ('' + object.name + ': ' + object.message);
- } else {
- out = angular.toJson(object, true);
- }
- } else {
- out = String(object);
- }
-
- return out;
- }
-
- function serializeScope(scope, offset) {
- offset = offset || ' ';
- var log = [offset + 'Scope(' + scope.$id + '): {'];
- for ( var key in scope ) {
- if (scope.hasOwnProperty(key) && !key.match(/^(\$|this)/)) {
- log.push(' ' + key + ': ' + angular.toJson(scope[key]));
- }
- }
- var child = scope.$$childHead;
- while(child) {
- log.push(serializeScope(child, offset + ' '));
- child = child.$$nextSibling;
- }
- log.push('}');
- return log.join('\n' + offset);
- }
-};
-
-/**
- * @ngdoc object
- * @name ngMock.$httpBackend
- * @description
- * Fake HTTP backend implementation suitable for unit testing applications that use the
- * {@link ng.$http $http service}.
- *
- * *Note*: For fake HTTP backend implementation suitable for end-to-end testing or backend-less
- * development please see {@link ngMockE2E.$httpBackend e2e $httpBackend mock}.
- *
- * During unit testing, we want our unit tests to run quickly and have no external dependencies so
- * we don’t want to send {@link https://developer.mozilla.org/en/xmlhttprequest XHR} or
- * {@link http://en.wikipedia.org/wiki/JSONP JSONP} requests to a real server. All we really need is
- * to verify whether a certain request has been sent or not, or alternatively just let the
- * application make requests, respond with pre-trained responses and assert that the end result is
- * what we expect it to be.
- *
- * This mock implementation can be used to respond with static or dynamic responses via the
- * `expect` and `when` apis and their shortcuts (`expectGET`, `whenPOST`, etc).
- *
- * When an Angular application needs some data from a server, it calls the $http service, which
- * sends the request to a real server using $httpBackend service. With dependency injection, it is
- * easy to inject $httpBackend mock (which has the same API as $httpBackend) and use it to verify
- * the requests and respond with some testing data without sending a request to real server.
- *
- * There are two ways to specify what test data should be returned as http responses by the mock
- * backend when the code under test makes http requests:
- *
- * - `$httpBackend.expect` - specifies a request expectation
- * - `$httpBackend.when` - specifies a backend definition
- *
- *
- * # Request Expectations vs Backend Definitions
- *
- * Request expectations provide a way to make assertions about requests made by the application and
- * to define responses for those requests. The test will fail if the expected requests are not made
- * or they are made in the wrong order.
- *
- * Backend definitions allow you to define a fake backend for your application which doesn't assert
- * if a particular request was made or not, it just returns a trained response if a request is made.
- * The test will pass whether or not the request gets made during testing.
- *
- *
- *
- * Request expectations Backend definitions
- *
- * Syntax
- * .expect(...).respond(...)
- * .when(...).respond(...)
- *
- *
- * Typical usage
- * strict unit tests
- * loose (black-box) unit testing
- *
- *
- * Fulfills multiple requests
- * NO
- * YES
- *
- *
- * Order of requests matters
- * YES
- * NO
- *
- *
- * Request required
- * YES
- * NO
- *
- *
- * Response required
- * optional (see below)
- * YES
- *
- *
- *
- * In cases where both backend definitions and request expectations are specified during unit
- * testing, the request expectations are evaluated first.
- *
- * If a request expectation has no response specified, the algorithm will search your backend
- * definitions for an appropriate response.
- *
- * If a request didn't match any expectation or if the expectation doesn't have the response
- * defined, the backend definitions are evaluated in sequential order to see if any of them match
- * the request. The response from the first matched definition is returned.
- *
- *
- * # Flushing HTTP requests
- *
- * The $httpBackend used in production, always responds to requests with responses asynchronously.
- * If we preserved this behavior in unit testing, we'd have to create async unit tests, which are
- * hard to write, follow and maintain. At the same time the testing mock, can't respond
- * synchronously because that would change the execution of the code under test. For this reason the
- * mock $httpBackend has a `flush()` method, which allows the test to explicitly flush pending
- * requests and thus preserving the async api of the backend, while allowing the test to execute
- * synchronously.
- *
- *
- * # Unit testing with mock $httpBackend
- *
- *
- // controller
- function MyController($scope, $http) {
- $http.get('/auth.py').success(function(data) {
- $scope.user = data;
- });
-
- this.saveMessage = function(message) {
- $scope.status = 'Saving...';
- $http.post('/add-msg.py', message).success(function(response) {
- $scope.status = '';
- }).error(function() {
- $scope.status = 'ERROR!';
- });
- };
- }
-
- // testing controller
- var $httpBackend;
-
- beforeEach(inject(function($injector) {
- $httpBackend = $injector.get('$httpBackend');
-
- // backend definition common for all tests
- $httpBackend.when('GET', '/auth.py').respond({userId: 'userX'}, {'A-Token': 'xxx'});
- }));
-
-
- afterEach(function() {
- $httpBackend.verifyNoOutstandingExpectation();
- $httpBackend.verifyNoOutstandingRequest();
- });
-
-
- it('should fetch authentication token', function() {
- $httpBackend.expectGET('/auth.py');
- var controller = scope.$new(MyController);
- $httpBackend.flush();
- });
-
-
- it('should send msg to server', function() {
- // now you don’t care about the authentication, but
- // the controller will still send the request and
- // $httpBackend will respond without you having to
- // specify the expectation and response for this request
- $httpBackend.expectPOST('/add-msg.py', 'message content').respond(201, '');
-
- var controller = scope.$new(MyController);
- $httpBackend.flush();
- controller.saveMessage('message content');
- expect(controller.status).toBe('Saving...');
- $httpBackend.flush();
- expect(controller.status).toBe('');
- });
-
-
- it('should send auth header', function() {
- $httpBackend.expectPOST('/add-msg.py', undefined, function(headers) {
- // check if the header was send, if it wasn't the expectation won't
- // match the request and the test will fail
- return headers['Authorization'] == 'xxx';
- }).respond(201, '');
-
- var controller = scope.$new(MyController);
- controller.saveMessage('whatever');
- $httpBackend.flush();
- });
-
- */
-angular.mock.$HttpBackendProvider = function() {
- this.$get = ['$rootScope', createHttpBackendMock];
-};
-
-/**
- * General factory function for $httpBackend mock.
- * Returns instance for unit testing (when no arguments specified):
- * - passing through is disabled
- * - auto flushing is disabled
- *
- * Returns instance for e2e testing (when `$delegate` and `$browser` specified):
- * - passing through (delegating request to real backend) is enabled
- * - auto flushing is enabled
- *
- * @param {Object=} $delegate Real $httpBackend instance (allow passing through if specified)
- * @param {Object=} $browser Auto-flushing enabled if specified
- * @return {Object} Instance of $httpBackend mock
- */
-function createHttpBackendMock($rootScope, $delegate, $browser) {
- var definitions = [],
- expectations = [],
- responses = [],
- responsesPush = angular.bind(responses, responses.push);
-
- function createResponse(status, data, headers) {
- if (angular.isFunction(status)) return status;
-
- return function() {
- return angular.isNumber(status)
- ? [status, data, headers]
- : [200, status, data];
- };
- }
-
- // TODO(vojta): change params to: method, url, data, headers, callback
- function $httpBackend(method, url, data, callback, headers, timeout) {
- var xhr = new MockXhr(),
- expectation = expectations[0],
- wasExpected = false;
-
- function prettyPrint(data) {
- return (angular.isString(data) || angular.isFunction(data) || data instanceof RegExp)
- ? data
- : angular.toJson(data);
- }
-
- function wrapResponse(wrapped) {
- if (!$browser && timeout && timeout.then) timeout.then(handleTimeout);
-
- return handleResponse;
-
- function handleResponse() {
- var response = wrapped.response(method, url, data, headers);
- xhr.$$respHeaders = response[2];
- callback(response[0], response[1], xhr.getAllResponseHeaders());
- }
-
- function handleTimeout() {
- for (var i = 0, ii = responses.length; i < ii; i++) {
- if (responses[i] === handleResponse) {
- responses.splice(i, 1);
- callback(-1, undefined, '');
- break;
- }
- }
- }
- }
-
- if (expectation && expectation.match(method, url)) {
- if (!expectation.matchData(data))
- throw Error('Expected ' + expectation + ' with different data\n' +
- 'EXPECTED: ' + prettyPrint(expectation.data) + '\nGOT: ' + data);
-
- if (!expectation.matchHeaders(headers))
- throw Error('Expected ' + expectation + ' with different headers\n' +
- 'EXPECTED: ' + prettyPrint(expectation.headers) + '\nGOT: ' +
- prettyPrint(headers));
-
- expectations.shift();
-
- if (expectation.response) {
- responses.push(wrapResponse(expectation));
- return;
- }
- wasExpected = true;
- }
-
- var i = -1, definition;
- while ((definition = definitions[++i])) {
- if (definition.match(method, url, data, headers || {})) {
- if (definition.response) {
- // if $browser specified, we do auto flush all requests
- ($browser ? $browser.defer : responsesPush)(wrapResponse(definition));
- } else if (definition.passThrough) {
- $delegate(method, url, data, callback, headers, timeout);
- } else throw Error('No response defined !');
- return;
- }
- }
- throw wasExpected ?
- Error('No response defined !') :
- Error('Unexpected request: ' + method + ' ' + url + '\n' +
- (expectation ? 'Expected ' + expectation : 'No more request expected'));
- }
-
- /**
- * @ngdoc method
- * @name ngMock.$httpBackend#when
- * @methodOf ngMock.$httpBackend
- * @description
- * Creates a new backend definition.
- *
- * @param {string} method HTTP method.
- * @param {string|RegExp} url HTTP url.
- * @param {(string|RegExp)=} data HTTP request body.
- * @param {(Object|function(Object))=} headers HTTP headers or function that receives http header
- * object and returns true if the headers match the current definition.
- * @returns {requestHandler} Returns an object with `respond` method that control how a matched
- * request is handled.
- *
- * - respond – `{function([status,] data[, headers])|function(function(method, url, data, headers)}`
- * – The respond method takes a set of static data to be returned or a function that can return
- * an array containing response status (number), response data (string) and response headers
- * (Object).
- */
- $httpBackend.when = function(method, url, data, headers) {
- var definition = new MockHttpExpectation(method, url, data, headers),
- chain = {
- respond: function(status, data, headers) {
- definition.response = createResponse(status, data, headers);
- }
- };
-
- if ($browser) {
- chain.passThrough = function() {
- definition.passThrough = true;
- };
- }
-
- definitions.push(definition);
- return chain;
- };
-
- /**
- * @ngdoc method
- * @name ngMock.$httpBackend#whenGET
- * @methodOf ngMock.$httpBackend
- * @description
- * Creates a new backend definition for GET requests. For more info see `when()`.
- *
- * @param {string|RegExp} url HTTP url.
- * @param {(Object|function(Object))=} headers HTTP headers.
- * @returns {requestHandler} Returns an object with `respond` method that control how a matched
- * request is handled.
- */
-
- /**
- * @ngdoc method
- * @name ngMock.$httpBackend#whenHEAD
- * @methodOf ngMock.$httpBackend
- * @description
- * Creates a new backend definition for HEAD requests. For more info see `when()`.
- *
- * @param {string|RegExp} url HTTP url.
- * @param {(Object|function(Object))=} headers HTTP headers.
- * @returns {requestHandler} Returns an object with `respond` method that control how a matched
- * request is handled.
- */
-
- /**
- * @ngdoc method
- * @name ngMock.$httpBackend#whenDELETE
- * @methodOf ngMock.$httpBackend
- * @description
- * Creates a new backend definition for DELETE requests. For more info see `when()`.
- *
- * @param {string|RegExp} url HTTP url.
- * @param {(Object|function(Object))=} headers HTTP headers.
- * @returns {requestHandler} Returns an object with `respond` method that control how a matched
- * request is handled.
- */
-
- /**
- * @ngdoc method
- * @name ngMock.$httpBackend#whenPOST
- * @methodOf ngMock.$httpBackend
- * @description
- * Creates a new backend definition for POST requests. For more info see `when()`.
- *
- * @param {string|RegExp} url HTTP url.
- * @param {(string|RegExp)=} data HTTP request body.
- * @param {(Object|function(Object))=} headers HTTP headers.
- * @returns {requestHandler} Returns an object with `respond` method that control how a matched
- * request is handled.
- */
-
- /**
- * @ngdoc method
- * @name ngMock.$httpBackend#whenPUT
- * @methodOf ngMock.$httpBackend
- * @description
- * Creates a new backend definition for PUT requests. For more info see `when()`.
- *
- * @param {string|RegExp} url HTTP url.
- * @param {(string|RegExp)=} data HTTP request body.
- * @param {(Object|function(Object))=} headers HTTP headers.
- * @returns {requestHandler} Returns an object with `respond` method that control how a matched
- * request is handled.
- */
-
- /**
- * @ngdoc method
- * @name ngMock.$httpBackend#whenJSONP
- * @methodOf ngMock.$httpBackend
- * @description
- * Creates a new backend definition for JSONP requests. For more info see `when()`.
- *
- * @param {string|RegExp} url HTTP url.
- * @returns {requestHandler} Returns an object with `respond` method that control how a matched
- * request is handled.
- */
- createShortMethods('when');
-
-
- /**
- * @ngdoc method
- * @name ngMock.$httpBackend#expect
- * @methodOf ngMock.$httpBackend
- * @description
- * Creates a new request expectation.
- *
- * @param {string} method HTTP method.
- * @param {string|RegExp} url HTTP url.
- * @param {(string|RegExp)=} data HTTP request body.
- * @param {(Object|function(Object))=} headers HTTP headers or function that receives http header
- * object and returns true if the headers match the current expectation.
- * @returns {requestHandler} Returns an object with `respond` method that control how a matched
- * request is handled.
- *
- * - respond – `{function([status,] data[, headers])|function(function(method, url, data, headers)}`
- * – The respond method takes a set of static data to be returned or a function that can return
- * an array containing response status (number), response data (string) and response headers
- * (Object).
- */
- $httpBackend.expect = function(method, url, data, headers) {
- var expectation = new MockHttpExpectation(method, url, data, headers);
- expectations.push(expectation);
- return {
- respond: function(status, data, headers) {
- expectation.response = createResponse(status, data, headers);
- }
- };
- };
-
-
- /**
- * @ngdoc method
- * @name ngMock.$httpBackend#expectGET
- * @methodOf ngMock.$httpBackend
- * @description
- * Creates a new request expectation for GET requests. For more info see `expect()`.
- *
- * @param {string|RegExp} url HTTP url.
- * @param {Object=} headers HTTP headers.
- * @returns {requestHandler} Returns an object with `respond` method that control how a matched
- * request is handled. See #expect for more info.
- */
-
- /**
- * @ngdoc method
- * @name ngMock.$httpBackend#expectHEAD
- * @methodOf ngMock.$httpBackend
- * @description
- * Creates a new request expectation for HEAD requests. For more info see `expect()`.
- *
- * @param {string|RegExp} url HTTP url.
- * @param {Object=} headers HTTP headers.
- * @returns {requestHandler} Returns an object with `respond` method that control how a matched
- * request is handled.
- */
-
- /**
- * @ngdoc method
- * @name ngMock.$httpBackend#expectDELETE
- * @methodOf ngMock.$httpBackend
- * @description
- * Creates a new request expectation for DELETE requests. For more info see `expect()`.
- *
- * @param {string|RegExp} url HTTP url.
- * @param {Object=} headers HTTP headers.
- * @returns {requestHandler} Returns an object with `respond` method that control how a matched
- * request is handled.
- */
-
- /**
- * @ngdoc method
- * @name ngMock.$httpBackend#expectPOST
- * @methodOf ngMock.$httpBackend
- * @description
- * Creates a new request expectation for POST requests. For more info see `expect()`.
- *
- * @param {string|RegExp} url HTTP url.
- * @param {(string|RegExp)=} data HTTP request body.
- * @param {Object=} headers HTTP headers.
- * @returns {requestHandler} Returns an object with `respond` method that control how a matched
- * request is handled.
- */
-
- /**
- * @ngdoc method
- * @name ngMock.$httpBackend#expectPUT
- * @methodOf ngMock.$httpBackend
- * @description
- * Creates a new request expectation for PUT requests. For more info see `expect()`.
- *
- * @param {string|RegExp} url HTTP url.
- * @param {(string|RegExp)=} data HTTP request body.
- * @param {Object=} headers HTTP headers.
- * @returns {requestHandler} Returns an object with `respond` method that control how a matched
- * request is handled.
- */
-
- /**
- * @ngdoc method
- * @name ngMock.$httpBackend#expectPATCH
- * @methodOf ngMock.$httpBackend
- * @description
- * Creates a new request expectation for PATCH requests. For more info see `expect()`.
- *
- * @param {string|RegExp} url HTTP url.
- * @param {(string|RegExp)=} data HTTP request body.
- * @param {Object=} headers HTTP headers.
- * @returns {requestHandler} Returns an object with `respond` method that control how a matched
- * request is handled.
- */
-
- /**
- * @ngdoc method
- * @name ngMock.$httpBackend#expectJSONP
- * @methodOf ngMock.$httpBackend
- * @description
- * Creates a new request expectation for JSONP requests. For more info see `expect()`.
- *
- * @param {string|RegExp} url HTTP url.
- * @returns {requestHandler} Returns an object with `respond` method that control how a matched
- * request is handled.
- */
- createShortMethods('expect');
-
-
- /**
- * @ngdoc method
- * @name ngMock.$httpBackend#flush
- * @methodOf ngMock.$httpBackend
- * @description
- * Flushes all pending requests using the trained responses.
- *
- * @param {number=} count Number of responses to flush (in the order they arrived). If undefined,
- * all pending requests will be flushed. If there are no pending requests when the flush method
- * is called an exception is thrown (as this typically a sign of programming error).
- */
- $httpBackend.flush = function(count) {
- $rootScope.$digest();
- if (!responses.length) throw Error('No pending request to flush !');
-
- if (angular.isDefined(count)) {
- while (count--) {
- if (!responses.length) throw Error('No more pending request to flush !');
- responses.shift()();
- }
- } else {
- while (responses.length) {
- responses.shift()();
- }
- }
- $httpBackend.verifyNoOutstandingExpectation();
- };
-
-
- /**
- * @ngdoc method
- * @name ngMock.$httpBackend#verifyNoOutstandingExpectation
- * @methodOf ngMock.$httpBackend
- * @description
- * Verifies that all of the requests defined via the `expect` api were made. If any of the
- * requests were not made, verifyNoOutstandingExpectation throws an exception.
- *
- * Typically, you would call this method following each test case that asserts requests using an
- * "afterEach" clause.
- *
- *
- * afterEach($httpBackend.verifyExpectations);
- *
- */
- $httpBackend.verifyNoOutstandingExpectation = function() {
- $rootScope.$digest();
- if (expectations.length) {
- throw Error('Unsatisfied requests: ' + expectations.join(', '));
- }
- };
-
-
- /**
- * @ngdoc method
- * @name ngMock.$httpBackend#verifyNoOutstandingRequest
- * @methodOf ngMock.$httpBackend
- * @description
- * Verifies that there are no outstanding requests that need to be flushed.
- *
- * Typically, you would call this method following each test case that asserts requests using an
- * "afterEach" clause.
- *
- *
- * afterEach($httpBackend.verifyNoOutstandingRequest);
- *
- */
- $httpBackend.verifyNoOutstandingRequest = function() {
- if (responses.length) {
- throw Error('Unflushed requests: ' + responses.length);
- }
- };
-
-
- /**
- * @ngdoc method
- * @name ngMock.$httpBackend#resetExpectations
- * @methodOf ngMock.$httpBackend
- * @description
- * Resets all request expectations, but preserves all backend definitions. Typically, you would
- * call resetExpectations during a multiple-phase test when you want to reuse the same instance of
- * $httpBackend mock.
- */
- $httpBackend.resetExpectations = function() {
- expectations.length = 0;
- responses.length = 0;
- };
-
- return $httpBackend;
-
-
- function createShortMethods(prefix) {
- angular.forEach(['GET', 'DELETE', 'JSONP'], function(method) {
- $httpBackend[prefix + method] = function(url, headers) {
- return $httpBackend[prefix](method, url, undefined, headers)
- }
- });
-
- angular.forEach(['PUT', 'POST', 'PATCH'], function(method) {
- $httpBackend[prefix + method] = function(url, data, headers) {
- return $httpBackend[prefix](method, url, data, headers)
- }
- });
- }
-}
-
-function MockHttpExpectation(method, url, data, headers) {
-
- this.data = data;
- this.headers = headers;
-
- this.match = function(m, u, d, h) {
- if (method != m) return false;
- if (!this.matchUrl(u)) return false;
- if (angular.isDefined(d) && !this.matchData(d)) return false;
- if (angular.isDefined(h) && !this.matchHeaders(h)) return false;
- return true;
- };
-
- this.matchUrl = function(u) {
- if (!url) return true;
- if (angular.isFunction(url.test)) return url.test(u);
- return url == u;
- };
-
- this.matchHeaders = function(h) {
- if (angular.isUndefined(headers)) return true;
- if (angular.isFunction(headers)) return headers(h);
- return angular.equals(headers, h);
- };
-
- this.matchData = function(d) {
- if (angular.isUndefined(data)) return true;
- if (data && angular.isFunction(data.test)) return data.test(d);
- if (data && !angular.isString(data)) return angular.toJson(data) == d;
- return data == d;
- };
-
- this.toString = function() {
- return method + ' ' + url;
- };
-}
-
-function MockXhr() {
-
- // hack for testing $http, $httpBackend
- MockXhr.$$lastInstance = this;
-
- this.open = function(method, url, async) {
- this.$$method = method;
- this.$$url = url;
- this.$$async = async;
- this.$$reqHeaders = {};
- this.$$respHeaders = {};
- };
-
- this.send = function(data) {
- this.$$data = data;
- };
-
- this.setRequestHeader = function(key, value) {
- this.$$reqHeaders[key] = value;
- };
-
- this.getResponseHeader = function(name) {
- // the lookup must be case insensitive, that's why we try two quick lookups and full scan at last
- var header = this.$$respHeaders[name];
- if (header) return header;
-
- name = angular.lowercase(name);
- header = this.$$respHeaders[name];
- if (header) return header;
-
- header = undefined;
- angular.forEach(this.$$respHeaders, function(headerVal, headerName) {
- if (!header && angular.lowercase(headerName) == name) header = headerVal;
- });
- return header;
- };
-
- this.getAllResponseHeaders = function() {
- var lines = [];
-
- angular.forEach(this.$$respHeaders, function(value, key) {
- lines.push(key + ': ' + value);
- });
- return lines.join('\n');
- };
-
- this.abort = angular.noop;
-}
-
-
-/**
- * @ngdoc function
- * @name ngMock.$timeout
- * @description
- *
- * This service is just a simple decorator for {@link ng.$timeout $timeout} service
- * that adds a "flush" and "verifyNoPendingTasks" methods.
- */
-
-angular.mock.$TimeoutDecorator = function($delegate, $browser) {
-
- /**
- * @ngdoc method
- * @name ngMock.$timeout#flush
- * @methodOf ngMock.$timeout
- * @description
- *
- * Flushes the queue of pending tasks.
- */
- $delegate.flush = function() {
- $browser.defer.flush();
- };
-
- /**
- * @ngdoc method
- * @name ngMock.$timeout#verifyNoPendingTasks
- * @methodOf ngMock.$timeout
- * @description
- *
- * Verifies that there are no pending tasks that need to be flushed.
- */
- $delegate.verifyNoPendingTasks = function() {
- if ($browser.deferredFns.length) {
- throw Error('Deferred tasks to flush (' + $browser.deferredFns.length + '): ' +
- formatPendingTasksAsString($browser.deferredFns));
- }
- };
-
- function formatPendingTasksAsString(tasks) {
- var result = [];
- angular.forEach(tasks, function(task) {
- result.push('{id: ' + task.id + ', ' + 'time: ' + task.time + '}');
- });
-
- return result.join(', ');
- }
-
- return $delegate;
-};
-
-/**
- *
- */
-angular.mock.$RootElementProvider = function() {
- this.$get = function() {
- return angular.element('
');
- }
-};
-
-/**
- * @ngdoc overview
- * @name ngMock
- * @description
- *
- * The `ngMock` is an angular module which is used with `ng` module and adds unit-test configuration as well as useful
- * mocks to the {@link AUTO.$injector $injector}.
- */
-angular.module('ngMock', ['ng']).provider({
- $browser: angular.mock.$BrowserProvider,
- $exceptionHandler: angular.mock.$ExceptionHandlerProvider,
- $log: angular.mock.$LogProvider,
- $httpBackend: angular.mock.$HttpBackendProvider,
- $rootElement: angular.mock.$RootElementProvider
-}).config(function($provide) {
- $provide.decorator('$timeout', angular.mock.$TimeoutDecorator);
-});
-
-/**
- * @ngdoc overview
- * @name ngMockE2E
- * @description
- *
- * The `ngMockE2E` is an angular module which contains mocks suitable for end-to-end testing.
- * Currently there is only one mock present in this module -
- * the {@link ngMockE2E.$httpBackend e2e $httpBackend} mock.
- */
-angular.module('ngMockE2E', ['ng']).config(function($provide) {
- $provide.decorator('$httpBackend', angular.mock.e2e.$httpBackendDecorator);
-});
-
-/**
- * @ngdoc object
- * @name ngMockE2E.$httpBackend
- * @description
- * Fake HTTP backend implementation suitable for end-to-end testing or backend-less development of
- * applications that use the {@link ng.$http $http service}.
- *
- * *Note*: For fake http backend implementation suitable for unit testing please see
- * {@link ngMock.$httpBackend unit-testing $httpBackend mock}.
- *
- * This implementation can be used to respond with static or dynamic responses via the `when` api
- * and its shortcuts (`whenGET`, `whenPOST`, etc) and optionally pass through requests to the
- * real $httpBackend for specific requests (e.g. to interact with certain remote apis or to fetch
- * templates from a webserver).
- *
- * As opposed to unit-testing, in an end-to-end testing scenario or in scenario when an application
- * is being developed with the real backend api replaced with a mock, it is often desirable for
- * certain category of requests to bypass the mock and issue a real http request (e.g. to fetch
- * templates or static files from the webserver). To configure the backend with this behavior
- * use the `passThrough` request handler of `when` instead of `respond`.
- *
- * Additionally, we don't want to manually have to flush mocked out requests like we do during unit
- * testing. For this reason the e2e $httpBackend automatically flushes mocked out requests
- * automatically, closely simulating the behavior of the XMLHttpRequest object.
- *
- * To setup the application to run with this http backend, you have to create a module that depends
- * on the `ngMockE2E` and your application modules and defines the fake backend:
- *
- *
- * myAppDev = angular.module('myAppDev', ['myApp', 'ngMockE2E']);
- * myAppDev.run(function($httpBackend) {
- * phones = [{name: 'phone1'}, {name: 'phone2'}];
- *
- * // returns the current list of phones
- * $httpBackend.whenGET('/phones').respond(phones);
- *
- * // adds a new phone to the phones array
- * $httpBackend.whenPOST('/phones').respond(function(method, url, data) {
- * phones.push(angular.fromJSON(data));
- * });
- * $httpBackend.whenGET(/^\/templates\//).passThrough();
- * //...
- * });
- *
- *
- * Afterwards, bootstrap your app with this new module.
- */
-
-/**
- * @ngdoc method
- * @name ngMockE2E.$httpBackend#when
- * @methodOf ngMockE2E.$httpBackend
- * @description
- * Creates a new backend definition.
- *
- * @param {string} method HTTP method.
- * @param {string|RegExp} url HTTP url.
- * @param {(string|RegExp)=} data HTTP request body.
- * @param {(Object|function(Object))=} headers HTTP headers or function that receives http header
- * object and returns true if the headers match the current definition.
- * @returns {requestHandler} Returns an object with `respond` and `passThrough` methods that
- * control how a matched request is handled.
- *
- * - respond – `{function([status,] data[, headers])|function(function(method, url, data, headers)}`
- * – The respond method takes a set of static data to be returned or a function that can return
- * an array containing response status (number), response data (string) and response headers
- * (Object).
- * - passThrough – `{function()}` – Any request matching a backend definition with `passThrough`
- * handler, will be pass through to the real backend (an XHR request will be made to the
- * server.
- */
-
-/**
- * @ngdoc method
- * @name ngMockE2E.$httpBackend#whenGET
- * @methodOf ngMockE2E.$httpBackend
- * @description
- * Creates a new backend definition for GET requests. For more info see `when()`.
- *
- * @param {string|RegExp} url HTTP url.
- * @param {(Object|function(Object))=} headers HTTP headers.
- * @returns {requestHandler} Returns an object with `respond` and `passThrough` methods that
- * control how a matched request is handled.
- */
-
-/**
- * @ngdoc method
- * @name ngMockE2E.$httpBackend#whenHEAD
- * @methodOf ngMockE2E.$httpBackend
- * @description
- * Creates a new backend definition for HEAD requests. For more info see `when()`.
- *
- * @param {string|RegExp} url HTTP url.
- * @param {(Object|function(Object))=} headers HTTP headers.
- * @returns {requestHandler} Returns an object with `respond` and `passThrough` methods that
- * control how a matched request is handled.
- */
-
-/**
- * @ngdoc method
- * @name ngMockE2E.$httpBackend#whenDELETE
- * @methodOf ngMockE2E.$httpBackend
- * @description
- * Creates a new backend definition for DELETE requests. For more info see `when()`.
- *
- * @param {string|RegExp} url HTTP url.
- * @param {(Object|function(Object))=} headers HTTP headers.
- * @returns {requestHandler} Returns an object with `respond` and `passThrough` methods that
- * control how a matched request is handled.
- */
-
-/**
- * @ngdoc method
- * @name ngMockE2E.$httpBackend#whenPOST
- * @methodOf ngMockE2E.$httpBackend
- * @description
- * Creates a new backend definition for POST requests. For more info see `when()`.
- *
- * @param {string|RegExp} url HTTP url.
- * @param {(string|RegExp)=} data HTTP request body.
- * @param {(Object|function(Object))=} headers HTTP headers.
- * @returns {requestHandler} Returns an object with `respond` and `passThrough` methods that
- * control how a matched request is handled.
- */
-
-/**
- * @ngdoc method
- * @name ngMockE2E.$httpBackend#whenPUT
- * @methodOf ngMockE2E.$httpBackend
- * @description
- * Creates a new backend definition for PUT requests. For more info see `when()`.
- *
- * @param {string|RegExp} url HTTP url.
- * @param {(string|RegExp)=} data HTTP request body.
- * @param {(Object|function(Object))=} headers HTTP headers.
- * @returns {requestHandler} Returns an object with `respond` and `passThrough` methods that
- * control how a matched request is handled.
- */
-
-/**
- * @ngdoc method
- * @name ngMockE2E.$httpBackend#whenPATCH
- * @methodOf ngMockE2E.$httpBackend
- * @description
- * Creates a new backend definition for PATCH requests. For more info see `when()`.
- *
- * @param {string|RegExp} url HTTP url.
- * @param {(string|RegExp)=} data HTTP request body.
- * @param {(Object|function(Object))=} headers HTTP headers.
- * @returns {requestHandler} Returns an object with `respond` and `passThrough` methods that
- * control how a matched request is handled.
- */
-
-/**
- * @ngdoc method
- * @name ngMockE2E.$httpBackend#whenJSONP
- * @methodOf ngMockE2E.$httpBackend
- * @description
- * Creates a new backend definition for JSONP requests. For more info see `when()`.
- *
- * @param {string|RegExp} url HTTP url.
- * @returns {requestHandler} Returns an object with `respond` and `passThrough` methods that
- * control how a matched request is handled.
- */
-angular.mock.e2e = {};
-angular.mock.e2e.$httpBackendDecorator = ['$rootScope', '$delegate', '$browser', createHttpBackendMock];
-
-
-angular.mock.clearDataCache = function() {
- var key,
- cache = angular.element.cache;
-
- for(key in cache) {
- if (cache.hasOwnProperty(key)) {
- var handle = cache[key].handle;
-
- handle && angular.element(handle.elem).unbind();
- delete cache[key];
- }
- }
-};
-
-
-window.jstestdriver && (function(window) {
- /**
- * Global method to output any number of objects into JSTD console. Useful for debugging.
- */
- window.dump = function() {
- var args = [];
- angular.forEach(arguments, function(arg) {
- args.push(angular.mock.dump(arg));
- });
- jstestdriver.console.log.apply(jstestdriver.console, args);
- if (window.console) {
- window.console.log.apply(window.console, args);
- }
- };
-})(window);
-
-
-(window.jasmine || window.mocha) && (function(window) {
-
- var currentSpec = null;
-
- beforeEach(function() {
- currentSpec = this;
- });
-
- afterEach(function() {
- var injector = currentSpec.$injector;
-
- currentSpec.$injector = null;
- currentSpec.$modules = null;
- currentSpec = null;
-
- if (injector) {
- injector.get('$rootElement').unbind();
- injector.get('$browser').pollFns.length = 0;
- }
-
- angular.mock.clearDataCache();
-
- // clean up jquery's fragment cache
- angular.forEach(angular.element.fragments, function(val, key) {
- delete angular.element.fragments[key];
- });
-
- MockXhr.$$lastInstance = null;
-
- angular.forEach(angular.callbacks, function(val, key) {
- delete angular.callbacks[key];
- });
- angular.callbacks.counter = 0;
- });
-
- function isSpecRunning() {
- return currentSpec && (window.mocha || currentSpec.queue.running);
- }
-
- /**
- * @ngdoc function
- * @name angular.mock.module
- * @description
- *
- * *NOTE*: This function is also published on window for easy access.
- *
- * This function registers a module configuration code. It collects the configuration information
- * which will be used when the injector is created by {@link angular.mock.inject inject}.
- *
- * See {@link angular.mock.inject inject} for usage example
- *
- * @param {...(string|Function)} fns any number of modules which are represented as string
- * aliases or as anonymous module initialization functions. The modules are used to
- * configure the injector. The 'ng' and 'ngMock' modules are automatically loaded.
- */
- window.module = angular.mock.module = function() {
- var moduleFns = Array.prototype.slice.call(arguments, 0);
- return isSpecRunning() ? workFn() : workFn;
- /////////////////////
- function workFn() {
- if (currentSpec.$injector) {
- throw Error('Injector already created, can not register a module!');
- } else {
- var modules = currentSpec.$modules || (currentSpec.$modules = []);
- angular.forEach(moduleFns, function(module) {
- modules.push(module);
- });
- }
- }
- };
-
- /**
- * @ngdoc function
- * @name angular.mock.inject
- * @description
- *
- * *NOTE*: This function is also published on window for easy access.
- *
- * The inject function wraps a function into an injectable function. The inject() creates new
- * instance of {@link AUTO.$injector $injector} per test, which is then used for
- * resolving references.
- *
- * See also {@link angular.mock.module module}
- *
- * Example of what a typical jasmine tests looks like with the inject method.
- *
- *
- * angular.module('myApplicationModule', [])
- * .value('mode', 'app')
- * .value('version', 'v1.0.1');
- *
- *
- * describe('MyApp', function() {
- *
- * // You need to load modules that you want to test,
- * // it loads only the "ng" module by default.
- * beforeEach(module('myApplicationModule'));
- *
- *
- * // inject() is used to inject arguments of all given functions
- * it('should provide a version', inject(function(mode, version) {
- * expect(version).toEqual('v1.0.1');
- * expect(mode).toEqual('app');
- * }));
- *
- *
- * // The inject and module method can also be used inside of the it or beforeEach
- * it('should override a version and test the new version is injected', function() {
- * // module() takes functions or strings (module aliases)
- * module(function($provide) {
- * $provide.value('version', 'overridden'); // override version here
- * });
- *
- * inject(function(version) {
- * expect(version).toEqual('overridden');
- * });
- * ));
- * });
- *
- *
- *
- * @param {...Function} fns any number of functions which will be injected using the injector.
- */
- window.inject = angular.mock.inject = function() {
- var blockFns = Array.prototype.slice.call(arguments, 0);
- var errorForStack = new Error('Declaration Location');
- return isSpecRunning() ? workFn() : workFn;
- /////////////////////
- function workFn() {
- var modules = currentSpec.$modules || [];
-
- modules.unshift('ngMock');
- modules.unshift('ng');
- var injector = currentSpec.$injector;
- if (!injector) {
- injector = currentSpec.$injector = angular.injector(modules);
- }
- for(var i = 0, ii = blockFns.length; i < ii; i++) {
- try {
- injector.invoke(blockFns[i] || angular.noop, this);
- } catch (e) {
- if(e.stack && errorForStack) e.stack += '\n' + errorForStack.stack;
- throw e;
- } finally {
- errorForStack = null;
- }
- }
- }
- };
-})(window);
+/**
+ * @license AngularJS v1.1.5
+ * (c) 2010-2012 Google, Inc. http://angularjs.org
+ * License: MIT
+ *
+ * TODO(vojta): wrap whole file into closure during build
+ */
+
+/**
+ * @ngdoc overview
+ * @name angular.mock
+ * @description
+ *
+ * Namespace from 'angular-mocks.js' which contains testing related code.
+ */
+angular.mock = {};
+
+/**
+ * ! This is a private undocumented service !
+ *
+ * @name ngMock.$browser
+ *
+ * @description
+ * This service is a mock implementation of {@link ng.$browser}. It provides fake
+ * implementation for commonly used browser apis that are hard to test, e.g. setTimeout, xhr,
+ * cookies, etc...
+ *
+ * The api of this service is the same as that of the real {@link ng.$browser $browser}, except
+ * that there are several helper methods available which can be used in tests.
+ */
+angular.mock.$BrowserProvider = function() {
+ this.$get = function(){
+ return new angular.mock.$Browser();
+ };
+};
+
+angular.mock.$Browser = function() {
+ var self = this;
+
+ this.isMock = true;
+ self.$$url = "http://server/";
+ self.$$lastUrl = self.$$url; // used by url polling fn
+ self.pollFns = [];
+
+ // TODO(vojta): remove this temporary api
+ self.$$completeOutstandingRequest = angular.noop;
+ self.$$incOutstandingRequestCount = angular.noop;
+
+
+ // register url polling fn
+
+ self.onUrlChange = function(listener) {
+ self.pollFns.push(
+ function() {
+ if (self.$$lastUrl != self.$$url) {
+ self.$$lastUrl = self.$$url;
+ listener(self.$$url);
+ }
+ }
+ );
+
+ return listener;
+ };
+
+ self.cookieHash = {};
+ self.lastCookieHash = {};
+ self.deferredFns = [];
+ self.deferredNextId = 0;
+
+ self.defer = function(fn, delay) {
+ delay = delay || 0;
+ self.deferredFns.push({time:(self.defer.now + delay), fn:fn, id: self.deferredNextId});
+ self.deferredFns.sort(function(a,b){ return a.time - b.time;});
+ return self.deferredNextId++;
+ };
+
+
+ self.defer.now = 0;
+
+
+ self.defer.cancel = function(deferId) {
+ var fnIndex;
+
+ angular.forEach(self.deferredFns, function(fn, index) {
+ if (fn.id === deferId) fnIndex = index;
+ });
+
+ if (fnIndex !== undefined) {
+ self.deferredFns.splice(fnIndex, 1);
+ return true;
+ }
+
+ return false;
+ };
+
+
+ /**
+ * @name ngMock.$browser#defer.flush
+ * @methodOf ngMock.$browser
+ *
+ * @description
+ * Flushes all pending requests and executes the defer callbacks.
+ *
+ * @param {number=} number of milliseconds to flush. See {@link #defer.now}
+ */
+ self.defer.flush = function(delay) {
+ if (angular.isDefined(delay)) {
+ self.defer.now += delay;
+ } else {
+ if (self.deferredFns.length) {
+ self.defer.now = self.deferredFns[self.deferredFns.length-1].time;
+ } else {
+ throw Error('No deferred tasks to be flushed');
+ }
+ }
+
+ while (self.deferredFns.length && self.deferredFns[0].time <= self.defer.now) {
+ self.deferredFns.shift().fn();
+ }
+ };
+ /**
+ * @name ngMock.$browser#defer.now
+ * @propertyOf ngMock.$browser
+ *
+ * @description
+ * Current milliseconds mock time.
+ */
+
+ self.$$baseHref = '';
+ self.baseHref = function() {
+ return this.$$baseHref;
+ };
+};
+angular.mock.$Browser.prototype = {
+
+/**
+ * @name ngMock.$browser#poll
+ * @methodOf ngMock.$browser
+ *
+ * @description
+ * run all fns in pollFns
+ */
+ poll: function poll() {
+ angular.forEach(this.pollFns, function(pollFn){
+ pollFn();
+ });
+ },
+
+ addPollFn: function(pollFn) {
+ this.pollFns.push(pollFn);
+ return pollFn;
+ },
+
+ url: function(url, replace) {
+ if (url) {
+ this.$$url = url;
+ return this;
+ }
+
+ return this.$$url;
+ },
+
+ cookies: function(name, value) {
+ if (name) {
+ if (value == undefined) {
+ delete this.cookieHash[name];
+ } else {
+ if (angular.isString(value) && //strings only
+ value.length <= 4096) { //strict cookie storage limits
+ this.cookieHash[name] = value;
+ }
+ }
+ } else {
+ if (!angular.equals(this.cookieHash, this.lastCookieHash)) {
+ this.lastCookieHash = angular.copy(this.cookieHash);
+ this.cookieHash = angular.copy(this.cookieHash);
+ }
+ return this.cookieHash;
+ }
+ },
+
+ notifyWhenNoOutstandingRequests: function(fn) {
+ fn();
+ }
+};
+
+
+/**
+ * @ngdoc object
+ * @name ngMock.$exceptionHandlerProvider
+ *
+ * @description
+ * Configures the mock implementation of {@link ng.$exceptionHandler} to rethrow or to log errors passed
+ * into the `$exceptionHandler`.
+ */
+
+/**
+ * @ngdoc object
+ * @name ngMock.$exceptionHandler
+ *
+ * @description
+ * Mock implementation of {@link ng.$exceptionHandler} that rethrows or logs errors passed
+ * into it. See {@link ngMock.$exceptionHandlerProvider $exceptionHandlerProvider} for configuration
+ * information.
+ *
+ *
+ *
+ * describe('$exceptionHandlerProvider', function() {
+ *
+ * it('should capture log messages and exceptions', function() {
+ *
+ * module(function($exceptionHandlerProvider) {
+ * $exceptionHandlerProvider.mode('log');
+ * });
+ *
+ * inject(function($log, $exceptionHandler, $timeout) {
+ * $timeout(function() { $log.log(1); });
+ * $timeout(function() { $log.log(2); throw 'banana peel'; });
+ * $timeout(function() { $log.log(3); });
+ * expect($exceptionHandler.errors).toEqual([]);
+ * expect($log.assertEmpty());
+ * $timeout.flush();
+ * expect($exceptionHandler.errors).toEqual(['banana peel']);
+ * expect($log.log.logs).toEqual([[1], [2], [3]]);
+ * });
+ * });
+ * });
+ *
+ */
+
+angular.mock.$ExceptionHandlerProvider = function() {
+ var handler;
+
+ /**
+ * @ngdoc method
+ * @name ngMock.$exceptionHandlerProvider#mode
+ * @methodOf ngMock.$exceptionHandlerProvider
+ *
+ * @description
+ * Sets the logging mode.
+ *
+ * @param {string} mode Mode of operation, defaults to `rethrow`.
+ *
+ * - `rethrow`: If any errors are passed into the handler in tests, it typically
+ * means that there is a bug in the application or test, so this mock will
+ * make these tests fail.
+ * - `log`: Sometimes it is desirable to test that an error is thrown, for this case the `log` mode stores an
+ * array of errors in `$exceptionHandler.errors`, to allow later assertion of them.
+ * See {@link ngMock.$log#assertEmpty assertEmpty()} and
+ * {@link ngMock.$log#reset reset()}
+ */
+ this.mode = function(mode) {
+ switch(mode) {
+ case 'rethrow':
+ handler = function(e) {
+ throw e;
+ };
+ break;
+ case 'log':
+ var errors = [];
+
+ handler = function(e) {
+ if (arguments.length == 1) {
+ errors.push(e);
+ } else {
+ errors.push([].slice.call(arguments, 0));
+ }
+ };
+
+ handler.errors = errors;
+ break;
+ default:
+ throw Error("Unknown mode '" + mode + "', only 'log'/'rethrow' modes are allowed!");
+ }
+ };
+
+ this.$get = function() {
+ return handler;
+ };
+
+ this.mode('rethrow');
+};
+
+
+/**
+ * @ngdoc service
+ * @name ngMock.$log
+ *
+ * @description
+ * Mock implementation of {@link ng.$log} that gathers all logged messages in arrays
+ * (one array per logging level). These arrays are exposed as `logs` property of each of the
+ * level-specific log function, e.g. for level `error` the array is exposed as `$log.error.logs`.
+ *
+ */
+angular.mock.$LogProvider = function() {
+
+ function concat(array1, array2, index) {
+ return array1.concat(Array.prototype.slice.call(array2, index));
+ }
+
+
+ this.$get = function () {
+ var $log = {
+ log: function() { $log.log.logs.push(concat([], arguments, 0)); },
+ warn: function() { $log.warn.logs.push(concat([], arguments, 0)); },
+ info: function() { $log.info.logs.push(concat([], arguments, 0)); },
+ error: function() { $log.error.logs.push(concat([], arguments, 0)); }
+ };
+
+ /**
+ * @ngdoc method
+ * @name ngMock.$log#reset
+ * @methodOf ngMock.$log
+ *
+ * @description
+ * Reset all of the logging arrays to empty.
+ */
+ $log.reset = function () {
+ /**
+ * @ngdoc property
+ * @name ngMock.$log#log.logs
+ * @propertyOf ngMock.$log
+ *
+ * @description
+ * Array of messages logged using {@link ngMock.$log#log}.
+ *
+ * @example
+ *
+ * $log.log('Some Log');
+ * var first = $log.log.logs.unshift();
+ *
+ */
+ $log.log.logs = [];
+ /**
+ * @ngdoc property
+ * @name ngMock.$log#warn.logs
+ * @propertyOf ngMock.$log
+ *
+ * @description
+ * Array of messages logged using {@link ngMock.$log#warn}.
+ *
+ * @example
+ *
+ * $log.warn('Some Warning');
+ * var first = $log.warn.logs.unshift();
+ *
+ */
+ $log.warn.logs = [];
+ /**
+ * @ngdoc property
+ * @name ngMock.$log#info.logs
+ * @propertyOf ngMock.$log
+ *
+ * @description
+ * Array of messages logged using {@link ngMock.$log#info}.
+ *
+ * @example
+ *
+ * $log.info('Some Info');
+ * var first = $log.info.logs.unshift();
+ *
+ */
+ $log.info.logs = [];
+ /**
+ * @ngdoc property
+ * @name ngMock.$log#error.logs
+ * @propertyOf ngMock.$log
+ *
+ * @description
+ * Array of messages logged using {@link ngMock.$log#error}.
+ *
+ * @example
+ *
+ * $log.log('Some Error');
+ * var first = $log.error.logs.unshift();
+ *
+ */
+ $log.error.logs = [];
+ };
+
+ /**
+ * @ngdoc method
+ * @name ngMock.$log#assertEmpty
+ * @methodOf ngMock.$log
+ *
+ * @description
+ * Assert that the all of the logging methods have no logged messages. If messages present, an exception is thrown.
+ */
+ $log.assertEmpty = function() {
+ var errors = [];
+ angular.forEach(['error', 'warn', 'info', 'log'], function(logLevel) {
+ angular.forEach($log[logLevel].logs, function(log) {
+ angular.forEach(log, function (logItem) {
+ errors.push('MOCK $log (' + logLevel + '): ' + String(logItem) + '\n' + (logItem.stack || ''));
+ });
+ });
+ });
+ if (errors.length) {
+ errors.unshift("Expected $log to be empty! Either a message was logged unexpectedly, or an expected " +
+ "log message was not checked and removed:");
+ errors.push('');
+ throw new Error(errors.join('\n---------\n'));
+ }
+ };
+
+ $log.reset();
+ return $log;
+ };
+};
+
+
+(function() {
+ var R_ISO8061_STR = /^(\d{4})-?(\d\d)-?(\d\d)(?:T(\d\d)(?:\:?(\d\d)(?:\:?(\d\d)(?:\.(\d{3}))?)?)?(Z|([+-])(\d\d):?(\d\d)))?$/;
+
+ function jsonStringToDate(string){
+ var match;
+ if (match = string.match(R_ISO8061_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;
+ }
+
+ function int(str) {
+ return parseInt(str, 10);
+ }
+
+ 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;
+ }
+
+
+ /**
+ * @ngdoc object
+ * @name angular.mock.TzDate
+ * @description
+ *
+ * *NOTE*: this is not an injectable instance, just a globally available mock class of `Date`.
+ *
+ * Mock of the Date type which has its timezone specified via constructor arg.
+ *
+ * The main purpose is to create Date-like instances with timezone fixed to the specified timezone
+ * offset, so that we can test code that depends on local timezone settings without dependency on
+ * the time zone settings of the machine where the code is running.
+ *
+ * @param {number} offset Offset of the *desired* timezone in hours (fractions will be honored)
+ * @param {(number|string)} timestamp Timestamp representing the desired time in *UTC*
+ *
+ * @example
+ * !!!! WARNING !!!!!
+ * This is not a complete Date object so only methods that were implemented can be called safely.
+ * To make matters worse, TzDate instances inherit stuff from Date via a prototype.
+ *
+ * We do our best to intercept calls to "unimplemented" methods, but since the list of methods is
+ * incomplete we might be missing some non-standard methods. This can result in errors like:
+ * "Date.prototype.foo called on incompatible Object".
+ *
+ *
+ * var newYearInBratislava = new TzDate(-1, '2009-12-31T23:00:00Z');
+ * newYearInBratislava.getTimezoneOffset() => -60;
+ * newYearInBratislava.getFullYear() => 2010;
+ * newYearInBratislava.getMonth() => 0;
+ * newYearInBratislava.getDate() => 1;
+ * newYearInBratislava.getHours() => 0;
+ * newYearInBratislava.getMinutes() => 0;
+ * newYearInBratislava.getSeconds() => 0;
+ *
+ *
+ */
+ angular.mock.TzDate = function (offset, timestamp) {
+ var self = new Date(0);
+ if (angular.isString(timestamp)) {
+ var tsStr = timestamp;
+
+ self.origDate = jsonStringToDate(timestamp);
+
+ timestamp = self.origDate.getTime();
+ if (isNaN(timestamp))
+ throw {
+ name: "Illegal Argument",
+ message: "Arg '" + tsStr + "' passed into TzDate constructor is not a valid date string"
+ };
+ } else {
+ self.origDate = new Date(timestamp);
+ }
+
+ var localOffset = new Date(timestamp).getTimezoneOffset();
+ self.offsetDiff = localOffset*60*1000 - offset*1000*60*60;
+ self.date = new Date(timestamp + self.offsetDiff);
+
+ self.getTime = function() {
+ return self.date.getTime() - self.offsetDiff;
+ };
+
+ self.toLocaleDateString = function() {
+ return self.date.toLocaleDateString();
+ };
+
+ self.getFullYear = function() {
+ return self.date.getFullYear();
+ };
+
+ self.getMonth = function() {
+ return self.date.getMonth();
+ };
+
+ self.getDate = function() {
+ return self.date.getDate();
+ };
+
+ self.getHours = function() {
+ return self.date.getHours();
+ };
+
+ self.getMinutes = function() {
+ return self.date.getMinutes();
+ };
+
+ self.getSeconds = function() {
+ return self.date.getSeconds();
+ };
+
+ self.getMilliseconds = function() {
+ return self.date.getMilliseconds();
+ };
+
+ self.getTimezoneOffset = function() {
+ return offset * 60;
+ };
+
+ self.getUTCFullYear = function() {
+ return self.origDate.getUTCFullYear();
+ };
+
+ self.getUTCMonth = function() {
+ return self.origDate.getUTCMonth();
+ };
+
+ self.getUTCDate = function() {
+ return self.origDate.getUTCDate();
+ };
+
+ self.getUTCHours = function() {
+ return self.origDate.getUTCHours();
+ };
+
+ self.getUTCMinutes = function() {
+ return self.origDate.getUTCMinutes();
+ };
+
+ self.getUTCSeconds = function() {
+ return self.origDate.getUTCSeconds();
+ };
+
+ self.getUTCMilliseconds = function() {
+ return self.origDate.getUTCMilliseconds();
+ };
+
+ self.getDay = function() {
+ return self.date.getDay();
+ };
+
+ // provide this method only on browsers that already have it
+ if (self.toISOString) {
+ self.toISOString = function() {
+ return padNumber(self.origDate.getUTCFullYear(), 4) + '-' +
+ padNumber(self.origDate.getUTCMonth() + 1, 2) + '-' +
+ padNumber(self.origDate.getUTCDate(), 2) + 'T' +
+ padNumber(self.origDate.getUTCHours(), 2) + ':' +
+ padNumber(self.origDate.getUTCMinutes(), 2) + ':' +
+ padNumber(self.origDate.getUTCSeconds(), 2) + '.' +
+ padNumber(self.origDate.getUTCMilliseconds(), 3) + 'Z'
+ }
+ }
+
+ //hide all methods not implemented in this mock that the Date prototype exposes
+ var unimplementedMethods = ['getUTCDay',
+ 'getYear', 'setDate', 'setFullYear', 'setHours', 'setMilliseconds',
+ 'setMinutes', 'setMonth', 'setSeconds', 'setTime', 'setUTCDate', 'setUTCFullYear',
+ 'setUTCHours', 'setUTCMilliseconds', 'setUTCMinutes', 'setUTCMonth', 'setUTCSeconds',
+ 'setYear', 'toDateString', 'toGMTString', 'toJSON', 'toLocaleFormat', 'toLocaleString',
+ 'toLocaleTimeString', 'toSource', 'toString', 'toTimeString', 'toUTCString', 'valueOf'];
+
+ angular.forEach(unimplementedMethods, function(methodName) {
+ self[methodName] = function() {
+ throw Error("Method '" + methodName + "' is not implemented in the TzDate mock");
+ };
+ });
+
+ return self;
+ };
+
+ //make "tzDateInstance instanceof Date" return true
+ angular.mock.TzDate.prototype = Date.prototype;
+})();
+
+/**
+ * @ngdoc function
+ * @name angular.mock.createMockWindow
+ * @description
+ *
+ * This function creates a mock window object useful for controlling access ot setTimeout, but mocking out
+ * sufficient window's properties to allow Angular to execute.
+ *
+ * @example
+ *
+ *
+ beforeEach(module(function($provide) {
+ $provide.value('$window', window = angular.mock.createMockWindow());
+ }));
+
+ it('should do something', inject(function($window) {
+ var val = null;
+ $window.setTimeout(function() { val = 123; }, 10);
+ expect(val).toEqual(null);
+ window.setTimeout.expect(10).process();
+ expect(val).toEqual(123);
+ });
+ *
+ *
+ */
+angular.mock.createMockWindow = function() {
+ var mockWindow = {};
+ var setTimeoutQueue = [];
+
+ mockWindow.document = window.document;
+ mockWindow.getComputedStyle = angular.bind(window, window.getComputedStyle);
+ mockWindow.scrollTo = angular.bind(window, window.scrollTo);
+ mockWindow.navigator = window.navigator;
+ mockWindow.setTimeout = function(fn, delay) {
+ setTimeoutQueue.push({fn: fn, delay: delay});
+ };
+ mockWindow.setTimeout.queue = setTimeoutQueue;
+ mockWindow.setTimeout.expect = function(delay) {
+ if (setTimeoutQueue.length > 0) {
+ return {
+ process: function() {
+ var tick = setTimeoutQueue.shift();
+ expect(tick.delay).toEqual(delay);
+ tick.fn();
+ }
+ };
+ } else {
+ expect('SetTimoutQueue empty. Expecting delay of ').toEqual(delay);
+ }
+ };
+
+ return mockWindow;
+};
+
+/**
+ * @ngdoc function
+ * @name angular.mock.dump
+ * @description
+ *
+ * *NOTE*: this is not an injectable instance, just a globally available function.
+ *
+ * Method for serializing common angular objects (scope, elements, etc..) into strings, useful for debugging.
+ *
+ * This method is also available on window, where it can be used to display objects on debug console.
+ *
+ * @param {*} object - any object to turn into string.
+ * @return {string} a serialized string of the argument
+ */
+angular.mock.dump = function(object) {
+ return serialize(object);
+
+ function serialize(object) {
+ var out;
+
+ if (angular.isElement(object)) {
+ object = angular.element(object);
+ out = angular.element('
');
+ angular.forEach(object, function(element) {
+ out.append(angular.element(element).clone());
+ });
+ out = out.html();
+ } else if (angular.isArray(object)) {
+ out = [];
+ angular.forEach(object, function(o) {
+ out.push(serialize(o));
+ });
+ out = '[ ' + out.join(', ') + ' ]';
+ } else if (angular.isObject(object)) {
+ if (angular.isFunction(object.$eval) && angular.isFunction(object.$apply)) {
+ out = serializeScope(object);
+ } else if (object instanceof Error) {
+ out = object.stack || ('' + object.name + ': ' + object.message);
+ } else {
+ out = angular.toJson(object, true);
+ }
+ } else {
+ out = String(object);
+ }
+
+ return out;
+ }
+
+ function serializeScope(scope, offset) {
+ offset = offset || ' ';
+ var log = [offset + 'Scope(' + scope.$id + '): {'];
+ for ( var key in scope ) {
+ if (scope.hasOwnProperty(key) && !key.match(/^(\$|this)/)) {
+ log.push(' ' + key + ': ' + angular.toJson(scope[key]));
+ }
+ }
+ var child = scope.$$childHead;
+ while(child) {
+ log.push(serializeScope(child, offset + ' '));
+ child = child.$$nextSibling;
+ }
+ log.push('}');
+ return log.join('\n' + offset);
+ }
+};
+
+/**
+ * @ngdoc object
+ * @name ngMock.$httpBackend
+ * @description
+ * Fake HTTP backend implementation suitable for unit testing applications that use the
+ * {@link ng.$http $http service}.
+ *
+ * *Note*: For fake HTTP backend implementation suitable for end-to-end testing or backend-less
+ * development please see {@link ngMockE2E.$httpBackend e2e $httpBackend mock}.
+ *
+ * During unit testing, we want our unit tests to run quickly and have no external dependencies so
+ * we don’t want to send {@link https://developer.mozilla.org/en/xmlhttprequest XHR} or
+ * {@link http://en.wikipedia.org/wiki/JSONP JSONP} requests to a real server. All we really need is
+ * to verify whether a certain request has been sent or not, or alternatively just let the
+ * application make requests, respond with pre-trained responses and assert that the end result is
+ * what we expect it to be.
+ *
+ * This mock implementation can be used to respond with static or dynamic responses via the
+ * `expect` and `when` apis and their shortcuts (`expectGET`, `whenPOST`, etc).
+ *
+ * When an Angular application needs some data from a server, it calls the $http service, which
+ * sends the request to a real server using $httpBackend service. With dependency injection, it is
+ * easy to inject $httpBackend mock (which has the same API as $httpBackend) and use it to verify
+ * the requests and respond with some testing data without sending a request to real server.
+ *
+ * There are two ways to specify what test data should be returned as http responses by the mock
+ * backend when the code under test makes http requests:
+ *
+ * - `$httpBackend.expect` - specifies a request expectation
+ * - `$httpBackend.when` - specifies a backend definition
+ *
+ *
+ * # Request Expectations vs Backend Definitions
+ *
+ * Request expectations provide a way to make assertions about requests made by the application and
+ * to define responses for those requests. The test will fail if the expected requests are not made
+ * or they are made in the wrong order.
+ *
+ * Backend definitions allow you to define a fake backend for your application which doesn't assert
+ * if a particular request was made or not, it just returns a trained response if a request is made.
+ * The test will pass whether or not the request gets made during testing.
+ *
+ *
+ *
+ * Request expectations Backend definitions
+ *
+ * Syntax
+ * .expect(...).respond(...)
+ * .when(...).respond(...)
+ *
+ *
+ * Typical usage
+ * strict unit tests
+ * loose (black-box) unit testing
+ *
+ *
+ * Fulfills multiple requests
+ * NO
+ * YES
+ *
+ *
+ * Order of requests matters
+ * YES
+ * NO
+ *
+ *
+ * Request required
+ * YES
+ * NO
+ *
+ *
+ * Response required
+ * optional (see below)
+ * YES
+ *
+ *
+ *
+ * In cases where both backend definitions and request expectations are specified during unit
+ * testing, the request expectations are evaluated first.
+ *
+ * If a request expectation has no response specified, the algorithm will search your backend
+ * definitions for an appropriate response.
+ *
+ * If a request didn't match any expectation or if the expectation doesn't have the response
+ * defined, the backend definitions are evaluated in sequential order to see if any of them match
+ * the request. The response from the first matched definition is returned.
+ *
+ *
+ * # Flushing HTTP requests
+ *
+ * The $httpBackend used in production, always responds to requests with responses asynchronously.
+ * If we preserved this behavior in unit testing, we'd have to create async unit tests, which are
+ * hard to write, follow and maintain. At the same time the testing mock, can't respond
+ * synchronously because that would change the execution of the code under test. For this reason the
+ * mock $httpBackend has a `flush()` method, which allows the test to explicitly flush pending
+ * requests and thus preserving the async api of the backend, while allowing the test to execute
+ * synchronously.
+ *
+ *
+ * # Unit testing with mock $httpBackend
+ *
+ *
+ // controller
+ function MyController($scope, $http) {
+ $http.get('/auth.py').success(function(data) {
+ $scope.user = data;
+ });
+
+ this.saveMessage = function(message) {
+ $scope.status = 'Saving...';
+ $http.post('/add-msg.py', message).success(function(response) {
+ $scope.status = '';
+ }).error(function() {
+ $scope.status = 'ERROR!';
+ });
+ };
+ }
+
+ // testing controller
+ var $httpBackend;
+
+ beforeEach(inject(function($injector) {
+ $httpBackend = $injector.get('$httpBackend');
+
+ // backend definition common for all tests
+ $httpBackend.when('GET', '/auth.py').respond({userId: 'userX'}, {'A-Token': 'xxx'});
+ }));
+
+
+ afterEach(function() {
+ $httpBackend.verifyNoOutstandingExpectation();
+ $httpBackend.verifyNoOutstandingRequest();
+ });
+
+
+ it('should fetch authentication token', function() {
+ $httpBackend.expectGET('/auth.py');
+ var controller = scope.$new(MyController);
+ $httpBackend.flush();
+ });
+
+
+ it('should send msg to server', function() {
+ // now you don’t care about the authentication, but
+ // the controller will still send the request and
+ // $httpBackend will respond without you having to
+ // specify the expectation and response for this request
+ $httpBackend.expectPOST('/add-msg.py', 'message content').respond(201, '');
+
+ var controller = scope.$new(MyController);
+ $httpBackend.flush();
+ controller.saveMessage('message content');
+ expect(controller.status).toBe('Saving...');
+ $httpBackend.flush();
+ expect(controller.status).toBe('');
+ });
+
+
+ it('should send auth header', function() {
+ $httpBackend.expectPOST('/add-msg.py', undefined, function(headers) {
+ // check if the header was send, if it wasn't the expectation won't
+ // match the request and the test will fail
+ return headers['Authorization'] == 'xxx';
+ }).respond(201, '');
+
+ var controller = scope.$new(MyController);
+ controller.saveMessage('whatever');
+ $httpBackend.flush();
+ });
+
+ */
+angular.mock.$HttpBackendProvider = function() {
+ this.$get = ['$rootScope', createHttpBackendMock];
+};
+
+/**
+ * General factory function for $httpBackend mock.
+ * Returns instance for unit testing (when no arguments specified):
+ * - passing through is disabled
+ * - auto flushing is disabled
+ *
+ * Returns instance for e2e testing (when `$delegate` and `$browser` specified):
+ * - passing through (delegating request to real backend) is enabled
+ * - auto flushing is enabled
+ *
+ * @param {Object=} $delegate Real $httpBackend instance (allow passing through if specified)
+ * @param {Object=} $browser Auto-flushing enabled if specified
+ * @return {Object} Instance of $httpBackend mock
+ */
+function createHttpBackendMock($rootScope, $delegate, $browser) {
+ var definitions = [],
+ expectations = [],
+ responses = [],
+ responsesPush = angular.bind(responses, responses.push);
+
+ function createResponse(status, data, headers) {
+ if (angular.isFunction(status)) return status;
+
+ return function() {
+ return angular.isNumber(status)
+ ? [status, data, headers]
+ : [200, status, data];
+ };
+ }
+
+ // TODO(vojta): change params to: method, url, data, headers, callback
+ function $httpBackend(method, url, data, callback, headers, timeout) {
+ var xhr = new MockXhr(),
+ expectation = expectations[0],
+ wasExpected = false;
+
+ function prettyPrint(data) {
+ return (angular.isString(data) || angular.isFunction(data) || data instanceof RegExp)
+ ? data
+ : angular.toJson(data);
+ }
+
+ function wrapResponse(wrapped) {
+ if (!$browser && timeout && timeout.then) timeout.then(handleTimeout);
+
+ return handleResponse;
+
+ function handleResponse() {
+ var response = wrapped.response(method, url, data, headers);
+ xhr.$$respHeaders = response[2];
+ callback(response[0], response[1], xhr.getAllResponseHeaders());
+ }
+
+ function handleTimeout() {
+ for (var i = 0, ii = responses.length; i < ii; i++) {
+ if (responses[i] === handleResponse) {
+ responses.splice(i, 1);
+ callback(-1, undefined, '');
+ break;
+ }
+ }
+ }
+ }
+
+ if (expectation && expectation.match(method, url)) {
+ if (!expectation.matchData(data))
+ throw Error('Expected ' + expectation + ' with different data\n' +
+ 'EXPECTED: ' + prettyPrint(expectation.data) + '\nGOT: ' + data);
+
+ if (!expectation.matchHeaders(headers))
+ throw Error('Expected ' + expectation + ' with different headers\n' +
+ 'EXPECTED: ' + prettyPrint(expectation.headers) + '\nGOT: ' +
+ prettyPrint(headers));
+
+ expectations.shift();
+
+ if (expectation.response) {
+ responses.push(wrapResponse(expectation));
+ return;
+ }
+ wasExpected = true;
+ }
+
+ var i = -1, definition;
+ while ((definition = definitions[++i])) {
+ if (definition.match(method, url, data, headers || {})) {
+ if (definition.response) {
+ // if $browser specified, we do auto flush all requests
+ ($browser ? $browser.defer : responsesPush)(wrapResponse(definition));
+ } else if (definition.passThrough) {
+ $delegate(method, url, data, callback, headers, timeout);
+ } else throw Error('No response defined !');
+ return;
+ }
+ }
+ throw wasExpected ?
+ Error('No response defined !') :
+ Error('Unexpected request: ' + method + ' ' + url + '\n' +
+ (expectation ? 'Expected ' + expectation : 'No more request expected'));
+ }
+
+ /**
+ * @ngdoc method
+ * @name ngMock.$httpBackend#when
+ * @methodOf ngMock.$httpBackend
+ * @description
+ * Creates a new backend definition.
+ *
+ * @param {string} method HTTP method.
+ * @param {string|RegExp} url HTTP url.
+ * @param {(string|RegExp)=} data HTTP request body.
+ * @param {(Object|function(Object))=} headers HTTP headers or function that receives http header
+ * object and returns true if the headers match the current definition.
+ * @returns {requestHandler} Returns an object with `respond` method that control how a matched
+ * request is handled.
+ *
+ * - respond – `{function([status,] data[, headers])|function(function(method, url, data, headers)}`
+ * – The respond method takes a set of static data to be returned or a function that can return
+ * an array containing response status (number), response data (string) and response headers
+ * (Object).
+ */
+ $httpBackend.when = function(method, url, data, headers) {
+ var definition = new MockHttpExpectation(method, url, data, headers),
+ chain = {
+ respond: function(status, data, headers) {
+ definition.response = createResponse(status, data, headers);
+ }
+ };
+
+ if ($browser) {
+ chain.passThrough = function() {
+ definition.passThrough = true;
+ };
+ }
+
+ definitions.push(definition);
+ return chain;
+ };
+
+ /**
+ * @ngdoc method
+ * @name ngMock.$httpBackend#whenGET
+ * @methodOf ngMock.$httpBackend
+ * @description
+ * Creates a new backend definition for GET requests. For more info see `when()`.
+ *
+ * @param {string|RegExp} url HTTP url.
+ * @param {(Object|function(Object))=} headers HTTP headers.
+ * @returns {requestHandler} Returns an object with `respond` method that control how a matched
+ * request is handled.
+ */
+
+ /**
+ * @ngdoc method
+ * @name ngMock.$httpBackend#whenHEAD
+ * @methodOf ngMock.$httpBackend
+ * @description
+ * Creates a new backend definition for HEAD requests. For more info see `when()`.
+ *
+ * @param {string|RegExp} url HTTP url.
+ * @param {(Object|function(Object))=} headers HTTP headers.
+ * @returns {requestHandler} Returns an object with `respond` method that control how a matched
+ * request is handled.
+ */
+
+ /**
+ * @ngdoc method
+ * @name ngMock.$httpBackend#whenDELETE
+ * @methodOf ngMock.$httpBackend
+ * @description
+ * Creates a new backend definition for DELETE requests. For more info see `when()`.
+ *
+ * @param {string|RegExp} url HTTP url.
+ * @param {(Object|function(Object))=} headers HTTP headers.
+ * @returns {requestHandler} Returns an object with `respond` method that control how a matched
+ * request is handled.
+ */
+
+ /**
+ * @ngdoc method
+ * @name ngMock.$httpBackend#whenPOST
+ * @methodOf ngMock.$httpBackend
+ * @description
+ * Creates a new backend definition for POST requests. For more info see `when()`.
+ *
+ * @param {string|RegExp} url HTTP url.
+ * @param {(string|RegExp)=} data HTTP request body.
+ * @param {(Object|function(Object))=} headers HTTP headers.
+ * @returns {requestHandler} Returns an object with `respond` method that control how a matched
+ * request is handled.
+ */
+
+ /**
+ * @ngdoc method
+ * @name ngMock.$httpBackend#whenPUT
+ * @methodOf ngMock.$httpBackend
+ * @description
+ * Creates a new backend definition for PUT requests. For more info see `when()`.
+ *
+ * @param {string|RegExp} url HTTP url.
+ * @param {(string|RegExp)=} data HTTP request body.
+ * @param {(Object|function(Object))=} headers HTTP headers.
+ * @returns {requestHandler} Returns an object with `respond` method that control how a matched
+ * request is handled.
+ */
+
+ /**
+ * @ngdoc method
+ * @name ngMock.$httpBackend#whenJSONP
+ * @methodOf ngMock.$httpBackend
+ * @description
+ * Creates a new backend definition for JSONP requests. For more info see `when()`.
+ *
+ * @param {string|RegExp} url HTTP url.
+ * @returns {requestHandler} Returns an object with `respond` method that control how a matched
+ * request is handled.
+ */
+ createShortMethods('when');
+
+
+ /**
+ * @ngdoc method
+ * @name ngMock.$httpBackend#expect
+ * @methodOf ngMock.$httpBackend
+ * @description
+ * Creates a new request expectation.
+ *
+ * @param {string} method HTTP method.
+ * @param {string|RegExp} url HTTP url.
+ * @param {(string|RegExp)=} data HTTP request body.
+ * @param {(Object|function(Object))=} headers HTTP headers or function that receives http header
+ * object and returns true if the headers match the current expectation.
+ * @returns {requestHandler} Returns an object with `respond` method that control how a matched
+ * request is handled.
+ *
+ * - respond – `{function([status,] data[, headers])|function(function(method, url, data, headers)}`
+ * – The respond method takes a set of static data to be returned or a function that can return
+ * an array containing response status (number), response data (string) and response headers
+ * (Object).
+ */
+ $httpBackend.expect = function(method, url, data, headers) {
+ var expectation = new MockHttpExpectation(method, url, data, headers);
+ expectations.push(expectation);
+ return {
+ respond: function(status, data, headers) {
+ expectation.response = createResponse(status, data, headers);
+ }
+ };
+ };
+
+
+ /**
+ * @ngdoc method
+ * @name ngMock.$httpBackend#expectGET
+ * @methodOf ngMock.$httpBackend
+ * @description
+ * Creates a new request expectation for GET requests. For more info see `expect()`.
+ *
+ * @param {string|RegExp} url HTTP url.
+ * @param {Object=} headers HTTP headers.
+ * @returns {requestHandler} Returns an object with `respond` method that control how a matched
+ * request is handled. See #expect for more info.
+ */
+
+ /**
+ * @ngdoc method
+ * @name ngMock.$httpBackend#expectHEAD
+ * @methodOf ngMock.$httpBackend
+ * @description
+ * Creates a new request expectation for HEAD requests. For more info see `expect()`.
+ *
+ * @param {string|RegExp} url HTTP url.
+ * @param {Object=} headers HTTP headers.
+ * @returns {requestHandler} Returns an object with `respond` method that control how a matched
+ * request is handled.
+ */
+
+ /**
+ * @ngdoc method
+ * @name ngMock.$httpBackend#expectDELETE
+ * @methodOf ngMock.$httpBackend
+ * @description
+ * Creates a new request expectation for DELETE requests. For more info see `expect()`.
+ *
+ * @param {string|RegExp} url HTTP url.
+ * @param {Object=} headers HTTP headers.
+ * @returns {requestHandler} Returns an object with `respond` method that control how a matched
+ * request is handled.
+ */
+
+ /**
+ * @ngdoc method
+ * @name ngMock.$httpBackend#expectPOST
+ * @methodOf ngMock.$httpBackend
+ * @description
+ * Creates a new request expectation for POST requests. For more info see `expect()`.
+ *
+ * @param {string|RegExp} url HTTP url.
+ * @param {(string|RegExp)=} data HTTP request body.
+ * @param {Object=} headers HTTP headers.
+ * @returns {requestHandler} Returns an object with `respond` method that control how a matched
+ * request is handled.
+ */
+
+ /**
+ * @ngdoc method
+ * @name ngMock.$httpBackend#expectPUT
+ * @methodOf ngMock.$httpBackend
+ * @description
+ * Creates a new request expectation for PUT requests. For more info see `expect()`.
+ *
+ * @param {string|RegExp} url HTTP url.
+ * @param {(string|RegExp)=} data HTTP request body.
+ * @param {Object=} headers HTTP headers.
+ * @returns {requestHandler} Returns an object with `respond` method that control how a matched
+ * request is handled.
+ */
+
+ /**
+ * @ngdoc method
+ * @name ngMock.$httpBackend#expectPATCH
+ * @methodOf ngMock.$httpBackend
+ * @description
+ * Creates a new request expectation for PATCH requests. For more info see `expect()`.
+ *
+ * @param {string|RegExp} url HTTP url.
+ * @param {(string|RegExp)=} data HTTP request body.
+ * @param {Object=} headers HTTP headers.
+ * @returns {requestHandler} Returns an object with `respond` method that control how a matched
+ * request is handled.
+ */
+
+ /**
+ * @ngdoc method
+ * @name ngMock.$httpBackend#expectJSONP
+ * @methodOf ngMock.$httpBackend
+ * @description
+ * Creates a new request expectation for JSONP requests. For more info see `expect()`.
+ *
+ * @param {string|RegExp} url HTTP url.
+ * @returns {requestHandler} Returns an object with `respond` method that control how a matched
+ * request is handled.
+ */
+ createShortMethods('expect');
+
+
+ /**
+ * @ngdoc method
+ * @name ngMock.$httpBackend#flush
+ * @methodOf ngMock.$httpBackend
+ * @description
+ * Flushes all pending requests using the trained responses.
+ *
+ * @param {number=} count Number of responses to flush (in the order they arrived). If undefined,
+ * all pending requests will be flushed. If there are no pending requests when the flush method
+ * is called an exception is thrown (as this typically a sign of programming error).
+ */
+ $httpBackend.flush = function(count) {
+ $rootScope.$digest();
+ if (!responses.length) throw Error('No pending request to flush !');
+
+ if (angular.isDefined(count)) {
+ while (count--) {
+ if (!responses.length) throw Error('No more pending request to flush !');
+ responses.shift()();
+ }
+ } else {
+ while (responses.length) {
+ responses.shift()();
+ }
+ }
+ $httpBackend.verifyNoOutstandingExpectation();
+ };
+
+
+ /**
+ * @ngdoc method
+ * @name ngMock.$httpBackend#verifyNoOutstandingExpectation
+ * @methodOf ngMock.$httpBackend
+ * @description
+ * Verifies that all of the requests defined via the `expect` api were made. If any of the
+ * requests were not made, verifyNoOutstandingExpectation throws an exception.
+ *
+ * Typically, you would call this method following each test case that asserts requests using an
+ * "afterEach" clause.
+ *
+ *
+ * afterEach($httpBackend.verifyExpectations);
+ *
+ */
+ $httpBackend.verifyNoOutstandingExpectation = function() {
+ $rootScope.$digest();
+ if (expectations.length) {
+ throw Error('Unsatisfied requests: ' + expectations.join(', '));
+ }
+ };
+
+
+ /**
+ * @ngdoc method
+ * @name ngMock.$httpBackend#verifyNoOutstandingRequest
+ * @methodOf ngMock.$httpBackend
+ * @description
+ * Verifies that there are no outstanding requests that need to be flushed.
+ *
+ * Typically, you would call this method following each test case that asserts requests using an
+ * "afterEach" clause.
+ *
+ *
+ * afterEach($httpBackend.verifyNoOutstandingRequest);
+ *
+ */
+ $httpBackend.verifyNoOutstandingRequest = function() {
+ if (responses.length) {
+ throw Error('Unflushed requests: ' + responses.length);
+ }
+ };
+
+
+ /**
+ * @ngdoc method
+ * @name ngMock.$httpBackend#resetExpectations
+ * @methodOf ngMock.$httpBackend
+ * @description
+ * Resets all request expectations, but preserves all backend definitions. Typically, you would
+ * call resetExpectations during a multiple-phase test when you want to reuse the same instance of
+ * $httpBackend mock.
+ */
+ $httpBackend.resetExpectations = function() {
+ expectations.length = 0;
+ responses.length = 0;
+ };
+
+ return $httpBackend;
+
+
+ function createShortMethods(prefix) {
+ angular.forEach(['GET', 'DELETE', 'JSONP'], function(method) {
+ $httpBackend[prefix + method] = function(url, headers) {
+ return $httpBackend[prefix](method, url, undefined, headers)
+ }
+ });
+
+ angular.forEach(['PUT', 'POST', 'PATCH'], function(method) {
+ $httpBackend[prefix + method] = function(url, data, headers) {
+ return $httpBackend[prefix](method, url, data, headers)
+ }
+ });
+ }
+}
+
+function MockHttpExpectation(method, url, data, headers) {
+
+ this.data = data;
+ this.headers = headers;
+
+ this.match = function(m, u, d, h) {
+ if (method != m) return false;
+ if (!this.matchUrl(u)) return false;
+ if (angular.isDefined(d) && !this.matchData(d)) return false;
+ if (angular.isDefined(h) && !this.matchHeaders(h)) return false;
+ return true;
+ };
+
+ this.matchUrl = function(u) {
+ if (!url) return true;
+ if (angular.isFunction(url.test)) return url.test(u);
+ return url == u;
+ };
+
+ this.matchHeaders = function(h) {
+ if (angular.isUndefined(headers)) return true;
+ if (angular.isFunction(headers)) return headers(h);
+ return angular.equals(headers, h);
+ };
+
+ this.matchData = function(d) {
+ if (angular.isUndefined(data)) return true;
+ if (data && angular.isFunction(data.test)) return data.test(d);
+ if (data && !angular.isString(data)) return angular.toJson(data) == d;
+ return data == d;
+ };
+
+ this.toString = function() {
+ return method + ' ' + url;
+ };
+}
+
+function MockXhr() {
+
+ // hack for testing $http, $httpBackend
+ MockXhr.$$lastInstance = this;
+
+ this.open = function(method, url, async) {
+ this.$$method = method;
+ this.$$url = url;
+ this.$$async = async;
+ this.$$reqHeaders = {};
+ this.$$respHeaders = {};
+ };
+
+ this.send = function(data) {
+ this.$$data = data;
+ };
+
+ this.setRequestHeader = function(key, value) {
+ this.$$reqHeaders[key] = value;
+ };
+
+ this.getResponseHeader = function(name) {
+ // the lookup must be case insensitive, that's why we try two quick lookups and full scan at last
+ var header = this.$$respHeaders[name];
+ if (header) return header;
+
+ name = angular.lowercase(name);
+ header = this.$$respHeaders[name];
+ if (header) return header;
+
+ header = undefined;
+ angular.forEach(this.$$respHeaders, function(headerVal, headerName) {
+ if (!header && angular.lowercase(headerName) == name) header = headerVal;
+ });
+ return header;
+ };
+
+ this.getAllResponseHeaders = function() {
+ var lines = [];
+
+ angular.forEach(this.$$respHeaders, function(value, key) {
+ lines.push(key + ': ' + value);
+ });
+ return lines.join('\n');
+ };
+
+ this.abort = angular.noop;
+}
+
+
+/**
+ * @ngdoc function
+ * @name ngMock.$timeout
+ * @description
+ *
+ * This service is just a simple decorator for {@link ng.$timeout $timeout} service
+ * that adds a "flush" and "verifyNoPendingTasks" methods.
+ */
+
+angular.mock.$TimeoutDecorator = function($delegate, $browser) {
+
+ /**
+ * @ngdoc method
+ * @name ngMock.$timeout#flush
+ * @methodOf ngMock.$timeout
+ * @description
+ *
+ * Flushes the queue of pending tasks.
+ */
+ $delegate.flush = function() {
+ $browser.defer.flush();
+ };
+
+ /**
+ * @ngdoc method
+ * @name ngMock.$timeout#verifyNoPendingTasks
+ * @methodOf ngMock.$timeout
+ * @description
+ *
+ * Verifies that there are no pending tasks that need to be flushed.
+ */
+ $delegate.verifyNoPendingTasks = function() {
+ if ($browser.deferredFns.length) {
+ throw Error('Deferred tasks to flush (' + $browser.deferredFns.length + '): ' +
+ formatPendingTasksAsString($browser.deferredFns));
+ }
+ };
+
+ function formatPendingTasksAsString(tasks) {
+ var result = [];
+ angular.forEach(tasks, function(task) {
+ result.push('{id: ' + task.id + ', ' + 'time: ' + task.time + '}');
+ });
+
+ return result.join(', ');
+ }
+
+ return $delegate;
+};
+
+/**
+ *
+ */
+angular.mock.$RootElementProvider = function() {
+ this.$get = function() {
+ return angular.element('
');
+ }
+};
+
+/**
+ * @ngdoc overview
+ * @name ngMock
+ * @description
+ *
+ * The `ngMock` is an angular module which is used with `ng` module and adds unit-test configuration as well as useful
+ * mocks to the {@link AUTO.$injector $injector}.
+ */
+angular.module('ngMock', ['ng']).provider({
+ $browser: angular.mock.$BrowserProvider,
+ $exceptionHandler: angular.mock.$ExceptionHandlerProvider,
+ $log: angular.mock.$LogProvider,
+ $httpBackend: angular.mock.$HttpBackendProvider,
+ $rootElement: angular.mock.$RootElementProvider
+}).config(function($provide) {
+ $provide.decorator('$timeout', angular.mock.$TimeoutDecorator);
+});
+
+/**
+ * @ngdoc overview
+ * @name ngMockE2E
+ * @description
+ *
+ * The `ngMockE2E` is an angular module which contains mocks suitable for end-to-end testing.
+ * Currently there is only one mock present in this module -
+ * the {@link ngMockE2E.$httpBackend e2e $httpBackend} mock.
+ */
+angular.module('ngMockE2E', ['ng']).config(function($provide) {
+ $provide.decorator('$httpBackend', angular.mock.e2e.$httpBackendDecorator);
+});
+
+/**
+ * @ngdoc object
+ * @name ngMockE2E.$httpBackend
+ * @description
+ * Fake HTTP backend implementation suitable for end-to-end testing or backend-less development of
+ * applications that use the {@link ng.$http $http service}.
+ *
+ * *Note*: For fake http backend implementation suitable for unit testing please see
+ * {@link ngMock.$httpBackend unit-testing $httpBackend mock}.
+ *
+ * This implementation can be used to respond with static or dynamic responses via the `when` api
+ * and its shortcuts (`whenGET`, `whenPOST`, etc) and optionally pass through requests to the
+ * real $httpBackend for specific requests (e.g. to interact with certain remote apis or to fetch
+ * templates from a webserver).
+ *
+ * As opposed to unit-testing, in an end-to-end testing scenario or in scenario when an application
+ * is being developed with the real backend api replaced with a mock, it is often desirable for
+ * certain category of requests to bypass the mock and issue a real http request (e.g. to fetch
+ * templates or static files from the webserver). To configure the backend with this behavior
+ * use the `passThrough` request handler of `when` instead of `respond`.
+ *
+ * Additionally, we don't want to manually have to flush mocked out requests like we do during unit
+ * testing. For this reason the e2e $httpBackend automatically flushes mocked out requests
+ * automatically, closely simulating the behavior of the XMLHttpRequest object.
+ *
+ * To setup the application to run with this http backend, you have to create a module that depends
+ * on the `ngMockE2E` and your application modules and defines the fake backend:
+ *
+ *
+ * myAppDev = angular.module('myAppDev', ['myApp', 'ngMockE2E']);
+ * myAppDev.run(function($httpBackend) {
+ * phones = [{name: 'phone1'}, {name: 'phone2'}];
+ *
+ * // returns the current list of phones
+ * $httpBackend.whenGET('/phones').respond(phones);
+ *
+ * // adds a new phone to the phones array
+ * $httpBackend.whenPOST('/phones').respond(function(method, url, data) {
+ * phones.push(angular.fromJSON(data));
+ * });
+ * $httpBackend.whenGET(/^\/templates\//).passThrough();
+ * //...
+ * });
+ *
+ *
+ * Afterwards, bootstrap your app with this new module.
+ */
+
+/**
+ * @ngdoc method
+ * @name ngMockE2E.$httpBackend#when
+ * @methodOf ngMockE2E.$httpBackend
+ * @description
+ * Creates a new backend definition.
+ *
+ * @param {string} method HTTP method.
+ * @param {string|RegExp} url HTTP url.
+ * @param {(string|RegExp)=} data HTTP request body.
+ * @param {(Object|function(Object))=} headers HTTP headers or function that receives http header
+ * object and returns true if the headers match the current definition.
+ * @returns {requestHandler} Returns an object with `respond` and `passThrough` methods that
+ * control how a matched request is handled.
+ *
+ * - respond – `{function([status,] data[, headers])|function(function(method, url, data, headers)}`
+ * – The respond method takes a set of static data to be returned or a function that can return
+ * an array containing response status (number), response data (string) and response headers
+ * (Object).
+ * - passThrough – `{function()}` – Any request matching a backend definition with `passThrough`
+ * handler, will be pass through to the real backend (an XHR request will be made to the
+ * server.
+ */
+
+/**
+ * @ngdoc method
+ * @name ngMockE2E.$httpBackend#whenGET
+ * @methodOf ngMockE2E.$httpBackend
+ * @description
+ * Creates a new backend definition for GET requests. For more info see `when()`.
+ *
+ * @param {string|RegExp} url HTTP url.
+ * @param {(Object|function(Object))=} headers HTTP headers.
+ * @returns {requestHandler} Returns an object with `respond` and `passThrough` methods that
+ * control how a matched request is handled.
+ */
+
+/**
+ * @ngdoc method
+ * @name ngMockE2E.$httpBackend#whenHEAD
+ * @methodOf ngMockE2E.$httpBackend
+ * @description
+ * Creates a new backend definition for HEAD requests. For more info see `when()`.
+ *
+ * @param {string|RegExp} url HTTP url.
+ * @param {(Object|function(Object))=} headers HTTP headers.
+ * @returns {requestHandler} Returns an object with `respond` and `passThrough` methods that
+ * control how a matched request is handled.
+ */
+
+/**
+ * @ngdoc method
+ * @name ngMockE2E.$httpBackend#whenDELETE
+ * @methodOf ngMockE2E.$httpBackend
+ * @description
+ * Creates a new backend definition for DELETE requests. For more info see `when()`.
+ *
+ * @param {string|RegExp} url HTTP url.
+ * @param {(Object|function(Object))=} headers HTTP headers.
+ * @returns {requestHandler} Returns an object with `respond` and `passThrough` methods that
+ * control how a matched request is handled.
+ */
+
+/**
+ * @ngdoc method
+ * @name ngMockE2E.$httpBackend#whenPOST
+ * @methodOf ngMockE2E.$httpBackend
+ * @description
+ * Creates a new backend definition for POST requests. For more info see `when()`.
+ *
+ * @param {string|RegExp} url HTTP url.
+ * @param {(string|RegExp)=} data HTTP request body.
+ * @param {(Object|function(Object))=} headers HTTP headers.
+ * @returns {requestHandler} Returns an object with `respond` and `passThrough` methods that
+ * control how a matched request is handled.
+ */
+
+/**
+ * @ngdoc method
+ * @name ngMockE2E.$httpBackend#whenPUT
+ * @methodOf ngMockE2E.$httpBackend
+ * @description
+ * Creates a new backend definition for PUT requests. For more info see `when()`.
+ *
+ * @param {string|RegExp} url HTTP url.
+ * @param {(string|RegExp)=} data HTTP request body.
+ * @param {(Object|function(Object))=} headers HTTP headers.
+ * @returns {requestHandler} Returns an object with `respond` and `passThrough` methods that
+ * control how a matched request is handled.
+ */
+
+/**
+ * @ngdoc method
+ * @name ngMockE2E.$httpBackend#whenPATCH
+ * @methodOf ngMockE2E.$httpBackend
+ * @description
+ * Creates a new backend definition for PATCH requests. For more info see `when()`.
+ *
+ * @param {string|RegExp} url HTTP url.
+ * @param {(string|RegExp)=} data HTTP request body.
+ * @param {(Object|function(Object))=} headers HTTP headers.
+ * @returns {requestHandler} Returns an object with `respond` and `passThrough` methods that
+ * control how a matched request is handled.
+ */
+
+/**
+ * @ngdoc method
+ * @name ngMockE2E.$httpBackend#whenJSONP
+ * @methodOf ngMockE2E.$httpBackend
+ * @description
+ * Creates a new backend definition for JSONP requests. For more info see `when()`.
+ *
+ * @param {string|RegExp} url HTTP url.
+ * @returns {requestHandler} Returns an object with `respond` and `passThrough` methods that
+ * control how a matched request is handled.
+ */
+angular.mock.e2e = {};
+angular.mock.e2e.$httpBackendDecorator = ['$rootScope', '$delegate', '$browser', createHttpBackendMock];
+
+
+angular.mock.clearDataCache = function() {
+ var key,
+ cache = angular.element.cache;
+
+ for(key in cache) {
+ if (cache.hasOwnProperty(key)) {
+ var handle = cache[key].handle;
+
+ handle && angular.element(handle.elem).unbind();
+ delete cache[key];
+ }
+ }
+};
+
+
+window.jstestdriver && (function(window) {
+ /**
+ * Global method to output any number of objects into JSTD console. Useful for debugging.
+ */
+ window.dump = function() {
+ var args = [];
+ angular.forEach(arguments, function(arg) {
+ args.push(angular.mock.dump(arg));
+ });
+ jstestdriver.console.log.apply(jstestdriver.console, args);
+ if (window.console) {
+ window.console.log.apply(window.console, args);
+ }
+ };
+})(window);
+
+
+(window.jasmine || window.mocha) && (function(window) {
+
+ var currentSpec = null;
+
+ beforeEach(function() {
+ currentSpec = this;
+ });
+
+ afterEach(function() {
+ var injector = currentSpec.$injector;
+
+ currentSpec.$injector = null;
+ currentSpec.$modules = null;
+ currentSpec = null;
+
+ if (injector) {
+ injector.get('$rootElement').unbind();
+ injector.get('$browser').pollFns.length = 0;
+ }
+
+ angular.mock.clearDataCache();
+
+ // clean up jquery's fragment cache
+ angular.forEach(angular.element.fragments, function(val, key) {
+ delete angular.element.fragments[key];
+ });
+
+ MockXhr.$$lastInstance = null;
+
+ angular.forEach(angular.callbacks, function(val, key) {
+ delete angular.callbacks[key];
+ });
+ angular.callbacks.counter = 0;
+ });
+
+ function isSpecRunning() {
+ return currentSpec && (window.mocha || currentSpec.queue.running);
+ }
+
+ /**
+ * @ngdoc function
+ * @name angular.mock.module
+ * @description
+ *
+ * *NOTE*: This function is also published on window for easy access.
+ *
+ * This function registers a module configuration code. It collects the configuration information
+ * which will be used when the injector is created by {@link angular.mock.inject inject}.
+ *
+ * See {@link angular.mock.inject inject} for usage example
+ *
+ * @param {...(string|Function)} fns any number of modules which are represented as string
+ * aliases or as anonymous module initialization functions. The modules are used to
+ * configure the injector. The 'ng' and 'ngMock' modules are automatically loaded.
+ */
+ window.module = angular.mock.module = function() {
+ var moduleFns = Array.prototype.slice.call(arguments, 0);
+ return isSpecRunning() ? workFn() : workFn;
+ /////////////////////
+ function workFn() {
+ if (currentSpec.$injector) {
+ throw Error('Injector already created, can not register a module!');
+ } else {
+ var modules = currentSpec.$modules || (currentSpec.$modules = []);
+ angular.forEach(moduleFns, function(module) {
+ modules.push(module);
+ });
+ }
+ }
+ };
+
+ /**
+ * @ngdoc function
+ * @name angular.mock.inject
+ * @description
+ *
+ * *NOTE*: This function is also published on window for easy access.
+ *
+ * The inject function wraps a function into an injectable function. The inject() creates new
+ * instance of {@link AUTO.$injector $injector} per test, which is then used for
+ * resolving references.
+ *
+ * See also {@link angular.mock.module module}
+ *
+ * Example of what a typical jasmine tests looks like with the inject method.
+ *
+ *
+ * angular.module('myApplicationModule', [])
+ * .value('mode', 'app')
+ * .value('version', 'v1.0.1');
+ *
+ *
+ * describe('MyApp', function() {
+ *
+ * // You need to load modules that you want to test,
+ * // it loads only the "ng" module by default.
+ * beforeEach(module('myApplicationModule'));
+ *
+ *
+ * // inject() is used to inject arguments of all given functions
+ * it('should provide a version', inject(function(mode, version) {
+ * expect(version).toEqual('v1.0.1');
+ * expect(mode).toEqual('app');
+ * }));
+ *
+ *
+ * // The inject and module method can also be used inside of the it or beforeEach
+ * it('should override a version and test the new version is injected', function() {
+ * // module() takes functions or strings (module aliases)
+ * module(function($provide) {
+ * $provide.value('version', 'overridden'); // override version here
+ * });
+ *
+ * inject(function(version) {
+ * expect(version).toEqual('overridden');
+ * });
+ * ));
+ * });
+ *
+ *
+ *
+ * @param {...Function} fns any number of functions which will be injected using the injector.
+ */
+ window.inject = angular.mock.inject = function() {
+ var blockFns = Array.prototype.slice.call(arguments, 0);
+ var errorForStack = new Error('Declaration Location');
+ return isSpecRunning() ? workFn() : workFn;
+ /////////////////////
+ function workFn() {
+ var modules = currentSpec.$modules || [];
+
+ modules.unshift('ngMock');
+ modules.unshift('ng');
+ var injector = currentSpec.$injector;
+ if (!injector) {
+ injector = currentSpec.$injector = angular.injector(modules);
+ }
+ for(var i = 0, ii = blockFns.length; i < ii; i++) {
+ try {
+ injector.invoke(blockFns[i] || angular.noop, this);
+ } catch (e) {
+ if(e.stack && errorForStack) e.stack += '\n' + errorForStack.stack;
+ throw e;
+ } finally {
+ errorForStack = null;
+ }
+ }
+ }
+ };
+})(window);
diff --git a/OurUmbraco.Site/umbraco/lib/angular/1.1.5/angular-resource.js b/OurUmbraco.Site/umbraco/lib/angular/1.1.5/angular-resource.js
index acaa84cd..2b9047ee 100644
--- a/OurUmbraco.Site/umbraco/lib/angular/1.1.5/angular-resource.js
+++ b/OurUmbraco.Site/umbraco/lib/angular/1.1.5/angular-resource.js
@@ -1,537 +1,537 @@
-/**
- * @license AngularJS v1.1.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.
- *
- * # Installation
- * To use $resource make sure you have included the `angular-resource.js` that comes in Angular
- * package. You can also find this file on Google CDN, bower as well as at
- * {@link http://code.angularjs.org/ code.angularjs.org}.
- *
- * Finally load the module in your application:
- *
- * angular.module('app', ['ngResource']);
- *
- * and you are ready to get started!
- *
- * @param {string} url A parametrized URL template with parameters prefixed by `:` as in
- * `/user/: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')`.
- *
- * If you are using a url with a suffix, just add the suffix, like this:
- * `$resource('http://example.com/resource.json')` or `$resource('http://example.com/:id.json')
- * or even `$resource('http://example.com/resource/:resource_id.:format')`
- * If the parameter before the suffix is empty, :resource_id in this case, then the `/.` will be
- * collapsed down to a single `.`. If you need this sequence to appear and not collapse then you
- * can escape it with `/\.`.
- *
- * @param {Object=} paramDefaults Default values for `url` parameters. These can be overridden in
- * `actions` methods. If any of the parameter value is a function, it will be executed every time
- * when a param value needs to be obtained for a request (unless the param was overridden).
- *
- * 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 format of {@link
- * ng.$http#Parameters $http.config}:
- *
- * {action1: {method:?, params:?, isArray:?, headers:?, ...},
- * action2: {method:?, params:?, isArray:?, headers:?, ...},
- * ...}
- *
- * 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. If any of the
- * parameter value is a function, it will be executed every time when a param value needs to be
- * obtained for a request (unless the param was overridden).
- * - **`url`** – {string} – action specific `url` override. The url templating is supported just like
- * for the resource-level urls.
- * - **`isArray`** – {boolean=} – If true then the returned object for this action is an array, see
- * `returns` section.
- * - **`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|Promise}` – timeout in milliseconds, or {@link ng.$q promise} that
- * should abort the request when resolved.
- * - **`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.
- * - **`responseType`** - `{string}` - see {@link
- * https://developer.mozilla.org/en-US/docs/DOM/XMLHttpRequest#responseType requestType}.
- *
- * @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('/user/:userId', {userId:'@id'});
- var user = User.get({userId:123}, function() {
- user.abc = true;
- user.$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])`
- *
- *
- * The Resource instances and collection have these additional properties:
- *
- * - `$then`: the `then` method of a {@link ng.$q promise} derived from the underlying
- * {@link ng.$http $http} call.
- *
- * The success callback for the `$then` method will be resolved if the underlying `$http` requests
- * succeeds.
- *
- * The success callback is called with a single object which is the {@link ng.$http http response}
- * object extended with a new property `resource`. This `resource` property is a reference to the
- * result of the resource action — resource object or array of resources.
- *
- * The error callback is called with the {@link ng.$http http response} object when an http
- * error occurs.
- *
- * - `$resolved`: true if the promise has been resolved (either with success or rejection);
- * Knowing if the Resource has been resolved is useful in data-binding.
- *
- * @example
- *
- * # Credit card resource
- *
- *
- // Define CreditCard class
- var CreditCard = $resource('/user/: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: /user/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: /user/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: /user/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: /user/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`, `params` and `headers`.
- * 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('/user/:userId', {userId:'@id'});
- var user = User.get({userId:123}, function() {
- user.abc = true;
- user.$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('/user/:userId', {userId:'@id'});
- User.get({userId:123}, function(u, getResponseHeaders){
- u.abc = true;
- u.$save(function(u, putResponseHeaders) {
- //u => saved user object
- //putResponseHeaders => $http header getter
- });
- });
-
-
- * # Buzz client
-
- Let's look at what a buzz client created with the `$resource` service looks like:
-
-
-
-
-
-
-
fetch
-
-
-
- {{item.object.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 because encodeURIComponent is too aggressive 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(/%20/g, (pctEncodeSpaces ? '%20' : '+'));
- }
-
- function Route(template, defaults) {
- this.template = template;
- this.defaults = defaults || {};
- this.urlParams = {};
- }
-
- Route.prototype = {
- setUrlParams: function(config, params, actionUrl) {
- var self = this,
- url = actionUrl || self.template,
- val,
- encodedVal;
-
- var urlParams = self.urlParams = {};
- forEach(url.split(/\W/), function(param){
- if (param && (new RegExp("(^|[^\\\\]):" + param + "(\\W|$)").test(url))) {
- urlParams[param] = true;
- }
- });
- url = url.replace(/\\:/g, ':');
-
- params = params || {};
- forEach(self.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;
- }
- });
- }
- });
-
- // strip trailing slashes and set the url
- url = url.replace(/\/+$/, '');
- // then replace collapse `/.` if found in the last URL path segment before the query
- // E.g. `http://url.com/id./format?q=x` becomes `http://url.com/id.format?q=x`
- url = url.replace(/\/\.(?=\w+($|\?))/, '.');
- // replace escaped `/\.` with `/.`
- config.url = url.replace(/\/\\\./, '/.');
-
-
- // set params - delegate param encoding to $http
- forEach(params, function(value, key){
- if (!self.urlParams[key]) {
- config.params = config.params || {};
- config.params[key] = value;
- }
- });
- }
- };
-
-
- 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){
- if (isFunction(value)) { value = value(); }
- ids[key] = value && 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;
- var promise;
-
- 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));
- var httpConfig = {},
- promise;
-
- forEach(action, function(value, key) {
- if (key != 'params' && key != 'isArray' ) {
- httpConfig[key] = copy(value);
- }
- });
- httpConfig.data = data;
- route.setUrlParams(httpConfig, extend({}, extractParams(data, action.params || {}), params), action.url);
-
- function markResolved() { value.$resolved = true; }
-
- promise = $http(httpConfig);
- value.$resolved = false;
-
- promise.then(markResolved, markResolved);
- value.$then = promise.then(function(response) {
- var data = response.data;
- var then = value.$then, resolved = value.$resolved;
-
- if (data) {
- if (action.isArray) {
- value.length = 0;
- forEach(data, function(item) {
- value.push(new Resource(item));
- });
- } else {
- copy(data, value);
- value.$then = then;
- value.$resolved = resolved;
- }
- }
-
- (success||noop)(value, response.headers);
-
- response.resource = value;
- return response;
- }, error).then;
-
- 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);
+/**
+ * @license AngularJS v1.1.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.
+ *
+ * # Installation
+ * To use $resource make sure you have included the `angular-resource.js` that comes in Angular
+ * package. You can also find this file on Google CDN, bower as well as at
+ * {@link http://code.angularjs.org/ code.angularjs.org}.
+ *
+ * Finally load the module in your application:
+ *
+ * angular.module('app', ['ngResource']);
+ *
+ * and you are ready to get started!
+ *
+ * @param {string} url A parametrized URL template with parameters prefixed by `:` as in
+ * `/user/: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')`.
+ *
+ * If you are using a url with a suffix, just add the suffix, like this:
+ * `$resource('http://example.com/resource.json')` or `$resource('http://example.com/:id.json')
+ * or even `$resource('http://example.com/resource/:resource_id.:format')`
+ * If the parameter before the suffix is empty, :resource_id in this case, then the `/.` will be
+ * collapsed down to a single `.`. If you need this sequence to appear and not collapse then you
+ * can escape it with `/\.`.
+ *
+ * @param {Object=} paramDefaults Default values for `url` parameters. These can be overridden in
+ * `actions` methods. If any of the parameter value is a function, it will be executed every time
+ * when a param value needs to be obtained for a request (unless the param was overridden).
+ *
+ * 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 format of {@link
+ * ng.$http#Parameters $http.config}:
+ *
+ * {action1: {method:?, params:?, isArray:?, headers:?, ...},
+ * action2: {method:?, params:?, isArray:?, headers:?, ...},
+ * ...}
+ *
+ * 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. If any of the
+ * parameter value is a function, it will be executed every time when a param value needs to be
+ * obtained for a request (unless the param was overridden).
+ * - **`url`** – {string} – action specific `url` override. The url templating is supported just like
+ * for the resource-level urls.
+ * - **`isArray`** – {boolean=} – If true then the returned object for this action is an array, see
+ * `returns` section.
+ * - **`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|Promise}` – timeout in milliseconds, or {@link ng.$q promise} that
+ * should abort the request when resolved.
+ * - **`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.
+ * - **`responseType`** - `{string}` - see {@link
+ * https://developer.mozilla.org/en-US/docs/DOM/XMLHttpRequest#responseType requestType}.
+ *
+ * @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('/user/:userId', {userId:'@id'});
+ var user = User.get({userId:123}, function() {
+ user.abc = true;
+ user.$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])`
+ *
+ *
+ * The Resource instances and collection have these additional properties:
+ *
+ * - `$then`: the `then` method of a {@link ng.$q promise} derived from the underlying
+ * {@link ng.$http $http} call.
+ *
+ * The success callback for the `$then` method will be resolved if the underlying `$http` requests
+ * succeeds.
+ *
+ * The success callback is called with a single object which is the {@link ng.$http http response}
+ * object extended with a new property `resource`. This `resource` property is a reference to the
+ * result of the resource action — resource object or array of resources.
+ *
+ * The error callback is called with the {@link ng.$http http response} object when an http
+ * error occurs.
+ *
+ * - `$resolved`: true if the promise has been resolved (either with success or rejection);
+ * Knowing if the Resource has been resolved is useful in data-binding.
+ *
+ * @example
+ *
+ * # Credit card resource
+ *
+ *
+ // Define CreditCard class
+ var CreditCard = $resource('/user/: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: /user/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: /user/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: /user/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: /user/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`, `params` and `headers`.
+ * 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('/user/:userId', {userId:'@id'});
+ var user = User.get({userId:123}, function() {
+ user.abc = true;
+ user.$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('/user/:userId', {userId:'@id'});
+ User.get({userId:123}, function(u, getResponseHeaders){
+ u.abc = true;
+ u.$save(function(u, putResponseHeaders) {
+ //u => saved user object
+ //putResponseHeaders => $http header getter
+ });
+ });
+
+
+ * # Buzz client
+
+ Let's look at what a buzz client created with the `$resource` service looks like:
+
+
+
+
+
+
+
fetch
+
+
+
+ {{item.object.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 because encodeURIComponent is too aggressive 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(/%20/g, (pctEncodeSpaces ? '%20' : '+'));
+ }
+
+ function Route(template, defaults) {
+ this.template = template;
+ this.defaults = defaults || {};
+ this.urlParams = {};
+ }
+
+ Route.prototype = {
+ setUrlParams: function(config, params, actionUrl) {
+ var self = this,
+ url = actionUrl || self.template,
+ val,
+ encodedVal;
+
+ var urlParams = self.urlParams = {};
+ forEach(url.split(/\W/), function(param){
+ if (param && (new RegExp("(^|[^\\\\]):" + param + "(\\W|$)").test(url))) {
+ urlParams[param] = true;
+ }
+ });
+ url = url.replace(/\\:/g, ':');
+
+ params = params || {};
+ forEach(self.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;
+ }
+ });
+ }
+ });
+
+ // strip trailing slashes and set the url
+ url = url.replace(/\/+$/, '');
+ // then replace collapse `/.` if found in the last URL path segment before the query
+ // E.g. `http://url.com/id./format?q=x` becomes `http://url.com/id.format?q=x`
+ url = url.replace(/\/\.(?=\w+($|\?))/, '.');
+ // replace escaped `/\.` with `/.`
+ config.url = url.replace(/\/\\\./, '/.');
+
+
+ // set params - delegate param encoding to $http
+ forEach(params, function(value, key){
+ if (!self.urlParams[key]) {
+ config.params = config.params || {};
+ config.params[key] = value;
+ }
+ });
+ }
+ };
+
+
+ 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){
+ if (isFunction(value)) { value = value(); }
+ ids[key] = value && 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;
+ var promise;
+
+ 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));
+ var httpConfig = {},
+ promise;
+
+ forEach(action, function(value, key) {
+ if (key != 'params' && key != 'isArray' ) {
+ httpConfig[key] = copy(value);
+ }
+ });
+ httpConfig.data = data;
+ route.setUrlParams(httpConfig, extend({}, extractParams(data, action.params || {}), params), action.url);
+
+ function markResolved() { value.$resolved = true; }
+
+ promise = $http(httpConfig);
+ value.$resolved = false;
+
+ promise.then(markResolved, markResolved);
+ value.$then = promise.then(function(response) {
+ var data = response.data;
+ var then = value.$then, resolved = value.$resolved;
+
+ if (data) {
+ if (action.isArray) {
+ value.length = 0;
+ forEach(data, function(item) {
+ value.push(new Resource(item));
+ });
+ } else {
+ copy(data, value);
+ value.$then = then;
+ value.$resolved = resolved;
+ }
+ }
+
+ (success||noop)(value, response.headers);
+
+ response.resource = value;
+ return response;
+ }, error).then;
+
+ 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/OurUmbraco.Site/umbraco/lib/angular/1.1.5/angular-resource.min.js b/OurUmbraco.Site/umbraco/lib/angular/1.1.5/angular-resource.min.js
index a8848fa0..bdcdf0aa 100644
--- a/OurUmbraco.Site/umbraco/lib/angular/1.1.5/angular-resource.min.js
+++ b/OurUmbraco.Site/umbraco/lib/angular/1.1.5/angular-resource.min.js
@@ -1,11 +1,11 @@
-/*
- AngularJS v1.1.5
- (c) 2010-2012 Google, Inc. http://angularjs.org
- License: MIT
-*/
-(function(B,f,w){'use strict';f.module("ngResource",["ng"]).factory("$resource",["$http","$parse",function(x,y){function u(b,d){this.template=b;this.defaults=d||{};this.urlParams={}}function v(b,d,e){function j(c,b){var p={},b=m({},d,b);l(b,function(a,b){k(a)&&(a=a());var g;a&&a.charAt&&a.charAt(0)=="@"?(g=a.substr(1),g=y(g)(c)):g=a;p[b]=g});return p}function c(c){t(c||{},this)}var n=new u(b),e=m({},z,e);l(e,function(b,d){b.method=f.uppercase(b.method);var p=b.method=="POST"||b.method=="PUT"||b.method==
-"PATCH";c[d]=function(a,d,g,A){function f(){h.$resolved=!0}var i={},e,o=q,r=null;switch(arguments.length){case 4:r=A,o=g;case 3:case 2:if(k(d)){if(k(a)){o=a;r=d;break}o=d;r=g}else{i=a;e=d;o=g;break}case 1:k(a)?o=a:p?e=a:i=a;break;case 0:break;default:throw"Expected between 0-4 arguments [params, data, success, error], got "+arguments.length+" arguments.";}var h=this instanceof c?this:b.isArray?[]:new c(e),s={};l(b,function(a,b){b!="params"&&b!="isArray"&&(s[b]=t(a))});s.data=e;n.setUrlParams(s,m({},
-j(e,b.params||{}),i),b.url);i=x(s);h.$resolved=!1;i.then(f,f);h.$then=i.then(function(a){var d=a.data,g=h.$then,e=h.$resolved;if(d)b.isArray?(h.length=0,l(d,function(a){h.push(new c(a))})):(t(d,h),h.$then=g,h.$resolved=e);(o||q)(h,a.headers);a.resource=h;return a},r).then;return h};c.prototype["$"+d]=function(a,b,g){var e=j(this),f=q,i;switch(arguments.length){case 3:e=a;f=b;i=g;break;case 2:case 1:k(a)?(f=a,i=b):(e=a,f=b||q);case 0:break;default:throw"Expected between 1-3 arguments [params, success, error], got "+
-arguments.length+" arguments.";}c[d].call(this,e,p?this:w,f,i)}});c.bind=function(c){return v(b,m({},d,c),e)};return c}var z={get:{method:"GET"},save:{method:"POST"},query:{method:"GET",isArray:!0},remove:{method:"DELETE"},"delete":{method:"DELETE"}},q=f.noop,l=f.forEach,m=f.extend,t=f.copy,k=f.isFunction;u.prototype={setUrlParams:function(b,d,e){var j=this,c=e||j.template,n,k,m=j.urlParams={};l(c.split(/\W/),function(b){b&&RegExp("(^|[^\\\\]):"+b+"(\\W|$)").test(c)&&(m[b]=!0)});c=c.replace(/\\:/g,
-":");d=d||{};l(j.urlParams,function(b,a){n=d.hasOwnProperty(a)?d[a]:j.defaults[a];f.isDefined(n)&&n!==null?(k=encodeURIComponent(n).replace(/%40/gi,"@").replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%20/g,"%20").replace(/%26/gi,"&").replace(/%3D/gi,"=").replace(/%2B/gi,"+"),c=c.replace(RegExp(":"+a+"(\\W|$)","g"),k+"$1")):c=c.replace(RegExp("(/?):"+a+"(\\W|$)","g"),function(b,a,c){return c.charAt(0)=="/"?c:a+c})});c=c.replace(/\/+$/,"");c=c.replace(/\/\.(?=\w+($|\?))/,".");
-b.url=c.replace(/\/\\\./,"/.");l(d,function(c,a){if(!j.urlParams[a])b.params=b.params||{},b.params[a]=c})}};return v}])})(window,window.angular);
+/*
+ AngularJS v1.1.5
+ (c) 2010-2012 Google, Inc. http://angularjs.org
+ License: MIT
+*/
+(function(B,f,w){'use strict';f.module("ngResource",["ng"]).factory("$resource",["$http","$parse",function(x,y){function u(b,d){this.template=b;this.defaults=d||{};this.urlParams={}}function v(b,d,e){function j(c,b){var p={},b=m({},d,b);l(b,function(a,b){k(a)&&(a=a());var g;a&&a.charAt&&a.charAt(0)=="@"?(g=a.substr(1),g=y(g)(c)):g=a;p[b]=g});return p}function c(c){t(c||{},this)}var n=new u(b),e=m({},z,e);l(e,function(b,d){b.method=f.uppercase(b.method);var p=b.method=="POST"||b.method=="PUT"||b.method==
+"PATCH";c[d]=function(a,d,g,A){function f(){h.$resolved=!0}var i={},e,o=q,r=null;switch(arguments.length){case 4:r=A,o=g;case 3:case 2:if(k(d)){if(k(a)){o=a;r=d;break}o=d;r=g}else{i=a;e=d;o=g;break}case 1:k(a)?o=a:p?e=a:i=a;break;case 0:break;default:throw"Expected between 0-4 arguments [params, data, success, error], got "+arguments.length+" arguments.";}var h=this instanceof c?this:b.isArray?[]:new c(e),s={};l(b,function(a,b){b!="params"&&b!="isArray"&&(s[b]=t(a))});s.data=e;n.setUrlParams(s,m({},
+j(e,b.params||{}),i),b.url);i=x(s);h.$resolved=!1;i.then(f,f);h.$then=i.then(function(a){var d=a.data,g=h.$then,e=h.$resolved;if(d)b.isArray?(h.length=0,l(d,function(a){h.push(new c(a))})):(t(d,h),h.$then=g,h.$resolved=e);(o||q)(h,a.headers);a.resource=h;return a},r).then;return h};c.prototype["$"+d]=function(a,b,g){var e=j(this),f=q,i;switch(arguments.length){case 3:e=a;f=b;i=g;break;case 2:case 1:k(a)?(f=a,i=b):(e=a,f=b||q);case 0:break;default:throw"Expected between 1-3 arguments [params, success, error], got "+
+arguments.length+" arguments.";}c[d].call(this,e,p?this:w,f,i)}});c.bind=function(c){return v(b,m({},d,c),e)};return c}var z={get:{method:"GET"},save:{method:"POST"},query:{method:"GET",isArray:!0},remove:{method:"DELETE"},"delete":{method:"DELETE"}},q=f.noop,l=f.forEach,m=f.extend,t=f.copy,k=f.isFunction;u.prototype={setUrlParams:function(b,d,e){var j=this,c=e||j.template,n,k,m=j.urlParams={};l(c.split(/\W/),function(b){b&&RegExp("(^|[^\\\\]):"+b+"(\\W|$)").test(c)&&(m[b]=!0)});c=c.replace(/\\:/g,
+":");d=d||{};l(j.urlParams,function(b,a){n=d.hasOwnProperty(a)?d[a]:j.defaults[a];f.isDefined(n)&&n!==null?(k=encodeURIComponent(n).replace(/%40/gi,"@").replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%20/g,"%20").replace(/%26/gi,"&").replace(/%3D/gi,"=").replace(/%2B/gi,"+"),c=c.replace(RegExp(":"+a+"(\\W|$)","g"),k+"$1")):c=c.replace(RegExp("(/?):"+a+"(\\W|$)","g"),function(b,a,c){return c.charAt(0)=="/"?c:a+c})});c=c.replace(/\/+$/,"");c=c.replace(/\/\.(?=\w+($|\?))/,".");
+b.url=c.replace(/\/\\\./,"/.");l(d,function(c,a){if(!j.urlParams[a])b.params=b.params||{},b.params[a]=c})}};return v}])})(window,window.angular);
diff --git a/OurUmbraco.Site/umbraco/lib/angular/1.1.5/angular-sanitize.js b/OurUmbraco.Site/umbraco/lib/angular/1.1.5/angular-sanitize.js
index 8bb03a7d..60d002ed 100644
--- a/OurUmbraco.Site/umbraco/lib/angular/1.1.5/angular-sanitize.js
+++ b/OurUmbraco.Site/umbraco/lib/angular/1.1.5/angular-sanitize.js
@@ -1,558 +1,558 @@
-/**
- * @license AngularJS v1.1.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:
-
-
- Filter
- Source
- Rendered
-
-
- 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 = /^,
- BEGING_END_TAGE_REGEXP = /^<\s*\//,
- COMMENT_REGEXP = //g,
- CDATA_REGEXP = //g,
- URI_REGEXP = /^((ftp|https?):\/\/|mailto:|tel:|#)/,
- 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('');
- out(tag);
- 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.
- * @param {string} target Window (_blank|_self|_parent|_top) or named frame to open links in.
- * @returns {string} Html-linkified text.
- *
- * @usage
-
- *
- * @example
-
-
-
-
- Snippet:
-
-
- Filter
- Source
- Rendered
-
-
- linky filter
-
- <div ng-bind-html="snippet | linky"> </div>
-
-
-
-
-
-
- linky target
-
- <div ng-bind-html="snippetWithTarget | linky:'_blank'"> </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.');
- });
-
- it('should work with the target property', function() {
- expect(using('#linky-target').binding("snippetWithTarget | linky:'_blank'")).
- toBe('http://angularjs.org/ ');
- });
-
-
- */
-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, target) {
- if (!text) return text;
- var match;
- var raw = text;
- var html = [];
- // TODO(vojta): use $sanitize instead
- var writer = htmlSanitizeWriter(html);
- var url;
- var i;
- var properties = {};
- if (angular.isDefined(target)) {
- properties.target = target;
- }
- 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));
- properties.href = url;
- writer.start('a', properties);
- 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);
+/**
+ * @license AngularJS v1.1.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:
+
+
+ Filter
+ Source
+ Rendered
+
+
+ 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 = /^,
+ BEGING_END_TAGE_REGEXP = /^<\s*\//,
+ COMMENT_REGEXP = //g,
+ CDATA_REGEXP = //g,
+ URI_REGEXP = /^((ftp|https?):\/\/|mailto:|tel:|#)/,
+ 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('');
+ out(tag);
+ 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.
+ * @param {string} target Window (_blank|_self|_parent|_top) or named frame to open links in.
+ * @returns {string} Html-linkified text.
+ *
+ * @usage
+
+ *
+ * @example
+
+
+
+
+ Snippet:
+
+
+ Filter
+ Source
+ Rendered
+
+
+ linky filter
+
+ <div ng-bind-html="snippet | linky"> </div>
+
+
+
+
+
+
+ linky target
+
+ <div ng-bind-html="snippetWithTarget | linky:'_blank'"> </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.');
+ });
+
+ it('should work with the target property', function() {
+ expect(using('#linky-target').binding("snippetWithTarget | linky:'_blank'")).
+ toBe('http://angularjs.org/ ');
+ });
+
+
+ */
+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, target) {
+ if (!text) return text;
+ var match;
+ var raw = text;
+ var html = [];
+ // TODO(vojta): use $sanitize instead
+ var writer = htmlSanitizeWriter(html);
+ var url;
+ var i;
+ var properties = {};
+ if (angular.isDefined(target)) {
+ properties.target = target;
+ }
+ 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));
+ properties.href = url;
+ writer.start('a', properties);
+ 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/OurUmbraco.Site/umbraco/lib/angular/1.1.5/angular-sanitize.min.js b/OurUmbraco.Site/umbraco/lib/angular/1.1.5/angular-sanitize.min.js
index 593c4ef6..011862bb 100644
--- a/OurUmbraco.Site/umbraco/lib/angular/1.1.5/angular-sanitize.min.js
+++ b/OurUmbraco.Site/umbraco/lib/angular/1.1.5/angular-sanitize.min.js
@@ -1,13 +1,13 @@
-/*
- AngularJS v1.1.5
- (c) 2010-2012 Google, Inc. http://angularjs.org
- License: MIT
-*/
-(function(I,h){'use strict';function i(a){var d={},a=a.split(","),c;for(c=0;c
=0;c--)if(e[c]==b)break;if(c>=0){for(g=e.length-1;g>=c;g--)d.end&&d.end(e[g]);e.length=
-c}}var b,f,e=[],j=a;for(e.last=function(){return e[e.length-1]};a;){f=!0;if(!e.last()||!q[e.last()]){if(a.indexOf("<\!--")===0)b=a.indexOf("--\>"),b>=0&&(d.comment&&d.comment(a.substring(4,b)),a=a.substring(b+3),f=!1);else if(B.test(a)){if(b=a.match(r))a=a.substring(b[0].length),b[0].replace(r,g),f=!1}else if(C.test(a)&&(b=a.match(s)))a=a.substring(b[0].length),b[0].replace(s,c),f=!1;f&&(b=a.indexOf("<"),f=b<0?a:a.substring(0,b),a=b<0?"":a.substring(b),d.chars&&d.chars(k(f)))}else a=a.replace(RegExp("(.*)<\\s*\\/\\s*"+
-e.last()+"[^>]*>","i"),function(a,b){b=b.replace(D,"$1").replace(E,"$1");d.chars&&d.chars(k(b));return""}),g("",e.last());if(a==j)throw"Parse Error: "+a;j=a}g()}function k(a){l.innerHTML=a.replace(//g,">")}function u(a){var d=!1,c=h.bind(a,a.push);return{start:function(a,b,f){a=h.lowercase(a);!d&&q[a]&&(d=a);!d&&v[a]==
-!0&&(c("<"),c(a),h.forEach(b,function(a,b){var d=h.lowercase(b);if(G[d]==!0&&(w[d]!==!0||a.match(H)))c(" "),c(b),c('="'),c(t(a)),c('"')}),c(f?"/>":">"))},end:function(a){a=h.lowercase(a);!d&&v[a]==!0&&(c(""),c(a),c(">"));a==d&&(d=!1)},chars:function(a){d||c(t(a))}}}var s=/^<\s*([\w:-]+)((?:\s+[\w:-]+(?:\s*=\s*(?:(?:"[^"]*")|(?:'[^']*')|[^>\s]+))?)*)\s*(\/?)\s*>/,r=/^<\s*\/\s*([\w:-]+)[^>]*>/,A=/([\w:-]+)(?:\s*=\s*(?:(?:"((?:[^"])*)")|(?:'((?:[^'])*)')|([^>\s]+)))?/g,C=/^,B=/^<\s*\//,D=/<\!--(.*?)--\>/g,
-E=//g,H=/^((ftp|https?):\/\/|mailto:|tel:|#)/,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=h.extend({},y,x),m=h.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=h.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=h.extend({},p,m,n,o),w=i("background,cite,href,longdesc,src,usemap"),G=h.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");h.module("ngSanitize",[]).value("$sanitize",function(a){var d=[];
-z(a,u(d));return d.join("")});h.module("ngSanitize").directive("ngBindHtml",["$sanitize",function(a){return function(d,c,g){c.addClass("ng-binding").data("$binding",g.ngBindHtml);d.$watch(g.ngBindHtml,function(b){b=a(b);c.html(b||"")})}}]);h.module("ngSanitize").filter("linky",function(){var a=/((ftp|https?):\/\/|(mailto:)?[A-Za-z0-9._%+-]+@)\S*[^\s\.\;\,\(\)\{\}\<\>]/,d=/^mailto:/;return function(c,g){if(!c)return c;var b,f=c,e=[],j=u(e),i,k,l={};if(h.isDefined(g))l.target=g;for(;b=f.match(a);)i=
-b[0],b[2]==b[3]&&(i="mailto:"+i),k=b.index,j.chars(f.substr(0,k)),l.href=i,j.start("a",l),j.chars(b[0].replace(d,"")),j.end("a"),f=f.substring(k+b[0].length);j.chars(f);return e.join("")}})})(window,window.angular);
+/*
+ AngularJS v1.1.5
+ (c) 2010-2012 Google, Inc. http://angularjs.org
+ License: MIT
+*/
+(function(I,h){'use strict';function i(a){var d={},a=a.split(","),c;for(c=0;c=0;c--)if(e[c]==b)break;if(c>=0){for(g=e.length-1;g>=c;g--)d.end&&d.end(e[g]);e.length=
+c}}var b,f,e=[],j=a;for(e.last=function(){return e[e.length-1]};a;){f=!0;if(!e.last()||!q[e.last()]){if(a.indexOf("<\!--")===0)b=a.indexOf("--\>"),b>=0&&(d.comment&&d.comment(a.substring(4,b)),a=a.substring(b+3),f=!1);else if(B.test(a)){if(b=a.match(r))a=a.substring(b[0].length),b[0].replace(r,g),f=!1}else if(C.test(a)&&(b=a.match(s)))a=a.substring(b[0].length),b[0].replace(s,c),f=!1;f&&(b=a.indexOf("<"),f=b<0?a:a.substring(0,b),a=b<0?"":a.substring(b),d.chars&&d.chars(k(f)))}else a=a.replace(RegExp("(.*)<\\s*\\/\\s*"+
+e.last()+"[^>]*>","i"),function(a,b){b=b.replace(D,"$1").replace(E,"$1");d.chars&&d.chars(k(b));return""}),g("",e.last());if(a==j)throw"Parse Error: "+a;j=a}g()}function k(a){l.innerHTML=a.replace(//g,">")}function u(a){var d=!1,c=h.bind(a,a.push);return{start:function(a,b,f){a=h.lowercase(a);!d&&q[a]&&(d=a);!d&&v[a]==
+!0&&(c("<"),c(a),h.forEach(b,function(a,b){var d=h.lowercase(b);if(G[d]==!0&&(w[d]!==!0||a.match(H)))c(" "),c(b),c('="'),c(t(a)),c('"')}),c(f?"/>":">"))},end:function(a){a=h.lowercase(a);!d&&v[a]==!0&&(c(""),c(a),c(">"));a==d&&(d=!1)},chars:function(a){d||c(t(a))}}}var s=/^<\s*([\w:-]+)((?:\s+[\w:-]+(?:\s*=\s*(?:(?:"[^"]*")|(?:'[^']*')|[^>\s]+))?)*)\s*(\/?)\s*>/,r=/^<\s*\/\s*([\w:-]+)[^>]*>/,A=/([\w:-]+)(?:\s*=\s*(?:(?:"((?:[^"])*)")|(?:'((?:[^'])*)')|([^>\s]+)))?/g,C=/^,B=/^<\s*\//,D=/<\!--(.*?)--\>/g,
+E=//g,H=/^((ftp|https?):\/\/|mailto:|tel:|#)/,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=h.extend({},y,x),m=h.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=h.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=h.extend({},p,m,n,o),w=i("background,cite,href,longdesc,src,usemap"),G=h.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");h.module("ngSanitize",[]).value("$sanitize",function(a){var d=[];
+z(a,u(d));return d.join("")});h.module("ngSanitize").directive("ngBindHtml",["$sanitize",function(a){return function(d,c,g){c.addClass("ng-binding").data("$binding",g.ngBindHtml);d.$watch(g.ngBindHtml,function(b){b=a(b);c.html(b||"")})}}]);h.module("ngSanitize").filter("linky",function(){var a=/((ftp|https?):\/\/|(mailto:)?[A-Za-z0-9._%+-]+@)\S*[^\s\.\;\,\(\)\{\}\<\>]/,d=/^mailto:/;return function(c,g){if(!c)return c;var b,f=c,e=[],j=u(e),i,k,l={};if(h.isDefined(g))l.target=g;for(;b=f.match(a);)i=
+b[0],b[2]==b[3]&&(i="mailto:"+i),k=b.index,j.chars(f.substr(0,k)),l.href=i,j.start("a",l),j.chars(b[0].replace(d,"")),j.end("a"),f=f.substring(k+b[0].length);j.chars(f);return e.join("")}})})(window,window.angular);
diff --git a/OurUmbraco.Site/umbraco/lib/angular/1.1.5/angular-scenario.js b/OurUmbraco.Site/umbraco/lib/angular/1.1.5/angular-scenario.js
index 3ead0033..8f3f78d2 100644
--- a/OurUmbraco.Site/umbraco/lib/angular/1.1.5/angular-scenario.js
+++ b/OurUmbraco.Site/umbraco/lib/angular/1.1.5/angular-scenario.js
@@ -1,28463 +1,28463 @@
-/*!
- * jQuery JavaScript Library v1.8.2
- * http://jquery.com/
- *
- * Includes Sizzle.js
- * http://sizzlejs.com/
- *
- * Copyright 2012 jQuery Foundation and other contributors
- * Released under the MIT license
- * http://jquery.org/license
- *
- * Date: Thu Sep 20 2012 21:13:05 GMT-0400 (Eastern Daylight Time)
- */
-(function( window, undefined ) {
-'use strict';
-var
- // A central reference to the root jQuery(document)
- rootjQuery,
-
- // The deferred used on DOM ready
- readyList,
-
- // Use the correct document accordingly with window argument (sandbox)
- document = window.document,
- location = window.location,
- navigator = window.navigator,
-
- // Map over jQuery in case of overwrite
- _jQuery = window.jQuery,
-
- // Map over the $ in case of overwrite
- _$ = window.$,
-
- // Save a reference to some core methods
- core_push = Array.prototype.push,
- core_slice = Array.prototype.slice,
- core_indexOf = Array.prototype.indexOf,
- core_toString = Object.prototype.toString,
- core_hasOwn = Object.prototype.hasOwnProperty,
- core_trim = String.prototype.trim,
-
- // Define a local copy of jQuery
- jQuery = function( selector, context ) {
- // The jQuery object is actually just the init constructor 'enhanced'
- return new jQuery.fn.init( selector, context, rootjQuery );
- },
-
- // Used for matching numbers
- core_pnum = /[\-+]?(?:\d*\.|)\d+(?:[eE][\-+]?\d+|)/.source,
-
- // Used for detecting and trimming whitespace
- core_rnotwhite = /\S/,
- core_rspace = /\s+/,
-
- // Make sure we trim BOM and NBSP (here's looking at you, Safari 5.0 and IE)
- rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,
-
- // A simple way to check for HTML strings
- // Prioritize #id over to avoid XSS via location.hash (#9521)
- rquickExpr = /^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,
-
- // Match a standalone tag
- rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>|)$/,
-
- // JSON RegExp
- rvalidchars = /^[\],:{}\s]*$/,
- rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g,
- rvalidescape = /\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,
- rvalidtokens = /"[^"\\\r\n]*"|true|false|null|-?(?:\d\d*\.|)\d+(?:[eE][\-+]?\d+|)/g,
-
- // Matches dashed string for camelizing
- rmsPrefix = /^-ms-/,
- rdashAlpha = /-([\da-z])/gi,
-
- // Used by jQuery.camelCase as callback to replace()
- fcamelCase = function( all, letter ) {
- return ( letter + "" ).toUpperCase();
- },
-
- // The ready event handler and self cleanup method
- DOMContentLoaded = function() {
- if ( document.addEventListener ) {
- document.removeEventListener( "DOMContentLoaded", DOMContentLoaded, false );
- jQuery.ready();
- } else if ( document.readyState === "complete" ) {
- // we're here because readyState === "complete" in oldIE
- // which is good enough for us to call the dom ready!
- document.detachEvent( "onreadystatechange", DOMContentLoaded );
- jQuery.ready();
- }
- },
-
- // [[Class]] -> type pairs
- class2type = {};
-
-jQuery.fn = jQuery.prototype = {
- constructor: jQuery,
- init: function( selector, context, rootjQuery ) {
- var match, elem, ret, doc;
-
- // Handle $(""), $(null), $(undefined), $(false)
- if ( !selector ) {
- return this;
- }
-
- // Handle $(DOMElement)
- if ( selector.nodeType ) {
- this.context = this[0] = selector;
- this.length = 1;
- return this;
- }
-
- // Handle HTML strings
- if ( typeof selector === "string" ) {
- if ( selector.charAt(0) === "<" && selector.charAt( selector.length - 1 ) === ">" && selector.length >= 3 ) {
- // Assume that strings that start and end with <> are HTML and skip the regex check
- match = [ null, selector, null ];
-
- } else {
- match = rquickExpr.exec( selector );
- }
-
- // Match html or make sure no context is specified for #id
- if ( match && (match[1] || !context) ) {
-
- // HANDLE: $(html) -> $(array)
- if ( match[1] ) {
- context = context instanceof jQuery ? context[0] : context;
- doc = ( context && context.nodeType ? context.ownerDocument || context : document );
-
- // scripts is true for back-compat
- selector = jQuery.parseHTML( match[1], doc, true );
- if ( rsingleTag.test( match[1] ) && jQuery.isPlainObject( context ) ) {
- this.attr.call( selector, context, true );
- }
-
- return jQuery.merge( this, selector );
-
- // HANDLE: $(#id)
- } else {
- elem = document.getElementById( match[2] );
-
- // Check parentNode to catch when Blackberry 4.6 returns
- // nodes that are no longer in the document #6963
- if ( elem && elem.parentNode ) {
- // Handle the case where IE and Opera return items
- // by name instead of ID
- if ( elem.id !== match[2] ) {
- return rootjQuery.find( selector );
- }
-
- // Otherwise, we inject the element directly into the jQuery object
- this.length = 1;
- this[0] = elem;
- }
-
- this.context = document;
- this.selector = selector;
- return this;
- }
-
- // HANDLE: $(expr, $(...))
- } else if ( !context || context.jquery ) {
- return ( context || rootjQuery ).find( selector );
-
- // HANDLE: $(expr, context)
- // (which is just equivalent to: $(context).find(expr)
- } else {
- return this.constructor( context ).find( selector );
- }
-
- // HANDLE: $(function)
- // Shortcut for document ready
- } else if ( jQuery.isFunction( selector ) ) {
- return rootjQuery.ready( selector );
- }
-
- if ( selector.selector !== undefined ) {
- this.selector = selector.selector;
- this.context = selector.context;
- }
-
- return jQuery.makeArray( selector, this );
- },
-
- // Start with an empty selector
- selector: "",
-
- // The current version of jQuery being used
- jquery: "1.8.2",
-
- // The default length of a jQuery object is 0
- length: 0,
-
- // The number of elements contained in the matched element set
- size: function() {
- return this.length;
- },
-
- toArray: function() {
- return core_slice.call( this );
- },
-
- // Get the Nth element in the matched element set OR
- // Get the whole matched element set as a clean array
- get: function( num ) {
- return num == null ?
-
- // Return a 'clean' array
- this.toArray() :
-
- // Return just the object
- ( num < 0 ? this[ this.length + num ] : this[ num ] );
- },
-
- // Take an array of elements and push it onto the stack
- // (returning the new matched element set)
- pushStack: function( elems, name, selector ) {
-
- // Build a new jQuery matched element set
- var ret = jQuery.merge( this.constructor(), elems );
-
- // Add the old object onto the stack (as a reference)
- ret.prevObject = this;
-
- ret.context = this.context;
-
- if ( name === "find" ) {
- ret.selector = this.selector + ( this.selector ? " " : "" ) + selector;
- } else if ( name ) {
- ret.selector = this.selector + "." + name + "(" + selector + ")";
- }
-
- // Return the newly-formed element set
- return ret;
- },
-
- // Execute a callback for every element in the matched set.
- // (You can seed the arguments with an array of args, but this is
- // only used internally.)
- each: function( callback, args ) {
- return jQuery.each( this, callback, args );
- },
-
- ready: function( fn ) {
- // Add the callback
- jQuery.ready.promise().done( fn );
-
- return this;
- },
-
- eq: function( i ) {
- i = +i;
- return i === -1 ?
- this.slice( i ) :
- this.slice( i, i + 1 );
- },
-
- first: function() {
- return this.eq( 0 );
- },
-
- last: function() {
- return this.eq( -1 );
- },
-
- slice: function() {
- return this.pushStack( core_slice.apply( this, arguments ),
- "slice", core_slice.call(arguments).join(",") );
- },
-
- map: function( callback ) {
- return this.pushStack( jQuery.map(this, function( elem, i ) {
- return callback.call( elem, i, elem );
- }));
- },
-
- end: function() {
- return this.prevObject || this.constructor(null);
- },
-
- // For internal use only.
- // Behaves like an Array's method, not like a jQuery method.
- push: core_push,
- sort: [].sort,
- splice: [].splice
-};
-
-// Give the init function the jQuery prototype for later instantiation
-jQuery.fn.init.prototype = jQuery.fn;
-
-jQuery.extend = jQuery.fn.extend = function() {
- var options, name, src, copy, copyIsArray, clone,
- target = arguments[0] || {},
- i = 1,
- length = arguments.length,
- deep = false;
-
- // Handle a deep copy situation
- if ( typeof target === "boolean" ) {
- deep = target;
- target = arguments[1] || {};
- // skip the boolean and the target
- i = 2;
- }
-
- // Handle case when target is a string or something (possible in deep copy)
- if ( typeof target !== "object" && !jQuery.isFunction(target) ) {
- target = {};
- }
-
- // extend jQuery itself if only one argument is passed
- if ( length === i ) {
- target = this;
- --i;
- }
-
- for ( ; i < length; i++ ) {
- // Only deal with non-null/undefined values
- if ( (options = arguments[ i ]) != null ) {
- // Extend the base object
- for ( name in options ) {
- src = target[ name ];
- copy = options[ name ];
-
- // Prevent never-ending loop
- if ( target === copy ) {
- continue;
- }
-
- // Recurse if we're merging plain objects or arrays
- if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) {
- if ( copyIsArray ) {
- copyIsArray = false;
- clone = src && jQuery.isArray(src) ? src : [];
-
- } else {
- clone = src && jQuery.isPlainObject(src) ? src : {};
- }
-
- // Never move original objects, clone them
- target[ name ] = jQuery.extend( deep, clone, copy );
-
- // Don't bring in undefined values
- } else if ( copy !== undefined ) {
- target[ name ] = copy;
- }
- }
- }
- }
-
- // Return the modified object
- return target;
-};
-
-jQuery.extend({
- noConflict: function( deep ) {
- if ( window.$ === jQuery ) {
- window.$ = _$;
- }
-
- if ( deep && window.jQuery === jQuery ) {
- window.jQuery = _jQuery;
- }
-
- return jQuery;
- },
-
- // Is the DOM ready to be used? Set to true once it occurs.
- isReady: false,
-
- // A counter to track how many items to wait for before
- // the ready event fires. See #6781
- readyWait: 1,
-
- // Hold (or release) the ready event
- holdReady: function( hold ) {
- if ( hold ) {
- jQuery.readyWait++;
- } else {
- jQuery.ready( true );
- }
- },
-
- // Handle when the DOM is ready
- ready: function( wait ) {
-
- // Abort if there are pending holds or we're already ready
- if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {
- return;
- }
-
- // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
- if ( !document.body ) {
- return setTimeout( jQuery.ready, 1 );
- }
-
- // Remember that the DOM is ready
- jQuery.isReady = true;
-
- // If a normal DOM Ready event fired, decrement, and wait if need be
- if ( wait !== true && --jQuery.readyWait > 0 ) {
- return;
- }
-
- // If there are functions bound, to execute
- readyList.resolveWith( document, [ jQuery ] );
-
- // Trigger any bound ready events
- if ( jQuery.fn.trigger ) {
- jQuery( document ).trigger("ready").off("ready");
- }
- },
-
- // See test/unit/core.js for details concerning isFunction.
- // Since version 1.3, DOM methods and functions like alert
- // aren't supported. They return false on IE (#2968).
- isFunction: function( obj ) {
- return jQuery.type(obj) === "function";
- },
-
- isArray: Array.isArray || function( obj ) {
- return jQuery.type(obj) === "array";
- },
-
- isWindow: function( obj ) {
- return obj != null && obj == obj.window;
- },
-
- isNumeric: function( obj ) {
- return !isNaN( parseFloat(obj) ) && isFinite( obj );
- },
-
- type: function( obj ) {
- return obj == null ?
- String( obj ) :
- class2type[ core_toString.call(obj) ] || "object";
- },
-
- isPlainObject: function( obj ) {
- // Must be an Object.
- // Because of IE, we also have to check the presence of the constructor property.
- // Make sure that DOM nodes and window objects don't pass through, as well
- if ( !obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) {
- return false;
- }
-
- try {
- // Not own constructor property must be Object
- if ( obj.constructor &&
- !core_hasOwn.call(obj, "constructor") &&
- !core_hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) {
- return false;
- }
- } catch ( e ) {
- // IE8,9 Will throw exceptions on certain host objects #9897
- return false;
- }
-
- // Own properties are enumerated firstly, so to speed up,
- // if last one is own, then all properties are own.
-
- var key;
- for ( key in obj ) {}
-
- return key === undefined || core_hasOwn.call( obj, key );
- },
-
- isEmptyObject: function( obj ) {
- var name;
- for ( name in obj ) {
- return false;
- }
- return true;
- },
-
- error: function( msg ) {
- throw new Error( msg );
- },
-
- // data: string of html
- // context (optional): If specified, the fragment will be created in this context, defaults to document
- // scripts (optional): If true, will include scripts passed in the html string
- parseHTML: function( data, context, scripts ) {
- var parsed;
- if ( !data || typeof data !== "string" ) {
- return null;
- }
- if ( typeof context === "boolean" ) {
- scripts = context;
- context = 0;
- }
- context = context || document;
-
- // Single tag
- if ( (parsed = rsingleTag.exec( data )) ) {
- return [ context.createElement( parsed[1] ) ];
- }
-
- parsed = jQuery.buildFragment( [ data ], context, scripts ? null : [] );
- return jQuery.merge( [],
- (parsed.cacheable ? jQuery.clone( parsed.fragment ) : parsed.fragment).childNodes );
- },
-
- parseJSON: function( data ) {
- if ( !data || typeof data !== "string") {
- return null;
- }
-
- // Make sure leading/trailing whitespace is removed (IE can't handle it)
- data = jQuery.trim( data );
-
- // Attempt to parse using the native JSON parser first
- if ( window.JSON && window.JSON.parse ) {
- return window.JSON.parse( data );
- }
-
- // Make sure the incoming data is actual JSON
- // Logic borrowed from http://json.org/json2.js
- if ( rvalidchars.test( data.replace( rvalidescape, "@" )
- .replace( rvalidtokens, "]" )
- .replace( rvalidbraces, "")) ) {
-
- return ( new Function( "return " + data ) )();
-
- }
- jQuery.error( "Invalid JSON: " + data );
- },
-
- // Cross-browser xml parsing
- parseXML: function( data ) {
- var xml, tmp;
- if ( !data || typeof data !== "string" ) {
- return null;
- }
- try {
- if ( window.DOMParser ) { // Standard
- tmp = new DOMParser();
- xml = tmp.parseFromString( data , "text/xml" );
- } else { // IE
- xml = new ActiveXObject( "Microsoft.XMLDOM" );
- xml.async = "false";
- xml.loadXML( data );
- }
- } catch( e ) {
- xml = undefined;
- }
- if ( !xml || !xml.documentElement || xml.getElementsByTagName( "parsererror" ).length ) {
- jQuery.error( "Invalid XML: " + data );
- }
- return xml;
- },
-
- noop: function() {},
-
- // Evaluates a script in a global context
- // Workarounds based on findings by Jim Driscoll
- // http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context
- globalEval: function( data ) {
- if ( data && core_rnotwhite.test( data ) ) {
- // We use execScript on Internet Explorer
- // We use an anonymous function so that context is window
- // rather than jQuery in Firefox
- ( window.execScript || function( data ) {
- window[ "eval" ].call( window, data );
- } )( data );
- }
- },
-
- // Convert dashed to camelCase; used by the css and data modules
- // Microsoft forgot to hump their vendor prefix (#9572)
- camelCase: function( string ) {
- return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase );
- },
-
- nodeName: function( elem, name ) {
- return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();
- },
-
- // args is for internal usage only
- each: function( obj, callback, args ) {
- var name,
- i = 0,
- length = obj.length,
- isObj = length === undefined || jQuery.isFunction( obj );
-
- if ( args ) {
- if ( isObj ) {
- for ( name in obj ) {
- if ( callback.apply( obj[ name ], args ) === false ) {
- break;
- }
- }
- } else {
- for ( ; i < length; ) {
- if ( callback.apply( obj[ i++ ], args ) === false ) {
- break;
- }
- }
- }
-
- // A special, fast, case for the most common use of each
- } else {
- if ( isObj ) {
- for ( name in obj ) {
- if ( callback.call( obj[ name ], name, obj[ name ] ) === false ) {
- break;
- }
- }
- } else {
- for ( ; i < length; ) {
- if ( callback.call( obj[ i ], i, obj[ i++ ] ) === false ) {
- break;
- }
- }
- }
- }
-
- return obj;
- },
-
- // Use native String.trim function wherever possible
- trim: core_trim && !core_trim.call("\uFEFF\xA0") ?
- function( text ) {
- return text == null ?
- "" :
- core_trim.call( text );
- } :
-
- // Otherwise use our own trimming functionality
- function( text ) {
- return text == null ?
- "" :
- ( text + "" ).replace( rtrim, "" );
- },
-
- // results is for internal usage only
- makeArray: function( arr, results ) {
- var type,
- ret = results || [];
-
- if ( arr != null ) {
- // The window, strings (and functions) also have 'length'
- // Tweaked logic slightly to handle Blackberry 4.7 RegExp issues #6930
- type = jQuery.type( arr );
-
- if ( arr.length == null || type === "string" || type === "function" || type === "regexp" || jQuery.isWindow( arr ) ) {
- core_push.call( ret, arr );
- } else {
- jQuery.merge( ret, arr );
- }
- }
-
- return ret;
- },
-
- inArray: function( elem, arr, i ) {
- var len;
-
- if ( arr ) {
- if ( core_indexOf ) {
- return core_indexOf.call( arr, elem, i );
- }
-
- len = arr.length;
- i = i ? i < 0 ? Math.max( 0, len + i ) : i : 0;
-
- for ( ; i < len; i++ ) {
- // Skip accessing in sparse arrays
- if ( i in arr && arr[ i ] === elem ) {
- return i;
- }
- }
- }
-
- return -1;
- },
-
- merge: function( first, second ) {
- var l = second.length,
- i = first.length,
- j = 0;
-
- if ( typeof l === "number" ) {
- for ( ; j < l; j++ ) {
- first[ i++ ] = second[ j ];
- }
-
- } else {
- while ( second[j] !== undefined ) {
- first[ i++ ] = second[ j++ ];
- }
- }
-
- first.length = i;
-
- return first;
- },
-
- grep: function( elems, callback, inv ) {
- var retVal,
- ret = [],
- i = 0,
- length = elems.length;
- inv = !!inv;
-
- // Go through the array, only saving the items
- // that pass the validator function
- for ( ; i < length; i++ ) {
- retVal = !!callback( elems[ i ], i );
- if ( inv !== retVal ) {
- ret.push( elems[ i ] );
- }
- }
-
- return ret;
- },
-
- // arg is for internal usage only
- map: function( elems, callback, arg ) {
- var value, key,
- ret = [],
- i = 0,
- length = elems.length,
- // jquery objects are treated as arrays
- isArray = elems instanceof jQuery || length !== undefined && typeof length === "number" && ( ( length > 0 && elems[ 0 ] && elems[ length -1 ] ) || length === 0 || jQuery.isArray( elems ) ) ;
-
- // Go through the array, translating each of the items to their
- if ( isArray ) {
- for ( ; i < length; i++ ) {
- value = callback( elems[ i ], i, arg );
-
- if ( value != null ) {
- ret[ ret.length ] = value;
- }
- }
-
- // Go through every key on the object,
- } else {
- for ( key in elems ) {
- value = callback( elems[ key ], key, arg );
-
- if ( value != null ) {
- ret[ ret.length ] = value;
- }
- }
- }
-
- // Flatten any nested arrays
- return ret.concat.apply( [], ret );
- },
-
- // A global GUID counter for objects
- guid: 1,
-
- // Bind a function to a context, optionally partially applying any
- // arguments.
- proxy: function( fn, context ) {
- var tmp, args, proxy;
-
- if ( typeof context === "string" ) {
- tmp = fn[ context ];
- context = fn;
- fn = tmp;
- }
-
- // Quick check to determine if target is callable, in the spec
- // this throws a TypeError, but we will just return undefined.
- if ( !jQuery.isFunction( fn ) ) {
- return undefined;
- }
-
- // Simulated bind
- args = core_slice.call( arguments, 2 );
- proxy = function() {
- return fn.apply( context, args.concat( core_slice.call( arguments ) ) );
- };
-
- // Set the guid of unique handler to the same of original handler, so it can be removed
- proxy.guid = fn.guid = fn.guid || jQuery.guid++;
-
- return proxy;
- },
-
- // Multifunctional method to get and set values of a collection
- // The value/s can optionally be executed if it's a function
- access: function( elems, fn, key, value, chainable, emptyGet, pass ) {
- var exec,
- bulk = key == null,
- i = 0,
- length = elems.length;
-
- // Sets many values
- if ( key && typeof key === "object" ) {
- for ( i in key ) {
- jQuery.access( elems, fn, i, key[i], 1, emptyGet, value );
- }
- chainable = 1;
-
- // Sets one value
- } else if ( value !== undefined ) {
- // Optionally, function values get executed if exec is true
- exec = pass === undefined && jQuery.isFunction( value );
-
- if ( bulk ) {
- // Bulk operations only iterate when executing function values
- if ( exec ) {
- exec = fn;
- fn = function( elem, key, value ) {
- return exec.call( jQuery( elem ), value );
- };
-
- // Otherwise they run against the entire set
- } else {
- fn.call( elems, value );
- fn = null;
- }
- }
-
- if ( fn ) {
- for (; i < length; i++ ) {
- fn( elems[i], key, exec ? value.call( elems[i], i, fn( elems[i], key ) ) : value, pass );
- }
- }
-
- chainable = 1;
- }
-
- return chainable ?
- elems :
-
- // Gets
- bulk ?
- fn.call( elems ) :
- length ? fn( elems[0], key ) : emptyGet;
- },
-
- now: function() {
- return ( new Date() ).getTime();
- }
-});
-
-jQuery.ready.promise = function( obj ) {
- if ( !readyList ) {
-
- readyList = jQuery.Deferred();
-
- // Catch cases where $(document).ready() is called after the browser event has already occurred.
- // we once tried to use readyState "interactive" here, but it caused issues like the one
- // discovered by ChrisS here: http://bugs.jquery.com/ticket/12282#comment:15
- if ( document.readyState === "complete" ) {
- // Handle it asynchronously to allow scripts the opportunity to delay ready
- setTimeout( jQuery.ready, 1 );
-
- // Standards-based browsers support DOMContentLoaded
- } else if ( document.addEventListener ) {
- // Use the handy event callback
- document.addEventListener( "DOMContentLoaded", DOMContentLoaded, false );
-
- // A fallback to window.onload, that will always work
- window.addEventListener( "load", jQuery.ready, false );
-
- // If IE event model is used
- } else {
- // Ensure firing before onload, maybe late but safe also for iframes
- document.attachEvent( "onreadystatechange", DOMContentLoaded );
-
- // A fallback to window.onload, that will always work
- window.attachEvent( "onload", jQuery.ready );
-
- // If IE and not a frame
- // continually check to see if the document is ready
- var top = false;
-
- try {
- top = window.frameElement == null && document.documentElement;
- } catch(e) {}
-
- if ( top && top.doScroll ) {
- (function doScrollCheck() {
- if ( !jQuery.isReady ) {
-
- try {
- // Use the trick by Diego Perini
- // http://javascript.nwbox.com/IEContentLoaded/
- top.doScroll("left");
- } catch(e) {
- return setTimeout( doScrollCheck, 50 );
- }
-
- // and execute any waiting functions
- jQuery.ready();
- }
- })();
- }
- }
- }
- return readyList.promise( obj );
-};
-
-// Populate the class2type map
-jQuery.each("Boolean Number String Function Array Date RegExp Object".split(" "), function(i, name) {
- class2type[ "[object " + name + "]" ] = name.toLowerCase();
-});
-
-// All jQuery objects should point back to these
-rootjQuery = jQuery(document);
-// String to Object options format cache
-var optionsCache = {};
-
-// Convert String-formatted options into Object-formatted ones and store in cache
-function createOptions( options ) {
- var object = optionsCache[ options ] = {};
- jQuery.each( options.split( core_rspace ), function( _, flag ) {
- object[ flag ] = true;
- });
- return object;
-}
-
-/*
- * Create a callback list using the following parameters:
- *
- * options: an optional list of space-separated options that will change how
- * the callback list behaves or a more traditional option object
- *
- * By default a callback list will act like an event callback list and can be
- * "fired" multiple times.
- *
- * Possible options:
- *
- * once: will ensure the callback list can only be fired once (like a Deferred)
- *
- * memory: will keep track of previous values and will call any callback added
- * after the list has been fired right away with the latest "memorized"
- * values (like a Deferred)
- *
- * unique: will ensure a callback can only be added once (no duplicate in the list)
- *
- * stopOnFalse: interrupt callings when a callback returns false
- *
- */
-jQuery.Callbacks = function( options ) {
-
- // Convert options from String-formatted to Object-formatted if needed
- // (we check in cache first)
- options = typeof options === "string" ?
- ( optionsCache[ options ] || createOptions( options ) ) :
- jQuery.extend( {}, options );
-
- var // Last fire value (for non-forgettable lists)
- memory,
- // Flag to know if list was already fired
- fired,
- // Flag to know if list is currently firing
- firing,
- // First callback to fire (used internally by add and fireWith)
- firingStart,
- // End of the loop when firing
- firingLength,
- // Index of currently firing callback (modified by remove if needed)
- firingIndex,
- // Actual callback list
- list = [],
- // Stack of fire calls for repeatable lists
- stack = !options.once && [],
- // Fire callbacks
- fire = function( data ) {
- memory = options.memory && data;
- fired = true;
- firingIndex = firingStart || 0;
- firingStart = 0;
- firingLength = list.length;
- firing = true;
- for ( ; list && firingIndex < firingLength; firingIndex++ ) {
- if ( list[ firingIndex ].apply( data[ 0 ], data[ 1 ] ) === false && options.stopOnFalse ) {
- memory = false; // To prevent further calls using add
- break;
- }
- }
- firing = false;
- if ( list ) {
- if ( stack ) {
- if ( stack.length ) {
- fire( stack.shift() );
- }
- } else if ( memory ) {
- list = [];
- } else {
- self.disable();
- }
- }
- },
- // Actual Callbacks object
- self = {
- // Add a callback or a collection of callbacks to the list
- add: function() {
- if ( list ) {
- // First, we save the current length
- var start = list.length;
- (function add( args ) {
- jQuery.each( args, function( _, arg ) {
- var type = jQuery.type( arg );
- if ( type === "function" && ( !options.unique || !self.has( arg ) ) ) {
- list.push( arg );
- } else if ( arg && arg.length && type !== "string" ) {
- // Inspect recursively
- add( arg );
- }
- });
- })( arguments );
- // Do we need to add the callbacks to the
- // current firing batch?
- if ( firing ) {
- firingLength = list.length;
- // With memory, if we're not firing then
- // we should call right away
- } else if ( memory ) {
- firingStart = start;
- fire( memory );
- }
- }
- return this;
- },
- // Remove a callback from the list
- remove: function() {
- if ( list ) {
- jQuery.each( arguments, function( _, arg ) {
- var index;
- while( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {
- list.splice( index, 1 );
- // Handle firing indexes
- if ( firing ) {
- if ( index <= firingLength ) {
- firingLength--;
- }
- if ( index <= firingIndex ) {
- firingIndex--;
- }
- }
- }
- });
- }
- return this;
- },
- // Control if a given callback is in the list
- has: function( fn ) {
- return jQuery.inArray( fn, list ) > -1;
- },
- // Remove all callbacks from the list
- empty: function() {
- list = [];
- return this;
- },
- // Have the list do nothing anymore
- disable: function() {
- list = stack = memory = undefined;
- return this;
- },
- // Is it disabled?
- disabled: function() {
- return !list;
- },
- // Lock the list in its current state
- lock: function() {
- stack = undefined;
- if ( !memory ) {
- self.disable();
- }
- return this;
- },
- // Is it locked?
- locked: function() {
- return !stack;
- },
- // Call all callbacks with the given context and arguments
- fireWith: function( context, args ) {
- args = args || [];
- args = [ context, args.slice ? args.slice() : args ];
- if ( list && ( !fired || stack ) ) {
- if ( firing ) {
- stack.push( args );
- } else {
- fire( args );
- }
- }
- return this;
- },
- // Call all the callbacks with the given arguments
- fire: function() {
- self.fireWith( this, arguments );
- return this;
- },
- // To know if the callbacks have already been called at least once
- fired: function() {
- return !!fired;
- }
- };
-
- return self;
-};
-jQuery.extend({
-
- Deferred: function( func ) {
- var tuples = [
- // action, add listener, listener list, final state
- [ "resolve", "done", jQuery.Callbacks("once memory"), "resolved" ],
- [ "reject", "fail", jQuery.Callbacks("once memory"), "rejected" ],
- [ "notify", "progress", jQuery.Callbacks("memory") ]
- ],
- state = "pending",
- promise = {
- state: function() {
- return state;
- },
- always: function() {
- deferred.done( arguments ).fail( arguments );
- return this;
- },
- then: function( /* fnDone, fnFail, fnProgress */ ) {
- var fns = arguments;
- return jQuery.Deferred(function( newDefer ) {
- jQuery.each( tuples, function( i, tuple ) {
- var action = tuple[ 0 ],
- fn = fns[ i ];
- // deferred[ done | fail | progress ] for forwarding actions to newDefer
- deferred[ tuple[1] ]( jQuery.isFunction( fn ) ?
- function() {
- var returned = fn.apply( this, arguments );
- if ( returned && jQuery.isFunction( returned.promise ) ) {
- returned.promise()
- .done( newDefer.resolve )
- .fail( newDefer.reject )
- .progress( newDefer.notify );
- } else {
- newDefer[ action + "With" ]( this === deferred ? newDefer : this, [ returned ] );
- }
- } :
- newDefer[ action ]
- );
- });
- fns = null;
- }).promise();
- },
- // Get a promise for this deferred
- // If obj is provided, the promise aspect is added to the object
- promise: function( obj ) {
- return obj != null ? jQuery.extend( obj, promise ) : promise;
- }
- },
- deferred = {};
-
- // Keep pipe for back-compat
- promise.pipe = promise.then;
-
- // Add list-specific methods
- jQuery.each( tuples, function( i, tuple ) {
- var list = tuple[ 2 ],
- stateString = tuple[ 3 ];
-
- // promise[ done | fail | progress ] = list.add
- promise[ tuple[1] ] = list.add;
-
- // Handle state
- if ( stateString ) {
- list.add(function() {
- // state = [ resolved | rejected ]
- state = stateString;
-
- // [ reject_list | resolve_list ].disable; progress_list.lock
- }, tuples[ i ^ 1 ][ 2 ].disable, tuples[ 2 ][ 2 ].lock );
- }
-
- // deferred[ resolve | reject | notify ] = list.fire
- deferred[ tuple[0] ] = list.fire;
- deferred[ tuple[0] + "With" ] = list.fireWith;
- });
-
- // Make the deferred a promise
- promise.promise( deferred );
-
- // Call given func if any
- if ( func ) {
- func.call( deferred, deferred );
- }
-
- // All done!
- return deferred;
- },
-
- // Deferred helper
- when: function( subordinate /* , ..., subordinateN */ ) {
- var i = 0,
- resolveValues = core_slice.call( arguments ),
- length = resolveValues.length,
-
- // the count of uncompleted subordinates
- remaining = length !== 1 || ( subordinate && jQuery.isFunction( subordinate.promise ) ) ? length : 0,
-
- // the master Deferred. If resolveValues consist of only a single Deferred, just use that.
- deferred = remaining === 1 ? subordinate : jQuery.Deferred(),
-
- // Update function for both resolve and progress values
- updateFunc = function( i, contexts, values ) {
- return function( value ) {
- contexts[ i ] = this;
- values[ i ] = arguments.length > 1 ? core_slice.call( arguments ) : value;
- if( values === progressValues ) {
- deferred.notifyWith( contexts, values );
- } else if ( !( --remaining ) ) {
- deferred.resolveWith( contexts, values );
- }
- };
- },
-
- progressValues, progressContexts, resolveContexts;
-
- // add listeners to Deferred subordinates; treat others as resolved
- if ( length > 1 ) {
- progressValues = new Array( length );
- progressContexts = new Array( length );
- resolveContexts = new Array( length );
- for ( ; i < length; i++ ) {
- if ( resolveValues[ i ] && jQuery.isFunction( resolveValues[ i ].promise ) ) {
- resolveValues[ i ].promise()
- .done( updateFunc( i, resolveContexts, resolveValues ) )
- .fail( deferred.reject )
- .progress( updateFunc( i, progressContexts, progressValues ) );
- } else {
- --remaining;
- }
- }
- }
-
- // if we're not waiting on anything, resolve the master
- if ( !remaining ) {
- deferred.resolveWith( resolveContexts, resolveValues );
- }
-
- return deferred.promise();
- }
-});
-jQuery.support = (function() {
-
- var support,
- all,
- a,
- select,
- opt,
- input,
- fragment,
- eventName,
- i,
- isSupported,
- clickFn,
- div = document.createElement("div");
-
- // Preliminary tests
- div.setAttribute( "className", "t" );
- div.innerHTML = " a ";
-
- all = div.getElementsByTagName("*");
- a = div.getElementsByTagName("a")[ 0 ];
- a.style.cssText = "top:1px;float:left;opacity:.5";
-
- // Can't get basic test support
- if ( !all || !all.length ) {
- return {};
- }
-
- // First batch of supports tests
- select = document.createElement("select");
- opt = select.appendChild( document.createElement("option") );
- input = div.getElementsByTagName("input")[ 0 ];
-
- support = {
- // IE strips leading whitespace when .innerHTML is used
- leadingWhitespace: ( div.firstChild.nodeType === 3 ),
-
- // Make sure that tbody elements aren't automatically inserted
- // IE will insert them into empty tables
- tbody: !div.getElementsByTagName("tbody").length,
-
- // Make sure that link elements get serialized correctly by innerHTML
- // This requires a wrapper element in IE
- htmlSerialize: !!div.getElementsByTagName("link").length,
-
- // Get the style information from getAttribute
- // (IE uses .cssText instead)
- style: /top/.test( a.getAttribute("style") ),
-
- // Make sure that URLs aren't manipulated
- // (IE normalizes it by default)
- hrefNormalized: ( a.getAttribute("href") === "/a" ),
-
- // Make sure that element opacity exists
- // (IE uses filter instead)
- // Use a regex to work around a WebKit issue. See #5145
- opacity: /^0.5/.test( a.style.opacity ),
-
- // Verify style float existence
- // (IE uses styleFloat instead of cssFloat)
- cssFloat: !!a.style.cssFloat,
-
- // Make sure that if no value is specified for a checkbox
- // that it defaults to "on".
- // (WebKit defaults to "" instead)
- checkOn: ( input.value === "on" ),
-
- // Make sure that a selected-by-default option has a working selected property.
- // (WebKit defaults to false instead of true, IE too, if it's in an optgroup)
- optSelected: opt.selected,
-
- // Test setAttribute on camelCase class. If it works, we need attrFixes when doing get/setAttribute (ie6/7)
- getSetAttribute: div.className !== "t",
-
- // Tests for enctype support on a form(#6743)
- enctype: !!document.createElement("form").enctype,
-
- // Makes sure cloning an html5 element does not cause problems
- // Where outerHTML is undefined, this still works
- html5Clone: document.createElement("nav").cloneNode( true ).outerHTML !== "<:nav>",
-
- // jQuery.support.boxModel DEPRECATED in 1.8 since we don't support Quirks Mode
- boxModel: ( document.compatMode === "CSS1Compat" ),
-
- // Will be defined later
- submitBubbles: true,
- changeBubbles: true,
- focusinBubbles: false,
- deleteExpando: true,
- noCloneEvent: true,
- inlineBlockNeedsLayout: false,
- shrinkWrapBlocks: false,
- reliableMarginRight: true,
- boxSizingReliable: true,
- pixelPosition: false
- };
-
- // Make sure checked status is properly cloned
- input.checked = true;
- support.noCloneChecked = input.cloneNode( true ).checked;
-
- // Make sure that the options inside disabled selects aren't marked as disabled
- // (WebKit marks them as disabled)
- select.disabled = true;
- support.optDisabled = !opt.disabled;
-
- // Test to see if it's possible to delete an expando from an element
- // Fails in Internet Explorer
- try {
- delete div.test;
- } catch( e ) {
- support.deleteExpando = false;
- }
-
- if ( !div.addEventListener && div.attachEvent && div.fireEvent ) {
- div.attachEvent( "onclick", clickFn = function() {
- // Cloning a node shouldn't copy over any
- // bound event handlers (IE does this)
- support.noCloneEvent = false;
- });
- div.cloneNode( true ).fireEvent("onclick");
- div.detachEvent( "onclick", clickFn );
- }
-
- // Check if a radio maintains its value
- // after being appended to the DOM
- input = document.createElement("input");
- input.value = "t";
- input.setAttribute( "type", "radio" );
- support.radioValue = input.value === "t";
-
- input.setAttribute( "checked", "checked" );
-
- // #11217 - WebKit loses check when the name is after the checked attribute
- input.setAttribute( "name", "t" );
-
- div.appendChild( input );
- fragment = document.createDocumentFragment();
- fragment.appendChild( div.lastChild );
-
- // WebKit doesn't clone checked state correctly in fragments
- support.checkClone = fragment.cloneNode( true ).cloneNode( true ).lastChild.checked;
-
- // Check if a disconnected checkbox will retain its checked
- // value of true after appended to the DOM (IE6/7)
- support.appendChecked = input.checked;
-
- fragment.removeChild( input );
- fragment.appendChild( div );
-
- // Technique from Juriy Zaytsev
- // http://perfectionkills.com/detecting-event-support-without-browser-sniffing/
- // We only care about the case where non-standard event systems
- // are used, namely in IE. Short-circuiting here helps us to
- // avoid an eval call (in setAttribute) which can cause CSP
- // to go haywire. See: https://developer.mozilla.org/en/Security/CSP
- if ( div.attachEvent ) {
- for ( i in {
- submit: true,
- change: true,
- focusin: true
- }) {
- eventName = "on" + i;
- isSupported = ( eventName in div );
- if ( !isSupported ) {
- div.setAttribute( eventName, "return;" );
- isSupported = ( typeof div[ eventName ] === "function" );
- }
- support[ i + "Bubbles" ] = isSupported;
- }
- }
-
- // Run tests that need a body at doc ready
- jQuery(function() {
- var container, div, tds, marginDiv,
- divReset = "padding:0;margin:0;border:0;display:block;overflow:hidden;",
- body = document.getElementsByTagName("body")[0];
-
- if ( !body ) {
- // Return for frameset docs that don't have a body
- return;
- }
-
- container = document.createElement("div");
- container.style.cssText = "visibility:hidden;border:0;width:0;height:0;position:static;top:0;margin-top:1px";
- body.insertBefore( container, body.firstChild );
-
- // Construct the test element
- div = document.createElement("div");
- container.appendChild( div );
-
- // Check if table cells still have offsetWidth/Height when they are set
- // to display:none and there are still other visible table cells in a
- // table row; if so, offsetWidth/Height are not reliable for use when
- // determining if an element has been hidden directly using
- // display:none (it is still safe to use offsets if a parent element is
- // hidden; don safety goggles and see bug #4512 for more information).
- // (only IE 8 fails this test)
- div.innerHTML = "";
- tds = div.getElementsByTagName("td");
- tds[ 0 ].style.cssText = "padding:0;margin:0;border:0;display:none";
- isSupported = ( tds[ 0 ].offsetHeight === 0 );
-
- tds[ 0 ].style.display = "";
- tds[ 1 ].style.display = "none";
-
- // Check if empty table cells still have offsetWidth/Height
- // (IE <= 8 fail this test)
- support.reliableHiddenOffsets = isSupported && ( tds[ 0 ].offsetHeight === 0 );
-
- // Check box-sizing and margin behavior
- div.innerHTML = "";
- div.style.cssText = "box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;";
- support.boxSizing = ( div.offsetWidth === 4 );
- support.doesNotIncludeMarginInBodyOffset = ( body.offsetTop !== 1 );
-
- // NOTE: To any future maintainer, we've window.getComputedStyle
- // because jsdom on node.js will break without it.
- if ( window.getComputedStyle ) {
- support.pixelPosition = ( window.getComputedStyle( div, null ) || {} ).top !== "1%";
- support.boxSizingReliable = ( window.getComputedStyle( div, null ) || { width: "4px" } ).width === "4px";
-
- // Check if div with explicit width and no margin-right incorrectly
- // gets computed margin-right based on width of container. For more
- // info see bug #3333
- // Fails in WebKit before Feb 2011 nightlies
- // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
- marginDiv = document.createElement("div");
- marginDiv.style.cssText = div.style.cssText = divReset;
- marginDiv.style.marginRight = marginDiv.style.width = "0";
- div.style.width = "1px";
- div.appendChild( marginDiv );
- support.reliableMarginRight =
- !parseFloat( ( window.getComputedStyle( marginDiv, null ) || {} ).marginRight );
- }
-
- if ( typeof div.style.zoom !== "undefined" ) {
- // Check if natively block-level elements act like inline-block
- // elements when setting their display to 'inline' and giving
- // them layout
- // (IE < 8 does this)
- div.innerHTML = "";
- div.style.cssText = divReset + "width:1px;padding:1px;display:inline;zoom:1";
- support.inlineBlockNeedsLayout = ( div.offsetWidth === 3 );
-
- // Check if elements with layout shrink-wrap their children
- // (IE 6 does this)
- div.style.display = "block";
- div.style.overflow = "visible";
- div.innerHTML = "
";
- div.firstChild.style.width = "5px";
- support.shrinkWrapBlocks = ( div.offsetWidth !== 3 );
-
- container.style.zoom = 1;
- }
-
- // Null elements to avoid leaks in IE
- body.removeChild( container );
- container = div = tds = marginDiv = null;
- });
-
- // Null elements to avoid leaks in IE
- fragment.removeChild( div );
- all = a = select = opt = input = fragment = div = null;
-
- return support;
-})();
-var rbrace = /(?:\{[\s\S]*\}|\[[\s\S]*\])$/,
- rmultiDash = /([A-Z])/g;
-
-jQuery.extend({
- cache: {},
-
- deletedIds: [],
-
- // Remove at next major release (1.9/2.0)
- uuid: 0,
-
- // Unique for each copy of jQuery on the page
- // Non-digits removed to match rinlinejQuery
- expando: "jQuery" + ( jQuery.fn.jquery + Math.random() ).replace( /\D/g, "" ),
-
- // The following elements throw uncatchable exceptions if you
- // attempt to add expando properties to them.
- noData: {
- "embed": true,
- // Ban all objects except for Flash (which handle expandos)
- "object": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",
- "applet": true
- },
-
- hasData: function( elem ) {
- elem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ];
- return !!elem && !isEmptyDataObject( elem );
- },
-
- data: function( elem, name, data, pvt /* Internal Use Only */ ) {
- if ( !jQuery.acceptData( elem ) ) {
- return;
- }
-
- var thisCache, ret,
- internalKey = jQuery.expando,
- getByName = typeof name === "string",
-
- // We have to handle DOM nodes and JS objects differently because IE6-7
- // can't GC object references properly across the DOM-JS boundary
- isNode = elem.nodeType,
-
- // Only DOM nodes need the global jQuery cache; JS object data is
- // attached directly to the object so GC can occur automatically
- cache = isNode ? jQuery.cache : elem,
-
- // Only defining an ID for JS objects if its cache already exists allows
- // the code to shortcut on the same path as a DOM node with no cache
- id = isNode ? elem[ internalKey ] : elem[ internalKey ] && internalKey;
-
- // Avoid doing any more work than we need to when trying to get data on an
- // object that has no data at all
- if ( (!id || !cache[id] || (!pvt && !cache[id].data)) && getByName && data === undefined ) {
- return;
- }
-
- if ( !id ) {
- // Only DOM nodes need a new unique ID for each element since their data
- // ends up in the global cache
- if ( isNode ) {
- elem[ internalKey ] = id = jQuery.deletedIds.pop() || jQuery.guid++;
- } else {
- id = internalKey;
- }
- }
-
- if ( !cache[ id ] ) {
- cache[ id ] = {};
-
- // Avoids exposing jQuery metadata on plain JS objects when the object
- // is serialized using JSON.stringify
- if ( !isNode ) {
- cache[ id ].toJSON = jQuery.noop;
- }
- }
-
- // An object can be passed to jQuery.data instead of a key/value pair; this gets
- // shallow copied over onto the existing cache
- if ( typeof name === "object" || typeof name === "function" ) {
- if ( pvt ) {
- cache[ id ] = jQuery.extend( cache[ id ], name );
- } else {
- cache[ id ].data = jQuery.extend( cache[ id ].data, name );
- }
- }
-
- thisCache = cache[ id ];
-
- // jQuery data() is stored in a separate object inside the object's internal data
- // cache in order to avoid key collisions between internal data and user-defined
- // data.
- if ( !pvt ) {
- if ( !thisCache.data ) {
- thisCache.data = {};
- }
-
- thisCache = thisCache.data;
- }
-
- if ( data !== undefined ) {
- thisCache[ jQuery.camelCase( name ) ] = data;
- }
-
- // Check for both converted-to-camel and non-converted data property names
- // If a data property was specified
- if ( getByName ) {
-
- // First Try to find as-is property data
- ret = thisCache[ name ];
-
- // Test for null|undefined property data
- if ( ret == null ) {
-
- // Try to find the camelCased property
- ret = thisCache[ jQuery.camelCase( name ) ];
- }
- } else {
- ret = thisCache;
- }
-
- return ret;
- },
-
- removeData: function( elem, name, pvt /* Internal Use Only */ ) {
- if ( !jQuery.acceptData( elem ) ) {
- return;
- }
-
- var thisCache, i, l,
-
- isNode = elem.nodeType,
-
- // See jQuery.data for more information
- cache = isNode ? jQuery.cache : elem,
- id = isNode ? elem[ jQuery.expando ] : jQuery.expando;
-
- // If there is already no cache entry for this object, there is no
- // purpose in continuing
- if ( !cache[ id ] ) {
- return;
- }
-
- if ( name ) {
-
- thisCache = pvt ? cache[ id ] : cache[ id ].data;
-
- if ( thisCache ) {
-
- // Support array or space separated string names for data keys
- if ( !jQuery.isArray( name ) ) {
-
- // try the string as a key before any manipulation
- if ( name in thisCache ) {
- name = [ name ];
- } else {
-
- // split the camel cased version by spaces unless a key with the spaces exists
- name = jQuery.camelCase( name );
- if ( name in thisCache ) {
- name = [ name ];
- } else {
- name = name.split(" ");
- }
- }
- }
-
- for ( i = 0, l = name.length; i < l; i++ ) {
- delete thisCache[ name[i] ];
- }
-
- // If there is no data left in the cache, we want to continue
- // and let the cache object itself get destroyed
- if ( !( pvt ? isEmptyDataObject : jQuery.isEmptyObject )( thisCache ) ) {
- return;
- }
- }
- }
-
- // See jQuery.data for more information
- if ( !pvt ) {
- delete cache[ id ].data;
-
- // Don't destroy the parent cache unless the internal data object
- // had been the only thing left in it
- if ( !isEmptyDataObject( cache[ id ] ) ) {
- return;
- }
- }
-
- // Destroy the cache
- if ( isNode ) {
- jQuery.cleanData( [ elem ], true );
-
- // Use delete when supported for expandos or `cache` is not a window per isWindow (#10080)
- } else if ( jQuery.support.deleteExpando || cache != cache.window ) {
- delete cache[ id ];
-
- // When all else fails, null
- } else {
- cache[ id ] = null;
- }
- },
-
- // For internal use only.
- _data: function( elem, name, data ) {
- return jQuery.data( elem, name, data, true );
- },
-
- // A method for determining if a DOM node can handle the data expando
- acceptData: function( elem ) {
- var noData = elem.nodeName && jQuery.noData[ elem.nodeName.toLowerCase() ];
-
- // nodes accept data unless otherwise specified; rejection can be conditional
- return !noData || noData !== true && elem.getAttribute("classid") === noData;
- }
-});
-
-jQuery.fn.extend({
- data: function( key, value ) {
- var parts, part, attr, name, l,
- elem = this[0],
- i = 0,
- data = null;
-
- // Gets all values
- if ( key === undefined ) {
- if ( this.length ) {
- data = jQuery.data( elem );
-
- if ( elem.nodeType === 1 && !jQuery._data( elem, "parsedAttrs" ) ) {
- attr = elem.attributes;
- for ( l = attr.length; i < l; i++ ) {
- name = attr[i].name;
-
- if ( !name.indexOf( "data-" ) ) {
- name = jQuery.camelCase( name.substring(5) );
-
- dataAttr( elem, name, data[ name ] );
- }
- }
- jQuery._data( elem, "parsedAttrs", true );
- }
- }
-
- return data;
- }
-
- // Sets multiple values
- if ( typeof key === "object" ) {
- return this.each(function() {
- jQuery.data( this, key );
- });
- }
-
- parts = key.split( ".", 2 );
- parts[1] = parts[1] ? "." + parts[1] : "";
- part = parts[1] + "!";
-
- return jQuery.access( this, function( value ) {
-
- if ( value === undefined ) {
- data = this.triggerHandler( "getData" + part, [ parts[0] ] );
-
- // Try to fetch any internally stored data first
- if ( data === undefined && elem ) {
- data = jQuery.data( elem, key );
- data = dataAttr( elem, key, data );
- }
-
- return data === undefined && parts[1] ?
- this.data( parts[0] ) :
- data;
- }
-
- parts[1] = value;
- this.each(function() {
- var self = jQuery( this );
-
- self.triggerHandler( "setData" + part, parts );
- jQuery.data( this, key, value );
- self.triggerHandler( "changeData" + part, parts );
- });
- }, null, value, arguments.length > 1, null, false );
- },
-
- removeData: function( key ) {
- return this.each(function() {
- jQuery.removeData( this, key );
- });
- }
-});
-
-function dataAttr( elem, key, data ) {
- // If nothing was found internally, try to fetch any
- // data from the HTML5 data-* attribute
- if ( data === undefined && elem.nodeType === 1 ) {
-
- var name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase();
-
- data = elem.getAttribute( name );
-
- if ( typeof data === "string" ) {
- try {
- data = data === "true" ? true :
- data === "false" ? false :
- data === "null" ? null :
- // Only convert to a number if it doesn't change the string
- +data + "" === data ? +data :
- rbrace.test( data ) ? jQuery.parseJSON( data ) :
- data;
- } catch( e ) {}
-
- // Make sure we set the data so it isn't changed later
- jQuery.data( elem, key, data );
-
- } else {
- data = undefined;
- }
- }
-
- return data;
-}
-
-// checks a cache object for emptiness
-function isEmptyDataObject( obj ) {
- var name;
- for ( name in obj ) {
-
- // if the public data object is empty, the private is still empty
- if ( name === "data" && jQuery.isEmptyObject( obj[name] ) ) {
- continue;
- }
- if ( name !== "toJSON" ) {
- return false;
- }
- }
-
- return true;
-}
-jQuery.extend({
- queue: function( elem, type, data ) {
- var queue;
-
- if ( elem ) {
- type = ( type || "fx" ) + "queue";
- queue = jQuery._data( elem, type );
-
- // Speed up dequeue by getting out quickly if this is just a lookup
- if ( data ) {
- if ( !queue || jQuery.isArray(data) ) {
- queue = jQuery._data( elem, type, jQuery.makeArray(data) );
- } else {
- queue.push( data );
- }
- }
- return queue || [];
- }
- },
-
- dequeue: function( elem, type ) {
- type = type || "fx";
-
- var queue = jQuery.queue( elem, type ),
- startLength = queue.length,
- fn = queue.shift(),
- hooks = jQuery._queueHooks( elem, type ),
- next = function() {
- jQuery.dequeue( elem, type );
- };
-
- // If the fx queue is dequeued, always remove the progress sentinel
- if ( fn === "inprogress" ) {
- fn = queue.shift();
- startLength--;
- }
-
- if ( fn ) {
-
- // Add a progress sentinel to prevent the fx queue from being
- // automatically dequeued
- if ( type === "fx" ) {
- queue.unshift( "inprogress" );
- }
-
- // clear up the last queue stop function
- delete hooks.stop;
- fn.call( elem, next, hooks );
- }
-
- if ( !startLength && hooks ) {
- hooks.empty.fire();
- }
- },
-
- // not intended for public consumption - generates a queueHooks object, or returns the current one
- _queueHooks: function( elem, type ) {
- var key = type + "queueHooks";
- return jQuery._data( elem, key ) || jQuery._data( elem, key, {
- empty: jQuery.Callbacks("once memory").add(function() {
- jQuery.removeData( elem, type + "queue", true );
- jQuery.removeData( elem, key, true );
- })
- });
- }
-});
-
-jQuery.fn.extend({
- queue: function( type, data ) {
- var setter = 2;
-
- if ( typeof type !== "string" ) {
- data = type;
- type = "fx";
- setter--;
- }
-
- if ( arguments.length < setter ) {
- return jQuery.queue( this[0], type );
- }
-
- return data === undefined ?
- this :
- this.each(function() {
- var queue = jQuery.queue( this, type, data );
-
- // ensure a hooks for this queue
- jQuery._queueHooks( this, type );
-
- if ( type === "fx" && queue[0] !== "inprogress" ) {
- jQuery.dequeue( this, type );
- }
- });
- },
- dequeue: function( type ) {
- return this.each(function() {
- jQuery.dequeue( this, type );
- });
- },
- // Based off of the plugin by Clint Helfers, with permission.
- // http://blindsignals.com/index.php/2009/07/jquery-delay/
- delay: function( time, type ) {
- time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;
- type = type || "fx";
-
- return this.queue( type, function( next, hooks ) {
- var timeout = setTimeout( next, time );
- hooks.stop = function() {
- clearTimeout( timeout );
- };
- });
- },
- clearQueue: function( type ) {
- return this.queue( type || "fx", [] );
- },
- // Get a promise resolved when queues of a certain type
- // are emptied (fx is the type by default)
- promise: function( type, obj ) {
- var tmp,
- count = 1,
- defer = jQuery.Deferred(),
- elements = this,
- i = this.length,
- resolve = function() {
- if ( !( --count ) ) {
- defer.resolveWith( elements, [ elements ] );
- }
- };
-
- if ( typeof type !== "string" ) {
- obj = type;
- type = undefined;
- }
- type = type || "fx";
-
- while( i-- ) {
- tmp = jQuery._data( elements[ i ], type + "queueHooks" );
- if ( tmp && tmp.empty ) {
- count++;
- tmp.empty.add( resolve );
- }
- }
- resolve();
- return defer.promise( obj );
- }
-});
-var nodeHook, boolHook, fixSpecified,
- rclass = /[\t\r\n]/g,
- rreturn = /\r/g,
- rtype = /^(?:button|input)$/i,
- rfocusable = /^(?:button|input|object|select|textarea)$/i,
- rclickable = /^a(?:rea|)$/i,
- rboolean = /^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,
- getSetAttribute = jQuery.support.getSetAttribute;
-
-jQuery.fn.extend({
- attr: function( name, value ) {
- return jQuery.access( this, jQuery.attr, name, value, arguments.length > 1 );
- },
-
- removeAttr: function( name ) {
- return this.each(function() {
- jQuery.removeAttr( this, name );
- });
- },
-
- prop: function( name, value ) {
- return jQuery.access( this, jQuery.prop, name, value, arguments.length > 1 );
- },
-
- removeProp: function( name ) {
- name = jQuery.propFix[ name ] || name;
- return this.each(function() {
- // try/catch handles cases where IE balks (such as removing a property on window)
- try {
- this[ name ] = undefined;
- delete this[ name ];
- } catch( e ) {}
- });
- },
-
- addClass: function( value ) {
- var classNames, i, l, elem,
- setClass, c, cl;
-
- if ( jQuery.isFunction( value ) ) {
- return this.each(function( j ) {
- jQuery( this ).addClass( value.call(this, j, this.className) );
- });
- }
-
- if ( value && typeof value === "string" ) {
- classNames = value.split( core_rspace );
-
- for ( i = 0, l = this.length; i < l; i++ ) {
- elem = this[ i ];
-
- if ( elem.nodeType === 1 ) {
- if ( !elem.className && classNames.length === 1 ) {
- elem.className = value;
-
- } else {
- setClass = " " + elem.className + " ";
-
- for ( c = 0, cl = classNames.length; c < cl; c++ ) {
- if ( setClass.indexOf( " " + classNames[ c ] + " " ) < 0 ) {
- setClass += classNames[ c ] + " ";
- }
- }
- elem.className = jQuery.trim( setClass );
- }
- }
- }
- }
-
- return this;
- },
-
- removeClass: function( value ) {
- var removes, className, elem, c, cl, i, l;
-
- if ( jQuery.isFunction( value ) ) {
- return this.each(function( j ) {
- jQuery( this ).removeClass( value.call(this, j, this.className) );
- });
- }
- if ( (value && typeof value === "string") || value === undefined ) {
- removes = ( value || "" ).split( core_rspace );
-
- for ( i = 0, l = this.length; i < l; i++ ) {
- elem = this[ i ];
- if ( elem.nodeType === 1 && elem.className ) {
-
- className = (" " + elem.className + " ").replace( rclass, " " );
-
- // loop over each item in the removal list
- for ( c = 0, cl = removes.length; c < cl; c++ ) {
- // Remove until there is nothing to remove,
- while ( className.indexOf(" " + removes[ c ] + " ") >= 0 ) {
- className = className.replace( " " + removes[ c ] + " " , " " );
- }
- }
- elem.className = value ? jQuery.trim( className ) : "";
- }
- }
- }
-
- return this;
- },
-
- toggleClass: function( value, stateVal ) {
- var type = typeof value,
- isBool = typeof stateVal === "boolean";
-
- if ( jQuery.isFunction( value ) ) {
- return this.each(function( i ) {
- jQuery( this ).toggleClass( value.call(this, i, this.className, stateVal), stateVal );
- });
- }
-
- return this.each(function() {
- if ( type === "string" ) {
- // toggle individual class names
- var className,
- i = 0,
- self = jQuery( this ),
- state = stateVal,
- classNames = value.split( core_rspace );
-
- while ( (className = classNames[ i++ ]) ) {
- // check each className given, space separated list
- state = isBool ? state : !self.hasClass( className );
- self[ state ? "addClass" : "removeClass" ]( className );
- }
-
- } else if ( type === "undefined" || type === "boolean" ) {
- if ( this.className ) {
- // store className if set
- jQuery._data( this, "__className__", this.className );
- }
-
- // toggle whole className
- this.className = this.className || value === false ? "" : jQuery._data( this, "__className__" ) || "";
- }
- });
- },
-
- hasClass: function( selector ) {
- var className = " " + selector + " ",
- i = 0,
- l = this.length;
- for ( ; i < l; i++ ) {
- if ( this[i].nodeType === 1 && (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) >= 0 ) {
- return true;
- }
- }
-
- return false;
- },
-
- val: function( value ) {
- var hooks, ret, isFunction,
- elem = this[0];
-
- if ( !arguments.length ) {
- if ( elem ) {
- hooks = jQuery.valHooks[ elem.type ] || jQuery.valHooks[ elem.nodeName.toLowerCase() ];
-
- if ( hooks && "get" in hooks && (ret = hooks.get( elem, "value" )) !== undefined ) {
- return ret;
- }
-
- ret = elem.value;
-
- return typeof ret === "string" ?
- // handle most common string cases
- ret.replace(rreturn, "") :
- // handle cases where value is null/undef or number
- ret == null ? "" : ret;
- }
-
- return;
- }
-
- isFunction = jQuery.isFunction( value );
-
- return this.each(function( i ) {
- var val,
- self = jQuery(this);
-
- if ( this.nodeType !== 1 ) {
- return;
- }
-
- if ( isFunction ) {
- val = value.call( this, i, self.val() );
- } else {
- val = value;
- }
-
- // Treat null/undefined as ""; convert numbers to string
- if ( val == null ) {
- val = "";
- } else if ( typeof val === "number" ) {
- val += "";
- } else if ( jQuery.isArray( val ) ) {
- val = jQuery.map(val, function ( value ) {
- return value == null ? "" : value + "";
- });
- }
-
- hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];
-
- // If set returns undefined, fall back to normal setting
- if ( !hooks || !("set" in hooks) || hooks.set( this, val, "value" ) === undefined ) {
- this.value = val;
- }
- });
- }
-});
-
-jQuery.extend({
- valHooks: {
- option: {
- get: function( elem ) {
- // attributes.value is undefined in Blackberry 4.7 but
- // uses .value. See #6932
- var val = elem.attributes.value;
- return !val || val.specified ? elem.value : elem.text;
- }
- },
- select: {
- get: function( elem ) {
- var value, i, max, option,
- index = elem.selectedIndex,
- values = [],
- options = elem.options,
- one = elem.type === "select-one";
-
- // Nothing was selected
- if ( index < 0 ) {
- return null;
- }
-
- // Loop through all the selected options
- i = one ? index : 0;
- max = one ? index + 1 : options.length;
- for ( ; i < max; i++ ) {
- option = options[ i ];
-
- // Don't return options that are disabled or in a disabled optgroup
- if ( option.selected && (jQuery.support.optDisabled ? !option.disabled : option.getAttribute("disabled") === null) &&
- (!option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup" )) ) {
-
- // Get the specific value for the option
- value = jQuery( option ).val();
-
- // We don't need an array for one selects
- if ( one ) {
- return value;
- }
-
- // Multi-Selects return an array
- values.push( value );
- }
- }
-
- // Fixes Bug #2551 -- select.val() broken in IE after form.reset()
- if ( one && !values.length && options.length ) {
- return jQuery( options[ index ] ).val();
- }
-
- return values;
- },
-
- set: function( elem, value ) {
- var values = jQuery.makeArray( value );
-
- jQuery(elem).find("option").each(function() {
- this.selected = jQuery.inArray( jQuery(this).val(), values ) >= 0;
- });
-
- if ( !values.length ) {
- elem.selectedIndex = -1;
- }
- return values;
- }
- }
- },
-
- // Unused in 1.8, left in so attrFn-stabbers won't die; remove in 1.9
- attrFn: {},
-
- attr: function( elem, name, value, pass ) {
- var ret, hooks, notxml,
- nType = elem.nodeType;
-
- // don't get/set attributes on text, comment and attribute nodes
- if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
- return;
- }
-
- if ( pass && jQuery.isFunction( jQuery.fn[ name ] ) ) {
- return jQuery( elem )[ name ]( value );
- }
-
- // Fallback to prop when attributes are not supported
- if ( typeof elem.getAttribute === "undefined" ) {
- return jQuery.prop( elem, name, value );
- }
-
- notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
-
- // All attributes are lowercase
- // Grab necessary hook if one is defined
- if ( notxml ) {
- name = name.toLowerCase();
- hooks = jQuery.attrHooks[ name ] || ( rboolean.test( name ) ? boolHook : nodeHook );
- }
-
- if ( value !== undefined ) {
-
- if ( value === null ) {
- jQuery.removeAttr( elem, name );
- return;
-
- } else if ( hooks && "set" in hooks && notxml && (ret = hooks.set( elem, value, name )) !== undefined ) {
- return ret;
-
- } else {
- elem.setAttribute( name, value + "" );
- return value;
- }
-
- } else if ( hooks && "get" in hooks && notxml && (ret = hooks.get( elem, name )) !== null ) {
- return ret;
-
- } else {
-
- ret = elem.getAttribute( name );
-
- // Non-existent attributes return null, we normalize to undefined
- return ret === null ?
- undefined :
- ret;
- }
- },
-
- removeAttr: function( elem, value ) {
- var propName, attrNames, name, isBool,
- i = 0;
-
- if ( value && elem.nodeType === 1 ) {
-
- attrNames = value.split( core_rspace );
-
- for ( ; i < attrNames.length; i++ ) {
- name = attrNames[ i ];
-
- if ( name ) {
- propName = jQuery.propFix[ name ] || name;
- isBool = rboolean.test( name );
-
- // See #9699 for explanation of this approach (setting first, then removal)
- // Do not do this for boolean attributes (see #10870)
- if ( !isBool ) {
- jQuery.attr( elem, name, "" );
- }
- elem.removeAttribute( getSetAttribute ? name : propName );
-
- // Set corresponding property to false for boolean attributes
- if ( isBool && propName in elem ) {
- elem[ propName ] = false;
- }
- }
- }
- }
- },
-
- attrHooks: {
- type: {
- set: function( elem, value ) {
- // We can't allow the type property to be changed (since it causes problems in IE)
- if ( rtype.test( elem.nodeName ) && elem.parentNode ) {
- jQuery.error( "type property can't be changed" );
- } else if ( !jQuery.support.radioValue && value === "radio" && jQuery.nodeName(elem, "input") ) {
- // Setting the type on a radio button after the value resets the value in IE6-9
- // Reset value to it's default in case type is set after value
- // This is for element creation
- var val = elem.value;
- elem.setAttribute( "type", value );
- if ( val ) {
- elem.value = val;
- }
- return value;
- }
- }
- },
- // Use the value property for back compat
- // Use the nodeHook for button elements in IE6/7 (#1954)
- value: {
- get: function( elem, name ) {
- if ( nodeHook && jQuery.nodeName( elem, "button" ) ) {
- return nodeHook.get( elem, name );
- }
- return name in elem ?
- elem.value :
- null;
- },
- set: function( elem, value, name ) {
- if ( nodeHook && jQuery.nodeName( elem, "button" ) ) {
- return nodeHook.set( elem, value, name );
- }
- // Does not return so that setAttribute is also used
- elem.value = value;
- }
- }
- },
-
- propFix: {
- tabindex: "tabIndex",
- readonly: "readOnly",
- "for": "htmlFor",
- "class": "className",
- maxlength: "maxLength",
- cellspacing: "cellSpacing",
- cellpadding: "cellPadding",
- rowspan: "rowSpan",
- colspan: "colSpan",
- usemap: "useMap",
- frameborder: "frameBorder",
- contenteditable: "contentEditable"
- },
-
- prop: function( elem, name, value ) {
- var ret, hooks, notxml,
- nType = elem.nodeType;
-
- // don't get/set properties on text, comment and attribute nodes
- if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
- return;
- }
-
- notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
-
- if ( notxml ) {
- // Fix name and attach hooks
- name = jQuery.propFix[ name ] || name;
- hooks = jQuery.propHooks[ name ];
- }
-
- if ( value !== undefined ) {
- if ( hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) {
- return ret;
-
- } else {
- return ( elem[ name ] = value );
- }
-
- } else {
- if ( hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ) {
- return ret;
-
- } else {
- return elem[ name ];
- }
- }
- },
-
- propHooks: {
- tabIndex: {
- get: function( elem ) {
- // elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set
- // http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
- var attributeNode = elem.getAttributeNode("tabindex");
-
- return attributeNode && attributeNode.specified ?
- parseInt( attributeNode.value, 10 ) :
- rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ?
- 0 :
- undefined;
- }
- }
- }
-});
-
-// Hook for boolean attributes
-boolHook = {
- get: function( elem, name ) {
- // Align boolean attributes with corresponding properties
- // Fall back to attribute presence where some booleans are not supported
- var attrNode,
- property = jQuery.prop( elem, name );
- return property === true || typeof property !== "boolean" && ( attrNode = elem.getAttributeNode(name) ) && attrNode.nodeValue !== false ?
- name.toLowerCase() :
- undefined;
- },
- set: function( elem, value, name ) {
- var propName;
- if ( value === false ) {
- // Remove boolean attributes when set to false
- jQuery.removeAttr( elem, name );
- } else {
- // value is true since we know at this point it's type boolean and not false
- // Set boolean attributes to the same name and set the DOM property
- propName = jQuery.propFix[ name ] || name;
- if ( propName in elem ) {
- // Only set the IDL specifically if it already exists on the element
- elem[ propName ] = true;
- }
-
- elem.setAttribute( name, name.toLowerCase() );
- }
- return name;
- }
-};
-
-// IE6/7 do not support getting/setting some attributes with get/setAttribute
-if ( !getSetAttribute ) {
-
- fixSpecified = {
- name: true,
- id: true,
- coords: true
- };
-
- // Use this for any attribute in IE6/7
- // This fixes almost every IE6/7 issue
- nodeHook = jQuery.valHooks.button = {
- get: function( elem, name ) {
- var ret;
- ret = elem.getAttributeNode( name );
- return ret && ( fixSpecified[ name ] ? ret.value !== "" : ret.specified ) ?
- ret.value :
- undefined;
- },
- set: function( elem, value, name ) {
- // Set the existing or create a new attribute node
- var ret = elem.getAttributeNode( name );
- if ( !ret ) {
- ret = document.createAttribute( name );
- elem.setAttributeNode( ret );
- }
- return ( ret.value = value + "" );
- }
- };
-
- // Set width and height to auto instead of 0 on empty string( Bug #8150 )
- // This is for removals
- jQuery.each([ "width", "height" ], function( i, name ) {
- jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], {
- set: function( elem, value ) {
- if ( value === "" ) {
- elem.setAttribute( name, "auto" );
- return value;
- }
- }
- });
- });
-
- // Set contenteditable to false on removals(#10429)
- // Setting to empty string throws an error as an invalid value
- jQuery.attrHooks.contenteditable = {
- get: nodeHook.get,
- set: function( elem, value, name ) {
- if ( value === "" ) {
- value = "false";
- }
- nodeHook.set( elem, value, name );
- }
- };
-}
-
-
-// Some attributes require a special call on IE
-if ( !jQuery.support.hrefNormalized ) {
- jQuery.each([ "href", "src", "width", "height" ], function( i, name ) {
- jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], {
- get: function( elem ) {
- var ret = elem.getAttribute( name, 2 );
- return ret === null ? undefined : ret;
- }
- });
- });
-}
-
-if ( !jQuery.support.style ) {
- jQuery.attrHooks.style = {
- get: function( elem ) {
- // Return undefined in the case of empty string
- // Normalize to lowercase since IE uppercases css property names
- return elem.style.cssText.toLowerCase() || undefined;
- },
- set: function( elem, value ) {
- return ( elem.style.cssText = value + "" );
- }
- };
-}
-
-// Safari mis-reports the default selected property of an option
-// Accessing the parent's selectedIndex property fixes it
-if ( !jQuery.support.optSelected ) {
- jQuery.propHooks.selected = jQuery.extend( jQuery.propHooks.selected, {
- get: function( elem ) {
- var parent = elem.parentNode;
-
- if ( parent ) {
- parent.selectedIndex;
-
- // Make sure that it also works with optgroups, see #5701
- if ( parent.parentNode ) {
- parent.parentNode.selectedIndex;
- }
- }
- return null;
- }
- });
-}
-
-// IE6/7 call enctype encoding
-if ( !jQuery.support.enctype ) {
- jQuery.propFix.enctype = "encoding";
-}
-
-// Radios and checkboxes getter/setter
-if ( !jQuery.support.checkOn ) {
- jQuery.each([ "radio", "checkbox" ], function() {
- jQuery.valHooks[ this ] = {
- get: function( elem ) {
- // Handle the case where in Webkit "" is returned instead of "on" if a value isn't specified
- return elem.getAttribute("value") === null ? "on" : elem.value;
- }
- };
- });
-}
-jQuery.each([ "radio", "checkbox" ], function() {
- jQuery.valHooks[ this ] = jQuery.extend( jQuery.valHooks[ this ], {
- set: function( elem, value ) {
- if ( jQuery.isArray( value ) ) {
- return ( elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0 );
- }
- }
- });
-});
-var rformElems = /^(?:textarea|input|select)$/i,
- rtypenamespace = /^([^\.]*|)(?:\.(.+)|)$/,
- rhoverHack = /(?:^|\s)hover(\.\S+|)\b/,
- rkeyEvent = /^key/,
- rmouseEvent = /^(?:mouse|contextmenu)|click/,
- rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,
- hoverHack = function( events ) {
- return jQuery.event.special.hover ? events : events.replace( rhoverHack, "mouseenter$1 mouseleave$1" );
- };
-
-/*
- * Helper functions for managing events -- not part of the public interface.
- * Props to Dean Edwards' addEvent library for many of the ideas.
- */
-jQuery.event = {
-
- add: function( elem, types, handler, data, selector ) {
-
- var elemData, eventHandle, events,
- t, tns, type, namespaces, handleObj,
- handleObjIn, handlers, special;
-
- // Don't attach events to noData or text/comment nodes (allow plain objects tho)
- if ( elem.nodeType === 3 || elem.nodeType === 8 || !types || !handler || !(elemData = jQuery._data( elem )) ) {
- return;
- }
-
- // Caller can pass in an object of custom data in lieu of the handler
- if ( handler.handler ) {
- handleObjIn = handler;
- handler = handleObjIn.handler;
- selector = handleObjIn.selector;
- }
-
- // Make sure that the handler has a unique ID, used to find/remove it later
- if ( !handler.guid ) {
- handler.guid = jQuery.guid++;
- }
-
- // Init the element's event structure and main handler, if this is the first
- events = elemData.events;
- if ( !events ) {
- elemData.events = events = {};
- }
- eventHandle = elemData.handle;
- if ( !eventHandle ) {
- elemData.handle = eventHandle = function( e ) {
- // Discard the second event of a jQuery.event.trigger() and
- // when an event is called after a page has unloaded
- return typeof jQuery !== "undefined" && (!e || jQuery.event.triggered !== e.type) ?
- jQuery.event.dispatch.apply( eventHandle.elem, arguments ) :
- undefined;
- };
- // Add elem as a property of the handle fn to prevent a memory leak with IE non-native events
- eventHandle.elem = elem;
- }
-
- // Handle multiple events separated by a space
- // jQuery(...).bind("mouseover mouseout", fn);
- types = jQuery.trim( hoverHack(types) ).split( " " );
- for ( t = 0; t < types.length; t++ ) {
-
- tns = rtypenamespace.exec( types[t] ) || [];
- type = tns[1];
- namespaces = ( tns[2] || "" ).split( "." ).sort();
-
- // If event changes its type, use the special event handlers for the changed type
- special = jQuery.event.special[ type ] || {};
-
- // If selector defined, determine special event api type, otherwise given type
- type = ( selector ? special.delegateType : special.bindType ) || type;
-
- // Update special based on newly reset type
- special = jQuery.event.special[ type ] || {};
-
- // handleObj is passed to all event handlers
- handleObj = jQuery.extend({
- type: type,
- origType: tns[1],
- data: data,
- handler: handler,
- guid: handler.guid,
- selector: selector,
- needsContext: selector && jQuery.expr.match.needsContext.test( selector ),
- namespace: namespaces.join(".")
- }, handleObjIn );
-
- // Init the event handler queue if we're the first
- handlers = events[ type ];
- if ( !handlers ) {
- handlers = events[ type ] = [];
- handlers.delegateCount = 0;
-
- // Only use addEventListener/attachEvent if the special events handler returns false
- if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
- // Bind the global event handler to the element
- if ( elem.addEventListener ) {
- elem.addEventListener( type, eventHandle, false );
-
- } else if ( elem.attachEvent ) {
- elem.attachEvent( "on" + type, eventHandle );
- }
- }
- }
-
- if ( special.add ) {
- special.add.call( elem, handleObj );
-
- if ( !handleObj.handler.guid ) {
- handleObj.handler.guid = handler.guid;
- }
- }
-
- // Add to the element's handler list, delegates in front
- if ( selector ) {
- handlers.splice( handlers.delegateCount++, 0, handleObj );
- } else {
- handlers.push( handleObj );
- }
-
- // Keep track of which events have ever been used, for event optimization
- jQuery.event.global[ type ] = true;
- }
-
- // Nullify elem to prevent memory leaks in IE
- elem = null;
- },
-
- global: {},
-
- // Detach an event or set of events from an element
- remove: function( elem, types, handler, selector, mappedTypes ) {
-
- var t, tns, type, origType, namespaces, origCount,
- j, events, special, eventType, handleObj,
- elemData = jQuery.hasData( elem ) && jQuery._data( elem );
-
- if ( !elemData || !(events = elemData.events) ) {
- return;
- }
-
- // Once for each type.namespace in types; type may be omitted
- types = jQuery.trim( hoverHack( types || "" ) ).split(" ");
- for ( t = 0; t < types.length; t++ ) {
- tns = rtypenamespace.exec( types[t] ) || [];
- type = origType = tns[1];
- namespaces = tns[2];
-
- // Unbind all events (on this namespace, if provided) for the element
- if ( !type ) {
- for ( type in events ) {
- jQuery.event.remove( elem, type + types[ t ], handler, selector, true );
- }
- continue;
- }
-
- special = jQuery.event.special[ type ] || {};
- type = ( selector? special.delegateType : special.bindType ) || type;
- eventType = events[ type ] || [];
- origCount = eventType.length;
- namespaces = namespaces ? new RegExp("(^|\\.)" + namespaces.split(".").sort().join("\\.(?:.*\\.|)") + "(\\.|$)") : null;
-
- // Remove matching events
- for ( j = 0; j < eventType.length; j++ ) {
- handleObj = eventType[ j ];
-
- if ( ( mappedTypes || origType === handleObj.origType ) &&
- ( !handler || handler.guid === handleObj.guid ) &&
- ( !namespaces || namespaces.test( handleObj.namespace ) ) &&
- ( !selector || selector === handleObj.selector || selector === "**" && handleObj.selector ) ) {
- eventType.splice( j--, 1 );
-
- if ( handleObj.selector ) {
- eventType.delegateCount--;
- }
- if ( special.remove ) {
- special.remove.call( elem, handleObj );
- }
- }
- }
-
- // Remove generic event handler if we removed something and no more handlers exist
- // (avoids potential for endless recursion during removal of special event handlers)
- if ( eventType.length === 0 && origCount !== eventType.length ) {
- if ( !special.teardown || special.teardown.call( elem, namespaces, elemData.handle ) === false ) {
- jQuery.removeEvent( elem, type, elemData.handle );
- }
-
- delete events[ type ];
- }
- }
-
- // Remove the expando if it's no longer used
- if ( jQuery.isEmptyObject( events ) ) {
- delete elemData.handle;
-
- // removeData also checks for emptiness and clears the expando if empty
- // so use it instead of delete
- jQuery.removeData( elem, "events", true );
- }
- },
-
- // Events that are safe to short-circuit if no handlers are attached.
- // Native DOM events should not be added, they may have inline handlers.
- customEvent: {
- "getData": true,
- "setData": true,
- "changeData": true
- },
-
- trigger: function( event, data, elem, onlyHandlers ) {
- // Don't do events on text and comment nodes
- if ( elem && (elem.nodeType === 3 || elem.nodeType === 8) ) {
- return;
- }
-
- // Event object or event type
- var cache, exclusive, i, cur, old, ontype, special, handle, eventPath, bubbleType,
- type = event.type || event,
- namespaces = [];
-
- // focus/blur morphs to focusin/out; ensure we're not firing them right now
- if ( rfocusMorph.test( type + jQuery.event.triggered ) ) {
- return;
- }
-
- if ( type.indexOf( "!" ) >= 0 ) {
- // Exclusive events trigger only for the exact event (no namespaces)
- type = type.slice(0, -1);
- exclusive = true;
- }
-
- if ( type.indexOf( "." ) >= 0 ) {
- // Namespaced trigger; create a regexp to match event type in handle()
- namespaces = type.split(".");
- type = namespaces.shift();
- namespaces.sort();
- }
-
- if ( (!elem || jQuery.event.customEvent[ type ]) && !jQuery.event.global[ type ] ) {
- // No jQuery handlers for this event type, and it can't have inline handlers
- return;
- }
-
- // Caller can pass in an Event, Object, or just an event type string
- event = typeof event === "object" ?
- // jQuery.Event object
- event[ jQuery.expando ] ? event :
- // Object literal
- new jQuery.Event( type, event ) :
- // Just the event type (string)
- new jQuery.Event( type );
-
- event.type = type;
- event.isTrigger = true;
- event.exclusive = exclusive;
- event.namespace = namespaces.join( "." );
- event.namespace_re = event.namespace? new RegExp("(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)") : null;
- ontype = type.indexOf( ":" ) < 0 ? "on" + type : "";
-
- // Handle a global trigger
- if ( !elem ) {
-
- // TODO: Stop taunting the data cache; remove global events and always attach to document
- cache = jQuery.cache;
- for ( i in cache ) {
- if ( cache[ i ].events && cache[ i ].events[ type ] ) {
- jQuery.event.trigger( event, data, cache[ i ].handle.elem, true );
- }
- }
- return;
- }
-
- // Clean up the event in case it is being reused
- event.result = undefined;
- if ( !event.target ) {
- event.target = elem;
- }
-
- // Clone any incoming data and prepend the event, creating the handler arg list
- data = data != null ? jQuery.makeArray( data ) : [];
- data.unshift( event );
-
- // Allow special events to draw outside the lines
- special = jQuery.event.special[ type ] || {};
- if ( special.trigger && special.trigger.apply( elem, data ) === false ) {
- return;
- }
-
- // Determine event propagation path in advance, per W3C events spec (#9951)
- // Bubble up to document, then to window; watch for a global ownerDocument var (#9724)
- eventPath = [[ elem, special.bindType || type ]];
- if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) {
-
- bubbleType = special.delegateType || type;
- cur = rfocusMorph.test( bubbleType + type ) ? elem : elem.parentNode;
- for ( old = elem; cur; cur = cur.parentNode ) {
- eventPath.push([ cur, bubbleType ]);
- old = cur;
- }
-
- // Only add window if we got to document (e.g., not plain obj or detached DOM)
- if ( old === (elem.ownerDocument || document) ) {
- eventPath.push([ old.defaultView || old.parentWindow || window, bubbleType ]);
- }
- }
-
- // Fire handlers on the event path
- for ( i = 0; i < eventPath.length && !event.isPropagationStopped(); i++ ) {
-
- cur = eventPath[i][0];
- event.type = eventPath[i][1];
-
- handle = ( jQuery._data( cur, "events" ) || {} )[ event.type ] && jQuery._data( cur, "handle" );
- if ( handle ) {
- handle.apply( cur, data );
- }
- // Note that this is a bare JS function and not a jQuery handler
- handle = ontype && cur[ ontype ];
- if ( handle && jQuery.acceptData( cur ) && handle.apply && handle.apply( cur, data ) === false ) {
- event.preventDefault();
- }
- }
- event.type = type;
-
- // If nobody prevented the default action, do it now
- if ( !onlyHandlers && !event.isDefaultPrevented() ) {
-
- if ( (!special._default || special._default.apply( elem.ownerDocument, data ) === false) &&
- !(type === "click" && jQuery.nodeName( elem, "a" )) && jQuery.acceptData( elem ) ) {
-
- // Call a native DOM method on the target with the same name name as the event.
- // Can't use an .isFunction() check here because IE6/7 fails that test.
- // Don't do default actions on window, that's where global variables be (#6170)
- // IE<9 dies on focus/blur to hidden element (#1486)
- if ( ontype && elem[ type ] && ((type !== "focus" && type !== "blur") || event.target.offsetWidth !== 0) && !jQuery.isWindow( elem ) ) {
-
- // Don't re-trigger an onFOO event when we call its FOO() method
- old = elem[ ontype ];
-
- if ( old ) {
- elem[ ontype ] = null;
- }
-
- // Prevent re-triggering of the same event, since we already bubbled it above
- jQuery.event.triggered = type;
- elem[ type ]();
- jQuery.event.triggered = undefined;
-
- if ( old ) {
- elem[ ontype ] = old;
- }
- }
- }
- }
-
- return event.result;
- },
-
- dispatch: function( event ) {
-
- // Make a writable jQuery.Event from the native event object
- event = jQuery.event.fix( event || window.event );
-
- var i, j, cur, ret, selMatch, matched, matches, handleObj, sel, related,
- handlers = ( (jQuery._data( this, "events" ) || {} )[ event.type ] || []),
- delegateCount = handlers.delegateCount,
- args = core_slice.call( arguments ),
- run_all = !event.exclusive && !event.namespace,
- special = jQuery.event.special[ event.type ] || {},
- handlerQueue = [];
-
- // Use the fix-ed jQuery.Event rather than the (read-only) native event
- args[0] = event;
- event.delegateTarget = this;
-
- // Call the preDispatch hook for the mapped type, and let it bail if desired
- if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {
- return;
- }
-
- // Determine handlers that should run if there are delegated events
- // Avoid non-left-click bubbling in Firefox (#3861)
- if ( delegateCount && !(event.button && event.type === "click") ) {
-
- for ( cur = event.target; cur != this; cur = cur.parentNode || this ) {
-
- // Don't process clicks (ONLY) on disabled elements (#6911, #8165, #11382, #11764)
- if ( cur.disabled !== true || event.type !== "click" ) {
- selMatch = {};
- matches = [];
- for ( i = 0; i < delegateCount; i++ ) {
- handleObj = handlers[ i ];
- sel = handleObj.selector;
-
- if ( selMatch[ sel ] === undefined ) {
- selMatch[ sel ] = handleObj.needsContext ?
- jQuery( sel, this ).index( cur ) >= 0 :
- jQuery.find( sel, this, null, [ cur ] ).length;
- }
- if ( selMatch[ sel ] ) {
- matches.push( handleObj );
- }
- }
- if ( matches.length ) {
- handlerQueue.push({ elem: cur, matches: matches });
- }
- }
- }
- }
-
- // Add the remaining (directly-bound) handlers
- if ( handlers.length > delegateCount ) {
- handlerQueue.push({ elem: this, matches: handlers.slice( delegateCount ) });
- }
-
- // Run delegates first; they may want to stop propagation beneath us
- for ( i = 0; i < handlerQueue.length && !event.isPropagationStopped(); i++ ) {
- matched = handlerQueue[ i ];
- event.currentTarget = matched.elem;
-
- for ( j = 0; j < matched.matches.length && !event.isImmediatePropagationStopped(); j++ ) {
- handleObj = matched.matches[ j ];
-
- // Triggered event must either 1) be non-exclusive and have no namespace, or
- // 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace).
- if ( run_all || (!event.namespace && !handleObj.namespace) || event.namespace_re && event.namespace_re.test( handleObj.namespace ) ) {
-
- event.data = handleObj.data;
- event.handleObj = handleObj;
-
- ret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler )
- .apply( matched.elem, args );
-
- if ( ret !== undefined ) {
- event.result = ret;
- if ( ret === false ) {
- event.preventDefault();
- event.stopPropagation();
- }
- }
- }
- }
- }
-
- // Call the postDispatch hook for the mapped type
- if ( special.postDispatch ) {
- special.postDispatch.call( this, event );
- }
-
- return event.result;
- },
-
- // Includes some event props shared by KeyEvent and MouseEvent
- // *** attrChange attrName relatedNode srcElement are not normalized, non-W3C, deprecated, will be removed in 1.8 ***
- props: "attrChange attrName relatedNode srcElement altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),
-
- fixHooks: {},
-
- keyHooks: {
- props: "char charCode key keyCode".split(" "),
- filter: function( event, original ) {
-
- // Add which for key events
- if ( event.which == null ) {
- event.which = original.charCode != null ? original.charCode : original.keyCode;
- }
-
- return event;
- }
- },
-
- mouseHooks: {
- props: "button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),
- filter: function( event, original ) {
- var eventDoc, doc, body,
- button = original.button,
- fromElement = original.fromElement;
-
- // Calculate pageX/Y if missing and clientX/Y available
- if ( event.pageX == null && original.clientX != null ) {
- eventDoc = event.target.ownerDocument || document;
- doc = eventDoc.documentElement;
- body = eventDoc.body;
-
- event.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 );
- event.pageY = original.clientY + ( doc && doc.scrollTop || body && body.scrollTop || 0 ) - ( doc && doc.clientTop || body && body.clientTop || 0 );
- }
-
- // Add relatedTarget, if necessary
- if ( !event.relatedTarget && fromElement ) {
- event.relatedTarget = fromElement === event.target ? original.toElement : fromElement;
- }
-
- // Add which for click: 1 === left; 2 === middle; 3 === right
- // Note: button is not normalized, so don't use it
- if ( !event.which && button !== undefined ) {
- event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) );
- }
-
- return event;
- }
- },
-
- fix: function( event ) {
- if ( event[ jQuery.expando ] ) {
- return event;
- }
-
- // Create a writable copy of the event object and normalize some properties
- var i, prop,
- originalEvent = event,
- fixHook = jQuery.event.fixHooks[ event.type ] || {},
- copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props;
-
- event = jQuery.Event( originalEvent );
-
- for ( i = copy.length; i; ) {
- prop = copy[ --i ];
- event[ prop ] = originalEvent[ prop ];
- }
-
- // Fix target property, if necessary (#1925, IE 6/7/8 & Safari2)
- if ( !event.target ) {
- event.target = originalEvent.srcElement || document;
- }
-
- // Target should not be a text node (#504, Safari)
- if ( event.target.nodeType === 3 ) {
- event.target = event.target.parentNode;
- }
-
- // For mouse/key events, metaKey==false if it's undefined (#3368, #11328; IE6/7/8)
- event.metaKey = !!event.metaKey;
-
- return fixHook.filter? fixHook.filter( event, originalEvent ) : event;
- },
-
- special: {
- load: {
- // Prevent triggered image.load events from bubbling to window.load
- noBubble: true
- },
-
- focus: {
- delegateType: "focusin"
- },
- blur: {
- delegateType: "focusout"
- },
-
- beforeunload: {
- setup: function( data, namespaces, eventHandle ) {
- // We only want to do this special case on windows
- if ( jQuery.isWindow( this ) ) {
- this.onbeforeunload = eventHandle;
- }
- },
-
- teardown: function( namespaces, eventHandle ) {
- if ( this.onbeforeunload === eventHandle ) {
- this.onbeforeunload = null;
- }
- }
- }
- },
-
- simulate: function( type, elem, event, bubble ) {
- // Piggyback on a donor event to simulate a different one.
- // Fake originalEvent to avoid donor's stopPropagation, but if the
- // simulated event prevents default then we do the same on the donor.
- var e = jQuery.extend(
- new jQuery.Event(),
- event,
- { type: type,
- isSimulated: true,
- originalEvent: {}
- }
- );
- if ( bubble ) {
- jQuery.event.trigger( e, null, elem );
- } else {
- jQuery.event.dispatch.call( elem, e );
- }
- if ( e.isDefaultPrevented() ) {
- event.preventDefault();
- }
- }
-};
-
-// Some plugins are using, but it's undocumented/deprecated and will be removed.
-// The 1.7 special event interface should provide all the hooks needed now.
-jQuery.event.handle = jQuery.event.dispatch;
-
-jQuery.removeEvent = document.removeEventListener ?
- function( elem, type, handle ) {
- if ( elem.removeEventListener ) {
- elem.removeEventListener( type, handle, false );
- }
- } :
- function( elem, type, handle ) {
- var name = "on" + type;
-
- if ( elem.detachEvent ) {
-
- // #8545, #7054, preventing memory leaks for custom events in IE6-8 –
- // detachEvent needed property on element, by name of that event, to properly expose it to GC
- if ( typeof elem[ name ] === "undefined" ) {
- elem[ name ] = null;
- }
-
- elem.detachEvent( name, handle );
- }
- };
-
-jQuery.Event = function( src, props ) {
- // Allow instantiation without the 'new' keyword
- if ( !(this instanceof jQuery.Event) ) {
- return new jQuery.Event( src, props );
- }
-
- // Event object
- if ( src && src.type ) {
- this.originalEvent = src;
- this.type = src.type;
-
- // Events bubbling up the document may have been marked as prevented
- // by a handler lower down the tree; reflect the correct value.
- this.isDefaultPrevented = ( src.defaultPrevented || src.returnValue === false ||
- src.getPreventDefault && src.getPreventDefault() ) ? returnTrue : returnFalse;
-
- // Event type
- } else {
- this.type = src;
- }
-
- // Put explicitly provided properties onto the event object
- if ( props ) {
- jQuery.extend( this, props );
- }
-
- // Create a timestamp if incoming event doesn't have one
- this.timeStamp = src && src.timeStamp || jQuery.now();
-
- // Mark it as fixed
- this[ jQuery.expando ] = true;
-};
-
-function returnFalse() {
- return false;
-}
-function returnTrue() {
- return true;
-}
-
-// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
-// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
-jQuery.Event.prototype = {
- preventDefault: function() {
- this.isDefaultPrevented = returnTrue;
-
- var e = this.originalEvent;
- if ( !e ) {
- return;
- }
-
- // if preventDefault exists run it on the original event
- if ( e.preventDefault ) {
- e.preventDefault();
-
- // otherwise set the returnValue property of the original event to false (IE)
- } else {
- e.returnValue = false;
- }
- },
- stopPropagation: function() {
- this.isPropagationStopped = returnTrue;
-
- var e = this.originalEvent;
- if ( !e ) {
- return;
- }
- // if stopPropagation exists run it on the original event
- if ( e.stopPropagation ) {
- e.stopPropagation();
- }
- // otherwise set the cancelBubble property of the original event to true (IE)
- e.cancelBubble = true;
- },
- stopImmediatePropagation: function() {
- this.isImmediatePropagationStopped = returnTrue;
- this.stopPropagation();
- },
- isDefaultPrevented: returnFalse,
- isPropagationStopped: returnFalse,
- isImmediatePropagationStopped: returnFalse
-};
-
-// Create mouseenter/leave events using mouseover/out and event-time checks
-jQuery.each({
- mouseenter: "mouseover",
- mouseleave: "mouseout"
-}, function( orig, fix ) {
- jQuery.event.special[ orig ] = {
- delegateType: fix,
- bindType: fix,
-
- handle: function( event ) {
- var ret,
- target = this,
- related = event.relatedTarget,
- handleObj = event.handleObj,
- selector = handleObj.selector;
-
- // For mousenter/leave call the handler if related is outside the target.
- // NB: No relatedTarget if the mouse left/entered the browser window
- if ( !related || (related !== target && !jQuery.contains( target, related )) ) {
- event.type = handleObj.origType;
- ret = handleObj.handler.apply( this, arguments );
- event.type = fix;
- }
- return ret;
- }
- };
-});
-
-// IE submit delegation
-if ( !jQuery.support.submitBubbles ) {
-
- jQuery.event.special.submit = {
- setup: function() {
- // Only need this for delegated form submit events
- if ( jQuery.nodeName( this, "form" ) ) {
- return false;
- }
-
- // Lazy-add a submit handler when a descendant form may potentially be submitted
- jQuery.event.add( this, "click._submit keypress._submit", function( e ) {
- // Node name check avoids a VML-related crash in IE (#9807)
- var elem = e.target,
- form = jQuery.nodeName( elem, "input" ) || jQuery.nodeName( elem, "button" ) ? elem.form : undefined;
- if ( form && !jQuery._data( form, "_submit_attached" ) ) {
- jQuery.event.add( form, "submit._submit", function( event ) {
- event._submit_bubble = true;
- });
- jQuery._data( form, "_submit_attached", true );
- }
- });
- // return undefined since we don't need an event listener
- },
-
- postDispatch: function( event ) {
- // If form was submitted by the user, bubble the event up the tree
- if ( event._submit_bubble ) {
- delete event._submit_bubble;
- if ( this.parentNode && !event.isTrigger ) {
- jQuery.event.simulate( "submit", this.parentNode, event, true );
- }
- }
- },
-
- teardown: function() {
- // Only need this for delegated form submit events
- if ( jQuery.nodeName( this, "form" ) ) {
- return false;
- }
-
- // Remove delegated handlers; cleanData eventually reaps submit handlers attached above
- jQuery.event.remove( this, "._submit" );
- }
- };
-}
-
-// IE change delegation and checkbox/radio fix
-if ( !jQuery.support.changeBubbles ) {
-
- jQuery.event.special.change = {
-
- setup: function() {
-
- if ( rformElems.test( this.nodeName ) ) {
- // IE doesn't fire change on a check/radio until blur; trigger it on click
- // after a propertychange. Eat the blur-change in special.change.handle.
- // This still fires onchange a second time for check/radio after blur.
- if ( this.type === "checkbox" || this.type === "radio" ) {
- jQuery.event.add( this, "propertychange._change", function( event ) {
- if ( event.originalEvent.propertyName === "checked" ) {
- this._just_changed = true;
- }
- });
- jQuery.event.add( this, "click._change", function( event ) {
- if ( this._just_changed && !event.isTrigger ) {
- this._just_changed = false;
- }
- // Allow triggered, simulated change events (#11500)
- jQuery.event.simulate( "change", this, event, true );
- });
- }
- return false;
- }
- // Delegated event; lazy-add a change handler on descendant inputs
- jQuery.event.add( this, "beforeactivate._change", function( e ) {
- var elem = e.target;
-
- if ( rformElems.test( elem.nodeName ) && !jQuery._data( elem, "_change_attached" ) ) {
- jQuery.event.add( elem, "change._change", function( event ) {
- if ( this.parentNode && !event.isSimulated && !event.isTrigger ) {
- jQuery.event.simulate( "change", this.parentNode, event, true );
- }
- });
- jQuery._data( elem, "_change_attached", true );
- }
- });
- },
-
- handle: function( event ) {
- var elem = event.target;
-
- // Swallow native change events from checkbox/radio, we already triggered them above
- if ( this !== elem || event.isSimulated || event.isTrigger || (elem.type !== "radio" && elem.type !== "checkbox") ) {
- return event.handleObj.handler.apply( this, arguments );
- }
- },
-
- teardown: function() {
- jQuery.event.remove( this, "._change" );
-
- return !rformElems.test( this.nodeName );
- }
- };
-}
-
-// Create "bubbling" focus and blur events
-if ( !jQuery.support.focusinBubbles ) {
- jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) {
-
- // Attach a single capturing handler while someone wants focusin/focusout
- var attaches = 0,
- handler = function( event ) {
- jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true );
- };
-
- jQuery.event.special[ fix ] = {
- setup: function() {
- if ( attaches++ === 0 ) {
- document.addEventListener( orig, handler, true );
- }
- },
- teardown: function() {
- if ( --attaches === 0 ) {
- document.removeEventListener( orig, handler, true );
- }
- }
- };
- });
-}
-
-jQuery.fn.extend({
-
- on: function( types, selector, data, fn, /*INTERNAL*/ one ) {
- var origFn, type;
-
- // Types can be a map of types/handlers
- if ( typeof types === "object" ) {
- // ( types-Object, selector, data )
- if ( typeof selector !== "string" ) { // && selector != null
- // ( types-Object, data )
- data = data || selector;
- selector = undefined;
- }
- for ( type in types ) {
- this.on( type, selector, data, types[ type ], one );
- }
- return this;
- }
-
- if ( data == null && fn == null ) {
- // ( types, fn )
- fn = selector;
- data = selector = undefined;
- } else if ( fn == null ) {
- if ( typeof selector === "string" ) {
- // ( types, selector, fn )
- fn = data;
- data = undefined;
- } else {
- // ( types, data, fn )
- fn = data;
- data = selector;
- selector = undefined;
- }
- }
- if ( fn === false ) {
- fn = returnFalse;
- } else if ( !fn ) {
- return this;
- }
-
- if ( one === 1 ) {
- origFn = fn;
- fn = function( event ) {
- // Can use an empty set, since event contains the info
- jQuery().off( event );
- return origFn.apply( this, arguments );
- };
- // Use same guid so caller can remove using origFn
- fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );
- }
- return this.each( function() {
- jQuery.event.add( this, types, fn, data, selector );
- });
- },
- one: function( types, selector, data, fn ) {
- return this.on( types, selector, data, fn, 1 );
- },
- off: function( types, selector, fn ) {
- var handleObj, type;
- if ( types && types.preventDefault && types.handleObj ) {
- // ( event ) dispatched jQuery.Event
- handleObj = types.handleObj;
- jQuery( types.delegateTarget ).off(
- handleObj.namespace ? handleObj.origType + "." + handleObj.namespace : handleObj.origType,
- handleObj.selector,
- handleObj.handler
- );
- return this;
- }
- if ( typeof types === "object" ) {
- // ( types-object [, selector] )
- for ( type in types ) {
- this.off( type, selector, types[ type ] );
- }
- return this;
- }
- if ( selector === false || typeof selector === "function" ) {
- // ( types [, fn] )
- fn = selector;
- selector = undefined;
- }
- if ( fn === false ) {
- fn = returnFalse;
- }
- return this.each(function() {
- jQuery.event.remove( this, types, fn, selector );
- });
- },
-
- bind: function( types, data, fn ) {
- return this.on( types, null, data, fn );
- },
- unbind: function( types, fn ) {
- return this.off( types, null, fn );
- },
-
- live: function( types, data, fn ) {
- jQuery( this.context ).on( types, this.selector, data, fn );
- return this;
- },
- die: function( types, fn ) {
- jQuery( this.context ).off( types, this.selector || "**", fn );
- return this;
- },
-
- delegate: function( selector, types, data, fn ) {
- return this.on( types, selector, data, fn );
- },
- undelegate: function( selector, types, fn ) {
- // ( namespace ) or ( selector, types [, fn] )
- return arguments.length === 1 ? this.off( selector, "**" ) : this.off( types, selector || "**", fn );
- },
-
- trigger: function( type, data ) {
- return this.each(function() {
- jQuery.event.trigger( type, data, this );
- });
- },
- triggerHandler: function( type, data ) {
- if ( this[0] ) {
- return jQuery.event.trigger( type, data, this[0], true );
- }
- },
-
- toggle: function( fn ) {
- // Save reference to arguments for access in closure
- var args = arguments,
- guid = fn.guid || jQuery.guid++,
- i = 0,
- toggler = function( event ) {
- // Figure out which function to execute
- var lastToggle = ( jQuery._data( this, "lastToggle" + fn.guid ) || 0 ) % i;
- jQuery._data( this, "lastToggle" + fn.guid, lastToggle + 1 );
-
- // Make sure that clicks stop
- event.preventDefault();
-
- // and execute the function
- return args[ lastToggle ].apply( this, arguments ) || false;
- };
-
- // link all the functions, so any of them can unbind this click handler
- toggler.guid = guid;
- while ( i < args.length ) {
- args[ i++ ].guid = guid;
- }
-
- return this.click( toggler );
- },
-
- hover: function( fnOver, fnOut ) {
- return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
- }
-});
-
-jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblclick " +
- "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
- "change select submit keydown keypress keyup error contextmenu").split(" "), function( i, name ) {
-
- // Handle event binding
- jQuery.fn[ name ] = function( data, fn ) {
- if ( fn == null ) {
- fn = data;
- data = null;
- }
-
- return arguments.length > 0 ?
- this.on( name, null, data, fn ) :
- this.trigger( name );
- };
-
- if ( rkeyEvent.test( name ) ) {
- jQuery.event.fixHooks[ name ] = jQuery.event.keyHooks;
- }
-
- if ( rmouseEvent.test( name ) ) {
- jQuery.event.fixHooks[ name ] = jQuery.event.mouseHooks;
- }
-});
-/*!
- * Sizzle CSS Selector Engine
- * Copyright 2012 jQuery Foundation and other contributors
- * Released under the MIT license
- * http://sizzlejs.com/
- */
-(function( window, undefined ) {
-
-var cachedruns,
- assertGetIdNotName,
- Expr,
- getText,
- isXML,
- contains,
- compile,
- sortOrder,
- hasDuplicate,
- outermostContext,
-
- baseHasDuplicate = true,
- strundefined = "undefined",
-
- expando = ( "sizcache" + Math.random() ).replace( ".", "" ),
-
- Token = String,
- document = window.document,
- docElem = document.documentElement,
- dirruns = 0,
- done = 0,
- pop = [].pop,
- push = [].push,
- slice = [].slice,
- // Use a stripped-down indexOf if a native one is unavailable
- indexOf = [].indexOf || function( elem ) {
- var i = 0,
- len = this.length;
- for ( ; i < len; i++ ) {
- if ( this[i] === elem ) {
- return i;
- }
- }
- return -1;
- },
-
- // Augment a function for special use by Sizzle
- markFunction = function( fn, value ) {
- fn[ expando ] = value == null || value;
- return fn;
- },
-
- createCache = function() {
- var cache = {},
- keys = [];
-
- return markFunction(function( key, value ) {
- // Only keep the most recent entries
- if ( keys.push( key ) > Expr.cacheLength ) {
- delete cache[ keys.shift() ];
- }
-
- return (cache[ key ] = value);
- }, cache );
- },
-
- classCache = createCache(),
- tokenCache = createCache(),
- compilerCache = createCache(),
-
- // Regex
-
- // Whitespace characters http://www.w3.org/TR/css3-selectors/#whitespace
- whitespace = "[\\x20\\t\\r\\n\\f]",
- // http://www.w3.org/TR/css3-syntax/#characters
- characterEncoding = "(?:\\\\.|[-\\w]|[^\\x00-\\xa0])+",
-
- // Loosely modeled on CSS identifier characters
- // An unquoted value should be a CSS identifier (http://www.w3.org/TR/css3-selectors/#attribute-selectors)
- // Proper syntax: http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier
- identifier = characterEncoding.replace( "w", "w#" ),
-
- // Acceptable operators http://www.w3.org/TR/selectors/#attribute-selectors
- operators = "([*^$|!~]?=)",
- attributes = "\\[" + whitespace + "*(" + characterEncoding + ")" + whitespace +
- "*(?:" + operators + whitespace + "*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|(" + identifier + ")|)|)" + whitespace + "*\\]",
-
- // Prefer arguments not in parens/brackets,
- // then attribute selectors and non-pseudos (denoted by :),
- // then anything else
- // These preferences are here to reduce the number of selectors
- // needing tokenize in the PSEUDO preFilter
- pseudos = ":(" + characterEncoding + ")(?:\\((?:(['\"])((?:\\\\.|[^\\\\])*?)\\2|([^()[\\]]*|(?:(?:" + attributes + ")|[^:]|\\\\.)*|.*))\\)|)",
-
- // For matchExpr.POS and matchExpr.needsContext
- pos = ":(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + whitespace +
- "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)",
-
- // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter
- rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ),
-
- rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ),
- rcombinators = new RegExp( "^" + whitespace + "*([\\x20\\t\\r\\n\\f>+~])" + whitespace + "*" ),
- rpseudo = new RegExp( pseudos ),
-
- // Easily-parseable/retrievable ID or TAG or CLASS selectors
- rquickExpr = /^(?:#([\w\-]+)|(\w+)|\.([\w\-]+))$/,
-
- rnot = /^:not/,
- rsibling = /[\x20\t\r\n\f]*[+~]/,
- rendsWithNot = /:not\($/,
-
- rheader = /h\d/i,
- rinputs = /input|select|textarea|button/i,
-
- rbackslash = /\\(?!\\)/g,
-
- matchExpr = {
- "ID": new RegExp( "^#(" + characterEncoding + ")" ),
- "CLASS": new RegExp( "^\\.(" + characterEncoding + ")" ),
- "NAME": new RegExp( "^\\[name=['\"]?(" + characterEncoding + ")['\"]?\\]" ),
- "TAG": new RegExp( "^(" + characterEncoding.replace( "w", "w*" ) + ")" ),
- "ATTR": new RegExp( "^" + attributes ),
- "PSEUDO": new RegExp( "^" + pseudos ),
- "POS": new RegExp( pos, "i" ),
- "CHILD": new RegExp( "^:(only|nth|first|last)-child(?:\\(" + whitespace +
- "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace +
- "*(\\d+)|))" + whitespace + "*\\)|)", "i" ),
- // For use in libraries implementing .is()
- "needsContext": new RegExp( "^" + whitespace + "*[>+~]|" + pos, "i" )
- },
-
- // Support
-
- // Used for testing something on an element
- assert = function( fn ) {
- var div = document.createElement("div");
-
- try {
- return fn( div );
- } catch (e) {
- return false;
- } finally {
- // release memory in IE
- div = null;
- }
- },
-
- // Check if getElementsByTagName("*") returns only elements
- assertTagNameNoComments = assert(function( div ) {
- div.appendChild( document.createComment("") );
- return !div.getElementsByTagName("*").length;
- }),
-
- // Check if getAttribute returns normalized href attributes
- assertHrefNotNormalized = assert(function( div ) {
- div.innerHTML = " ";
- return div.firstChild && typeof div.firstChild.getAttribute !== strundefined &&
- div.firstChild.getAttribute("href") === "#";
- }),
-
- // Check if attributes should be retrieved by attribute nodes
- assertAttributes = assert(function( div ) {
- div.innerHTML = " ";
- var type = typeof div.lastChild.getAttribute("multiple");
- // IE8 returns a string for some attributes even when not present
- return type !== "boolean" && type !== "string";
- }),
-
- // Check if getElementsByClassName can be trusted
- assertUsableClassName = assert(function( div ) {
- // Opera can't find a second classname (in 9.6)
- div.innerHTML = "
";
- if ( !div.getElementsByClassName || !div.getElementsByClassName("e").length ) {
- return false;
- }
-
- // Safari 3.2 caches class attributes and doesn't catch changes
- div.lastChild.className = "e";
- return div.getElementsByClassName("e").length === 2;
- }),
-
- // Check if getElementById returns elements by name
- // Check if getElementsByName privileges form controls or returns elements by ID
- assertUsableName = assert(function( div ) {
- // Inject content
- div.id = expando + 0;
- div.innerHTML = "
";
- docElem.insertBefore( div, docElem.firstChild );
-
- // Test
- var pass = document.getElementsByName &&
- // buggy browsers will return fewer than the correct 2
- document.getElementsByName( expando ).length === 2 +
- // buggy browsers will return more than the correct 0
- document.getElementsByName( expando + 0 ).length;
- assertGetIdNotName = !document.getElementById( expando );
-
- // Cleanup
- docElem.removeChild( div );
-
- return pass;
- });
-
-// If slice is not available, provide a backup
-try {
- slice.call( docElem.childNodes, 0 )[0].nodeType;
-} catch ( e ) {
- slice = function( i ) {
- var elem,
- results = [];
- for ( ; (elem = this[i]); i++ ) {
- results.push( elem );
- }
- return results;
- };
-}
-
-function Sizzle( selector, context, results, seed ) {
- results = results || [];
- context = context || document;
- var match, elem, xml, m,
- nodeType = context.nodeType;
-
- if ( !selector || typeof selector !== "string" ) {
- return results;
- }
-
- if ( nodeType !== 1 && nodeType !== 9 ) {
- return [];
- }
-
- xml = isXML( context );
-
- if ( !xml && !seed ) {
- if ( (match = rquickExpr.exec( selector )) ) {
- // Speed-up: Sizzle("#ID")
- if ( (m = match[1]) ) {
- if ( nodeType === 9 ) {
- elem = context.getElementById( m );
- // Check parentNode to catch when Blackberry 4.6 returns
- // nodes that are no longer in the document #6963
- if ( elem && elem.parentNode ) {
- // Handle the case where IE, Opera, and Webkit return items
- // by name instead of ID
- if ( elem.id === m ) {
- results.push( elem );
- return results;
- }
- } else {
- return results;
- }
- } else {
- // Context is not a document
- if ( context.ownerDocument && (elem = context.ownerDocument.getElementById( m )) &&
- contains( context, elem ) && elem.id === m ) {
- results.push( elem );
- return results;
- }
- }
-
- // Speed-up: Sizzle("TAG")
- } else if ( match[2] ) {
- push.apply( results, slice.call(context.getElementsByTagName( selector ), 0) );
- return results;
-
- // Speed-up: Sizzle(".CLASS")
- } else if ( (m = match[3]) && assertUsableClassName && context.getElementsByClassName ) {
- push.apply( results, slice.call(context.getElementsByClassName( m ), 0) );
- return results;
- }
- }
- }
-
- // All others
- return select( selector.replace( rtrim, "$1" ), context, results, seed, xml );
-}
-
-Sizzle.matches = function( expr, elements ) {
- return Sizzle( expr, null, null, elements );
-};
-
-Sizzle.matchesSelector = function( elem, expr ) {
- return Sizzle( expr, null, null, [ elem ] ).length > 0;
-};
-
-// Returns a function to use in pseudos for input types
-function createInputPseudo( type ) {
- return function( elem ) {
- var name = elem.nodeName.toLowerCase();
- return name === "input" && elem.type === type;
- };
-}
-
-// Returns a function to use in pseudos for buttons
-function createButtonPseudo( type ) {
- return function( elem ) {
- var name = elem.nodeName.toLowerCase();
- return (name === "input" || name === "button") && elem.type === type;
- };
-}
-
-// Returns a function to use in pseudos for positionals
-function createPositionalPseudo( fn ) {
- return markFunction(function( argument ) {
- argument = +argument;
- return markFunction(function( seed, matches ) {
- var j,
- matchIndexes = fn( [], seed.length, argument ),
- i = matchIndexes.length;
-
- // Match elements found at the specified indexes
- while ( i-- ) {
- if ( seed[ (j = matchIndexes[i]) ] ) {
- seed[j] = !(matches[j] = seed[j]);
- }
- }
- });
- });
-}
-
-/**
- * Utility function for retrieving the text value of an array of DOM nodes
- * @param {Array|Element} elem
- */
-getText = Sizzle.getText = function( elem ) {
- var node,
- ret = "",
- i = 0,
- nodeType = elem.nodeType;
-
- if ( nodeType ) {
- if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {
- // Use textContent for elements
- // innerText usage removed for consistency of new lines (see #11153)
- if ( typeof elem.textContent === "string" ) {
- return elem.textContent;
- } else {
- // Traverse its children
- for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
- ret += getText( elem );
- }
- }
- } else if ( nodeType === 3 || nodeType === 4 ) {
- return elem.nodeValue;
- }
- // Do not include comment or processing instruction nodes
- } else {
-
- // If no nodeType, this is expected to be an array
- for ( ; (node = elem[i]); i++ ) {
- // Do not traverse comment nodes
- ret += getText( node );
- }
- }
- return ret;
-};
-
-isXML = Sizzle.isXML = function( elem ) {
- // documentElement is verified for cases where it doesn't yet exist
- // (such as loading iframes in IE - #4833)
- var documentElement = elem && (elem.ownerDocument || elem).documentElement;
- return documentElement ? documentElement.nodeName !== "HTML" : false;
-};
-
-// Element contains another
-contains = Sizzle.contains = docElem.contains ?
- function( a, b ) {
- var adown = a.nodeType === 9 ? a.documentElement : a,
- bup = b && b.parentNode;
- return a === bup || !!( bup && bup.nodeType === 1 && adown.contains && adown.contains(bup) );
- } :
- docElem.compareDocumentPosition ?
- function( a, b ) {
- return b && !!( a.compareDocumentPosition( b ) & 16 );
- } :
- function( a, b ) {
- while ( (b = b.parentNode) ) {
- if ( b === a ) {
- return true;
- }
- }
- return false;
- };
-
-Sizzle.attr = function( elem, name ) {
- var val,
- xml = isXML( elem );
-
- if ( !xml ) {
- name = name.toLowerCase();
- }
- if ( (val = Expr.attrHandle[ name ]) ) {
- return val( elem );
- }
- if ( xml || assertAttributes ) {
- return elem.getAttribute( name );
- }
- val = elem.getAttributeNode( name );
- return val ?
- typeof elem[ name ] === "boolean" ?
- elem[ name ] ? name : null :
- val.specified ? val.value : null :
- null;
-};
-
-Expr = Sizzle.selectors = {
-
- // Can be adjusted by the user
- cacheLength: 50,
-
- createPseudo: markFunction,
-
- match: matchExpr,
-
- // IE6/7 return a modified href
- attrHandle: assertHrefNotNormalized ?
- {} :
- {
- "href": function( elem ) {
- return elem.getAttribute( "href", 2 );
- },
- "type": function( elem ) {
- return elem.getAttribute("type");
- }
- },
-
- find: {
- "ID": assertGetIdNotName ?
- function( id, context, xml ) {
- if ( typeof context.getElementById !== strundefined && !xml ) {
- var m = context.getElementById( id );
- // Check parentNode to catch when Blackberry 4.6 returns
- // nodes that are no longer in the document #6963
- return m && m.parentNode ? [m] : [];
- }
- } :
- function( id, context, xml ) {
- if ( typeof context.getElementById !== strundefined && !xml ) {
- var m = context.getElementById( id );
-
- return m ?
- m.id === id || typeof m.getAttributeNode !== strundefined && m.getAttributeNode("id").value === id ?
- [m] :
- undefined :
- [];
- }
- },
-
- "TAG": assertTagNameNoComments ?
- function( tag, context ) {
- if ( typeof context.getElementsByTagName !== strundefined ) {
- return context.getElementsByTagName( tag );
- }
- } :
- function( tag, context ) {
- var results = context.getElementsByTagName( tag );
-
- // Filter out possible comments
- if ( tag === "*" ) {
- var elem,
- tmp = [],
- i = 0;
-
- for ( ; (elem = results[i]); i++ ) {
- if ( elem.nodeType === 1 ) {
- tmp.push( elem );
- }
- }
-
- return tmp;
- }
- return results;
- },
-
- "NAME": assertUsableName && function( tag, context ) {
- if ( typeof context.getElementsByName !== strundefined ) {
- return context.getElementsByName( name );
- }
- },
-
- "CLASS": assertUsableClassName && function( className, context, xml ) {
- if ( typeof context.getElementsByClassName !== strundefined && !xml ) {
- return context.getElementsByClassName( className );
- }
- }
- },
-
- relative: {
- ">": { dir: "parentNode", first: true },
- " ": { dir: "parentNode" },
- "+": { dir: "previousSibling", first: true },
- "~": { dir: "previousSibling" }
- },
-
- preFilter: {
- "ATTR": function( match ) {
- match[1] = match[1].replace( rbackslash, "" );
-
- // Move the given value to match[3] whether quoted or unquoted
- match[3] = ( match[4] || match[5] || "" ).replace( rbackslash, "" );
-
- if ( match[2] === "~=" ) {
- match[3] = " " + match[3] + " ";
- }
-
- return match.slice( 0, 4 );
- },
-
- "CHILD": function( match ) {
- /* matches from matchExpr["CHILD"]
- 1 type (only|nth|...)
- 2 argument (even|odd|\d*|\d*n([+-]\d+)?|...)
- 3 xn-component of xn+y argument ([+-]?\d*n|)
- 4 sign of xn-component
- 5 x of xn-component
- 6 sign of y-component
- 7 y of y-component
- */
- match[1] = match[1].toLowerCase();
-
- if ( match[1] === "nth" ) {
- // nth-child requires argument
- if ( !match[2] ) {
- Sizzle.error( match[0] );
- }
-
- // numeric x and y parameters for Expr.filter.CHILD
- // remember that false/true cast respectively to 0/1
- match[3] = +( match[3] ? match[4] + (match[5] || 1) : 2 * ( match[2] === "even" || match[2] === "odd" ) );
- match[4] = +( ( match[6] + match[7] ) || match[2] === "odd" );
-
- // other types prohibit arguments
- } else if ( match[2] ) {
- Sizzle.error( match[0] );
- }
-
- return match;
- },
-
- "PSEUDO": function( match ) {
- var unquoted, excess;
- if ( matchExpr["CHILD"].test( match[0] ) ) {
- return null;
- }
-
- if ( match[3] ) {
- match[2] = match[3];
- } else if ( (unquoted = match[4]) ) {
- // Only check arguments that contain a pseudo
- if ( rpseudo.test(unquoted) &&
- // Get excess from tokenize (recursively)
- (excess = tokenize( unquoted, true )) &&
- // advance to the next closing parenthesis
- (excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) {
-
- // excess is a negative index
- unquoted = unquoted.slice( 0, excess );
- match[0] = match[0].slice( 0, excess );
- }
- match[2] = unquoted;
- }
-
- // Return only captures needed by the pseudo filter method (type and argument)
- return match.slice( 0, 3 );
- }
- },
-
- filter: {
- "ID": assertGetIdNotName ?
- function( id ) {
- id = id.replace( rbackslash, "" );
- return function( elem ) {
- return elem.getAttribute("id") === id;
- };
- } :
- function( id ) {
- id = id.replace( rbackslash, "" );
- return function( elem ) {
- var node = typeof elem.getAttributeNode !== strundefined && elem.getAttributeNode("id");
- return node && node.value === id;
- };
- },
-
- "TAG": function( nodeName ) {
- if ( nodeName === "*" ) {
- return function() { return true; };
- }
- nodeName = nodeName.replace( rbackslash, "" ).toLowerCase();
-
- return function( elem ) {
- return elem.nodeName && elem.nodeName.toLowerCase() === nodeName;
- };
- },
-
- "CLASS": function( className ) {
- var pattern = classCache[ expando ][ className ];
- if ( !pattern ) {
- pattern = classCache( className, new RegExp("(^|" + whitespace + ")" + className + "(" + whitespace + "|$)") );
- }
- return function( elem ) {
- return pattern.test( elem.className || (typeof elem.getAttribute !== strundefined && elem.getAttribute("class")) || "" );
- };
- },
-
- "ATTR": function( name, operator, check ) {
- return function( elem, context ) {
- var result = Sizzle.attr( elem, name );
-
- if ( result == null ) {
- return operator === "!=";
- }
- if ( !operator ) {
- return true;
- }
-
- result += "";
-
- return operator === "=" ? result === check :
- operator === "!=" ? result !== check :
- operator === "^=" ? check && result.indexOf( check ) === 0 :
- operator === "*=" ? check && result.indexOf( check ) > -1 :
- operator === "$=" ? check && result.substr( result.length - check.length ) === check :
- operator === "~=" ? ( " " + result + " " ).indexOf( check ) > -1 :
- operator === "|=" ? result === check || result.substr( 0, check.length + 1 ) === check + "-" :
- false;
- };
- },
-
- "CHILD": function( type, argument, first, last ) {
-
- if ( type === "nth" ) {
- return function( elem ) {
- var node, diff,
- parent = elem.parentNode;
-
- if ( first === 1 && last === 0 ) {
- return true;
- }
-
- if ( parent ) {
- diff = 0;
- for ( node = parent.firstChild; node; node = node.nextSibling ) {
- if ( node.nodeType === 1 ) {
- diff++;
- if ( elem === node ) {
- break;
- }
- }
- }
- }
-
- // Incorporate the offset (or cast to NaN), then check against cycle size
- diff -= last;
- return diff === first || ( diff % first === 0 && diff / first >= 0 );
- };
- }
-
- return function( elem ) {
- var node = elem;
-
- switch ( type ) {
- case "only":
- case "first":
- while ( (node = node.previousSibling) ) {
- if ( node.nodeType === 1 ) {
- return false;
- }
- }
-
- if ( type === "first" ) {
- return true;
- }
-
- node = elem;
-
- /* falls through */
- case "last":
- while ( (node = node.nextSibling) ) {
- if ( node.nodeType === 1 ) {
- return false;
- }
- }
-
- return true;
- }
- };
- },
-
- "PSEUDO": function( pseudo, argument ) {
- // pseudo-class names are case-insensitive
- // http://www.w3.org/TR/selectors/#pseudo-classes
- // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters
- // Remember that setFilters inherits from pseudos
- var args,
- fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||
- Sizzle.error( "unsupported pseudo: " + pseudo );
-
- // The user may use createPseudo to indicate that
- // arguments are needed to create the filter function
- // just as Sizzle does
- if ( fn[ expando ] ) {
- return fn( argument );
- }
-
- // But maintain support for old signatures
- if ( fn.length > 1 ) {
- args = [ pseudo, pseudo, "", argument ];
- return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?
- markFunction(function( seed, matches ) {
- var idx,
- matched = fn( seed, argument ),
- i = matched.length;
- while ( i-- ) {
- idx = indexOf.call( seed, matched[i] );
- seed[ idx ] = !( matches[ idx ] = matched[i] );
- }
- }) :
- function( elem ) {
- return fn( elem, 0, args );
- };
- }
-
- return fn;
- }
- },
-
- pseudos: {
- "not": markFunction(function( selector ) {
- // Trim the selector passed to compile
- // to avoid treating leading and trailing
- // spaces as combinators
- var input = [],
- results = [],
- matcher = compile( selector.replace( rtrim, "$1" ) );
-
- return matcher[ expando ] ?
- markFunction(function( seed, matches, context, xml ) {
- var elem,
- unmatched = matcher( seed, null, xml, [] ),
- i = seed.length;
-
- // Match elements unmatched by `matcher`
- while ( i-- ) {
- if ( (elem = unmatched[i]) ) {
- seed[i] = !(matches[i] = elem);
- }
- }
- }) :
- function( elem, context, xml ) {
- input[0] = elem;
- matcher( input, null, xml, results );
- return !results.pop();
- };
- }),
-
- "has": markFunction(function( selector ) {
- return function( elem ) {
- return Sizzle( selector, elem ).length > 0;
- };
- }),
-
- "contains": markFunction(function( text ) {
- return function( elem ) {
- return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1;
- };
- }),
-
- "enabled": function( elem ) {
- return elem.disabled === false;
- },
-
- "disabled": function( elem ) {
- return elem.disabled === true;
- },
-
- "checked": function( elem ) {
- // In CSS3, :checked should return both checked and selected elements
- // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
- var nodeName = elem.nodeName.toLowerCase();
- return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected);
- },
-
- "selected": function( elem ) {
- // Accessing this property makes selected-by-default
- // options in Safari work properly
- if ( elem.parentNode ) {
- elem.parentNode.selectedIndex;
- }
-
- return elem.selected === true;
- },
-
- "parent": function( elem ) {
- return !Expr.pseudos["empty"]( elem );
- },
-
- "empty": function( elem ) {
- // http://www.w3.org/TR/selectors/#empty-pseudo
- // :empty is only affected by element nodes and content nodes(including text(3), cdata(4)),
- // not comment, processing instructions, or others
- // Thanks to Diego Perini for the nodeName shortcut
- // Greater than "@" means alpha characters (specifically not starting with "#" or "?")
- var nodeType;
- elem = elem.firstChild;
- while ( elem ) {
- if ( elem.nodeName > "@" || (nodeType = elem.nodeType) === 3 || nodeType === 4 ) {
- return false;
- }
- elem = elem.nextSibling;
- }
- return true;
- },
-
- "header": function( elem ) {
- return rheader.test( elem.nodeName );
- },
-
- "text": function( elem ) {
- var type, attr;
- // IE6 and 7 will map elem.type to 'text' for new HTML5 types (search, etc)
- // use getAttribute instead to test this case
- return elem.nodeName.toLowerCase() === "input" &&
- (type = elem.type) === "text" &&
- ( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === type );
- },
-
- // Input types
- "radio": createInputPseudo("radio"),
- "checkbox": createInputPseudo("checkbox"),
- "file": createInputPseudo("file"),
- "password": createInputPseudo("password"),
- "image": createInputPseudo("image"),
-
- "submit": createButtonPseudo("submit"),
- "reset": createButtonPseudo("reset"),
-
- "button": function( elem ) {
- var name = elem.nodeName.toLowerCase();
- return name === "input" && elem.type === "button" || name === "button";
- },
-
- "input": function( elem ) {
- return rinputs.test( elem.nodeName );
- },
-
- "focus": function( elem ) {
- var doc = elem.ownerDocument;
- return elem === doc.activeElement && (!doc.hasFocus || doc.hasFocus()) && !!(elem.type || elem.href);
- },
-
- "active": function( elem ) {
- return elem === elem.ownerDocument.activeElement;
- },
-
- // Positional types
- "first": createPositionalPseudo(function( matchIndexes, length, argument ) {
- return [ 0 ];
- }),
-
- "last": createPositionalPseudo(function( matchIndexes, length, argument ) {
- return [ length - 1 ];
- }),
-
- "eq": createPositionalPseudo(function( matchIndexes, length, argument ) {
- return [ argument < 0 ? argument + length : argument ];
- }),
-
- "even": createPositionalPseudo(function( matchIndexes, length, argument ) {
- for ( var i = 0; i < length; i += 2 ) {
- matchIndexes.push( i );
- }
- return matchIndexes;
- }),
-
- "odd": createPositionalPseudo(function( matchIndexes, length, argument ) {
- for ( var i = 1; i < length; i += 2 ) {
- matchIndexes.push( i );
- }
- return matchIndexes;
- }),
-
- "lt": createPositionalPseudo(function( matchIndexes, length, argument ) {
- for ( var i = argument < 0 ? argument + length : argument; --i >= 0; ) {
- matchIndexes.push( i );
- }
- return matchIndexes;
- }),
-
- "gt": createPositionalPseudo(function( matchIndexes, length, argument ) {
- for ( var i = argument < 0 ? argument + length : argument; ++i < length; ) {
- matchIndexes.push( i );
- }
- return matchIndexes;
- })
- }
-};
-
-function siblingCheck( a, b, ret ) {
- if ( a === b ) {
- return ret;
- }
-
- var cur = a.nextSibling;
-
- while ( cur ) {
- if ( cur === b ) {
- return -1;
- }
-
- cur = cur.nextSibling;
- }
-
- return 1;
-}
-
-sortOrder = docElem.compareDocumentPosition ?
- function( a, b ) {
- if ( a === b ) {
- hasDuplicate = true;
- return 0;
- }
-
- return ( !a.compareDocumentPosition || !b.compareDocumentPosition ?
- a.compareDocumentPosition :
- a.compareDocumentPosition(b) & 4
- ) ? -1 : 1;
- } :
- function( a, b ) {
- // The nodes are identical, we can exit early
- if ( a === b ) {
- hasDuplicate = true;
- return 0;
-
- // Fallback to using sourceIndex (in IE) if it's available on both nodes
- } else if ( a.sourceIndex && b.sourceIndex ) {
- return a.sourceIndex - b.sourceIndex;
- }
-
- var al, bl,
- ap = [],
- bp = [],
- aup = a.parentNode,
- bup = b.parentNode,
- cur = aup;
-
- // If the nodes are siblings (or identical) we can do a quick check
- if ( aup === bup ) {
- return siblingCheck( a, b );
-
- // If no parents were found then the nodes are disconnected
- } else if ( !aup ) {
- return -1;
-
- } else if ( !bup ) {
- return 1;
- }
-
- // Otherwise they're somewhere else in the tree so we need
- // to build up a full list of the parentNodes for comparison
- while ( cur ) {
- ap.unshift( cur );
- cur = cur.parentNode;
- }
-
- cur = bup;
-
- while ( cur ) {
- bp.unshift( cur );
- cur = cur.parentNode;
- }
-
- al = ap.length;
- bl = bp.length;
-
- // Start walking down the tree looking for a discrepancy
- for ( var i = 0; i < al && i < bl; i++ ) {
- if ( ap[i] !== bp[i] ) {
- return siblingCheck( ap[i], bp[i] );
- }
- }
-
- // We ended someplace up the tree so do a sibling check
- return i === al ?
- siblingCheck( a, bp[i], -1 ) :
- siblingCheck( ap[i], b, 1 );
- };
-
-// Always assume the presence of duplicates if sort doesn't
-// pass them to our comparison function (as in Google Chrome).
-[0, 0].sort( sortOrder );
-baseHasDuplicate = !hasDuplicate;
-
-// Document sorting and removing duplicates
-Sizzle.uniqueSort = function( results ) {
- var elem,
- i = 1;
-
- hasDuplicate = baseHasDuplicate;
- results.sort( sortOrder );
-
- if ( hasDuplicate ) {
- for ( ; (elem = results[i]); i++ ) {
- if ( elem === results[ i - 1 ] ) {
- results.splice( i--, 1 );
- }
- }
- }
-
- return results;
-};
-
-Sizzle.error = function( msg ) {
- throw new Error( "Syntax error, unrecognized expression: " + msg );
-};
-
-function tokenize( selector, parseOnly ) {
- var matched, match, tokens, type, soFar, groups, preFilters,
- cached = tokenCache[ expando ][ selector ];
-
- if ( cached ) {
- return parseOnly ? 0 : cached.slice( 0 );
- }
-
- soFar = selector;
- groups = [];
- preFilters = Expr.preFilter;
-
- while ( soFar ) {
-
- // Comma and first run
- if ( !matched || (match = rcomma.exec( soFar )) ) {
- if ( match ) {
- soFar = soFar.slice( match[0].length );
- }
- groups.push( tokens = [] );
- }
-
- matched = false;
-
- // Combinators
- if ( (match = rcombinators.exec( soFar )) ) {
- tokens.push( matched = new Token( match.shift() ) );
- soFar = soFar.slice( matched.length );
-
- // Cast descendant combinators to space
- matched.type = match[0].replace( rtrim, " " );
- }
-
- // Filters
- for ( type in Expr.filter ) {
- if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] ||
- // The last two arguments here are (context, xml) for backCompat
- (match = preFilters[ type ]( match, document, true ))) ) {
-
- tokens.push( matched = new Token( match.shift() ) );
- soFar = soFar.slice( matched.length );
- matched.type = type;
- matched.matches = match;
- }
- }
-
- if ( !matched ) {
- break;
- }
- }
-
- // Return the length of the invalid excess
- // if we're just parsing
- // Otherwise, throw an error or return tokens
- return parseOnly ?
- soFar.length :
- soFar ?
- Sizzle.error( selector ) :
- // Cache the tokens
- tokenCache( selector, groups ).slice( 0 );
-}
-
-function addCombinator( matcher, combinator, base ) {
- var dir = combinator.dir,
- checkNonElements = base && combinator.dir === "parentNode",
- doneName = done++;
-
- return combinator.first ?
- // Check against closest ancestor/preceding element
- function( elem, context, xml ) {
- while ( (elem = elem[ dir ]) ) {
- if ( checkNonElements || elem.nodeType === 1 ) {
- return matcher( elem, context, xml );
- }
- }
- } :
-
- // Check against all ancestor/preceding elements
- function( elem, context, xml ) {
- // We can't set arbitrary data on XML nodes, so they don't benefit from dir caching
- if ( !xml ) {
- var cache,
- dirkey = dirruns + " " + doneName + " ",
- cachedkey = dirkey + cachedruns;
- while ( (elem = elem[ dir ]) ) {
- if ( checkNonElements || elem.nodeType === 1 ) {
- if ( (cache = elem[ expando ]) === cachedkey ) {
- return elem.sizset;
- } else if ( typeof cache === "string" && cache.indexOf(dirkey) === 0 ) {
- if ( elem.sizset ) {
- return elem;
- }
- } else {
- elem[ expando ] = cachedkey;
- if ( matcher( elem, context, xml ) ) {
- elem.sizset = true;
- return elem;
- }
- elem.sizset = false;
- }
- }
- }
- } else {
- while ( (elem = elem[ dir ]) ) {
- if ( checkNonElements || elem.nodeType === 1 ) {
- if ( matcher( elem, context, xml ) ) {
- return elem;
- }
- }
- }
- }
- };
-}
-
-function elementMatcher( matchers ) {
- return matchers.length > 1 ?
- function( elem, context, xml ) {
- var i = matchers.length;
- while ( i-- ) {
- if ( !matchers[i]( elem, context, xml ) ) {
- return false;
- }
- }
- return true;
- } :
- matchers[0];
-}
-
-function condense( unmatched, map, filter, context, xml ) {
- var elem,
- newUnmatched = [],
- i = 0,
- len = unmatched.length,
- mapped = map != null;
-
- for ( ; i < len; i++ ) {
- if ( (elem = unmatched[i]) ) {
- if ( !filter || filter( elem, context, xml ) ) {
- newUnmatched.push( elem );
- if ( mapped ) {
- map.push( i );
- }
- }
- }
- }
-
- return newUnmatched;
-}
-
-function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {
- if ( postFilter && !postFilter[ expando ] ) {
- postFilter = setMatcher( postFilter );
- }
- if ( postFinder && !postFinder[ expando ] ) {
- postFinder = setMatcher( postFinder, postSelector );
- }
- return markFunction(function( seed, results, context, xml ) {
- // Positional selectors apply to seed elements, so it is invalid to follow them with relative ones
- if ( seed && postFinder ) {
- return;
- }
-
- var i, elem, postFilterIn,
- preMap = [],
- postMap = [],
- preexisting = results.length,
-
- // Get initial elements from seed or context
- elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [], seed ),
-
- // Prefilter to get matcher input, preserving a map for seed-results synchronization
- matcherIn = preFilter && ( seed || !selector ) ?
- condense( elems, preMap, preFilter, context, xml ) :
- elems,
-
- matcherOut = matcher ?
- // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,
- postFinder || ( seed ? preFilter : preexisting || postFilter ) ?
-
- // ...intermediate processing is necessary
- [] :
-
- // ...otherwise use results directly
- results :
- matcherIn;
-
- // Find primary matches
- if ( matcher ) {
- matcher( matcherIn, matcherOut, context, xml );
- }
-
- // Apply postFilter
- if ( postFilter ) {
- postFilterIn = condense( matcherOut, postMap );
- postFilter( postFilterIn, [], context, xml );
-
- // Un-match failing elements by moving them back to matcherIn
- i = postFilterIn.length;
- while ( i-- ) {
- if ( (elem = postFilterIn[i]) ) {
- matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem);
- }
- }
- }
-
- // Keep seed and results synchronized
- if ( seed ) {
- // Ignore postFinder because it can't coexist with seed
- i = preFilter && matcherOut.length;
- while ( i-- ) {
- if ( (elem = matcherOut[i]) ) {
- seed[ preMap[i] ] = !(results[ preMap[i] ] = elem);
- }
- }
- } else {
- matcherOut = condense(
- matcherOut === results ?
- matcherOut.splice( preexisting, matcherOut.length ) :
- matcherOut
- );
- if ( postFinder ) {
- postFinder( null, results, matcherOut, xml );
- } else {
- push.apply( results, matcherOut );
- }
- }
- });
-}
-
-function matcherFromTokens( tokens ) {
- var checkContext, matcher, j,
- len = tokens.length,
- leadingRelative = Expr.relative[ tokens[0].type ],
- implicitRelative = leadingRelative || Expr.relative[" "],
- i = leadingRelative ? 1 : 0,
-
- // The foundational matcher ensures that elements are reachable from top-level context(s)
- matchContext = addCombinator( function( elem ) {
- return elem === checkContext;
- }, implicitRelative, true ),
- matchAnyContext = addCombinator( function( elem ) {
- return indexOf.call( checkContext, elem ) > -1;
- }, implicitRelative, true ),
- matchers = [ function( elem, context, xml ) {
- return ( !leadingRelative && ( xml || context !== outermostContext ) ) || (
- (checkContext = context).nodeType ?
- matchContext( elem, context, xml ) :
- matchAnyContext( elem, context, xml ) );
- } ];
-
- for ( ; i < len; i++ ) {
- if ( (matcher = Expr.relative[ tokens[i].type ]) ) {
- matchers = [ addCombinator( elementMatcher( matchers ), matcher ) ];
- } else {
- // The concatenated values are (context, xml) for backCompat
- matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches );
-
- // Return special upon seeing a positional matcher
- if ( matcher[ expando ] ) {
- // Find the next relative operator (if any) for proper handling
- j = ++i;
- for ( ; j < len; j++ ) {
- if ( Expr.relative[ tokens[j].type ] ) {
- break;
- }
- }
- return setMatcher(
- i > 1 && elementMatcher( matchers ),
- i > 1 && tokens.slice( 0, i - 1 ).join("").replace( rtrim, "$1" ),
- matcher,
- i < j && matcherFromTokens( tokens.slice( i, j ) ),
- j < len && matcherFromTokens( (tokens = tokens.slice( j )) ),
- j < len && tokens.join("")
- );
- }
- matchers.push( matcher );
- }
- }
-
- return elementMatcher( matchers );
-}
-
-function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
- var bySet = setMatchers.length > 0,
- byElement = elementMatchers.length > 0,
- superMatcher = function( seed, context, xml, results, expandContext ) {
- var elem, j, matcher,
- setMatched = [],
- matchedCount = 0,
- i = "0",
- unmatched = seed && [],
- outermost = expandContext != null,
- contextBackup = outermostContext,
- // We must always have either seed elements or context
- elems = seed || byElement && Expr.find["TAG"]( "*", expandContext && context.parentNode || context ),
- // Nested matchers should use non-integer dirruns
- dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.E);
-
- if ( outermost ) {
- outermostContext = context !== document && context;
- cachedruns = superMatcher.el;
- }
-
- // Add elements passing elementMatchers directly to results
- for ( ; (elem = elems[i]) != null; i++ ) {
- if ( byElement && elem ) {
- for ( j = 0; (matcher = elementMatchers[j]); j++ ) {
- if ( matcher( elem, context, xml ) ) {
- results.push( elem );
- break;
- }
- }
- if ( outermost ) {
- dirruns = dirrunsUnique;
- cachedruns = ++superMatcher.el;
- }
- }
-
- // Track unmatched elements for set filters
- if ( bySet ) {
- // They will have gone through all possible matchers
- if ( (elem = !matcher && elem) ) {
- matchedCount--;
- }
-
- // Lengthen the array for every element, matched or not
- if ( seed ) {
- unmatched.push( elem );
- }
- }
- }
-
- // Apply set filters to unmatched elements
- matchedCount += i;
- if ( bySet && i !== matchedCount ) {
- for ( j = 0; (matcher = setMatchers[j]); j++ ) {
- matcher( unmatched, setMatched, context, xml );
- }
-
- if ( seed ) {
- // Reintegrate element matches to eliminate the need for sorting
- if ( matchedCount > 0 ) {
- while ( i-- ) {
- if ( !(unmatched[i] || setMatched[i]) ) {
- setMatched[i] = pop.call( results );
- }
- }
- }
-
- // Discard index placeholder values to get only actual matches
- setMatched = condense( setMatched );
- }
-
- // Add matches to results
- push.apply( results, setMatched );
-
- // Seedless set matches succeeding multiple successful matchers stipulate sorting
- if ( outermost && !seed && setMatched.length > 0 &&
- ( matchedCount + setMatchers.length ) > 1 ) {
-
- Sizzle.uniqueSort( results );
- }
- }
-
- // Override manipulation of globals by nested matchers
- if ( outermost ) {
- dirruns = dirrunsUnique;
- outermostContext = contextBackup;
- }
-
- return unmatched;
- };
-
- superMatcher.el = 0;
- return bySet ?
- markFunction( superMatcher ) :
- superMatcher;
-}
-
-compile = Sizzle.compile = function( selector, group /* Internal Use Only */ ) {
- var i,
- setMatchers = [],
- elementMatchers = [],
- cached = compilerCache[ expando ][ selector ];
-
- if ( !cached ) {
- // Generate a function of recursive functions that can be used to check each element
- if ( !group ) {
- group = tokenize( selector );
- }
- i = group.length;
- while ( i-- ) {
- cached = matcherFromTokens( group[i] );
- if ( cached[ expando ] ) {
- setMatchers.push( cached );
- } else {
- elementMatchers.push( cached );
- }
- }
-
- // Cache the compiled function
- cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) );
- }
- return cached;
-};
-
-function multipleContexts( selector, contexts, results, seed ) {
- var i = 0,
- len = contexts.length;
- for ( ; i < len; i++ ) {
- Sizzle( selector, contexts[i], results, seed );
- }
- return results;
-}
-
-function select( selector, context, results, seed, xml ) {
- var i, tokens, token, type, find,
- match = tokenize( selector ),
- j = match.length;
-
- if ( !seed ) {
- // Try to minimize operations if there is only one group
- if ( match.length === 1 ) {
-
- // Take a shortcut and set the context if the root selector is an ID
- tokens = match[0] = match[0].slice( 0 );
- if ( tokens.length > 2 && (token = tokens[0]).type === "ID" &&
- context.nodeType === 9 && !xml &&
- Expr.relative[ tokens[1].type ] ) {
-
- context = Expr.find["ID"]( token.matches[0].replace( rbackslash, "" ), context, xml )[0];
- if ( !context ) {
- return results;
- }
-
- selector = selector.slice( tokens.shift().length );
- }
-
- // Fetch a seed set for right-to-left matching
- for ( i = matchExpr["POS"].test( selector ) ? -1 : tokens.length - 1; i >= 0; i-- ) {
- token = tokens[i];
-
- // Abort if we hit a combinator
- if ( Expr.relative[ (type = token.type) ] ) {
- break;
- }
- if ( (find = Expr.find[ type ]) ) {
- // Search, expanding context for leading sibling combinators
- if ( (seed = find(
- token.matches[0].replace( rbackslash, "" ),
- rsibling.test( tokens[0].type ) && context.parentNode || context,
- xml
- )) ) {
-
- // If seed is empty or no tokens remain, we can return early
- tokens.splice( i, 1 );
- selector = seed.length && tokens.join("");
- if ( !selector ) {
- push.apply( results, slice.call( seed, 0 ) );
- return results;
- }
-
- break;
- }
- }
- }
- }
- }
-
- // Compile and execute a filtering function
- // Provide `match` to avoid retokenization if we modified the selector above
- compile( selector, match )(
- seed,
- context,
- xml,
- results,
- rsibling.test( selector )
- );
- return results;
-}
-
-if ( document.querySelectorAll ) {
- (function() {
- var disconnectedMatch,
- oldSelect = select,
- rescape = /'|\\/g,
- rattributeQuotes = /\=[\x20\t\r\n\f]*([^'"\]]*)[\x20\t\r\n\f]*\]/g,
-
- // qSa(:focus) reports false when true (Chrome 21),
- // A support test would require too much code (would include document ready)
- rbuggyQSA = [":focus"],
-
- // matchesSelector(:focus) reports false when true (Chrome 21),
- // matchesSelector(:active) reports false when true (IE9/Opera 11.5)
- // A support test would require too much code (would include document ready)
- // just skip matchesSelector for :active
- rbuggyMatches = [ ":active", ":focus" ],
- matches = docElem.matchesSelector ||
- docElem.mozMatchesSelector ||
- docElem.webkitMatchesSelector ||
- docElem.oMatchesSelector ||
- docElem.msMatchesSelector;
-
- // Build QSA regex
- // Regex strategy adopted from Diego Perini
- assert(function( div ) {
- // Select is set to empty string on purpose
- // This is to test IE's treatment of not explictly
- // setting a boolean content attribute,
- // since its presence should be enough
- // http://bugs.jquery.com/ticket/12359
- div.innerHTML = " ";
-
- // IE8 - Some boolean attributes are not treated correctly
- if ( !div.querySelectorAll("[selected]").length ) {
- rbuggyQSA.push( "\\[" + whitespace + "*(?:checked|disabled|ismap|multiple|readonly|selected|value)" );
- }
-
- // Webkit/Opera - :checked should return selected option elements
- // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
- // IE8 throws error here (do not put tests after this one)
- if ( !div.querySelectorAll(":checked").length ) {
- rbuggyQSA.push(":checked");
- }
- });
-
- assert(function( div ) {
-
- // Opera 10-12/IE9 - ^= $= *= and empty values
- // Should not select anything
- div.innerHTML = "
";
- if ( div.querySelectorAll("[test^='']").length ) {
- rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:\"\"|'')" );
- }
-
- // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)
- // IE8 throws error here (do not put tests after this one)
- div.innerHTML = " ";
- if ( !div.querySelectorAll(":enabled").length ) {
- rbuggyQSA.push(":enabled", ":disabled");
- }
- });
-
- // rbuggyQSA always contains :focus, so no need for a length check
- rbuggyQSA = /* rbuggyQSA.length && */ new RegExp( rbuggyQSA.join("|") );
-
- select = function( selector, context, results, seed, xml ) {
- // Only use querySelectorAll when not filtering,
- // when this is not xml,
- // and when no QSA bugs apply
- if ( !seed && !xml && (!rbuggyQSA || !rbuggyQSA.test( selector )) ) {
- var groups, i,
- old = true,
- nid = expando,
- newContext = context,
- newSelector = context.nodeType === 9 && selector;
-
- // qSA works strangely on Element-rooted queries
- // We can work around this by specifying an extra ID on the root
- // and working up from there (Thanks to Andrew Dupont for the technique)
- // IE 8 doesn't work on object elements
- if ( context.nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) {
- groups = tokenize( selector );
-
- if ( (old = context.getAttribute("id")) ) {
- nid = old.replace( rescape, "\\$&" );
- } else {
- context.setAttribute( "id", nid );
- }
- nid = "[id='" + nid + "'] ";
-
- i = groups.length;
- while ( i-- ) {
- groups[i] = nid + groups[i].join("");
- }
- newContext = rsibling.test( selector ) && context.parentNode || context;
- newSelector = groups.join(",");
- }
-
- if ( newSelector ) {
- try {
- push.apply( results, slice.call( newContext.querySelectorAll(
- newSelector
- ), 0 ) );
- return results;
- } catch(qsaError) {
- } finally {
- if ( !old ) {
- context.removeAttribute("id");
- }
- }
- }
- }
-
- return oldSelect( selector, context, results, seed, xml );
- };
-
- if ( matches ) {
- assert(function( div ) {
- // Check to see if it's possible to do matchesSelector
- // on a disconnected node (IE 9)
- disconnectedMatch = matches.call( div, "div" );
-
- // This should fail with an exception
- // Gecko does not error, returns false instead
- try {
- matches.call( div, "[test!='']:sizzle" );
- rbuggyMatches.push( "!=", pseudos );
- } catch ( e ) {}
- });
-
- // rbuggyMatches always contains :active and :focus, so no need for a length check
- rbuggyMatches = /* rbuggyMatches.length && */ new RegExp( rbuggyMatches.join("|") );
-
- Sizzle.matchesSelector = function( elem, expr ) {
- // Make sure that attribute selectors are quoted
- expr = expr.replace( rattributeQuotes, "='$1']" );
-
- // rbuggyMatches always contains :active, so no need for an existence check
- if ( !isXML( elem ) && !rbuggyMatches.test( expr ) && (!rbuggyQSA || !rbuggyQSA.test( expr )) ) {
- try {
- var ret = matches.call( elem, expr );
-
- // IE 9's matchesSelector returns false on disconnected nodes
- if ( ret || disconnectedMatch ||
- // As well, disconnected nodes are said to be in a document
- // fragment in IE 9
- elem.document && elem.document.nodeType !== 11 ) {
- return ret;
- }
- } catch(e) {}
- }
-
- return Sizzle( expr, null, null, [ elem ] ).length > 0;
- };
- }
- })();
-}
-
-// Deprecated
-Expr.pseudos["nth"] = Expr.pseudos["eq"];
-
-// Back-compat
-function setFilters() {}
-Expr.filters = setFilters.prototype = Expr.pseudos;
-Expr.setFilters = new setFilters();
-
-// Override sizzle attribute retrieval
-Sizzle.attr = jQuery.attr;
-jQuery.find = Sizzle;
-jQuery.expr = Sizzle.selectors;
-jQuery.expr[":"] = jQuery.expr.pseudos;
-jQuery.unique = Sizzle.uniqueSort;
-jQuery.text = Sizzle.getText;
-jQuery.isXMLDoc = Sizzle.isXML;
-jQuery.contains = Sizzle.contains;
-
-
-})( window );
-var runtil = /Until$/,
- rparentsprev = /^(?:parents|prev(?:Until|All))/,
- isSimple = /^.[^:#\[\.,]*$/,
- rneedsContext = jQuery.expr.match.needsContext,
- // methods guaranteed to produce a unique set when starting from a unique set
- guaranteedUnique = {
- children: true,
- contents: true,
- next: true,
- prev: true
- };
-
-jQuery.fn.extend({
- find: function( selector ) {
- var i, l, length, n, r, ret,
- self = this;
-
- if ( typeof selector !== "string" ) {
- return jQuery( selector ).filter(function() {
- for ( i = 0, l = self.length; i < l; i++ ) {
- if ( jQuery.contains( self[ i ], this ) ) {
- return true;
- }
- }
- });
- }
-
- ret = this.pushStack( "", "find", selector );
-
- for ( i = 0, l = this.length; i < l; i++ ) {
- length = ret.length;
- jQuery.find( selector, this[i], ret );
-
- if ( i > 0 ) {
- // Make sure that the results are unique
- for ( n = length; n < ret.length; n++ ) {
- for ( r = 0; r < length; r++ ) {
- if ( ret[r] === ret[n] ) {
- ret.splice(n--, 1);
- break;
- }
- }
- }
- }
- }
-
- return ret;
- },
-
- has: function( target ) {
- var i,
- targets = jQuery( target, this ),
- len = targets.length;
-
- return this.filter(function() {
- for ( i = 0; i < len; i++ ) {
- if ( jQuery.contains( this, targets[i] ) ) {
- return true;
- }
- }
- });
- },
-
- not: function( selector ) {
- return this.pushStack( winnow(this, selector, false), "not", selector);
- },
-
- filter: function( selector ) {
- return this.pushStack( winnow(this, selector, true), "filter", selector );
- },
-
- is: function( selector ) {
- return !!selector && (
- typeof selector === "string" ?
- // If this is a positional/relative selector, check membership in the returned set
- // so $("p:first").is("p:last") won't return true for a doc with two "p".
- rneedsContext.test( selector ) ?
- jQuery( selector, this.context ).index( this[0] ) >= 0 :
- jQuery.filter( selector, this ).length > 0 :
- this.filter( selector ).length > 0 );
- },
-
- closest: function( selectors, context ) {
- var cur,
- i = 0,
- l = this.length,
- ret = [],
- pos = rneedsContext.test( selectors ) || typeof selectors !== "string" ?
- jQuery( selectors, context || this.context ) :
- 0;
-
- for ( ; i < l; i++ ) {
- cur = this[i];
-
- while ( cur && cur.ownerDocument && cur !== context && cur.nodeType !== 11 ) {
- if ( pos ? pos.index(cur) > -1 : jQuery.find.matchesSelector(cur, selectors) ) {
- ret.push( cur );
- break;
- }
- cur = cur.parentNode;
- }
- }
-
- ret = ret.length > 1 ? jQuery.unique( ret ) : ret;
-
- return this.pushStack( ret, "closest", selectors );
- },
-
- // Determine the position of an element within
- // the matched set of elements
- index: function( elem ) {
-
- // No argument, return index in parent
- if ( !elem ) {
- return ( this[0] && this[0].parentNode ) ? this.prevAll().length : -1;
- }
-
- // index in selector
- if ( typeof elem === "string" ) {
- return jQuery.inArray( this[0], jQuery( elem ) );
- }
-
- // Locate the position of the desired element
- return jQuery.inArray(
- // If it receives a jQuery object, the first element is used
- elem.jquery ? elem[0] : elem, this );
- },
-
- add: function( selector, context ) {
- var set = typeof selector === "string" ?
- jQuery( selector, context ) :
- jQuery.makeArray( selector && selector.nodeType ? [ selector ] : selector ),
- all = jQuery.merge( this.get(), set );
-
- return this.pushStack( isDisconnected( set[0] ) || isDisconnected( all[0] ) ?
- all :
- jQuery.unique( all ) );
- },
-
- addBack: function( selector ) {
- return this.add( selector == null ?
- this.prevObject : this.prevObject.filter(selector)
- );
- }
-});
-
-jQuery.fn.andSelf = jQuery.fn.addBack;
-
-// A painfully simple check to see if an element is disconnected
-// from a document (should be improved, where feasible).
-function isDisconnected( node ) {
- return !node || !node.parentNode || node.parentNode.nodeType === 11;
-}
-
-function sibling( cur, dir ) {
- do {
- cur = cur[ dir ];
- } while ( cur && cur.nodeType !== 1 );
-
- return cur;
-}
-
-jQuery.each({
- parent: function( elem ) {
- var parent = elem.parentNode;
- return parent && parent.nodeType !== 11 ? parent : null;
- },
- parents: function( elem ) {
- return jQuery.dir( elem, "parentNode" );
- },
- parentsUntil: function( elem, i, until ) {
- return jQuery.dir( elem, "parentNode", until );
- },
- next: function( elem ) {
- return sibling( elem, "nextSibling" );
- },
- prev: function( elem ) {
- return sibling( elem, "previousSibling" );
- },
- nextAll: function( elem ) {
- return jQuery.dir( elem, "nextSibling" );
- },
- prevAll: function( elem ) {
- return jQuery.dir( elem, "previousSibling" );
- },
- nextUntil: function( elem, i, until ) {
- return jQuery.dir( elem, "nextSibling", until );
- },
- prevUntil: function( elem, i, until ) {
- return jQuery.dir( elem, "previousSibling", until );
- },
- siblings: function( elem ) {
- return jQuery.sibling( ( elem.parentNode || {} ).firstChild, elem );
- },
- children: function( elem ) {
- return jQuery.sibling( elem.firstChild );
- },
- contents: function( elem ) {
- return jQuery.nodeName( elem, "iframe" ) ?
- elem.contentDocument || elem.contentWindow.document :
- jQuery.merge( [], elem.childNodes );
- }
-}, function( name, fn ) {
- jQuery.fn[ name ] = function( until, selector ) {
- var ret = jQuery.map( this, fn, until );
-
- if ( !runtil.test( name ) ) {
- selector = until;
- }
-
- if ( selector && typeof selector === "string" ) {
- ret = jQuery.filter( selector, ret );
- }
-
- ret = this.length > 1 && !guaranteedUnique[ name ] ? jQuery.unique( ret ) : ret;
-
- if ( this.length > 1 && rparentsprev.test( name ) ) {
- ret = ret.reverse();
- }
-
- return this.pushStack( ret, name, core_slice.call( arguments ).join(",") );
- };
-});
-
-jQuery.extend({
- filter: function( expr, elems, not ) {
- if ( not ) {
- expr = ":not(" + expr + ")";
- }
-
- return elems.length === 1 ?
- jQuery.find.matchesSelector(elems[0], expr) ? [ elems[0] ] : [] :
- jQuery.find.matches(expr, elems);
- },
-
- dir: function( elem, dir, until ) {
- var matched = [],
- cur = elem[ dir ];
-
- while ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) {
- if ( cur.nodeType === 1 ) {
- matched.push( cur );
- }
- cur = cur[dir];
- }
- return matched;
- },
-
- sibling: function( n, elem ) {
- var r = [];
-
- for ( ; n; n = n.nextSibling ) {
- if ( n.nodeType === 1 && n !== elem ) {
- r.push( n );
- }
- }
-
- return r;
- }
-});
-
-// Implement the identical functionality for filter and not
-function winnow( elements, qualifier, keep ) {
-
- // Can't pass null or undefined to indexOf in Firefox 4
- // Set to 0 to skip string check
- qualifier = qualifier || 0;
-
- if ( jQuery.isFunction( qualifier ) ) {
- return jQuery.grep(elements, function( elem, i ) {
- var retVal = !!qualifier.call( elem, i, elem );
- return retVal === keep;
- });
-
- } else if ( qualifier.nodeType ) {
- return jQuery.grep(elements, function( elem, i ) {
- return ( elem === qualifier ) === keep;
- });
-
- } else if ( typeof qualifier === "string" ) {
- var filtered = jQuery.grep(elements, function( elem ) {
- return elem.nodeType === 1;
- });
-
- if ( isSimple.test( qualifier ) ) {
- return jQuery.filter(qualifier, filtered, !keep);
- } else {
- qualifier = jQuery.filter( qualifier, filtered );
- }
- }
-
- return jQuery.grep(elements, function( elem, i ) {
- return ( jQuery.inArray( elem, qualifier ) >= 0 ) === keep;
- });
-}
-function createSafeFragment( document ) {
- var list = nodeNames.split( "|" ),
- safeFrag = document.createDocumentFragment();
-
- if ( safeFrag.createElement ) {
- while ( list.length ) {
- safeFrag.createElement(
- list.pop()
- );
- }
- }
- return safeFrag;
-}
-
-var nodeNames = "abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|" +
- "header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",
- rinlinejQuery = / jQuery\d+="(?:null|\d+)"/g,
- rleadingWhitespace = /^\s+/,
- rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,
- rtagName = /<([\w:]+)/,
- rtbody = / ]", "i"),
- rcheckableType = /^(?:checkbox|radio)$/,
- // checked="checked" or checked
- rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
- rscriptType = /\/(java|ecma)script/i,
- rcleanScript = /^\s*\s*$/g,
- wrapMap = {
- option: [ 1, "", " " ],
- legend: [ 1, "", " " ],
- thead: [ 1, "" ],
- tr: [ 2, "" ],
- td: [ 3, "" ],
- col: [ 2, "" ],
- area: [ 1, "", " " ],
- _default: [ 0, "", "" ]
- },
- safeFragment = createSafeFragment( document ),
- fragmentDiv = safeFragment.appendChild( document.createElement("div") );
-
-wrapMap.optgroup = wrapMap.option;
-wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
-wrapMap.th = wrapMap.td;
-
-// IE6-8 can't serialize link, script, style, or any html5 (NoScope) tags,
-// unless wrapped in a div with non-breaking characters in front of it.
-if ( !jQuery.support.htmlSerialize ) {
- wrapMap._default = [ 1, "X", "
" ];
-}
-
-jQuery.fn.extend({
- text: function( value ) {
- return jQuery.access( this, function( value ) {
- return value === undefined ?
- jQuery.text( this ) :
- this.empty().append( ( this[0] && this[0].ownerDocument || document ).createTextNode( value ) );
- }, null, value, arguments.length );
- },
-
- wrapAll: function( html ) {
- if ( jQuery.isFunction( html ) ) {
- return this.each(function(i) {
- jQuery(this).wrapAll( html.call(this, i) );
- });
- }
-
- if ( this[0] ) {
- // The elements to wrap the target around
- var wrap = jQuery( html, this[0].ownerDocument ).eq(0).clone(true);
-
- if ( this[0].parentNode ) {
- wrap.insertBefore( this[0] );
- }
-
- wrap.map(function() {
- var elem = this;
-
- while ( elem.firstChild && elem.firstChild.nodeType === 1 ) {
- elem = elem.firstChild;
- }
-
- return elem;
- }).append( this );
- }
-
- return this;
- },
-
- wrapInner: function( html ) {
- if ( jQuery.isFunction( html ) ) {
- return this.each(function(i) {
- jQuery(this).wrapInner( html.call(this, i) );
- });
- }
-
- return this.each(function() {
- var self = jQuery( this ),
- contents = self.contents();
-
- if ( contents.length ) {
- contents.wrapAll( html );
-
- } else {
- self.append( html );
- }
- });
- },
-
- wrap: function( html ) {
- var isFunction = jQuery.isFunction( html );
-
- return this.each(function(i) {
- jQuery( this ).wrapAll( isFunction ? html.call(this, i) : html );
- });
- },
-
- unwrap: function() {
- return this.parent().each(function() {
- if ( !jQuery.nodeName( this, "body" ) ) {
- jQuery( this ).replaceWith( this.childNodes );
- }
- }).end();
- },
-
- append: function() {
- return this.domManip(arguments, true, function( elem ) {
- if ( this.nodeType === 1 || this.nodeType === 11 ) {
- this.appendChild( elem );
- }
- });
- },
-
- prepend: function() {
- return this.domManip(arguments, true, function( elem ) {
- if ( this.nodeType === 1 || this.nodeType === 11 ) {
- this.insertBefore( elem, this.firstChild );
- }
- });
- },
-
- before: function() {
- if ( !isDisconnected( this[0] ) ) {
- return this.domManip(arguments, false, function( elem ) {
- this.parentNode.insertBefore( elem, this );
- });
- }
-
- if ( arguments.length ) {
- var set = jQuery.clean( arguments );
- return this.pushStack( jQuery.merge( set, this ), "before", this.selector );
- }
- },
-
- after: function() {
- if ( !isDisconnected( this[0] ) ) {
- return this.domManip(arguments, false, function( elem ) {
- this.parentNode.insertBefore( elem, this.nextSibling );
- });
- }
-
- if ( arguments.length ) {
- var set = jQuery.clean( arguments );
- return this.pushStack( jQuery.merge( this, set ), "after", this.selector );
- }
- },
-
- // keepData is for internal use only--do not document
- remove: function( selector, keepData ) {
- var elem,
- i = 0;
-
- for ( ; (elem = this[i]) != null; i++ ) {
- if ( !selector || jQuery.filter( selector, [ elem ] ).length ) {
- if ( !keepData && elem.nodeType === 1 ) {
- jQuery.cleanData( elem.getElementsByTagName("*") );
- jQuery.cleanData( [ elem ] );
- }
-
- if ( elem.parentNode ) {
- elem.parentNode.removeChild( elem );
- }
- }
- }
-
- return this;
- },
-
- empty: function() {
- var elem,
- i = 0;
-
- for ( ; (elem = this[i]) != null; i++ ) {
- // Remove element nodes and prevent memory leaks
- if ( elem.nodeType === 1 ) {
- jQuery.cleanData( elem.getElementsByTagName("*") );
- }
-
- // Remove any remaining nodes
- while ( elem.firstChild ) {
- elem.removeChild( elem.firstChild );
- }
- }
-
- return this;
- },
-
- clone: function( dataAndEvents, deepDataAndEvents ) {
- dataAndEvents = dataAndEvents == null ? false : dataAndEvents;
- deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;
-
- return this.map( function () {
- return jQuery.clone( this, dataAndEvents, deepDataAndEvents );
- });
- },
-
- html: function( value ) {
- return jQuery.access( this, function( value ) {
- var elem = this[0] || {},
- i = 0,
- l = this.length;
-
- if ( value === undefined ) {
- return elem.nodeType === 1 ?
- elem.innerHTML.replace( rinlinejQuery, "" ) :
- undefined;
- }
-
- // See if we can take a shortcut and just use innerHTML
- if ( typeof value === "string" && !rnoInnerhtml.test( value ) &&
- ( jQuery.support.htmlSerialize || !rnoshimcache.test( value ) ) &&
- ( jQuery.support.leadingWhitespace || !rleadingWhitespace.test( value ) ) &&
- !wrapMap[ ( rtagName.exec( value ) || ["", ""] )[1].toLowerCase() ] ) {
-
- value = value.replace( rxhtmlTag, "<$1>$2>" );
-
- try {
- for (; i < l; i++ ) {
- // Remove element nodes and prevent memory leaks
- elem = this[i] || {};
- if ( elem.nodeType === 1 ) {
- jQuery.cleanData( elem.getElementsByTagName( "*" ) );
- elem.innerHTML = value;
- }
- }
-
- elem = 0;
-
- // If using innerHTML throws an exception, use the fallback method
- } catch(e) {}
- }
-
- if ( elem ) {
- this.empty().append( value );
- }
- }, null, value, arguments.length );
- },
-
- replaceWith: function( value ) {
- if ( !isDisconnected( this[0] ) ) {
- // Make sure that the elements are removed from the DOM before they are inserted
- // this can help fix replacing a parent with child elements
- if ( jQuery.isFunction( value ) ) {
- return this.each(function(i) {
- var self = jQuery(this), old = self.html();
- self.replaceWith( value.call( this, i, old ) );
- });
- }
-
- if ( typeof value !== "string" ) {
- value = jQuery( value ).detach();
- }
-
- return this.each(function() {
- var next = this.nextSibling,
- parent = this.parentNode;
-
- jQuery( this ).remove();
-
- if ( next ) {
- jQuery(next).before( value );
- } else {
- jQuery(parent).append( value );
- }
- });
- }
-
- return this.length ?
- this.pushStack( jQuery(jQuery.isFunction(value) ? value() : value), "replaceWith", value ) :
- this;
- },
-
- detach: function( selector ) {
- return this.remove( selector, true );
- },
-
- domManip: function( args, table, callback ) {
-
- // Flatten any nested arrays
- args = [].concat.apply( [], args );
-
- var results, first, fragment, iNoClone,
- i = 0,
- value = args[0],
- scripts = [],
- l = this.length;
-
- // We can't cloneNode fragments that contain checked, in WebKit
- if ( !jQuery.support.checkClone && l > 1 && typeof value === "string" && rchecked.test( value ) ) {
- return this.each(function() {
- jQuery(this).domManip( args, table, callback );
- });
- }
-
- if ( jQuery.isFunction(value) ) {
- return this.each(function(i) {
- var self = jQuery(this);
- args[0] = value.call( this, i, table ? self.html() : undefined );
- self.domManip( args, table, callback );
- });
- }
-
- if ( this[0] ) {
- results = jQuery.buildFragment( args, this, scripts );
- fragment = results.fragment;
- first = fragment.firstChild;
-
- if ( fragment.childNodes.length === 1 ) {
- fragment = first;
- }
-
- if ( first ) {
- table = table && jQuery.nodeName( first, "tr" );
-
- // Use the original fragment for the last item instead of the first because it can end up
- // being emptied incorrectly in certain situations (#8070).
- // Fragments from the fragment cache must always be cloned and never used in place.
- for ( iNoClone = results.cacheable || l - 1; i < l; i++ ) {
- callback.call(
- table && jQuery.nodeName( this[i], "table" ) ?
- findOrAppend( this[i], "tbody" ) :
- this[i],
- i === iNoClone ?
- fragment :
- jQuery.clone( fragment, true, true )
- );
- }
- }
-
- // Fix #11809: Avoid leaking memory
- fragment = first = null;
-
- if ( scripts.length ) {
- jQuery.each( scripts, function( i, elem ) {
- if ( elem.src ) {
- if ( jQuery.ajax ) {
- jQuery.ajax({
- url: elem.src,
- type: "GET",
- dataType: "script",
- async: false,
- global: false,
- "throws": true
- });
- } else {
- jQuery.error("no ajax");
- }
- } else {
- jQuery.globalEval( ( elem.text || elem.textContent || elem.innerHTML || "" ).replace( rcleanScript, "" ) );
- }
-
- if ( elem.parentNode ) {
- elem.parentNode.removeChild( elem );
- }
- });
- }
- }
-
- return this;
- }
-});
-
-function findOrAppend( elem, tag ) {
- return elem.getElementsByTagName( tag )[0] || elem.appendChild( elem.ownerDocument.createElement( tag ) );
-}
-
-function cloneCopyEvent( src, dest ) {
-
- if ( dest.nodeType !== 1 || !jQuery.hasData( src ) ) {
- return;
- }
-
- var type, i, l,
- oldData = jQuery._data( src ),
- curData = jQuery._data( dest, oldData ),
- events = oldData.events;
-
- if ( events ) {
- delete curData.handle;
- curData.events = {};
-
- for ( type in events ) {
- for ( i = 0, l = events[ type ].length; i < l; i++ ) {
- jQuery.event.add( dest, type, events[ type ][ i ] );
- }
- }
- }
-
- // make the cloned public data object a copy from the original
- if ( curData.data ) {
- curData.data = jQuery.extend( {}, curData.data );
- }
-}
-
-function cloneFixAttributes( src, dest ) {
- var nodeName;
-
- // We do not need to do anything for non-Elements
- if ( dest.nodeType !== 1 ) {
- return;
- }
-
- // clearAttributes removes the attributes, which we don't want,
- // but also removes the attachEvent events, which we *do* want
- if ( dest.clearAttributes ) {
- dest.clearAttributes();
- }
-
- // mergeAttributes, in contrast, only merges back on the
- // original attributes, not the events
- if ( dest.mergeAttributes ) {
- dest.mergeAttributes( src );
- }
-
- nodeName = dest.nodeName.toLowerCase();
-
- if ( nodeName === "object" ) {
- // IE6-10 improperly clones children of object elements using classid.
- // IE10 throws NoModificationAllowedError if parent is null, #12132.
- if ( dest.parentNode ) {
- dest.outerHTML = src.outerHTML;
- }
-
- // This path appears unavoidable for IE9. When cloning an object
- // element in IE9, the outerHTML strategy above is not sufficient.
- // If the src has innerHTML and the destination does not,
- // copy the src.innerHTML into the dest.innerHTML. #10324
- if ( jQuery.support.html5Clone && (src.innerHTML && !jQuery.trim(dest.innerHTML)) ) {
- dest.innerHTML = src.innerHTML;
- }
-
- } else if ( nodeName === "input" && rcheckableType.test( src.type ) ) {
- // IE6-8 fails to persist the checked state of a cloned checkbox
- // or radio button. Worse, IE6-7 fail to give the cloned element
- // a checked appearance if the defaultChecked value isn't also set
-
- dest.defaultChecked = dest.checked = src.checked;
-
- // IE6-7 get confused and end up setting the value of a cloned
- // checkbox/radio button to an empty string instead of "on"
- if ( dest.value !== src.value ) {
- dest.value = src.value;
- }
-
- // IE6-8 fails to return the selected option to the default selected
- // state when cloning options
- } else if ( nodeName === "option" ) {
- dest.selected = src.defaultSelected;
-
- // IE6-8 fails to set the defaultValue to the correct value when
- // cloning other types of input fields
- } else if ( nodeName === "input" || nodeName === "textarea" ) {
- dest.defaultValue = src.defaultValue;
-
- // IE blanks contents when cloning scripts
- } else if ( nodeName === "script" && dest.text !== src.text ) {
- dest.text = src.text;
- }
-
- // Event data gets referenced instead of copied if the expando
- // gets copied too
- dest.removeAttribute( jQuery.expando );
-}
-
-jQuery.buildFragment = function( args, context, scripts ) {
- var fragment, cacheable, cachehit,
- first = args[ 0 ];
-
- // Set context from what may come in as undefined or a jQuery collection or a node
- // Updated to fix #12266 where accessing context[0] could throw an exception in IE9/10 &
- // also doubles as fix for #8950 where plain objects caused createDocumentFragment exception
- context = context || document;
- context = !context.nodeType && context[0] || context;
- context = context.ownerDocument || context;
-
- // Only cache "small" (1/2 KB) HTML strings that are associated with the main document
- // Cloning options loses the selected state, so don't cache them
- // IE 6 doesn't like it when you put or elements in a fragment
- // Also, WebKit does not clone 'checked' attributes on cloneNode, so don't cache
- // Lastly, IE6,7,8 will not correctly reuse cached fragments that were created from unknown elems #10501
- if ( args.length === 1 && typeof first === "string" && first.length < 512 && context === document &&
- first.charAt(0) === "<" && !rnocache.test( first ) &&
- (jQuery.support.checkClone || !rchecked.test( first )) &&
- (jQuery.support.html5Clone || !rnoshimcache.test( first )) ) {
-
- // Mark cacheable and look for a hit
- cacheable = true;
- fragment = jQuery.fragments[ first ];
- cachehit = fragment !== undefined;
- }
-
- if ( !fragment ) {
- fragment = context.createDocumentFragment();
- jQuery.clean( args, context, fragment, scripts );
-
- // Update the cache, but only store false
- // unless this is a second parsing of the same content
- if ( cacheable ) {
- jQuery.fragments[ first ] = cachehit && fragment;
- }
- }
-
- return { fragment: fragment, cacheable: cacheable };
-};
-
-jQuery.fragments = {};
-
-jQuery.each({
- appendTo: "append",
- prependTo: "prepend",
- insertBefore: "before",
- insertAfter: "after",
- replaceAll: "replaceWith"
-}, function( name, original ) {
- jQuery.fn[ name ] = function( selector ) {
- var elems,
- i = 0,
- ret = [],
- insert = jQuery( selector ),
- l = insert.length,
- parent = this.length === 1 && this[0].parentNode;
-
- if ( (parent == null || parent && parent.nodeType === 11 && parent.childNodes.length === 1) && l === 1 ) {
- insert[ original ]( this[0] );
- return this;
- } else {
- for ( ; i < l; i++ ) {
- elems = ( i > 0 ? this.clone(true) : this ).get();
- jQuery( insert[i] )[ original ]( elems );
- ret = ret.concat( elems );
- }
-
- return this.pushStack( ret, name, insert.selector );
- }
- };
-});
-
-function getAll( elem ) {
- if ( typeof elem.getElementsByTagName !== "undefined" ) {
- return elem.getElementsByTagName( "*" );
-
- } else if ( typeof elem.querySelectorAll !== "undefined" ) {
- return elem.querySelectorAll( "*" );
-
- } else {
- return [];
- }
-}
-
-// Used in clean, fixes the defaultChecked property
-function fixDefaultChecked( elem ) {
- if ( rcheckableType.test( elem.type ) ) {
- elem.defaultChecked = elem.checked;
- }
-}
-
-jQuery.extend({
- clone: function( elem, dataAndEvents, deepDataAndEvents ) {
- var srcElements,
- destElements,
- i,
- clone;
-
- if ( jQuery.support.html5Clone || jQuery.isXMLDoc(elem) || !rnoshimcache.test( "<" + elem.nodeName + ">" ) ) {
- clone = elem.cloneNode( true );
-
- // IE<=8 does not properly clone detached, unknown element nodes
- } else {
- fragmentDiv.innerHTML = elem.outerHTML;
- fragmentDiv.removeChild( clone = fragmentDiv.firstChild );
- }
-
- if ( (!jQuery.support.noCloneEvent || !jQuery.support.noCloneChecked) &&
- (elem.nodeType === 1 || elem.nodeType === 11) && !jQuery.isXMLDoc(elem) ) {
- // IE copies events bound via attachEvent when using cloneNode.
- // Calling detachEvent on the clone will also remove the events
- // from the original. In order to get around this, we use some
- // proprietary methods to clear the events. Thanks to MooTools
- // guys for this hotness.
-
- cloneFixAttributes( elem, clone );
-
- // Using Sizzle here is crazy slow, so we use getElementsByTagName instead
- srcElements = getAll( elem );
- destElements = getAll( clone );
-
- // Weird iteration because IE will replace the length property
- // with an element if you are cloning the body and one of the
- // elements on the page has a name or id of "length"
- for ( i = 0; srcElements[i]; ++i ) {
- // Ensure that the destination node is not null; Fixes #9587
- if ( destElements[i] ) {
- cloneFixAttributes( srcElements[i], destElements[i] );
- }
- }
- }
-
- // Copy the events from the original to the clone
- if ( dataAndEvents ) {
- cloneCopyEvent( elem, clone );
-
- if ( deepDataAndEvents ) {
- srcElements = getAll( elem );
- destElements = getAll( clone );
-
- for ( i = 0; srcElements[i]; ++i ) {
- cloneCopyEvent( srcElements[i], destElements[i] );
- }
- }
- }
-
- srcElements = destElements = null;
-
- // Return the cloned set
- return clone;
- },
-
- clean: function( elems, context, fragment, scripts ) {
- var i, j, elem, tag, wrap, depth, div, hasBody, tbody, len, handleScript, jsTags,
- safe = context === document && safeFragment,
- ret = [];
-
- // Ensure that context is a document
- if ( !context || typeof context.createDocumentFragment === "undefined" ) {
- context = document;
- }
-
- // Use the already-created safe fragment if context permits
- for ( i = 0; (elem = elems[i]) != null; i++ ) {
- if ( typeof elem === "number" ) {
- elem += "";
- }
-
- if ( !elem ) {
- continue;
- }
-
- // Convert html string into DOM nodes
- if ( typeof elem === "string" ) {
- if ( !rhtml.test( elem ) ) {
- elem = context.createTextNode( elem );
- } else {
- // Ensure a safe container in which to render the html
- safe = safe || createSafeFragment( context );
- div = context.createElement("div");
- safe.appendChild( div );
-
- // Fix "XHTML"-style tags in all browsers
- elem = elem.replace(rxhtmlTag, "<$1>$2>");
-
- // Go to html and back, then peel off extra wrappers
- tag = ( rtagName.exec( elem ) || ["", ""] )[1].toLowerCase();
- wrap = wrapMap[ tag ] || wrapMap._default;
- depth = wrap[0];
- div.innerHTML = wrap[1] + elem + wrap[2];
-
- // Move to the right depth
- while ( depth-- ) {
- div = div.lastChild;
- }
-
- // Remove IE's autoinserted from table fragments
- if ( !jQuery.support.tbody ) {
-
- // String was a , *may* have spurious
- hasBody = rtbody.test(elem);
- tbody = tag === "table" && !hasBody ?
- div.firstChild && div.firstChild.childNodes :
-
- // String was a bare or
- wrap[1] === "" && !hasBody ?
- div.childNodes :
- [];
-
- for ( j = tbody.length - 1; j >= 0 ; --j ) {
- if ( jQuery.nodeName( tbody[ j ], "tbody" ) && !tbody[ j ].childNodes.length ) {
- tbody[ j ].parentNode.removeChild( tbody[ j ] );
- }
- }
- }
-
- // IE completely kills leading whitespace when innerHTML is used
- if ( !jQuery.support.leadingWhitespace && rleadingWhitespace.test( elem ) ) {
- div.insertBefore( context.createTextNode( rleadingWhitespace.exec(elem)[0] ), div.firstChild );
- }
-
- elem = div.childNodes;
-
- // Take out of fragment container (we need a fresh div each time)
- div.parentNode.removeChild( div );
- }
- }
-
- if ( elem.nodeType ) {
- ret.push( elem );
- } else {
- jQuery.merge( ret, elem );
- }
- }
-
- // Fix #11356: Clear elements from safeFragment
- if ( div ) {
- elem = div = safe = null;
- }
-
- // Reset defaultChecked for any radios and checkboxes
- // about to be appended to the DOM in IE 6/7 (#8060)
- if ( !jQuery.support.appendChecked ) {
- for ( i = 0; (elem = ret[i]) != null; i++ ) {
- if ( jQuery.nodeName( elem, "input" ) ) {
- fixDefaultChecked( elem );
- } else if ( typeof elem.getElementsByTagName !== "undefined" ) {
- jQuery.grep( elem.getElementsByTagName("input"), fixDefaultChecked );
- }
- }
- }
-
- // Append elements to a provided document fragment
- if ( fragment ) {
- // Special handling of each script element
- handleScript = function( elem ) {
- // Check if we consider it executable
- if ( !elem.type || rscriptType.test( elem.type ) ) {
- // Detach the script and store it in the scripts array (if provided) or the fragment
- // Return truthy to indicate that it has been handled
- return scripts ?
- scripts.push( elem.parentNode ? elem.parentNode.removeChild( elem ) : elem ) :
- fragment.appendChild( elem );
- }
- };
-
- for ( i = 0; (elem = ret[i]) != null; i++ ) {
- // Check if we're done after handling an executable script
- if ( !( jQuery.nodeName( elem, "script" ) && handleScript( elem ) ) ) {
- // Append to fragment and handle embedded scripts
- fragment.appendChild( elem );
- if ( typeof elem.getElementsByTagName !== "undefined" ) {
- // handleScript alters the DOM, so use jQuery.merge to ensure snapshot iteration
- jsTags = jQuery.grep( jQuery.merge( [], elem.getElementsByTagName("script") ), handleScript );
-
- // Splice the scripts into ret after their former ancestor and advance our index beyond them
- ret.splice.apply( ret, [i + 1, 0].concat( jsTags ) );
- i += jsTags.length;
- }
- }
- }
- }
-
- return ret;
- },
-
- cleanData: function( elems, /* internal */ acceptData ) {
- var data, id, elem, type,
- i = 0,
- internalKey = jQuery.expando,
- cache = jQuery.cache,
- deleteExpando = jQuery.support.deleteExpando,
- special = jQuery.event.special;
-
- for ( ; (elem = elems[i]) != null; i++ ) {
-
- if ( acceptData || jQuery.acceptData( elem ) ) {
-
- id = elem[ internalKey ];
- data = id && cache[ id ];
-
- if ( data ) {
- if ( data.events ) {
- for ( type in data.events ) {
- if ( special[ type ] ) {
- jQuery.event.remove( elem, type );
-
- // This is a shortcut to avoid jQuery.event.remove's overhead
- } else {
- jQuery.removeEvent( elem, type, data.handle );
- }
- }
- }
-
- // Remove cache only if it was not already removed by jQuery.event.remove
- if ( cache[ id ] ) {
-
- delete cache[ id ];
-
- // IE does not allow us to delete expando properties from nodes,
- // nor does it have a removeAttribute function on Document nodes;
- // we must handle all of these cases
- if ( deleteExpando ) {
- delete elem[ internalKey ];
-
- } else if ( elem.removeAttribute ) {
- elem.removeAttribute( internalKey );
-
- } else {
- elem[ internalKey ] = null;
- }
-
- jQuery.deletedIds.push( id );
- }
- }
- }
- }
- }
-});
-// Limit scope pollution from any deprecated API
-(function() {
-
-var matched, browser;
-
-// Use of jQuery.browser is frowned upon.
-// More details: http://api.jquery.com/jQuery.browser
-// jQuery.uaMatch maintained for back-compat
-jQuery.uaMatch = function( ua ) {
- ua = ua.toLowerCase();
-
- var match = /(chrome)[ \/]([\w.]+)/.exec( ua ) ||
- /(webkit)[ \/]([\w.]+)/.exec( ua ) ||
- /(opera)(?:.*version|)[ \/]([\w.]+)/.exec( ua ) ||
- /(msie) ([\w.]+)/.exec( ua ) ||
- ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec( ua ) ||
- [];
-
- return {
- browser: match[ 1 ] || "",
- version: match[ 2 ] || "0"
- };
-};
-
-matched = jQuery.uaMatch( navigator.userAgent );
-browser = {};
-
-if ( matched.browser ) {
- browser[ matched.browser ] = true;
- browser.version = matched.version;
-}
-
-// Chrome is Webkit, but Webkit is also Safari.
-if ( browser.chrome ) {
- browser.webkit = true;
-} else if ( browser.webkit ) {
- browser.safari = true;
-}
-
-jQuery.browser = browser;
-
-jQuery.sub = function() {
- function jQuerySub( selector, context ) {
- return new jQuerySub.fn.init( selector, context );
- }
- jQuery.extend( true, jQuerySub, this );
- jQuerySub.superclass = this;
- jQuerySub.fn = jQuerySub.prototype = this();
- jQuerySub.fn.constructor = jQuerySub;
- jQuerySub.sub = this.sub;
- jQuerySub.fn.init = function init( selector, context ) {
- if ( context && context instanceof jQuery && !(context instanceof jQuerySub) ) {
- context = jQuerySub( context );
- }
-
- return jQuery.fn.init.call( this, selector, context, rootjQuerySub );
- };
- jQuerySub.fn.init.prototype = jQuerySub.fn;
- var rootjQuerySub = jQuerySub(document);
- return jQuerySub;
-};
-
-})();
-var curCSS, iframe, iframeDoc,
- ralpha = /alpha\([^)]*\)/i,
- ropacity = /opacity=([^)]*)/,
- rposition = /^(top|right|bottom|left)$/,
- // swappable if display is none or starts with table except "table", "table-cell", or "table-caption"
- // see here for display values: https://developer.mozilla.org/en-US/docs/CSS/display
- rdisplayswap = /^(none|table(?!-c[ea]).+)/,
- rmargin = /^margin/,
- rnumsplit = new RegExp( "^(" + core_pnum + ")(.*)$", "i" ),
- rnumnonpx = new RegExp( "^(" + core_pnum + ")(?!px)[a-z%]+$", "i" ),
- rrelNum = new RegExp( "^([-+])=(" + core_pnum + ")", "i" ),
- elemdisplay = {},
-
- cssShow = { position: "absolute", visibility: "hidden", display: "block" },
- cssNormalTransform = {
- letterSpacing: 0,
- fontWeight: 400
- },
-
- cssExpand = [ "Top", "Right", "Bottom", "Left" ],
- cssPrefixes = [ "Webkit", "O", "Moz", "ms" ],
-
- eventsToggle = jQuery.fn.toggle;
-
-// return a css property mapped to a potentially vendor prefixed property
-function vendorPropName( style, name ) {
-
- // shortcut for names that are not vendor prefixed
- if ( name in style ) {
- return name;
- }
-
- // check for vendor prefixed names
- var capName = name.charAt(0).toUpperCase() + name.slice(1),
- origName = name,
- i = cssPrefixes.length;
-
- while ( i-- ) {
- name = cssPrefixes[ i ] + capName;
- if ( name in style ) {
- return name;
- }
- }
-
- return origName;
-}
-
-function isHidden( elem, el ) {
- elem = el || elem;
- return jQuery.css( elem, "display" ) === "none" || !jQuery.contains( elem.ownerDocument, elem );
-}
-
-function showHide( elements, show ) {
- var elem, display,
- values = [],
- index = 0,
- length = elements.length;
-
- for ( ; index < length; index++ ) {
- elem = elements[ index ];
- if ( !elem.style ) {
- continue;
- }
- values[ index ] = jQuery._data( elem, "olddisplay" );
- if ( show ) {
- // Reset the inline display of this element to learn if it is
- // being hidden by cascaded rules or not
- if ( !values[ index ] && elem.style.display === "none" ) {
- elem.style.display = "";
- }
-
- // Set elements which have been overridden with display: none
- // in a stylesheet to whatever the default browser style is
- // for such an element
- if ( elem.style.display === "" && isHidden( elem ) ) {
- values[ index ] = jQuery._data( elem, "olddisplay", css_defaultDisplay(elem.nodeName) );
- }
- } else {
- display = curCSS( elem, "display" );
-
- if ( !values[ index ] && display !== "none" ) {
- jQuery._data( elem, "olddisplay", display );
- }
- }
- }
-
- // Set the display of most of the elements in a second loop
- // to avoid the constant reflow
- for ( index = 0; index < length; index++ ) {
- elem = elements[ index ];
- if ( !elem.style ) {
- continue;
- }
- if ( !show || elem.style.display === "none" || elem.style.display === "" ) {
- elem.style.display = show ? values[ index ] || "" : "none";
- }
- }
-
- return elements;
-}
-
-jQuery.fn.extend({
- css: function( name, value ) {
- return jQuery.access( this, function( elem, name, value ) {
- return value !== undefined ?
- jQuery.style( elem, name, value ) :
- jQuery.css( elem, name );
- }, name, value, arguments.length > 1 );
- },
- show: function() {
- return showHide( this, true );
- },
- hide: function() {
- return showHide( this );
- },
- toggle: function( state, fn2 ) {
- var bool = typeof state === "boolean";
-
- if ( jQuery.isFunction( state ) && jQuery.isFunction( fn2 ) ) {
- return eventsToggle.apply( this, arguments );
- }
-
- return this.each(function() {
- if ( bool ? state : isHidden( this ) ) {
- jQuery( this ).show();
- } else {
- jQuery( this ).hide();
- }
- });
- }
-});
-
-jQuery.extend({
- // Add in style property hooks for overriding the default
- // behavior of getting and setting a style property
- cssHooks: {
- opacity: {
- get: function( elem, computed ) {
- if ( computed ) {
- // We should always get a number back from opacity
- var ret = curCSS( elem, "opacity" );
- return ret === "" ? "1" : ret;
-
- }
- }
- }
- },
-
- // Exclude the following css properties to add px
- cssNumber: {
- "fillOpacity": true,
- "fontWeight": true,
- "lineHeight": true,
- "opacity": true,
- "orphans": true,
- "widows": true,
- "zIndex": true,
- "zoom": true
- },
-
- // Add in properties whose names you wish to fix before
- // setting or getting the value
- cssProps: {
- // normalize float css property
- "float": jQuery.support.cssFloat ? "cssFloat" : "styleFloat"
- },
-
- // Get and set the style property on a DOM Node
- style: function( elem, name, value, extra ) {
- // Don't set styles on text and comment nodes
- if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {
- return;
- }
-
- // Make sure that we're working with the right name
- var ret, type, hooks,
- origName = jQuery.camelCase( name ),
- style = elem.style;
-
- name = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( style, origName ) );
-
- // gets hook for the prefixed version
- // followed by the unprefixed version
- hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
-
- // Check if we're setting a value
- if ( value !== undefined ) {
- type = typeof value;
-
- // convert relative number strings (+= or -=) to relative numbers. #7345
- if ( type === "string" && (ret = rrelNum.exec( value )) ) {
- value = ( ret[1] + 1 ) * ret[2] + parseFloat( jQuery.css( elem, name ) );
- // Fixes bug #9237
- type = "number";
- }
-
- // Make sure that NaN and null values aren't set. See: #7116
- if ( value == null || type === "number" && isNaN( value ) ) {
- return;
- }
-
- // If a number was passed in, add 'px' to the (except for certain CSS properties)
- if ( type === "number" && !jQuery.cssNumber[ origName ] ) {
- value += "px";
- }
-
- // If a hook was provided, use that value, otherwise just set the specified value
- if ( !hooks || !("set" in hooks) || (value = hooks.set( elem, value, extra )) !== undefined ) {
- // Wrapped to prevent IE from throwing errors when 'invalid' values are provided
- // Fixes bug #5509
- try {
- style[ name ] = value;
- } catch(e) {}
- }
-
- } else {
- // If a hook was provided get the non-computed value from there
- if ( hooks && "get" in hooks && (ret = hooks.get( elem, false, extra )) !== undefined ) {
- return ret;
- }
-
- // Otherwise just get the value from the style object
- return style[ name ];
- }
- },
-
- css: function( elem, name, numeric, extra ) {
- var val, num, hooks,
- origName = jQuery.camelCase( name );
-
- // Make sure that we're working with the right name
- name = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( elem.style, origName ) );
-
- // gets hook for the prefixed version
- // followed by the unprefixed version
- hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
-
- // If a hook was provided get the computed value from there
- if ( hooks && "get" in hooks ) {
- val = hooks.get( elem, true, extra );
- }
-
- // Otherwise, if a way to get the computed value exists, use that
- if ( val === undefined ) {
- val = curCSS( elem, name );
- }
-
- //convert "normal" to computed value
- if ( val === "normal" && name in cssNormalTransform ) {
- val = cssNormalTransform[ name ];
- }
-
- // Return, converting to number if forced or a qualifier was provided and val looks numeric
- if ( numeric || extra !== undefined ) {
- num = parseFloat( val );
- return numeric || jQuery.isNumeric( num ) ? num || 0 : val;
- }
- return val;
- },
-
- // A method for quickly swapping in/out CSS properties to get correct calculations
- swap: function( elem, options, callback ) {
- var ret, name,
- old = {};
-
- // Remember the old values, and insert the new ones
- for ( name in options ) {
- old[ name ] = elem.style[ name ];
- elem.style[ name ] = options[ name ];
- }
-
- ret = callback.call( elem );
-
- // Revert the old values
- for ( name in options ) {
- elem.style[ name ] = old[ name ];
- }
-
- return ret;
- }
-});
-
-// NOTE: To any future maintainer, we've window.getComputedStyle
-// because jsdom on node.js will break without it.
-if ( window.getComputedStyle ) {
- curCSS = function( elem, name ) {
- var ret, width, minWidth, maxWidth,
- computed = window.getComputedStyle( elem, null ),
- style = elem.style;
-
- if ( computed ) {
-
- ret = computed[ name ];
- if ( ret === "" && !jQuery.contains( elem.ownerDocument, elem ) ) {
- ret = jQuery.style( elem, name );
- }
-
- // A tribute to the "awesome hack by Dean Edwards"
- // Chrome < 17 and Safari 5.0 uses "computed value" instead of "used value" for margin-right
- // Safari 5.1.7 (at least) returns percentage for a larger set of values, but width seems to be reliably pixels
- // this is against the CSSOM draft spec: http://dev.w3.org/csswg/cssom/#resolved-values
- if ( rnumnonpx.test( ret ) && rmargin.test( name ) ) {
- width = style.width;
- minWidth = style.minWidth;
- maxWidth = style.maxWidth;
-
- style.minWidth = style.maxWidth = style.width = ret;
- ret = computed.width;
-
- style.width = width;
- style.minWidth = minWidth;
- style.maxWidth = maxWidth;
- }
- }
-
- return ret;
- };
-} else if ( document.documentElement.currentStyle ) {
- curCSS = function( elem, name ) {
- var left, rsLeft,
- ret = elem.currentStyle && elem.currentStyle[ name ],
- style = elem.style;
-
- // Avoid setting ret to empty string here
- // so we don't default to auto
- if ( ret == null && style && style[ name ] ) {
- ret = style[ name ];
- }
-
- // From the awesome hack by Dean Edwards
- // http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291
-
- // If we're not dealing with a regular pixel number
- // but a number that has a weird ending, we need to convert it to pixels
- // but not position css attributes, as those are proportional to the parent element instead
- // and we can't measure the parent instead because it might trigger a "stacking dolls" problem
- if ( rnumnonpx.test( ret ) && !rposition.test( name ) ) {
-
- // Remember the original values
- left = style.left;
- rsLeft = elem.runtimeStyle && elem.runtimeStyle.left;
-
- // Put in the new values to get a computed value out
- if ( rsLeft ) {
- elem.runtimeStyle.left = elem.currentStyle.left;
- }
- style.left = name === "fontSize" ? "1em" : ret;
- ret = style.pixelLeft + "px";
-
- // Revert the changed values
- style.left = left;
- if ( rsLeft ) {
- elem.runtimeStyle.left = rsLeft;
- }
- }
-
- return ret === "" ? "auto" : ret;
- };
-}
-
-function setPositiveNumber( elem, value, subtract ) {
- var matches = rnumsplit.exec( value );
- return matches ?
- Math.max( 0, matches[ 1 ] - ( subtract || 0 ) ) + ( matches[ 2 ] || "px" ) :
- value;
-}
-
-function augmentWidthOrHeight( elem, name, extra, isBorderBox ) {
- var i = extra === ( isBorderBox ? "border" : "content" ) ?
- // If we already have the right measurement, avoid augmentation
- 4 :
- // Otherwise initialize for horizontal or vertical properties
- name === "width" ? 1 : 0,
-
- val = 0;
-
- for ( ; i < 4; i += 2 ) {
- // both box models exclude margin, so add it if we want it
- if ( extra === "margin" ) {
- // we use jQuery.css instead of curCSS here
- // because of the reliableMarginRight CSS hook!
- val += jQuery.css( elem, extra + cssExpand[ i ], true );
- }
-
- // From this point on we use curCSS for maximum performance (relevant in animations)
- if ( isBorderBox ) {
- // border-box includes padding, so remove it if we want content
- if ( extra === "content" ) {
- val -= parseFloat( curCSS( elem, "padding" + cssExpand[ i ] ) ) || 0;
- }
-
- // at this point, extra isn't border nor margin, so remove border
- if ( extra !== "margin" ) {
- val -= parseFloat( curCSS( elem, "border" + cssExpand[ i ] + "Width" ) ) || 0;
- }
- } else {
- // at this point, extra isn't content, so add padding
- val += parseFloat( curCSS( elem, "padding" + cssExpand[ i ] ) ) || 0;
-
- // at this point, extra isn't content nor padding, so add border
- if ( extra !== "padding" ) {
- val += parseFloat( curCSS( elem, "border" + cssExpand[ i ] + "Width" ) ) || 0;
- }
- }
- }
-
- return val;
-}
-
-function getWidthOrHeight( elem, name, extra ) {
-
- // Start with offset property, which is equivalent to the border-box value
- var val = name === "width" ? elem.offsetWidth : elem.offsetHeight,
- valueIsBorderBox = true,
- isBorderBox = jQuery.support.boxSizing && jQuery.css( elem, "boxSizing" ) === "border-box";
-
- // some non-html elements return undefined for offsetWidth, so check for null/undefined
- // svg - https://bugzilla.mozilla.org/show_bug.cgi?id=649285
- // MathML - https://bugzilla.mozilla.org/show_bug.cgi?id=491668
- if ( val <= 0 || val == null ) {
- // Fall back to computed then uncomputed css if necessary
- val = curCSS( elem, name );
- if ( val < 0 || val == null ) {
- val = elem.style[ name ];
- }
-
- // Computed unit is not pixels. Stop here and return.
- if ( rnumnonpx.test(val) ) {
- return val;
- }
-
- // we need the check for style in case a browser which returns unreliable values
- // for getComputedStyle silently falls back to the reliable elem.style
- valueIsBorderBox = isBorderBox && ( jQuery.support.boxSizingReliable || val === elem.style[ name ] );
-
- // Normalize "", auto, and prepare for extra
- val = parseFloat( val ) || 0;
- }
-
- // use the active box-sizing model to add/subtract irrelevant styles
- return ( val +
- augmentWidthOrHeight(
- elem,
- name,
- extra || ( isBorderBox ? "border" : "content" ),
- valueIsBorderBox
- )
- ) + "px";
-}
-
-
-// Try to determine the default display value of an element
-function css_defaultDisplay( nodeName ) {
- if ( elemdisplay[ nodeName ] ) {
- return elemdisplay[ nodeName ];
- }
-
- var elem = jQuery( "<" + nodeName + ">" ).appendTo( document.body ),
- display = elem.css("display");
- elem.remove();
-
- // If the simple way fails,
- // get element's real default display by attaching it to a temp iframe
- if ( display === "none" || display === "" ) {
- // Use the already-created iframe if possible
- iframe = document.body.appendChild(
- iframe || jQuery.extend( document.createElement("iframe"), {
- frameBorder: 0,
- width: 0,
- height: 0
- })
- );
-
- // Create a cacheable copy of the iframe document on first call.
- // IE and Opera will allow us to reuse the iframeDoc without re-writing the fake HTML
- // document to it; WebKit & Firefox won't allow reusing the iframe document.
- if ( !iframeDoc || !iframe.createElement ) {
- iframeDoc = ( iframe.contentWindow || iframe.contentDocument ).document;
- iframeDoc.write("");
- iframeDoc.close();
- }
-
- elem = iframeDoc.body.appendChild( iframeDoc.createElement(nodeName) );
-
- display = curCSS( elem, "display" );
- document.body.removeChild( iframe );
- }
-
- // Store the correct default display
- elemdisplay[ nodeName ] = display;
-
- return display;
-}
-
-jQuery.each([ "height", "width" ], function( i, name ) {
- jQuery.cssHooks[ name ] = {
- get: function( elem, computed, extra ) {
- if ( computed ) {
- // certain elements can have dimension info if we invisibly show them
- // however, it must have a current display style that would benefit from this
- if ( elem.offsetWidth === 0 && rdisplayswap.test( curCSS( elem, "display" ) ) ) {
- return jQuery.swap( elem, cssShow, function() {
- return getWidthOrHeight( elem, name, extra );
- });
- } else {
- return getWidthOrHeight( elem, name, extra );
- }
- }
- },
-
- set: function( elem, value, extra ) {
- return setPositiveNumber( elem, value, extra ?
- augmentWidthOrHeight(
- elem,
- name,
- extra,
- jQuery.support.boxSizing && jQuery.css( elem, "boxSizing" ) === "border-box"
- ) : 0
- );
- }
- };
-});
-
-if ( !jQuery.support.opacity ) {
- jQuery.cssHooks.opacity = {
- get: function( elem, computed ) {
- // IE uses filters for opacity
- return ropacity.test( (computed && elem.currentStyle ? elem.currentStyle.filter : elem.style.filter) || "" ) ?
- ( 0.01 * parseFloat( RegExp.$1 ) ) + "" :
- computed ? "1" : "";
- },
-
- set: function( elem, value ) {
- var style = elem.style,
- currentStyle = elem.currentStyle,
- opacity = jQuery.isNumeric( value ) ? "alpha(opacity=" + value * 100 + ")" : "",
- filter = currentStyle && currentStyle.filter || style.filter || "";
-
- // IE has trouble with opacity if it does not have layout
- // Force it by setting the zoom level
- style.zoom = 1;
-
- // if setting opacity to 1, and no other filters exist - attempt to remove filter attribute #6652
- if ( value >= 1 && jQuery.trim( filter.replace( ralpha, "" ) ) === "" &&
- style.removeAttribute ) {
-
- // Setting style.filter to null, "" & " " still leave "filter:" in the cssText
- // if "filter:" is present at all, clearType is disabled, we want to avoid this
- // style.removeAttribute is IE Only, but so apparently is this code path...
- style.removeAttribute( "filter" );
-
- // if there there is no filter style applied in a css rule, we are done
- if ( currentStyle && !currentStyle.filter ) {
- return;
- }
- }
-
- // otherwise, set new filter values
- style.filter = ralpha.test( filter ) ?
- filter.replace( ralpha, opacity ) :
- filter + " " + opacity;
- }
- };
-}
-
-// These hooks cannot be added until DOM ready because the support test
-// for it is not run until after DOM ready
-jQuery(function() {
- if ( !jQuery.support.reliableMarginRight ) {
- jQuery.cssHooks.marginRight = {
- get: function( elem, computed ) {
- // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
- // Work around by temporarily setting element display to inline-block
- return jQuery.swap( elem, { "display": "inline-block" }, function() {
- if ( computed ) {
- return curCSS( elem, "marginRight" );
- }
- });
- }
- };
- }
-
- // Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084
- // getComputedStyle returns percent when specified for top/left/bottom/right
- // rather than make the css module depend on the offset module, we just check for it here
- if ( !jQuery.support.pixelPosition && jQuery.fn.position ) {
- jQuery.each( [ "top", "left" ], function( i, prop ) {
- jQuery.cssHooks[ prop ] = {
- get: function( elem, computed ) {
- if ( computed ) {
- var ret = curCSS( elem, prop );
- // if curCSS returns percentage, fallback to offset
- return rnumnonpx.test( ret ) ? jQuery( elem ).position()[ prop ] + "px" : ret;
- }
- }
- };
- });
- }
-
-});
-
-if ( jQuery.expr && jQuery.expr.filters ) {
- jQuery.expr.filters.hidden = function( elem ) {
- return ( elem.offsetWidth === 0 && elem.offsetHeight === 0 ) || (!jQuery.support.reliableHiddenOffsets && ((elem.style && elem.style.display) || curCSS( elem, "display" )) === "none");
- };
-
- jQuery.expr.filters.visible = function( elem ) {
- return !jQuery.expr.filters.hidden( elem );
- };
-}
-
-// These hooks are used by animate to expand properties
-jQuery.each({
- margin: "",
- padding: "",
- border: "Width"
-}, function( prefix, suffix ) {
- jQuery.cssHooks[ prefix + suffix ] = {
- expand: function( value ) {
- var i,
-
- // assumes a single number if not a string
- parts = typeof value === "string" ? value.split(" ") : [ value ],
- expanded = {};
-
- for ( i = 0; i < 4; i++ ) {
- expanded[ prefix + cssExpand[ i ] + suffix ] =
- parts[ i ] || parts[ i - 2 ] || parts[ 0 ];
- }
-
- return expanded;
- }
- };
-
- if ( !rmargin.test( prefix ) ) {
- jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;
- }
-});
-var r20 = /%20/g,
- rbracket = /\[\]$/,
- rCRLF = /\r?\n/g,
- rinput = /^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,
- rselectTextarea = /^(?:select|textarea)/i;
-
-jQuery.fn.extend({
- serialize: function() {
- return jQuery.param( this.serializeArray() );
- },
- serializeArray: function() {
- return this.map(function(){
- return this.elements ? jQuery.makeArray( this.elements ) : this;
- })
- .filter(function(){
- return this.name && !this.disabled &&
- ( this.checked || rselectTextarea.test( this.nodeName ) ||
- rinput.test( this.type ) );
- })
- .map(function( i, elem ){
- var val = jQuery( this ).val();
-
- return val == null ?
- null :
- jQuery.isArray( val ) ?
- jQuery.map( val, function( val, i ){
- return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
- }) :
- { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
- }).get();
- }
-});
-
-//Serialize an array of form elements or a set of
-//key/values into a query string
-jQuery.param = function( a, traditional ) {
- var prefix,
- s = [],
- add = function( key, value ) {
- // If value is a function, invoke it and return its value
- value = jQuery.isFunction( value ) ? value() : ( value == null ? "" : value );
- s[ s.length ] = encodeURIComponent( key ) + "=" + encodeURIComponent( value );
- };
-
- // Set traditional to true for jQuery <= 1.3.2 behavior.
- if ( traditional === undefined ) {
- traditional = jQuery.ajaxSettings && jQuery.ajaxSettings.traditional;
- }
-
- // If an array was passed in, assume that it is an array of form elements.
- if ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {
- // Serialize the form elements
- jQuery.each( a, function() {
- add( this.name, this.value );
- });
-
- } else {
- // If traditional, encode the "old" way (the way 1.3.2 or older
- // did it), otherwise encode params recursively.
- for ( prefix in a ) {
- buildParams( prefix, a[ prefix ], traditional, add );
- }
- }
-
- // Return the resulting serialization
- return s.join( "&" ).replace( r20, "+" );
-};
-
-function buildParams( prefix, obj, traditional, add ) {
- var name;
-
- if ( jQuery.isArray( obj ) ) {
- // Serialize array item.
- jQuery.each( obj, function( i, v ) {
- if ( traditional || rbracket.test( prefix ) ) {
- // Treat each array item as a scalar.
- add( prefix, v );
-
- } else {
- // If array item is non-scalar (array or object), encode its
- // numeric index to resolve deserialization ambiguity issues.
- // Note that rack (as of 1.0.0) can't currently deserialize
- // nested arrays properly, and attempting to do so may cause
- // a server error. Possible fixes are to modify rack's
- // deserialization algorithm or to provide an option or flag
- // to force array serialization to be shallow.
- buildParams( prefix + "[" + ( typeof v === "object" ? i : "" ) + "]", v, traditional, add );
- }
- });
-
- } else if ( !traditional && jQuery.type( obj ) === "object" ) {
- // Serialize object item.
- for ( name in obj ) {
- buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add );
- }
-
- } else {
- // Serialize scalar item.
- add( prefix, obj );
- }
-}
-var
- // Document location
- ajaxLocParts,
- ajaxLocation,
-
- rhash = /#.*$/,
- rheaders = /^(.*?):[ \t]*([^\r\n]*)\r?$/mg, // IE leaves an \r character at EOL
- // #7653, #8125, #8152: local protocol detection
- rlocalProtocol = /^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,
- rnoContent = /^(?:GET|HEAD)$/,
- rprotocol = /^\/\//,
- rquery = /\?/,
- rscript = /
-
-
-
- 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|file):/;
-
-
- /**
- * @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 factory 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);
- },
- NG_ATTR_BINDING = /^ngAttr[A-Z]/;
-
-
- return compile;
-
- //================================
-
- function compile($compileNodes, transcludeFn, maxPriority) {
- if (!($compileNodes instanceof jqLite)) {
- // jquery always rewraps, whereas 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, ngAttrName, value, nAttrs = node.attributes,
- j = 0, jj = nAttrs && nAttrs.length; j < jj; j++) {
- attr = nAttrs[j];
- if (attr.specified) {
- name = attr.name;
- // support ngAttr attribute binding
- ngAttrName = directiveNormalize(name);
- if (NG_ATTR_BINDING.test(ngAttrName)) {
- name = ngAttrName.substr(6).toLowerCase();
- }
- 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 are 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 {JQLite} jqCollection If we are working on the root of the compile tree then this
- * argument has the root jqLite array so that we can replace nodes on it.
- * @returns linkFn
- */
- function applyDirectivesToNode(directives, compileNode, templateAttrs, transcludeFn, jqCollection) {
- 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(jqCollection, jqLite($template[0]), compileNode);
- childTranscludeFn = compile($template, transcludeFn, terminalPriority);
- } else {
- $template = jqLite(JQLiteClone(compileNode)).contents();
- $compileNode.html(''); // clear contents
- childTranscludeFn = compile($template, transcludeFn);
- }
- }
-
- if (directive.template) {
- assertNoDuplicate('template', templateDirective, directive, $compileNode);
- templateDirective = directive;
-
- directiveValue = (isFunction(directive.template))
- ? directive.template($compileNode, templateAttrs)
- : directive.template;
-
- 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(jqCollection, $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, jqCollection, 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[3] || scopeName,
- optional = (match[2] == '?'),
- 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;
- if( attrs[attrName] ) {
- // If the attribute has been provided then we trigger an interpolation to ensure the value is there for use in the link fn
- scope[scopeName] = $interpolate(attrs[attrName])(parentScope);
- }
- break;
- }
-
- case '=': {
- if (optional && !attrs[attrName]) {
- return;
- }
- 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
- }),
- templateUrl = (isFunction(origAsyncDirective.templateUrl))
- ? origAsyncDirective.templateUrl($compileNode, tAttrs)
- : origAsyncDirective.templateUrl;
-
- $compileNode.html('');
-
- $http.get(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[0].childNodes, childTranscludeFn);
-
-
- while(linkQueue.length) {
- var scope = linkQueue.shift(),
- beforeTemplateLinkNode = linkQueue.shift(),
- linkRootElement = linkQueue.shift(),
- controller = linkQueue.shift(),
- 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 = {}));
-
- // we need to interpolate again, in case the attribute value has been updated
- // (e.g. by another directive's compile function)
- interpolateFn = $interpolate(attr[name], true);
-
- // if attribute was updated so that there is no interpolation going on we don't want to
- // register any observers
- if (!interpolateFn) return;
-
- attr[name] = interpolateFn(scope);
- ($$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. The value can be an interpolated string.
- */
-
-
-
-/**
- * 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 = {},
- CNTRL_REG = /^(\S+)(\s+as\s+(\w+))?$/;
-
-
- /**
- * @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 a 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(expression, locals) {
- var instance, match, constructor, identifier;
-
- if(isString(expression)) {
- match = expression.match(CNTRL_REG),
- constructor = match[1],
- identifier = match[3];
- expression = controllers.hasOwnProperty(constructor)
- ? controllers[constructor]
- : getter(locals.$scope, constructor, true) || getter($window, constructor, true);
-
- assertArgFn(expression, constructor, true);
- }
-
- instance = $injector.instantiate(expression, locals);
-
- if (identifier) {
- if (typeof locals.$scope !== 'object') {
- throw new Error('Can not export controller as "' + identifier + '". ' +
- 'No scope object provided!');
- }
-
- locals.$scope[identifier] = instance;
- }
-
- return instance;
- };
- }];
-}
-
-/**
- * @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', '$exceptionHandler', function($parse, $exceptionHandler) {
- 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) {
- try {
- for(var i = 0, ii = length, part; i=} 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;
- }
-};
-
-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 user
- * - 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,
- LocationMode,
- baseHref = $browser.baseHref(),
- initialUrl = $browser.url(),
- appBase;
-
- if (html5Mode) {
- appBase = baseHref ? serverBase(initialUrl) + baseHref : initialUrl;
- LocationMode = $sniffer.history ? LocationHtml5Url : LocationHashbangInHtml5Url;
- } else {
- appBase = stripHash(initialUrl);
- LocationMode = LocationHashbangUrl;
- }
- $location = new LocationMode(appBase, '#' + hashPrefix);
- $location.$$parse($location.$$rewrite(initialUrl));
-
- $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');
- var rewrittenUrl = $location.$$rewrite(absHref);
-
- if (absHref && !elm.attr('target') && rewrittenUrl && !event.isDefaultPrevented()) {
- event.preventDefault();
- if (rewrittenUrl != $browser.url()) {
- // update location manually
- $location.$$parse(rewrittenUrl);
- $rootScope.$apply();
- // 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() != initialUrl) {
- $browser.url($location.absUrl(), true);
- }
-
- // update $location when $browser url changes
- $browser.onUrlChange(function(newUrl) {
- if ($location.absUrl() != newUrl) {
- if ($rootScope.$broadcast('$locationChangeStart', newUrl, $location.absUrl()).defaultPrevented) {
- $browser.url($location.absUrl());
- return;
- }
- $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:
-
-
log
-
warn
-
info
-
error
-
-
-
- */
-
-/**
- * @ngdoc object
- * @name ng.$logProvider
- * @description
- * Use the `$logProvider` to configure how the application logs messages
- */
-function $LogProvider(){
- var debug = true,
- self = this;
-
- /**
- * @ngdoc property
- * @name ng.$logProvider#debugEnabled
- * @methodOf ng.$logProvider
- * @description
- * @param {string=} flag enable or disable debug level messages
- * @returns {*} current value if used as getter or itself (chaining) if used as setter
- */
- this.debugEnabled = function(flag) {
- if (isDefined(flag)) {
- debug = flag;
- return this;
- } else {
- return debug;
- }
- };
-
- 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'),
-
- /**
- * @ngdoc method
- * @name ng.$log#debug
- * @methodOf ng.$log
- *
- * @description
- * Write a debug message
- */
- debug: (function () {
- var fn = consoleLog('debug');
-
- return function() {
- if (debug) {
- fn.apply(self, arguments);
- }
- }
- }())
- };
-
- 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)==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(),
- ch3 = ch2 + peek(2),
- fn = OPERATORS[ch],
- fn2 = OPERATORS[ch2],
- fn3 = OPERATORS[ch3];
- if (fn3) {
- tokens.push({index:index, text:ch3, fn:fn3});
- index += 3;
- } else 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(i) {
- var num = i || 1;
- return index + num < text.length ? text.charAt(index + num) : 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, ch;
-
- while (index < text.length) {
- 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) {
- 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]);
- }
- value.literal = !!value.literal;
- value.constant = !!value.constant;
- 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 extend(function(self, locals) {
- return fn(self, locals, right);
- }, {
- constant:right.constant
- });
- }
-
- function ternaryFn(left, middle, right){
- return extend(function(self, locals){
- return left(self, locals) ? middle(self, locals) : right(self, locals);
- }, {
- constant: left.constant && middle.constant && right.constant
- });
- }
-
- function binaryFn(left, fn, right) {
- return extend(function(self, locals) {
- return fn(self, locals, left, right);
- }, {
- constant:left.constant && right.constant
- });
- }
-
- 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 = ternary();
- 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 = ternary();
- return function(scope, locals){
- return left.assign(scope, right(scope, locals), locals);
- };
- } else {
- return left;
- }
- }
-
- function ternary() {
- var left = logicalOR();
- var middle;
- var token;
- if((token = expect('?'))){
- middle = ternary();
- if((token = expect(':'))){
- return ternaryFn(left, middle, ternary());
- }
- else {
- throwError('expected :', token);
- }
- }
- 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);
- }
- if (token.json) {
- primary.constant = primary.literal = true;
- }
- }
-
- 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(scope, locals, self) {
- return getter(self || object(scope, locals), locals);
- },
- {
- assign:function(scope, value, locals) {
- return setter(object(scope, 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(scope, locals){
- var args = [],
- context = contextGetter ? contextGetter(scope, locals) : scope;
-
- for ( var i = 0; i < argsFn.length; i++) {
- args.push(argsFn[i](scope, locals));
- }
- var fnPtr = fn(scope, locals, context) || 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 = [];
- var allConstant = true;
- if (peekToken().text != ']') {
- do {
- var elementFn = expression();
- elementFns.push(elementFn);
- if (!elementFn.constant) {
- allConstant = false;
- }
- } while (expect(','));
- }
- consume(']');
- return extend(function(self, locals){
- var array = [];
- for ( var i = 0; i < elementFns.length; i++) {
- array.push(elementFns[i](self, locals));
- }
- return array;
- }, {
- literal:true,
- constant:allConstant
- });
- }
-
- function object () {
- var keyValues = [];
- var allConstant = true;
- if (peekToken().text != '}') {
- do {
- var token = expect(),
- key = token.string || token.text;
- consume(":");
- var value = expression();
- keyValues.push({key:key, value:value});
- if (!value.constant) {
- allConstant = false;
- }
- } while (expect(','));
- }
- consume('}');
- return extend(function(self, locals){
- var object = {};
- for ( var i = 0; i < keyValues.length; i++) {
- var keyValue = keyValues[i];
- object[keyValue.key] = keyValue.value(self, locals);
- }
- return object;
- }, {
- literal:true,
- constant:allConstant
- });
- }
-}
-
-//////////////////////////////////////////////////
-// 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 accessible 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 accessible 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('user.name');
- * var setter = getter.assign;
- * var context = {user:{name:'angular'}};
- * var locals = {user:{name:'local'}};
- *
- * expect(getter(context)).toEqual('angular');
- * setter(context, 'newValue');
- * expect(context.user.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 (typically a scope object).
- * * `locals` – `{object=}` – local variables context object, useful for overriding values in
- * `context`.
- *
- * The returned function also has the following properties:
- * * `literal` – `{boolean}` – whether the expression's top-level node is a JavaScript
- * literal.
- * * `constant` – `{boolean}` – whether the expression is made entirely of JavaScript
- * constant literals.
- * * `assign` – `{?function(context, value)}` – if the expression is assignable, this will be
- * set to a function to change its value on the given context.
- *
- */
-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 event 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`.
- *
- * - `always(callback)` – allows you to observe either the fulfillment or rejection of a promise,
- * but to do so without modifying the final value. This is useful to release resources or do some
- * clean-up that needs to be done whether the promise was rejected or resolved. See the [full
- * specification](https://github.com/kriskowal/q/wiki/API-Reference#promisefinallycallback) for
- * more information.
- *
- * # 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 than $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;
- },
- always: function(callback) {
-
- function makePromise(value, resolved) {
- var result = defer();
- if (resolved) {
- result.resolve(value);
- } else {
- result.reject(value);
- }
- return result.promise;
- }
-
- function handleCallback(value, isResolved) {
- var callbackOutput = null;
- try {
- callbackOutput = (callback ||defaultCallback)();
- } catch(e) {
- return makePromise(e, false);
- }
- if (callbackOutput && callbackOutput.then) {
- return callbackOutput.then(function() {
- return makePromise(value, isResolved);
- }, function(error) {
- return makePromise(error, false);
- });
- } else {
- return makePromise(value, isResolved);
- }
- }
-
- return this.then(function(value) {
- return handleCallback(value, true);
- }, function(error) {
- return handleCallback(error, false);
- });
- }
- }
- };
-
- 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 promise of the passed value or promise
- */
- 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.|Object.} promises An array or hash of promises.
- * @returns {Promise} Returns a single promise that will be resolved with an array/hash of values,
- * each value corresponding to the promise at the same index/key in the `promises` array/hash. 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 = 0,
- results = isArray(promises) ? [] : {};
-
- forEach(promises, function(promise, key) {
- counter++;
- ref(promise).then(function(value) {
- if (results.hasOwnProperty(key)) return;
- results[key] = value;
- if (!(--counter)) deferred.resolve(results);
- }, function(reason) {
- if (results.hasOwnProperty(key)) return;
- deferred.reject(reason);
- });
- });
-
- if (counter === 0) {
- 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.
- * * `path` can contain named groups starting with a star (`*name`). All characters are
- * eagerly stored in `$routeParams` under the given `name` when the route matches.
- *
- * For example, routes like `/color/:color/largecode/*largecode/edit` will match
- * `/color/brown/largecode/code/with/slashs/edit` and extract:
- *
- * * `color: brown`
- * * `largecode: code/with/slashs`.
- *
- *
- * @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.
- * - `controllerAs` – `{string=}` – A controller alias name. If present the controller will be
- * published to scope under the `controllerAs` name.
- * - `template` – `{string=|function()=}` – html template as a string or function that returns
- * an html template as a string which should be used by {@link ng.directive:ngView ngView} or
- * {@link ng.directive:ngInclude ngInclude} directives.
- * This property takes precedence over `templateUrl`.
- *
- * If `template` is a function, it will be called with the following parameters:
- *
- * - `{Array.}` - route parameters extracted from the current
- * `$location.path()` by applying the current route
- *
- * - `templateUrl` – `{string=|function()=}` – path or function that returns a path to an html
- * template that should be used by {@link ng.directive:ngView ngView}.
- *
- * If `templateUrl` is a function, it will be called with the following parameters:
- *
- * - `{Array.}` - route parameters extracted from the current
- * `$location.path()` by applying the current route
- *
- * - `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` event 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` event is broadcasted on the root scope.
- *
- * - `[caseInsensitiveMatch=false]` - {boolean=} - match routes without being case sensitive
- *
- * If the option is set to `true`, then the particular route can be matched without being
- * case sensitive
- *
- * @returns {Object} self
- *
- * @description
- * Adds a new route definition to the `$route` service.
- */
- this.when = function(path, route) {
- routes[path] = extend({reloadOnSearch: true, caseInsensitiveMatch: false}, 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 event
- * @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 event
- * @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 {Object} angularEvent Synthetic event object.
- * @param {Route} current Current route information.
- * @param {Route|Undefined} previous Previous route information, or undefined if current is first route entered.
- */
-
- /**
- * @ngdoc event
- * @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 event
- * @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
- * @param whenProperties {Object} properties to define when's matching behavior
- * @return {?Object}
- */
- function switchRouteMatcher(on, when, whenProperties) {
- // 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);
- switch(paramMatch[1]) {
- case ':':
- regex += '([^\\/]*)';
- break;
- case '*':
- regex += '(.*)';
- break;
- }
- params.push(paramMatch[2]);
- lastMatchedIndex = re.lastIndex;
- }
- // Append trailing path part.
- regex += when.substr(lastMatchedIndex);
-
- var match = on.match(new RegExp(regex, whenProperties.caseInsensitiveMatch ? 'i' : ''));
- 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 locals = extend({}, next.resolve),
- template;
-
- forEach(locals, function(value, key) {
- locals[key] = isString(value) ? $injector.get(value) : $injector.invoke(value);
- });
-
- if (isDefined(template = next.template)) {
- if (isFunction(template)) {
- template = template(next.params);
- }
- } else if (isDefined(template = next.templateUrl)) {
- if (isFunction(template)) {
- template = template(next.params);
- }
- if (isDefined(template)) {
- next.loadedTemplateUrl = template;
- template = $http.get(template, {cache: $templateCache}).
- then(function(response) { return response.data; });
- }
- }
- if (isDefined(template)) {
- locals['$template'] = template;
- }
- return $q.all(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, route))) {
- 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 parameters
- */
- 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 are 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 in terms of speed as well as memory:
- * - No closures, instead use 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 beginning (shift) instead of at the end (push)
- *
- * Child scopes are created and removed often
- * - Using an array would be slow since inserts in middle 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 iterations 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
- * event 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.
- *
- *
- *
- *
- * # 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.$$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 user 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 (typeof watchExp == 'string' && get.constant) {
- var originalFn = watcher.fn;
- watcher.fn = function(newVal, oldVal, scope) {
- originalFn.call(this, newVal, oldVal, scope);
- arrayRemove(array, watcher);
- };
- }
-
- 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#$watchCollection
- * @methodOf ng.$rootScope.Scope
- * @function
- *
- * @description
- * Shallow watches the properties of an object and fires whenever any of the properties change
- * (for arrays this implies watching the array items, for object maps this implies watching the properties).
- * If a change is detected the `listener` callback is fired.
- *
- * - The `obj` collection is observed via standard $watch operation and is examined on every call to $digest() to
- * see if any items have been added, removed, or moved.
- * - The `listener` is called whenever anything within the `obj` has changed. Examples include adding new items
- * into the object or array, removing and moving items around.
- *
- *
- * # Example
- *
- $scope.names = ['igor', 'matias', 'misko', 'james'];
- $scope.dataCount = 4;
-
- $scope.$watchCollection('names', function(newNames, oldNames) {
- $scope.dataCount = newNames.length;
- });
-
- expect($scope.dataCount).toEqual(4);
- $scope.$digest();
-
- //still at 4 ... no changes
- expect($scope.dataCount).toEqual(4);
-
- $scope.names.pop();
- $scope.$digest();
-
- //now there's been a change
- expect($scope.dataCount).toEqual(3);
- *
- *
- *
- * @param {string|Function(scope)} obj Evaluated as {@link guide/expression expression}. The expression value
- * should evaluate to an object or an array which is observed on each
- * {@link ng.$rootScope.Scope#$digest $digest} cycle. Any shallow change within the collection will trigger
- * a call to the `listener`.
- *
- * @param {function(newCollection, oldCollection, scope)} listener a callback function that is fired with both
- * the `newCollection` and `oldCollection` as parameters.
- * The `newCollection` object is the newly modified data obtained from the `obj` expression and the
- * `oldCollection` object is a copy of the former collection data.
- * The `scope` refers to the current scope.
- *
- * @returns {function()} Returns a de-registration function for this listener. When the de-registration function is executed
- * then the internal watch operation is terminated.
- */
- $watchCollection: function(obj, listener) {
- var self = this;
- var oldValue;
- var newValue;
- var changeDetected = 0;
- var objGetter = $parse(obj);
- var internalArray = [];
- var internalObject = {};
- var oldLength = 0;
-
- function $watchCollectionWatch() {
- newValue = objGetter(self);
- var newLength, key;
-
- if (!isObject(newValue)) {
- if (oldValue !== newValue) {
- oldValue = newValue;
- changeDetected++;
- }
- } else if (isArrayLike(newValue)) {
- if (oldValue !== internalArray) {
- // we are transitioning from something which was not an array into array.
- oldValue = internalArray;
- oldLength = oldValue.length = 0;
- changeDetected++;
- }
-
- newLength = newValue.length;
-
- if (oldLength !== newLength) {
- // if lengths do not match we need to trigger change notification
- changeDetected++;
- oldValue.length = oldLength = newLength;
- }
- // copy the items to oldValue and look for changes.
- for (var i = 0; i < newLength; i++) {
- if (oldValue[i] !== newValue[i]) {
- changeDetected++;
- oldValue[i] = newValue[i];
- }
- }
- } else {
- if (oldValue !== internalObject) {
- // we are transitioning from something which was not an object into object.
- oldValue = internalObject = {};
- oldLength = 0;
- changeDetected++;
- }
- // copy the items to oldValue and look for changes.
- newLength = 0;
- for (key in newValue) {
- if (newValue.hasOwnProperty(key)) {
- newLength++;
- if (oldValue.hasOwnProperty(key)) {
- if (oldValue[key] !== newValue[key]) {
- changeDetected++;
- oldValue[key] = newValue[key];
- }
- } else {
- oldLength++;
- oldValue[key] = newValue[key];
- changeDetected++;
- }
- }
- }
- if (oldLength > newLength) {
- // we used to have more keys, need to find them and destroy them.
- changeDetected++;
- for(key in oldValue) {
- if (oldValue.hasOwnProperty(key) && !newValue.hasOwnProperty(key)) {
- oldLength--;
- delete oldValue[key];
- }
- }
- }
- }
- return changeDetected;
- }
-
- function $watchCollectionAction() {
- listener(newValue, oldValue, self);
- }
-
- return this.$watch($watchCollectionWatch, $watchCollectionAction);
- },
-
- /**
- * @ngdoc function
- * @name ng.$rootScope.Scope#$digest
- * @methodOf ng.$rootScope.Scope
- * @function
- *
- * @description
- * Processes 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 = this.$$asyncQueue,
- length,
- dirty, ttl = TTL,
- next, current, target = this,
- watchLog = [],
- logIdx, logMsg;
-
- beginPhase('$digest');
-
- do { // "while dirty" loop
- dirty = false;
- current = target;
-
- while(asyncQueue.length) {
- try {
- current.$eval(asyncQueue.shift());
- } catch (e) {
- $exceptionHandler(e);
- }
- }
-
- do { // "traverse the scopes" loop
- 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 event
- * @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` event is broadcasted on this scope.
- * Application code can register a `$destroy` event 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
- * event life cycle.
- *
- * The event listener function format is: `function(event, args...)`. The `event` object
- * passed into the listener has the following attributes:
- *
- * - `targetScope` - `{Scope}`: the scope on which the event was `$emit`-ed or `$broadcast`-ed.
- * - `currentScope` - `{Scope}`: the current scope which is handling the event.
- * - `name` - `{string}`: Name of the event.
- * - `stopPropagation` - `{function=}`: calling `stopPropagation` function will cancel further event
- * 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 event 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 event `name` upwards through the scope hierarchy notifying the
- * registered {@link ng.$rootScope.Scope#$on} listeners.
- *
- * The event life cycle starts at the scope on which `$emit` was called. All
- * {@link ng.$rootScope.Scope#$on listeners} listening for `name` event on this scope get notified.
- * Afterwards, the event traverses upwards toward the root scope and calls all registered
- * listeners along the way. The event will stop propagating if one of the listeners cancels it.
- *
- * Any exception emitted 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 event 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' event it's so fubared that we rather pretend that it doesn't have
- // it. In particular the event 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 = document.createElement('div');
- eventSupport[event] = 'on' + event in divElm;
- }
-
- return eventSupport[event];
- },
- csp: document.securityPolicy ? document.securityPolicy.isActive : false,
- vendorPrefix: vendorPrefix,
- transitions : transitions,
- animations : animations
- };
- }];
-}
-
-/**
- * @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 overridden, removed or mocked for testing.
- *
- * All expressions are evaluated with respect to current scope so they don't
- * suffer from window globality.
- *
- * @example
-
-
-
-
-
- ALERT
-
-
-
- it('should display the greeting in the input box', function() {
- input('greeting').enter('Hello, E2E Tests');
- // If we click the button it will block the test runner
- // element(':button').click();
- });
-
-
- */
-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;
-}
-
-
-var IS_SAME_DOMAIN_URL_MATCH = /^(([^:]+):)?\/\/(\w+:{0,1}\w*@)?([\w\.-]*)?(:([0-9]+))?(.*)$/;
-
-
-/**
- * Parse a request and location URL and determine whether this is a same-domain request.
- *
- * @param {string} requestUrl The url of the request.
- * @param {string} locationUrl The current browser location url.
- * @returns {boolean} Whether the request is for the same domain.
- */
-function isSameDomain(requestUrl, locationUrl) {
- var match = IS_SAME_DOMAIN_URL_MATCH.exec(requestUrl);
- // if requestUrl is relative, the regex does not match.
- if (match == null) return true;
-
- var domain1 = {
- protocol: match[2],
- host: match[4],
- port: int(match[6]) || DEFAULT_PORTS[match[2]] || null,
- // IE8 sets unmatched groups to '' instead of undefined.
- relativeProtocol: match[2] === undefined || match[2] === ''
- };
-
- match = SERVER_MATCH.exec(locationUrl);
- var domain2 = {
- protocol: match[1],
- host: match[3],
- port: int(match[5]) || DEFAULT_PORTS[match[1]] || null
- };
-
- return (domain1.protocol == domain2.protocol || domain1.relativeProtocol) &&
- domain1.host == domain2.host &&
- (domain1.port == domain2.port || (domain1.relativeProtocol &&
- domain2.port == DEFAULT_PORTS[domain2.protocol]));
-}
-
-
-/**
- * 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/,
- CONTENT_TYPE_APPLICATION_JSON = {'Content-Type': 'application/json;charset=utf-8'};
-
- var defaults = 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, */*'
- },
- post: CONTENT_TYPE_APPLICATION_JSON,
- put: CONTENT_TYPE_APPLICATION_JSON,
- patch: CONTENT_TYPE_APPLICATION_JSON
- },
-
- xsrfCookieName: 'XSRF-TOKEN',
- xsrfHeaderName: 'X-XSRF-TOKEN'
- };
-
- /**
- * Are order by request. I.E. they are applied in the same order as
- * array on request, but revers order on response.
- */
- var interceptorFactories = this.interceptors = [];
- /**
- * For historical reasons, response interceptors ordered by the order in which
- * they are applied to response. (This is in revers to interceptorFactories)
- */
- var responseInterceptorFactories = this.responseInterceptors = [];
-
- this.$get = ['$httpBackend', '$browser', '$cacheFactory', '$rootScope', '$q', '$injector',
- function($httpBackend, $browser, $cacheFactory, $rootScope, $q, $injector) {
-
- var defaultCache = $cacheFactory('$http');
-
- /**
- * Interceptors stored in reverse order. Inner interceptors before outer interceptors.
- * The reversal is needed so that we can build up the interception chain around the
- * server request.
- */
- var reversedInterceptors = [];
-
- forEach(interceptorFactories, function(interceptorFactory) {
- reversedInterceptors.unshift(isString(interceptorFactory)
- ? $injector.get(interceptorFactory) : $injector.invoke(interceptorFactory));
- });
-
- forEach(responseInterceptorFactories, function(interceptorFactory, index) {
- var responseFn = isString(interceptorFactory)
- ? $injector.get(interceptorFactory)
- : $injector.invoke(interceptorFactory);
-
- /**
- * Response interceptors go before "around" interceptors (no real reason, just
- * had to pick one.) But they are already revesed, so we can't use unshift, hence
- * the splice.
- */
- reversedInterceptors.splice(index, 0, {
- response: function(response) {
- return responseFn($q.when(response));
- },
- responseError: function(response) {
- return responseFn($q.reject(response));
- }
- });
- });
-
-
- /**
- * @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 the 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 patterns this doesn't matter much, for advanced usage
- * it is important to familiarize yourself with these APIs and the 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`, 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 between 200 and 299 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 invocations of the $http service require passing in an HTTP method and URL, and
- * POST/PUT requests require request data to be provided as well, shortcut methods
- * were created:
- *
- *
- * $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, * / *`
- * - `$httpProvider.defaults.headers.post`: (header defaults for POST requests)
- * - `Content-Type: application/json`
- * - `$httpProvider.defaults.headers.put` (header defaults for PUT requests)
- * - `Content-Type: application/json`
- *
- * To add or overwrite these defaults, simply add or remove a property from these configuration
- * objects. To add headers for an HTTP method other than POST or PUT, simply add a new object
- * with the lowercased HTTP method name as the key, e.g.
- * `$httpProvider.defaults.headers.get['My-Header']='value'`.
- *
- * Additionally, the defaults can be set at runtime via the `$http.defaults` object in the same
- * fashion.
- *
- *
- * # 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 configuration 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 globally augment or override the default transforms, modify the `$httpProvider.defaults.transformRequest` and
- * `$httpProvider.defaults.transformResponse` properties. These properties are by default an
- * array of transform functions, which allows you to `push` or `unshift` a new transformation function into the
- * transformation chain. You can also decide to completely override any default transformations by assigning your
- * transformation functions to these properties directly without the array wrapper.
- *
- * Similarly, to locally override the request/response transforms, augment the `transformRequest` and/or
- * `transformResponse` properties of the configuration object passed into `$http`.
- *
- *
- * # 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 from the first request.
- *
- * A custom default cache built with $cacheFactory can be provided in $http.defaults.cache.
- * To skip it, set configuration property `cache` to `false`.
- *
- *
- * # 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 pre-processing of request or postprocessing of responses, it is desirable to be
- * able to intercept requests before they are handed to the server and
- * responses before they are handed over to the application code that
- * initiated these requests. The interceptors leverage the {@link ng.$q
- * promise APIs} to fulfill this need for both synchronous and asynchronous pre-processing.
- *
- * The interceptors are service factories that are registered with the `$httpProvider` by
- * adding them to the `$httpProvider.interceptors` array. The factory is called and
- * injected with dependencies (if specified) and returns the interceptor.
- *
- * There are two kinds of interceptors (and two kinds of rejection interceptors):
- *
- * * `request`: interceptors get called with http `config` object. The function is free to modify
- * the `config` or create a new one. The function needs to return the `config` directly or as a
- * promise.
- * * `requestError`: interceptor gets called when a previous interceptor threw an error or resolved
- * with a rejection.
- * * `response`: interceptors get called with http `response` object. The function is free to modify
- * the `response` or create a new one. The function needs to return the `response` directly or as a
- * promise.
- * * `responseError`: interceptor gets called when a previous interceptor threw an error or resolved
- * with a rejection.
- *
- *
- *
- * // register the interceptor as a service
- * $provide.factory('myHttpInterceptor', function($q, dependency1, dependency2) {
- * return {
- * // optional method
- * 'request': function(config) {
- * // do something on success
- * return config || $q.when(config);
- * },
- *
- * // optional method
- * 'requestError': function(rejection) {
- * // do something on error
- * if (canRecover(rejection)) {
- * return responseOrNewPromise
- * }
- * return $q.reject(rejection);
- * },
- *
- *
- *
- * // optional method
- * 'response': function(response) {
- * // do something on success
- * return response || $q.when(response);
- * },
- *
- * // optional method
- * 'responseError': function(rejection) {
- * // do something on error
- * if (canRecover(rejection)) {
- * return responseOrNewPromise
- * }
- * return $q.reject(rejection);
- * };
- * }
- * });
- *
- * $httpProvider.interceptors.push('myHttpInterceptor');
- *
- *
- * // register the interceptor via an anonymous factory
- * $httpProvider.interceptors.push(function($q, dependency1, dependency2) {
- * return {
- * 'request': function(config) {
- * // same as above
- * },
- * 'response': function(response) {
- * // same as above
- * }
- * });
- *
- *
- * # Response interceptors (DEPRECATED)
- *
- * 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 website to turn your JSON resource URL into
- * {@link http://en.wikipedia.org/wiki/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 user's private data. Angular provides a mechanism
- * to counter XSRF. When performing XHR requests, the $http service reads a token from a cookie
- * (by default, `XSRF-TOKEN`) and sets it as an 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. The header will not be set for
- * cross-domain requests.
- *
- * To take advantage of this, your server needs to set a token in a JavaScript readable session
- * cookie called `XSRF-TOKEN` on the first HTTP GET request. On subsequent XHR 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 sent the request. The token must be
- * unique for each user and must be verifiable by the server (to prevent the JavaScript from making
- * up its own tokens). We recommend that the token is a digest of your site's authentication
- * cookie with a {@link https://en.wikipedia.org/wiki/Salt_(cryptography) salt} for added security.
- *
- * The name of the headers can be specified using the xsrfHeaderName and xsrfCookieName
- * properties of either $httpProvider.defaults, or the per-request config object.
- *
- *
- * @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.
- * - **xsrfHeaderName** – `{string}` – Name of HTTP header to populate with the XSRF token.
- * - **xsrfCookieName** – `{string}` – Name of cookie containing the XSRF token.
- * - **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|Promise}` – timeout in milliseconds, or {@link ng.$q promise}
- * that should abort the request when resolved.
- * - **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.
- * - **responseType** - `{string}` - see {@link
- * https://developer.mozilla.org/en-US/docs/DOM/XMLHttpRequest#responseType requestType}.
- *
- * @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
-
-
-
-
- GET
- JSONP
-
-
-
fetch
-
Sample GET
-
Sample JSONP
-
Invalid JSONP
-
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(requestConfig) {
- var config = {
- transformRequest: defaults.transformRequest,
- transformResponse: defaults.transformResponse
- };
- var headers = {};
-
- extend(config, requestConfig);
- config.headers = headers;
- config.method = uppercase(config.method);
-
- extend(headers,
- defaults.headers.common,
- defaults.headers[lowercase(config.method)],
- requestConfig.headers);
-
- var xsrfValue = isSameDomain(config.url, $browser.url())
- ? $browser.cookies()[config.xsrfCookieName || defaults.xsrfCookieName]
- : undefined;
- if (xsrfValue) {
- headers[(config.xsrfHeaderName || defaults.xsrfHeaderName)] = xsrfValue;
- }
-
-
- var serverRequest = function(config) {
- var reqData = transformData(config.data, headersGetter(headers), config.transformRequest);
-
- // strip content-type if data is undefined
- if (isUndefined(config.data)) {
- delete headers['Content-Type'];
- }
-
- if (isUndefined(config.withCredentials) && !isUndefined(defaults.withCredentials)) {
- config.withCredentials = defaults.withCredentials;
- }
-
- // send request
- return sendReq(config, reqData, headers).then(transformResponse, transformResponse);
- };
-
- var chain = [serverRequest, undefined];
- var promise = $q.when(config);
-
- // apply interceptors
- forEach(reversedInterceptors, function(interceptor) {
- if (interceptor.request || interceptor.requestError) {
- chain.unshift(interceptor.request, interceptor.requestError);
- }
- if (interceptor.response || interceptor.responseError) {
- chain.push(interceptor.response, interceptor.responseError);
- }
- });
-
- while(chain.length) {
- var thenFn = chain.shift();
- var rejectFn = chain.shift();
-
- promise = promise.then(thenFn, rejectFn);
- }
-
- 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, config.transformResponse)
- });
- 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, withCredentials as well as request and response transformations.
- *
- * See "Setting HTTP Headers" and "Transforming Requests and Responses" sections above.
- */
- $http.defaults = defaults;
-
-
- 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, defaults, $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 || defaults.cache) && config.cache !== false && config.method == 'GET') {
- cache = isObject(config.cache) ? config.cache
- : isObject(defaults.cache) ? defaults.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, config.responseType);
- }
-
- 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);
- if (!$rootScope.$$phase) $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 (!isArray(value)) value = [value];
-
- forEach(value, function(v) {
- if (isObject(v)) {
- v = toJson(v);
- }
- parts.push(encodeUriQuery(key) + '=' +
- encodeUriQuery(v));
- });
- });
- 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, responseType) {
- var status;
- $browser.$$incOutstandingRequestCount();
- url = url || $browser.url();
-
- if (lowercase(method) == 'jsonp') {
- var callbackId = '_' + (callbacks.counter++).toString(36);
- callbacks[callbackId] = function(data) {
- callbacks[callbackId].data = data;
- };
-
- var jsonpDone = jsonpReq(url.replace('JSON_CALLBACK', 'angular.callbacks.' + callbackId),
- function() {
- if (callbacks[callbackId].data) {
- completeRequest(callback, 200, callbacks[callbackId].data);
- } else {
- completeRequest(callback, status || -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);
- });
-
- // 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.
-
- // responseText is the old-school way of retrieving response (supported by IE8 & 9)
- // response and responseType properties were introduced in XHR Level2 spec (supported by IE10)
- completeRequest(callback,
- status || xhr.status,
- (xhr.responseType ? xhr.response : xhr.responseText),
- responseHeaders);
- }
- };
-
- if (withCredentials) {
- xhr.withCredentials = true;
- }
-
- if (responseType) {
- xhr.responseType = responseType;
- }
-
- xhr.send(post || '');
- }
-
- if (timeout > 0) {
- var timeoutId = $browserDefer(timeoutRequest, timeout);
- } else if (timeout && timeout.then) {
- timeout.then(timeoutRequest);
- }
-
-
- function timeoutRequest() {
- status = -1;
- jsonpDone && jsonpDone();
- xhr && xhr.abort();
- }
-
- function completeRequest(callback, status, response, headersString) {
- // URL_MATCH is defined in src/service/location.js
- var protocol = (url.match(SERVER_MATCH) || ['', locationProtocol])[1];
-
- // cancel timeout and subsequent timeout promise resolution
- timeoutId && $browserDefer.cancel(timeoutId);
- jsonpDone = xhr = null;
-
- // 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);
- return doneWrapper;
- }
-}
-
-/**
- * @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 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, whose 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 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 user.
- *
- * The general syntax in templates is as follows:
- *
- * {{ expression [| filter_name[:parameter_value] ... ] }}
- *
- * @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.
- *
- * @param {function(expected, actual)|true|undefined} comparator Comparator which is used in
- * determining if the expected value (from the filter expression) and actual value (from
- * the object in the array) should be considered a match.
- *
- * Can be one of:
- *
- * - `function(expected, actual)`:
- * The function will be given the object value and the predicate value to compare and
- * should return true if the item should be included in filtered result.
- *
- * - `true`: A shorthand for `function(expected, actual) { return angular.equals(expected, actual)}`.
- * this is essentially strict comparison of expected and actual.
- *
- * - `false|undefined`: A short hand for a function which will look for a substring match in case
- * insensitive way.
- *
- * @example
-
-
-
-
- Search:
-
- Name Phone
-
- {{friend.name}}
- {{friend.phone}}
-
-
-
- Any:
- Name only
- Phone only
- Equality
-
- Name Phone
-
- {{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', 'Juliette']);
- });
- it('should use a equal comparison when comparator is true', function() {
- input('search.name').enter('Julie');
- input('strict').check();
- expect(repeater('#searchObjResults tr', 'friend in friends').column('friend.name')).
- toEqual(['Julie']);
- });
-
-
- */
-function filterFilter() {
- return function(array, expression, comperator) {
- 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;
- };
- switch(typeof comperator) {
- case "function":
- break;
- case "boolean":
- if(comperator == true) {
- comperator = function(obj, text) {
- return angular.equals(obj, text);
- }
- break;
- }
- default:
- comperator = function(obj, text) {
- text = (''+text).toLowerCase();
- return (''+obj).toLowerCase().indexOf(text) > -1
- };
- }
- var search = function(obj, text){
- if (typeof text == 'string' && text.charAt(0) === '!') {
- return !search(obj, text.substr(1));
- }
- switch (typeof obj) {
- case "boolean":
- case "number":
- case "string":
- return comperator(obj, text);
- case "object":
- switch (typeof text) {
- case "object":
- return comperator(obj, text);
- break;
- default:
- for ( var objKey in obj) {
- if (objKey.charAt(0) !== '$' && search(obj[objKey], text)) {
- return true;
- }
- }
- break;
- }
- 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() {
- if (!expression[key]) return;
- var path = key
- predicates.push(function(value) {
- return search(value, expression[path]);
- });
- })();
- } else {
- (function() {
- if (!expression[key]) return;
- var path = key;
- predicates.push(function(value) {
- return search(getter(value,path), expression[path]);
- });
- })();
- }
- }
- 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) {
- offset = offset || 0;
- 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(Math[zone > 0 ? 'floor' : 'ceil'](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),
- // while ISO 8601 requires fractions to be prefixed with `.` or `,`
- // we can be just safely rely on using `sss` since we currently don't support single or two digit fractions
- sss: dateGetter('Milliseconds', 3),
- 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)
- * * `'.sss' or ',sss'`: Millisecond in second, padded (000-999)
- * * `'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 its
- * 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))?)?$/;
- // 1 2 3 4 5 6 7 8 9 10 11
- function jsonStringToDate(string) {
- var match;
- if (match = string.match(R_ISO8601_STR)) {
- var date = new Date(0),
- tzHour = 0,
- tzMin = 0,
- dateSetter = match[8] ? date.setUTCFullYear : date.setFullYear,
- timeSetter = match[8] ? date.setUTCHours : date.setHours;
-
- if (match[9]) {
- tzHour = int(match[9] + match[10]);
- tzMin = int(match[9] + match[11]);
- }
- dateSetter.call(date, int(match[1]), int(match[2]) - 1, int(match[3]));
- var h = int(match[4]||0) - tzHour;
- var m = int(match[5]||0) - tzMin
- var s = int(match[6]||0);
- var ms = Math.round(parseFloat('0.' + (match[7]||0)) * 1000);
- timeSetter.call(date, h, m, s, ms);
- 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 or string containing only a specified number of elements. The elements
- * are taken from either the beginning or the end of the source array or string, 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|string} input Source array or string to be limited.
- * @param {string|number} limit The length of the returned array or string. If the `limit` number
- * is positive, `limit` number of items from the beginning of the source array/string are copied.
- * If the number is negative, `limit` number of items from the end of the source array/string
- * are copied. The `limit` will be trimmed if it exceeds `array.length`
- * @returns {Array|string} A new sub-array or substring of length `limit` or less if input array
- * had less than `limit` elements.
- *
- * @example
-
-
-
-
- Limit {{numbers}} to:
-
Output numbers: {{ numbers | limitTo:numLimit }}
- Limit {{letters}} to:
-
Output letters: {{ letters | limitTo:letterLimit }}
-
-
-
- it('should limit the number array to first three items', function() {
- expect(element('.doc-example-live input[ng-model=numLimit]').val()).toBe('3');
- expect(element('.doc-example-live input[ng-model=letterLimit]').val()).toBe('3');
- expect(binding('numbers | limitTo:numLimit')).toEqual('[1,2,3]');
- expect(binding('letters | limitTo:letterLimit')).toEqual('abc');
- });
-
- it('should update the output when -3 is entered', function() {
- input('numLimit').enter(-3);
- input('letterLimit').enter(-3);
- expect(binding('numbers | limitTo:numLimit')).toEqual('[7,8,9]');
- expect(binding('letters | limitTo:letterLimit')).toEqual('ghi');
- });
-
- it('should not exceed the maximum size of input array', function() {
- input('numLimit').enter(100);
- input('letterLimit').enter(100);
- expect(binding('numbers | limitTo:numLimit')).toEqual('[1,2,3,4,5,6,7,8,9]');
- expect(binding('letters | limitTo:letterLimit')).toEqual('abcdefghi');
- });
-
-
- */
-function limitToFilter(){
- return function(input, limit) {
- if (!isArray(input) && !isString(input)) return input;
-
- limit = int(limit);
-
- if (isString(input)) {
- //NaN check on limit
- if (limit) {
- return limit >= 0 ? input.slice(0, limit) : input.slice(limit, input.length);
- } else {
- return "";
- }
- }
-
- var out = [],
- i, n;
-
- // if abs(limit) exceeds maximum length, trim it
- if (limit > input.length)
- limit = input.length;
- else if (limit < -input.length)
- limit = -input.length;
-
- if (limit > 0) {
- i = 0;
- n = limit;
- } else {
- i = input.length + limit;
- n = input.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 ]
-
-
-
-
- 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 user 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 user 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:ngSrcset
- * @restrict A
- *
- * @description
- * Using Angular markup like `{{hash}}` in a `srcset` 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 `ngSrcset` directive solves this problem.
- *
- * The buggy way to write it:
- *
- *
- *
- *
- * The correct way to write it:
- *
- *
- *
- *
- * @element IMG
- * @param {template} ngSrcset 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:
- *
- *
- * Disabled
- *
- *
- *
- * 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:
- Button
-
-
- 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:
-
- Misko
- Igor
- Vojta
- Di
-
-
-
- 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:
-
- Hello!
- Greetings!
-
-
-
- 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.
- */
-
-/**
- * @ngdoc directive
- * @name ng.directive:ngOpen
- * @restrict A
- *
- * @description
- * The HTML specs do not require browsers to preserve the special attributes such as open.
- * (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 `ngOpen` directive.
- *
- * @example
-
-
- Check me check multiple:
-
- Show/Hide me
-
-
-
- it('should toggle open', function() {
- expect(element('#details').prop('open')).toBeFalsy();
- input('open').check();
- expect(element('#details').prop('open')).toBeTruthy();
- });
-
-
- *
- * @element DETAILS
- * @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-srcset, ng-href are interpolated
-forEach(['src', 'srcset', '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,
- $setPristine: noop
-};
-
-/**
- * @ngdoc object
- * @name ng.directive:form.FormController
- *
- * @property {boolean} $pristine True if user has not interacted with the form yet.
- * @property {boolean} $dirty True if user 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 = {},
- controls = [];
-
- // 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) {
- controls.push(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);
- });
-
- arrayRemove(controls, 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 function
- * @name ng.directive:form.FormController#$setPristine
- * @methodOf ng.directive:form.FormController
- *
- * @description
- * Sets the form to its pristine state.
- *
- * This method can be called to remove the 'ng-dirty' class and set the form to its pristine
- * state (ng-pristine class). This method will also propagate to all the controls contained
- * in this form.
- *
- * Setting a form back to a pristine state is often useful when we want to 'reuse' a form after
- * saving or resetting it.
- */
- form.$setPristine = function () {
- element.removeClass(DIRTY_CLASS).addClass(PRISTINE_CLASS);
- form.$dirty = false;
- form.$pristine = true;
- forEach(controls, function(control) {
- control.$setPristine();
- });
- };
-}
-
-
-/**
- * @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 `