From c1c474ae8c076d7ade053ef38cfd82a902536c70 Mon Sep 17 00:00:00 2001 From: Peter Dave Hello Date: Fri, 7 Mar 2014 01:23:44 +0800 Subject: [PATCH] add Ink v2.3.1 --- ajax/libs/ink/2.3.1/css/ink-ie7-min.css | 1739 ++ ajax/libs/ink/2.3.1/css/ink-ie7.css | 1739 ++ ajax/libs/ink/2.3.1/css/ink-min.css | 1115 + ajax/libs/ink/2.3.1/css/ink-min.css.map | 1 + ajax/libs/ink/2.3.1/css/ink.css | 9531 ++++++ ajax/libs/ink/2.3.1/css/ink.css.map | 1 + ajax/libs/ink/2.3.1/font/FontAwesome.otf | Bin 0 -> 61896 bytes .../ink/2.3.1/font/fontawesome-webfont.eot | Bin 0 -> 37405 bytes .../ink/2.3.1/font/fontawesome-webfont.svg | 399 + .../ink/2.3.1/font/fontawesome-webfont.ttf | Bin 0 -> 79076 bytes .../ink/2.3.1/font/fontawesome-webfont.woff | Bin 0 -> 43572 bytes ajax/libs/ink/2.3.1/font/ubuntu-b-webfont.eot | Bin 0 -> 22373 bytes ajax/libs/ink/2.3.1/font/ubuntu-b-webfont.svg | 245 + ajax/libs/ink/2.3.1/font/ubuntu-b-webfont.ttf | Bin 0 -> 47568 bytes .../libs/ink/2.3.1/font/ubuntu-b-webfont.woff | Bin 0 -> 25968 bytes .../libs/ink/2.3.1/font/ubuntu-bi-webfont.eot | Bin 0 -> 25337 bytes .../libs/ink/2.3.1/font/ubuntu-bi-webfont.svg | 245 + .../libs/ink/2.3.1/font/ubuntu-bi-webfont.ttf | Bin 0 -> 55024 bytes .../ink/2.3.1/font/ubuntu-bi-webfont.woff | Bin 0 -> 29080 bytes ajax/libs/ink/2.3.1/font/ubuntu-c-webfont.eot | Bin 0 -> 23249 bytes ajax/libs/ink/2.3.1/font/ubuntu-c-webfont.svg | 245 + ajax/libs/ink/2.3.1/font/ubuntu-c-webfont.ttf | Bin 0 -> 50724 bytes .../libs/ink/2.3.1/font/ubuntu-c-webfont.woff | Bin 0 -> 26828 bytes ajax/libs/ink/2.3.1/font/ubuntu-l-webfont.eot | Bin 0 -> 23125 bytes ajax/libs/ink/2.3.1/font/ubuntu-l-webfont.svg | 245 + ajax/libs/ink/2.3.1/font/ubuntu-l-webfont.ttf | Bin 0 -> 49492 bytes .../libs/ink/2.3.1/font/ubuntu-l-webfont.woff | Bin 0 -> 26620 bytes .../libs/ink/2.3.1/font/ubuntu-li-webfont.eot | Bin 0 -> 26696 bytes .../libs/ink/2.3.1/font/ubuntu-li-webfont.svg | 245 + .../libs/ink/2.3.1/font/ubuntu-li-webfont.ttf | Bin 0 -> 58980 bytes .../ink/2.3.1/font/ubuntu-li-webfont.woff | Bin 0 -> 30404 bytes ajax/libs/ink/2.3.1/font/ubuntu-m-webfont.eot | Bin 0 -> 22814 bytes ajax/libs/ink/2.3.1/font/ubuntu-m-webfont.svg | 245 + ajax/libs/ink/2.3.1/font/ubuntu-m-webfont.ttf | Bin 0 -> 47248 bytes .../libs/ink/2.3.1/font/ubuntu-m-webfont.woff | Bin 0 -> 26376 bytes .../libs/ink/2.3.1/font/ubuntu-mi-webfont.eot | Bin 0 -> 25736 bytes .../libs/ink/2.3.1/font/ubuntu-mi-webfont.svg | 245 + .../libs/ink/2.3.1/font/ubuntu-mi-webfont.ttf | Bin 0 -> 55960 bytes .../ink/2.3.1/font/ubuntu-mi-webfont.woff | Bin 0 -> 29340 bytes ajax/libs/ink/2.3.1/font/ubuntu-r-webfont.eot | Bin 0 -> 23130 bytes ajax/libs/ink/2.3.1/font/ubuntu-r-webfont.svg | 245 + ajax/libs/ink/2.3.1/font/ubuntu-r-webfont.ttf | Bin 0 -> 48952 bytes .../libs/ink/2.3.1/font/ubuntu-r-webfont.woff | Bin 0 -> 26688 bytes .../libs/ink/2.3.1/font/ubuntu-ri-webfont.eot | Bin 0 -> 26250 bytes .../libs/ink/2.3.1/font/ubuntu-ri-webfont.svg | 245 + .../libs/ink/2.3.1/font/ubuntu-ri-webfont.ttf | Bin 0 -> 58816 bytes .../ink/2.3.1/font/ubuntu-ri-webfont.woff | Bin 0 -> 30008 bytes .../ink/2.3.1/font/ubuntumono-b-webfont.eot | Bin 0 -> 22822 bytes .../ink/2.3.1/font/ubuntumono-b-webfont.svg | 242 + .../ink/2.3.1/font/ubuntumono-b-webfont.ttf | Bin 0 -> 47848 bytes .../ink/2.3.1/font/ubuntumono-b-webfont.woff | Bin 0 -> 26220 bytes .../ink/2.3.1/font/ubuntumono-bi-webfont.eot | Bin 0 -> 24919 bytes .../ink/2.3.1/font/ubuntumono-bi-webfont.svg | 242 + .../ink/2.3.1/font/ubuntumono-bi-webfont.ttf | Bin 0 -> 52880 bytes .../ink/2.3.1/font/ubuntumono-bi-webfont.woff | Bin 0 -> 28264 bytes .../ink/2.3.1/font/ubuntumono-r-webfont.eot | Bin 0 -> 22522 bytes .../ink/2.3.1/font/ubuntumono-r-webfont.svg | 242 + .../ink/2.3.1/font/ubuntumono-r-webfont.ttf | Bin 0 -> 48132 bytes .../ink/2.3.1/font/ubuntumono-r-webfont.woff | Bin 0 -> 25976 bytes .../ink/2.3.1/font/ubuntumono-ri-webfont.eot | Bin 0 -> 25753 bytes .../ink/2.3.1/font/ubuntumono-ri-webfont.svg | 242 + .../ink/2.3.1/font/ubuntumono-ri-webfont.ttf | Bin 0 -> 55820 bytes .../ink/2.3.1/font/ubuntumono-ri-webfont.woff | Bin 0 -> 29344 bytes ajax/libs/ink/2.3.1/js/autoload.js | 76 + ajax/libs/ink/2.3.1/js/holder.js | 440 + ajax/libs/ink/2.3.1/js/html5shiv-printshiv.js | 11 + ajax/libs/ink/2.3.1/js/html5shiv.js | 8 + ajax/libs/ink/2.3.1/js/ink-all.js | 24782 ++++++++++++++++ ajax/libs/ink/2.3.1/js/ink-all.js.map | 1 + ajax/libs/ink/2.3.1/js/ink-all.min.js | 10 + ajax/libs/ink/2.3.1/js/ink-ui.js | 11525 +++++++ ajax/libs/ink/2.3.1/js/ink-ui.js.map | 1 + ajax/libs/ink/2.3.1/js/ink-ui.min.js | 6 + ajax/libs/ink/2.3.1/js/ink.animate.js | 175 + ajax/libs/ink/2.3.1/js/ink.carousel.js | 402 + ajax/libs/ink/2.3.1/js/ink.close.js | 49 + ajax/libs/ink/2.3.1/js/ink.common.js | 756 + ajax/libs/ink/2.3.1/js/ink.datepicker.js | 1395 + ajax/libs/ink/2.3.1/js/ink.draggable.js | 441 + ajax/libs/ink/2.3.1/js/ink.dropdown.js | 196 + ajax/libs/ink/2.3.1/js/ink.droppable.js | 310 + ajax/libs/ink/2.3.1/js/ink.formvalidator-2.js | 930 + ajax/libs/ink/2.3.1/js/ink.formvalidator.js | 709 + ajax/libs/ink/2.3.1/js/ink.imagequery.js | 211 + ajax/libs/ink/2.3.1/js/ink.js | 13257 +++++++++ ajax/libs/ink/2.3.1/js/ink.js.map | 1 + ajax/libs/ink/2.3.1/js/ink.min.js | 5 + ajax/libs/ink/2.3.1/js/ink.modal.js | 616 + ajax/libs/ink/2.3.1/js/ink.pagination.js | 519 + ajax/libs/ink/2.3.1/js/ink.progressbar.js | 108 + ajax/libs/ink/2.3.1/js/ink.smoothscroller.js | 224 + ajax/libs/ink/2.3.1/js/ink.sortablelist.js | 257 + ajax/libs/ink/2.3.1/js/ink.spy.js | 165 + ajax/libs/ink/2.3.1/js/ink.stacker.js | 285 + ajax/libs/ink/2.3.1/js/ink.sticky.js | 279 + ajax/libs/ink/2.3.1/js/ink.swipe.js | 209 + ajax/libs/ink/2.3.1/js/ink.table.js | 807 + ajax/libs/ink/2.3.1/js/ink.tabs.js | 397 + ajax/libs/ink/2.3.1/js/ink.tagfield.js | 266 + ajax/libs/ink/2.3.1/js/ink.toggle.js | 274 + ajax/libs/ink/2.3.1/js/ink.tooltip.js | 462 + ajax/libs/ink/2.3.1/js/ink.treeview.js | 191 + ajax/libs/ink/2.3.1/js/ink.upload.js | 867 + ajax/libs/ink/2.3.1/js/modernizr.js | 1393 + ajax/libs/ink/2.3.1/js/prettify.js | 29 + ajax/libs/ink/package.json | 2 +- 106 files changed, 80744 insertions(+), 1 deletion(-) create mode 100644 ajax/libs/ink/2.3.1/css/ink-ie7-min.css create mode 100644 ajax/libs/ink/2.3.1/css/ink-ie7.css create mode 100644 ajax/libs/ink/2.3.1/css/ink-min.css create mode 100644 ajax/libs/ink/2.3.1/css/ink-min.css.map create mode 100644 ajax/libs/ink/2.3.1/css/ink.css create mode 100644 ajax/libs/ink/2.3.1/css/ink.css.map create mode 100755 ajax/libs/ink/2.3.1/font/FontAwesome.otf create mode 100644 ajax/libs/ink/2.3.1/font/fontawesome-webfont.eot create mode 100644 ajax/libs/ink/2.3.1/font/fontawesome-webfont.svg create mode 100644 ajax/libs/ink/2.3.1/font/fontawesome-webfont.ttf create mode 100644 ajax/libs/ink/2.3.1/font/fontawesome-webfont.woff create mode 100644 ajax/libs/ink/2.3.1/font/ubuntu-b-webfont.eot create mode 100644 ajax/libs/ink/2.3.1/font/ubuntu-b-webfont.svg create mode 100644 ajax/libs/ink/2.3.1/font/ubuntu-b-webfont.ttf create mode 100644 ajax/libs/ink/2.3.1/font/ubuntu-b-webfont.woff create mode 100644 ajax/libs/ink/2.3.1/font/ubuntu-bi-webfont.eot create mode 100644 ajax/libs/ink/2.3.1/font/ubuntu-bi-webfont.svg create mode 100644 ajax/libs/ink/2.3.1/font/ubuntu-bi-webfont.ttf create mode 100644 ajax/libs/ink/2.3.1/font/ubuntu-bi-webfont.woff create mode 100644 ajax/libs/ink/2.3.1/font/ubuntu-c-webfont.eot create mode 100644 ajax/libs/ink/2.3.1/font/ubuntu-c-webfont.svg create mode 100644 ajax/libs/ink/2.3.1/font/ubuntu-c-webfont.ttf create mode 100644 ajax/libs/ink/2.3.1/font/ubuntu-c-webfont.woff create mode 100644 ajax/libs/ink/2.3.1/font/ubuntu-l-webfont.eot create mode 100644 ajax/libs/ink/2.3.1/font/ubuntu-l-webfont.svg create mode 100644 ajax/libs/ink/2.3.1/font/ubuntu-l-webfont.ttf create mode 100644 ajax/libs/ink/2.3.1/font/ubuntu-l-webfont.woff create mode 100644 ajax/libs/ink/2.3.1/font/ubuntu-li-webfont.eot create mode 100644 ajax/libs/ink/2.3.1/font/ubuntu-li-webfont.svg create mode 100644 ajax/libs/ink/2.3.1/font/ubuntu-li-webfont.ttf create mode 100644 ajax/libs/ink/2.3.1/font/ubuntu-li-webfont.woff create mode 100644 ajax/libs/ink/2.3.1/font/ubuntu-m-webfont.eot create mode 100644 ajax/libs/ink/2.3.1/font/ubuntu-m-webfont.svg create mode 100644 ajax/libs/ink/2.3.1/font/ubuntu-m-webfont.ttf create mode 100644 ajax/libs/ink/2.3.1/font/ubuntu-m-webfont.woff create mode 100644 ajax/libs/ink/2.3.1/font/ubuntu-mi-webfont.eot create mode 100644 ajax/libs/ink/2.3.1/font/ubuntu-mi-webfont.svg create mode 100644 ajax/libs/ink/2.3.1/font/ubuntu-mi-webfont.ttf create mode 100644 ajax/libs/ink/2.3.1/font/ubuntu-mi-webfont.woff create mode 100644 ajax/libs/ink/2.3.1/font/ubuntu-r-webfont.eot create mode 100644 ajax/libs/ink/2.3.1/font/ubuntu-r-webfont.svg create mode 100644 ajax/libs/ink/2.3.1/font/ubuntu-r-webfont.ttf create mode 100644 ajax/libs/ink/2.3.1/font/ubuntu-r-webfont.woff create mode 100644 ajax/libs/ink/2.3.1/font/ubuntu-ri-webfont.eot create mode 100644 ajax/libs/ink/2.3.1/font/ubuntu-ri-webfont.svg create mode 100644 ajax/libs/ink/2.3.1/font/ubuntu-ri-webfont.ttf create mode 100644 ajax/libs/ink/2.3.1/font/ubuntu-ri-webfont.woff create mode 100644 ajax/libs/ink/2.3.1/font/ubuntumono-b-webfont.eot create mode 100644 ajax/libs/ink/2.3.1/font/ubuntumono-b-webfont.svg create mode 100644 ajax/libs/ink/2.3.1/font/ubuntumono-b-webfont.ttf create mode 100644 ajax/libs/ink/2.3.1/font/ubuntumono-b-webfont.woff create mode 100644 ajax/libs/ink/2.3.1/font/ubuntumono-bi-webfont.eot create mode 100644 ajax/libs/ink/2.3.1/font/ubuntumono-bi-webfont.svg create mode 100644 ajax/libs/ink/2.3.1/font/ubuntumono-bi-webfont.ttf create mode 100644 ajax/libs/ink/2.3.1/font/ubuntumono-bi-webfont.woff create mode 100644 ajax/libs/ink/2.3.1/font/ubuntumono-r-webfont.eot create mode 100644 ajax/libs/ink/2.3.1/font/ubuntumono-r-webfont.svg create mode 100644 ajax/libs/ink/2.3.1/font/ubuntumono-r-webfont.ttf create mode 100644 ajax/libs/ink/2.3.1/font/ubuntumono-r-webfont.woff create mode 100644 ajax/libs/ink/2.3.1/font/ubuntumono-ri-webfont.eot create mode 100644 ajax/libs/ink/2.3.1/font/ubuntumono-ri-webfont.svg create mode 100644 ajax/libs/ink/2.3.1/font/ubuntumono-ri-webfont.ttf create mode 100644 ajax/libs/ink/2.3.1/font/ubuntumono-ri-webfont.woff create mode 100644 ajax/libs/ink/2.3.1/js/autoload.js create mode 100644 ajax/libs/ink/2.3.1/js/holder.js create mode 100644 ajax/libs/ink/2.3.1/js/html5shiv-printshiv.js create mode 100644 ajax/libs/ink/2.3.1/js/html5shiv.js create mode 100644 ajax/libs/ink/2.3.1/js/ink-all.js create mode 100644 ajax/libs/ink/2.3.1/js/ink-all.js.map create mode 100644 ajax/libs/ink/2.3.1/js/ink-all.min.js create mode 100644 ajax/libs/ink/2.3.1/js/ink-ui.js create mode 100644 ajax/libs/ink/2.3.1/js/ink-ui.js.map create mode 100644 ajax/libs/ink/2.3.1/js/ink-ui.min.js create mode 100644 ajax/libs/ink/2.3.1/js/ink.animate.js create mode 100644 ajax/libs/ink/2.3.1/js/ink.carousel.js create mode 100644 ajax/libs/ink/2.3.1/js/ink.close.js create mode 100644 ajax/libs/ink/2.3.1/js/ink.common.js create mode 100644 ajax/libs/ink/2.3.1/js/ink.datepicker.js create mode 100644 ajax/libs/ink/2.3.1/js/ink.draggable.js create mode 100644 ajax/libs/ink/2.3.1/js/ink.dropdown.js create mode 100644 ajax/libs/ink/2.3.1/js/ink.droppable.js create mode 100644 ajax/libs/ink/2.3.1/js/ink.formvalidator-2.js create mode 100644 ajax/libs/ink/2.3.1/js/ink.formvalidator.js create mode 100644 ajax/libs/ink/2.3.1/js/ink.imagequery.js create mode 100644 ajax/libs/ink/2.3.1/js/ink.js create mode 100644 ajax/libs/ink/2.3.1/js/ink.js.map create mode 100644 ajax/libs/ink/2.3.1/js/ink.min.js create mode 100644 ajax/libs/ink/2.3.1/js/ink.modal.js create mode 100644 ajax/libs/ink/2.3.1/js/ink.pagination.js create mode 100644 ajax/libs/ink/2.3.1/js/ink.progressbar.js create mode 100644 ajax/libs/ink/2.3.1/js/ink.smoothscroller.js create mode 100644 ajax/libs/ink/2.3.1/js/ink.sortablelist.js create mode 100644 ajax/libs/ink/2.3.1/js/ink.spy.js create mode 100644 ajax/libs/ink/2.3.1/js/ink.stacker.js create mode 100644 ajax/libs/ink/2.3.1/js/ink.sticky.js create mode 100644 ajax/libs/ink/2.3.1/js/ink.swipe.js create mode 100644 ajax/libs/ink/2.3.1/js/ink.table.js create mode 100644 ajax/libs/ink/2.3.1/js/ink.tabs.js create mode 100644 ajax/libs/ink/2.3.1/js/ink.tagfield.js create mode 100644 ajax/libs/ink/2.3.1/js/ink.toggle.js create mode 100644 ajax/libs/ink/2.3.1/js/ink.tooltip.js create mode 100644 ajax/libs/ink/2.3.1/js/ink.treeview.js create mode 100644 ajax/libs/ink/2.3.1/js/ink.upload.js create mode 100644 ajax/libs/ink/2.3.1/js/modernizr.js create mode 100644 ajax/libs/ink/2.3.1/js/prettify.js diff --git a/ajax/libs/ink/2.3.1/css/ink-ie7-min.css b/ajax/libs/ink/2.3.1/css/ink-ie7-min.css new file mode 100644 index 000000000..65e91d4cb --- /dev/null +++ b/ajax/libs/ink/2.3.1/css/ink-ie7-min.css @@ -0,0 +1,1739 @@ +.push-left { + float: left; +} +.push-center { + float: none; + margin-left: auto; + margin-right: auto; +} +.push-right { + float: right; +} +.align-left { + text-align: left; +} +.align-center { + text-align: center; +} +.align-right { + text-align: right; +} +.show-all { + display: inherit !important; +} +.hide-all { + display: none !important; +} +.show-large { + display: inherit !important; +} +.hide-large { + display: none !important; +} +.ink-grid { + width: auto; + max-width: 1200px; + margin: 0 auto; + padding: 0 3%; +} +.column-group { + width: auto; + clear: both; + zoom: 1; + margin-left: -3%; +} +.column-group:after { + content: " "; + display: block; + height: 0; + clear: both; + visibility: hidden; + zoom: 1; +} +.column-group.gutters, +.column-group.horizontal-gutters { + padding-right: 3%; + margin-left: -3%; + overflow: visible; +} +.column-group.half-gutters, +.column-group.half-horizontal-gutters { + padding-right: 1.5%; + margin-left: -1.5%; + overflow: visible; +} +.column-group.quarter-gutters, +.column-group.quarter-horizontal-gutters { + padding-right: 0.75%; + margin-left: -0.75%; + overflow: visible; +} +.column-group.double-gutters, +.column-group.double-horizontal-gutters { + padding-right: 6%; + margin-left: -6%; + overflow: visible; +} +.column-group.large-gutters, +.column-group.large-horizontal-gutters { + padding-right: 3%; + margin-left: -3%; + overflow: visible; +} +.column-group.large-half-gutters, +.column-group.large-half-horizontal-gutters { + padding-right: 1.5%; + margin-left: -1.5%; + overflow: visible; +} +.column-group.large-quarter-gutters, +.column-group.large-quarter-horizontal-gutters { + padding-right: 0.75%; + margin-left: -0.75%; + overflow: visible; +} +.column-group.large-double-gutters, +.column-group.large-double-horizontal-gutters { + padding-right: 6%; + margin-left: -6%; + overflow: visible; +} +.large-100 { + width: 99.99999583333333% !important; + clear: both; +} +.large-95 { + width: 92.14999595833332% !important; +} +.large-90 { + width: 87.29999595833333% !important; +} +.large-85 { + width: 82.44999595833333% !important; +} +.large-80 { + width: 77.59999595833332% !important; +} +.large-75 { + width: 72.74999595833333% !important; +} +.large-70 { + width: 67.89999595833332% !important; +} +.large-66 { + width: 65.66999585416666% !important; +} +.large-65 { + width: 63.04999595833333% !important; +} +.large-60 { + width: 58.19999595833333% !important; +} +.large-55 { + width: 53.34999595833334% !important; +} +.large-50 { + width: 48.499995958333336% !important; +} +.large-45 { + width: 43.649995958333335% !important; +} +.large-40 { + width: 38.799995958333334% !important; +} +.large-33 { + width: 31.316996045833335% !important; +} +.large-35 { + width: 33.94999595833333% !important; +} +.large-30 { + width: 29.09999595833333% !important; +} +.large-25 { + width: 24.249995958333333% !important; +} +.large-20 { + width: 19.39999595833333% !important; +} +.large-15 { + width: 14.549995958333334% !important; +} +.large-10 { + width: 9.699995958333332% !important; +} +.large-5 { + width: 4.849995958333333% !important; +} +[class*="large-"] { + float: left; + overflow: hidden; + zoom: 1; +} +table[class*="large-"], +th[class*="large-"], +td[class*="large-"] { + float: none; +} +.ink-grid .column-group.gutters > .large-100, +.ink-grid .column-group.horizontal-gutters > .large-100 { + width: 99.99999583333333% !important; +} +.ink-grid .column-group.gutters > .large-95, +.ink-grid .column-group.horizontal-gutters > .large-95 { + width: 92% !important; +} +.ink-grid .column-group.gutters > .large-90, +.ink-grid .column-group.horizontal-gutters > .large-90 { + width: 87% !important; +} +.ink-grid .column-group.gutters > .large-85, +.ink-grid .column-group.horizontal-gutters > .large-85 { + width: 82% !important; +} +.ink-grid .column-group.gutters > .large-80, +.ink-grid .column-group.horizontal-gutters > .large-80 { + width: 77% !important; +} +.ink-grid .column-group.gutters > .large-75, +.ink-grid .column-group.horizontal-gutters > .large-75 { + width: 72% !important; +} +.ink-grid .column-group.gutters > .large-70, +.ink-grid .column-group.horizontal-gutters > .large-70 { + width: 67% !important; +} +.ink-grid .column-group.gutters > .large-66, +.ink-grid .column-group.horizontal-gutters > .large-66 { + width: 63% !important; +} +.ink-grid .column-group.gutters > .large-65, +.ink-grid .column-group.horizontal-gutters > .large-65 { + width: 62% !important; +} +.ink-grid .column-group.gutters > .large-60, +.ink-grid .column-group.horizontal-gutters > .large-60 { + width: 57% !important; +} +.ink-grid .column-group.gutters > .large-55, +.ink-grid .column-group.horizontal-gutters > .large-55 { + width: 52% !important; +} +.ink-grid .column-group.gutters > .large-50, +.ink-grid .column-group.horizontal-gutters > .large-50 { + width: 47% !important; +} +.ink-grid .column-group.gutters > .large-45, +.ink-grid .column-group.horizontal-gutters > .large-45 { + width: 42% !important; +} +.ink-grid .column-group.gutters > .large-40, +.ink-grid .column-group.horizontal-gutters > .large-40 { + width: 37% !important; +} +.ink-grid .column-group.gutters > .large-35, +.ink-grid .column-group.horizontal-gutters > .large-35 { + width: 32% !important; +} +.ink-grid .column-group.gutters > .large-33, +.ink-grid .column-group.horizontal-gutters > .large-33 { + width: 30.000000000000004% !important; +} +.ink-grid .column-group.gutters > .large-30, +.ink-grid .column-group.horizontal-gutters > .large-30 { + width: 27% !important; +} +.ink-grid .column-group.gutters > .large-25, +.ink-grid .column-group.horizontal-gutters > .large-25 { + width: 22% !important; +} +.ink-grid .column-group.gutters > .large-20, +.ink-grid .column-group.horizontal-gutters > .large-20 { + width: 17% !important; +} +.ink-grid .column-group.gutters > .large-10, +.ink-grid .column-group.horizontal-gutters > .large-10 { + width: 7% !important; +} +.ink-grid .column-group.gutters > .large-5, +.ink-grid .column-group.horizontal-gutters > .large-5 { + width: 2% !important; +} +.ink-grid .column-group.gutters > [class*="large-"] { + margin-left: 2.999995833333333%; + margin-bottom: 3%; + padding-left: 0px !important; +} +.ink-grid .column-group.half-gutters > [class*="large-"] { + margin-left: 1.4999979166666666%; + margin-bottom: 1.5%; + padding-left: 0px !important; +} +.ink-grid .column-group.quarter-gutters > [class*="large-"] { + margin-left: 0.7499989583333333%; + margin-bottom: 0.75%; + padding-left: 0px !important; +} +.ink-grid .column-group.horizontal-gutters > [class*="large-"] { + margin-left: 2.999995833333333%; + padding-left: 0px !important; +} +.ink-grid .column-group.half-horizontal-gutters > [class*="large-"] { + margin-left: 1.4999979166666666%; + padding-left: 0px !important; +} +.ink-grid .column-group.quarter-horizontal-gutters > [class*="large-"] { + margin-left: 0.7499989583333333%; + padding-left: 0px !important; +} +.ink-grid .column-group.vertical-gutters > [class*="large-"] { + margin-bottom: 3%; + padding-left: 0px !important; +} +.ink-grid .column-group.half-vertical-gutters > [class*="large-"] { + margin-bottom: 1.5%; + padding-left: 0px !important; +} +.ink-grid .column-group.quarter-vertical-gutters > [class*="large-"] { + margin-bottom: 0.75%; + padding-left: 0px !important; +} +[class*="large-"]:empty { + clear: both; +} +*[class*="large-"] > *[class*="large-"] { + margin-left: 0; +} +.ink-form .column-group.gutters { + margin-left: -3%; +} +.ink-form [class*="large-"] input, +.ink-form [class*="large-"] textarea { + width: 98.5% !important; + margin-left: -2.999995833333333%; + padding-left: 0; + padding-right: 0; +} +.large-push-left { + float: left; +} +.large-push-center { + float: none; + margin-left: auto; + margin-right: auto; +} +.large-push-right { + float: right; +} +.large-align-left { + text-align: left; +} +.large-align-center { + text-align: center; +} +.large-align-right { + text-align: right; +} +.space { + margin: 3%; +} +.half-space { + margin: 1.5%; +} +.quarter-space { + margin: 0.75%; +} +.double-space { + margin: 6%; +} +.large-space { + margin: 3%; +} +.large-half-space { + margin: 1.5%; +} +.large-quarter-space { + margin: 0.75%; +} +.large-double-space { + margin: 6%; +} +.vspace, +.vertical-space { + margin-top: 3%; + margin-bottom: 3%; +} +.half-vertical-space { + margin-top: 1.5%; + margin-bottom: 1.5%; +} +.quarter-vertical-space { + margin-top: 0.75%; + margin-bottom: 0.75%; +} +.double-vertical-space { + margin-top: 6%; + margin-bottom: 6%; +} +.hspace, +.horizontal-space { + margin-left: 3%; + margin-right: 3%; +} +.half-horizontal-space { + margin-left: 1.5%; + margin-right: 1.5%; +} +.quarter-horizontal-space { + margin-left: 0.75%; + margin-right: 0.75%; +} +.double-horizontal-space { + margin-left: 6%; + margin-right: 6%; +} +.large-vspace, +.large-vertical-space { + margin-top: 3%; + margin-bottom: 3%; +} +.large-half-vertical-space { + margin-top: 1.5%; + margin-bottom: 1.5%; +} +.large-quarter-vertical-space { + margin-top: 0.75%; + margin-bottom: 0.75%; +} +.large-double-vertical-space { + margin-top: 6%; + margin-bottom: 6%; +} +.large-hspace, +.large-horizontal-space { + margin-left: 3%; + margin-right: 3%; +} +.large-half-horizontal-space { + margin-left: 1.5%; + margin-right: 1.5%; +} +.large-quarter-horizontal-space { + margin-left: 0.75%; + margin-right: 0.75%; +} +.large-double-horizontal-space { + margin-left: 6%; + margin-right: 6%; +} +.top-space { + margin-top: 3%; +} +.top-space:first-child { + margin-top: 3%; +} +.half-top-space { + margin-top: 1.5%; +} +.half-top-space:first-child { + margin-top: 1.5%; +} +.quarter-top-space { + margin-top: 0.75%; +} +.quarter-top-space:first-child { + margin-top: 0.75%; +} +.double-top-space { + margin-top: 6%; +} +.double-top-space:first-child { + margin-top: 6%; +} +.large-top-space { + margin-top: 3%; +} +.large-half-top-space { + margin-top: 1.5%; +} +.large-quarter-top-space { + margin-top: 0.75%; +} +.large-double-top-space { + margin-top: 6%; +} +.right-space { + margin-right: 3%; +} +.half-right-space { + margin-right: 1.5%; +} +.quarter-right-space { + margin-right: 0.75%; +} +.double-right-space { + margin-right: 6%; +} +.large-right-space { + margin-right: 3%; +} +.large-half-right-space { + margin-right: 1.5%; +} +.large-quarter-right-space { + margin-right: 0.75%; +} +.large-double-right-space { + margin-right: 6%; +} +.bottom-space { + margin-bottom: 3%; +} +.half-bottom-space { + margin-bottom: 1.5%; +} +.quarter-bottom-space { + margin-bottom: 0.75%; +} +.double-bottom-space { + margin-bottom: 6%; +} +.large-bottom-space { + margin-bottom: 3%; +} +.large-half-bottom-space { + margin-bottom: 1.5%; +} +.large-quarter-bottom-space { + margin-bottom: 0.75%; +} +.large-double-bottom-space { + margin-bottom: 6%; +} +.left-space { + margin-left: 3%; +} +.half-left-space { + margin-left: 1.5%; +} +.quarter-left-space { + margin-left: 0.75%; +} +.double-left-space { + margin-left: 0.75%; +} +.large-left-space { + margin-left: 3%; +} +.large-half-left-space { + margin-left: 1.5%; +} +.large-quarter-left-space { + margin-left: 0.75%; +} +.large-double-left-space { + margin-left: 0.75%; +} +/*! + * Font Awesome 3.2.1 + * the iconic font designed for Bootstrap + * ------------------------------------------------------------------------------ + * The full suite of pictographic icons, examples, and documentation can be + * found at http://fontawesome.io. Stay up to date on Twitter at + * http://twitter.com/fontawesome. + * + * License + * ------------------------------------------------------------------------------ + * - The Font Awesome font is licensed under SIL OFL 1.1 - + * http://scripts.sil.org/OFL + * - Font Awesome CSS, LESS, and SASS files are licensed under MIT License - + * http://opensource.org/licenses/mit-license.html + * - Font Awesome documentation licensed under CC BY 3.0 - + * http://creativecommons.org/licenses/by/3.0/ + * - Attribution is no longer required in Font Awesome 3.0, but much appreciated: + * "Font Awesome by Dave Gandy - http://fontawesome.io" + * + * Author - Dave Gandy + * ------------------------------------------------------------------------------ + * Email: dave@fontawesome.io + * Twitter: http://twitter.com/davegandy + * Work: Lead Product Designer @ Kyruus - http://kyruus.com + */ +.icon-large { + font-size: 1.3333333333333333em; + margin-top: -4px; + padding-top: 3px; + margin-bottom: -4px; + padding-bottom: 3px; + vertical-align: middle; +} +.nav [class^="icon-"], +.nav [class*=" icon-"] { + vertical-align: inherit; + margin-top: -4px; + padding-top: 3px; + margin-bottom: -4px; + padding-bottom: 3px; +} +.nav [class^="icon-"].icon-large, +.nav [class*=" icon-"].icon-large { + vertical-align: -25%; +} +.nav-pills [class^="icon-"].icon-large, +.nav-tabs [class^="icon-"].icon-large, +.nav-pills [class*=" icon-"].icon-large, +.nav-tabs [class*=" icon-"].icon-large { + line-height: .75em; + margin-top: -7px; + padding-top: 5px; + margin-bottom: -5px; + padding-bottom: 4px; +} +.btn [class^="icon-"].pull-left, +.btn [class*=" icon-"].pull-left, +.btn [class^="icon-"].pull-right, +.btn [class*=" icon-"].pull-right { + vertical-align: inherit; +} +.btn [class^="icon-"].icon-large, +.btn [class*=" icon-"].icon-large { + margin-top: -0.5em; +} +a [class^="icon-"], +a [class*=" icon-"] { + cursor: pointer; +} +.icon-glass { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-music { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-search { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-envelope-alt { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-heart { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-star { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-star-empty { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-user { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-film { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-th-large { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-th { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-th-list { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-ok { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-remove { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-zoom-in { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-zoom-out { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-off { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-power-off { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-signal { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-cog { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-gear { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-trash { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-home { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-file-alt { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-time { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-road { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-download-alt { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-download { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-upload { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-inbox { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-play-circle { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-repeat { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-rotate-right { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-refresh { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-list-alt { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-lock { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-flag { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-headphones { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-volume-off { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-volume-down { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-volume-up { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-qrcode { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-barcode { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-tag { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-tags { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-book { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-bookmark { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-print { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-camera { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-font { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-bold { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-italic { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-text-height { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-text-width { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-align-left { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-align-center { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-align-right { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-align-justify { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-list { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-indent-left { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-indent-right { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-facetime-video { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-picture { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-pencil { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-map-marker { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-adjust { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-tint { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-edit { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-share { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-check { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-move { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-step-backward { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-fast-backward { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-backward { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-play { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-pause { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-stop { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-forward { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-fast-forward { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-step-forward { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-eject { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-chevron-left { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-chevron-right { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-plus-sign { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-minus-sign { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-remove-sign { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-ok-sign { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-question-sign { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-info-sign { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-screenshot { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-remove-circle { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-ok-circle { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-ban-circle { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-arrow-left { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-arrow-right { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-arrow-up { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-arrow-down { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-share-alt { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-mail-forward { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-resize-full { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-resize-small { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-plus { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-minus { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-asterisk { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-exclamation-sign { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-gift { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-leaf { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-fire { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-eye-open { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-eye-close { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-warning-sign { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-plane { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-calendar { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-random { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-comment { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-magnet { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-chevron-up { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-chevron-down { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-retweet { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-shopping-cart { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-folder-close { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-folder-open { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-resize-vertical { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-resize-horizontal { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-bar-chart { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-twitter-sign { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-facebook-sign { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-camera-retro { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-key { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-cogs { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-gears { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-comments { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-thumbs-up-alt { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-thumbs-down-alt { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-star-half { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-heart-empty { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-signout { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-linkedin-sign { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-pushpin { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-external-link { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-signin { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-trophy { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-github-sign { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-upload-alt { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-lemon { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-phone { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-check-empty { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-unchecked { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-bookmark-empty { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-phone-sign { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-twitter { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-facebook { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-github { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-unlock { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-credit-card { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-rss { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-hdd { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-bullhorn { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-bell { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-certificate { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-hand-right { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-hand-left { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-hand-up { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-hand-down { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-circle-arrow-left { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-circle-arrow-right { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-circle-arrow-up { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-circle-arrow-down { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-globe { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-wrench { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-tasks { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-filter { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-briefcase { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-fullscreen { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-group { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-link { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-cloud { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-beaker { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-cut { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-copy { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-paper-clip { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-paperclip { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-save { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-sign-blank { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-reorder { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-list-ul { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-list-ol { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-strikethrough { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-underline { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-table { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-magic { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-truck { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-pinterest { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-pinterest-sign { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-google-plus-sign { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-google-plus { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-money { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-caret-down { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-caret-up { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-caret-left { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-caret-right { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-columns { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-sort { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-sort-down { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-sort-up { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-envelope { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-linkedin { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-undo { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-rotate-left { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-legal { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-dashboard { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-comment-alt { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-comments-alt { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-bolt { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-sitemap { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-umbrella { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-paste { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-lightbulb { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-exchange { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-cloud-download { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-cloud-upload { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-user-md { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-stethoscope { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-suitcase { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-bell-alt { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-coffee { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-food { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-file-text-alt { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-building { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-hospital { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-ambulance { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-medkit { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-fighter-jet { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-beer { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-h-sign { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-plus-sign-alt { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-double-angle-left { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-double-angle-right { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-double-angle-up { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-double-angle-down { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-angle-left { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-angle-right { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-angle-up { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-angle-down { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-desktop { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-laptop { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-tablet { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-mobile-phone { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-circle-blank { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-quote-left { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-quote-right { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-spinner { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-circle { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-reply { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-mail-reply { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-github-alt { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-folder-close-alt { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-folder-open-alt { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-expand-alt { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-collapse-alt { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-smile { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-frown { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-meh { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-gamepad { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-keyboard { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-flag-alt { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-flag-checkered { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-terminal { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-code { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-reply-all { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-mail-reply-all { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-star-half-empty { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-star-half-full { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-location-arrow { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-crop { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-code-fork { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-unlink { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-question { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-info { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-exclamation { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-superscript { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-subscript { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-eraser { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-puzzle-piece { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-microphone { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-microphone-off { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-shield { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-calendar-empty { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-fire-extinguisher { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-rocket { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-maxcdn { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-chevron-sign-left { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-chevron-sign-right { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-chevron-sign-up { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-chevron-sign-down { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-html5 { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-css3 { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-anchor { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-unlock-alt { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-bullseye { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-ellipsis-horizontal { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-ellipsis-vertical { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-rss-sign { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-play-sign { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-ticket { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-minus-sign-alt { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-check-minus { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-level-up { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-level-down { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-check-sign { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-edit-sign { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-external-link-sign { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-share-sign { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-compass { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-collapse { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-collapse-top { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-expand { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-eur { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-euro { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-gbp { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-usd { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-dollar { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-inr { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-rupee { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-jpy { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-yen { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-cny { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-renminbi { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-krw { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-won { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-btc { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-bitcoin { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-file { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-file-text { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-sort-by-alphabet { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-sort-by-alphabet-alt { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-sort-by-attributes { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-sort-by-attributes-alt { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-sort-by-order { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-sort-by-order-alt { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-thumbs-up { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-thumbs-down { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-youtube-sign { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-youtube { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-xing { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-xing-sign { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-youtube-play { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-dropbox { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-stackexchange { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-instagram { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-flickr { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-adn { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-bitbucket { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-bitbucket-sign { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-tumblr { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-tumblr-sign { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-long-arrow-down { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-long-arrow-up { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-long-arrow-left { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-long-arrow-right { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-apple { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-windows { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-android { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-linux { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-dribbble { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-skype { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-foursquare { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-trello { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-female { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-male { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-gittip { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-sun { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-moon { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-archive { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-bug { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-vk { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-weibo { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-renren { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} diff --git a/ajax/libs/ink/2.3.1/css/ink-ie7.css b/ajax/libs/ink/2.3.1/css/ink-ie7.css new file mode 100644 index 000000000..65e91d4cb --- /dev/null +++ b/ajax/libs/ink/2.3.1/css/ink-ie7.css @@ -0,0 +1,1739 @@ +.push-left { + float: left; +} +.push-center { + float: none; + margin-left: auto; + margin-right: auto; +} +.push-right { + float: right; +} +.align-left { + text-align: left; +} +.align-center { + text-align: center; +} +.align-right { + text-align: right; +} +.show-all { + display: inherit !important; +} +.hide-all { + display: none !important; +} +.show-large { + display: inherit !important; +} +.hide-large { + display: none !important; +} +.ink-grid { + width: auto; + max-width: 1200px; + margin: 0 auto; + padding: 0 3%; +} +.column-group { + width: auto; + clear: both; + zoom: 1; + margin-left: -3%; +} +.column-group:after { + content: " "; + display: block; + height: 0; + clear: both; + visibility: hidden; + zoom: 1; +} +.column-group.gutters, +.column-group.horizontal-gutters { + padding-right: 3%; + margin-left: -3%; + overflow: visible; +} +.column-group.half-gutters, +.column-group.half-horizontal-gutters { + padding-right: 1.5%; + margin-left: -1.5%; + overflow: visible; +} +.column-group.quarter-gutters, +.column-group.quarter-horizontal-gutters { + padding-right: 0.75%; + margin-left: -0.75%; + overflow: visible; +} +.column-group.double-gutters, +.column-group.double-horizontal-gutters { + padding-right: 6%; + margin-left: -6%; + overflow: visible; +} +.column-group.large-gutters, +.column-group.large-horizontal-gutters { + padding-right: 3%; + margin-left: -3%; + overflow: visible; +} +.column-group.large-half-gutters, +.column-group.large-half-horizontal-gutters { + padding-right: 1.5%; + margin-left: -1.5%; + overflow: visible; +} +.column-group.large-quarter-gutters, +.column-group.large-quarter-horizontal-gutters { + padding-right: 0.75%; + margin-left: -0.75%; + overflow: visible; +} +.column-group.large-double-gutters, +.column-group.large-double-horizontal-gutters { + padding-right: 6%; + margin-left: -6%; + overflow: visible; +} +.large-100 { + width: 99.99999583333333% !important; + clear: both; +} +.large-95 { + width: 92.14999595833332% !important; +} +.large-90 { + width: 87.29999595833333% !important; +} +.large-85 { + width: 82.44999595833333% !important; +} +.large-80 { + width: 77.59999595833332% !important; +} +.large-75 { + width: 72.74999595833333% !important; +} +.large-70 { + width: 67.89999595833332% !important; +} +.large-66 { + width: 65.66999585416666% !important; +} +.large-65 { + width: 63.04999595833333% !important; +} +.large-60 { + width: 58.19999595833333% !important; +} +.large-55 { + width: 53.34999595833334% !important; +} +.large-50 { + width: 48.499995958333336% !important; +} +.large-45 { + width: 43.649995958333335% !important; +} +.large-40 { + width: 38.799995958333334% !important; +} +.large-33 { + width: 31.316996045833335% !important; +} +.large-35 { + width: 33.94999595833333% !important; +} +.large-30 { + width: 29.09999595833333% !important; +} +.large-25 { + width: 24.249995958333333% !important; +} +.large-20 { + width: 19.39999595833333% !important; +} +.large-15 { + width: 14.549995958333334% !important; +} +.large-10 { + width: 9.699995958333332% !important; +} +.large-5 { + width: 4.849995958333333% !important; +} +[class*="large-"] { + float: left; + overflow: hidden; + zoom: 1; +} +table[class*="large-"], +th[class*="large-"], +td[class*="large-"] { + float: none; +} +.ink-grid .column-group.gutters > .large-100, +.ink-grid .column-group.horizontal-gutters > .large-100 { + width: 99.99999583333333% !important; +} +.ink-grid .column-group.gutters > .large-95, +.ink-grid .column-group.horizontal-gutters > .large-95 { + width: 92% !important; +} +.ink-grid .column-group.gutters > .large-90, +.ink-grid .column-group.horizontal-gutters > .large-90 { + width: 87% !important; +} +.ink-grid .column-group.gutters > .large-85, +.ink-grid .column-group.horizontal-gutters > .large-85 { + width: 82% !important; +} +.ink-grid .column-group.gutters > .large-80, +.ink-grid .column-group.horizontal-gutters > .large-80 { + width: 77% !important; +} +.ink-grid .column-group.gutters > .large-75, +.ink-grid .column-group.horizontal-gutters > .large-75 { + width: 72% !important; +} +.ink-grid .column-group.gutters > .large-70, +.ink-grid .column-group.horizontal-gutters > .large-70 { + width: 67% !important; +} +.ink-grid .column-group.gutters > .large-66, +.ink-grid .column-group.horizontal-gutters > .large-66 { + width: 63% !important; +} +.ink-grid .column-group.gutters > .large-65, +.ink-grid .column-group.horizontal-gutters > .large-65 { + width: 62% !important; +} +.ink-grid .column-group.gutters > .large-60, +.ink-grid .column-group.horizontal-gutters > .large-60 { + width: 57% !important; +} +.ink-grid .column-group.gutters > .large-55, +.ink-grid .column-group.horizontal-gutters > .large-55 { + width: 52% !important; +} +.ink-grid .column-group.gutters > .large-50, +.ink-grid .column-group.horizontal-gutters > .large-50 { + width: 47% !important; +} +.ink-grid .column-group.gutters > .large-45, +.ink-grid .column-group.horizontal-gutters > .large-45 { + width: 42% !important; +} +.ink-grid .column-group.gutters > .large-40, +.ink-grid .column-group.horizontal-gutters > .large-40 { + width: 37% !important; +} +.ink-grid .column-group.gutters > .large-35, +.ink-grid .column-group.horizontal-gutters > .large-35 { + width: 32% !important; +} +.ink-grid .column-group.gutters > .large-33, +.ink-grid .column-group.horizontal-gutters > .large-33 { + width: 30.000000000000004% !important; +} +.ink-grid .column-group.gutters > .large-30, +.ink-grid .column-group.horizontal-gutters > .large-30 { + width: 27% !important; +} +.ink-grid .column-group.gutters > .large-25, +.ink-grid .column-group.horizontal-gutters > .large-25 { + width: 22% !important; +} +.ink-grid .column-group.gutters > .large-20, +.ink-grid .column-group.horizontal-gutters > .large-20 { + width: 17% !important; +} +.ink-grid .column-group.gutters > .large-10, +.ink-grid .column-group.horizontal-gutters > .large-10 { + width: 7% !important; +} +.ink-grid .column-group.gutters > .large-5, +.ink-grid .column-group.horizontal-gutters > .large-5 { + width: 2% !important; +} +.ink-grid .column-group.gutters > [class*="large-"] { + margin-left: 2.999995833333333%; + margin-bottom: 3%; + padding-left: 0px !important; +} +.ink-grid .column-group.half-gutters > [class*="large-"] { + margin-left: 1.4999979166666666%; + margin-bottom: 1.5%; + padding-left: 0px !important; +} +.ink-grid .column-group.quarter-gutters > [class*="large-"] { + margin-left: 0.7499989583333333%; + margin-bottom: 0.75%; + padding-left: 0px !important; +} +.ink-grid .column-group.horizontal-gutters > [class*="large-"] { + margin-left: 2.999995833333333%; + padding-left: 0px !important; +} +.ink-grid .column-group.half-horizontal-gutters > [class*="large-"] { + margin-left: 1.4999979166666666%; + padding-left: 0px !important; +} +.ink-grid .column-group.quarter-horizontal-gutters > [class*="large-"] { + margin-left: 0.7499989583333333%; + padding-left: 0px !important; +} +.ink-grid .column-group.vertical-gutters > [class*="large-"] { + margin-bottom: 3%; + padding-left: 0px !important; +} +.ink-grid .column-group.half-vertical-gutters > [class*="large-"] { + margin-bottom: 1.5%; + padding-left: 0px !important; +} +.ink-grid .column-group.quarter-vertical-gutters > [class*="large-"] { + margin-bottom: 0.75%; + padding-left: 0px !important; +} +[class*="large-"]:empty { + clear: both; +} +*[class*="large-"] > *[class*="large-"] { + margin-left: 0; +} +.ink-form .column-group.gutters { + margin-left: -3%; +} +.ink-form [class*="large-"] input, +.ink-form [class*="large-"] textarea { + width: 98.5% !important; + margin-left: -2.999995833333333%; + padding-left: 0; + padding-right: 0; +} +.large-push-left { + float: left; +} +.large-push-center { + float: none; + margin-left: auto; + margin-right: auto; +} +.large-push-right { + float: right; +} +.large-align-left { + text-align: left; +} +.large-align-center { + text-align: center; +} +.large-align-right { + text-align: right; +} +.space { + margin: 3%; +} +.half-space { + margin: 1.5%; +} +.quarter-space { + margin: 0.75%; +} +.double-space { + margin: 6%; +} +.large-space { + margin: 3%; +} +.large-half-space { + margin: 1.5%; +} +.large-quarter-space { + margin: 0.75%; +} +.large-double-space { + margin: 6%; +} +.vspace, +.vertical-space { + margin-top: 3%; + margin-bottom: 3%; +} +.half-vertical-space { + margin-top: 1.5%; + margin-bottom: 1.5%; +} +.quarter-vertical-space { + margin-top: 0.75%; + margin-bottom: 0.75%; +} +.double-vertical-space { + margin-top: 6%; + margin-bottom: 6%; +} +.hspace, +.horizontal-space { + margin-left: 3%; + margin-right: 3%; +} +.half-horizontal-space { + margin-left: 1.5%; + margin-right: 1.5%; +} +.quarter-horizontal-space { + margin-left: 0.75%; + margin-right: 0.75%; +} +.double-horizontal-space { + margin-left: 6%; + margin-right: 6%; +} +.large-vspace, +.large-vertical-space { + margin-top: 3%; + margin-bottom: 3%; +} +.large-half-vertical-space { + margin-top: 1.5%; + margin-bottom: 1.5%; +} +.large-quarter-vertical-space { + margin-top: 0.75%; + margin-bottom: 0.75%; +} +.large-double-vertical-space { + margin-top: 6%; + margin-bottom: 6%; +} +.large-hspace, +.large-horizontal-space { + margin-left: 3%; + margin-right: 3%; +} +.large-half-horizontal-space { + margin-left: 1.5%; + margin-right: 1.5%; +} +.large-quarter-horizontal-space { + margin-left: 0.75%; + margin-right: 0.75%; +} +.large-double-horizontal-space { + margin-left: 6%; + margin-right: 6%; +} +.top-space { + margin-top: 3%; +} +.top-space:first-child { + margin-top: 3%; +} +.half-top-space { + margin-top: 1.5%; +} +.half-top-space:first-child { + margin-top: 1.5%; +} +.quarter-top-space { + margin-top: 0.75%; +} +.quarter-top-space:first-child { + margin-top: 0.75%; +} +.double-top-space { + margin-top: 6%; +} +.double-top-space:first-child { + margin-top: 6%; +} +.large-top-space { + margin-top: 3%; +} +.large-half-top-space { + margin-top: 1.5%; +} +.large-quarter-top-space { + margin-top: 0.75%; +} +.large-double-top-space { + margin-top: 6%; +} +.right-space { + margin-right: 3%; +} +.half-right-space { + margin-right: 1.5%; +} +.quarter-right-space { + margin-right: 0.75%; +} +.double-right-space { + margin-right: 6%; +} +.large-right-space { + margin-right: 3%; +} +.large-half-right-space { + margin-right: 1.5%; +} +.large-quarter-right-space { + margin-right: 0.75%; +} +.large-double-right-space { + margin-right: 6%; +} +.bottom-space { + margin-bottom: 3%; +} +.half-bottom-space { + margin-bottom: 1.5%; +} +.quarter-bottom-space { + margin-bottom: 0.75%; +} +.double-bottom-space { + margin-bottom: 6%; +} +.large-bottom-space { + margin-bottom: 3%; +} +.large-half-bottom-space { + margin-bottom: 1.5%; +} +.large-quarter-bottom-space { + margin-bottom: 0.75%; +} +.large-double-bottom-space { + margin-bottom: 6%; +} +.left-space { + margin-left: 3%; +} +.half-left-space { + margin-left: 1.5%; +} +.quarter-left-space { + margin-left: 0.75%; +} +.double-left-space { + margin-left: 0.75%; +} +.large-left-space { + margin-left: 3%; +} +.large-half-left-space { + margin-left: 1.5%; +} +.large-quarter-left-space { + margin-left: 0.75%; +} +.large-double-left-space { + margin-left: 0.75%; +} +/*! + * Font Awesome 3.2.1 + * the iconic font designed for Bootstrap + * ------------------------------------------------------------------------------ + * The full suite of pictographic icons, examples, and documentation can be + * found at http://fontawesome.io. Stay up to date on Twitter at + * http://twitter.com/fontawesome. + * + * License + * ------------------------------------------------------------------------------ + * - The Font Awesome font is licensed under SIL OFL 1.1 - + * http://scripts.sil.org/OFL + * - Font Awesome CSS, LESS, and SASS files are licensed under MIT License - + * http://opensource.org/licenses/mit-license.html + * - Font Awesome documentation licensed under CC BY 3.0 - + * http://creativecommons.org/licenses/by/3.0/ + * - Attribution is no longer required in Font Awesome 3.0, but much appreciated: + * "Font Awesome by Dave Gandy - http://fontawesome.io" + * + * Author - Dave Gandy + * ------------------------------------------------------------------------------ + * Email: dave@fontawesome.io + * Twitter: http://twitter.com/davegandy + * Work: Lead Product Designer @ Kyruus - http://kyruus.com + */ +.icon-large { + font-size: 1.3333333333333333em; + margin-top: -4px; + padding-top: 3px; + margin-bottom: -4px; + padding-bottom: 3px; + vertical-align: middle; +} +.nav [class^="icon-"], +.nav [class*=" icon-"] { + vertical-align: inherit; + margin-top: -4px; + padding-top: 3px; + margin-bottom: -4px; + padding-bottom: 3px; +} +.nav [class^="icon-"].icon-large, +.nav [class*=" icon-"].icon-large { + vertical-align: -25%; +} +.nav-pills [class^="icon-"].icon-large, +.nav-tabs [class^="icon-"].icon-large, +.nav-pills [class*=" icon-"].icon-large, +.nav-tabs [class*=" icon-"].icon-large { + line-height: .75em; + margin-top: -7px; + padding-top: 5px; + margin-bottom: -5px; + padding-bottom: 4px; +} +.btn [class^="icon-"].pull-left, +.btn [class*=" icon-"].pull-left, +.btn [class^="icon-"].pull-right, +.btn [class*=" icon-"].pull-right { + vertical-align: inherit; +} +.btn [class^="icon-"].icon-large, +.btn [class*=" icon-"].icon-large { + margin-top: -0.5em; +} +a [class^="icon-"], +a [class*=" icon-"] { + cursor: pointer; +} +.icon-glass { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-music { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-search { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-envelope-alt { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-heart { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-star { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-star-empty { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-user { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-film { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-th-large { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-th { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-th-list { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-ok { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-remove { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-zoom-in { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-zoom-out { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-off { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-power-off { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-signal { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-cog { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-gear { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-trash { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-home { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-file-alt { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-time { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-road { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-download-alt { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-download { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-upload { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-inbox { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-play-circle { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-repeat { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-rotate-right { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-refresh { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-list-alt { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-lock { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-flag { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-headphones { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-volume-off { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-volume-down { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-volume-up { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-qrcode { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-barcode { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-tag { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-tags { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-book { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-bookmark { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-print { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-camera { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-font { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-bold { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-italic { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-text-height { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-text-width { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-align-left { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-align-center { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-align-right { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-align-justify { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-list { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-indent-left { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-indent-right { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-facetime-video { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-picture { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-pencil { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-map-marker { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-adjust { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-tint { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-edit { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-share { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-check { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-move { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-step-backward { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-fast-backward { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-backward { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-play { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-pause { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-stop { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-forward { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-fast-forward { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-step-forward { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-eject { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-chevron-left { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-chevron-right { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-plus-sign { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-minus-sign { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-remove-sign { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-ok-sign { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-question-sign { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-info-sign { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-screenshot { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-remove-circle { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-ok-circle { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-ban-circle { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-arrow-left { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-arrow-right { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-arrow-up { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-arrow-down { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-share-alt { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-mail-forward { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-resize-full { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-resize-small { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-plus { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-minus { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-asterisk { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-exclamation-sign { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-gift { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-leaf { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-fire { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-eye-open { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-eye-close { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-warning-sign { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-plane { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-calendar { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-random { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-comment { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-magnet { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-chevron-up { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-chevron-down { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-retweet { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-shopping-cart { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-folder-close { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-folder-open { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-resize-vertical { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-resize-horizontal { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-bar-chart { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-twitter-sign { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-facebook-sign { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-camera-retro { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-key { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-cogs { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-gears { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-comments { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-thumbs-up-alt { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-thumbs-down-alt { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-star-half { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-heart-empty { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-signout { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-linkedin-sign { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-pushpin { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-external-link { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-signin { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-trophy { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-github-sign { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-upload-alt { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-lemon { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-phone { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-check-empty { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-unchecked { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-bookmark-empty { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-phone-sign { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-twitter { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-facebook { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-github { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-unlock { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-credit-card { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-rss { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-hdd { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-bullhorn { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-bell { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-certificate { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-hand-right { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-hand-left { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-hand-up { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-hand-down { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-circle-arrow-left { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-circle-arrow-right { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-circle-arrow-up { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-circle-arrow-down { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-globe { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-wrench { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-tasks { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-filter { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-briefcase { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-fullscreen { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-group { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-link { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-cloud { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-beaker { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-cut { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-copy { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-paper-clip { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-paperclip { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-save { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-sign-blank { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-reorder { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-list-ul { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-list-ol { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-strikethrough { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-underline { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-table { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-magic { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-truck { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-pinterest { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-pinterest-sign { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-google-plus-sign { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-google-plus { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-money { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-caret-down { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-caret-up { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-caret-left { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-caret-right { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-columns { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-sort { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-sort-down { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-sort-up { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-envelope { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-linkedin { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-undo { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-rotate-left { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-legal { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-dashboard { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-comment-alt { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-comments-alt { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-bolt { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-sitemap { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-umbrella { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-paste { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-lightbulb { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-exchange { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-cloud-download { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-cloud-upload { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-user-md { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-stethoscope { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-suitcase { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-bell-alt { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-coffee { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-food { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-file-text-alt { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-building { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-hospital { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-ambulance { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-medkit { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-fighter-jet { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-beer { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-h-sign { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-plus-sign-alt { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-double-angle-left { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-double-angle-right { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-double-angle-up { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-double-angle-down { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-angle-left { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-angle-right { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-angle-up { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-angle-down { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-desktop { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-laptop { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-tablet { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-mobile-phone { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-circle-blank { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-quote-left { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-quote-right { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-spinner { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-circle { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-reply { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-mail-reply { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-github-alt { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-folder-close-alt { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-folder-open-alt { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-expand-alt { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-collapse-alt { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-smile { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-frown { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-meh { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-gamepad { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-keyboard { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-flag-alt { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-flag-checkered { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-terminal { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-code { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-reply-all { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-mail-reply-all { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-star-half-empty { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-star-half-full { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-location-arrow { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-crop { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-code-fork { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-unlink { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-question { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-info { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-exclamation { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-superscript { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-subscript { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-eraser { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-puzzle-piece { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-microphone { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-microphone-off { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-shield { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-calendar-empty { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-fire-extinguisher { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-rocket { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-maxcdn { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-chevron-sign-left { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-chevron-sign-right { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-chevron-sign-up { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-chevron-sign-down { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-html5 { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-css3 { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-anchor { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-unlock-alt { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-bullseye { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-ellipsis-horizontal { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-ellipsis-vertical { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-rss-sign { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-play-sign { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-ticket { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-minus-sign-alt { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-check-minus { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-level-up { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-level-down { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-check-sign { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-edit-sign { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-external-link-sign { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-share-sign { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-compass { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-collapse { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-collapse-top { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-expand { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-eur { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-euro { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-gbp { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-usd { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-dollar { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-inr { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-rupee { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-jpy { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-yen { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-cny { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-renminbi { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-krw { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-won { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-btc { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-bitcoin { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-file { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-file-text { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-sort-by-alphabet { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-sort-by-alphabet-alt { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-sort-by-attributes { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-sort-by-attributes-alt { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-sort-by-order { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-sort-by-order-alt { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-thumbs-up { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-thumbs-down { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-youtube-sign { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-youtube { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-xing { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-xing-sign { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-youtube-play { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-dropbox { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-stackexchange { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-instagram { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-flickr { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-adn { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-bitbucket { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-bitbucket-sign { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-tumblr { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-tumblr-sign { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-long-arrow-down { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-long-arrow-up { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-long-arrow-left { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-long-arrow-right { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-apple { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-windows { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-android { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-linux { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-dribbble { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-skype { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-foursquare { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-trello { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-female { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-male { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-gittip { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-sun { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-moon { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-archive { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-bug { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-vk { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-weibo { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} +.icon-renren { + *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ''); +} diff --git a/ajax/libs/ink/2.3.1/css/ink-min.css b/ajax/libs/ink/2.3.1/css/ink-min.css new file mode 100644 index 000000000..a65df56c8 --- /dev/null +++ b/ajax/libs/ink/2.3.1/css/ink-min.css @@ -0,0 +1,1115 @@ + +*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box} +article,aside,details,figcaption,figure,footer,header,hgroup,nav,section,summary{display:block} +audio,canvas,video{display:inline-block} +audio:not([controls]){display:none;height:0} +[hidden]{display:none} +html{font-family:sans-serif;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%} +body{margin:0;-webkit-text-size-adjust:100%;-ms-text-size-adjust:none;height:100%} +a:focus{outline:thin dotted} +a:active,a:hover{outline:0} +h1,h2,h3,h4,h5,h6,p{margin:0} +h1{font-size:2em} +abbr[title]{border-bottom:1px dotted} +b,strong{font-weight:bold} +dfn{font-style:italic} +mark{background:#ff0;color:#000} +code,kbd,pre,samp{font-family:Ubuntu_monospaced,Monaco,'Andale Mono','Courier New',monospace;font-size:1em} +pre{white-space:pre;white-space:pre-wrap;word-wrap:break-word} +q{quotes:"\201C" "\201D" "\2018" "\2019"} +small{font-size:80%} +sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline} +sup{top:-0.5em} +sub{bottom:-0.25em} +img{border:0;width:auto;max-width:100%} +svg:not(:root){overflow:hidden} +figure{margin:0} +fieldset{border:1px solid #c0c0c0;margin:0;padding:0.35em 0.625em 0.75em} +legend{border:0;padding:0} +button,input,select,textarea{font-family:inherit;font-size:100%;margin:0} +button,input{line-height:normal} +button,html input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer} +button[disabled],input[disabled]{cursor:default} +input[type="checkbox"],input[type="radio"]{box-sizing:border-box;padding:0} +input[type="search"]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box} +input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none} +button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0} +textarea{overflow:auto;vertical-align:top} +table{border-collapse:collapse;border-spacing:0} +@font-face{font-family:'Ubuntu';src:url('../font/ubuntu-b-webfont.eot');src:local('Ubuntu bold'),local('Ubuntu'),url('../font/ubuntu-b-webfont.eot?#iefix') format('embedded-opentype'),url('../font/ubuntu-b-webfont.woff') format('woff'),url('../font/ubuntu-b-webfont.ttf') format('truetype'),url('../font/ubuntu-b-webfont.svg#ubuntubold') format('svg');font-weight:700;font-style:normal}@font-face{font-family:'Ubuntu';src:url('../font/ubuntu-bi-webfont.eot');src:local('Ubuntu bold italic'),local('Ubuntu'),url('../font/ubuntu-bi-webfont.eot?#iefix') format('embedded-opentype'),url('../font/ubuntu-bi-webfont.woff') format('woff'),url('../font/ubuntu-bi-webfont.ttf') format('truetype'),url('../font/ubuntu-bi-webfont.svg#ubuntubold_italic') format('svg');font-weight:700;font-style:italic}@font-face{font-family:'Ubuntu';src:url('../font/ubuntu-r-webfont.eot');src:local('Ubuntu'),url('../font/ubuntu-r-webfont.eot?#iefix') format('embedded-opentype'),url('../font/ubuntu-r-webfont.woff') format('woff'),url('../font/ubuntu-r-webfont.ttf') format('truetype'),url('../font/ubuntu-r-webfont.svg#ubunturegular') format('svg');font-weight:normal;font-style:normal}@font-face{font-family:'Ubuntu';src:url('../font/ubuntu-ri-webfont.eot');src:local('Ubuntu italic'),local('Ubuntu'),url('../font/ubuntu-ri-webfont.eot?#iefix') format('embedded-opentype'),url('../font/ubuntu-ri-webfont.woff') format('woff'),url('../font/ubuntu-ri-webfont.ttf') format('truetype'),url('../font/ubuntu-ri-webfont.svg#ubuntuitalic') format('svg');font-weight:normal;font-style:italic}@font-face{font-family:'Ubuntu_condensed';src:url('../font/ubuntu-c-webfont.eot');src:local('Ubuntu Condensed'),url('../font/ubuntu-c-webfont.eot?#iefix') format('embedded-opentype'),url('../font/ubuntu-c-webfont.woff') format('woff'),url('../font/ubuntu-c-webfont.ttf') format('truetype'),url('../font/ubuntu-c-webfont.svg#ubuntu_condensedregular') format('svg');font-weight:normal;font-style:normal}@font-face{font-family:'Ubuntu_light';src:url('../font/ubuntu-l-webfont.eot');src:local('Ubuntu Light'),url('../font/ubuntu-l-webfont.eot?#iefix') format('embedded-opentype'),url('../font/ubuntu-l-webfont.woff') format('woff'),url('../font/ubuntu-l-webfont.ttf') format('truetype'),url('../font/ubuntu-l-webfont.svg#ubuntu_lightregular') format('svg');font-weight:normal;font-style:normal}@font-face{font-family:'Ubuntu_light';src:url('../font/ubuntu-li-webfont.eot');src:local('Ubuntu Light'),url('../font/ubuntu-li-webfont.eot?#iefix') format('embedded-opentype'),url('../font/ubuntu-li-webfont.woff') format('woff'),url('../font/ubuntu-li-webfont.ttf') format('truetype'),url('../font/ubuntu-li-webfont.svg#ubuntu_lightitalic') format('svg');font-weight:normal;font-style:italic}@font-face{font-family:'Ubuntu_light';src:url('../font/ubuntu-m-webfont.eot');src:local('Ubuntu Light'),url('../font/ubuntu-m-webfont.eot?#iefix') format('embedded-opentype'),url('../font/ubuntu-m-webfont.woff') format('woff'),url('../font/ubuntu-m-webfont.ttf') format('truetype'),url('../font/ubuntu-m-webfont.svg#ubuntu_lightbold') format('svg');font-weight:700;font-style:normal}@font-face{font-family:'Ubuntu_light';src:url('../font/ubuntu-mi-webfont.eot');src:local('Ubuntu Light'),url('../font/ubuntu-mi-webfont.eot?#iefix') format('embedded-opentype'),url('../font/ubuntu-mi-webfont.woff') format('woff'),url('../font/ubuntu-mi-webfont.ttf') format('truetype'),url('../font/ubuntu-mi-webfont.svg#ubuntu_lightbold_italic') format('svg');font-weight:700;font-style:italic}@font-face{font-family:'Ubuntu_monospaced';src:url('../font/ubuntumono-b-webfont.eot');src:local('Ubuntu Mono'),url('../font/ubuntumono-b-webfont.eot?#iefix') format('embedded-opentype'),url('../font/ubuntumono-b-webfont.woff') format('woff'),url('../font/ubuntumono-b-webfont.ttf') format('truetype'),url('../font/ubuntumono-b-webfont.svg#ubuntu_monobold') format('svg');font-weight:700;font-style:normal}@font-face{font-family:'Ubuntu_monospaced';src:url('../font/ubuntumono-bi-webfont.eot');src:local('Ubuntu Mono'),url('../font/ubuntumono-bi-webfont.eot?#iefix') format('embedded-opentype'),url('../font/ubuntumono-bi-webfont.woff') format('woff'),url('../font/ubuntumono-bi-webfont.ttf') format('truetype'),url('../font/ubuntumono-bi-webfont.svg#ubuntu_monobold_italic') format('svg');font-weight:700;font-style:italic}@font-face{font-family:'Ubuntu_monospaced';src:url('../font/ubuntumono-r-webfont.eot');src:local('Ubuntu Mono'),url('../font/ubuntumono-r-webfont.eot?#iefix') format('embedded-opentype'),url('../font/ubuntumono-r-webfont.woff') format('woff'),url('../font/ubuntumono-r-webfont.ttf') format('truetype'),url('../font/ubuntumono-r-webfont.svg#ubuntu_monoregular') format('svg');font-weight:normal;font-style:normal}@font-face{font-family:'Ubuntu_monospaced';src:url('../font/ubuntumono-ri-webfont.eot');src:local('Ubuntu Mono'),url('../font/ubuntumono-ri-webfont.eot?#iefix') format('embedded-opentype'),url('../font/ubuntumono-ri-webfont.woff') format('woff'),url('../font/ubuntumono-ri-webfont.ttf') format('truetype'),url('../font/ubuntumono-ri-webfont.svg#ubuntu_monoitalic') format('svg');font-weight:normal;font-style:italic} +body{color:#555;font-family:Ubuntu,Arial,sans-serif} +.sans{font-family:Ubuntu,Arial,sans-serif} +.serif{font-family:Times,"Times New Roman",serif} +a{color:#0069d6;text-decoration:none}a:hover{color:#007ed5;text-decoration:underline} +h1,h2,h3,h4,h5,h6{color:#404040} +h1{font-size:2.5em} +h2{font-size:2em} +h3{font-size:1.715em} +h4{font-size:1.438em} +h5{font-size:1.25em} +h6{font-size:1em} +h1 small{font-size:.6em;color:#BFBFBF;font-weight:100} +small{color:#a2a2a2;font-size:.6em} +p{line-height:1.5} +p,pre{margin:1em 0} +blockquote{margin:1.5em 40px} +h1{line-height:1.25em} +h2{line-height:1.5em} +h3{line-height:1.45775em} +h4{line-height:1.3660999999999999em} +h5{line-height:1.3125em} +h6{line-height:1.15em} +input,textarea{color:#666} +h1 small,h2 small,h3 small,h4 small{color:#bbb;font-size:.6em;font-weight:100;line-height:1} +address{color:#888;font-size:1em;line-height:1.4}address p{margin-top:0} +address h6{color:#555} +abbr:hover{cursor:help} +blockquote{border-left:4px solid #ddd;padding-left:1em;margin:1em 0;font-weight:200;font-size:1.1em}blockquote small{font-size:.9em}blockquote small::before,blockquote small::after{content:' — '} +ul,ol,dl{padding-left:1.4em;margin:0} +ul.unstyled{list-style:none;padding-left:0em} +ul.unstyled ul{list-style:disc outside;padding-left:1.4em} +ol>li{list-style:decimal outside} +dl{padding:0em} +dl dt{font-weight:bold;margin-top:.7em} +dl dd{padding-left:1em;margin:.5em 0} +ul,ol{line-height:1.4;margin:0;padding-left:1.4em}ul li,ol li{margin:.5em 0} +ul.inline li,ol.inline li{float:left} +.note{font-size:.9em;color:#888}.note strong{color:#555} +.small{font-size:0.75em} +.medium{font-size:0.85em} +.large{font-size:1.2em} +.extralarge{font-size:1.45em !important} +hr{border:0;border-top:1px solid #ddd;margin:1em 0} +.lead{font-size:1.1em;font-weight:bold} +.ink-label{padding:.2em .5em;color:white;white-space:nowrap;font-weight:bold;border-radius:2px;text-shadow:0 -1px 0 rgba(0,0,0,0.25)}.ink-label.success{background-color:#4a9b17}.ink-label.success.invert{color:#4a9b17;background-color:transparent;text-shadow:none;padding:0} +.ink-label.warning{background-color:#ff9c00}.ink-label.warning.invert{color:#ff9c00;background-color:transparent;text-shadow:none;padding:0} +.ink-label.error{background-color:#c91111}.ink-label.error.invert{color:#c91111;background-color:transparent;text-shadow:none;padding:0} +.ink-label.info{background-color:#0f75da}.ink-label.info.invert{color:#0f75da;background-color:transparent;text-shadow:none;padding:0} +footer{border-top:1px solid #ccc;background:#f0f0f0;overflow:hidden;bottom:0} +@font-face{font-family:'FontAwesome';src:url('../font/fontawesome-webfont.eot?v=3.2.1');src:url('../font/fontawesome-webfont.eot?#iefix&v=3.2.1') format('embedded-opentype'),url('../font/fontawesome-webfont.woff?v=3.2.1') format('woff'),url('../font/fontawesome-webfont.ttf?v=3.2.1') format('truetype'),url('../font/fontawesome-webfont.svg#fontawesomeregular?v=3.2.1') format('svg');font-weight:normal;font-style:normal}[class^="icon-"],[class*=" icon-"]{font-family:FontAwesome;font-weight:normal;font-style:normal;font-size:14px;text-decoration:inherit;-webkit-font-smoothing:antialiased;*margin-right:.3em} +[class^="icon-"]:before,[class*=" icon-"]:before{text-decoration:inherit;display:inline-block;speak:none} +.icon-large:before{font-size:1.3333333333333333em} +a [class^="icon-"],a [class*=" icon-"]{display:inline} +[class^="icon-"].icon-fixed-width,[class*=" icon-"].icon-fixed-width{display:inline-block;width:1.1428571428571428em;text-align:right;padding-right:.2857142857142857em}[class^="icon-"].icon-fixed-width.icon-large,[class*=" icon-"].icon-fixed-width.icon-large{width:1.4285714285714286em} +.icons-ul{margin-left:2.142857142857143em;list-style-type:none}.icons-ul>li{position:relative} +.icons-ul .icon-li{position:absolute;left:-2.142857142857143em;width:2.142857142857143em;text-align:center;line-height:inherit} +[class^="icon-"].hide,[class*=" icon-"].hide{display:none} +.icon-muted{color:#eee} +.icon-light{color:#fff} +.icon-dark{color:#333} +.icon-border{border:solid 1px #eee;padding:.2em .25em .15em;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px} +.icon-2x{font-size:2em}.icon-2x.icon-border{border-width:2px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px} +.icon-3x{font-size:3em}.icon-3x.icon-border{border-width:3px;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px} +.icon-4x{font-size:4em}.icon-4x.icon-border{border-width:4px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px} +.icon-5x{font-size:5em}.icon-5x.icon-border{border-width:5px;-webkit-border-radius:7px;-moz-border-radius:7px;border-radius:7px} +.pull-right{float:right} +.pull-left{float:left} +[class^="icon-"].pull-left,[class*=" icon-"].pull-left{margin-right:.3em} +[class^="icon-"].pull-right,[class*=" icon-"].pull-right{margin-left:.3em} +.icon-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:-35%}.icon-stack [class^="icon-"],.icon-stack [class*=" icon-"]{display:block;text-align:center;position:absolute;width:100%;height:100%;font-size:1em;line-height:inherit;*line-height:2em} +.icon-stack .icon-stack-base{font-size:2em;*line-height:1em} +.icon-spin{display:inline-block;-moz-animation:spin 2s infinite linear;-o-animation:spin 2s infinite linear;-webkit-animation:spin 2s infinite linear;animation:spin 2s infinite linear} +a .icon-stack,a .icon-spin{display:inline-block;text-decoration:none} +@-moz-keyframes spin{0%{-moz-transform:rotate(0deg)} 100%{-moz-transform:rotate(359deg)}}@-webkit-keyframes spin{0%{-webkit-transform:rotate(0deg)} 100%{-webkit-transform:rotate(359deg)}}@-o-keyframes spin{0%{-o-transform:rotate(0deg)} 100%{-o-transform:rotate(359deg)}}@-ms-keyframes spin{0%{-ms-transform:rotate(0deg)} 100%{-ms-transform:rotate(359deg)}}@keyframes spin{0%{transform:rotate(0deg)} 100%{transform:rotate(359deg)}}.icon-rotate-90:before{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg);filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=1)} +.icon-rotate-180:before{-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg);filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2)} +.icon-rotate-270:before{-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg);-ms-transform:rotate(270deg);-o-transform:rotate(270deg);transform:rotate(270deg);filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=3)} +.icon-flip-horizontal:before{-webkit-transform:scale(-1, 1);-moz-transform:scale(-1, 1);-ms-transform:scale(-1, 1);-o-transform:scale(-1, 1);transform:scale(-1, 1)} +.icon-flip-vertical:before{-webkit-transform:scale(1, -1);-moz-transform:scale(1, -1);-ms-transform:scale(1, -1);-o-transform:scale(1, -1);transform:scale(1, -1)} +a .icon-rotate-90:before,a .icon-rotate-180:before,a .icon-rotate-270:before,a .icon-flip-horizontal:before,a .icon-flip-vertical:before{display:inline-block} +.icon-glass:before{content:"\f000"} +.icon-music:before{content:"\f001"} +.icon-search:before{content:"\f002"} +.icon-envelope-alt:before{content:"\f003"} +.icon-heart:before{content:"\f004"} +.icon-star:before{content:"\f005"} +.icon-star-empty:before{content:"\f006"} +.icon-user:before{content:"\f007"} +.icon-film:before{content:"\f008"} +.icon-th-large:before{content:"\f009"} +.icon-th:before{content:"\f00a"} +.icon-th-list:before{content:"\f00b"} +.icon-ok:before{content:"\f00c"} +.icon-remove:before{content:"\f00d"} +.icon-zoom-in:before{content:"\f00e"} +.icon-zoom-out:before{content:"\f010"} +.icon-power-off:before,.icon-off:before{content:"\f011"} +.icon-signal:before{content:"\f012"} +.icon-gear:before,.icon-cog:before{content:"\f013"} +.icon-trash:before{content:"\f014"} +.icon-home:before{content:"\f015"} +.icon-file-alt:before{content:"\f016"} +.icon-time:before{content:"\f017"} +.icon-road:before{content:"\f018"} +.icon-download-alt:before{content:"\f019"} +.icon-download:before{content:"\f01a"} +.icon-upload:before{content:"\f01b"} +.icon-inbox:before{content:"\f01c"} +.icon-play-circle:before{content:"\f01d"} +.icon-rotate-right:before,.icon-repeat:before{content:"\f01e"} +.icon-refresh:before{content:"\f021"} +.icon-list-alt:before{content:"\f022"} +.icon-lock:before{content:"\f023"} +.icon-flag:before{content:"\f024"} +.icon-headphones:before{content:"\f025"} +.icon-volume-off:before{content:"\f026"} +.icon-volume-down:before{content:"\f027"} +.icon-volume-up:before{content:"\f028"} +.icon-qrcode:before{content:"\f029"} +.icon-barcode:before{content:"\f02a"} +.icon-tag:before{content:"\f02b"} +.icon-tags:before{content:"\f02c"} +.icon-book:before{content:"\f02d"} +.icon-bookmark:before{content:"\f02e"} +.icon-print:before{content:"\f02f"} +.icon-camera:before{content:"\f030"} +.icon-font:before{content:"\f031"} +.icon-bold:before{content:"\f032"} +.icon-italic:before{content:"\f033"} +.icon-text-height:before{content:"\f034"} +.icon-text-width:before{content:"\f035"} +.icon-align-left:before{content:"\f036"} +.icon-align-center:before{content:"\f037"} +.icon-align-right:before{content:"\f038"} +.icon-align-justify:before{content:"\f039"} +.icon-list:before{content:"\f03a"} +.icon-indent-left:before{content:"\f03b"} +.icon-indent-right:before{content:"\f03c"} +.icon-facetime-video:before{content:"\f03d"} +.icon-picture:before{content:"\f03e"} +.icon-pencil:before{content:"\f040"} +.icon-map-marker:before{content:"\f041"} +.icon-adjust:before{content:"\f042"} +.icon-tint:before{content:"\f043"} +.icon-edit:before{content:"\f044"} +.icon-share:before{content:"\f045"} +.icon-check:before{content:"\f046"} +.icon-move:before{content:"\f047"} +.icon-step-backward:before{content:"\f048"} +.icon-fast-backward:before{content:"\f049"} +.icon-backward:before{content:"\f04a"} +.icon-play:before{content:"\f04b"} +.icon-pause:before{content:"\f04c"} +.icon-stop:before{content:"\f04d"} +.icon-forward:before{content:"\f04e"} +.icon-fast-forward:before{content:"\f050"} +.icon-step-forward:before{content:"\f051"} +.icon-eject:before{content:"\f052"} +.icon-chevron-left:before{content:"\f053"} +.icon-chevron-right:before{content:"\f054"} +.icon-plus-sign:before{content:"\f055"} +.icon-minus-sign:before{content:"\f056"} +.icon-remove-sign:before{content:"\f057"} +.icon-ok-sign:before{content:"\f058"} +.icon-question-sign:before{content:"\f059"} +.icon-info-sign:before{content:"\f05a"} +.icon-screenshot:before{content:"\f05b"} +.icon-remove-circle:before{content:"\f05c"} +.icon-ok-circle:before{content:"\f05d"} +.icon-ban-circle:before{content:"\f05e"} +.icon-arrow-left:before{content:"\f060"} +.icon-arrow-right:before{content:"\f061"} +.icon-arrow-up:before{content:"\f062"} +.icon-arrow-down:before{content:"\f063"} +.icon-mail-forward:before,.icon-share-alt:before{content:"\f064"} +.icon-resize-full:before{content:"\f065"} +.icon-resize-small:before{content:"\f066"} +.icon-plus:before{content:"\f067"} +.icon-minus:before{content:"\f068"} +.icon-asterisk:before{content:"\f069"} +.icon-exclamation-sign:before{content:"\f06a"} +.icon-gift:before{content:"\f06b"} +.icon-leaf:before{content:"\f06c"} +.icon-fire:before{content:"\f06d"} +.icon-eye-open:before{content:"\f06e"} +.icon-eye-close:before{content:"\f070"} +.icon-warning-sign:before{content:"\f071"} +.icon-plane:before{content:"\f072"} +.icon-calendar:before{content:"\f073"} +.icon-random:before{content:"\f074"} +.icon-comment:before{content:"\f075"} +.icon-magnet:before{content:"\f076"} +.icon-chevron-up:before{content:"\f077"} +.icon-chevron-down:before{content:"\f078"} +.icon-retweet:before{content:"\f079"} +.icon-shopping-cart:before{content:"\f07a"} +.icon-folder-close:before{content:"\f07b"} +.icon-folder-open:before{content:"\f07c"} +.icon-resize-vertical:before{content:"\f07d"} +.icon-resize-horizontal:before{content:"\f07e"} +.icon-bar-chart:before{content:"\f080"} +.icon-twitter-sign:before{content:"\f081"} +.icon-facebook-sign:before{content:"\f082"} +.icon-camera-retro:before{content:"\f083"} +.icon-key:before{content:"\f084"} +.icon-gears:before,.icon-cogs:before{content:"\f085"} +.icon-comments:before{content:"\f086"} +.icon-thumbs-up-alt:before{content:"\f087"} +.icon-thumbs-down-alt:before{content:"\f088"} +.icon-star-half:before{content:"\f089"} +.icon-heart-empty:before{content:"\f08a"} +.icon-signout:before{content:"\f08b"} +.icon-linkedin-sign:before{content:"\f08c"} +.icon-pushpin:before{content:"\f08d"} +.icon-external-link:before{content:"\f08e"} +.icon-signin:before{content:"\f090"} +.icon-trophy:before{content:"\f091"} +.icon-github-sign:before{content:"\f092"} +.icon-upload-alt:before{content:"\f093"} +.icon-lemon:before{content:"\f094"} +.icon-phone:before{content:"\f095"} +.icon-unchecked:before,.icon-check-empty:before{content:"\f096"} +.icon-bookmark-empty:before{content:"\f097"} +.icon-phone-sign:before{content:"\f098"} +.icon-twitter:before{content:"\f099"} +.icon-facebook:before{content:"\f09a"} +.icon-github:before{content:"\f09b"} +.icon-unlock:before{content:"\f09c"} +.icon-credit-card:before{content:"\f09d"} +.icon-rss:before{content:"\f09e"} +.icon-hdd:before{content:"\f0a0"} +.icon-bullhorn:before{content:"\f0a1"} +.icon-bell:before{content:"\f0a2"} +.icon-certificate:before{content:"\f0a3"} +.icon-hand-right:before{content:"\f0a4"} +.icon-hand-left:before{content:"\f0a5"} +.icon-hand-up:before{content:"\f0a6"} +.icon-hand-down:before{content:"\f0a7"} +.icon-circle-arrow-left:before{content:"\f0a8"} +.icon-circle-arrow-right:before{content:"\f0a9"} +.icon-circle-arrow-up:before{content:"\f0aa"} +.icon-circle-arrow-down:before{content:"\f0ab"} +.icon-globe:before{content:"\f0ac"} +.icon-wrench:before{content:"\f0ad"} +.icon-tasks:before{content:"\f0ae"} +.icon-filter:before{content:"\f0b0"} +.icon-briefcase:before{content:"\f0b1"} +.icon-fullscreen:before{content:"\f0b2"} +.icon-group:before{content:"\f0c0"} +.icon-link:before{content:"\f0c1"} +.icon-cloud:before{content:"\f0c2"} +.icon-beaker:before{content:"\f0c3"} +.icon-cut:before{content:"\f0c4"} +.icon-copy:before{content:"\f0c5"} +.icon-paperclip:before,.icon-paper-clip:before{content:"\f0c6"} +.icon-save:before{content:"\f0c7"} +.icon-sign-blank:before{content:"\f0c8"} +.icon-reorder:before{content:"\f0c9"} +.icon-list-ul:before{content:"\f0ca"} +.icon-list-ol:before{content:"\f0cb"} +.icon-strikethrough:before{content:"\f0cc"} +.icon-underline:before{content:"\f0cd"} +.icon-table:before{content:"\f0ce"} +.icon-magic:before{content:"\f0d0"} +.icon-truck:before{content:"\f0d1"} +.icon-pinterest:before{content:"\f0d2"} +.icon-pinterest-sign:before{content:"\f0d3"} +.icon-google-plus-sign:before{content:"\f0d4"} +.icon-google-plus:before{content:"\f0d5"} +.icon-money:before{content:"\f0d6"} +.icon-caret-down:before{content:"\f0d7"} +.icon-caret-up:before{content:"\f0d8"} +.icon-caret-left:before{content:"\f0d9"} +.icon-caret-right:before{content:"\f0da"} +.icon-columns:before{content:"\f0db"} +.icon-sort:before{content:"\f0dc"} +.icon-sort-down:before{content:"\f0dd"} +.icon-sort-up:before{content:"\f0de"} +.icon-envelope:before{content:"\f0e0"} +.icon-linkedin:before{content:"\f0e1"} +.icon-rotate-left:before,.icon-undo:before{content:"\f0e2"} +.icon-legal:before{content:"\f0e3"} +.icon-dashboard:before{content:"\f0e4"} +.icon-comment-alt:before{content:"\f0e5"} +.icon-comments-alt:before{content:"\f0e6"} +.icon-bolt:before{content:"\f0e7"} +.icon-sitemap:before{content:"\f0e8"} +.icon-umbrella:before{content:"\f0e9"} +.icon-paste:before{content:"\f0ea"} +.icon-lightbulb:before{content:"\f0eb"} +.icon-exchange:before{content:"\f0ec"} +.icon-cloud-download:before{content:"\f0ed"} +.icon-cloud-upload:before{content:"\f0ee"} +.icon-user-md:before{content:"\f0f0"} +.icon-stethoscope:before{content:"\f0f1"} +.icon-suitcase:before{content:"\f0f2"} +.icon-bell-alt:before{content:"\f0f3"} +.icon-coffee:before{content:"\f0f4"} +.icon-food:before{content:"\f0f5"} +.icon-file-text-alt:before{content:"\f0f6"} +.icon-building:before{content:"\f0f7"} +.icon-hospital:before{content:"\f0f8"} +.icon-ambulance:before{content:"\f0f9"} +.icon-medkit:before{content:"\f0fa"} +.icon-fighter-jet:before{content:"\f0fb"} +.icon-beer:before{content:"\f0fc"} +.icon-h-sign:before{content:"\f0fd"} +.icon-plus-sign-alt:before{content:"\f0fe"} +.icon-double-angle-left:before{content:"\f100"} +.icon-double-angle-right:before{content:"\f101"} +.icon-double-angle-up:before{content:"\f102"} +.icon-double-angle-down:before{content:"\f103"} +.icon-angle-left:before{content:"\f104"} +.icon-angle-right:before{content:"\f105"} +.icon-angle-up:before{content:"\f106"} +.icon-angle-down:before{content:"\f107"} +.icon-desktop:before{content:"\f108"} +.icon-laptop:before{content:"\f109"} +.icon-tablet:before{content:"\f10a"} +.icon-mobile-phone:before{content:"\f10b"} +.icon-circle-blank:before{content:"\f10c"} +.icon-quote-left:before{content:"\f10d"} +.icon-quote-right:before{content:"\f10e"} +.icon-spinner:before{content:"\f110"} +.icon-circle:before{content:"\f111"} +.icon-mail-reply:before,.icon-reply:before{content:"\f112"} +.icon-github-alt:before{content:"\f113"} +.icon-folder-close-alt:before{content:"\f114"} +.icon-folder-open-alt:before{content:"\f115"} +.icon-expand-alt:before{content:"\f116"} +.icon-collapse-alt:before{content:"\f117"} +.icon-smile:before{content:"\f118"} +.icon-frown:before{content:"\f119"} +.icon-meh:before{content:"\f11a"} +.icon-gamepad:before{content:"\f11b"} +.icon-keyboard:before{content:"\f11c"} +.icon-flag-alt:before{content:"\f11d"} +.icon-flag-checkered:before{content:"\f11e"} +.icon-terminal:before{content:"\f120"} +.icon-code:before{content:"\f121"} +.icon-reply-all:before{content:"\f122"} +.icon-mail-reply-all:before{content:"\f122"} +.icon-star-half-full:before,.icon-star-half-empty:before{content:"\f123"} +.icon-location-arrow:before{content:"\f124"} +.icon-crop:before{content:"\f125"} +.icon-code-fork:before{content:"\f126"} +.icon-unlink:before{content:"\f127"} +.icon-question:before{content:"\f128"} +.icon-info:before{content:"\f129"} +.icon-exclamation:before{content:"\f12a"} +.icon-superscript:before{content:"\f12b"} +.icon-subscript:before{content:"\f12c"} +.icon-eraser:before{content:"\f12d"} +.icon-puzzle-piece:before{content:"\f12e"} +.icon-microphone:before{content:"\f130"} +.icon-microphone-off:before{content:"\f131"} +.icon-shield:before{content:"\f132"} +.icon-calendar-empty:before{content:"\f133"} +.icon-fire-extinguisher:before{content:"\f134"} +.icon-rocket:before{content:"\f135"} +.icon-maxcdn:before{content:"\f136"} +.icon-chevron-sign-left:before{content:"\f137"} +.icon-chevron-sign-right:before{content:"\f138"} +.icon-chevron-sign-up:before{content:"\f139"} +.icon-chevron-sign-down:before{content:"\f13a"} +.icon-html5:before{content:"\f13b"} +.icon-css3:before{content:"\f13c"} +.icon-anchor:before{content:"\f13d"} +.icon-unlock-alt:before{content:"\f13e"} +.icon-bullseye:before{content:"\f140"} +.icon-ellipsis-horizontal:before{content:"\f141"} +.icon-ellipsis-vertical:before{content:"\f142"} +.icon-rss-sign:before{content:"\f143"} +.icon-play-sign:before{content:"\f144"} +.icon-ticket:before{content:"\f145"} +.icon-minus-sign-alt:before{content:"\f146"} +.icon-check-minus:before{content:"\f147"} +.icon-level-up:before{content:"\f148"} +.icon-level-down:before{content:"\f149"} +.icon-check-sign:before{content:"\f14a"} +.icon-edit-sign:before{content:"\f14b"} +.icon-external-link-sign:before{content:"\f14c"} +.icon-share-sign:before{content:"\f14d"} +.icon-compass:before{content:"\f14e"} +.icon-collapse:before{content:"\f150"} +.icon-collapse-top:before{content:"\f151"} +.icon-expand:before{content:"\f152"} +.icon-euro:before,.icon-eur:before{content:"\f153"} +.icon-gbp:before{content:"\f154"} +.icon-dollar:before,.icon-usd:before{content:"\f155"} +.icon-rupee:before,.icon-inr:before{content:"\f156"} +.icon-yen:before,.icon-jpy:before{content:"\f157"} +.icon-renminbi:before,.icon-cny:before{content:"\f158"} +.icon-won:before,.icon-krw:before{content:"\f159"} +.icon-bitcoin:before,.icon-btc:before{content:"\f15a"} +.icon-file:before{content:"\f15b"} +.icon-file-text:before{content:"\f15c"} +.icon-sort-by-alphabet:before{content:"\f15d"} +.icon-sort-by-alphabet-alt:before{content:"\f15e"} +.icon-sort-by-attributes:before{content:"\f160"} +.icon-sort-by-attributes-alt:before{content:"\f161"} +.icon-sort-by-order:before{content:"\f162"} +.icon-sort-by-order-alt:before{content:"\f163"} +.icon-thumbs-up:before{content:"\f164"} +.icon-thumbs-down:before{content:"\f165"} +.icon-youtube-sign:before{content:"\f166"} +.icon-youtube:before{content:"\f167"} +.icon-xing:before{content:"\f168"} +.icon-xing-sign:before{content:"\f169"} +.icon-youtube-play:before{content:"\f16a"} +.icon-dropbox:before{content:"\f16b"} +.icon-stackexchange:before{content:"\f16c"} +.icon-instagram:before{content:"\f16d"} +.icon-flickr:before{content:"\f16e"} +.icon-adn:before{content:"\f170"} +.icon-bitbucket:before{content:"\f171"} +.icon-bitbucket-sign:before{content:"\f172"} +.icon-tumblr:before{content:"\f173"} +.icon-tumblr-sign:before{content:"\f174"} +.icon-long-arrow-down:before{content:"\f175"} +.icon-long-arrow-up:before{content:"\f176"} +.icon-long-arrow-left:before{content:"\f177"} +.icon-long-arrow-right:before{content:"\f178"} +.icon-apple:before{content:"\f179"} +.icon-windows:before{content:"\f17a"} +.icon-android:before{content:"\f17b"} +.icon-linux:before{content:"\f17c"} +.icon-dribbble:before{content:"\f17d"} +.icon-skype:before{content:"\f17e"} +.icon-foursquare:before{content:"\f180"} +.icon-trello:before{content:"\f181"} +.icon-female:before{content:"\f182"} +.icon-male:before{content:"\f183"} +.icon-gittip:before{content:"\f184"} +.icon-sun:before{content:"\f185"} +.icon-moon:before{content:"\f186"} +.icon-archive:before{content:"\f187"} +.icon-bug:before{content:"\f188"} +.icon-vk:before{content:"\f189"} +.icon-weibo:before{content:"\f18a"} +.icon-renren:before{content:"\f18b"} +@charset "UTF-8"; +.animated{-webkit-animation-duration:1s;animation-duration:1s;-webkit-animation-fill-mode:both;animation-fill-mode:both} +.animated.hinge{-webkit-animation-duration:2s;animation-duration:2s} +@-webkit-keyframes bounce{0%,20%,50%,80%,100%{-webkit-transform:translateY(0);transform:translateY(0)} 40%{-webkit-transform:translateY(-30px);transform:translateY(-30px)} 60%{-webkit-transform:translateY(-15px);transform:translateY(-15px)}}@keyframes bounce{0%,20%,50%,80%,100%{-webkit-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0)} 40%{-webkit-transform:translateY(-30px);-ms-transform:translateY(-30px);transform:translateY(-30px)} 60%{-webkit-transform:translateY(-15px);-ms-transform:translateY(-15px);transform:translateY(-15px)}}.bounce{-webkit-animation-name:bounce;animation-name:bounce} +@-webkit-keyframes flash{0%,50%,100%{opacity:1} 25%,75%{opacity:0}}@keyframes flash{0%,50%,100%{opacity:1} 25%,75%{opacity:0}}.flash{-webkit-animation-name:flash;animation-name:flash} +@-webkit-keyframes pulse{0%{-webkit-transform:scale(1);transform:scale(1)} 50%{-webkit-transform:scale(1.1);transform:scale(1.1)} 100%{-webkit-transform:scale(1);transform:scale(1)}}@keyframes pulse{0%{-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1)} 50%{-webkit-transform:scale(1.1);-ms-transform:scale(1.1);transform:scale(1.1)} 100%{-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1)}}.pulse{-webkit-animation-name:pulse;animation-name:pulse} +@-webkit-keyframes shake{0%,100%{-webkit-transform:translateX(0);transform:translateX(0)} 10%,30%,50%,70%,90%{-webkit-transform:translateX(-10px);transform:translateX(-10px)} 20%,40%,60%,80%{-webkit-transform:translateX(10px);transform:translateX(10px)}}@keyframes shake{0%,100%{-webkit-transform:translateX(0);-ms-transform:translateX(0);transform:translateX(0)} 10%,30%,50%,70%,90%{-webkit-transform:translateX(-10px);-ms-transform:translateX(-10px);transform:translateX(-10px)} 20%,40%,60%,80%{-webkit-transform:translateX(10px);-ms-transform:translateX(10px);transform:translateX(10px)}}.shake{-webkit-animation-name:shake;animation-name:shake} +@-webkit-keyframes swing{20%{-webkit-transform:rotate(15deg);transform:rotate(15deg)} 40%{-webkit-transform:rotate(-10deg);transform:rotate(-10deg)} 60%{-webkit-transform:rotate(5deg);transform:rotate(5deg)} 80%{-webkit-transform:rotate(-5deg);transform:rotate(-5deg)} 100%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}}@keyframes swing{20%{-webkit-transform:rotate(15deg);-ms-transform:rotate(15deg);transform:rotate(15deg)} 40%{-webkit-transform:rotate(-10deg);-ms-transform:rotate(-10deg);transform:rotate(-10deg)} 60%{-webkit-transform:rotate(5deg);-ms-transform:rotate(5deg);transform:rotate(5deg)} 80%{-webkit-transform:rotate(-5deg);-ms-transform:rotate(-5deg);transform:rotate(-5deg)} 100%{-webkit-transform:rotate(0deg);-ms-transform:rotate(0deg);transform:rotate(0deg)}}.swing{-webkit-transform-origin:top center;-ms-transform-origin:top center;transform-origin:top center;-webkit-animation-name:swing;animation-name:swing} +@-webkit-keyframes tada{0%{-webkit-transform:scale(1);transform:scale(1)} 10%,20%{-webkit-transform:scale(.9) rotate(-3deg);transform:scale(.9) rotate(-3deg)} 30%,50%,70%,90%{-webkit-transform:scale(1.1) rotate(3deg);transform:scale(1.1) rotate(3deg)} 40%,60%,80%{-webkit-transform:scale(1.1) rotate(-3deg);transform:scale(1.1) rotate(-3deg)} 100%{-webkit-transform:scale(1) rotate(0);transform:scale(1) rotate(0)}}@keyframes tada{0%{-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1)} 10%,20%{-webkit-transform:scale(.9) rotate(-3deg);-ms-transform:scale(.9) rotate(-3deg);transform:scale(.9) rotate(-3deg)} 30%,50%,70%,90%{-webkit-transform:scale(1.1) rotate(3deg);-ms-transform:scale(1.1) rotate(3deg);transform:scale(1.1) rotate(3deg)} 40%,60%,80%{-webkit-transform:scale(1.1) rotate(-3deg);-ms-transform:scale(1.1) rotate(-3deg);transform:scale(1.1) rotate(-3deg)} 100%{-webkit-transform:scale(1) rotate(0);-ms-transform:scale(1) rotate(0);transform:scale(1) rotate(0)}}.tada{-webkit-animation-name:tada;animation-name:tada} +@-webkit-keyframes wobble{0%{-webkit-transform:translateX(0);transform:translateX(0)} 15%{-webkit-transform:translateX(-25%) rotate(-5deg);transform:translateX(-25%) rotate(-5deg)} 30%{-webkit-transform:translateX(20%) rotate(3deg);transform:translateX(20%) rotate(3deg)} 45%{-webkit-transform:translateX(-15%) rotate(-3deg);transform:translateX(-15%) rotate(-3deg)} 60%{-webkit-transform:translateX(10%) rotate(2deg);transform:translateX(10%) rotate(2deg)} 75%{-webkit-transform:translateX(-5%) rotate(-1deg);transform:translateX(-5%) rotate(-1deg)} 100%{-webkit-transform:translateX(0);transform:translateX(0)}}@keyframes wobble{0%{-webkit-transform:translateX(0);-ms-transform:translateX(0);transform:translateX(0)} 15%{-webkit-transform:translateX(-25%) rotate(-5deg);-ms-transform:translateX(-25%) rotate(-5deg);transform:translateX(-25%) rotate(-5deg)} 30%{-webkit-transform:translateX(20%) rotate(3deg);-ms-transform:translateX(20%) rotate(3deg);transform:translateX(20%) rotate(3deg)} 45%{-webkit-transform:translateX(-15%) rotate(-3deg);-ms-transform:translateX(-15%) rotate(-3deg);transform:translateX(-15%) rotate(-3deg)} 60%{-webkit-transform:translateX(10%) rotate(2deg);-ms-transform:translateX(10%) rotate(2deg);transform:translateX(10%) rotate(2deg)} 75%{-webkit-transform:translateX(-5%) rotate(-1deg);-ms-transform:translateX(-5%) rotate(-1deg);transform:translateX(-5%) rotate(-1deg)} 100%{-webkit-transform:translateX(0);-ms-transform:translateX(0);transform:translateX(0)}}.wobble{-webkit-animation-name:wobble;animation-name:wobble} +@-webkit-keyframes bounceIn{0%{opacity:0;-webkit-transform:scale(.3);transform:scale(.3)} 50%{opacity:1;-webkit-transform:scale(1.05);transform:scale(1.05)} 70%{-webkit-transform:scale(.9);transform:scale(.9)} 100%{-webkit-transform:scale(1);transform:scale(1)}}@keyframes bounceIn{0%{opacity:0;-webkit-transform:scale(.3);-ms-transform:scale(.3);transform:scale(.3)} 50%{opacity:1;-webkit-transform:scale(1.05);-ms-transform:scale(1.05);transform:scale(1.05)} 70%{-webkit-transform:scale(.9);-ms-transform:scale(.9);transform:scale(.9)} 100%{-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1)}}.bounceIn{-webkit-animation-name:bounceIn;animation-name:bounceIn} +@-webkit-keyframes bounceInDown{0%{opacity:0;-webkit-transform:translateY(-2000px);transform:translateY(-2000px)} 60%{opacity:1;-webkit-transform:translateY(30px);transform:translateY(30px)} 80%{-webkit-transform:translateY(-10px);transform:translateY(-10px)} 100%{-webkit-transform:translateY(0);transform:translateY(0)}}@keyframes bounceInDown{0%{opacity:0;-webkit-transform:translateY(-2000px);-ms-transform:translateY(-2000px);transform:translateY(-2000px)} 60%{opacity:1;-webkit-transform:translateY(30px);-ms-transform:translateY(30px);transform:translateY(30px)} 80%{-webkit-transform:translateY(-10px);-ms-transform:translateY(-10px);transform:translateY(-10px)} 100%{-webkit-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0)}}.bounceInDown{-webkit-animation-name:bounceInDown;animation-name:bounceInDown} +@-webkit-keyframes bounceInLeft{0%{opacity:0;-webkit-transform:translateX(-2000px);transform:translateX(-2000px)} 60%{opacity:1;-webkit-transform:translateX(30px);transform:translateX(30px)} 80%{-webkit-transform:translateX(-10px);transform:translateX(-10px)} 100%{-webkit-transform:translateX(0);transform:translateX(0)}}@keyframes bounceInLeft{0%{opacity:0;-webkit-transform:translateX(-2000px);-ms-transform:translateX(-2000px);transform:translateX(-2000px)} 60%{opacity:1;-webkit-transform:translateX(30px);-ms-transform:translateX(30px);transform:translateX(30px)} 80%{-webkit-transform:translateX(-10px);-ms-transform:translateX(-10px);transform:translateX(-10px)} 100%{-webkit-transform:translateX(0);-ms-transform:translateX(0);transform:translateX(0)}}.bounceInLeft{-webkit-animation-name:bounceInLeft;animation-name:bounceInLeft} +@-webkit-keyframes bounceInRight{0%{opacity:0;-webkit-transform:translateX(2000px);transform:translateX(2000px)} 60%{opacity:1;-webkit-transform:translateX(-30px);transform:translateX(-30px)} 80%{-webkit-transform:translateX(10px);transform:translateX(10px)} 100%{-webkit-transform:translateX(0);transform:translateX(0)}}@keyframes bounceInRight{0%{opacity:0;-webkit-transform:translateX(2000px);-ms-transform:translateX(2000px);transform:translateX(2000px)} 60%{opacity:1;-webkit-transform:translateX(-30px);-ms-transform:translateX(-30px);transform:translateX(-30px)} 80%{-webkit-transform:translateX(10px);-ms-transform:translateX(10px);transform:translateX(10px)} 100%{-webkit-transform:translateX(0);-ms-transform:translateX(0);transform:translateX(0)}}.bounceInRight{-webkit-animation-name:bounceInRight;animation-name:bounceInRight} +@-webkit-keyframes bounceInUp{0%{opacity:0;-webkit-transform:translateY(2000px);transform:translateY(2000px)} 60%{opacity:1;-webkit-transform:translateY(-30px);transform:translateY(-30px)} 80%{-webkit-transform:translateY(10px);transform:translateY(10px)} 100%{-webkit-transform:translateY(0);transform:translateY(0)}}@keyframes bounceInUp{0%{opacity:0;-webkit-transform:translateY(2000px);-ms-transform:translateY(2000px);transform:translateY(2000px)} 60%{opacity:1;-webkit-transform:translateY(-30px);-ms-transform:translateY(-30px);transform:translateY(-30px)} 80%{-webkit-transform:translateY(10px);-ms-transform:translateY(10px);transform:translateY(10px)} 100%{-webkit-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0)}}.bounceInUp{-webkit-animation-name:bounceInUp;animation-name:bounceInUp} +@-webkit-keyframes bounceOut{0%{-webkit-transform:scale(1);transform:scale(1)} 25%{-webkit-transform:scale(.95);transform:scale(.95)} 50%{opacity:1;-webkit-transform:scale(1.1);transform:scale(1.1)} 100%{opacity:0;-webkit-transform:scale(.3);transform:scale(.3)}}@keyframes bounceOut{0%{-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1)} 25%{-webkit-transform:scale(.95);-ms-transform:scale(.95);transform:scale(.95)} 50%{opacity:1;-webkit-transform:scale(1.1);-ms-transform:scale(1.1);transform:scale(1.1)} 100%{opacity:0;-webkit-transform:scale(.3);-ms-transform:scale(.3);transform:scale(.3)}}.bounceOut{-webkit-animation-name:bounceOut;animation-name:bounceOut} +@-webkit-keyframes bounceOutDown{0%{-webkit-transform:translateY(0);transform:translateY(0)} 20%{opacity:1;-webkit-transform:translateY(-20px);transform:translateY(-20px)} 100%{opacity:0;-webkit-transform:translateY(2000px);transform:translateY(2000px)}}@keyframes bounceOutDown{0%{-webkit-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0)} 20%{opacity:1;-webkit-transform:translateY(-20px);-ms-transform:translateY(-20px);transform:translateY(-20px)} 100%{opacity:0;-webkit-transform:translateY(2000px);-ms-transform:translateY(2000px);transform:translateY(2000px)}}.bounceOutDown{-webkit-animation-name:bounceOutDown;animation-name:bounceOutDown} +@-webkit-keyframes bounceOutLeft{0%{-webkit-transform:translateX(0);transform:translateX(0)} 20%{opacity:1;-webkit-transform:translateX(20px);transform:translateX(20px)} 100%{opacity:0;-webkit-transform:translateX(-2000px);transform:translateX(-2000px)}}@keyframes bounceOutLeft{0%{-webkit-transform:translateX(0);-ms-transform:translateX(0);transform:translateX(0)} 20%{opacity:1;-webkit-transform:translateX(20px);-ms-transform:translateX(20px);transform:translateX(20px)} 100%{opacity:0;-webkit-transform:translateX(-2000px);-ms-transform:translateX(-2000px);transform:translateX(-2000px)}}.bounceOutLeft{-webkit-animation-name:bounceOutLeft;animation-name:bounceOutLeft} +@-webkit-keyframes bounceOutRight{0%{-webkit-transform:translateX(0);transform:translateX(0)} 20%{opacity:1;-webkit-transform:translateX(-20px);transform:translateX(-20px)} 100%{opacity:0;-webkit-transform:translateX(2000px);transform:translateX(2000px)}}@keyframes bounceOutRight{0%{-webkit-transform:translateX(0);-ms-transform:translateX(0);transform:translateX(0)} 20%{opacity:1;-webkit-transform:translateX(-20px);-ms-transform:translateX(-20px);transform:translateX(-20px)} 100%{opacity:0;-webkit-transform:translateX(2000px);-ms-transform:translateX(2000px);transform:translateX(2000px)}}.bounceOutRight{-webkit-animation-name:bounceOutRight;animation-name:bounceOutRight} +@-webkit-keyframes bounceOutUp{0%{-webkit-transform:translateY(0);transform:translateY(0)} 20%{opacity:1;-webkit-transform:translateY(20px);transform:translateY(20px)} 100%{opacity:0;-webkit-transform:translateY(-2000px);transform:translateY(-2000px)}}@keyframes bounceOutUp{0%{-webkit-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0)} 20%{opacity:1;-webkit-transform:translateY(20px);-ms-transform:translateY(20px);transform:translateY(20px)} 100%{opacity:0;-webkit-transform:translateY(-2000px);-ms-transform:translateY(-2000px);transform:translateY(-2000px)}}.bounceOutUp{-webkit-animation-name:bounceOutUp;animation-name:bounceOutUp} +@-webkit-keyframes fadeIn{0%{opacity:0} 100%{opacity:1}}@keyframes fadeIn{0%{opacity:0} 100%{opacity:1}}.fadeIn{-webkit-animation-name:fadeIn;animation-name:fadeIn} +@-webkit-keyframes fadeInDown{0%{opacity:0;-webkit-transform:translateY(-20px);transform:translateY(-20px)} 100%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}}@keyframes fadeInDown{0%{opacity:0;-webkit-transform:translateY(-20px);-ms-transform:translateY(-20px);transform:translateY(-20px)} 100%{opacity:1;-webkit-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0)}}.fadeInDown{-webkit-animation-name:fadeInDown;animation-name:fadeInDown} +@-webkit-keyframes fadeInDownBig{0%{opacity:0;-webkit-transform:translateY(-2000px);transform:translateY(-2000px)} 100%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}}@keyframes fadeInDownBig{0%{opacity:0;-webkit-transform:translateY(-2000px);-ms-transform:translateY(-2000px);transform:translateY(-2000px)} 100%{opacity:1;-webkit-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0)}}.fadeInDownBig{-webkit-animation-name:fadeInDownBig;animation-name:fadeInDownBig} +@-webkit-keyframes fadeInLeft{0%{opacity:0;-webkit-transform:translateX(-20px);transform:translateX(-20px)} 100%{opacity:1;-webkit-transform:translateX(0);transform:translateX(0)}}@keyframes fadeInLeft{0%{opacity:0;-webkit-transform:translateX(-20px);-ms-transform:translateX(-20px);transform:translateX(-20px)} 100%{opacity:1;-webkit-transform:translateX(0);-ms-transform:translateX(0);transform:translateX(0)}}.fadeInLeft{-webkit-animation-name:fadeInLeft;animation-name:fadeInLeft} +@-webkit-keyframes fadeInLeftBig{0%{opacity:0;-webkit-transform:translateX(-2000px);transform:translateX(-2000px)} 100%{opacity:1;-webkit-transform:translateX(0);transform:translateX(0)}}@keyframes fadeInLeftBig{0%{opacity:0;-webkit-transform:translateX(-2000px);-ms-transform:translateX(-2000px);transform:translateX(-2000px)} 100%{opacity:1;-webkit-transform:translateX(0);-ms-transform:translateX(0);transform:translateX(0)}}.fadeInLeftBig{-webkit-animation-name:fadeInLeftBig;animation-name:fadeInLeftBig} +@-webkit-keyframes fadeInRight{0%{opacity:0;-webkit-transform:translateX(20px);transform:translateX(20px)} 100%{opacity:1;-webkit-transform:translateX(0);transform:translateX(0)}}@keyframes fadeInRight{0%{opacity:0;-webkit-transform:translateX(20px);-ms-transform:translateX(20px);transform:translateX(20px)} 100%{opacity:1;-webkit-transform:translateX(0);-ms-transform:translateX(0);transform:translateX(0)}}.fadeInRight{-webkit-animation-name:fadeInRight;animation-name:fadeInRight} +@-webkit-keyframes fadeInRightBig{0%{opacity:0;-webkit-transform:translateX(2000px);transform:translateX(2000px)} 100%{opacity:1;-webkit-transform:translateX(0);transform:translateX(0)}}@keyframes fadeInRightBig{0%{opacity:0;-webkit-transform:translateX(2000px);-ms-transform:translateX(2000px);transform:translateX(2000px)} 100%{opacity:1;-webkit-transform:translateX(0);-ms-transform:translateX(0);transform:translateX(0)}}.fadeInRightBig{-webkit-animation-name:fadeInRightBig;animation-name:fadeInRightBig} +@-webkit-keyframes fadeInUp{0%{opacity:0;-webkit-transform:translateY(20px);transform:translateY(20px)} 100%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}}@keyframes fadeInUp{0%{opacity:0;-webkit-transform:translateY(20px);-ms-transform:translateY(20px);transform:translateY(20px)} 100%{opacity:1;-webkit-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0)}}.fadeInUp{-webkit-animation-name:fadeInUp;animation-name:fadeInUp} +@-webkit-keyframes fadeInUpBig{0%{opacity:0;-webkit-transform:translateY(2000px);transform:translateY(2000px)} 100%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}}@keyframes fadeInUpBig{0%{opacity:0;-webkit-transform:translateY(2000px);-ms-transform:translateY(2000px);transform:translateY(2000px)} 100%{opacity:1;-webkit-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0)}}.fadeInUpBig{-webkit-animation-name:fadeInUpBig;animation-name:fadeInUpBig} +@-webkit-keyframes fadeOut{0%{opacity:1} 100%{opacity:0}}@keyframes fadeOut{0%{opacity:1} 100%{opacity:0}}.fadeOut{-webkit-animation-name:fadeOut;animation-name:fadeOut} +@-webkit-keyframes fadeOutDown{0%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)} 100%{opacity:0;-webkit-transform:translateY(20px);transform:translateY(20px)}}@keyframes fadeOutDown{0%{opacity:1;-webkit-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0)} 100%{opacity:0;-webkit-transform:translateY(20px);-ms-transform:translateY(20px);transform:translateY(20px)}}.fadeOutDown{-webkit-animation-name:fadeOutDown;animation-name:fadeOutDown} +@-webkit-keyframes fadeOutDownBig{0%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)} 100%{opacity:0;-webkit-transform:translateY(2000px);transform:translateY(2000px)}}@keyframes fadeOutDownBig{0%{opacity:1;-webkit-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0)} 100%{opacity:0;-webkit-transform:translateY(2000px);-ms-transform:translateY(2000px);transform:translateY(2000px)}}.fadeOutDownBig{-webkit-animation-name:fadeOutDownBig;animation-name:fadeOutDownBig} +@-webkit-keyframes fadeOutLeft{0%{opacity:1;-webkit-transform:translateX(0);transform:translateX(0)} 100%{opacity:0;-webkit-transform:translateX(-20px);transform:translateX(-20px)}}@keyframes fadeOutLeft{0%{opacity:1;-webkit-transform:translateX(0);-ms-transform:translateX(0);transform:translateX(0)} 100%{opacity:0;-webkit-transform:translateX(-20px);-ms-transform:translateX(-20px);transform:translateX(-20px)}}.fadeOutLeft{-webkit-animation-name:fadeOutLeft;animation-name:fadeOutLeft} +@-webkit-keyframes fadeOutLeftBig{0%{opacity:1;-webkit-transform:translateX(0);transform:translateX(0)} 100%{opacity:0;-webkit-transform:translateX(-2000px);transform:translateX(-2000px)}}@keyframes fadeOutLeftBig{0%{opacity:1;-webkit-transform:translateX(0);-ms-transform:translateX(0);transform:translateX(0)} 100%{opacity:0;-webkit-transform:translateX(-2000px);-ms-transform:translateX(-2000px);transform:translateX(-2000px)}}.fadeOutLeftBig{-webkit-animation-name:fadeOutLeftBig;animation-name:fadeOutLeftBig} +@-webkit-keyframes fadeOutRight{0%{opacity:1;-webkit-transform:translateX(0);transform:translateX(0)} 100%{opacity:0;-webkit-transform:translateX(20px);transform:translateX(20px)}}@keyframes fadeOutRight{0%{opacity:1;-webkit-transform:translateX(0);-ms-transform:translateX(0);transform:translateX(0)} 100%{opacity:0;-webkit-transform:translateX(20px);-ms-transform:translateX(20px);transform:translateX(20px)}}.fadeOutRight{-webkit-animation-name:fadeOutRight;animation-name:fadeOutRight} +@-webkit-keyframes fadeOutRightBig{0%{opacity:1;-webkit-transform:translateX(0);transform:translateX(0)} 100%{opacity:0;-webkit-transform:translateX(2000px);transform:translateX(2000px)}}@keyframes fadeOutRightBig{0%{opacity:1;-webkit-transform:translateX(0);-ms-transform:translateX(0);transform:translateX(0)} 100%{opacity:0;-webkit-transform:translateX(2000px);-ms-transform:translateX(2000px);transform:translateX(2000px)}}.fadeOutRightBig{-webkit-animation-name:fadeOutRightBig;animation-name:fadeOutRightBig} +@-webkit-keyframes fadeOutUp{0%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)} 100%{opacity:0;-webkit-transform:translateY(-20px);transform:translateY(-20px)}}@keyframes fadeOutUp{0%{opacity:1;-webkit-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0)} 100%{opacity:0;-webkit-transform:translateY(-20px);-ms-transform:translateY(-20px);transform:translateY(-20px)}}.fadeOutUp{-webkit-animation-name:fadeOutUp;animation-name:fadeOutUp} +@-webkit-keyframes fadeOutUpBig{0%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)} 100%{opacity:0;-webkit-transform:translateY(-2000px);transform:translateY(-2000px)}}@keyframes fadeOutUpBig{0%{opacity:1;-webkit-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0)} 100%{opacity:0;-webkit-transform:translateY(-2000px);-ms-transform:translateY(-2000px);transform:translateY(-2000px)}}.fadeOutUpBig{-webkit-animation-name:fadeOutUpBig;animation-name:fadeOutUpBig} +@-webkit-keyframes flip{0%{-webkit-transform:perspective(400px) translateZ(0) rotateY(0) scale(1);transform:perspective(400px) translateZ(0) rotateY(0) scale(1);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out} 40%{-webkit-transform:perspective(400px) translateZ(150px) rotateY(170deg) scale(1);transform:perspective(400px) translateZ(150px) rotateY(170deg) scale(1);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out} 50%{-webkit-transform:perspective(400px) translateZ(150px) rotateY(190deg) scale(1);transform:perspective(400px) translateZ(150px) rotateY(190deg) scale(1);-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in} 80%{-webkit-transform:perspective(400px) translateZ(0) rotateY(360deg) scale(.95);transform:perspective(400px) translateZ(0) rotateY(360deg) scale(.95);-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in} 100%{-webkit-transform:perspective(400px) translateZ(0) rotateY(360deg) scale(1);transform:perspective(400px) translateZ(0) rotateY(360deg) scale(1);-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in}}@keyframes flip{0%{-webkit-transform:perspective(400px) translateZ(0) rotateY(0) scale(1);-ms-transform:perspective(400px) translateZ(0) rotateY(0) scale(1);transform:perspective(400px) translateZ(0) rotateY(0) scale(1);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out} 40%{-webkit-transform:perspective(400px) translateZ(150px) rotateY(170deg) scale(1);-ms-transform:perspective(400px) translateZ(150px) rotateY(170deg) scale(1);transform:perspective(400px) translateZ(150px) rotateY(170deg) scale(1);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out} 50%{-webkit-transform:perspective(400px) translateZ(150px) rotateY(190deg) scale(1);-ms-transform:perspective(400px) translateZ(150px) rotateY(190deg) scale(1);transform:perspective(400px) translateZ(150px) rotateY(190deg) scale(1);-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in} 80%{-webkit-transform:perspective(400px) translateZ(0) rotateY(360deg) scale(.95);-ms-transform:perspective(400px) translateZ(0) rotateY(360deg) scale(.95);transform:perspective(400px) translateZ(0) rotateY(360deg) scale(.95);-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in} 100%{-webkit-transform:perspective(400px) translateZ(0) rotateY(360deg) scale(1);-ms-transform:perspective(400px) translateZ(0) rotateY(360deg) scale(1);transform:perspective(400px) translateZ(0) rotateY(360deg) scale(1);-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in}}.animated.flip{-webkit-backface-visibility:visible;-ms-backface-visibility:visible;backface-visibility:visible;-webkit-animation-name:flip;animation-name:flip} +@-webkit-keyframes flipInX{0%{-webkit-transform:perspective(400px) rotateX(90deg);transform:perspective(400px) rotateX(90deg);opacity:0} 40%{-webkit-transform:perspective(400px) rotateX(-10deg);transform:perspective(400px) rotateX(-10deg)} 70%{-webkit-transform:perspective(400px) rotateX(10deg);transform:perspective(400px) rotateX(10deg)} 100%{-webkit-transform:perspective(400px) rotateX(0deg);transform:perspective(400px) rotateX(0deg);opacity:1}}@keyframes flipInX{0%{-webkit-transform:perspective(400px) rotateX(90deg);-ms-transform:perspective(400px) rotateX(90deg);transform:perspective(400px) rotateX(90deg);opacity:0} 40%{-webkit-transform:perspective(400px) rotateX(-10deg);-ms-transform:perspective(400px) rotateX(-10deg);transform:perspective(400px) rotateX(-10deg)} 70%{-webkit-transform:perspective(400px) rotateX(10deg);-ms-transform:perspective(400px) rotateX(10deg);transform:perspective(400px) rotateX(10deg)} 100%{-webkit-transform:perspective(400px) rotateX(0deg);-ms-transform:perspective(400px) rotateX(0deg);transform:perspective(400px) rotateX(0deg);opacity:1}}.flipInX{-webkit-backface-visibility:visible !important;-ms-backface-visibility:visible !important;backface-visibility:visible !important;-webkit-animation-name:flipInX;animation-name:flipInX} +@-webkit-keyframes flipInY{0%{-webkit-transform:perspective(400px) rotateY(90deg);transform:perspective(400px) rotateY(90deg);opacity:0} 40%{-webkit-transform:perspective(400px) rotateY(-10deg);transform:perspective(400px) rotateY(-10deg)} 70%{-webkit-transform:perspective(400px) rotateY(10deg);transform:perspective(400px) rotateY(10deg)} 100%{-webkit-transform:perspective(400px) rotateY(0deg);transform:perspective(400px) rotateY(0deg);opacity:1}}@keyframes flipInY{0%{-webkit-transform:perspective(400px) rotateY(90deg);-ms-transform:perspective(400px) rotateY(90deg);transform:perspective(400px) rotateY(90deg);opacity:0} 40%{-webkit-transform:perspective(400px) rotateY(-10deg);-ms-transform:perspective(400px) rotateY(-10deg);transform:perspective(400px) rotateY(-10deg)} 70%{-webkit-transform:perspective(400px) rotateY(10deg);-ms-transform:perspective(400px) rotateY(10deg);transform:perspective(400px) rotateY(10deg)} 100%{-webkit-transform:perspective(400px) rotateY(0deg);-ms-transform:perspective(400px) rotateY(0deg);transform:perspective(400px) rotateY(0deg);opacity:1}}.flipInY{-webkit-backface-visibility:visible !important;-ms-backface-visibility:visible !important;backface-visibility:visible !important;-webkit-animation-name:flipInY;animation-name:flipInY} +@-webkit-keyframes flipOutX{0%{-webkit-transform:perspective(400px) rotateX(0deg);transform:perspective(400px) rotateX(0deg);opacity:1} 100%{-webkit-transform:perspective(400px) rotateX(90deg);transform:perspective(400px) rotateX(90deg);opacity:0}}@keyframes flipOutX{0%{-webkit-transform:perspective(400px) rotateX(0deg);-ms-transform:perspective(400px) rotateX(0deg);transform:perspective(400px) rotateX(0deg);opacity:1} 100%{-webkit-transform:perspective(400px) rotateX(90deg);-ms-transform:perspective(400px) rotateX(90deg);transform:perspective(400px) rotateX(90deg);opacity:0}}.flipOutX{-webkit-animation-name:flipOutX;animation-name:flipOutX;-webkit-backface-visibility:visible !important;-ms-backface-visibility:visible !important;backface-visibility:visible !important} +@-webkit-keyframes flipOutY{0%{-webkit-transform:perspective(400px) rotateY(0deg);transform:perspective(400px) rotateY(0deg);opacity:1} 100%{-webkit-transform:perspective(400px) rotateY(90deg);transform:perspective(400px) rotateY(90deg);opacity:0}}@keyframes flipOutY{0%{-webkit-transform:perspective(400px) rotateY(0deg);-ms-transform:perspective(400px) rotateY(0deg);transform:perspective(400px) rotateY(0deg);opacity:1} 100%{-webkit-transform:perspective(400px) rotateY(90deg);-ms-transform:perspective(400px) rotateY(90deg);transform:perspective(400px) rotateY(90deg);opacity:0}}.flipOutY{-webkit-backface-visibility:visible !important;-ms-backface-visibility:visible !important;backface-visibility:visible !important;-webkit-animation-name:flipOutY;animation-name:flipOutY} +@-webkit-keyframes lightSpeedIn{0%{-webkit-transform:translateX(100%) skewX(-30deg);transform:translateX(100%) skewX(-30deg);opacity:0} 60%{-webkit-transform:translateX(-20%) skewX(30deg);transform:translateX(-20%) skewX(30deg);opacity:1} 80%{-webkit-transform:translateX(0) skewX(-15deg);transform:translateX(0) skewX(-15deg);opacity:1} 100%{-webkit-transform:translateX(0) skewX(0deg);transform:translateX(0) skewX(0deg);opacity:1}}@keyframes lightSpeedIn{0%{-webkit-transform:translateX(100%) skewX(-30deg);-ms-transform:translateX(100%) skewX(-30deg);transform:translateX(100%) skewX(-30deg);opacity:0} 60%{-webkit-transform:translateX(-20%) skewX(30deg);-ms-transform:translateX(-20%) skewX(30deg);transform:translateX(-20%) skewX(30deg);opacity:1} 80%{-webkit-transform:translateX(0) skewX(-15deg);-ms-transform:translateX(0) skewX(-15deg);transform:translateX(0) skewX(-15deg);opacity:1} 100%{-webkit-transform:translateX(0) skewX(0deg);-ms-transform:translateX(0) skewX(0deg);transform:translateX(0) skewX(0deg);opacity:1}}.lightSpeedIn{-webkit-animation-name:lightSpeedIn;animation-name:lightSpeedIn;-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out} +@-webkit-keyframes lightSpeedOut{0%{-webkit-transform:translateX(0) skewX(0deg);transform:translateX(0) skewX(0deg);opacity:1} 100%{-webkit-transform:translateX(100%) skewX(-30deg);transform:translateX(100%) skewX(-30deg);opacity:0}}@keyframes lightSpeedOut{0%{-webkit-transform:translateX(0) skewX(0deg);-ms-transform:translateX(0) skewX(0deg);transform:translateX(0) skewX(0deg);opacity:1} 100%{-webkit-transform:translateX(100%) skewX(-30deg);-ms-transform:translateX(100%) skewX(-30deg);transform:translateX(100%) skewX(-30deg);opacity:0}}.lightSpeedOut{-webkit-animation-name:lightSpeedOut;animation-name:lightSpeedOut;-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in} +@-webkit-keyframes rotateIn{0%{-webkit-transform-origin:center center;transform-origin:center center;-webkit-transform:rotate(-200deg);transform:rotate(-200deg);opacity:0} 100%{-webkit-transform-origin:center center;transform-origin:center center;-webkit-transform:rotate(0);transform:rotate(0);opacity:1}}@keyframes rotateIn{0%{-webkit-transform-origin:center center;-ms-transform-origin:center center;transform-origin:center center;-webkit-transform:rotate(-200deg);-ms-transform:rotate(-200deg);transform:rotate(-200deg);opacity:0} 100%{-webkit-transform-origin:center center;-ms-transform-origin:center center;transform-origin:center center;-webkit-transform:rotate(0);-ms-transform:rotate(0);transform:rotate(0);opacity:1}}.rotateIn{-webkit-animation-name:rotateIn;animation-name:rotateIn} +@-webkit-keyframes rotateInDownLeft{0%{-webkit-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:rotate(-90deg);transform:rotate(-90deg);opacity:0} 100%{-webkit-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:rotate(0);transform:rotate(0);opacity:1}}@keyframes rotateInDownLeft{0%{-webkit-transform-origin:left bottom;-ms-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:rotate(-90deg);-ms-transform:rotate(-90deg);transform:rotate(-90deg);opacity:0} 100%{-webkit-transform-origin:left bottom;-ms-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:rotate(0);-ms-transform:rotate(0);transform:rotate(0);opacity:1}}.rotateInDownLeft{-webkit-animation-name:rotateInDownLeft;animation-name:rotateInDownLeft} +@-webkit-keyframes rotateInDownRight{0%{-webkit-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:rotate(90deg);transform:rotate(90deg);opacity:0} 100%{-webkit-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:rotate(0);transform:rotate(0);opacity:1}}@keyframes rotateInDownRight{0%{-webkit-transform-origin:right bottom;-ms-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg);opacity:0} 100%{-webkit-transform-origin:right bottom;-ms-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:rotate(0);-ms-transform:rotate(0);transform:rotate(0);opacity:1}}.rotateInDownRight{-webkit-animation-name:rotateInDownRight;animation-name:rotateInDownRight} +@-webkit-keyframes rotateInUpLeft{0%{-webkit-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:rotate(90deg);transform:rotate(90deg);opacity:0} 100%{-webkit-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:rotate(0);transform:rotate(0);opacity:1}}@keyframes rotateInUpLeft{0%{-webkit-transform-origin:left bottom;-ms-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg);opacity:0} 100%{-webkit-transform-origin:left bottom;-ms-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:rotate(0);-ms-transform:rotate(0);transform:rotate(0);opacity:1}}.rotateInUpLeft{-webkit-animation-name:rotateInUpLeft;animation-name:rotateInUpLeft} +@-webkit-keyframes rotateInUpRight{0%{-webkit-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:rotate(-90deg);transform:rotate(-90deg);opacity:0} 100%{-webkit-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:rotate(0);transform:rotate(0);opacity:1}}@keyframes rotateInUpRight{0%{-webkit-transform-origin:right bottom;-ms-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:rotate(-90deg);-ms-transform:rotate(-90deg);transform:rotate(-90deg);opacity:0} 100%{-webkit-transform-origin:right bottom;-ms-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:rotate(0);-ms-transform:rotate(0);transform:rotate(0);opacity:1}}.rotateInUpRight{-webkit-animation-name:rotateInUpRight;animation-name:rotateInUpRight} +@-webkit-keyframes rotateOut{0%{-webkit-transform-origin:center center;transform-origin:center center;-webkit-transform:rotate(0);transform:rotate(0);opacity:1} 100%{-webkit-transform-origin:center center;transform-origin:center center;-webkit-transform:rotate(200deg);transform:rotate(200deg);opacity:0}}@keyframes rotateOut{0%{-webkit-transform-origin:center center;-ms-transform-origin:center center;transform-origin:center center;-webkit-transform:rotate(0);-ms-transform:rotate(0);transform:rotate(0);opacity:1} 100%{-webkit-transform-origin:center center;-ms-transform-origin:center center;transform-origin:center center;-webkit-transform:rotate(200deg);-ms-transform:rotate(200deg);transform:rotate(200deg);opacity:0}}.rotateOut{-webkit-animation-name:rotateOut;animation-name:rotateOut} +@-webkit-keyframes rotateOutDownLeft{0%{-webkit-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:rotate(0);transform:rotate(0);opacity:1} 100%{-webkit-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:rotate(90deg);transform:rotate(90deg);opacity:0}}@keyframes rotateOutDownLeft{0%{-webkit-transform-origin:left bottom;-ms-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:rotate(0);-ms-transform:rotate(0);transform:rotate(0);opacity:1} 100%{-webkit-transform-origin:left bottom;-ms-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg);opacity:0}}.rotateOutDownLeft{-webkit-animation-name:rotateOutDownLeft;animation-name:rotateOutDownLeft} +@-webkit-keyframes rotateOutDownRight{0%{-webkit-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:rotate(0);transform:rotate(0);opacity:1} 100%{-webkit-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:rotate(-90deg);transform:rotate(-90deg);opacity:0}}@keyframes rotateOutDownRight{0%{-webkit-transform-origin:right bottom;-ms-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:rotate(0);-ms-transform:rotate(0);transform:rotate(0);opacity:1} 100%{-webkit-transform-origin:right bottom;-ms-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:rotate(-90deg);-ms-transform:rotate(-90deg);transform:rotate(-90deg);opacity:0}}.rotateOutDownRight{-webkit-animation-name:rotateOutDownRight;animation-name:rotateOutDownRight} +@-webkit-keyframes rotateOutUpLeft{0%{-webkit-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:rotate(0);transform:rotate(0);opacity:1} 100%{-transform-origin:left bottom;-transform:rotate(-90deg);opacity:0}}@keyframes rotateOutUpLeft{0%{-webkit-transform-origin:left bottom;-ms-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:rotate(0);-ms-transform:rotate(0);transform:rotate(0);opacity:1} 100%{-transform-origin:left bottom;-transform:rotate(-90deg);opacity:0}}.rotateOutUpLeft{-webkit-animation-name:rotateOutUpLeft;animation-name:rotateOutUpLeft} +@-webkit-keyframes rotateOutUpRight{0%{-webkit-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:rotate(0);transform:rotate(0);opacity:1} 100%{-webkit-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:rotate(90deg);transform:rotate(90deg);opacity:0}}@keyframes rotateOutUpRight{0%{-webkit-transform-origin:right bottom;-ms-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:rotate(0);-ms-transform:rotate(0);transform:rotate(0);opacity:1} 100%{-webkit-transform-origin:right bottom;-ms-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg);opacity:0}}.rotateOutUpRight{-webkit-animation-name:rotateOutUpRight;animation-name:rotateOutUpRight} +@-webkit-keyframes slideInDown{0%{opacity:0;-webkit-transform:translateY(-2000px);transform:translateY(-2000px)} 100%{-webkit-transform:translateY(0);transform:translateY(0)}}@keyframes slideInDown{0%{opacity:0;-webkit-transform:translateY(-2000px);-ms-transform:translateY(-2000px);transform:translateY(-2000px)} 100%{-webkit-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0)}}.slideInDown{-webkit-animation-name:slideInDown;animation-name:slideInDown} +@-webkit-keyframes slideInLeft{0%{opacity:0;-webkit-transform:translateX(-2000px);transform:translateX(-2000px)} 100%{-webkit-transform:translateX(0);transform:translateX(0)}}@keyframes slideInLeft{0%{opacity:0;-webkit-transform:translateX(-2000px);-ms-transform:translateX(-2000px);transform:translateX(-2000px)} 100%{-webkit-transform:translateX(0);-ms-transform:translateX(0);transform:translateX(0)}}.slideInLeft{-webkit-animation-name:slideInLeft;animation-name:slideInLeft} +@-webkit-keyframes slideInRight{0%{opacity:0;-webkit-transform:translateX(2000px);transform:translateX(2000px)} 100%{-webkit-transform:translateX(0);transform:translateX(0)}}@keyframes slideInRight{0%{opacity:0;-webkit-transform:translateX(2000px);-ms-transform:translateX(2000px);transform:translateX(2000px)} 100%{-webkit-transform:translateX(0);-ms-transform:translateX(0);transform:translateX(0)}}.slideInRight{-webkit-animation-name:slideInRight;animation-name:slideInRight} +@-webkit-keyframes slideOutLeft{0%{-webkit-transform:translateX(0);transform:translateX(0)} 100%{opacity:0;-webkit-transform:translateX(-2000px);transform:translateX(-2000px)}}@keyframes slideOutLeft{0%{-webkit-transform:translateX(0);-ms-transform:translateX(0);transform:translateX(0)} 100%{opacity:0;-webkit-transform:translateX(-2000px);-ms-transform:translateX(-2000px);transform:translateX(-2000px)}}.slideOutLeft{-webkit-animation-name:slideOutLeft;animation-name:slideOutLeft} +@-webkit-keyframes slideOutRight{0%{-webkit-transform:translateX(0);transform:translateX(0)} 100%{opacity:0;-webkit-transform:translateX(2000px);transform:translateX(2000px)}}@keyframes slideOutRight{0%{-webkit-transform:translateX(0);-ms-transform:translateX(0);transform:translateX(0)} 100%{opacity:0;-webkit-transform:translateX(2000px);-ms-transform:translateX(2000px);transform:translateX(2000px)}}.slideOutRight{-webkit-animation-name:slideOutRight;animation-name:slideOutRight} +@-webkit-keyframes slideOutUp{0%{-webkit-transform:translateY(0);transform:translateY(0)} 100%{opacity:0;-webkit-transform:translateY(-2000px);transform:translateY(-2000px)}}@keyframes slideOutUp{0%{-webkit-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0)} 100%{opacity:0;-webkit-transform:translateY(-2000px);-ms-transform:translateY(-2000px);transform:translateY(-2000px)}}.slideOutUp{-webkit-animation-name:slideOutUp;animation-name:slideOutUp} +@-webkit-keyframes hinge{0%{-webkit-transform:rotate(0);transform:rotate(0);-webkit-transform-origin:top left;transform-origin:top left;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out} 20%,60%{-webkit-transform:rotate(80deg);transform:rotate(80deg);-webkit-transform-origin:top left;transform-origin:top left;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out} 40%{-webkit-transform:rotate(60deg);transform:rotate(60deg);-webkit-transform-origin:top left;transform-origin:top left;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out} 80%{-webkit-transform:rotate(60deg) translateY(0);transform:rotate(60deg) translateY(0);opacity:1;-webkit-transform-origin:top left;transform-origin:top left;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out} 100%{-webkit-transform:translateY(700px);transform:translateY(700px);opacity:0}}@keyframes hinge{0%{-webkit-transform:rotate(0);-ms-transform:rotate(0);transform:rotate(0);-webkit-transform-origin:top left;-ms-transform-origin:top left;transform-origin:top left;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out} 20%,60%{-webkit-transform:rotate(80deg);-ms-transform:rotate(80deg);transform:rotate(80deg);-webkit-transform-origin:top left;-ms-transform-origin:top left;transform-origin:top left;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out} 40%{-webkit-transform:rotate(60deg);-ms-transform:rotate(60deg);transform:rotate(60deg);-webkit-transform-origin:top left;-ms-transform-origin:top left;transform-origin:top left;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out} 80%{-webkit-transform:rotate(60deg) translateY(0);-ms-transform:rotate(60deg) translateY(0);transform:rotate(60deg) translateY(0);opacity:1;-webkit-transform-origin:top left;-ms-transform-origin:top left;transform-origin:top left;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out} 100%{-webkit-transform:translateY(700px);-ms-transform:translateY(700px);transform:translateY(700px);opacity:0}}.hinge{-webkit-animation-name:hinge;animation-name:hinge} +@-webkit-keyframes rollIn{0%{opacity:0;-webkit-transform:translateX(-100%) rotate(-120deg);transform:translateX(-100%) rotate(-120deg)} 100%{opacity:1;-webkit-transform:translateX(0) rotate(0deg);transform:translateX(0) rotate(0deg)}}@keyframes rollIn{0%{opacity:0;-webkit-transform:translateX(-100%) rotate(-120deg);-ms-transform:translateX(-100%) rotate(-120deg);transform:translateX(-100%) rotate(-120deg)} 100%{opacity:1;-webkit-transform:translateX(0) rotate(0deg);-ms-transform:translateX(0) rotate(0deg);transform:translateX(0) rotate(0deg)}}.rollIn{-webkit-animation-name:rollIn;animation-name:rollIn} +@-webkit-keyframes rollOut{0%{opacity:1;-webkit-transform:translateX(0) rotate(0deg);transform:translateX(0) rotate(0deg)} 100%{opacity:0;-webkit-transform:translateX(100%) rotate(120deg);transform:translateX(100%) rotate(120deg)}}@keyframes rollOut{0%{opacity:1;-webkit-transform:translateX(0) rotate(0deg);-ms-transform:translateX(0) rotate(0deg);transform:translateX(0) rotate(0deg)} 100%{opacity:0;-webkit-transform:translateX(100%) rotate(120deg);-ms-transform:translateX(100%) rotate(120deg);transform:translateX(100%) rotate(120deg)}}.rollOut{-webkit-animation-name:rollOut;animation-name:rollOut} +.ink-navigation{overflow:visible}.ink-navigation ul{list-style-type:none;padding:0;margin:0}.ink-navigation ul li{margin:0} +.ink-navigation ul{*height:100%}.ink-navigation ul.menu li{*height:100%}.ink-navigation ul.menu li a{-webkit-transition-property:background;-moz-transition-property:background;-o-transition-property:background;-ms-transition-property:background;transition-property:background;-webkit-transition-duration:140ms;-moz-transition-duration:140ms;-o-transition-duration:140ms;-ms-transition-duration:140ms;transition-duration:140ms;-webkit-transition-timing-function:ease-in-out;-moz-transition-timing-function:ease-in-out;-o-transition-timing-function:ease-in-out;-ms-transition-timing-function:ease-in-out;transition-timing-function:ease-in-out;-webkit-transition-delay:0;-moz-transition-delay:0;-o-transition-delay:0;-ms-transition-delay:0;transition-delay:0} +.ink-navigation ul.menu li:hover ul.submenu{display:block} +.ink-navigation ul.menu li ul.submenu{display:none;position:absolute;z-index:10}.ink-navigation ul.menu li ul.submenu li{overflow:hidden}.ink-navigation ul.menu li ul.submenu li a{padding:.5em 1em;display:block;float:none} +.ink-navigation ul.menu:after{content:" ";display:block;height:0;clear:both;visibility:hidden;zoom:1} +.ink-navigation ul.menu.horizontal li{float:left;position:relative}.ink-navigation ul.menu.horizontal li a{padding:.5em 1em;display:block;line-height:1.7} +.ink-navigation ul.menu.horizontal li .control{margin-top:.3em} +.ink-navigation ul.menu.horizontal li ul.submenu{width:8em;top:2.7em;left:0;z-index:50}.ink-navigation ul.menu.horizontal li ul.submenu li{float:none} +.ink-navigation ul.menu.vertical li{line-height:1.7;position:relative}.ink-navigation ul.menu.vertical li a{padding:.5em 1em;display:block} +.ink-navigation ul.menu.vertical li ul.submenu{top:0;left:100%;min-width:8em}.ink-navigation ul.menu.vertical li ul.submenu li{line-height:1.7;float:none;position:static} +.ink-navigation ul.menu.vertical li ul.submenu.dropdown{position:relative;top:auto;left:auto} +.ink-navigation .breadcrumbs li{line-height:2.7em;display:inline}.ink-navigation .breadcrumbs li a{display:inline;padding:0}.ink-navigation .breadcrumbs li a:hover{background:transparent} +.ink-navigation .breadcrumbs li.active a{cursor:default;text-decoration:none} +.ink-navigation .breadcrumbs li:first-child a{padding-left:1.2em} +.ink-navigation .breadcrumbs li:after{content:'/';display:inline;margin:0 0.7em} +.ink-navigation .breadcrumbs li:last-child:after{content:'';display:none} +.ink-navigation ul.pagination li{line-height:1.7;float:left}.ink-navigation ul.pagination li a{padding:.5em 1em;display:block;float:left} +.ink-navigation ul.pagination li:last-child a{border:none} +.ink-navigation ul.pagination li.disabled a:hover{cursor:default;text-decoration:none} +.ink-navigation ul.pagination.dotted li a{display:block;height:1em;width:1em;margin-right:.6em;padding:0;border-radius:50%;text-indent:-99999px} +.ink-navigation ul.pagination.dotted li:first-child a,.ink-navigation ul.pagination.dotted li:last-child a{height:auto;width:auto;background:none} +.ink-navigation ul.pagination.dotted li.previous a,.ink-navigation ul.pagination.dotted li.next a{display:none} +.ink-navigation ul.pagination.chevron li{display:none}.ink-navigation ul.pagination.chevron li a{font-size:0} +.ink-navigation ul.pagination.chevron li.next,.ink-navigation ul.pagination.chevron li.previous{display:block}.ink-navigation ul.pagination.chevron li.next a,.ink-navigation ul.pagination.chevron li.previous a{display:block;position:absolute;top:35%;padding:0 .5em;margin:0;font-family:FontAwesome;font-size:4em;-webkit-transition-property:all;-moz-transition-property:all;-o-transition-property:all;-ms-transition-property:all;transition-property:all;-webkit-transition-duration:140ms;-moz-transition-duration:140ms;-o-transition-duration:140ms;-ms-transition-duration:140ms;transition-duration:140ms;-webkit-transition-timing-function:ease-in-out;-moz-transition-timing-function:ease-in-out;-o-transition-timing-function:ease-in-out;-ms-transition-timing-function:ease-in-out;transition-timing-function:ease-in-out;-webkit-transition-delay:0;-moz-transition-delay:0;-o-transition-delay:0;-ms-transition-delay:0;transition-delay:0} +.ink-navigation ul.pagination.chevron li.disabled a{color:rgba(255,255,255,0.6);text-shadow:none}.ink-navigation ul.pagination.chevron li.disabled a:hover,.ink-navigation ul.pagination.chevron li.disabled a:focus{color:rgba(255,255,255,0.6)} +.ink-navigation ul.pagination.chevron li.previous a{left:0}.ink-navigation ul.pagination.chevron li.previous a:after{content:"\f137"} +.ink-navigation ul.pagination.chevron li.next a{right:0}.ink-navigation ul.pagination.chevron li.next a:after{content:"\f138"} +.ink-navigation ul.pagination:after{content:" ";display:block;height:0;clear:both;visibility:hidden;zoom:1} +@media screen and (max-width:650px){html body .ink-navigation .pagination li a{display:none} html body .ink-navigation .pagination li:first-child a,html body .ink-navigation .pagination li:last-child a{display:block}}.ink-navigation .pills li{overflow:hidden;display:block;float:left;margin:0 .5em .5em 0;line-height:1.7}.ink-navigation .pills li a{display:block;padding:.5em 1em}.ink-navigation .pills li a:hover{text-decoration:none} +.ink-navigation .pills li.active a,.ink-navigation .pills li.disabled a{cursor:default} +.ink-navigation .pills:after{content:" ";display:block;height:0;clear:both;visibility:hidden;zoom:1} +.ink-dropdown{position:relative;display:inline-block}.ink-dropdown ul.dropdown-menu{position:absolute;background:#fff;z-index:30;border:1px solid #d9d9d9;height:auto;width:auto;min-width:10em;border-radius:5px;-webkit-box-shadow:0 0 1px 0 rgba(100,100,100,0.3);-moz-box-shadow:0 0 1px 0 rgba(100,100,100,0.3);box-shadow:0 0 1px 0 rgba(100,100,100,0.3);padding:0.3em 0;margin-left:0px;padding:0.35em 0;font-size:0.85em}.ink-dropdown ul.dropdown-menu li{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;border-top-right-radius:0;border-top-left-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:0;width:auto;height:auto;min-height:auto;display:list-item;float:none;margin:0;text-align:left;text-transform:none;padding:0;position:relative;list-style-type:none}.ink-dropdown ul.dropdown-menu li.separator-above{padding-top:0.35em;margin-top:0.35em;border-top:1px solid #d9d9d9} +.ink-dropdown ul.dropdown-menu li.separator-below{padding-bottom:0.35em;margin-bottom:0.35em;border-bottom:1px solid #d9d9d9} +.ink-dropdown ul.dropdown-menu li.heading{font-weight:700;padding-bottom:0.35em;margin-bottom:0.35em;padding:0.5em 0.8em;color:#333} +.ink-dropdown ul.dropdown-menu li a{color:#444;padding:0.5em 0.8em;display:block;clear:both}.ink-dropdown ul.dropdown-menu li a:hover{background:#f2f2f2;text-decoration:none} +.ink-dropdown ul.dropdown-menu li.active a{background:#999;color:#fff} +.ink-dropdown ul.dropdown-menu li.disabled a{color:#b3b3b3}.ink-dropdown ul.dropdown-menu li.disabled a:hover{background:transparent;cursor:default} +.ink-dropdown ul.dropdown-menu li.submenu{overflow:visible}.ink-dropdown ul.dropdown-menu li.submenu>a{white-space:nowrap}.ink-dropdown ul.dropdown-menu li.submenu>a:after{content:"\f0da";width:auto;margin-left:0.8em;font-family:FontAwesome;color:#b3b3b3;clear:both;text-align:right} +.ink-dropdown ul.dropdown-menu li.submenu:hover>a{background:#f2f2f2;text-decoration:none} +.ink-dropdown ul.dropdown-menu li.submenu:hover:hover>ul.dropdown-menu{display:block} +.ink-dropdown ul.dropdown-menu li.submenu>ul.dropdown-menu{font-size:inherit;position:absolute;top:-0.36em;left:100%;display:none} +.ink-navigation ul.menu li.active a{text-decoration:underline} +.ink-navigation ul.menu li.heading{font-weight:700} +.ink-navigation ul.menu li.disabled a{color:#b3b3b3;text-shadow:0 1px 0 #fff}.ink-navigation ul.menu li.disabled a:hover{cursor:default;background:none;text-decoration:none} +.ink-navigation ul.menu li ul.submenu{background:#fff}.ink-navigation ul.menu li ul.submenu li a{border-bottom:1px solid rgba(0,0,0,0.15)}.ink-navigation ul.menu li ul.submenu li a:hover{background:#e6e6e6} +.ink-navigation ul.menu li ul.submenu li a:last-child a{border:none} +.ink-navigation ul.menu li ul.submenu.dropdown li a{border-bottom:1px solid rgba(0,0,0,0.15)} +.ink-navigation ul.menu.vertical li a{border-bottom:1px solid rgba(0,0,0,0.15)} +.ink-navigation ul.menu.vertical li:last-child a{border:none} +.ink-navigation ul.menu.vertical li .dropdown{background:none}.ink-navigation ul.menu.vertical li .dropdown li a{border-bottom:1px solid rgba(0,0,0,0.15)}.ink-navigation ul.menu.vertical li .dropdown li a:hover{background:none} +.ink-navigation ul.menu.vertical li:last-child .dropdown li:first-child a{border-top:1px solid rgba(0,0,0,0.15)} +.ink-navigation ul.menu.white{background:#fff;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#f2f2f2');background:-moz-linear-gradient(top, #fff 0, #f2f2f2 150%);background:-webkit-gradient(linear, left top, left bottom, color-stop(0, #fff), color-stop(150%, #f2f2f2));background:-webkit-linear-gradient(top, #fff 0, #f2f2f2 150%);background:-o-linear-gradient(top, #fff 0, #f2f2f2 150%);background:-ms-linear-gradient(top, #fff 0, #f2f2f2 150%);background:linear-gradient(to bottom, #fff 0, #f2f2f2 150%)}.ink-navigation ul.menu.white li a{color:#555;text-decoration:none}.ink-navigation ul.menu.white li a:hover{background:#d9d9d9} +.ink-navigation ul.menu.white li.active{background:#d9d9d9} +.ink-navigation ul.menu.white li.disabled a{color:#999;text-shadow:0 1px 0 #fff}.ink-navigation ul.menu.white li.disabled a:hover{background:rgba(0,0,0,0)} +.ink-navigation ul.menu.white li ul.submenu li:hover{background:rgba(0,0,0,0.1)} +.ink-navigation ul.menu.white li ul.submenu li a{color:#555} +.ink-navigation ul.menu.white li ul.submenu.dropdown{background:#fff}.ink-navigation ul.menu.white li ul.submenu.dropdown li a{border-bottom:1px solid rgba(0,0,0,0.2)} +.ink-navigation ul.menu.grey{background:#e6e6e6;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#e6e6e6', endColorstr='#cccccc');background:-moz-linear-gradient(top, #e6e6e6 0, #ccc 150%);background:-webkit-gradient(linear, left top, left bottom, color-stop(0, #e6e6e6), color-stop(150%, #ccc));background:-webkit-linear-gradient(top, #e6e6e6 0, #ccc 150%);background:-o-linear-gradient(top, #e6e6e6 0, #ccc 150%);background:-ms-linear-gradient(top, #e6e6e6 0, #ccc 150%);background:linear-gradient(to bottom, #e6e6e6 0, #ccc 150%)}.ink-navigation ul.menu.grey li.active{background:#b3b3b3} +.ink-navigation ul.menu.grey li.disabled a{color:#999;text-shadow:0 1px 0 #fff}.ink-navigation ul.menu.grey li.disabled a:hover{background:rgba(0,0,0,0)} +.ink-navigation ul.menu.grey li a{color:#555;text-decoration:none}.ink-navigation ul.menu.grey li a:hover{background:#b3b3b3} +.ink-navigation ul.menu.grey li ul.submenu li:hover{background:rgba(0,0,0,0.1)} +.ink-navigation ul.menu.grey li ul.submenu li a{color:#555} +.ink-navigation ul.menu.grey li ul.submenu.dropdown{background:#fff}.ink-navigation ul.menu.grey li ul.submenu.dropdown li a{border-bottom:1px solid rgba(0,0,0,0.15)} +.ink-navigation ul.menu.black{background:#1a1a1a;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#1a1a1a', endColorstr='#0d0d0d');background:-moz-linear-gradient(top, #1a1a1a 0, #0d0d0d 150%);background:-webkit-gradient(linear, left top, left bottom, color-stop(0, #1a1a1a), color-stop(150%, #0d0d0d));background:-webkit-linear-gradient(top, #1a1a1a 0, #0d0d0d 150%);background:-o-linear-gradient(top, #1a1a1a 0, #0d0d0d 150%);background:-ms-linear-gradient(top, #1a1a1a 0, #0d0d0d 150%);background:linear-gradient(to bottom, #1a1a1a 0, #0d0d0d 150%)}.ink-navigation ul.menu.black li.active{background:#333} +.ink-navigation ul.menu.black li.disabled a{color:#666;text-shadow:0 -1px 0 #000}.ink-navigation ul.menu.black li.disabled a:hover{background:rgba(0,0,0,0)} +.ink-navigation ul.menu.black li a{color:#fff;text-decoration:none}.ink-navigation ul.menu.black li a:hover{background:#333} +.ink-navigation ul.menu.black li ul.submenu li:hover{background:#e6e6e6} +.ink-navigation ul.menu.black li ul.submenu li a{color:#555}.ink-navigation ul.menu.black li ul.submenu li a:hover{background:#4d4d4d;color:#fff} +.ink-navigation ul.menu.black li ul.submenu.dropdown{background:#fff}.ink-navigation ul.menu.black li ul.submenu.dropdown li a{border-bottom:1px solid rgba(0,0,0,0.15)} +.ink-navigation ul.menu.orange{background:#f2990d;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#f2990d', endColorstr='#c27b0a');background:-moz-linear-gradient(top, #f2990d 0, #c27b0a 150%);background:-webkit-gradient(linear, left top, left bottom, color-stop(0, #f2990d), color-stop(150%, #c27b0a));background:-webkit-linear-gradient(top, #f2990d 0, #c27b0a 150%);background:-o-linear-gradient(top, #f2990d 0, #c27b0a 150%);background:-ms-linear-gradient(top, #f2990d 0, #c27b0a 150%);background:linear-gradient(to bottom, #f2990d 0, #c27b0a 150%)}.ink-navigation ul.menu.orange li.active{background:#b36d00} +.ink-navigation ul.menu.orange li.disabled a{color:#995e00;text-shadow:0 1px 0 #ffac29}.ink-navigation ul.menu.orange li.disabled a:hover{background:rgba(0,0,0,0)} +.ink-navigation ul.menu.orange li a{color:#fff;text-decoration:none}.ink-navigation ul.menu.orange li a:hover{background:#b36d00} +.ink-navigation ul.menu.orange li ul.submenu li:hover{background:rgba(0,0,0,0.1)} +.ink-navigation ul.menu.orange li ul.submenu li a{color:#555}.ink-navigation ul.menu.orange li ul.submenu li a:hover{background:#da8a0b;color:#fff} +.ink-navigation ul.menu.orange li ul.submenu.dropdown{background:#fff}.ink-navigation ul.menu.orange li ul.submenu.dropdown li a{border-bottom:1px solid rgba(0,0,0,0.15)} +.ink-navigation ul.menu.blue{background:#1b75ce;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#1b75ce', endColorstr='#155ba1');background:-moz-linear-gradient(top, #1b75ce 0, #155ba1 150%);background:-webkit-gradient(linear, left top, left bottom, color-stop(0, #1b75ce), color-stop(150%, #155ba1));background:-webkit-linear-gradient(top, #1b75ce 0, #155ba1 150%);background:-o-linear-gradient(top, #1b75ce 0, #155ba1 150%);background:-ms-linear-gradient(top, #1b75ce 0, #155ba1 150%);background:linear-gradient(to bottom, #1b75ce 0, #155ba1 150%)}.ink-navigation ul.menu.blue li.active{background:#0a4f92} +.ink-navigation ul.menu.blue li.disabled a{color:#08427b;text-shadow:0 1px 0 #2289f0}.ink-navigation ul.menu.blue li.disabled a:hover{background:rgba(0,0,0,0)} +.ink-navigation ul.menu.blue li a{color:#fff;text-decoration:none}.ink-navigation ul.menu.blue li a:hover{background:#0a4f92} +.ink-navigation ul.menu.blue li ul.submenu li:hover{background:rgba(0,0,0,0.1)} +.ink-navigation ul.menu.blue li ul.submenu li a{color:#555}.ink-navigation ul.menu.blue li ul.submenu li a:hover{background:#1868b8;color:#fff} +.ink-navigation ul.menu.blue li ul.submenu.dropdown{background:#fff}.ink-navigation ul.menu.blue li ul.submenu.dropdown li a{border-bottom:1px solid rgba(0,0,0,0.15)} +.ink-navigation ul.menu.green{background:#4c9220;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#4c9220', endColorstr='#366817');background:-moz-linear-gradient(top, #4c9220 0, #366817 150%);background:-webkit-gradient(linear, left top, left bottom, color-stop(0, #4c9220), color-stop(150%, #366817));background:-webkit-linear-gradient(top, #4c9220 0, #366817 150%);background:-o-linear-gradient(top, #4c9220 0, #366817 150%);background:-ms-linear-gradient(top, #4c9220 0, #366817 150%);background:linear-gradient(to bottom, #4c9220 0, #366817 150%)}.ink-navigation ul.menu.green li.active{background:#2a580d} +.ink-navigation ul.menu.green li.disabled a{color:#20420a;text-shadow:0 1px 0 #57b61b}.ink-navigation ul.menu.green li.disabled a:hover{background:rgba(0,0,0,0)} +.ink-navigation ul.menu.green li a{color:#fff;text-decoration:none}.ink-navigation ul.menu.green li a:hover{background:#2a580d} +.ink-navigation ul.menu.green li ul.submenu li:hover{background:rgba(0,0,0,0.1)} +.ink-navigation ul.menu.green li ul.submenu li a{color:#555}.ink-navigation ul.menu.green li ul.submenu li a:hover{background:#417d1b;color:#fff} +.ink-navigation ul.menu.green li ul.submenu.dropdown{background:#fff}.ink-navigation ul.menu.green li ul.submenu.dropdown li a{border-bottom:1px solid rgba(0,0,0,0.15)} +.ink-navigation ul.menu.red{background:#be1c1c;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#be1c1c', endColorstr='#921515');background:-moz-linear-gradient(top, #be1c1c 0, #921515 150%);background:-webkit-gradient(linear, left top, left bottom, color-stop(0, #be1c1c), color-stop(150%, #921515));background:-webkit-linear-gradient(top, #be1c1c 0, #921515 150%);background:-o-linear-gradient(top, #be1c1c 0, #921515 150%);background:-ms-linear-gradient(top, #be1c1c 0, #921515 150%);background:linear-gradient(to bottom, #be1c1c 0, #921515 150%)}.ink-navigation ul.menu.red li.active{background:#820b0b} +.ink-navigation ul.menu.red li.disabled a{color:#530707;text-shadow:0 1px 0 #eb1717}.ink-navigation ul.menu.red li.disabled a:hover{background:rgba(0,0,0,0)} +.ink-navigation ul.menu.red li a{color:#fff;text-decoration:none}.ink-navigation ul.menu.red li a:hover{background:#820b0b} +.ink-navigation ul.menu.red li ul.submenu li:hover{background:rgba(0,0,0,0.1)} +.ink-navigation ul.menu.red li ul.submenu li a{color:#555}.ink-navigation ul.menu.red li ul.submenu li a:hover{background:#a81919;color:#fff} +.ink-navigation ul.menu.red li ul.submenu.dropdown{background:#fff}.ink-navigation ul.menu.red li ul.submenu.dropdown li a{border-bottom:1px solid rgba(0,0,0,0.15)} +.ink-navigation ul.menu.flat{filter:none}.ink-navigation ul.menu.flat.white{background:#fff} +.ink-navigation ul.menu.flat.grey{background:#d9d9d9} +.ink-navigation ul.menu.flat.black{background:#000} +.ink-navigation ul.menu.flat.orange{background:#f2990d} +.ink-navigation ul.menu.flat.blue{background:#1b75ce} +.ink-navigation ul.menu.flat.green{background:#4c9220} +.ink-navigation ul.menu.flat.red{background:#be1c1c} +.ink-navigation ul.menu.rounded.horizontal{border-radius:4px}.ink-navigation ul.menu.rounded.horizontal li:first-child{border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:4px;border-top-left-radius:4px}.ink-navigation ul.menu.rounded.horizontal li:first-child a{border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:4px;border-top-left-radius:4px} +.ink-navigation ul.menu.rounded.horizontal li ul.submenu{border-top-right-radius:0;border-top-left-radius:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.ink-navigation ul.menu.rounded.horizontal li ul.submenu li{border-top-right-radius:0;border-top-left-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:0}.ink-navigation ul.menu.rounded.horizontal li ul.submenu li:last-child{border-top-right-radius:0;border-top-left-radius:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px} +.ink-navigation ul.menu.rounded.horizontal li ul.submenu li a{border-top-right-radius:0;border-top-left-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:0} +.ink-navigation ul.menu.rounded.vertical{border-radius:4px}.ink-navigation ul.menu.rounded.vertical li:first-child{border-top-right-radius:4px;border-top-left-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.ink-navigation ul.menu.rounded.vertical li:first-child a{border-top-right-radius:4px;border-top-left-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0} +.ink-navigation ul.menu.rounded.vertical li:first-child .submenu.dropdown{border-top-right-radius:0;border-top-left-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:0}.ink-navigation ul.menu.rounded.vertical li:first-child .submenu.dropdown li a{border-top-right-radius:0;border-top-left-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:0} +.ink-navigation ul.menu.rounded.vertical li:first-child .submenu.dropdown li:first-child,.ink-navigation ul.menu.rounded.vertical li:first-child .submenu.dropdown li:last-child{border-top-right-radius:0;border-top-left-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:0}.ink-navigation ul.menu.rounded.vertical li:first-child .submenu.dropdown li:first-child a,.ink-navigation ul.menu.rounded.vertical li:first-child .submenu.dropdown li:last-child a{border-top-right-radius:0;border-top-left-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:0} +.ink-navigation ul.menu.rounded.vertical li:last-child{border-top-right-radius:0;border-top-left-radius:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.ink-navigation ul.menu.rounded.vertical li:last-child a{border-top-right-radius:0;border-top-left-radius:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px} +.ink-navigation ul.menu.rounded.vertical li:last-child .submenu.dropdown{border-top-right-radius:0;border-top-left-radius:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.ink-navigation ul.menu.rounded.vertical li:last-child .submenu.dropdown li a{border-top-right-radius:0;border-top-left-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:0} +.ink-navigation ul.menu.rounded.vertical li:last-child .submenu.dropdown li:first-child{border-top-right-radius:0;border-top-left-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:0}.ink-navigation ul.menu.rounded.vertical li:last-child .submenu.dropdown li:first-child a{border-top-right-radius:0;border-top-left-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:0} +.ink-navigation ul.menu.rounded.vertical li:last-child .submenu.dropdown li:last-child{border-top-right-radius:0;border-top-left-radius:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.ink-navigation ul.menu.rounded.vertical li:last-child .submenu.dropdown li:last-child a{border-top-right-radius:0;border-top-left-radius:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px} +.ink-navigation ul.menu.rounded.vertical li .submenu{border-radius:0 4px 4px 4px}.ink-navigation ul.menu.rounded.vertical li .submenu.dropdown{border-top-right-radius:0;border-top-left-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:0}.ink-navigation ul.menu.rounded.vertical li .submenu.dropdown li{border-top-right-radius:0;border-top-left-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:0}.ink-navigation ul.menu.rounded.vertical li .submenu.dropdown li a{border-top-right-radius:0;border-top-left-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:0} +.ink-navigation ul.menu.rounded.vertical li .submenu.dropdown li:first-child{border-top-right-radius:0;border-top-left-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:0}.ink-navigation ul.menu.rounded.vertical li .submenu.dropdown li:first-child a{border-top-right-radius:0;border-top-left-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:0} +.ink-navigation ul.menu.rounded.vertical li .submenu.dropdown li:last-child{border-top-right-radius:0;border-top-left-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:0}.ink-navigation ul.menu.rounded.vertical li .submenu.dropdown li:last-child a{border-top-right-radius:0;border-top-left-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:0} +.ink-navigation ul.menu.rounded.vertical li .submenu li a{border-top-right-radius:0;border-top-left-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:0} +.ink-navigation ul.menu.rounded.vertical li .submenu li:first-child{border-radius:0 4px 0 0}.ink-navigation ul.menu.rounded.vertical li .submenu li:first-child a{border-radius:0 4px 0 0} +.ink-navigation ul.menu.rounded.vertical li .submenu li:last-child{border-top-right-radius:0;border-top-left-radius:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.ink-navigation ul.menu.rounded.vertical li .submenu li:last-child a{border-top-right-radius:0;border-top-left-radius:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px} +.ink-navigation ul.menu.shadowed{-webkit-box-shadow:0 1px 2px 0 rgba(0,0,0,0.3);-moz-box-shadow:0 1px 2px 0 rgba(0,0,0,0.3);box-shadow:0 1px 2px 0 rgba(0,0,0,0.3)}.ink-navigation ul.menu.shadowed li ul.submenu{-webkit-box-shadow:0 1px 2px 0 rgba(0,0,0,0.3);-moz-box-shadow:0 1px 2px 0 rgba(0,0,0,0.3);box-shadow:0 1px 2px 0 rgba(0,0,0,0.3)}.ink-navigation ul.menu.shadowed li ul.submenu.dropdown{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none} +.ink-navigation ul.breadcrumbs li.active a{background:none;color:#999}.ink-navigation ul.breadcrumbs li.active a:hover{cursor:default;text-decoration:none} +.ink-navigation ul.breadcrumbs li a:hover{background:none;text-decoration:underline} +.ink-navigation ul.breadcrumbs.white{background:#fff;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#f2f2f2');background:-moz-linear-gradient(top, #fff 0, #f2f2f2 150%);background:-webkit-gradient(linear, left top, left bottom, color-stop(0, #fff), color-stop(150%, #f2f2f2));background:-webkit-linear-gradient(top, #fff 0, #f2f2f2 150%);background:-o-linear-gradient(top, #fff 0, #f2f2f2 150%);background:-ms-linear-gradient(top, #fff 0, #f2f2f2 150%);background:linear-gradient(to bottom, #fff 0, #f2f2f2 150%)}.ink-navigation ul.breadcrumbs.white li a{color:#555} +.ink-navigation ul.breadcrumbs.white li:after{color:#555} +.ink-navigation ul.breadcrumbs.white li.active a{color:#999;text-shadow:0 1px 0 #fff} +.ink-navigation ul.breadcrumbs.grey{background:#e6e6e6;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#e6e6e6', endColorstr='#cccccc');background:-moz-linear-gradient(top, #e6e6e6 0, #ccc 150%);background:-webkit-gradient(linear, left top, left bottom, color-stop(0, #e6e6e6), color-stop(150%, #ccc));background:-webkit-linear-gradient(top, #e6e6e6 0, #ccc 150%);background:-o-linear-gradient(top, #e6e6e6 0, #ccc 150%);background:-ms-linear-gradient(top, #e6e6e6 0, #ccc 150%);background:linear-gradient(to bottom, #e6e6e6 0, #ccc 150%)}.ink-navigation ul.breadcrumbs.grey li a{color:#555} +.ink-navigation ul.breadcrumbs.grey li:after{color:#555} +.ink-navigation ul.breadcrumbs.grey li.active a{color:#999;text-shadow:0 1px 0 #fff} +.ink-navigation ul.breadcrumbs.black{background:#1a1a1a;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#1a1a1a', endColorstr='#0d0d0d');background:-moz-linear-gradient(top, #1a1a1a 0, #0d0d0d 150%);background:-webkit-gradient(linear, left top, left bottom, color-stop(0, #1a1a1a), color-stop(150%, #0d0d0d));background:-webkit-linear-gradient(top, #1a1a1a 0, #0d0d0d 150%);background:-o-linear-gradient(top, #1a1a1a 0, #0d0d0d 150%);background:-ms-linear-gradient(top, #1a1a1a 0, #0d0d0d 150%);background:linear-gradient(to bottom, #1a1a1a 0, #0d0d0d 150%)}.ink-navigation ul.breadcrumbs.black li a{color:#fff} +.ink-navigation ul.breadcrumbs.black li:after{color:#fff} +.ink-navigation ul.breadcrumbs.black li.active a{color:#666;text-shadow:0 -1px 0 #000} +.ink-navigation ul.breadcrumbs.orange{background:#f2990d;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#f2990d', endColorstr='#c27b0a');background:-moz-linear-gradient(top, #f2990d 0, #c27b0a 150%);background:-webkit-gradient(linear, left top, left bottom, color-stop(0, #f2990d), color-stop(150%, #c27b0a));background:-webkit-linear-gradient(top, #f2990d 0, #c27b0a 150%);background:-o-linear-gradient(top, #f2990d 0, #c27b0a 150%);background:-ms-linear-gradient(top, #f2990d 0, #c27b0a 150%);background:linear-gradient(to bottom, #f2990d 0, #c27b0a 150%)}.ink-navigation ul.breadcrumbs.orange li a{color:#fff} +.ink-navigation ul.breadcrumbs.orange li:after{color:#fff} +.ink-navigation ul.breadcrumbs.orange li.active a{color:#995e00;text-shadow:0 1px 0 #ffac29} +.ink-navigation ul.breadcrumbs.blue{background:#1b75ce;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#1b75ce', endColorstr='#155ba1');background:-moz-linear-gradient(top, #1b75ce 0, #155ba1 150%);background:-webkit-gradient(linear, left top, left bottom, color-stop(0, #1b75ce), color-stop(150%, #155ba1));background:-webkit-linear-gradient(top, #1b75ce 0, #155ba1 150%);background:-o-linear-gradient(top, #1b75ce 0, #155ba1 150%);background:-ms-linear-gradient(top, #1b75ce 0, #155ba1 150%);background:linear-gradient(to bottom, #1b75ce 0, #155ba1 150%)}.ink-navigation ul.breadcrumbs.blue li a{color:#fff} +.ink-navigation ul.breadcrumbs.blue li:after{color:#fff} +.ink-navigation ul.breadcrumbs.blue li.active a{color:#08427b;text-shadow:0 1px 0 #2289f0} +.ink-navigation ul.breadcrumbs.green{background:#4c9220;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#4c9220', endColorstr='#366817');background:-moz-linear-gradient(top, #4c9220 0, #366817 150%);background:-webkit-gradient(linear, left top, left bottom, color-stop(0, #4c9220), color-stop(150%, #366817));background:-webkit-linear-gradient(top, #4c9220 0, #366817 150%);background:-o-linear-gradient(top, #4c9220 0, #366817 150%);background:-ms-linear-gradient(top, #4c9220 0, #366817 150%);background:linear-gradient(to bottom, #4c9220 0, #366817 150%)}.ink-navigation ul.breadcrumbs.green li a{color:#fff} +.ink-navigation ul.breadcrumbs.green li:after{color:#fff} +.ink-navigation ul.breadcrumbs.green li.active a{color:#20420a;text-shadow:0 1px 0 #57b61b} +.ink-navigation ul.breadcrumbs.red{background:#be1c1c;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#be1c1c', endColorstr='#921515');background:-moz-linear-gradient(top, #be1c1c 0, #921515 150%);background:-webkit-gradient(linear, left top, left bottom, color-stop(0, #be1c1c), color-stop(150%, #921515));background:-webkit-linear-gradient(top, #be1c1c 0, #921515 150%);background:-o-linear-gradient(top, #be1c1c 0, #921515 150%);background:-ms-linear-gradient(top, #be1c1c 0, #921515 150%);background:linear-gradient(to bottom, #be1c1c 0, #921515 150%)}.ink-navigation ul.breadcrumbs.red li a{color:#fff} +.ink-navigation ul.breadcrumbs.red li:after{color:#fff} +.ink-navigation ul.breadcrumbs.red li.active a{color:#530707;text-shadow:0 1px 0 #eb1717} +.ink-navigation ul.breadcrumbs.flat{background:#fff;filter:none}.ink-navigation ul.breadcrumbs.flat.grey{background:#d9d9d9} +.ink-navigation ul.breadcrumbs.flat.black{background:#000} +.ink-navigation ul.breadcrumbs.flat.orange{background:#f2990d} +.ink-navigation ul.breadcrumbs.flat.blue{background:#1b75ce} +.ink-navigation ul.breadcrumbs.flat.green{background:#4c9220} +.ink-navigation ul.breadcrumbs.flat.red{background:#be1c1c} +.ink-navigation ul.breadcrumbs.rounded{border-radius:4px} +.ink-navigation ul.breadcrumbs.shadowed{-webkit-box-shadow:0 1px 2px 0 rgba(0,0,0,0.3);-moz-box-shadow:0 1px 2px 0 rgba(0,0,0,0.3);box-shadow:0 1px 2px 0 rgba(0,0,0,0.3)} +.ink-navigation ul.pagination{display:inline-block}.ink-navigation ul.pagination.white li{background:#fff;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#f2f2f2');background:-moz-linear-gradient(top, #fff 0, #f2f2f2 150%);background:-webkit-gradient(linear, left top, left bottom, color-stop(0, #fff), color-stop(150%, #f2f2f2));background:-webkit-linear-gradient(top, #fff 0, #f2f2f2 150%);background:-o-linear-gradient(top, #fff 0, #f2f2f2 150%);background:-ms-linear-gradient(top, #fff 0, #f2f2f2 150%);background:linear-gradient(to bottom, #fff 0, #f2f2f2 150%)}.ink-navigation ul.pagination.white li.active a{background:#d9d9d9} +.ink-navigation ul.pagination.white li.disabled a{color:#999;background:rgba(0,0,0,0);text-shadow:0 1px 0 #fff} +.ink-navigation ul.pagination.white li a{color:#555;text-decoration:none}.ink-navigation ul.pagination.white li a:hover{background:#d9d9d9} +.ink-navigation ul.pagination.grey li{background:#e6e6e6;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#e6e6e6', endColorstr='#cccccc');background:-moz-linear-gradient(top, #e6e6e6 0, #ccc 150%);background:-webkit-gradient(linear, left top, left bottom, color-stop(0, #e6e6e6), color-stop(150%, #ccc));background:-webkit-linear-gradient(top, #e6e6e6 0, #ccc 150%);background:-o-linear-gradient(top, #e6e6e6 0, #ccc 150%);background:-ms-linear-gradient(top, #e6e6e6 0, #ccc 150%);background:linear-gradient(to bottom, #e6e6e6 0, #ccc 150%)}.ink-navigation ul.pagination.grey li.active a{background:#b3b3b3;color:#555} +.ink-navigation ul.pagination.grey li.disabled a{color:#999;background:rgba(0,0,0,0);text-shadow:0 1px 0 #fff} +.ink-navigation ul.pagination.grey li a{color:#555;text-decoration:none}.ink-navigation ul.pagination.grey li a:hover{background:#b3b3b3} +.ink-navigation ul.pagination.black li{background:#1a1a1a;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#1a1a1a', endColorstr='#0d0d0d');background:-moz-linear-gradient(top, #1a1a1a 0, #0d0d0d 150%);background:-webkit-gradient(linear, left top, left bottom, color-stop(0, #1a1a1a), color-stop(150%, #0d0d0d));background:-webkit-linear-gradient(top, #1a1a1a 0, #0d0d0d 150%);background:-o-linear-gradient(top, #1a1a1a 0, #0d0d0d 150%);background:-ms-linear-gradient(top, #1a1a1a 0, #0d0d0d 150%);background:linear-gradient(to bottom, #1a1a1a 0, #0d0d0d 150%)}.ink-navigation ul.pagination.black li.active a{background:#333} +.ink-navigation ul.pagination.black li.disabled a{color:#666;background:rgba(0,0,0,0);text-shadow:0 -1px 0 #000} +.ink-navigation ul.pagination.black li a{color:#fff;text-decoration:none}.ink-navigation ul.pagination.black li a:hover{background:#333} +.ink-navigation ul.pagination.orange li{background:#f2990d;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#f2990d', endColorstr='#c27b0a');background:-moz-linear-gradient(top, #f2990d 0, #c27b0a 150%);background:-webkit-gradient(linear, left top, left bottom, color-stop(0, #f2990d), color-stop(150%, #c27b0a));background:-webkit-linear-gradient(top, #f2990d 0, #c27b0a 150%);background:-o-linear-gradient(top, #f2990d 0, #c27b0a 150%);background:-ms-linear-gradient(top, #f2990d 0, #c27b0a 150%);background:linear-gradient(to bottom, #f2990d 0, #c27b0a 150%)}.ink-navigation ul.pagination.orange li.active a{background:#b36d00} +.ink-navigation ul.pagination.orange li.disabled a{color:#995e00;background:rgba(0,0,0,0);text-shadow:0 1px 0 #ffac29} +.ink-navigation ul.pagination.orange li a{color:#fff;text-decoration:none}.ink-navigation ul.pagination.orange li a:hover{background:#b36d00} +.ink-navigation ul.pagination.blue li{background:#1b75ce;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#1b75ce', endColorstr='#155ba1');background:-moz-linear-gradient(top, #1b75ce 0, #155ba1 150%);background:-webkit-gradient(linear, left top, left bottom, color-stop(0, #1b75ce), color-stop(150%, #155ba1));background:-webkit-linear-gradient(top, #1b75ce 0, #155ba1 150%);background:-o-linear-gradient(top, #1b75ce 0, #155ba1 150%);background:-ms-linear-gradient(top, #1b75ce 0, #155ba1 150%);background:linear-gradient(to bottom, #1b75ce 0, #155ba1 150%)}.ink-navigation ul.pagination.blue li.active a{background:#0a4f92} +.ink-navigation ul.pagination.blue li.disabled a{color:#08427b;background:rgba(0,0,0,0);text-shadow:0 1px 0 #2289f0} +.ink-navigation ul.pagination.blue li a{color:#fff;text-decoration:none}.ink-navigation ul.pagination.blue li a:hover{background:#0a4f92} +.ink-navigation ul.pagination.green li{background:#4c9220;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#4c9220', endColorstr='#366817');background:-moz-linear-gradient(top, #4c9220 0, #366817 150%);background:-webkit-gradient(linear, left top, left bottom, color-stop(0, #4c9220), color-stop(150%, #366817));background:-webkit-linear-gradient(top, #4c9220 0, #366817 150%);background:-o-linear-gradient(top, #4c9220 0, #366817 150%);background:-ms-linear-gradient(top, #4c9220 0, #366817 150%);background:linear-gradient(to bottom, #4c9220 0, #366817 150%)}.ink-navigation ul.pagination.green li.active a{background:#2a580d} +.ink-navigation ul.pagination.green li.disabled a{color:#20420a;background:rgba(0,0,0,0);text-shadow:0 1px 0 #57b61b} +.ink-navigation ul.pagination.green li a{color:#fff;text-decoration:none}.ink-navigation ul.pagination.green li a:hover{background:#2a580d} +.ink-navigation ul.pagination.red li{background:#be1c1c;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#be1c1c', endColorstr='#921515');background:-moz-linear-gradient(top, #be1c1c 0, #921515 150%);background:-webkit-gradient(linear, left top, left bottom, color-stop(0, #be1c1c), color-stop(150%, #921515));background:-webkit-linear-gradient(top, #be1c1c 0, #921515 150%);background:-o-linear-gradient(top, #be1c1c 0, #921515 150%);background:-ms-linear-gradient(top, #be1c1c 0, #921515 150%);background:linear-gradient(to bottom, #be1c1c 0, #921515 150%)}.ink-navigation ul.pagination.red li.active a{background:#820b0b} +.ink-navigation ul.pagination.red li.disabled a{color:#530707;background:rgba(0,0,0,0);text-shadow:0 1px 0 #eb1717} +.ink-navigation ul.pagination.red li a{color:#fff;text-decoration:none}.ink-navigation ul.pagination.red li a:hover{background:#820b0b} +.ink-navigation ul.pagination.flat.white li{background:#fff;filter:none} +.ink-navigation ul.pagination.flat.grey li{background:#d9d9d9;filter:none} +.ink-navigation ul.pagination.flat.black li{background:#000;filter:none} +.ink-navigation ul.pagination.flat.orange li{background:#f2990d;filter:none} +.ink-navigation ul.pagination.flat.blue li{background:#1b75ce;filter:none} +.ink-navigation ul.pagination.flat.green li{background:#4c9220;filter:none} +.ink-navigation ul.pagination.flat.red li{background:#be1c1c;filter:none} +.ink-navigation ul.pagination.rounded li:first-child,.ink-navigation ul.pagination.rounded li:first-child a{border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:4px;border-top-left-radius:4px} +.ink-navigation ul.pagination.rounded li:last-child,.ink-navigation ul.pagination.rounded li:last-child a{border-top-right-radius:4px;border-bottom-right-radius:4px;border-bottom-left-radius:0;border-top-left-radius:0} +.ink-navigation ul.pagination.shadowed li a{-webkit-box-shadow:0 1px 2px 0 rgba(0,0,0,0.3);-moz-box-shadow:0 1px 2px 0 rgba(0,0,0,0.3);box-shadow:0 1px 2px 0 rgba(0,0,0,0.3)} +.ink-navigation ul.pagination li a{text-decoration:none} +.ink-navigation ul.pagination li.active a{text-decoration:underline} +.ink-navigation ul.pagination li.disabled a{color:#b3b3b3;text-shadow:0 1px 0 #fff}.ink-navigation ul.pagination li.disabled a:hover{background:none} +.ink-navigation ul.pagination.dotted li{background:none;filter:none} +.ink-navigation ul.pagination.dotted li{background:none}.ink-navigation ul.pagination.dotted li a{background:#999;filter:alpha(opacity=50);-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=50)";opacity:.5} +.ink-navigation ul.pagination.dotted li:hover a,.ink-navigation ul.pagination.dotted li.active a{filter:alpha(opacity=100);-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=100)";opacity:1} +.ink-navigation ul.pagination.dotted.black li a{background:#1a1a1a} +.ink-navigation ul.pagination.dotted.white li a{background:#fff} +.ink-navigation ul.pagination.dotted.blue li a{background:#1b75ce} +.ink-navigation ul.pagination.dotted.green li a{background:#4c9220} +.ink-navigation ul.pagination.dotted.orange li a{background:#f2990d} +.ink-navigation ul.pagination.dotted.red li a{background:#be1c1c} +.ink-navigation ul.pagination.chevron li.next a,.ink-navigation ul.pagination.chevron li.previous a{color:#fff;filter:alpha(opacity=60);-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=60)";opacity:.6}.ink-navigation ul.pagination.chevron li.next a:hover,.ink-navigation ul.pagination.chevron li.previous a:hover,.ink-navigation ul.pagination.chevron li.next a:focus,.ink-navigation ul.pagination.chevron li.previous a:focus,.ink-navigation ul.pagination.chevron li.next a.active,.ink-navigation ul.pagination.chevron li.previous a.active{filter:alpha(opacity=80);-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=80)";opacity:.8;text-decoration:none;background:none} +.ink-navigation ul.pagination.chevron li.disabled a{color:#fff;filter:alpha(opacity=60);-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=60)";opacity:.6;text-shadow:none}.ink-navigation ul.pagination.chevron li.disabled a:hover,.ink-navigation ul.pagination.chevron li.disabled a:focus{color:#fff;filter:alpha(opacity=60);-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=60)";opacity:.6} +.ink-navigation ul.pagination.chevron.black li.next a,.ink-navigation ul.pagination.chevron.black li.previous a,.ink-navigation ul.pagination.chevron.black li.disabled a{color:#1a1a1a} +.ink-navigation ul.pagination.chevron.grey li.next a,.ink-navigation ul.pagination.chevron.grey li.previous a,.ink-navigation ul.pagination.chevron.grey li.disabled a{color:#d9d9d9} +.ink-navigation ul.pagination.chevron.blue li.next a,.ink-navigation ul.pagination.chevron.blue li.previous a,.ink-navigation ul.pagination.chevron.blue li.disabled a{color:#1b75ce} +.ink-navigation ul.pagination.chevron.green li.next a,.ink-navigation ul.pagination.chevron.green li.previous a,.ink-navigation ul.pagination.chevron.green li.disabled a{color:#4c9220} +.ink-navigation ul.pagination.chevron.orange li.next a,.ink-navigation ul.pagination.chevron.orange li.previous a,.ink-navigation ul.pagination.chevron.orange li.disabled a{color:#f2990d} +.ink-navigation ul.pagination.chevron.red li.next a,.ink-navigation ul.pagination.chevron.red li.previous a,.ink-navigation ul.pagination.chevron.red li.disabled a{color:#be1c1c} +.ink-navigation ul.pills li{background:#fff;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#f2f2f2');background:-moz-linear-gradient(top, #fff 0, #f2f2f2 150%);background:-webkit-gradient(linear, left top, left bottom, color-stop(0, #fff), color-stop(150%, #f2f2f2));background:-webkit-linear-gradient(top, #fff 0, #f2f2f2 150%);background:-o-linear-gradient(top, #fff 0, #f2f2f2 150%);background:-ms-linear-gradient(top, #fff 0, #f2f2f2 150%);background:linear-gradient(to bottom, #fff 0, #f2f2f2 150%)}.ink-navigation ul.pills li a{color:#555;background:none}.ink-navigation ul.pills li a:hover{background:#d9d9d9} +.ink-navigation ul.pills li.active a{background:#d9d9d9} +.ink-navigation ul.pills li.disabled a{color:#999;background:rgba(0,0,0,0);text-shadow:0 1px 0 #fff} +.ink-navigation ul.pills.grey li{background:#e6e6e6;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#e6e6e6', endColorstr='#cccccc');background:-moz-linear-gradient(top, #e6e6e6 0, #ccc 150%);background:-webkit-gradient(linear, left top, left bottom, color-stop(0, #e6e6e6), color-stop(150%, #ccc));background:-webkit-linear-gradient(top, #e6e6e6 0, #ccc 150%);background:-o-linear-gradient(top, #e6e6e6 0, #ccc 150%);background:-ms-linear-gradient(top, #e6e6e6 0, #ccc 150%);background:linear-gradient(to bottom, #e6e6e6 0, #ccc 150%)}.ink-navigation ul.pills.grey li a{color:#555}.ink-navigation ul.pills.grey li a:hover{background:#b3b3b3} +.ink-navigation ul.pills.grey li.active a{background:#b3b3b3} +.ink-navigation ul.pills.grey li.disabled a{color:#999;background:rgba(0,0,0,0);text-shadow:0 1px 0 #fff} +.ink-navigation ul.pills.black li{background:#1a1a1a;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#1a1a1a', endColorstr='#0d0d0d');background:-moz-linear-gradient(top, #1a1a1a 0, #0d0d0d 150%);background:-webkit-gradient(linear, left top, left bottom, color-stop(0, #1a1a1a), color-stop(150%, #0d0d0d));background:-webkit-linear-gradient(top, #1a1a1a 0, #0d0d0d 150%);background:-o-linear-gradient(top, #1a1a1a 0, #0d0d0d 150%);background:-ms-linear-gradient(top, #1a1a1a 0, #0d0d0d 150%);background:linear-gradient(to bottom, #1a1a1a 0, #0d0d0d 150%)}.ink-navigation ul.pills.black li a{color:#fff}.ink-navigation ul.pills.black li a:hover{background:#333} +.ink-navigation ul.pills.black li.active a{background:#333} +.ink-navigation ul.pills.black li.disabled a{color:#666;background:rgba(0,0,0,0);text-shadow:0 -1px 0 #000} +.ink-navigation ul.pills.orange li{background:#f2990d;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#f2990d', endColorstr='#c27b0a');background:-moz-linear-gradient(top, #f2990d 0, #c27b0a 150%);background:-webkit-gradient(linear, left top, left bottom, color-stop(0, #f2990d), color-stop(150%, #c27b0a));background:-webkit-linear-gradient(top, #f2990d 0, #c27b0a 150%);background:-o-linear-gradient(top, #f2990d 0, #c27b0a 150%);background:-ms-linear-gradient(top, #f2990d 0, #c27b0a 150%);background:linear-gradient(to bottom, #f2990d 0, #c27b0a 150%)}.ink-navigation ul.pills.orange li a{color:#fff}.ink-navigation ul.pills.orange li a:hover{background:#b36d00} +.ink-navigation ul.pills.orange li.active a{background:#b36d00} +.ink-navigation ul.pills.orange li.disabled a{color:#995e00;background:rgba(0,0,0,0);text-shadow:0 1px 0 #ffac29} +.ink-navigation ul.pills.blue li{background:#1b75ce;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#1b75ce', endColorstr='#155ba1');background:-moz-linear-gradient(top, #1b75ce 0, #155ba1 150%);background:-webkit-gradient(linear, left top, left bottom, color-stop(0, #1b75ce), color-stop(150%, #155ba1));background:-webkit-linear-gradient(top, #1b75ce 0, #155ba1 150%);background:-o-linear-gradient(top, #1b75ce 0, #155ba1 150%);background:-ms-linear-gradient(top, #1b75ce 0, #155ba1 150%);background:linear-gradient(to bottom, #1b75ce 0, #155ba1 150%)}.ink-navigation ul.pills.blue li a{color:#fff}.ink-navigation ul.pills.blue li a:hover{background:#0a4f92} +.ink-navigation ul.pills.blue li.active a{background:#0a4f92} +.ink-navigation ul.pills.blue li.disabled a{color:#08427b;background:rgba(0,0,0,0);text-shadow:0 1px 0 #2289f0} +.ink-navigation ul.pills.green li{background:#4c9220;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#4c9220', endColorstr='#366817');background:-moz-linear-gradient(top, #4c9220 0, #366817 150%);background:-webkit-gradient(linear, left top, left bottom, color-stop(0, #4c9220), color-stop(150%, #366817));background:-webkit-linear-gradient(top, #4c9220 0, #366817 150%);background:-o-linear-gradient(top, #4c9220 0, #366817 150%);background:-ms-linear-gradient(top, #4c9220 0, #366817 150%);background:linear-gradient(to bottom, #4c9220 0, #366817 150%)}.ink-navigation ul.pills.green li a{color:#fff}.ink-navigation ul.pills.green li a:hover{background:#2a580d} +.ink-navigation ul.pills.green li.active a{background:#2a580d} +.ink-navigation ul.pills.green li.disabled a{color:#20420a;background:rgba(0,0,0,0);text-shadow:0 1px 0 #57b61b} +.ink-navigation ul.pills.red li{background:#be1c1c;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#be1c1c', endColorstr='#921515');background:-moz-linear-gradient(top, #be1c1c 0, #921515 150%);background:-webkit-gradient(linear, left top, left bottom, color-stop(0, #be1c1c), color-stop(150%, #921515));background:-webkit-linear-gradient(top, #be1c1c 0, #921515 150%);background:-o-linear-gradient(top, #be1c1c 0, #921515 150%);background:-ms-linear-gradient(top, #be1c1c 0, #921515 150%);background:linear-gradient(to bottom, #be1c1c 0, #921515 150%)}.ink-navigation ul.pills.red li a{color:#fff}.ink-navigation ul.pills.red li a:hover{background:#820b0b} +.ink-navigation ul.pills.red li.active a{background:#820b0b} +.ink-navigation ul.pills.red li.disabled a{color:#530707;background:rgba(0,0,0,0);text-shadow:0 1px 0 #eb1717} +.ink-navigation ul.pills.flat li{background:#fff} +.ink-navigation ul.pills.flat.grey li{background:#d9d9d9;filter:none} +.ink-navigation ul.pills.flat.black li{background:#000;filter:none} +.ink-navigation ul.pills.flat.orange li{background:#f2990d;filter:none} +.ink-navigation ul.pills.flat.blue li{background:#1b75ce;filter:none} +.ink-navigation ul.pills.flat.green li{background:#4c9220;filter:none} +.ink-navigation ul.pills.flat.red li{background:#be1c1c;filter:none} +.ink-navigation ul.pills.rounded li{border-radius:4px}.ink-navigation ul.pills.rounded li a{border-radius:4px} +.ink-navigation ul.pills.shadowed li{-webkit-box-shadow:0 1px 2px 0 rgba(0,0,0,0.3);-moz-box-shadow:0 1px 2px 0 rgba(0,0,0,0.3);box-shadow:0 1px 2px 0 rgba(0,0,0,0.3)} +.ink-dropdown.red ul.dropdown-menu li.active a{background:#c91111;color:#fff} +.ink-dropdown.orange ul.dropdown-menu li.active a{background:#ff9c00;color:#fff} +.ink-dropdown.green ul.dropdown-menu li.active a{background:#4a9b17;color:#fff} +.ink-dropdown.blue ul.dropdown-menu li.active a{background:#0f75da;color:#fff} +.ink-dropdown.black ul.dropdown-menu li.active a{background:#000;color:#fff} +.ink-form fieldset{border:none;margin-bottom:1.5em;padding:0}.ink-form fieldset legend{font-size:1.438em;font-weight:700;width:100%;border-bottom:1px solid #ddd}.ink-form fieldset legend+*{-webkit-margin-top-collapse:separate;margin:2em 0} +.ink-form p.tip{font-size:.875em;color:#aeaeae;position:relative;margin:.3em 0 0 0.1em} +.ink-form p.label{color:#555;padding:0;white-space:normal} +.ink-form select,.ink-form textarea,.ink-form input[type="text"],.ink-form input[type="password"],.ink-form input[type="datetime"],.ink-form input[type="datetime-local"],.ink-form input[type="date"],.ink-form input[type="month"],.ink-form input[type="time"],.ink-form input[type="week"],.ink-form input[type="number"],.ink-form input[type="email"],.ink-form input[type="url"],.ink-form input[type="search"],.ink-form input[type="tel"],.ink-form input[type="color"]{border-radius:4px;padding:8px 6px;border:1px solid #c4c4c4;resize:none;font-size:14px;background:#fff;vertical-align:middle}.ink-form select:focus,.ink-form textarea:focus,.ink-form input[type="text"]:focus,.ink-form input[type="password"]:focus,.ink-form input[type="datetime"]:focus,.ink-form input[type="datetime-local"]:focus,.ink-form input[type="date"]:focus,.ink-form input[type="month"]:focus,.ink-form input[type="time"]:focus,.ink-form input[type="week"]:focus,.ink-form input[type="number"]:focus,.ink-form input[type="email"]:focus,.ink-form input[type="url"]:focus,.ink-form input[type="search"]:focus,.ink-form input[type="tel"]:focus,.ink-form input[type="color"]:focus{outline:none;border-color:rgba(153,153,153,0.8999999999999999);-webkit-box-shadow:inset 0 1px 3px rgba(0,0,0,0.1),0 0 10px rgba(153,153,153,0.6);-moz-box-shadow:inset 0 1px 3px rgba(0,0,0,0.1),0 0 10px rgba(153,153,153,0.6);box-shadow:inset 0 1px 3px rgba(0,0,0,0.1),0 0 10px rgba(153,153,153,0.6);outline:0 none} +.ink-form .input-file{border-radius:4px;padding:6px;border:1px solid #c4c4c4;background:#fff;vertical-align:middle;line-height:1.2}.ink-form .input-file input[type="file"]{border-top-right-radius:0;border-top-left-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:0;border:none;padding:0;background:none;width:100%} +.ink-form .ink-button{margin:0 5px} +.ink-form label{cursor:pointer} +.ink-form select{line-height:2;cursor:pointer} +.ink-form textarea{min-height:5em} +.ink-form .control-group{line-height:2;margin-bottom:1em}.ink-form .control-group:after{content:" ";display:block;height:0;clear:both;visibility:hidden;zoom:1} +.ink-form .control-group .control{position:relative}.ink-form .control-group .control:after{content:" ";display:block;height:0;clear:both;visibility:hidden;zoom:1} +.ink-form .control-group .control>input,.ink-form .control-group .control>select,.ink-form .control-group .control>textarea{width:100%}.ink-form .control-group .control>input+[class^="icon-"],.ink-form .control-group .control>select+[class^="icon-"],.ink-form .control-group .control>textarea+[class^="icon-"],.ink-form .control-group .control>input+[class*=" icon-"],.ink-form .control-group .control>select+[class*=" icon-"],.ink-form .control-group .control>textarea+[class*=" icon-"]{display:none} +.ink-form .control-group .control.append-button span,.ink-form .control-group .control.append-symbol span,.ink-form .control-group .control.prepend-button span,.ink-form .control-group .control.prepend-symbol span{width:100%;position:relative}.ink-form .control-group .control.append-button span>input,.ink-form .control-group .control.append-symbol span>input,.ink-form .control-group .control.prepend-button span>input,.ink-form .control-group .control.prepend-symbol span>input,.ink-form .control-group .control.append-button span>select,.ink-form .control-group .control.append-symbol span>select,.ink-form .control-group .control.prepend-button span>select,.ink-form .control-group .control.prepend-symbol span>select,.ink-form .control-group .control.append-button span>textarea,.ink-form .control-group .control.append-symbol span>textarea,.ink-form .control-group .control.prepend-button span>textarea,.ink-form .control-group .control.prepend-symbol span>textarea{width:100%} +.ink-form .control-group .control.append-button>input[type="submit"],.ink-form .control-group .control.append-symbol>input[type="submit"],.ink-form .control-group .control.prepend-button>input[type="submit"],.ink-form .control-group .control.prepend-symbol>input[type="submit"],.ink-form .control-group .control.append-button>input[type="button"],.ink-form .control-group .control.append-symbol>input[type="button"],.ink-form .control-group .control.prepend-button>input[type="button"],.ink-form .control-group .control.prepend-symbol>input[type="button"],.ink-form .control-group .control.append-button>input[type="reset"],.ink-form .control-group .control.append-symbol>input[type="reset"],.ink-form .control-group .control.prepend-button>input[type="reset"],.ink-form .control-group .control.prepend-symbol>input[type="reset"]{width:auto} +.ink-form .control-group .control.append-button{display:table}.ink-form .control-group .control.append-button span{display:table-cell}.ink-form .control-group .control.append-button span>input,.ink-form .control-group .control.append-button span>select,.ink-form .control-group .control.append-button span>textarea{border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:4px;border-top-left-radius:4px} +.ink-form .control-group .control.append-button .ink-button{margin:0;border-top-right-radius:4px;border-bottom-right-radius:4px;border-bottom-left-radius:0;border-top-left-radius:0;border-left:none} +.ink-form .control-group .control.prepend-button{display:table}.ink-form .control-group .control.prepend-button span{display:table-cell}.ink-form .control-group .control.prepend-button span>input,.ink-form .control-group .control.prepend-button span>select,.ink-form .control-group .control.prepend-button span>textarea{border-top-right-radius:4px;border-bottom-right-radius:4px;border-bottom-left-radius:0;border-top-left-radius:0} +.ink-form .control-group .control.prepend-button .ink-button{margin:0;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:4px;border-top-left-radius:4px;border-right:none} +.ink-form .control-group .control.append-symbol span{display:block}.ink-form .control-group .control.append-symbol span>input,.ink-form .control-group .control.append-symbol span>select,.ink-form .control-group .control.append-symbol span>textarea{padding-right:2.5em} +.ink-form .control-group .control.append-symbol span>[class^="icon-"],.ink-form .control-group .control.append-symbol span>[class*=" icon-"]{position:absolute;right:1em;top:.15em;pointer-events:none} +.ink-form .control-group .control.prepend-symbol span{display:block}.ink-form .control-group .control.prepend-symbol span>input,.ink-form .control-group .control.prepend-symbol span>select,.ink-form .control-group .control.prepend-symbol span>textarea{padding-left:2.5em} +.ink-form .control-group .control.prepend-symbol span>[class^="icon-"],.ink-form .control-group .control.prepend-symbol span>[class*=" icon-"]{position:absolute;left:1em;top:.15em;pointer-events:none} +.ink-form .control-group input[type="radio"],.ink-form .control-group input[type="checkbox"]{line-height:2;padding:0;border:none;margin-top:0.55em;clear:left;float:left;cursor:pointer}.ink-form .control-group input[type="radio"]+label,.ink-form .control-group input[type="checkbox"]+label{float:left;line-height:2.5;margin-left:0.55em;margin-top:-0.4em} +.ink-form .control-group .inline label{margin-right:1em} +.ink-form .control-group.validation.error input,.ink-form .control-group.validation.error textarea,.ink-form .control-group.validation.error select{outline:none;border-color:rgba(200,10,16,0.8);-webkit-box-shadow:inset 0 1px 3px rgba(0,0,0,0.1),0 0 10px rgba(200,10,16,0.5);-moz-box-shadow:inset 0 1px 3px rgba(0,0,0,0.1),0 0 10px rgba(200,10,16,0.5);box-shadow:inset 0 1px 3px rgba(0,0,0,0.1),0 0 10px rgba(200,10,16,0.5);border:1px solid rgba(200,10,16,0.5)} +.ink-form .control-group.validation.error p.tip{color:rgba(151,8,12,0.5)} +.ink-form .control-group.validation.warning input,.ink-form .control-group.validation.warning textarea,.ink-form .control-group.validation.warning select{outline:none;border-color:rgba(255,156,0,0.8999999999999999);-webkit-box-shadow:inset 0 1px 3px rgba(0,0,0,0.1),0 0 10px rgba(255,156,0,0.6);-moz-box-shadow:inset 0 1px 3px rgba(0,0,0,0.1),0 0 10px rgba(255,156,0,0.6);box-shadow:inset 0 1px 3px rgba(0,0,0,0.1),0 0 10px rgba(255,156,0,0.6);border:1px solid rgba(255,156,0,0.6)} +.ink-form .control-group.validation.warning p.tip{color:rgba(204,125,0,0.6)} +.ink-form .control-group.required label,.ink-form .control-group.required p.label{color:#555}.ink-form .control-group.required label:after,.ink-form .control-group.required p.label:after{content:"\f069";color:#c91111;margin-left:.6em;font-family:FontAwesome;font-size:.75em;width:1.25em} +.ink-form .control-group.required ul.control label:after{content:""} +.status-indicator{position:relative;color:transparent;display:block;float:right;width:1.6em;height:1.6em;line-height:1.6em;font-family:FontAwesome;color:#fff;margin:0.4em 0em 0.4em 0.4em;border-radius:100%}.status-indicator.error{background:#c91111}.status-indicator.error:after{content:"\f00d";text-shadow:0 -1px 0 #9a0d0d} +.status-indicator.error:before{border-right:10px solid #c91111;border-top:5px solid transparent;border-bottom:5px solid transparent} +.status-indicator.success{background:#4a9b17}.status-indicator.success:after{content:"\f00c";text-shadow:0 -1px 0 #3f8514} +.status-indicator.success:before{border-right:10px solid #4a9b17;border-top:5px solid transparent;border-bottom:5px solid transparent} +.status-indicator.success:after,.status-indicator.error:after{display:block;width:104%;text-align:center} +.status-indicator.success:before,.status-indicator.error:before{content:"";width:0;height:0;position:absolute;left:-6px;top:0.5em} +.ink-alert.basic,.ink-alert.block{font-size:.938em;margin:1em 0 ;position:relative;border-radius:4px} +.ink-alert.basic{padding:1em;background:#fbe8bc;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fbe8bc', endColorstr='#f7d88c');background:-moz-linear-gradient(top, #fbe8bc 0, #f7d88c 100%);background:-webkit-gradient(linear, left top, left bottom, color-stop(0, #fbe8bc), color-stop(100%, #f7d88c));background:-webkit-linear-gradient(top, #fbe8bc 0, #f7d88c 100%);background:-o-linear-gradient(top, #fbe8bc 0, #f7d88c 100%);background:-ms-linear-gradient(top, #fbe8bc 0, #f7d88c 100%);background:linear-gradient(to bottom, #fbe8bc 0, #f7d88c 100%);-webkit-box-shadow:0 1px 0 0 rgba(255,255,255,0.3) inset;-moz-box-shadow:0 1px 0 0 rgba(255,255,255,0.3) inset;box-shadow:0 1px 0 0 rgba(255,255,255,0.3) inset;-webkit-box-shadow:0 1px 3px 0 rgba(0,0,0,0.3);-moz-box-shadow:0 1px 3px 0 rgba(0,0,0,0.3);box-shadow:0 1px 3px 0 rgba(0,0,0,0.3)}.ink-alert.basic.success{background:#55b11a;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#55b11a', endColorstr='#4a9b17');background:-moz-linear-gradient(top, #55b11a 0, #4a9b17 100%);background:-webkit-gradient(linear, left top, left bottom, color-stop(0, #55b11a), color-stop(100%, #4a9b17));background:-webkit-linear-gradient(top, #55b11a 0, #4a9b17 100%);background:-o-linear-gradient(top, #55b11a 0, #4a9b17 100%);background:-ms-linear-gradient(top, #55b11a 0, #4a9b17 100%);background:linear-gradient(to bottom, #55b11a 0, #4a9b17 100%);color:#fff} +.ink-alert.basic.error{background:#ee3838;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ee3838', endColorstr='#c91111');background:-moz-linear-gradient(top, #ee3838 0, #c91111 100%);background:-webkit-gradient(linear, left top, left bottom, color-stop(0, #ee3838), color-stop(100%, #c91111));background:-webkit-linear-gradient(top, #ee3838 0, #c91111 100%);background:-o-linear-gradient(top, #ee3838 0, #c91111 100%);background:-ms-linear-gradient(top, #ee3838 0, #c91111 100%);background:linear-gradient(to bottom, #ee3838 0, #c91111 100%);color:#fff} +.ink-alert.basic.info{background:#2c8ef0;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#2c8ef0', endColorstr='#0f75da');background:-moz-linear-gradient(top, #2c8ef0 0, #0f75da 100%);background:-webkit-gradient(linear, left top, left bottom, color-stop(0, #2c8ef0), color-stop(100%, #0f75da));background:-webkit-linear-gradient(top, #2c8ef0 0, #0f75da 100%);background:-o-linear-gradient(top, #2c8ef0 0, #0f75da 100%);background:-ms-linear-gradient(top, #2c8ef0 0, #0f75da 100%);background:linear-gradient(to bottom, #2c8ef0 0, #0f75da 100%);color:#fff} +.ink-alert.basic .ink-close{top:.55em;*top:.2em} +.ink-alert.block{background:#fefbf3;-webkit-box-shadow:0 1px 2px 0 rgba(0,0,0,0.3);-moz-box-shadow:0 1px 2px 0 rgba(0,0,0,0.3);box-shadow:0 1px 2px 0 rgba(0,0,0,0.3);font-size:1em}.ink-alert.block>h4{padding:1em;font-size:.938em;line-height:1.5;color:#555;background:#fbe8bc;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fbe8bc', endColorstr='#f7d88c');background:-moz-linear-gradient(top, #fbe8bc 0, #f7d88c 100%);background:-webkit-gradient(linear, left top, left bottom, color-stop(0, #fbe8bc), color-stop(100%, #f7d88c));background:-webkit-linear-gradient(top, #fbe8bc 0, #f7d88c 100%);background:-o-linear-gradient(top, #fbe8bc 0, #f7d88c 100%);background:-ms-linear-gradient(top, #fbe8bc 0, #f7d88c 100%);background:linear-gradient(to bottom, #fbe8bc 0, #f7d88c 100%);-webkit-box-shadow:0 1px 0 0 rgba(255,255,255,0.3) inset;-moz-box-shadow:0 1px 0 0 rgba(255,255,255,0.3) inset;box-shadow:0 1px 0 0 rgba(255,255,255,0.3) inset;border-top-right-radius:4px;border-top-left-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0;margin:0;border-bottom:1px solid #f6d074} +.ink-alert.block.success>h4{background:#55b11a;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#55b11a', endColorstr='#4a9b17');background:-moz-linear-gradient(top, #55b11a 0, #4a9b17 100%);background:-webkit-gradient(linear, left top, left bottom, color-stop(0, #55b11a), color-stop(100%, #4a9b17));background:-webkit-linear-gradient(top, #55b11a 0, #4a9b17 100%);background:-o-linear-gradient(top, #55b11a 0, #4a9b17 100%);background:-ms-linear-gradient(top, #55b11a 0, #4a9b17 100%);background:linear-gradient(to bottom, #55b11a 0, #4a9b17 100%);border-bottom:1px solid #448e15;color:#fff} +.ink-alert.block.error>h4{background:#ee3838;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ee3838', endColorstr='#c91111');background:-moz-linear-gradient(top, #ee3838 0, #c91111 100%);background:-webkit-gradient(linear, left top, left bottom, color-stop(0, #ee3838), color-stop(100%, #c91111));background:-webkit-linear-gradient(top, #ee3838 0, #c91111 100%);background:-o-linear-gradient(top, #ee3838 0, #c91111 100%);background:-ms-linear-gradient(top, #ee3838 0, #c91111 100%);background:linear-gradient(to bottom, #ee3838 0, #c91111 100%);border-bottom:1px solid #bb1010;color:#fff} +.ink-alert.block.info>h4{background:#2c8ef0;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#2c8ef0', endColorstr='#0f75da');background:-moz-linear-gradient(top, #2c8ef0 0, #0f75da 100%);background:-webkit-gradient(linear, left top, left bottom, color-stop(0, #2c8ef0), color-stop(100%, #0f75da));background:-webkit-linear-gradient(top, #2c8ef0 0, #0f75da 100%);background:-o-linear-gradient(top, #2c8ef0 0, #0f75da 100%);background:-ms-linear-gradient(top, #2c8ef0 0, #0f75da 100%);background:linear-gradient(to bottom, #2c8ef0 0, #0f75da 100%);border-bottom:1px solid #0d68c2;color:#fff} +.ink-alert.block p,.ink-alert.block ul,.ink-alert.block ol{padding:0 1em 1em} +.ink-alert.block ul{list-style:inside } +.ink-alert .ink-dismiss{position:absolute;color:#000;font-family:Arial,sans-serif;font-weight:bold;line-height:0.56em;font-size:1.8em;padding:5px;border:none;background:none;text-shadow:0 1px 0 #fff;filter:alpha(opacity=20);-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=20)";opacity:.2;top:.5em;*top:.2em;right:.4em} +.ink-badge{border-radius:.8em;padding:.2em .6em;color:#fff;font-size:.875em;margin-left:.6em}.ink-badge.orange{background:#ff9c00} +.ink-badge.red{background:#c91111} +.ink-badge.green{background:#4a9b17} +.ink-badge.blue{background:#0f75da} +.ink-badge.white{background:#fff;color:#555} +.ink-badge.black{background:#000} +.ink-badge.grey{background:#808080} +.ink-tooltip{display:inline-block;position:relative}.ink-tooltip>.content{background:#f0f0f0;padding:.5em .6em;border-radius:4px;font-size:.8em;color:#8c8c8c} +.ink-tooltip>.arrow{position:absolute}.ink-tooltip>.arrow.up,.ink-tooltip>.arrow.down,.ink-tooltip>.arrow.left,.ink-tooltip>.arrow.right{width:0;height:0} +.ink-tooltip>.arrow.up{border-left:.4em solid transparent;border-right:.4em solid transparent;border-bottom:.4em solid #f0f0f0;top:-0.4em;left:50%;margin-left:-0.2em} +.ink-tooltip>.arrow.down{border-left:.4em solid transparent;border-right:.4em solid transparent;border-top:.4em solid #f0f0f0;bottom:-0.36363636363636365em;left:50%;margin-left:-0.2em} +.ink-tooltip>.arrow.right{border-top:.4em solid transparent;border-bottom:.4em solid transparent;border-left:.4em solid #f0f0f0;top:50%;right:-0.36363636363636365em;margin-top:-0.4em} +.ink-tooltip>.arrow.left{border-top:.4em solid transparent;border-bottom:.4em solid transparent;border-right:.4em solid #f0f0f0;top:50%;left:-0.36363636363636365em;margin-top:-0.4em} +.ink-tooltip.blue>.content{background:#0f75da;color:#fff} +.ink-tooltip.blue>.arrow.up{border-bottom-color:#0f75da} +.ink-tooltip.blue>.arrow.down{border-top-color:#0f75da} +.ink-tooltip.blue>.arrow.left{border-right-color:#0f75da} +.ink-tooltip.blue>.arrow.right{border-left-color:#0f75da} +.ink-tooltip.red>.content{background:#c91111;color:#fff} +.ink-tooltip.red>.arrow.up{border-bottom-color:#c91111} +.ink-tooltip.red>.arrow.down{border-top-color:#c91111} +.ink-tooltip.red>.arrow.left{border-right-color:#c91111} +.ink-tooltip.red>.arrow.right{border-left-color:#c91111} +.ink-tooltip.orange>.content{background:#ff9c00;color:#fff} +.ink-tooltip.orange>.arrow.up{border-bottom-color:#ff9c00} +.ink-tooltip.orange>.arrow.down{border-top-color:#ff9c00} +.ink-tooltip.orange>.arrow.left{border-right-color:#ff9c00} +.ink-tooltip.orange>.arrow.right{border-left-color:#ff9c00} +.ink-tooltip.green>.content{background:#4a9b17;color:#fff} +.ink-tooltip.green>.arrow.up{border-bottom-color:#4a9b17} +.ink-tooltip.green>.arrow.down{border-top-color:#4a9b17} +.ink-tooltip.green>.arrow.left{border-right-color:#4a9b17} +.ink-tooltip.green>.arrow.right{border-left-color:#4a9b17} +.ink-tooltip.black>.content{background:#000;color:#fff} +.ink-tooltip.black>.arrow.up{border-bottom-color:#000} +.ink-tooltip.black>.arrow.down{border-top-color:#000} +.ink-tooltip.black>.arrow.left{border-right-color:#000} +.ink-tooltip.black>.arrow.right{border-left-color:#000} +.ink-tooltip.grey>.content{background:#ccc;color:#333} +.ink-tooltip.grey>.arrow.up{border-bottom-color:#ccc} +.ink-tooltip.grey>.arrow.down{border-top-color:#ccc} +.ink-tooltip.grey>.arrow.left{border-right-color:#ccc} +.ink-tooltip.grey>.arrow.right{border-left-color:#ccc} +.ink-button{-webkit-appearance:menuitem;font-weight:bold;font-size:15px;padding:7px 12px;border:1px solid #ccc;cursor:pointer;margin:5px;text-decoration:none;text-align:center;display:inline-block;vertical-align:middle;white-space:nowrap;border-radius:4px;color:#333;border-color:#c8c8c8;border-bottom-color:#aeaeae;text-shadow:0 .09em .03em #fff;background:#eee;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#eeeeee', endColorstr='#c8c8c8');background:-moz-linear-gradient(top, #eee 0, #c8c8c8 100%);background:-webkit-gradient(linear, left top, left bottom, color-stop(0, #eee), color-stop(100%, #c8c8c8));background:-webkit-linear-gradient(top, #eee 0, #c8c8c8 100%);background:-o-linear-gradient(top, #eee 0, #c8c8c8 100%);background:-ms-linear-gradient(top, #eee 0, #c8c8c8 100%);background:linear-gradient(to bottom, #eee 0, #c8c8c8 100%);-webkit-box-shadow:0 1px 0 rgba(255,255,255,0.2) inset;-moz-box-shadow:0 1px 0 rgba(255,255,255,0.2) inset;box-shadow:0 1px 0 rgba(255,255,255,0.2) inset}.ink-button:hover{background:#fff;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#cacaca');background:-moz-linear-gradient(top, #fff 0, #cacaca 100%);background:-webkit-gradient(linear, left top, left bottom, color-stop(0, #fff), color-stop(100%, #cacaca));background:-webkit-linear-gradient(top, #fff 0, #cacaca 100%);background:-o-linear-gradient(top, #fff 0, #cacaca 100%);background:-ms-linear-gradient(top, #fff 0, #cacaca 100%);background:linear-gradient(to bottom, #fff 0, #cacaca 100%);-webkit-box-shadow:'0 1px 5px rgba(0, 0, 0, 0.1), inset 0 1px 0 rgba(255, 255, 255, 0.2), inset 0 0em .5em rgba(255, 255, 255, 0.5)';-moz-box-shadow:'0 1px 5px rgba(0, 0, 0, 0.1), inset 0 1px 0 rgba(255, 255, 255, 0.2), inset 0 0em .5em rgba(255, 255, 255, 0.5)';box-shadow:'0 1px 5px rgba(0, 0, 0, 0.1), inset 0 1px 0 rgba(255, 255, 255, 0.2), inset 0 0em .5em rgba(255, 255, 255, 0.5)';color:#333;text-decoration:none} +.ink-button:active{background:#dcdcdc;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#dcdcdc', endColorstr='#ffffff');background:-moz-linear-gradient(top, #dcdcdc 0, #fff 100%);background:-webkit-gradient(linear, left top, left bottom, color-stop(0, #dcdcdc), color-stop(100%, #fff));background:-webkit-linear-gradient(top, #dcdcdc 0, #fff 100%);background:-o-linear-gradient(top, #dcdcdc 0, #fff 100%);background:-ms-linear-gradient(top, #dcdcdc 0, #fff 100%);background:linear-gradient(to bottom, #dcdcdc 0, #fff 100%);-webkit-box-shadow:0 3px 5px 0 rgba(0,0,0,0.25) inset;-moz-box-shadow:0 3px 5px 0 rgba(0,0,0,0.25) inset;box-shadow:0 3px 5px 0 rgba(0,0,0,0.25) inset} +.ink-button[disabled],.ink-button.disabled{background:#eee;box-shadow:none;border:none;filter:none}.ink-button[disabled]:hover,.ink-button.disabled:hover{background:#eee;cursor:not-allowed} +.ink-button.orange{color:#fff;border-color:#b36d00;border-bottom-color:#804e00;text-shadow:0 -0.09em .03em #804e00;background:#ff9c00;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff9c00', endColorstr='#b36d00');background:-moz-linear-gradient(top, #ff9c00 0, #b36d00 100%);background:-webkit-gradient(linear, left top, left bottom, color-stop(0, #ff9c00), color-stop(100%, #b36d00));background:-webkit-linear-gradient(top, #ff9c00 0, #b36d00 100%);background:-o-linear-gradient(top, #ff9c00 0, #b36d00 100%);background:-ms-linear-gradient(top, #ff9c00 0, #b36d00 100%);background:linear-gradient(to bottom, #ff9c00 0, #b36d00 100%);-webkit-box-shadow:0 1px 0 rgba(255,255,255,0.2) inset;-moz-box-shadow:0 1px 0 rgba(255,255,255,0.2) inset;box-shadow:0 1px 0 rgba(255,255,255,0.2) inset}.ink-button.orange:hover{background:#ffaa24;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffaa24', endColorstr='#b87000');background:-moz-linear-gradient(top, #ffaa24 0, #b87000 100%);background:-webkit-gradient(linear, left top, left bottom, color-stop(0, #ffaa24), color-stop(100%, #b87000));background:-webkit-linear-gradient(top, #ffaa24 0, #b87000 100%);background:-o-linear-gradient(top, #ffaa24 0, #b87000 100%);background:-ms-linear-gradient(top, #ffaa24 0, #b87000 100%);background:linear-gradient(to bottom, #ffaa24 0, #b87000 100%);-webkit-box-shadow:'0 1px 5px rgba(0, 0, 0, 0.1), inset 0 1px 0 rgba(255, 255, 255, 0.2), inset 0 0em .5em rgba(255, 255, 255, 0.5)';-moz-box-shadow:'0 1px 5px rgba(0, 0, 0, 0.1), inset 0 1px 0 rgba(255, 255, 255, 0.2), inset 0 0em .5em rgba(255, 255, 255, 0.5)';box-shadow:'0 1px 5px rgba(0, 0, 0, 0.1), inset 0 1px 0 rgba(255, 255, 255, 0.2), inset 0 0em .5em rgba(255, 255, 255, 0.5)';color:#fff;text-decoration:none} +.ink-button.orange:active{background:#db8600;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#db8600', endColorstr='#ffaa24');background:-moz-linear-gradient(top, #db8600 0, #ffaa24 100%);background:-webkit-gradient(linear, left top, left bottom, color-stop(0, #db8600), color-stop(100%, #ffaa24));background:-webkit-linear-gradient(top, #db8600 0, #ffaa24 100%);background:-o-linear-gradient(top, #db8600 0, #ffaa24 100%);background:-ms-linear-gradient(top, #db8600 0, #ffaa24 100%);background:linear-gradient(to bottom, #db8600 0, #ffaa24 100%);-webkit-box-shadow:0 3px 5px 0 rgba(0,0,0,0.25) inset;-moz-box-shadow:0 3px 5px 0 rgba(0,0,0,0.25) inset;box-shadow:0 3px 5px 0 rgba(0,0,0,0.25) inset} +.ink-button.orange.flat{background:#e68c00}.ink-button.orange.flat:hover{background:#cc7d00} +.ink-button.orange[disabled],.ink-button.orange.disabled{background:#dfc69f;box-shadow:none;border:none;text-shadow:none;filter:none}.ink-button.orange[disabled]:hover,.ink-button.orange.disabled:hover{background:#dfc69f;cursor:not-allowed} +.ink-button.red{color:#fff;border-color:#820b0b;border-bottom-color:#530707;text-shadow:0 -0.09em .03em #530707;background:#c91111;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#c91111', endColorstr='#820b0b');background:-moz-linear-gradient(top, #c91111 0, #820b0b 100%);background:-webkit-gradient(linear, left top, left bottom, color-stop(0, #c91111), color-stop(100%, #820b0b));background:-webkit-linear-gradient(top, #c91111 0, #820b0b 100%);background:-o-linear-gradient(top, #c91111 0, #820b0b 100%);background:-ms-linear-gradient(top, #c91111 0, #820b0b 100%);background:linear-gradient(to bottom, #c91111 0, #820b0b 100%);-webkit-box-shadow:0 1px 0 rgba(255,255,255,0.2) inset;-moz-box-shadow:0 1px 0 rgba(255,255,255,0.2) inset;box-shadow:0 1px 0 rgba(255,255,255,0.2) inset}.ink-button.red:hover{background:#ea1414;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ea1414', endColorstr='#870b0b');background:-moz-linear-gradient(top, #ea1414 0, #870b0b 100%);background:-webkit-gradient(linear, left top, left bottom, color-stop(0, #ea1414), color-stop(100%, #870b0b));background:-webkit-linear-gradient(top, #ea1414 0, #870b0b 100%);background:-o-linear-gradient(top, #ea1414 0, #870b0b 100%);background:-ms-linear-gradient(top, #ea1414 0, #870b0b 100%);background:linear-gradient(to bottom, #ea1414 0, #870b0b 100%);-webkit-box-shadow:'0 1px 5px rgba(0, 0, 0, 0.1), inset 0 1px 0 rgba(255, 255, 255, 0.2), inset 0 0em .5em rgba(255, 255, 255, 0.5)';-moz-box-shadow:'0 1px 5px rgba(0, 0, 0, 0.1), inset 0 1px 0 rgba(255, 255, 255, 0.2), inset 0 0em .5em rgba(255, 255, 255, 0.5)';box-shadow:'0 1px 5px rgba(0, 0, 0, 0.1), inset 0 1px 0 rgba(255, 255, 255, 0.2), inset 0 0em .5em rgba(255, 255, 255, 0.5)';color:#fff;text-decoration:none} +.ink-button.red:active{background:#a80e0e;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#a80e0e', endColorstr='#ea1414');background:-moz-linear-gradient(top, #a80e0e 0, #ea1414 100%);background:-webkit-gradient(linear, left top, left bottom, color-stop(0, #a80e0e), color-stop(100%, #ea1414));background:-webkit-linear-gradient(top, #a80e0e 0, #ea1414 100%);background:-o-linear-gradient(top, #a80e0e 0, #ea1414 100%);background:-ms-linear-gradient(top, #a80e0e 0, #ea1414 100%);background:linear-gradient(to bottom, #a80e0e 0, #ea1414 100%);-webkit-box-shadow:0 3px 5px 0 rgba(0,0,0,0.25) inset;-moz-box-shadow:0 3px 5px 0 rgba(0,0,0,0.25) inset;box-shadow:0 3px 5px 0 rgba(0,0,0,0.25) inset} +.ink-button.red.flat{background:#b10f0f}.ink-button.red.flat:hover{background:#9a0d0d} +.ink-button.red[disabled],.ink-button.red.disabled{background:#c99090;box-shadow:none;border:none;text-shadow:none;filter:none}.ink-button.red[disabled]:hover,.ink-button.red.disabled:hover{background:#c99090;cursor:not-allowed} +.ink-button.green{color:#fff;border-color:#2a580d;border-bottom-color:#152c07;text-shadow:0 -0.09em .03em #152c07;background:#4a9b17;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#4a9b17', endColorstr='#2a580d');background:-moz-linear-gradient(top, #4a9b17 0, #2a580d 100%);background:-webkit-gradient(linear, left top, left bottom, color-stop(0, #4a9b17), color-stop(100%, #2a580d));background:-webkit-linear-gradient(top, #4a9b17 0, #2a580d 100%);background:-o-linear-gradient(top, #4a9b17 0, #2a580d 100%);background:-ms-linear-gradient(top, #4a9b17 0, #2a580d 100%);background:linear-gradient(to bottom, #4a9b17 0, #2a580d 100%);-webkit-box-shadow:0 1px 0 rgba(255,255,255,0.2) inset;-moz-box-shadow:0 1px 0 rgba(255,255,255,0.2) inset;box-shadow:0 1px 0 rgba(255,255,255,0.2) inset}.ink-button.green:hover{background:#59ba1c;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#59ba1c', endColorstr='#2c5d0e');background:-moz-linear-gradient(top, #59ba1c 0, #2c5d0e 100%);background:-webkit-gradient(linear, left top, left bottom, color-stop(0, #59ba1c), color-stop(100%, #2c5d0e));background:-webkit-linear-gradient(top, #59ba1c 0, #2c5d0e 100%);background:-o-linear-gradient(top, #59ba1c 0, #2c5d0e 100%);background:-ms-linear-gradient(top, #59ba1c 0, #2c5d0e 100%);background:linear-gradient(to bottom, #59ba1c 0, #2c5d0e 100%);-webkit-box-shadow:'0 1px 5px rgba(0, 0, 0, 0.1), inset 0 1px 0 rgba(255, 255, 255, 0.2), inset 0 0em .5em rgba(255, 255, 255, 0.5)';-moz-box-shadow:'0 1px 5px rgba(0, 0, 0, 0.1), inset 0 1px 0 rgba(255, 255, 255, 0.2), inset 0 0em .5em rgba(255, 255, 255, 0.5)';box-shadow:'0 1px 5px rgba(0, 0, 0, 0.1), inset 0 1px 0 rgba(255, 255, 255, 0.2), inset 0 0em .5em rgba(255, 255, 255, 0.5)';color:#fff;text-decoration:none} +.ink-button.green:active{background:#3b7c12;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#3b7c12', endColorstr='#59ba1c');background:-moz-linear-gradient(top, #3b7c12 0, #59ba1c 100%);background:-webkit-gradient(linear, left top, left bottom, color-stop(0, #3b7c12), color-stop(100%, #59ba1c));background:-webkit-linear-gradient(top, #3b7c12 0, #59ba1c 100%);background:-o-linear-gradient(top, #3b7c12 0, #59ba1c 100%);background:-ms-linear-gradient(top, #3b7c12 0, #59ba1c 100%);background:linear-gradient(to bottom, #3b7c12 0, #59ba1c 100%);-webkit-box-shadow:0 3px 5px 0 rgba(0,0,0,0.25) inset;-moz-box-shadow:0 3px 5px 0 rgba(0,0,0,0.25) inset;box-shadow:0 3px 5px 0 rgba(0,0,0,0.25) inset} +.ink-button.green.flat{background:#3f8514}.ink-button.green.flat:hover{background:#356f10} +.ink-button.green[disabled],.ink-button.green.disabled{background:#93b180;box-shadow:none;border:none;text-shadow:none;filter:none}.ink-button.green[disabled]:hover,.ink-button.green.disabled:hover{background:#93b180;cursor:not-allowed} +.ink-button.blue{color:#fff;border-color:#0a4f92;border-bottom-color:#073563;text-shadow:0 -0.09em .03em #073563;background:#0f75da;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#0f75da', endColorstr='#0a4f92');background:-moz-linear-gradient(top, #0f75da 0, #0a4f92 100%);background:-webkit-gradient(linear, left top, left bottom, color-stop(0, #0f75da), color-stop(100%, #0a4f92));background:-webkit-linear-gradient(top, #0f75da 0, #0a4f92 100%);background:-o-linear-gradient(top, #0f75da 0, #0a4f92 100%);background:-ms-linear-gradient(top, #0f75da 0, #0a4f92 100%);background:linear-gradient(to bottom, #0f75da 0, #0a4f92 100%);-webkit-box-shadow:0 1px 0 rgba(255,255,255,0.2) inset;-moz-box-shadow:0 1px 0 rgba(255,255,255,0.2) inset;box-shadow:0 1px 0 rgba(255,255,255,0.2) inset}.ink-button.blue:hover{background:#1d87ef;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#1d87ef', endColorstr='#0a5197');background:-moz-linear-gradient(top, #1d87ef 0, #0a5197 100%);background:-webkit-gradient(linear, left top, left bottom, color-stop(0, #1d87ef), color-stop(100%, #0a5197));background:-webkit-linear-gradient(top, #1d87ef 0, #0a5197 100%);background:-o-linear-gradient(top, #1d87ef 0, #0a5197 100%);background:-ms-linear-gradient(top, #1d87ef 0, #0a5197 100%);background:linear-gradient(to bottom, #1d87ef 0, #0a5197 100%);-webkit-box-shadow:'0 1px 5px rgba(0, 0, 0, 0.1), inset 0 1px 0 rgba(255, 255, 255, 0.2), inset 0 0em .5em rgba(255, 255, 255, 0.5)';-moz-box-shadow:'0 1px 5px rgba(0, 0, 0, 0.1), inset 0 1px 0 rgba(255, 255, 255, 0.2), inset 0 0em .5em rgba(255, 255, 255, 0.5)';box-shadow:'0 1px 5px rgba(0, 0, 0, 0.1), inset 0 1px 0 rgba(255, 255, 255, 0.2), inset 0 0em .5em rgba(255, 255, 255, 0.5)';color:#fff;text-decoration:none} +.ink-button.blue:active{background:#0d63b9;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#0d63b9', endColorstr='#1d87ef');background:-moz-linear-gradient(top, #0d63b9 0, #1d87ef 100%);background:-webkit-gradient(linear, left top, left bottom, color-stop(0, #0d63b9), color-stop(100%, #1d87ef));background:-webkit-linear-gradient(top, #0d63b9 0, #1d87ef 100%);background:-o-linear-gradient(top, #0d63b9 0, #1d87ef 100%);background:-ms-linear-gradient(top, #0d63b9 0, #1d87ef 100%);background:linear-gradient(to bottom, #0d63b9 0, #1d87ef 100%);-webkit-box-shadow:0 3px 5px 0 rgba(0,0,0,0.25) inset;-moz-box-shadow:0 3px 5px 0 rgba(0,0,0,0.25) inset;box-shadow:0 3px 5px 0 rgba(0,0,0,0.25) inset} +.ink-button.blue.flat{background:#0d68c2}.ink-button.blue.flat:hover{background:#0c5baa} +.ink-button.blue[disabled],.ink-button.blue.disabled{background:#98b4d0;box-shadow:none;border:none;text-shadow:none;filter:none}.ink-button.blue[disabled]:hover,.ink-button.blue.disabled:hover{background:#98b4d0;cursor:not-allowed} +.button-group>.ink-button{float:left;margin:5px 0;border-top-right-radius:0;border-top-left-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:0;border-left:none}.button-group>.ink-button:first-child{border-bottom-left-radius:4px;border-top-left-radius:4px;border-left:1px solid #ccc} +.button-group>.ink-button:last-child{border-bottom-right-radius:4px;border-top-right-radius:4px} +.button-group:after{content:" ";display:block;height:0;clear:both;visibility:hidden;zoom:1} +.button-toolbar>.button-group{margin-right:10px;float:left} +.button-toolbar:after{content:" ";display:block;height:0;clear:both;visibility:hidden;zoom:1} +table.ink-table{width:100%;border-collapse:collapse;border-spacing:0;background:none}table.ink-table tr th{padding:5px 10px;border-bottom:#bbb 1px solid;background:none;font-weight:700;line-height:2}table.ink-table tr th[data-sortable="true"]:hover{cursor:pointer;text-decoration:underline}table.ink-table tr th[data-sortable="true"]:hover i{text-decoration:none} +table.ink-table tr th[data-sortable="true"] i{padding-left:0.5em} +table.ink-table tr td{padding:5px 10px;border-bottom:#bbb 1px solid;background:none;line-height:2} +table.ink-table.alternating tbody tr:nth-child(odd){background-color:#efefef} +table.ink-table.hover tbody tr:hover{background:#fefbd6;cursor:pointer} +table.ink-table.bordered{border-collapse:separate;border:#bbb 1px solid;border-radius:4px}table.ink-table.bordered tr th{border-left:#bbb 1px solid}table.ink-table.bordered tr th:first-child{border-left:none} +table.ink-table.bordered tr:last-child td{border-bottom:none} +table.ink-table.bordered tr td{border-left:#bbb 1px solid}table.ink-table.bordered tr td:first-child{border-left:none} +.content-left,.align-left{text-align:left} +.content-center,.align-center{text-align:center} +.content-right,.align-right{text-align:right} +.show-all{display:inherit !important} +.hide-all{display:none !important} +.ink-grid{width:auto;max-width:1200px;margin:0 auto;padding:0 2em} +.column-group{clear:both;zoom:1}.column-group:after{content:" ";display:block;height:0;clear:both;visibility:hidden} +.column-group.gutters,.column-group.horizontal-gutters{margin-left:-2em} +.column-group.half-gutters,.column-group.half-horizontal-gutters{margin-left:-1em} +.column-group.quarter-gutters,.column-group.quarter-horizontal-gutters{margin-left:-0.5em} +.column-group.double-gutters,.column-group.double-horizontal-gutters{margin-left:-4em} +.large-95{width:95%;float:left;clear:none} +.large-90{width:90%;float:left;clear:none} +.large-85{width:85%;float:left;clear:none} +.large-80{width:80%;float:left;clear:none} +.large-75{width:75%;float:left;clear:none} +.large-70{width:70%;float:left;clear:none} +.large-65{width:65%;float:left;clear:none} +.large-60{width:60%;float:left;clear:none} +.large-55{width:55%;float:left;clear:none} +.large-50{width:50%;float:left;clear:none} +.large-45{width:45%;float:left;clear:none} +.large-40{width:40%;float:left;clear:none} +.large-35{width:35%;float:left;clear:none} +.large-30{width:30%;float:left;clear:none} +.large-25{width:25%;float:left;clear:none} +.large-20{width:20%;float:left;clear:none} +.large-15{width:15%;float:left;clear:none} +.large-10{width:10%;float:left;clear:none} +.large-5{width:5%;float:left;clear:none} +.large-33{width:33.33%;float:left;clear:none} +.large-66{width:66.66%;float:left;clear:none} +.large-100{width:100%;clear:both;float:none} +[class*="large-"]{margin-top:0;zoom:1} +table[class*="large-"],th[class*="large-"],td[class*="large-"]{float:none} +body.animated *[class*="large-"]{-webkit-transition-property:width, font-size, line-height;-moz-transition-property:width, font-size, line-height;-o-transition-property:width, font-size, line-height;-ms-transition-property:width, font-size, line-height;transition-property:width, font-size, line-height;-webkit-transition-duration:125ms;-moz-transition-duration:125ms;-o-transition-duration:125ms;-ms-transition-duration:125ms;transition-duration:125ms;-webkit-transition-timing-function:ease-in-out;-moz-transition-timing-function:ease-in-out;-o-transition-timing-function:ease-in-out;-ms-transition-timing-function:ease-in-out;transition-timing-function:ease-in-out;-webkit-transition-delay:0;-moz-transition-delay:0;-o-transition-delay:0;-ms-transition-delay:0;transition-delay:0} +.ink-grid .column-group.gutters>[class*="large-"]{padding-left:2em;margin-bottom:2em} +.ink-grid .column-group.half-gutters>[class*="large-"]{padding-left:1em;margin-bottom:1em} +.ink-grid .column-group.quarter-gutters>[class*="large-"]{padding-left:.5em;margin-bottom:.5em} +.ink-grid .column-group.double-gutters>[class*="large-"]{padding-left:4em;margin-bottom:4em} +.ink-grid .column-group.horizontal-gutters>[class*="large-"]{padding-left:2em} +.ink-grid .column-group.half-horizontal-gutters>[class*="large-"]{padding-left:1em} +.ink-grid .column-group.quarter-horizontal-gutters>[class*="large-"]{padding-left:.5em} +.ink-grid .column-group.double-horizontal-gutters>[class*="large-"]{padding-left:4em} +.ink-grid .column-group.vertical-gutters>[class*="large-"]{margin-bottom:2em} +.ink-grid .column-group.half-vertical-gutters>[class*="large-"]{margin-bottom:1em} +.ink-grid .column-group.quarter-vertical-gutters>[class*="large-"]{margin-bottom:.5em} +.ink-grid .column-group.double-vertical-gutters>[class*="large-"]{margin-bottom:4em} +.ink-grid .column-group.large-gutters>[class*="large-"]{padding-left:2em;margin-bottom:2em} +.ink-grid .column-group.large-half-gutters>[class*="large-"]{padding-left:1em;margin-bottom:1em} +.ink-grid .column-group.large-quarter-gutters>[class*="large-"]{padding-left:.5em;margin-bottom:.5em} +.ink-grid .column-group.large-double-gutters>[class*="large-"]{padding-left:4em;margin-bottom:4em} +.ink-grid .column-group.large-horizontal-gutters>[class*="large-"]{padding-left:2em} +.ink-grid .column-group.large-half-horizontal-gutters>[class*="large-"]{padding-left:1em} +.ink-grid .column-group.quarter-horizontal-gutters>[class*="large-"]{padding-left:.5em} +.ink-grid .column-group.double-horizontal-gutters>[class*="large-"]{padding-left:4em} +.ink-grid .column-group.large-vertical-gutters>[class*="large-"]{margin-bottom:2em} +.ink-grid .column-group.large-half-vertical-gutters>[class*="large-"]{margin-bottom:1em} +.ink-grid .column-group.large-quarter-vertical-gutters>[class*="large-"]{margin-bottom:.5em} +.ink-grid .column-group.large-double-vertical-gutters>[class*="large-"]{margin-bottom:4em} +[class*="large-"]:empty:after{content:"\00a0"} +.large-push-left{float:left} +.large-push-center{float:none;margin-left:auto;margin-right:auto} +.large-push-right{float:right} +.large-align-left{text-align:left} +.large-align-center{text-align:center} +.large-align-right{text-align:right} +.space{margin:2em} +.half-space{margin:1em} +.quarter-space{margin:.5em} +.double-space{margin:4em} +.large-space{margin:2em} +.large-half-space{margin:1em} +.large-quarter-space{margin:.5em} +.large-double-space{margin:4em} +.vspace,.vertical-space{margin-top:2em;margin-bottom:2em} +.half-vertical-space{margin-top:1em;margin-bottom:1em} +.quarter-vertical-space{margin-top:.5em;margin-bottom:.5em} +.double-vertical-space{margin-top:4em;margin-bottom:4em} +.hspace,.horizontal-space{margin-left:2em;margin-right:2em} +.half-horizontal-space{margin-left:1em;margin-right:1em} +.quarter-horizontal-space{margin-left:.5em;margin-right:.5em} +.double-horizontal-space{margin-left:4em;margin-right:4em} +.large-vspace,.large-vertical-space{margin-top:2em;margin-bottom:2em} +.large-half-vertical-space{margin-top:1em;margin-bottom:1em} +.large-quarter-vertical-space{margin-top:.5em;margin-bottom:.5em} +.large-double-vertical-space{margin-top:4em;margin-bottom:4em} +.large-hspace,.large-horizontal-space{margin-left:2em;margin-right:2em} +.large-half-horizontal-space{margin-left:1em;margin-right:1em} +.large-quarter-horizontal-space{margin-left:.5em;margin-right:.5em} +.large-double-horizontal-space{margin-left:4em;margin-right:4em} +.top-space{margin-top:2em}.top-space:first-child{margin-top:2em} +.half-top-space{margin-top:1em}.half-top-space:first-child{margin-top:1em} +.quarter-top-space{margin-top:.5em}.quarter-top-space:first-child{margin-top:.5em} +.double-top-space{margin-top:4em}.double-top-space:first-child{margin-top:4em} +.large-top-space{margin-top:2em} +.large-half-top-space{margin-top:1em} +.large-quarter-top-space{margin-top:.5em} +.large-double-top-space{margin-top:4em} +.right-space{margin-right:2em} +.half-right-space{margin-right:1em} +.quarter-right-space{margin-right:.5em} +.double-right-space{margin-right:4em} +.large-right-space{margin-right:2em} +.large-half-right-space{margin-right:1em} +.large-quarter-right-space{margin-right:.5em} +.large-double-right-space{margin-right:4em} +.bottom-space{margin-bottom:2em} +.half-bottom-space{margin-bottom:1em} +.quarter-bottom-space{margin-bottom:.5em} +.double-bottom-space{margin-bottom:4em} +.large-bottom-space{margin-bottom:2em} +.large-half-bottom-space{margin-bottom:1em} +.large-quarter-bottom-space{margin-bottom:.5em} +.large-double-bottom-space{margin-bottom:4em} +.left-space{margin-left:2em} +.half-left-space{margin-left:1em} +.quarter-left-space{margin-left:.5em} +.double-left-space{margin-left:.5em} +.large-left-space{margin-left:2em} +.large-half-left-space{margin-left:1em} +.large-quarter-left-space{margin-left:.5em} +.large-double-left-space{margin-left:.5em} +@media screen and (min-width:960px){.hide-large{display:none !important} .show-large{display:inherit !important} table.show-large{display:table !important} thead.show-large{display:table-header-group !important} tbody.show-large{display:table-row-group !important} tfoot.show-large{display:table-footer-group !important} tr.show-large{display:table-row !important} th.show-large,td.show-large{display:table-cell !important}}@media screen and (min-width:650px) and (max-width:959px){.ink-grid{width:auto;max-width:1200px;margin:0 auto;padding:0 1.5em} .column-group{clear:both;zoom:1}.column-group:after{content:" ";display:block;height:0;clear:both;visibility:hidden} .column-group.gutters,.column-group.horizontal-gutters{margin-left:-1.5em} .column-group.half-gutters,.column-group.half-horizontal-gutters{margin-left:-0.75em} .column-group.quarter-gutters,.column-group.quarter-horizontal-gutters{margin-left:-0.375em} .column-group.double-gutters,.column-group.double-horizontal-gutters{margin-left:-3em} .medium-95{width:95%;float:left;clear:none} .medium-90{width:90%;float:left;clear:none} .medium-85{width:85%;float:left;clear:none} .medium-80{width:80%;float:left;clear:none} .medium-75{width:75%;float:left;clear:none} .medium-70{width:70%;float:left;clear:none} .medium-65{width:65%;float:left;clear:none} .medium-60{width:60%;float:left;clear:none} .medium-55{width:55%;float:left;clear:none} .medium-50{width:50%;float:left;clear:none} .medium-45{width:45%;float:left;clear:none} .medium-40{width:40%;float:left;clear:none} .medium-35{width:35%;float:left;clear:none} .medium-30{width:30%;float:left;clear:none} .medium-25{width:25%;float:left;clear:none} .medium-20{width:20%;float:left;clear:none} .medium-15{width:15%;float:left;clear:none} .medium-10{width:10%;float:left;clear:none} .medium-5{width:5%;float:left;clear:none} .medium-33{width:33.33%;float:left;clear:none} .medium-66{width:66.66%;float:left;clear:none} .medium-100{width:100%;clear:both;float:none} [class*="medium-"]{margin-top:0;zoom:1} table[class*="medium-"],th[class*="medium-"],td[class*="medium-"]{float:none} body.animated *[class*="medium-"]{-webkit-transition-property:width, font-size, line-height;-moz-transition-property:width, font-size, line-height;-o-transition-property:width, font-size, line-height;-ms-transition-property:width, font-size, line-height;transition-property:width, font-size, line-height;-webkit-transition-duration:125ms;-moz-transition-duration:125ms;-o-transition-duration:125ms;-ms-transition-duration:125ms;transition-duration:125ms;-webkit-transition-timing-function:ease-in-out;-moz-transition-timing-function:ease-in-out;-o-transition-timing-function:ease-in-out;-ms-transition-timing-function:ease-in-out;transition-timing-function:ease-in-out;-webkit-transition-delay:0;-moz-transition-delay:0;-o-transition-delay:0;-ms-transition-delay:0;transition-delay:0} .ink-grid .column-group.gutters>[class*="medium-"]{padding-left:1.5em;margin-bottom:1.5em} .ink-grid .column-group.half-gutters>[class*="medium-"]{padding-left:.75em;margin-bottom:.75em} .ink-grid .column-group.quarter-gutters>[class*="medium-"]{padding-left:.375em;margin-bottom:.375em} .ink-grid .column-group.double-gutters>[class*="medium-"]{padding-left:3em;margin-bottom:3em} .ink-grid .column-group.horizontal-gutters>[class*="medium-"]{padding-left:1.5em} .ink-grid .column-group.half-horizontal-gutters>[class*="medium-"]{padding-left:.75em} .ink-grid .column-group.quarter-horizontal-gutters>[class*="medium-"]{padding-left:.375em} .ink-grid .column-group.double-horizontal-gutters>[class*="medium-"]{padding-left:3em} .ink-grid .column-group.vertical-gutters>[class*="medium-"]{margin-bottom:1.5em} .ink-grid .column-group.half-vertical-gutters>[class*="medium-"]{margin-bottom:.75em} .ink-grid .column-group.quarter-vertical-gutters>[class*="medium-"]{margin-bottom:.375em} .ink-grid .column-group.double-vertical-gutters>[class*="medium-"]{margin-bottom:3em} .ink-grid .column-group.medium-gutters>[class*="medium-"]{padding-left:1.5em;margin-bottom:1.5em} .ink-grid .column-group.medium-half-gutters>[class*="medium-"]{padding-left:.75em;margin-bottom:.75em} .ink-grid .column-group.medium-quarter-gutters>[class*="medium-"]{padding-left:.375em;margin-bottom:.375em} .ink-grid .column-group.medium-double-gutters>[class*="medium-"]{padding-left:3em;margin-bottom:3em} .ink-grid .column-group.medium-horizontal-gutters>[class*="medium-"]{padding-left:1.5em} .ink-grid .column-group.medium-half-horizontal-gutters>[class*="medium-"]{padding-left:.75em} .ink-grid .column-group.quarter-horizontal-gutters>[class*="medium-"]{padding-left:.375em} .ink-grid .column-group.double-horizontal-gutters>[class*="medium-"]{padding-left:3em} .ink-grid .column-group.medium-vertical-gutters>[class*="medium-"]{margin-bottom:1.5em} .ink-grid .column-group.medium-half-vertical-gutters>[class*="medium-"]{margin-bottom:.75em} .ink-grid .column-group.medium-quarter-vertical-gutters>[class*="medium-"]{margin-bottom:.375em} .ink-grid .column-group.medium-double-vertical-gutters>[class*="medium-"]{margin-bottom:3em} [class*="medium-"]:empty:after{content:"\00a0"} .medium-push-left{float:left} .medium-push-center{float:none;margin-left:auto;margin-right:auto} .medium-push-right{float:right} .medium-align-left{text-align:left} .medium-align-center{text-align:center} .medium-align-right{text-align:right} .space{margin:1.5em} .half-space{margin:.75em} .quarter-space{margin:.375em} .double-space{margin:3em} .medium-space{margin:1.5em} .medium-half-space{margin:.75em} .medium-quarter-space{margin:.375em} .medium-double-space{margin:3em} .vspace,.vertical-space{margin-top:1.5em;margin-bottom:1.5em} .half-vertical-space{margin-top:.75em;margin-bottom:.75em} .quarter-vertical-space{margin-top:.375em;margin-bottom:.375em} .double-vertical-space{margin-top:3em;margin-bottom:3em} .hspace,.horizontal-space{margin-left:1.5em;margin-right:1.5em} .half-horizontal-space{margin-left:.75em;margin-right:.75em} .quarter-horizontal-space{margin-left:.375em;margin-right:.375em} .double-horizontal-space{margin-left:3em;margin-right:3em} .medium-vspace,.medium-vertical-space{margin-top:1.5em;margin-bottom:1.5em} .medium-half-vertical-space{margin-top:.75em;margin-bottom:.75em} .medium-quarter-vertical-space{margin-top:.375em;margin-bottom:.375em} .medium-double-vertical-space{margin-top:3em;margin-bottom:3em} .medium-hspace,.medium-horizontal-space{margin-left:1.5em;margin-right:1.5em} .medium-half-horizontal-space{margin-left:.75em;margin-right:.75em} .medium-quarter-horizontal-space{margin-left:.375em;margin-right:.375em} .medium-double-horizontal-space{margin-left:3em;margin-right:3em} .top-space{margin-top:1.5em}.top-space:first-child{margin-top:1.5em} .half-top-space{margin-top:.75em}.half-top-space:first-child{margin-top:.75em} .quarter-top-space{margin-top:.375em}.quarter-top-space:first-child{margin-top:.375em} .double-top-space{margin-top:3em}.double-top-space:first-child{margin-top:3em} .medium-top-space{margin-top:1.5em} .medium-half-top-space{margin-top:.75em} .medium-quarter-top-space{margin-top:.375em} .medium-double-top-space{margin-top:3em} .right-space{margin-right:1.5em} .half-right-space{margin-right:.75em} .quarter-right-space{margin-right:.375em} .double-right-space{margin-right:3em} .medium-right-space{margin-right:1.5em} .medium-half-right-space{margin-right:.75em} .medium-quarter-right-space{margin-right:.375em} .medium-double-right-space{margin-right:3em} .bottom-space{margin-bottom:1.5em} .half-bottom-space{margin-bottom:.75em} .quarter-bottom-space{margin-bottom:.375em} .double-bottom-space{margin-bottom:3em} .medium-bottom-space{margin-bottom:1.5em} .medium-half-bottom-space{margin-bottom:.75em} .medium-quarter-bottom-space{margin-bottom:.375em} .medium-double-bottom-space{margin-bottom:3em} .left-space{margin-left:1.5em} .half-left-space{margin-left:.75em} .quarter-left-space{margin-left:.375em} .double-left-space{margin-left:.375em} .medium-left-space{margin-left:1.5em} .medium-half-left-space{margin-left:.75em} .medium-quarter-left-space{margin-left:.375em} .medium-double-left-space{margin-left:.375em} .hide-medium{display:none !important} .show-medium{display:inherit !important} table.show-medium{display:table !important} thead.show-medium{display:table-header-group !important} tbody.show-medium{display:table-row-group !important} tfoot.show-medium{display:table-footer-group !important} tr.show-medium{display:table-row !important} th.show-medium,td.show-medium{display:table-cell !important}}@media screen and (max-width:649px){.ink-grid{width:auto;max-width:1200px;margin:0 auto;padding:0 1em} .column-group{clear:both;zoom:1}.column-group:after{content:" ";display:block;height:0;clear:both;visibility:hidden} .column-group.gutters,.column-group.horizontal-gutters{margin-left:-1em} .column-group.half-gutters,.column-group.half-horizontal-gutters{margin-left:-0.5em} .column-group.quarter-gutters,.column-group.quarter-horizontal-gutters{margin-left:-0.25em} .column-group.double-gutters,.column-group.double-horizontal-gutters{margin-left:-2em} .small-95{width:95%;float:left;clear:none} .small-90{width:90%;float:left;clear:none} .small-85{width:85%;float:left;clear:none} .small-80{width:80%;float:left;clear:none} .small-75{width:75%;float:left;clear:none} .small-70{width:70%;float:left;clear:none} .small-65{width:65%;float:left;clear:none} .small-60{width:60%;float:left;clear:none} .small-55{width:55%;float:left;clear:none} .small-50{width:50%;float:left;clear:none} .small-45{width:45%;float:left;clear:none} .small-40{width:40%;float:left;clear:none} .small-35{width:35%;float:left;clear:none} .small-30{width:30%;float:left;clear:none} .small-25{width:25%;float:left;clear:none} .small-20{width:20%;float:left;clear:none} .small-15{width:15%;float:left;clear:none} .small-10{width:10%;float:left;clear:none} .small-5{width:5%;float:left;clear:none} .small-33{width:33.33%;float:left;clear:none} .small-66{width:66.66%;float:left;clear:none} .small-100{width:100%;clear:both;float:none} [class*="small-"]{margin-top:0;zoom:1} table[class*="small-"],th[class*="small-"],td[class*="small-"]{float:none} body.animated *[class*="small-"]{-webkit-transition-property:width, font-size, line-height;-moz-transition-property:width, font-size, line-height;-o-transition-property:width, font-size, line-height;-ms-transition-property:width, font-size, line-height;transition-property:width, font-size, line-height;-webkit-transition-duration:125ms;-moz-transition-duration:125ms;-o-transition-duration:125ms;-ms-transition-duration:125ms;transition-duration:125ms;-webkit-transition-timing-function:ease-in-out;-moz-transition-timing-function:ease-in-out;-o-transition-timing-function:ease-in-out;-ms-transition-timing-function:ease-in-out;transition-timing-function:ease-in-out;-webkit-transition-delay:0;-moz-transition-delay:0;-o-transition-delay:0;-ms-transition-delay:0;transition-delay:0} .ink-grid .column-group.gutters>[class*="small-"]{padding-left:1em;margin-bottom:1em} .ink-grid .column-group.half-gutters>[class*="small-"]{padding-left:.5em;margin-bottom:.5em} .ink-grid .column-group.quarter-gutters>[class*="small-"]{padding-left:.25em;margin-bottom:.25em} .ink-grid .column-group.double-gutters>[class*="small-"]{padding-left:2em;margin-bottom:2em} .ink-grid .column-group.horizontal-gutters>[class*="small-"]{padding-left:1em} .ink-grid .column-group.half-horizontal-gutters>[class*="small-"]{padding-left:.5em} .ink-grid .column-group.quarter-horizontal-gutters>[class*="small-"]{padding-left:.25em} .ink-grid .column-group.double-horizontal-gutters>[class*="small-"]{padding-left:2em} .ink-grid .column-group.vertical-gutters>[class*="small-"]{margin-bottom:1em} .ink-grid .column-group.half-vertical-gutters>[class*="small-"]{margin-bottom:.5em} .ink-grid .column-group.quarter-vertical-gutters>[class*="small-"]{margin-bottom:.25em} .ink-grid .column-group.double-vertical-gutters>[class*="small-"]{margin-bottom:2em} .ink-grid .column-group.small-gutters>[class*="small-"]{padding-left:1em;margin-bottom:1em} .ink-grid .column-group.small-half-gutters>[class*="small-"]{padding-left:.5em;margin-bottom:.5em} .ink-grid .column-group.small-quarter-gutters>[class*="small-"]{padding-left:.25em;margin-bottom:.25em} .ink-grid .column-group.small-double-gutters>[class*="small-"]{padding-left:2em;margin-bottom:2em} .ink-grid .column-group.small-horizontal-gutters>[class*="small-"]{padding-left:1em} .ink-grid .column-group.small-half-horizontal-gutters>[class*="small-"]{padding-left:.5em} .ink-grid .column-group.quarter-horizontal-gutters>[class*="small-"]{padding-left:.25em} .ink-grid .column-group.double-horizontal-gutters>[class*="small-"]{padding-left:2em} .ink-grid .column-group.small-vertical-gutters>[class*="small-"]{margin-bottom:1em} .ink-grid .column-group.small-half-vertical-gutters>[class*="small-"]{margin-bottom:.5em} .ink-grid .column-group.small-quarter-vertical-gutters>[class*="small-"]{margin-bottom:.25em} .ink-grid .column-group.small-double-vertical-gutters>[class*="small-"]{margin-bottom:2em} [class*="small-"]:empty:after{content:"\00a0"} .small-push-left{float:left} .small-push-center{float:none;margin-left:auto;margin-right:auto} .small-push-right{float:right} .small-align-left{text-align:left} .small-align-center{text-align:center} .small-align-right{text-align:right} .space{margin:1em} .half-space{margin:.5em} .quarter-space{margin:.25em} .double-space{margin:2em} .small-space{margin:1em} .small-half-space{margin:.5em} .small-quarter-space{margin:.25em} .small-double-space{margin:2em} .vspace,.vertical-space{margin-top:1em;margin-bottom:1em} .half-vertical-space{margin-top:.5em;margin-bottom:.5em} .quarter-vertical-space{margin-top:.25em;margin-bottom:.25em} .double-vertical-space{margin-top:2em;margin-bottom:2em} .hspace,.horizontal-space{margin-left:1em;margin-right:1em} .half-horizontal-space{margin-left:.5em;margin-right:.5em} .quarter-horizontal-space{margin-left:.25em;margin-right:.25em} .double-horizontal-space{margin-left:2em;margin-right:2em} .small-vspace,.small-vertical-space{margin-top:1em;margin-bottom:1em} .small-half-vertical-space{margin-top:.5em;margin-bottom:.5em} .small-quarter-vertical-space{margin-top:.25em;margin-bottom:.25em} .small-double-vertical-space{margin-top:2em;margin-bottom:2em} .small-hspace,.small-horizontal-space{margin-left:1em;margin-right:1em} .small-half-horizontal-space{margin-left:.5em;margin-right:.5em} .small-quarter-horizontal-space{margin-left:.25em;margin-right:.25em} .small-double-horizontal-space{margin-left:2em;margin-right:2em} .top-space{margin-top:1em}.top-space:first-child{margin-top:1em} .half-top-space{margin-top:.5em}.half-top-space:first-child{margin-top:.5em} .quarter-top-space{margin-top:.25em}.quarter-top-space:first-child{margin-top:.25em} .double-top-space{margin-top:2em}.double-top-space:first-child{margin-top:2em} .small-top-space{margin-top:1em} .small-half-top-space{margin-top:.5em} .small-quarter-top-space{margin-top:.25em} .small-double-top-space{margin-top:2em} .right-space{margin-right:1em} .half-right-space{margin-right:.5em} .quarter-right-space{margin-right:.25em} .double-right-space{margin-right:2em} .small-right-space{margin-right:1em} .small-half-right-space{margin-right:.5em} .small-quarter-right-space{margin-right:.25em} .small-double-right-space{margin-right:2em} .bottom-space{margin-bottom:1em} .half-bottom-space{margin-bottom:.5em} .quarter-bottom-space{margin-bottom:.25em} .double-bottom-space{margin-bottom:2em} .small-bottom-space{margin-bottom:1em} .small-half-bottom-space{margin-bottom:.5em} .small-quarter-bottom-space{margin-bottom:.25em} .small-double-bottom-space{margin-bottom:2em} .left-space{margin-left:1em} .half-left-space{margin-left:.5em} .quarter-left-space{margin-left:.25em} .double-left-space{margin-left:.25em} .small-left-space{margin-left:1em} .small-half-left-space{margin-left:.5em} .small-quarter-left-space{margin-left:.25em} .small-double-left-space{margin-left:.25em} .hide-small{display:none !important} .show-small{display:inherit !important} table.show-small{display:table !important} thead.show-small{display:table-header-group !important} tbody.show-small{display:table-row-group !important} tfoot.show-small{display:table-footer-group !important} tr.show-small{display:table-row !important} th.show-small,td.show-small{display:table-cell !important}}.animated.slow{animation-duration:1s} +.animated.medium{animation-duration:0.5s} +.animated.fast{animation-duration:0.2s} +.ink-sticky-stuck{position:fixed} +.ink-datepicker-wrapper{position:relative} +.ink-datepicker-calendar{margin-top:0;position:absolute}.ink-datepicker-calendar.right{left:100%;top:0} +.ink-datepicker-calendar.left{right:100%;top:0} +.ink-datepicker-calendar.bottom{top:100%;left:0} +.ink-datepicker-calendar.top{bottom:100%;left:0} +.ink-datepicker-wrapper,.ink-datepicker-calendar{display:inline;display:inline-block} +.ink-calendar{border-radius:4px;text-align:center;padding:.3em;min-width:17.400000000000002em;font-size:13px;-webkit-box-shadow:0 1px 2px 0 rgba(0,0,0,0.4);-moz-box-shadow:0 1px 2px 0 rgba(0,0,0,0.4);box-shadow:0 1px 2px 0 rgba(0,0,0,0.4);background:#fff;z-index:10}.ink-calendar a{text-decoration:none} +.ink-calendar li{list-style:none inside} +html.ink-modal-is-open .ink-calendar{z-index:101} +.ink-calendar-top-options{padding:5px;font-size:.813em;cursor:pointer}.ink-calendar-top-options .clean{float:left} +.ink-calendar-top-options .close{float:right} +.ink-calendar-top{line-height:2em;background:#e6e6e6;border-radius:4px}.ink-calendar-top div{float:left} +.ink-calendar-top .ink-calendar-prev,.ink-calendar-top .ink-calendar-next{width:10%}.ink-calendar-top .ink-calendar-prev a,.ink-calendar-top .ink-calendar-next a{display:block} +.ink-calendar-top .ink-calendar-month_desc{width:80%} +.ink-calendar-month,.ink-calendar-year-selector,.ink-calendar-month-selector{margin-top:.5em;padding-left:0}.ink-calendar-month li a,.ink-calendar-year-selector li a,.ink-calendar-month-selector li a{margin:0px;line-height:2em;vertical-align:middle;display:block;border-radius:4px;color:#444}.ink-calendar-month li a:hover,.ink-calendar-year-selector li a:hover,.ink-calendar-month-selector li a:hover{background:#e6e6e6} +.ink-calendar-month li a.ink-calendar-on,.ink-calendar-year-selector li a.ink-calendar-on,.ink-calendar-month-selector li a.ink-calendar-on,.ink-calendar-month li a.ink-calendar-on:hover,.ink-calendar-year-selector li a.ink-calendar-on:hover,.ink-calendar-month-selector li a.ink-calendar-on:hover{background:#0069d6;color:#fff} +.ink-calendar-month li a.ink-calendar-off,.ink-calendar-year-selector li a.ink-calendar-off,.ink-calendar-month-selector li a.ink-calendar-off,.ink-calendar-month li a.ink-calendar-off:hover,.ink-calendar-year-selector li a.ink-calendar-off:hover,.ink-calendar-month-selector li a.ink-calendar-off:hover{background:#fff;color:#aaa;cursor:default} +.ink-calendar-month ul,.ink-calendar-year-selector ul,.ink-calendar-month-selector ul{clear:both;padding-left:0}.ink-calendar-month ul li,.ink-calendar-year-selector ul li,.ink-calendar-month-selector ul li{width:2.4em;float:left;text-align:center;padding:0;margin:0} +.ink-calendar-year-selector ul li{width:25%} +.ink-calendar-month-selector ul li{width:25%} +.ink-calendar-year-selector,.ink-calendar-month-selector{display:none} +.ink-calendar-off,.action_inactive{color:#ddd !important} +.ink-calendar-month .ink-calendar-header{border-bottom:1px solid rgba(0,0,0,0.1);padding-bottom:.5em;margin-bottom:.5em;color:#aaa} +.ink-calendar-top:after,.ink-calendar-middle:after,.ink-calendar-top-options:after,.ink-calendar-month .ink-calendar-header:after,.ink-calendar-month .ink-calendar-middle ul:after{content:" ";display:block;height:0;clear:both;visibility:hidden;zoom:1} +.ink-modal{top:50%;left:50%;width:90%;height:90%;background:#fff;z-index:100;position:absolute;border:1px #666 solid;filter:alpha(opacity=100);-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=100)";opacity:1;-webkit-box-shadow:0 0 15px 0 rgba(0,0,0,0.8);-moz-box-shadow:0 0 15px 0 rgba(0,0,0,0.8);box-shadow:0 0 15px 0 rgba(0,0,0,0.8);border-radius:4px;overflow:hidden}.ink-modal:after{content:" ";display:block;height:0;clear:both;visibility:hidden;zoom:1} +.ink-modal>.modal-body{padding:1em;overflow-y:auto;overflow-x:hidden;height:auto}.ink-modal>.modal-body .ink-grid{padding-left:0;padding-right:0;width:100%;min-width:100%} +.ink-modal>.modal-header,.ink-modal>header{border-bottom:1px #e6e6e6 solid;overflow:hidden;-webkit-box-shadow:0 1px 2px 0 rgba(175,175,175,0.2);-moz-box-shadow:0 1px 2px 0 rgba(175,175,175,0.2);box-shadow:0 1px 2px 0 rgba(175,175,175,0.2)}.ink-modal>.modal-header>.modal-close,.ink-modal>header>.modal-close{padding-top:2px;text-align:center;color:#fff;width:26px;height:26px;line-height:1.2em;border:0;background:#bfbfbf;font-size:0;border-radius:50%;text-shadow:0 -1px 0 rgba(0,0,0,0.6);filter:alpha(opacity=60);-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=60)";opacity:.6;-webkit-transition-property:opacity;-moz-transition-property:opacity;-o-transition-property:opacity;-ms-transition-property:opacity;transition-property:opacity;-webkit-transition-duration:125ms;-moz-transition-duration:125ms;-o-transition-duration:125ms;-ms-transition-duration:125ms;transition-duration:125ms;-webkit-transition-timing-function:ease-in-out;-moz-transition-timing-function:ease-in-out;-o-transition-timing-function:ease-in-out;-ms-transition-timing-function:ease-in-out;transition-timing-function:ease-in-out;-webkit-transition-delay:0;-moz-transition-delay:0;-o-transition-delay:0;-ms-transition-delay:0;transition-delay:0;float:right}.ink-modal>.modal-header>.modal-close:after,.ink-modal>header>.modal-close:after{content:"\f00d";font-family:FontAwesome;font-size:medium;line-height:22px} +.ink-modal>.modal-header>.modal-close:hover,.ink-modal>header>.modal-close:hover{filter:alpha(opacity=100);-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=100)";opacity:1} +.ink-modal>.modal-footer,.ink-modal>footer{background:#e6e6e6;margin-bottom:0;-webkit-box-shadow:0 -1px 2px 0 rgba(175,175,175,0.2);-moz-box-shadow:0 -1px 2px 0 rgba(175,175,175,0.2);box-shadow:0 -1px 2px 0 rgba(175,175,175,0.2);position:absolute;bottom:0;width:100%} +.ink-modal>.modal-header,.ink-modal>header,.ink-modal>.modal-footer,.ink-modal>footer{padding:0.8em 1em 0.65em 1em}.ink-modal>.modal-header:before,.ink-modal>header:before,.ink-modal>.modal-footer:before,.ink-modal>footer:before,.ink-modal>.modal-header:after,.ink-modal>header:after,.ink-modal>.modal-footer:after,.ink-modal>footer:after{content:".";display:block;height:0;clear:both;visibility:hidden} +.ink-modal-open{overflow:hidden} +.ink-tagfield input[type="text"].new-tag-input{background-color:#fff;border:1px solid #ccc;line-height:1em;margin:0;padding:5px;border-radius:2px}.ink-tagfield input[type="text"].new-tag-input:focus{-webkit-box-shadow:0 0 0 3px #eaeaea;-moz-box-shadow:0 0 0 3px #eaeaea;box-shadow:0 0 0 3px #eaeaea;border:1px solid #c3c3c3} +.ink-tagfield span.ink-tag{background-color:#1b1b1b;color:#eaeaea;text-shadow:none;font-size:0.9em;font-weight:normal;border:1px solid #000;padding:4px 6px}.ink-tagfield span.ink-tag i.icon-remove{color:#ccc;font-size:0.9em;font-weight:normal;margin-left:4px}.ink-tagfield span.ink-tag i.icon-remove:hover{cursor:pointer;color:red} +.ink-progress-bar{margin-bottom:1em;overflow:hidden;background:#f2f2f2;position:relative;border-radius:4px;-webkit-box-shadow:0 1px 3px 0 rgba(0,0,0,0.2) inset;-moz-box-shadow:0 1px 3px 0 rgba(0,0,0,0.2) inset;box-shadow:0 1px 3px 0 rgba(0,0,0,0.2) inset}.ink-progress-bar .caption{position:absolute;top:0;left:0;width:100%;height:100%;line-height:1.7;text-align:center;color:#000;font-size:.813em;z-index:10} +.ink-progress-bar .bar{height:1.3em;text-shadow:0 1px 0 rgba(0,0,0,0.25);-webkit-box-shadow:0 1px 1px 0 rgba(0,0,0,0.1) inset;-moz-box-shadow:0 1px 1px 0 rgba(0,0,0,0.1) inset;box-shadow:0 1px 1px 0 rgba(0,0,0,0.1) inset;-webkit-transition-property:"width";-moz-transition-property:"width";-o-transition-property:"width";-ms-transition-property:"width";transition-property:"width";-webkit-transition-duration:.6s;-moz-transition-duration:.6s;-o-transition-duration:.6s;-ms-transition-duration:.6s;transition-duration:.6s;-webkit-transition-timing-function:"ease";-moz-transition-timing-function:"ease";-o-transition-timing-function:"ease";-ms-transition-timing-function:"ease";transition-timing-function:"ease";-webkit-transition-delay:0;-moz-transition-delay:0;-o-transition-delay:0;-ms-transition-delay:0;transition-delay:0}.ink-progress-bar .bar.grey{text-shadow:0 -1px 0 rgba(255,255,255,0.25);background:#e6e6e6;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#e6e6e6', endColorstr='#cccccc');background:-moz-linear-gradient(top, #e6e6e6 0, #ccc 150%);background:-webkit-gradient(linear, left top, left bottom, color-stop(0, #e6e6e6), color-stop(150%, #ccc));background:-webkit-linear-gradient(top, #e6e6e6 0, #ccc 150%);background:-o-linear-gradient(top, #e6e6e6 0, #ccc 150%);background:-ms-linear-gradient(top, #e6e6e6 0, #ccc 150%);background:linear-gradient(to bottom, #e6e6e6 0, #ccc 150%)} +.ink-progress-bar .bar.green{background:#4c9220;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#4c9220', endColorstr='#366817');background:-moz-linear-gradient(top, #4c9220 0, #366817 150%);background:-webkit-gradient(linear, left top, left bottom, color-stop(0, #4c9220), color-stop(150%, #366817));background:-webkit-linear-gradient(top, #4c9220 0, #366817 150%);background:-o-linear-gradient(top, #4c9220 0, #366817 150%);background:-ms-linear-gradient(top, #4c9220 0, #366817 150%);background:linear-gradient(to bottom, #4c9220 0, #366817 150%)} +.ink-progress-bar .bar.blue{background:#1b75ce;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#1b75ce', endColorstr='#155ba1');background:-moz-linear-gradient(top, #1b75ce 0, #155ba1 150%);background:-webkit-gradient(linear, left top, left bottom, color-stop(0, #1b75ce), color-stop(150%, #155ba1));background:-webkit-linear-gradient(top, #1b75ce 0, #155ba1 150%);background:-o-linear-gradient(top, #1b75ce 0, #155ba1 150%);background:-ms-linear-gradient(top, #1b75ce 0, #155ba1 150%);background:linear-gradient(to bottom, #1b75ce 0, #155ba1 150%)} +.ink-progress-bar .bar.red{background:#be1c1c;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#be1c1c', endColorstr='#921515');background:-moz-linear-gradient(top, #be1c1c 0, #921515 150%);background:-webkit-gradient(linear, left top, left bottom, color-stop(0, #be1c1c), color-stop(150%, #921515));background:-webkit-linear-gradient(top, #be1c1c 0, #921515 150%);background:-o-linear-gradient(top, #be1c1c 0, #921515 150%);background:-ms-linear-gradient(top, #be1c1c 0, #921515 150%);background:linear-gradient(to bottom, #be1c1c 0, #921515 150%)} +.ink-progress-bar .bar.orange{background:#f2990d;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#f2990d', endColorstr='#c27b0a');background:-moz-linear-gradient(top, #f2990d 0, #c27b0a 150%);background:-webkit-gradient(linear, left top, left bottom, color-stop(0, #f2990d), color-stop(150%, #c27b0a));background:-webkit-linear-gradient(top, #f2990d 0, #c27b0a 150%);background:-o-linear-gradient(top, #f2990d 0, #c27b0a 150%);background:-ms-linear-gradient(top, #f2990d 0, #c27b0a 150%);background:linear-gradient(to bottom, #f2990d 0, #c27b0a 150%)} +.ink-progress-bar .bar.black{background:#4d4d4d;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#4d4d4d', endColorstr='#000000');background:-moz-linear-gradient(top, #4d4d4d 0, #000 150%);background:-webkit-gradient(linear, left top, left bottom, color-stop(0, #4d4d4d), color-stop(150%, #000));background:-webkit-linear-gradient(top, #4d4d4d 0, #000 150%);background:-o-linear-gradient(top, #4d4d4d 0, #000 150%);background:-ms-linear-gradient(top, #4d4d4d 0, #000 150%);background:linear-gradient(to bottom, #4d4d4d 0, #000 150%)} +.ink-tabs .tabs-nav{list-style:none;padding:0em}.ink-tabs .tabs-nav li{line-height:1.7;position:relative;margin:0}.ink-tabs .tabs-nav li a{padding:.5em 1em;display:block}.ink-tabs .tabs-nav li a:hover{background:#e8e8e8} +.ink-tabs .tabs-nav li.active a{color:#555;cursor:default;text-decoration:none;background:#f7f7f7;border:1px solid #ccc} +.ink-tabs .tabs-nav:after{content:" ";display:block;height:0;clear:both;visibility:hidden;zoom:1} +.ink-tabs .tabs-content{margin-top:1.5em;overflow:auto} +.ink-tabs.top>.tabs-nav{border-bottom:1px solid #ccc}.ink-tabs.top>.tabs-nav li{float:left}.ink-tabs.top>.tabs-nav li a{margin-right:.4em;border-top-right-radius:4px;border-top-left-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0} +.ink-tabs.top>.tabs-nav li.active{margin:0 0 -2px 0}.ink-tabs.top>.tabs-nav li.active a{border-bottom-color:transparent} +.ink-tabs.bottom>.tabs-nav{border-top:1px solid #ccc}.ink-tabs.bottom>.tabs-nav li{float:left}.ink-tabs.bottom>.tabs-nav li a{margin-right:.4em;border-top-right-radius:0;border-top-left-radius:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px} +.ink-tabs.bottom>.tabs-nav li.active{margin:-2px 0 0 0}.ink-tabs.bottom>.tabs-nav li.active a{border-top-color:transparent} +.ink-tabs.left>.tabs-nav{border-right:1px solid #ccc;float:left;margin-right:2em}.ink-tabs.left>.tabs-nav li{float:none;text-align:right}.ink-tabs.left>.tabs-nav li a{margin-bottom:.4em;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:4px;border-top-left-radius:4px} +.ink-tabs.left>.tabs-nav li.active{margin:0 -2px 0 0}.ink-tabs.left>.tabs-nav li.active a{border-right-color:transparent} +.ink-tabs.right>.tabs-nav{border-left:1px solid #ccc;float:right;margin-left:2em}.ink-tabs.right>.tabs-nav li{float:none}.ink-tabs.right>.tabs-nav li a{margin-bottom:.4em;border-top-right-radius:4px;border-bottom-right-radius:4px;border-bottom-left-radius:0;border-top-left-radius:0} +.ink-tabs.right>.tabs-nav li.active{margin:0 0 0 -2px}.ink-tabs.right>.tabs-nav li.active a{border-left-color:transparent} +.dragging{cursor:move;-moz-user-select:none;-khtml-user-select:none;-webkit-user-select:none;-o-user-select:none;-ms-user-select:none;user-select:none;-ms-user-drag:none;-moz-user-drag:none;-khtml-user-drag:none;-webkit-user-drag:none;-o-user-drag:none;user-drag:none} +.ink-sortable-list li{margin:0;border-bottom:1px solid #ccc;line-height:40px;cursor:move;-moz-user-select:none;-khtml-user-select:none;-webkit-user-select:none;-o-user-select:none;-ms-user-select:none;user-select:none;-ms-user-drag:none;-moz-user-drag:none;-khtml-user-drag:none;-webkit-user-drag:none;-o-user-drag:none;user-drag:none}.ink-sortable-list li:hover,.ink-sortable-list li.placeholder{background:#ccc;background:rgba(204,204,204,0.2)} +.ink-sortable-list li.placeholder{-webkit-box-shadow:0 0 10px 0 rgba(0,0,0,0.3);-moz-box-shadow:0 0 10px 0 rgba(0,0,0,0.3);box-shadow:0 0 10px 0 rgba(0,0,0,0.3)} +.ink-sortable-list li .ink-label{margin:0 .8em} +.ink-tree-view li{list-style-type:none} +.ink-tree-view [data-open]>:before{margin-left:-1.3em;margin-right:.4em;text-decoration:none} +.ink-carousel{width:100%;position:relative;overflow:hidden;display:block}.ink-carousel .stage{left:0;height:auto !important;margin-top:0;margin-bottom:0;padding-left:0;list-style-type:none;white-space:nowrap;position:relative;-webkit-transition-property:all;-moz-transition-property:all;-o-transition-property:all;-ms-transition-property:all;transition-property:all;-webkit-transition-duration:.5s;-moz-transition-duration:.5s;-o-transition-duration:.5s;-ms-transition-duration:.5s;transition-duration:.5s;-webkit-transition-timing-function:ease;-moz-transition-timing-function:ease;-o-transition-timing-function:ease;-ms-transition-timing-function:ease;transition-timing-function:ease;-webkit-transition-delay:0;-moz-transition-delay:0;-o-transition-delay:0;-ms-transition-delay:0;transition-delay:0}.ink-carousel .stage .slide{position:relative;display:inline-block;vertical-align:top;white-space:normal;margin:0;float:none;zoom:1;*display:inline} +.ink-carousel .hider{-webkit-transition-property:all;-moz-transition-property:all;-o-transition-property:all;-ms-transition-property:all;transition-property:all;-webkit-transition-duration:.5s;-moz-transition-duration:.5s;-o-transition-duration:.5s;-ms-transition-duration:.5s;transition-duration:.5s;-webkit-transition-timing-function:ease;-moz-transition-timing-function:ease;-o-transition-timing-function:ease;-ms-transition-timing-function:ease;transition-timing-function:ease;-webkit-transition-delay:0;-moz-transition-delay:0;-o-transition-delay:0;-ms-transition-delay:0;transition-delay:0;background-color:white;margin:0} +img{width:auto;max-width:100%;vertical-align:top} +figure{position:relative}figure.rounded{border-radius:6px}figure.rounded img:first-child{border-top-right-radius:6px;border-top-left-radius:6px;border-bottom-right-radius:0;border-bottom-left-radius:0} +figure.rounded img:last-child{border-top-right-radius:0;border-top-left-radius:0;border-bottom-right-radius:6px;border-bottom-left-radius:6px} +figure.rounded figcaption:first-child{border-top-right-radius:6px;border-top-left-radius:6px;border-bottom-right-radius:0;border-bottom-left-radius:0} +figure.rounded figcaption:last-child{border-top-right-radius:0;border-top-left-radius:0;border-bottom-right-radius:6px;border-bottom-left-radius:6px} +figure.rounded.caption-over-top img{border-radius:6px} +figure.rounded.caption-over-top figcaption{border-top-right-radius:6px;border-top-left-radius:6px;border-bottom-right-radius:0;border-bottom-left-radius:0} +figure.rounded.caption-over-bottom img{border-radius:6px} +figure.rounded.caption-over-bottom figcaption{border-top-right-radius:0;border-top-left-radius:0;border-bottom-right-radius:6px;border-bottom-left-radius:6px} +figure.caption-over-top figcaption{position:absolute;left:0;top:0} +figure.caption-over-top img+figcaption{margin-top:0} +figure.caption-over-bottom figcaption{position:absolute;left:0;bottom:0;margin-bottom:4px} +figure.caption-over-top figcaption.light,figure.caption-over-bottom figcaption.light{background:rgba(255,255,255,0.8);color:#000} +figure.caption-over-top figcaption.dark,figure.caption-over-bottom figcaption.dark{background:rgba(0,0,0,0.8);color:#fff} +figcaption{font-size:0.8em;padding:1em;width:100%}figcaption.light{background:#0d0d0d;color:#555} +figcaption.dark{background:#0d0d0d;color:#fff} +.push-left{float:left !important} +.push-right{float:right !important} +.push-center{float:none !important;margin-left:auto;margin-right:auto} +.clearfix:after{content:" ";display:block;height:0;clear:both;visibility:hidden;zoom:1} +.no-margin{margin:0 !important} +.screen-size-helper{height:2.5em;line-height:1.6em;font-size:1em;padding:0.5333333333333333em 0.8em;background:rgba(0,0,0,0.85);z-index:100}.screen-size-helper .title{color:white;text-shadow:0 1px 0 #000000;font-size:inherit;line-height:inherit;float:left;text-transform:uppercase;font-weight:500} +.screen-size-helper ul{color:white;text-shadow:0 1px 0 #000000;float:right;margin:0;padding:0;line-height:inherit !important}.screen-size-helper ul li{padding:0;margin:0;text-transform:uppercase;font-weight:bold;font-size:inherit !important}.screen-size-helper ul li.small{color:#4a9b17} +.screen-size-helper ul li.medium{color:#ff9c00} +.screen-size-helper ul li.large{color:#c91111} +.drag{-webkit-box-shadow:0 0 10px 0 rgba(0,0,0,0.3);-moz-box-shadow:0 0 10px 0 rgba(0,0,0,0.3);box-shadow:0 0 10px 0 rgba(0,0,0,0.3)} +.ink-shade{background:rgba(0,0,0,0.8);width:100%;height:100%;top:0;right:0;bottom:0;left:0;margin-top:0;position:fixed;z-index:100;display:none;filter:alpha(opacity=0);-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";opacity:0}.ink-shade.fade{-webkit-transition-property:opacity;-moz-transition-property:opacity;-o-transition-property:opacity;-ms-transition-property:opacity;transition-property:opacity;-webkit-transition-duration:300ms;-moz-transition-duration:300ms;-o-transition-duration:300ms;-ms-transition-duration:300ms;transition-duration:300ms;-webkit-transition-timing-function:ease-in-out;-moz-transition-timing-function:ease-in-out;-o-transition-timing-function:ease-in-out;-ms-transition-timing-function:ease-in-out;transition-timing-function:ease-in-out;-webkit-transition-delay:0;-moz-transition-delay:0;-o-transition-delay:0;-ms-transition-delay:0;transition-delay:0} +.ink-shade.visible{filter:alpha(opacity=100);-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=100)";opacity:1} diff --git a/ajax/libs/ink/2.3.1/css/ink-min.css.map b/ajax/libs/ink/2.3.1/css/ink-min.css.map new file mode 100644 index 000000000..99cce9107 --- /dev/null +++ b/ajax/libs/ink/2.3.1/css/ink-min.css.map @@ -0,0 +1 @@ +{"version":3,"sources":["../../src/less/modules/reset.less","../../src/less/config/__typography.less","../../src/less/modules/fonts.less","../../src/less/modules/typography.less","../../src/less/modules/mixins.less","../../src/less/modules/labels.less","../../src/less/modules/footer.less","../../src/less/modules/icons/path.less","../../src/less/modules/icons/core.less","../../src/less/modules/icons/mixins.less","../../src/less/modules/icons/extras.less","../../src/less/modules/icons/icons.less","../../src/less/modules/icons/variables.less","../../src/less/modules/animations/animate.less","../../src/less/modules/navigation/core.less","../../src/less/modules/navigation/menu.less","../../src/less/modules/navigation/breadcrumbs.less","../../src/less/modules/navigation/pagination.less","../../src/less/modules/navigation/pills.less","../../src/less/modules/navigation/dropdown.less","../../src/less/modules/navigation/menu.themes.less","../../src/less/modules/navigation/breadcrumbs.themes.less","../../src/less/modules/navigation/pagination.themes.less","../../src/less/modules/navigation/pills.themes.less","../../src/less/modules/navigation/dropdown.themes.less","../../src/less/modules/forms.less","../../src/less/modules/alerts.less","../../src/less/modules/badges.less","../../src/less/modules/tooltips.less","../../src/less/modules/buttons.less","../../src/less/modules/tables.less","../../src/less/modules/grid.less","../../src/less/modules/js.animate.less","../../src/less/modules/js.sticky.less","../../src/less/modules/js.datepicker.less","../../src/less/modules/js.modal.less","../../src/less/modules/js.tagfield.less","../../src/less/modules/js.progressbar.less","../../src/less/modules/js.tabs.less","../../src/less/modules/js.sortable.list.less","../../src/less/modules/js.treeview.less","../../src/less/modules/js.carousel.less","../../src/less/modules/images.less","../../src/less/modules/utilities.less"],"names":[],"mappings":"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qCX,QDpChB,kBAAkB,QAClB,YAAY,QAAU,QCqCX,QDpCX,aAAa,QAAU,QCsCX,QDrCZ,cAAc,QAAU,QCuCX,QDtCb,UAAU,QAAU,QCwCX,QDvCT,UAAU,QAAU,QCyCX,QDxCT,gBAAgB,QAAU,QC0CX,QDzCf,gBAAgB,QAAU,QC2CX,QD1Cf,iBAAiB,QAAU,QC4CX,QD3ChB,eAAe,QAAU,QC6CX,QD5Cd,YAAY,QAAU,QC8CX,QD7CX,aAAa,QAAU,QC+CX,QD9CZ,SAAS,QAAU,QCgDX,QD/CR,UAAU,QAAU,QCiDX,QDhDT,UAAU,QAAU,QCkDX,QDjDT,cAAc,QAAU,QCmDX,QDlDb,WAAW,QAAU,QCoDX,QDnDV,YAAY,QAAU,QCqDX,QDpDX,UAAU,QAAU,QCsDX,QDrDT,UAAU,QAAU,QCuDX,QDtDT,YAAY,QAAU,QCwDX,QDvDX,iBAAiB,QAAU,QCyDX,QDxDhB,gBAAgB,QAAU,QC0DX,QDzDf,gBAAgB,QAAU,QC2DX,QD1Df,kBAAkB,QAAU,QC4DX,QD3DjB,iBAAiB,QAAU,QC6DX,QD5DhB,mBAAmB,QAAU,QC8DX,QD7DlB,UAAU,QAAU,QC+DX,QD9DT,iBAAiB,QAAU,QCgEX,QD/DhB,kBAAkB,QAAU,QCiEX,QDhEjB,oBAAoB,QAAU,QCkEX,QDjEnB,aAAa,QAAU,QCmEX,QDlEZ,YAAY,QAAU,QCoEX,QDnEX,gBAAgB,QAAU,QCqEX,QDpEf,YAAY,QAAU,QCsEX,QDrEX,UAAU,QAAU,QCuEX,QDtET,UAAU,QAAU,QCwEX,QDvET,WAAW,QAAU,QCyEX,QDxEV,WAAW,QAAU,QC0EX,QDzEV,UAAU,QAAU,QC2EX,QD1ET,mBAAmB,QAAU,QC4EX,QD3ElB,mBAAmB,QAAU,QC6EX,QD5ElB,cAAc,QAAU,QC8EX,QD7Eb,UAAU,QAAU,QC+EX,QD9ET,WAAW,QAAU,QCgFX,QD/EV,UAAU,QAAU,QCiFX,QDhFT,aAAa,QAAU,QCkFX,QDjFZ,kBAAkB,QAAU,QCmFX,QDlFjB,kBAAkB,QAAU,QCoFX,QDnFjB,WAAW,QAAU,QCqFX,QDpFV,kBAAkB,QAAU,QCsFX,QDrFjB,mBAAmB,QAAU,QCuFX,QDtFlB,eA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"} \ No newline at end of file diff --git a/ajax/libs/ink/2.3.1/css/ink.css b/ajax/libs/ink/2.3.1/css/ink.css new file mode 100644 index 000000000..bb78125bd --- /dev/null +++ b/ajax/libs/ink/2.3.1/css/ink.css @@ -0,0 +1,9531 @@ +* { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} +article, +aside, +details, +figcaption, +figure, +footer, +header, +hgroup, +nav, +section, +summary { + display: block; +} +audio, +canvas, +video { + display: inline-block; +} +audio:not([controls]) { + display: none; + height: 0; +} +[hidden] { + display: none; +} +html { + font-family: sans-serif; + -webkit-text-size-adjust: 100%; + -ms-text-size-adjust: 100%; +} +body { + margin: 0; + -webkit-text-size-adjust: 100%; + -ms-text-size-adjust: none; + height: 100%; +} +a:focus { + outline: thin dotted; +} +a:active, +a:hover { + outline: 0; +} +h1, +h2, +h3, +h4, +h5, +h6, +p { + margin: 0; +} +h1 { + font-size: 2em; +} +abbr[title] { + border-bottom: 1px dotted; +} +b, +strong { + font-weight: bold; +} +dfn { + font-style: italic; +} +mark { + background: #ff0; + color: #000; +} +code, +kbd, +pre, +samp { + font-family: Ubuntu_monospaced, Monaco, 'Andale Mono', 'Courier New', monospace; + font-size: 1em; +} +pre { + white-space: pre; + white-space: pre-wrap; + word-wrap: break-word; +} +q { + quotes: "\201C" "\201D" "\2018" "\2019"; +} +small { + font-size: 80%; +} +sub, +sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; +} +sup { + top: -0.5em; +} +sub { + bottom: -0.25em; +} +img { + border: 0; + width: auto; + max-width: 100%; +} +svg:not(:root) { + overflow: hidden; +} +figure { + margin: 0; +} +fieldset { + border: 1px solid #c0c0c0; + margin: 0; + padding: 0.35em 0.625em 0.75em; +} +legend { + border: 0; + padding: 0; +} +button, +input, +select, +textarea { + font-family: inherit; + font-size: 100%; + margin: 0; +} +button, +input { + line-height: normal; +} +button, +html input[type="button"], +input[type="reset"], +input[type="submit"] { + -webkit-appearance: button; + cursor: pointer; +} +button[disabled], +input[disabled] { + cursor: default; +} +input[type="checkbox"], +input[type="radio"] { + box-sizing: border-box; + padding: 0; +} +input[type="search"] { + -webkit-appearance: textfield; + -moz-box-sizing: content-box; + -webkit-box-sizing: content-box; + box-sizing: content-box; +} +input[type="search"]::-webkit-search-cancel-button, +input[type="search"]::-webkit-search-decoration { + -webkit-appearance: none; +} +button::-moz-focus-inner, +input::-moz-focus-inner { + border: 0; + padding: 0; +} +textarea { + overflow: auto; + vertical-align: top; +} +table { + border-collapse: collapse; + border-spacing: 0; +} +@font-face { + font-family: 'Ubuntu'; + src: url('../font/ubuntu-b-webfont.eot'); + src: local('Ubuntu bold'), local('Ubuntu'), url('../font/ubuntu-b-webfont.eot?#iefix') format('embedded-opentype'), url('../font/ubuntu-b-webfont.woff') format('woff'), url('../font/ubuntu-b-webfont.ttf') format('truetype'), url('../font/ubuntu-b-webfont.svg#ubuntubold') format('svg'); + font-weight: 700; + font-style: normal; +} +@font-face { + font-family: 'Ubuntu'; + src: url('../font/ubuntu-bi-webfont.eot'); + src: local('Ubuntu bold italic'), local('Ubuntu'), url('../font/ubuntu-bi-webfont.eot?#iefix') format('embedded-opentype'), url('../font/ubuntu-bi-webfont.woff') format('woff'), url('../font/ubuntu-bi-webfont.ttf') format('truetype'), url('../font/ubuntu-bi-webfont.svg#ubuntubold_italic') format('svg'); + font-weight: 700; + font-style: italic; +} +@font-face { + font-family: 'Ubuntu'; + src: url('../font/ubuntu-r-webfont.eot'); + src: local('Ubuntu'), url('../font/ubuntu-r-webfont.eot?#iefix') format('embedded-opentype'), url('../font/ubuntu-r-webfont.woff') format('woff'), url('../font/ubuntu-r-webfont.ttf') format('truetype'), url('../font/ubuntu-r-webfont.svg#ubunturegular') format('svg'); + font-weight: normal; + font-style: normal; +} +@font-face { + font-family: 'Ubuntu'; + src: url('../font/ubuntu-ri-webfont.eot'); + src: local('Ubuntu italic'), local('Ubuntu'), url('../font/ubuntu-ri-webfont.eot?#iefix') format('embedded-opentype'), url('../font/ubuntu-ri-webfont.woff') format('woff'), url('../font/ubuntu-ri-webfont.ttf') format('truetype'), url('../font/ubuntu-ri-webfont.svg#ubuntuitalic') format('svg'); + font-weight: normal; + font-style: italic; +} +@font-face { + font-family: 'Ubuntu_condensed'; + src: url('../font/ubuntu-c-webfont.eot'); + src: local('Ubuntu Condensed'), url('../font/ubuntu-c-webfont.eot?#iefix') format('embedded-opentype'), url('../font/ubuntu-c-webfont.woff') format('woff'), url('../font/ubuntu-c-webfont.ttf') format('truetype'), url('../font/ubuntu-c-webfont.svg#ubuntu_condensedregular') format('svg'); + font-weight: normal; + font-style: normal; +} +@font-face { + font-family: 'Ubuntu_light'; + src: url('../font/ubuntu-l-webfont.eot'); + src: local('Ubuntu Light'), url('../font/ubuntu-l-webfont.eot?#iefix') format('embedded-opentype'), url('../font/ubuntu-l-webfont.woff') format('woff'), url('../font/ubuntu-l-webfont.ttf') format('truetype'), url('../font/ubuntu-l-webfont.svg#ubuntu_lightregular') format('svg'); + font-weight: normal; + font-style: normal; +} +@font-face { + font-family: 'Ubuntu_light'; + src: url('../font/ubuntu-li-webfont.eot'); + src: local('Ubuntu Light'), url('../font/ubuntu-li-webfont.eot?#iefix') format('embedded-opentype'), url('../font/ubuntu-li-webfont.woff') format('woff'), url('../font/ubuntu-li-webfont.ttf') format('truetype'), url('../font/ubuntu-li-webfont.svg#ubuntu_lightitalic') format('svg'); + font-weight: normal; + font-style: italic; +} +@font-face { + font-family: 'Ubuntu_light'; + src: url('../font/ubuntu-m-webfont.eot'); + src: local('Ubuntu Light'), url('../font/ubuntu-m-webfont.eot?#iefix') format('embedded-opentype'), url('../font/ubuntu-m-webfont.woff') format('woff'), url('../font/ubuntu-m-webfont.ttf') format('truetype'), url('../font/ubuntu-m-webfont.svg#ubuntu_lightbold') format('svg'); + font-weight: 700; + font-style: normal; +} +@font-face { + font-family: 'Ubuntu_light'; + src: url('../font/ubuntu-mi-webfont.eot'); + src: local('Ubuntu Light'), url('../font/ubuntu-mi-webfont.eot?#iefix') format('embedded-opentype'), url('../font/ubuntu-mi-webfont.woff') format('woff'), url('../font/ubuntu-mi-webfont.ttf') format('truetype'), url('../font/ubuntu-mi-webfont.svg#ubuntu_lightbold_italic') format('svg'); + font-weight: 700; + font-style: italic; +} +@font-face { + font-family: 'Ubuntu_monospaced'; + src: url('../font/ubuntumono-b-webfont.eot'); + src: local('Ubuntu Mono'), url('../font/ubuntumono-b-webfont.eot?#iefix') format('embedded-opentype'), url('../font/ubuntumono-b-webfont.woff') format('woff'), url('../font/ubuntumono-b-webfont.ttf') format('truetype'), url('../font/ubuntumono-b-webfont.svg#ubuntu_monobold') format('svg'); + font-weight: 700; + font-style: normal; +} +@font-face { + font-family: 'Ubuntu_monospaced'; + src: url('../font/ubuntumono-bi-webfont.eot'); + src: local('Ubuntu Mono'), url('../font/ubuntumono-bi-webfont.eot?#iefix') format('embedded-opentype'), url('../font/ubuntumono-bi-webfont.woff') format('woff'), url('../font/ubuntumono-bi-webfont.ttf') format('truetype'), url('../font/ubuntumono-bi-webfont.svg#ubuntu_monobold_italic') format('svg'); + font-weight: 700; + font-style: italic; +} +@font-face { + font-family: 'Ubuntu_monospaced'; + src: url('../font/ubuntumono-r-webfont.eot'); + src: local('Ubuntu Mono'), url('../font/ubuntumono-r-webfont.eot?#iefix') format('embedded-opentype'), url('../font/ubuntumono-r-webfont.woff') format('woff'), url('../font/ubuntumono-r-webfont.ttf') format('truetype'), url('../font/ubuntumono-r-webfont.svg#ubuntu_monoregular') format('svg'); + font-weight: normal; + font-style: normal; +} +@font-face { + font-family: 'Ubuntu_monospaced'; + src: url('../font/ubuntumono-ri-webfont.eot'); + src: local('Ubuntu Mono'), url('../font/ubuntumono-ri-webfont.eot?#iefix') format('embedded-opentype'), url('../font/ubuntumono-ri-webfont.woff') format('woff'), url('../font/ubuntumono-ri-webfont.ttf') format('truetype'), url('../font/ubuntumono-ri-webfont.svg#ubuntu_monoitalic') format('svg'); + font-weight: normal; + font-style: italic; +} +body { + color: #555555; + font-family: Ubuntu, Arial, sans-serif; +} +.sans { + font-family: Ubuntu, Arial, sans-serif; +} +.serif { + font-family: Times, "Times New Roman", serif; +} +a { + color: #0069d6; + text-decoration: none; +} +a:hover { + color: #007ed5; + text-decoration: underline; +} +/* Headings */ +h1, +h2, +h3, +h4, +h5, +h6 { + color: #404040; +} +h1 { + font-size: 2.5em; +} +h2 { + font-size: 2em; +} +h3 { + font-size: 1.715em; +} +h4 { + font-size: 1.438em; +} +h5 { + font-size: 1.25em; +} +h6 { + font-size: 1em; +} +h1 small { + font-size: .6em; + color: #BFBFBF; + font-weight: 100; +} +small { + color: #a2a2a2; + font-size: .6em; +} +/* Paragraphs */ +p { + line-height: 1.5; +} +/** + * Set 1 unit of vertical rhythm on the top and bottom margin. + */ +p, +pre { + margin: 1em 0; +} +blockquote { + /* Set 1 unit of vertical rhythm on the top and bottom margin. */ + + margin: 1.5em 40px; +} +h1 { + line-height: 1.25em; +} +h2 { + line-height: 1.5em; +} +h3 { + line-height: 1.45775em; +} +h4 { + line-height: 1.3660999999999999em; +} +h5 { + line-height: 1.3125em; +} +h6 { + line-height: 1.15em; +} +input, +textarea { + color: #666; +} +h1 small, +h2 small, +h3 small, +h4 small { + color: #bbb; + font-size: .6em; + font-weight: 100; + line-height: 1; +} +address { + color: #888888; + font-size: 1em; + line-height: 1.4; +} +address p { + margin-top: 0; +} +address h6 { + color: #555555; +} +abbr:hover { + cursor: help; +} +blockquote { + border-left: 4px solid #ddd; + padding-left: 1em; + margin: 1em 0; + font-weight: 200; + font-size: 1.1em; +} +blockquote small { + font-size: .9em; +} +blockquote small::before, +blockquote small::after { + content: ' — '; +} +ul, +ol, +dl { + padding-left: 1.4em; + margin: 0; +} +ul.unstyled { + list-style: none; + padding-left: 0em; +} +ul.unstyled ul { + list-style: disc outside; + padding-left: 1.4em; +} +ol > li { + list-style: decimal outside; +} +dl { + padding: 0em; +} +dl dt { + font-weight: bold; + margin-top: .7em; +} +dl dd { + padding-left: 1em; + margin: .5em 0; +} +ul, +ol { + line-height: 1.4; + margin: 0; + padding-left: 1.4em; +} +ul li, +ol li { + margin: .5em 0; +} +ul.inline li, +ol.inline li { + float: left; +} +.note { + font-size: .9em; + color: #888888; +} +.note strong { + color: #555555; +} +.small { + font-size: 0.75em; +} +.medium { + font-size: 0.85em; +} +.large { + font-size: 1.2em; +} +.extralarge { + font-size: 1.45em !important; +} +hr { + border: 0; + border-top: 1px solid #ddd; + margin: 1em 0; +} +.lead { + font-size: 1.1em; + font-weight: bold; +} +.ink-label { + padding: 0.2em 0.5em; + color: white; + white-space: nowrap; + font-weight: bold; + border-radius: 2px; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); +} +.ink-label.success { + background-color: #4a9b17; +} +.ink-label.success.invert { + color: #4a9b17; + background-color: transparent; + text-shadow: none; + padding: 0; +} +.ink-label.warning { + background-color: #ff9c00; +} +.ink-label.warning.invert { + color: #ff9c00; + background-color: transparent; + text-shadow: none; + padding: 0; +} +.ink-label.error { + background-color: #c91111; +} +.ink-label.error.invert { + color: #c91111; + background-color: transparent; + text-shadow: none; + padding: 0; +} +.ink-label.info { + background-color: #0f75da; +} +.ink-label.info.invert { + color: #0f75da; + background-color: transparent; + text-shadow: none; + padding: 0; +} +footer { + border-top: 1px solid #cccccc; + background: #f0f0f0; + overflow: hidden; + bottom: 0; +} +/*! + * Font Awesome 3.2.1 + * the iconic font designed for Bootstrap + * ------------------------------------------------------------------------------ + * The full suite of pictographic icons, examples, and documentation can be + * found at http://fontawesome.io. Stay up to date on Twitter at + * http://twitter.com/fontawesome. + * + * License + * ------------------------------------------------------------------------------ + * - The Font Awesome font is licensed under SIL OFL 1.1 - + * http://scripts.sil.org/OFL + * - Font Awesome CSS, LESS, and SASS files are licensed under MIT License - + * http://opensource.org/licenses/mit-license.html + * - Font Awesome documentation licensed under CC BY 3.0 - + * http://creativecommons.org/licenses/by/3.0/ + * - Attribution is no longer required in Font Awesome 3.0, but much appreciated: + * "Font Awesome by Dave Gandy - http://fontawesome.io" + * + * Author - Dave Gandy + * ------------------------------------------------------------------------------ + * Email: dave@fontawesome.io + * Twitter: http://twitter.com/davegandy + * Work: Lead Product Designer @ Kyruus - http://kyruus.com + */ +/* FONT PATH + * -------------------------- */ +@font-face { + font-family: 'FontAwesome'; + src: url('../font/fontawesome-webfont.eot?v=3.2.1'); + src: url('../font/fontawesome-webfont.eot?#iefix&v=3.2.1') format('embedded-opentype'), url('../font/fontawesome-webfont.woff?v=3.2.1') format('woff'), url('../font/fontawesome-webfont.ttf?v=3.2.1') format('truetype'), url('../font/fontawesome-webfont.svg#fontawesomeregular?v=3.2.1') format('svg'); + font-weight: normal; + font-style: normal; +} +/* FONT AWESOME CORE + * -------------------------- */ +[class^="icon-"], +[class*=" icon-"] { + font-family: FontAwesome; + font-weight: normal; + font-style: normal; + font-size: 14px; + text-decoration: inherit; + -webkit-font-smoothing: antialiased; + *margin-right: .3em; +} +[class^="icon-"]:before, +[class*=" icon-"]:before { + text-decoration: inherit; + display: inline-block; + speak: none; +} +/* makes the font 33% larger relative to the icon container */ +.icon-large:before { + font-size: 1.3333333333333333em; +} +/* makes sure icons active on rollover in links */ +a [class^="icon-"], +a [class*=" icon-"] { + display: inline; +} +/* increased font size for icon-large */ +[class^="icon-"].icon-fixed-width, +[class*=" icon-"].icon-fixed-width { + display: inline-block; + width: 1.1428571428571428em; + text-align: right; + padding-right: 0.2857142857142857em; +} +[class^="icon-"].icon-fixed-width.icon-large, +[class*=" icon-"].icon-fixed-width.icon-large { + width: 1.4285714285714286em; +} +.icons-ul { + margin-left: 2.142857142857143em; + list-style-type: none; +} +.icons-ul > li { + position: relative; +} +.icons-ul .icon-li { + position: absolute; + left: -2.142857142857143em; + width: 2.142857142857143em; + text-align: center; + line-height: inherit; +} +[class^="icon-"].hide, +[class*=" icon-"].hide { + display: none; +} +.icon-muted { + color: #eeeeee; +} +.icon-light { + color: #ffffff; +} +.icon-dark { + color: #333333; +} +.icon-border { + border: solid 1px #eeeeee; + padding: .2em .25em .15em; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; +} +.icon-2x { + font-size: 2em; +} +.icon-2x.icon-border { + border-width: 2px; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} +.icon-3x { + font-size: 3em; +} +.icon-3x.icon-border { + border-width: 3px; + -webkit-border-radius: 5px; + -moz-border-radius: 5px; + border-radius: 5px; +} +.icon-4x { + font-size: 4em; +} +.icon-4x.icon-border { + border-width: 4px; + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; +} +.icon-5x { + font-size: 5em; +} +.icon-5x.icon-border { + border-width: 5px; + -webkit-border-radius: 7px; + -moz-border-radius: 7px; + border-radius: 7px; +} +.pull-right { + float: right; +} +.pull-left { + float: left; +} +[class^="icon-"].pull-left, +[class*=" icon-"].pull-left { + margin-right: .3em; +} +[class^="icon-"].pull-right, +[class*=" icon-"].pull-right { + margin-left: .3em; +} +/* EXTRAS + * -------------------------- */ +/* Stacked and layered icon */ +.icon-stack { + position: relative; + display: inline-block; + width: 2em; + height: 2em; + line-height: 2em; + vertical-align: -35%; +} +.icon-stack [class^="icon-"], +.icon-stack [class*=" icon-"] { + display: block; + text-align: center; + position: absolute; + width: 100%; + height: 100%; + font-size: 1em; + line-height: inherit; + *line-height: 2em; +} +.icon-stack .icon-stack-base { + font-size: 2em; + *line-height: 1em; +} +/* Animated rotating icon */ +.icon-spin { + display: inline-block; + -moz-animation: spin 2s infinite linear; + -o-animation: spin 2s infinite linear; + -webkit-animation: spin 2s infinite linear; + animation: spin 2s infinite linear; +} +/* Prevent stack and spinners from being taken inline when inside a link */ +a .icon-stack, +a .icon-spin { + display: inline-block; + text-decoration: none; +} +@-moz-keyframes spin { + 0% { + -moz-transform: rotate(0deg); + } + 100% { + -moz-transform: rotate(359deg); + } +} +@-webkit-keyframes spin { + 0% { + -webkit-transform: rotate(0deg); + } + 100% { + -webkit-transform: rotate(359deg); + } +} +@-o-keyframes spin { + 0% { + -o-transform: rotate(0deg); + } + 100% { + -o-transform: rotate(359deg); + } +} +@-ms-keyframes spin { + 0% { + -ms-transform: rotate(0deg); + } + 100% { + -ms-transform: rotate(359deg); + } +} +@keyframes spin { + 0% { + transform: rotate(0deg); + } + 100% { + transform: rotate(359deg); + } +} +/* Icon rotations and mirroring */ +.icon-rotate-90:before { + -webkit-transform: rotate(90deg); + -moz-transform: rotate(90deg); + -ms-transform: rotate(90deg); + -o-transform: rotate(90deg); + transform: rotate(90deg); + filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=1); +} +.icon-rotate-180:before { + -webkit-transform: rotate(180deg); + -moz-transform: rotate(180deg); + -ms-transform: rotate(180deg); + -o-transform: rotate(180deg); + transform: rotate(180deg); + filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=2); +} +.icon-rotate-270:before { + -webkit-transform: rotate(270deg); + -moz-transform: rotate(270deg); + -ms-transform: rotate(270deg); + -o-transform: rotate(270deg); + transform: rotate(270deg); + filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=3); +} +.icon-flip-horizontal:before { + -webkit-transform: scale(-1, 1); + -moz-transform: scale(-1, 1); + -ms-transform: scale(-1, 1); + -o-transform: scale(-1, 1); + transform: scale(-1, 1); +} +.icon-flip-vertical:before { + -webkit-transform: scale(1, -1); + -moz-transform: scale(1, -1); + -ms-transform: scale(1, -1); + -o-transform: scale(1, -1); + transform: scale(1, -1); +} +/* ensure rotation occurs inside anchor tags */ +a .icon-rotate-90:before, +a .icon-rotate-180:before, +a .icon-rotate-270:before, +a .icon-flip-horizontal:before, +a .icon-flip-vertical:before { + display: inline-block; +} +/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen + readers do not read off random characters that represent icons */ +.icon-glass:before { + content: "\f000"; +} +.icon-music:before { + content: "\f001"; +} +.icon-search:before { + content: "\f002"; +} +.icon-envelope-alt:before { + content: "\f003"; +} +.icon-heart:before { + content: "\f004"; +} +.icon-star:before { + content: "\f005"; +} +.icon-star-empty:before { + content: "\f006"; +} +.icon-user:before { + content: "\f007"; +} +.icon-film:before { + content: "\f008"; +} +.icon-th-large:before { + content: "\f009"; +} +.icon-th:before { + content: "\f00a"; +} +.icon-th-list:before { + content: "\f00b"; +} +.icon-ok:before { + content: "\f00c"; +} +.icon-remove:before { + content: "\f00d"; +} +.icon-zoom-in:before { + content: "\f00e"; +} +.icon-zoom-out:before { + content: "\f010"; +} +.icon-power-off:before, +.icon-off:before { + content: "\f011"; +} +.icon-signal:before { + content: "\f012"; +} +.icon-gear:before, +.icon-cog:before { + content: "\f013"; +} +.icon-trash:before { + content: "\f014"; +} +.icon-home:before { + content: "\f015"; +} +.icon-file-alt:before { + content: "\f016"; +} +.icon-time:before { + content: "\f017"; +} +.icon-road:before { + content: "\f018"; +} +.icon-download-alt:before { + content: "\f019"; +} +.icon-download:before { + content: "\f01a"; +} +.icon-upload:before { + content: "\f01b"; +} +.icon-inbox:before { + content: "\f01c"; +} +.icon-play-circle:before { + content: "\f01d"; +} +.icon-rotate-right:before, +.icon-repeat:before { + content: "\f01e"; +} +.icon-refresh:before { + content: "\f021"; +} +.icon-list-alt:before { + content: "\f022"; +} +.icon-lock:before { + content: "\f023"; +} +.icon-flag:before { + content: "\f024"; +} +.icon-headphones:before { + content: "\f025"; +} +.icon-volume-off:before { + content: "\f026"; +} +.icon-volume-down:before { + content: "\f027"; +} +.icon-volume-up:before { + content: "\f028"; +} +.icon-qrcode:before { + content: "\f029"; +} +.icon-barcode:before { + content: "\f02a"; +} +.icon-tag:before { + content: "\f02b"; +} +.icon-tags:before { + content: "\f02c"; +} +.icon-book:before { + content: "\f02d"; +} +.icon-bookmark:before { + content: "\f02e"; +} +.icon-print:before { + content: "\f02f"; +} +.icon-camera:before { + content: "\f030"; +} +.icon-font:before { + content: "\f031"; +} +.icon-bold:before { + content: "\f032"; +} +.icon-italic:before { + content: "\f033"; +} +.icon-text-height:before { + content: "\f034"; +} +.icon-text-width:before { + content: "\f035"; +} +.icon-align-left:before { + content: "\f036"; +} +.icon-align-center:before { + content: "\f037"; +} +.icon-align-right:before { + content: "\f038"; +} +.icon-align-justify:before { + content: "\f039"; +} +.icon-list:before { + content: "\f03a"; +} +.icon-indent-left:before { + content: "\f03b"; +} +.icon-indent-right:before { + content: "\f03c"; +} +.icon-facetime-video:before { + content: "\f03d"; +} +.icon-picture:before { + content: "\f03e"; +} +.icon-pencil:before { + content: "\f040"; +} +.icon-map-marker:before { + content: "\f041"; +} +.icon-adjust:before { + content: "\f042"; +} +.icon-tint:before { + content: "\f043"; +} +.icon-edit:before { + content: "\f044"; +} +.icon-share:before { + content: "\f045"; +} +.icon-check:before { + content: "\f046"; +} +.icon-move:before { + content: "\f047"; +} +.icon-step-backward:before { + content: "\f048"; +} +.icon-fast-backward:before { + content: "\f049"; +} +.icon-backward:before { + content: "\f04a"; +} +.icon-play:before { + content: "\f04b"; +} +.icon-pause:before { + content: "\f04c"; +} +.icon-stop:before { + content: "\f04d"; +} +.icon-forward:before { + content: "\f04e"; +} +.icon-fast-forward:before { + content: "\f050"; +} +.icon-step-forward:before { + content: "\f051"; +} +.icon-eject:before { + content: "\f052"; +} +.icon-chevron-left:before { + content: "\f053"; +} +.icon-chevron-right:before { + content: "\f054"; +} +.icon-plus-sign:before { + content: "\f055"; +} +.icon-minus-sign:before { + content: "\f056"; +} +.icon-remove-sign:before { + content: "\f057"; +} +.icon-ok-sign:before { + content: "\f058"; +} +.icon-question-sign:before { + content: "\f059"; +} +.icon-info-sign:before { + content: "\f05a"; +} +.icon-screenshot:before { + content: "\f05b"; +} +.icon-remove-circle:before { + content: "\f05c"; +} +.icon-ok-circle:before { + content: "\f05d"; +} +.icon-ban-circle:before { + content: "\f05e"; +} +.icon-arrow-left:before { + content: "\f060"; +} +.icon-arrow-right:before { + content: "\f061"; +} +.icon-arrow-up:before { + content: "\f062"; +} +.icon-arrow-down:before { + content: "\f063"; +} +.icon-mail-forward:before, +.icon-share-alt:before { + content: "\f064"; +} +.icon-resize-full:before { + content: "\f065"; +} +.icon-resize-small:before { + content: "\f066"; +} +.icon-plus:before { + content: "\f067"; +} +.icon-minus:before { + content: "\f068"; +} +.icon-asterisk:before { + content: "\f069"; +} +.icon-exclamation-sign:before { + content: "\f06a"; +} +.icon-gift:before { + content: "\f06b"; +} +.icon-leaf:before { + content: "\f06c"; +} +.icon-fire:before { + content: "\f06d"; +} +.icon-eye-open:before { + content: "\f06e"; +} +.icon-eye-close:before { + content: "\f070"; +} +.icon-warning-sign:before { + content: "\f071"; +} +.icon-plane:before { + content: "\f072"; +} +.icon-calendar:before { + content: "\f073"; +} +.icon-random:before { + content: "\f074"; +} +.icon-comment:before { + content: "\f075"; +} +.icon-magnet:before { + content: "\f076"; +} +.icon-chevron-up:before { + content: "\f077"; +} +.icon-chevron-down:before { + content: "\f078"; +} +.icon-retweet:before { + content: "\f079"; +} +.icon-shopping-cart:before { + content: "\f07a"; +} +.icon-folder-close:before { + content: "\f07b"; +} +.icon-folder-open:before { + content: "\f07c"; +} +.icon-resize-vertical:before { + content: "\f07d"; +} +.icon-resize-horizontal:before { + content: "\f07e"; +} +.icon-bar-chart:before { + content: "\f080"; +} +.icon-twitter-sign:before { + content: "\f081"; +} +.icon-facebook-sign:before { + content: "\f082"; +} +.icon-camera-retro:before { + content: "\f083"; +} +.icon-key:before { + content: "\f084"; +} +.icon-gears:before, +.icon-cogs:before { + content: "\f085"; +} +.icon-comments:before { + content: "\f086"; +} +.icon-thumbs-up-alt:before { + content: "\f087"; +} +.icon-thumbs-down-alt:before { + content: "\f088"; +} +.icon-star-half:before { + content: "\f089"; +} +.icon-heart-empty:before { + content: "\f08a"; +} +.icon-signout:before { + content: "\f08b"; +} +.icon-linkedin-sign:before { + content: "\f08c"; +} +.icon-pushpin:before { + content: "\f08d"; +} +.icon-external-link:before { + content: "\f08e"; +} +.icon-signin:before { + content: "\f090"; +} +.icon-trophy:before { + content: "\f091"; +} +.icon-github-sign:before { + content: "\f092"; +} +.icon-upload-alt:before { + content: "\f093"; +} +.icon-lemon:before { + content: "\f094"; +} +.icon-phone:before { + content: "\f095"; +} +.icon-unchecked:before, +.icon-check-empty:before { + content: "\f096"; +} +.icon-bookmark-empty:before { + content: "\f097"; +} +.icon-phone-sign:before { + content: "\f098"; +} +.icon-twitter:before { + content: "\f099"; +} +.icon-facebook:before { + content: "\f09a"; +} +.icon-github:before { + content: "\f09b"; +} +.icon-unlock:before { + content: "\f09c"; +} +.icon-credit-card:before { + content: "\f09d"; +} +.icon-rss:before { + content: "\f09e"; +} +.icon-hdd:before { + content: "\f0a0"; +} +.icon-bullhorn:before { + content: "\f0a1"; +} +.icon-bell:before { + content: "\f0a2"; +} +.icon-certificate:before { + content: "\f0a3"; +} +.icon-hand-right:before { + content: "\f0a4"; +} +.icon-hand-left:before { + content: "\f0a5"; +} +.icon-hand-up:before { + content: "\f0a6"; +} +.icon-hand-down:before { + content: "\f0a7"; +} +.icon-circle-arrow-left:before { + content: "\f0a8"; +} +.icon-circle-arrow-right:before { + content: "\f0a9"; +} +.icon-circle-arrow-up:before { + content: "\f0aa"; +} +.icon-circle-arrow-down:before { + content: "\f0ab"; +} +.icon-globe:before { + content: "\f0ac"; +} +.icon-wrench:before { + content: "\f0ad"; +} +.icon-tasks:before { + content: "\f0ae"; +} +.icon-filter:before { + content: "\f0b0"; +} +.icon-briefcase:before { + content: "\f0b1"; +} +.icon-fullscreen:before { + content: "\f0b2"; +} +.icon-group:before { + content: "\f0c0"; +} +.icon-link:before { + content: "\f0c1"; +} +.icon-cloud:before { + content: "\f0c2"; +} +.icon-beaker:before { + content: "\f0c3"; +} +.icon-cut:before { + content: "\f0c4"; +} +.icon-copy:before { + content: "\f0c5"; +} +.icon-paperclip:before, +.icon-paper-clip:before { + content: "\f0c6"; +} +.icon-save:before { + content: "\f0c7"; +} +.icon-sign-blank:before { + content: "\f0c8"; +} +.icon-reorder:before { + content: "\f0c9"; +} +.icon-list-ul:before { + content: "\f0ca"; +} +.icon-list-ol:before { + content: "\f0cb"; +} +.icon-strikethrough:before { + content: "\f0cc"; +} +.icon-underline:before { + content: "\f0cd"; +} +.icon-table:before { + content: "\f0ce"; +} +.icon-magic:before { + content: "\f0d0"; +} +.icon-truck:before { + content: "\f0d1"; +} +.icon-pinterest:before { + content: "\f0d2"; +} +.icon-pinterest-sign:before { + content: "\f0d3"; +} +.icon-google-plus-sign:before { + content: "\f0d4"; +} +.icon-google-plus:before { + content: "\f0d5"; +} +.icon-money:before { + content: "\f0d6"; +} +.icon-caret-down:before { + content: "\f0d7"; +} +.icon-caret-up:before { + content: "\f0d8"; +} +.icon-caret-left:before { + content: "\f0d9"; +} +.icon-caret-right:before { + content: "\f0da"; +} +.icon-columns:before { + content: "\f0db"; +} +.icon-sort:before { + content: "\f0dc"; +} +.icon-sort-down:before { + content: "\f0dd"; +} +.icon-sort-up:before { + content: "\f0de"; +} +.icon-envelope:before { + content: "\f0e0"; +} +.icon-linkedin:before { + content: "\f0e1"; +} +.icon-rotate-left:before, +.icon-undo:before { + content: "\f0e2"; +} +.icon-legal:before { + content: "\f0e3"; +} +.icon-dashboard:before { + content: "\f0e4"; +} +.icon-comment-alt:before { + content: "\f0e5"; +} +.icon-comments-alt:before { + content: "\f0e6"; +} +.icon-bolt:before { + content: "\f0e7"; +} +.icon-sitemap:before { + content: "\f0e8"; +} +.icon-umbrella:before { + content: "\f0e9"; +} +.icon-paste:before { + content: "\f0ea"; +} +.icon-lightbulb:before { + content: "\f0eb"; +} +.icon-exchange:before { + content: "\f0ec"; +} +.icon-cloud-download:before { + content: "\f0ed"; +} +.icon-cloud-upload:before { + content: "\f0ee"; +} +.icon-user-md:before { + content: "\f0f0"; +} +.icon-stethoscope:before { + content: "\f0f1"; +} +.icon-suitcase:before { + content: "\f0f2"; +} +.icon-bell-alt:before { + content: "\f0f3"; +} +.icon-coffee:before { + content: "\f0f4"; +} +.icon-food:before { + content: "\f0f5"; +} +.icon-file-text-alt:before { + content: "\f0f6"; +} +.icon-building:before { + content: "\f0f7"; +} +.icon-hospital:before { + content: "\f0f8"; +} +.icon-ambulance:before { + content: "\f0f9"; +} +.icon-medkit:before { + content: "\f0fa"; +} +.icon-fighter-jet:before { + content: "\f0fb"; +} +.icon-beer:before { + content: "\f0fc"; +} +.icon-h-sign:before { + content: "\f0fd"; +} +.icon-plus-sign-alt:before { + content: "\f0fe"; +} +.icon-double-angle-left:before { + content: "\f100"; +} +.icon-double-angle-right:before { + content: "\f101"; +} +.icon-double-angle-up:before { + content: "\f102"; +} +.icon-double-angle-down:before { + content: "\f103"; +} +.icon-angle-left:before { + content: "\f104"; +} +.icon-angle-right:before { + content: "\f105"; +} +.icon-angle-up:before { + content: "\f106"; +} +.icon-angle-down:before { + content: "\f107"; +} +.icon-desktop:before { + content: "\f108"; +} +.icon-laptop:before { + content: "\f109"; +} +.icon-tablet:before { + content: "\f10a"; +} +.icon-mobile-phone:before { + content: "\f10b"; +} +.icon-circle-blank:before { + content: "\f10c"; +} +.icon-quote-left:before { + content: "\f10d"; +} +.icon-quote-right:before { + content: "\f10e"; +} +.icon-spinner:before { + content: "\f110"; +} +.icon-circle:before { + content: "\f111"; +} +.icon-mail-reply:before, +.icon-reply:before { + content: "\f112"; +} +.icon-github-alt:before { + content: "\f113"; +} +.icon-folder-close-alt:before { + content: "\f114"; +} +.icon-folder-open-alt:before { + content: "\f115"; +} +.icon-expand-alt:before { + content: "\f116"; +} +.icon-collapse-alt:before { + content: "\f117"; +} +.icon-smile:before { + content: "\f118"; +} +.icon-frown:before { + content: "\f119"; +} +.icon-meh:before { + content: "\f11a"; +} +.icon-gamepad:before { + content: "\f11b"; +} +.icon-keyboard:before { + content: "\f11c"; +} +.icon-flag-alt:before { + content: "\f11d"; +} +.icon-flag-checkered:before { + content: "\f11e"; +} +.icon-terminal:before { + content: "\f120"; +} +.icon-code:before { + content: "\f121"; +} +.icon-reply-all:before { + content: "\f122"; +} +.icon-mail-reply-all:before { + content: "\f122"; +} +.icon-star-half-full:before, +.icon-star-half-empty:before { + content: "\f123"; +} +.icon-location-arrow:before { + content: "\f124"; +} +.icon-crop:before { + content: "\f125"; +} +.icon-code-fork:before { + content: "\f126"; +} +.icon-unlink:before { + content: "\f127"; +} +.icon-question:before { + content: "\f128"; +} +.icon-info:before { + content: "\f129"; +} +.icon-exclamation:before { + content: "\f12a"; +} +.icon-superscript:before { + content: "\f12b"; +} +.icon-subscript:before { + content: "\f12c"; +} +.icon-eraser:before { + content: "\f12d"; +} +.icon-puzzle-piece:before { + content: "\f12e"; +} +.icon-microphone:before { + content: "\f130"; +} +.icon-microphone-off:before { + content: "\f131"; +} +.icon-shield:before { + content: "\f132"; +} +.icon-calendar-empty:before { + content: "\f133"; +} +.icon-fire-extinguisher:before { + content: "\f134"; +} +.icon-rocket:before { + content: "\f135"; +} +.icon-maxcdn:before { + content: "\f136"; +} +.icon-chevron-sign-left:before { + content: "\f137"; +} +.icon-chevron-sign-right:before { + content: "\f138"; +} +.icon-chevron-sign-up:before { + content: "\f139"; +} +.icon-chevron-sign-down:before { + content: "\f13a"; +} +.icon-html5:before { + content: "\f13b"; +} +.icon-css3:before { + content: "\f13c"; +} +.icon-anchor:before { + content: "\f13d"; +} +.icon-unlock-alt:before { + content: "\f13e"; +} +.icon-bullseye:before { + content: "\f140"; +} +.icon-ellipsis-horizontal:before { + content: "\f141"; +} +.icon-ellipsis-vertical:before { + content: "\f142"; +} +.icon-rss-sign:before { + content: "\f143"; +} +.icon-play-sign:before { + content: "\f144"; +} +.icon-ticket:before { + content: "\f145"; +} +.icon-minus-sign-alt:before { + content: "\f146"; +} +.icon-check-minus:before { + content: "\f147"; +} +.icon-level-up:before { + content: "\f148"; +} +.icon-level-down:before { + content: "\f149"; +} +.icon-check-sign:before { + content: "\f14a"; +} +.icon-edit-sign:before { + content: "\f14b"; +} +.icon-external-link-sign:before { + content: "\f14c"; +} +.icon-share-sign:before { + content: "\f14d"; +} +.icon-compass:before { + content: "\f14e"; +} +.icon-collapse:before { + content: "\f150"; +} +.icon-collapse-top:before { + content: "\f151"; +} +.icon-expand:before { + content: "\f152"; +} +.icon-euro:before, +.icon-eur:before { + content: "\f153"; +} +.icon-gbp:before { + content: "\f154"; +} +.icon-dollar:before, +.icon-usd:before { + content: "\f155"; +} +.icon-rupee:before, +.icon-inr:before { + content: "\f156"; +} +.icon-yen:before, +.icon-jpy:before { + content: "\f157"; +} +.icon-renminbi:before, +.icon-cny:before { + content: "\f158"; +} +.icon-won:before, +.icon-krw:before { + content: "\f159"; +} +.icon-bitcoin:before, +.icon-btc:before { + content: "\f15a"; +} +.icon-file:before { + content: "\f15b"; +} +.icon-file-text:before { + content: "\f15c"; +} +.icon-sort-by-alphabet:before { + content: "\f15d"; +} +.icon-sort-by-alphabet-alt:before { + content: "\f15e"; +} +.icon-sort-by-attributes:before { + content: "\f160"; +} +.icon-sort-by-attributes-alt:before { + content: "\f161"; +} +.icon-sort-by-order:before { + content: "\f162"; +} +.icon-sort-by-order-alt:before { + content: "\f163"; +} +.icon-thumbs-up:before { + content: "\f164"; +} +.icon-thumbs-down:before { + content: "\f165"; +} +.icon-youtube-sign:before { + content: "\f166"; +} +.icon-youtube:before { + content: "\f167"; +} +.icon-xing:before { + content: "\f168"; +} +.icon-xing-sign:before { + content: "\f169"; +} +.icon-youtube-play:before { + content: "\f16a"; +} +.icon-dropbox:before { + content: "\f16b"; +} +.icon-stackexchange:before { + content: "\f16c"; +} +.icon-instagram:before { + content: "\f16d"; +} +.icon-flickr:before { + content: "\f16e"; +} +.icon-adn:before { + content: "\f170"; +} +.icon-bitbucket:before { + content: "\f171"; +} +.icon-bitbucket-sign:before { + content: "\f172"; +} +.icon-tumblr:before { + content: "\f173"; +} +.icon-tumblr-sign:before { + content: "\f174"; +} +.icon-long-arrow-down:before { + content: "\f175"; +} +.icon-long-arrow-up:before { + content: "\f176"; +} +.icon-long-arrow-left:before { + content: "\f177"; +} +.icon-long-arrow-right:before { + content: "\f178"; +} +.icon-apple:before { + content: "\f179"; +} +.icon-windows:before { + content: "\f17a"; +} +.icon-android:before { + content: "\f17b"; +} +.icon-linux:before { + content: "\f17c"; +} +.icon-dribbble:before { + content: "\f17d"; +} +.icon-skype:before { + content: "\f17e"; +} +.icon-foursquare:before { + content: "\f180"; +} +.icon-trello:before { + content: "\f181"; +} +.icon-female:before { + content: "\f182"; +} +.icon-male:before { + content: "\f183"; +} +.icon-gittip:before { + content: "\f184"; +} +.icon-sun:before { + content: "\f185"; +} +.icon-moon:before { + content: "\f186"; +} +.icon-archive:before { + content: "\f187"; +} +.icon-bug:before { + content: "\f188"; +} +.icon-vk:before { + content: "\f189"; +} +.icon-weibo:before { + content: "\f18a"; +} +.icon-renren:before { + content: "\f18b"; +} +@charset "UTF-8"; +/*! +Animate.css - http://daneden.me/animate +Licensed under the MIT license + +Copyright (c) 2013 Daniel Eden + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +*/ +.animated { + -webkit-animation-duration: 1s; + animation-duration: 1s; + -webkit-animation-fill-mode: both; + animation-fill-mode: both; +} +.animated.hinge { + -webkit-animation-duration: 2s; + animation-duration: 2s; +} +@-webkit-keyframes bounce { + 0%, + 20%, + 50%, + 80%, + 100% { + -webkit-transform: translateY(0); + transform: translateY(0); + } + 40% { + -webkit-transform: translateY(-30px); + transform: translateY(-30px); + } + 60% { + -webkit-transform: translateY(-15px); + transform: translateY(-15px); + } +} +@keyframes bounce { + 0%, + 20%, + 50%, + 80%, + 100% { + -webkit-transform: translateY(0); + -ms-transform: translateY(0); + transform: translateY(0); + } + 40% { + -webkit-transform: translateY(-30px); + -ms-transform: translateY(-30px); + transform: translateY(-30px); + } + 60% { + -webkit-transform: translateY(-15px); + -ms-transform: translateY(-15px); + transform: translateY(-15px); + } +} +.bounce { + -webkit-animation-name: bounce; + animation-name: bounce; +} +@-webkit-keyframes flash { + 0%, + 50%, + 100% { + opacity: 1; + } + 25%, + 75% { + opacity: 0; + } +} +@keyframes flash { + 0%, + 50%, + 100% { + opacity: 1; + } + 25%, + 75% { + opacity: 0; + } +} +.flash { + -webkit-animation-name: flash; + animation-name: flash; +} +/* originally authored by Nick Pettit - https://github.com/nickpettit/glide */ +@-webkit-keyframes pulse { + 0% { + -webkit-transform: scale(1); + transform: scale(1); + } + 50% { + -webkit-transform: scale(1.1); + transform: scale(1.1); + } + 100% { + -webkit-transform: scale(1); + transform: scale(1); + } +} +@keyframes pulse { + 0% { + -webkit-transform: scale(1); + -ms-transform: scale(1); + transform: scale(1); + } + 50% { + -webkit-transform: scale(1.1); + -ms-transform: scale(1.1); + transform: scale(1.1); + } + 100% { + -webkit-transform: scale(1); + -ms-transform: scale(1); + transform: scale(1); + } +} +.pulse { + -webkit-animation-name: pulse; + animation-name: pulse; +} +@-webkit-keyframes shake { + 0%, + 100% { + -webkit-transform: translateX(0); + transform: translateX(0); + } + 10%, + 30%, + 50%, + 70%, + 90% { + -webkit-transform: translateX(-10px); + transform: translateX(-10px); + } + 20%, + 40%, + 60%, + 80% { + -webkit-transform: translateX(10px); + transform: translateX(10px); + } +} +@keyframes shake { + 0%, + 100% { + -webkit-transform: translateX(0); + -ms-transform: translateX(0); + transform: translateX(0); + } + 10%, + 30%, + 50%, + 70%, + 90% { + -webkit-transform: translateX(-10px); + -ms-transform: translateX(-10px); + transform: translateX(-10px); + } + 20%, + 40%, + 60%, + 80% { + -webkit-transform: translateX(10px); + -ms-transform: translateX(10px); + transform: translateX(10px); + } +} +.shake { + -webkit-animation-name: shake; + animation-name: shake; +} +@-webkit-keyframes swing { + 20% { + -webkit-transform: rotate(15deg); + transform: rotate(15deg); + } + 40% { + -webkit-transform: rotate(-10deg); + transform: rotate(-10deg); + } + 60% { + -webkit-transform: rotate(5deg); + transform: rotate(5deg); + } + 80% { + -webkit-transform: rotate(-5deg); + transform: rotate(-5deg); + } + 100% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + } +} +@keyframes swing { + 20% { + -webkit-transform: rotate(15deg); + -ms-transform: rotate(15deg); + transform: rotate(15deg); + } + 40% { + -webkit-transform: rotate(-10deg); + -ms-transform: rotate(-10deg); + transform: rotate(-10deg); + } + 60% { + -webkit-transform: rotate(5deg); + -ms-transform: rotate(5deg); + transform: rotate(5deg); + } + 80% { + -webkit-transform: rotate(-5deg); + -ms-transform: rotate(-5deg); + transform: rotate(-5deg); + } + 100% { + -webkit-transform: rotate(0deg); + -ms-transform: rotate(0deg); + transform: rotate(0deg); + } +} +.swing { + -webkit-transform-origin: top center; + -ms-transform-origin: top center; + transform-origin: top center; + -webkit-animation-name: swing; + animation-name: swing; +} +@-webkit-keyframes tada { + 0% { + -webkit-transform: scale(1); + transform: scale(1); + } + 10%, + 20% { + -webkit-transform: scale(0.9) rotate(-3deg); + transform: scale(0.9) rotate(-3deg); + } + 30%, + 50%, + 70%, + 90% { + -webkit-transform: scale(1.1) rotate(3deg); + transform: scale(1.1) rotate(3deg); + } + 40%, + 60%, + 80% { + -webkit-transform: scale(1.1) rotate(-3deg); + transform: scale(1.1) rotate(-3deg); + } + 100% { + -webkit-transform: scale(1) rotate(0); + transform: scale(1) rotate(0); + } +} +@keyframes tada { + 0% { + -webkit-transform: scale(1); + -ms-transform: scale(1); + transform: scale(1); + } + 10%, + 20% { + -webkit-transform: scale(0.9) rotate(-3deg); + -ms-transform: scale(0.9) rotate(-3deg); + transform: scale(0.9) rotate(-3deg); + } + 30%, + 50%, + 70%, + 90% { + -webkit-transform: scale(1.1) rotate(3deg); + -ms-transform: scale(1.1) rotate(3deg); + transform: scale(1.1) rotate(3deg); + } + 40%, + 60%, + 80% { + -webkit-transform: scale(1.1) rotate(-3deg); + -ms-transform: scale(1.1) rotate(-3deg); + transform: scale(1.1) rotate(-3deg); + } + 100% { + -webkit-transform: scale(1) rotate(0); + -ms-transform: scale(1) rotate(0); + transform: scale(1) rotate(0); + } +} +.tada { + -webkit-animation-name: tada; + animation-name: tada; +} +/* originally authored by Nick Pettit - https://github.com/nickpettit/glide */ +@-webkit-keyframes wobble { + 0% { + -webkit-transform: translateX(0%); + transform: translateX(0%); + } + 15% { + -webkit-transform: translateX(-25%) rotate(-5deg); + transform: translateX(-25%) rotate(-5deg); + } + 30% { + -webkit-transform: translateX(20%) rotate(3deg); + transform: translateX(20%) rotate(3deg); + } + 45% { + -webkit-transform: translateX(-15%) rotate(-3deg); + transform: translateX(-15%) rotate(-3deg); + } + 60% { + -webkit-transform: translateX(10%) rotate(2deg); + transform: translateX(10%) rotate(2deg); + } + 75% { + -webkit-transform: translateX(-5%) rotate(-1deg); + transform: translateX(-5%) rotate(-1deg); + } + 100% { + -webkit-transform: translateX(0%); + transform: translateX(0%); + } +} +@keyframes wobble { + 0% { + -webkit-transform: translateX(0%); + -ms-transform: translateX(0%); + transform: translateX(0%); + } + 15% { + -webkit-transform: translateX(-25%) rotate(-5deg); + -ms-transform: translateX(-25%) rotate(-5deg); + transform: translateX(-25%) rotate(-5deg); + } + 30% { + -webkit-transform: translateX(20%) rotate(3deg); + -ms-transform: translateX(20%) rotate(3deg); + transform: translateX(20%) rotate(3deg); + } + 45% { + -webkit-transform: translateX(-15%) rotate(-3deg); + -ms-transform: translateX(-15%) rotate(-3deg); + transform: translateX(-15%) rotate(-3deg); + } + 60% { + -webkit-transform: translateX(10%) rotate(2deg); + -ms-transform: translateX(10%) rotate(2deg); + transform: translateX(10%) rotate(2deg); + } + 75% { + -webkit-transform: translateX(-5%) rotate(-1deg); + -ms-transform: translateX(-5%) rotate(-1deg); + transform: translateX(-5%) rotate(-1deg); + } + 100% { + -webkit-transform: translateX(0%); + -ms-transform: translateX(0%); + transform: translateX(0%); + } +} +.wobble { + -webkit-animation-name: wobble; + animation-name: wobble; +} +@-webkit-keyframes bounceIn { + 0% { + opacity: 0; + -webkit-transform: scale(0.3); + transform: scale(0.3); + } + 50% { + opacity: 1; + -webkit-transform: scale(1.05); + transform: scale(1.05); + } + 70% { + -webkit-transform: scale(0.9); + transform: scale(0.9); + } + 100% { + -webkit-transform: scale(1); + transform: scale(1); + } +} +@keyframes bounceIn { + 0% { + opacity: 0; + -webkit-transform: scale(0.3); + -ms-transform: scale(0.3); + transform: scale(0.3); + } + 50% { + opacity: 1; + -webkit-transform: scale(1.05); + -ms-transform: scale(1.05); + transform: scale(1.05); + } + 70% { + -webkit-transform: scale(0.9); + -ms-transform: scale(0.9); + transform: scale(0.9); + } + 100% { + -webkit-transform: scale(1); + -ms-transform: scale(1); + transform: scale(1); + } +} +.bounceIn { + -webkit-animation-name: bounceIn; + animation-name: bounceIn; +} +@-webkit-keyframes bounceInDown { + 0% { + opacity: 0; + -webkit-transform: translateY(-2000px); + transform: translateY(-2000px); + } + 60% { + opacity: 1; + -webkit-transform: translateY(30px); + transform: translateY(30px); + } + 80% { + -webkit-transform: translateY(-10px); + transform: translateY(-10px); + } + 100% { + -webkit-transform: translateY(0); + transform: translateY(0); + } +} +@keyframes bounceInDown { + 0% { + opacity: 0; + -webkit-transform: translateY(-2000px); + -ms-transform: translateY(-2000px); + transform: translateY(-2000px); + } + 60% { + opacity: 1; + -webkit-transform: translateY(30px); + -ms-transform: translateY(30px); + transform: translateY(30px); + } + 80% { + -webkit-transform: translateY(-10px); + -ms-transform: translateY(-10px); + transform: translateY(-10px); + } + 100% { + -webkit-transform: translateY(0); + -ms-transform: translateY(0); + transform: translateY(0); + } +} +.bounceInDown { + -webkit-animation-name: bounceInDown; + animation-name: bounceInDown; +} +@-webkit-keyframes bounceInLeft { + 0% { + opacity: 0; + -webkit-transform: translateX(-2000px); + transform: translateX(-2000px); + } + 60% { + opacity: 1; + -webkit-transform: translateX(30px); + transform: translateX(30px); + } + 80% { + -webkit-transform: translateX(-10px); + transform: translateX(-10px); + } + 100% { + -webkit-transform: translateX(0); + transform: translateX(0); + } +} +@keyframes bounceInLeft { + 0% { + opacity: 0; + -webkit-transform: translateX(-2000px); + -ms-transform: translateX(-2000px); + transform: translateX(-2000px); + } + 60% { + opacity: 1; + -webkit-transform: translateX(30px); + -ms-transform: translateX(30px); + transform: translateX(30px); + } + 80% { + -webkit-transform: translateX(-10px); + -ms-transform: translateX(-10px); + transform: translateX(-10px); + } + 100% { + -webkit-transform: translateX(0); + -ms-transform: translateX(0); + transform: translateX(0); + } +} +.bounceInLeft { + -webkit-animation-name: bounceInLeft; + animation-name: bounceInLeft; +} +@-webkit-keyframes bounceInRight { + 0% { + opacity: 0; + -webkit-transform: translateX(2000px); + transform: translateX(2000px); + } + 60% { + opacity: 1; + -webkit-transform: translateX(-30px); + transform: translateX(-30px); + } + 80% { + -webkit-transform: translateX(10px); + transform: translateX(10px); + } + 100% { + -webkit-transform: translateX(0); + transform: translateX(0); + } +} +@keyframes bounceInRight { + 0% { + opacity: 0; + -webkit-transform: translateX(2000px); + -ms-transform: translateX(2000px); + transform: translateX(2000px); + } + 60% { + opacity: 1; + -webkit-transform: translateX(-30px); + -ms-transform: translateX(-30px); + transform: translateX(-30px); + } + 80% { + -webkit-transform: translateX(10px); + -ms-transform: translateX(10px); + transform: translateX(10px); + } + 100% { + -webkit-transform: translateX(0); + -ms-transform: translateX(0); + transform: translateX(0); + } +} +.bounceInRight { + -webkit-animation-name: bounceInRight; + animation-name: bounceInRight; +} +@-webkit-keyframes bounceInUp { + 0% { + opacity: 0; + -webkit-transform: translateY(2000px); + transform: translateY(2000px); + } + 60% { + opacity: 1; + -webkit-transform: translateY(-30px); + transform: translateY(-30px); + } + 80% { + -webkit-transform: translateY(10px); + transform: translateY(10px); + } + 100% { + -webkit-transform: translateY(0); + transform: translateY(0); + } +} +@keyframes bounceInUp { + 0% { + opacity: 0; + -webkit-transform: translateY(2000px); + -ms-transform: translateY(2000px); + transform: translateY(2000px); + } + 60% { + opacity: 1; + -webkit-transform: translateY(-30px); + -ms-transform: translateY(-30px); + transform: translateY(-30px); + } + 80% { + -webkit-transform: translateY(10px); + -ms-transform: translateY(10px); + transform: translateY(10px); + } + 100% { + -webkit-transform: translateY(0); + -ms-transform: translateY(0); + transform: translateY(0); + } +} +.bounceInUp { + -webkit-animation-name: bounceInUp; + animation-name: bounceInUp; +} +@-webkit-keyframes bounceOut { + 0% { + -webkit-transform: scale(1); + transform: scale(1); + } + 25% { + -webkit-transform: scale(0.95); + transform: scale(0.95); + } + 50% { + opacity: 1; + -webkit-transform: scale(1.1); + transform: scale(1.1); + } + 100% { + opacity: 0; + -webkit-transform: scale(0.3); + transform: scale(0.3); + } +} +@keyframes bounceOut { + 0% { + -webkit-transform: scale(1); + -ms-transform: scale(1); + transform: scale(1); + } + 25% { + -webkit-transform: scale(0.95); + -ms-transform: scale(0.95); + transform: scale(0.95); + } + 50% { + opacity: 1; + -webkit-transform: scale(1.1); + -ms-transform: scale(1.1); + transform: scale(1.1); + } + 100% { + opacity: 0; + -webkit-transform: scale(0.3); + -ms-transform: scale(0.3); + transform: scale(0.3); + } +} +.bounceOut { + -webkit-animation-name: bounceOut; + animation-name: bounceOut; +} +@-webkit-keyframes bounceOutDown { + 0% { + -webkit-transform: translateY(0); + transform: translateY(0); + } + 20% { + opacity: 1; + -webkit-transform: translateY(-20px); + transform: translateY(-20px); + } + 100% { + opacity: 0; + -webkit-transform: translateY(2000px); + transform: translateY(2000px); + } +} +@keyframes bounceOutDown { + 0% { + -webkit-transform: translateY(0); + -ms-transform: translateY(0); + transform: translateY(0); + } + 20% { + opacity: 1; + -webkit-transform: translateY(-20px); + -ms-transform: translateY(-20px); + transform: translateY(-20px); + } + 100% { + opacity: 0; + -webkit-transform: translateY(2000px); + -ms-transform: translateY(2000px); + transform: translateY(2000px); + } +} +.bounceOutDown { + -webkit-animation-name: bounceOutDown; + animation-name: bounceOutDown; +} +@-webkit-keyframes bounceOutLeft { + 0% { + -webkit-transform: translateX(0); + transform: translateX(0); + } + 20% { + opacity: 1; + -webkit-transform: translateX(20px); + transform: translateX(20px); + } + 100% { + opacity: 0; + -webkit-transform: translateX(-2000px); + transform: translateX(-2000px); + } +} +@keyframes bounceOutLeft { + 0% { + -webkit-transform: translateX(0); + -ms-transform: translateX(0); + transform: translateX(0); + } + 20% { + opacity: 1; + -webkit-transform: translateX(20px); + -ms-transform: translateX(20px); + transform: translateX(20px); + } + 100% { + opacity: 0; + -webkit-transform: translateX(-2000px); + -ms-transform: translateX(-2000px); + transform: translateX(-2000px); + } +} +.bounceOutLeft { + -webkit-animation-name: bounceOutLeft; + animation-name: bounceOutLeft; +} +@-webkit-keyframes bounceOutRight { + 0% { + -webkit-transform: translateX(0); + transform: translateX(0); + } + 20% { + opacity: 1; + -webkit-transform: translateX(-20px); + transform: translateX(-20px); + } + 100% { + opacity: 0; + -webkit-transform: translateX(2000px); + transform: translateX(2000px); + } +} +@keyframes bounceOutRight { + 0% { + -webkit-transform: translateX(0); + -ms-transform: translateX(0); + transform: translateX(0); + } + 20% { + opacity: 1; + -webkit-transform: translateX(-20px); + -ms-transform: translateX(-20px); + transform: translateX(-20px); + } + 100% { + opacity: 0; + -webkit-transform: translateX(2000px); + -ms-transform: translateX(2000px); + transform: translateX(2000px); + } +} +.bounceOutRight { + -webkit-animation-name: bounceOutRight; + animation-name: bounceOutRight; +} +@-webkit-keyframes bounceOutUp { + 0% { + -webkit-transform: translateY(0); + transform: translateY(0); + } + 20% { + opacity: 1; + -webkit-transform: translateY(20px); + transform: translateY(20px); + } + 100% { + opacity: 0; + -webkit-transform: translateY(-2000px); + transform: translateY(-2000px); + } +} +@keyframes bounceOutUp { + 0% { + -webkit-transform: translateY(0); + -ms-transform: translateY(0); + transform: translateY(0); + } + 20% { + opacity: 1; + -webkit-transform: translateY(20px); + -ms-transform: translateY(20px); + transform: translateY(20px); + } + 100% { + opacity: 0; + -webkit-transform: translateY(-2000px); + -ms-transform: translateY(-2000px); + transform: translateY(-2000px); + } +} +.bounceOutUp { + -webkit-animation-name: bounceOutUp; + animation-name: bounceOutUp; +} +@-webkit-keyframes fadeIn { + 0% { + opacity: 0; + } + 100% { + opacity: 1; + } +} +@keyframes fadeIn { + 0% { + opacity: 0; + } + 100% { + opacity: 1; + } +} +.fadeIn { + -webkit-animation-name: fadeIn; + animation-name: fadeIn; +} +@-webkit-keyframes fadeInDown { + 0% { + opacity: 0; + -webkit-transform: translateY(-20px); + transform: translateY(-20px); + } + 100% { + opacity: 1; + -webkit-transform: translateY(0); + transform: translateY(0); + } +} +@keyframes fadeInDown { + 0% { + opacity: 0; + -webkit-transform: translateY(-20px); + -ms-transform: translateY(-20px); + transform: translateY(-20px); + } + 100% { + opacity: 1; + -webkit-transform: translateY(0); + -ms-transform: translateY(0); + transform: translateY(0); + } +} +.fadeInDown { + -webkit-animation-name: fadeInDown; + animation-name: fadeInDown; +} +@-webkit-keyframes fadeInDownBig { + 0% { + opacity: 0; + -webkit-transform: translateY(-2000px); + transform: translateY(-2000px); + } + 100% { + opacity: 1; + -webkit-transform: translateY(0); + transform: translateY(0); + } +} +@keyframes fadeInDownBig { + 0% { + opacity: 0; + -webkit-transform: translateY(-2000px); + -ms-transform: translateY(-2000px); + transform: translateY(-2000px); + } + 100% { + opacity: 1; + -webkit-transform: translateY(0); + -ms-transform: translateY(0); + transform: translateY(0); + } +} +.fadeInDownBig { + -webkit-animation-name: fadeInDownBig; + animation-name: fadeInDownBig; +} +@-webkit-keyframes fadeInLeft { + 0% { + opacity: 0; + -webkit-transform: translateX(-20px); + transform: translateX(-20px); + } + 100% { + opacity: 1; + -webkit-transform: translateX(0); + transform: translateX(0); + } +} +@keyframes fadeInLeft { + 0% { + opacity: 0; + -webkit-transform: translateX(-20px); + -ms-transform: translateX(-20px); + transform: translateX(-20px); + } + 100% { + opacity: 1; + -webkit-transform: translateX(0); + -ms-transform: translateX(0); + transform: translateX(0); + } +} +.fadeInLeft { + -webkit-animation-name: fadeInLeft; + animation-name: fadeInLeft; +} +@-webkit-keyframes fadeInLeftBig { + 0% { + opacity: 0; + -webkit-transform: translateX(-2000px); + transform: translateX(-2000px); + } + 100% { + opacity: 1; + -webkit-transform: translateX(0); + transform: translateX(0); + } +} +@keyframes fadeInLeftBig { + 0% { + opacity: 0; + -webkit-transform: translateX(-2000px); + -ms-transform: translateX(-2000px); + transform: translateX(-2000px); + } + 100% { + opacity: 1; + -webkit-transform: translateX(0); + -ms-transform: translateX(0); + transform: translateX(0); + } +} +.fadeInLeftBig { + -webkit-animation-name: fadeInLeftBig; + animation-name: fadeInLeftBig; +} +@-webkit-keyframes fadeInRight { + 0% { + opacity: 0; + -webkit-transform: translateX(20px); + transform: translateX(20px); + } + 100% { + opacity: 1; + -webkit-transform: translateX(0); + transform: translateX(0); + } +} +@keyframes fadeInRight { + 0% { + opacity: 0; + -webkit-transform: translateX(20px); + -ms-transform: translateX(20px); + transform: translateX(20px); + } + 100% { + opacity: 1; + -webkit-transform: translateX(0); + -ms-transform: translateX(0); + transform: translateX(0); + } +} +.fadeInRight { + -webkit-animation-name: fadeInRight; + animation-name: fadeInRight; +} +@-webkit-keyframes fadeInRightBig { + 0% { + opacity: 0; + -webkit-transform: translateX(2000px); + transform: translateX(2000px); + } + 100% { + opacity: 1; + -webkit-transform: translateX(0); + transform: translateX(0); + } +} +@keyframes fadeInRightBig { + 0% { + opacity: 0; + -webkit-transform: translateX(2000px); + -ms-transform: translateX(2000px); + transform: translateX(2000px); + } + 100% { + opacity: 1; + -webkit-transform: translateX(0); + -ms-transform: translateX(0); + transform: translateX(0); + } +} +.fadeInRightBig { + -webkit-animation-name: fadeInRightBig; + animation-name: fadeInRightBig; +} +@-webkit-keyframes fadeInUp { + 0% { + opacity: 0; + -webkit-transform: translateY(20px); + transform: translateY(20px); + } + 100% { + opacity: 1; + -webkit-transform: translateY(0); + transform: translateY(0); + } +} +@keyframes fadeInUp { + 0% { + opacity: 0; + -webkit-transform: translateY(20px); + -ms-transform: translateY(20px); + transform: translateY(20px); + } + 100% { + opacity: 1; + -webkit-transform: translateY(0); + -ms-transform: translateY(0); + transform: translateY(0); + } +} +.fadeInUp { + -webkit-animation-name: fadeInUp; + animation-name: fadeInUp; +} +@-webkit-keyframes fadeInUpBig { + 0% { + opacity: 0; + -webkit-transform: translateY(2000px); + transform: translateY(2000px); + } + 100% { + opacity: 1; + -webkit-transform: translateY(0); + transform: translateY(0); + } +} +@keyframes fadeInUpBig { + 0% { + opacity: 0; + -webkit-transform: translateY(2000px); + -ms-transform: translateY(2000px); + transform: translateY(2000px); + } + 100% { + opacity: 1; + -webkit-transform: translateY(0); + -ms-transform: translateY(0); + transform: translateY(0); + } +} +.fadeInUpBig { + -webkit-animation-name: fadeInUpBig; + animation-name: fadeInUpBig; +} +@-webkit-keyframes fadeOut { + 0% { + opacity: 1; + } + 100% { + opacity: 0; + } +} +@keyframes fadeOut { + 0% { + opacity: 1; + } + 100% { + opacity: 0; + } +} +.fadeOut { + -webkit-animation-name: fadeOut; + animation-name: fadeOut; +} +@-webkit-keyframes fadeOutDown { + 0% { + opacity: 1; + -webkit-transform: translateY(0); + transform: translateY(0); + } + 100% { + opacity: 0; + -webkit-transform: translateY(20px); + transform: translateY(20px); + } +} +@keyframes fadeOutDown { + 0% { + opacity: 1; + -webkit-transform: translateY(0); + -ms-transform: translateY(0); + transform: translateY(0); + } + 100% { + opacity: 0; + -webkit-transform: translateY(20px); + -ms-transform: translateY(20px); + transform: translateY(20px); + } +} +.fadeOutDown { + -webkit-animation-name: fadeOutDown; + animation-name: fadeOutDown; +} +@-webkit-keyframes fadeOutDownBig { + 0% { + opacity: 1; + -webkit-transform: translateY(0); + transform: translateY(0); + } + 100% { + opacity: 0; + -webkit-transform: translateY(2000px); + transform: translateY(2000px); + } +} +@keyframes fadeOutDownBig { + 0% { + opacity: 1; + -webkit-transform: translateY(0); + -ms-transform: translateY(0); + transform: translateY(0); + } + 100% { + opacity: 0; + -webkit-transform: translateY(2000px); + -ms-transform: translateY(2000px); + transform: translateY(2000px); + } +} +.fadeOutDownBig { + -webkit-animation-name: fadeOutDownBig; + animation-name: fadeOutDownBig; +} +@-webkit-keyframes fadeOutLeft { + 0% { + opacity: 1; + -webkit-transform: translateX(0); + transform: translateX(0); + } + 100% { + opacity: 0; + -webkit-transform: translateX(-20px); + transform: translateX(-20px); + } +} +@keyframes fadeOutLeft { + 0% { + opacity: 1; + -webkit-transform: translateX(0); + -ms-transform: translateX(0); + transform: translateX(0); + } + 100% { + opacity: 0; + -webkit-transform: translateX(-20px); + -ms-transform: translateX(-20px); + transform: translateX(-20px); + } +} +.fadeOutLeft { + -webkit-animation-name: fadeOutLeft; + animation-name: fadeOutLeft; +} +@-webkit-keyframes fadeOutLeftBig { + 0% { + opacity: 1; + -webkit-transform: translateX(0); + transform: translateX(0); + } + 100% { + opacity: 0; + -webkit-transform: translateX(-2000px); + transform: translateX(-2000px); + } +} +@keyframes fadeOutLeftBig { + 0% { + opacity: 1; + -webkit-transform: translateX(0); + -ms-transform: translateX(0); + transform: translateX(0); + } + 100% { + opacity: 0; + -webkit-transform: translateX(-2000px); + -ms-transform: translateX(-2000px); + transform: translateX(-2000px); + } +} +.fadeOutLeftBig { + -webkit-animation-name: fadeOutLeftBig; + animation-name: fadeOutLeftBig; +} +@-webkit-keyframes fadeOutRight { + 0% { + opacity: 1; + -webkit-transform: translateX(0); + transform: translateX(0); + } + 100% { + opacity: 0; + -webkit-transform: translateX(20px); + transform: translateX(20px); + } +} +@keyframes fadeOutRight { + 0% { + opacity: 1; + -webkit-transform: translateX(0); + -ms-transform: translateX(0); + transform: translateX(0); + } + 100% { + opacity: 0; + -webkit-transform: translateX(20px); + -ms-transform: translateX(20px); + transform: translateX(20px); + } +} +.fadeOutRight { + -webkit-animation-name: fadeOutRight; + animation-name: fadeOutRight; +} +@-webkit-keyframes fadeOutRightBig { + 0% { + opacity: 1; + -webkit-transform: translateX(0); + transform: translateX(0); + } + 100% { + opacity: 0; + -webkit-transform: translateX(2000px); + transform: translateX(2000px); + } +} +@keyframes fadeOutRightBig { + 0% { + opacity: 1; + -webkit-transform: translateX(0); + -ms-transform: translateX(0); + transform: translateX(0); + } + 100% { + opacity: 0; + -webkit-transform: translateX(2000px); + -ms-transform: translateX(2000px); + transform: translateX(2000px); + } +} +.fadeOutRightBig { + -webkit-animation-name: fadeOutRightBig; + animation-name: fadeOutRightBig; +} +@-webkit-keyframes fadeOutUp { + 0% { + opacity: 1; + -webkit-transform: translateY(0); + transform: translateY(0); + } + 100% { + opacity: 0; + -webkit-transform: translateY(-20px); + transform: translateY(-20px); + } +} +@keyframes fadeOutUp { + 0% { + opacity: 1; + -webkit-transform: translateY(0); + -ms-transform: translateY(0); + transform: translateY(0); + } + 100% { + opacity: 0; + -webkit-transform: translateY(-20px); + -ms-transform: translateY(-20px); + transform: translateY(-20px); + } +} +.fadeOutUp { + -webkit-animation-name: fadeOutUp; + animation-name: fadeOutUp; +} +@-webkit-keyframes fadeOutUpBig { + 0% { + opacity: 1; + -webkit-transform: translateY(0); + transform: translateY(0); + } + 100% { + opacity: 0; + -webkit-transform: translateY(-2000px); + transform: translateY(-2000px); + } +} +@keyframes fadeOutUpBig { + 0% { + opacity: 1; + -webkit-transform: translateY(0); + -ms-transform: translateY(0); + transform: translateY(0); + } + 100% { + opacity: 0; + -webkit-transform: translateY(-2000px); + -ms-transform: translateY(-2000px); + transform: translateY(-2000px); + } +} +.fadeOutUpBig { + -webkit-animation-name: fadeOutUpBig; + animation-name: fadeOutUpBig; +} +@-webkit-keyframes flip { + 0% { + -webkit-transform: perspective(400px) translateZ(0) rotateY(0) scale(1); + transform: perspective(400px) translateZ(0) rotateY(0) scale(1); + -webkit-animation-timing-function: ease-out; + animation-timing-function: ease-out; + } + 40% { + -webkit-transform: perspective(400px) translateZ(150px) rotateY(170deg) scale(1); + transform: perspective(400px) translateZ(150px) rotateY(170deg) scale(1); + -webkit-animation-timing-function: ease-out; + animation-timing-function: ease-out; + } + 50% { + -webkit-transform: perspective(400px) translateZ(150px) rotateY(190deg) scale(1); + transform: perspective(400px) translateZ(150px) rotateY(190deg) scale(1); + -webkit-animation-timing-function: ease-in; + animation-timing-function: ease-in; + } + 80% { + -webkit-transform: perspective(400px) translateZ(0) rotateY(360deg) scale(0.95); + transform: perspective(400px) translateZ(0) rotateY(360deg) scale(0.95); + -webkit-animation-timing-function: ease-in; + animation-timing-function: ease-in; + } + 100% { + -webkit-transform: perspective(400px) translateZ(0) rotateY(360deg) scale(1); + transform: perspective(400px) translateZ(0) rotateY(360deg) scale(1); + -webkit-animation-timing-function: ease-in; + animation-timing-function: ease-in; + } +} +@keyframes flip { + 0% { + -webkit-transform: perspective(400px) translateZ(0) rotateY(0) scale(1); + -ms-transform: perspective(400px) translateZ(0) rotateY(0) scale(1); + transform: perspective(400px) translateZ(0) rotateY(0) scale(1); + -webkit-animation-timing-function: ease-out; + animation-timing-function: ease-out; + } + 40% { + -webkit-transform: perspective(400px) translateZ(150px) rotateY(170deg) scale(1); + -ms-transform: perspective(400px) translateZ(150px) rotateY(170deg) scale(1); + transform: perspective(400px) translateZ(150px) rotateY(170deg) scale(1); + -webkit-animation-timing-function: ease-out; + animation-timing-function: ease-out; + } + 50% { + -webkit-transform: perspective(400px) translateZ(150px) rotateY(190deg) scale(1); + -ms-transform: perspective(400px) translateZ(150px) rotateY(190deg) scale(1); + transform: perspective(400px) translateZ(150px) rotateY(190deg) scale(1); + -webkit-animation-timing-function: ease-in; + animation-timing-function: ease-in; + } + 80% { + -webkit-transform: perspective(400px) translateZ(0) rotateY(360deg) scale(0.95); + -ms-transform: perspective(400px) translateZ(0) rotateY(360deg) scale(0.95); + transform: perspective(400px) translateZ(0) rotateY(360deg) scale(0.95); + -webkit-animation-timing-function: ease-in; + animation-timing-function: ease-in; + } + 100% { + -webkit-transform: perspective(400px) translateZ(0) rotateY(360deg) scale(1); + -ms-transform: perspective(400px) translateZ(0) rotateY(360deg) scale(1); + transform: perspective(400px) translateZ(0) rotateY(360deg) scale(1); + -webkit-animation-timing-function: ease-in; + animation-timing-function: ease-in; + } +} +.animated.flip { + -webkit-backface-visibility: visible; + -ms-backface-visibility: visible; + backface-visibility: visible; + -webkit-animation-name: flip; + animation-name: flip; +} +@-webkit-keyframes flipInX { + 0% { + -webkit-transform: perspective(400px) rotateX(90deg); + transform: perspective(400px) rotateX(90deg); + opacity: 0; + } + 40% { + -webkit-transform: perspective(400px) rotateX(-10deg); + transform: perspective(400px) rotateX(-10deg); + } + 70% { + -webkit-transform: perspective(400px) rotateX(10deg); + transform: perspective(400px) rotateX(10deg); + } + 100% { + -webkit-transform: perspective(400px) rotateX(0deg); + transform: perspective(400px) rotateX(0deg); + opacity: 1; + } +} +@keyframes flipInX { + 0% { + -webkit-transform: perspective(400px) rotateX(90deg); + -ms-transform: perspective(400px) rotateX(90deg); + transform: perspective(400px) rotateX(90deg); + opacity: 0; + } + 40% { + -webkit-transform: perspective(400px) rotateX(-10deg); + -ms-transform: perspective(400px) rotateX(-10deg); + transform: perspective(400px) rotateX(-10deg); + } + 70% { + -webkit-transform: perspective(400px) rotateX(10deg); + -ms-transform: perspective(400px) rotateX(10deg); + transform: perspective(400px) rotateX(10deg); + } + 100% { + -webkit-transform: perspective(400px) rotateX(0deg); + -ms-transform: perspective(400px) rotateX(0deg); + transform: perspective(400px) rotateX(0deg); + opacity: 1; + } +} +.flipInX { + -webkit-backface-visibility: visible !important; + -ms-backface-visibility: visible !important; + backface-visibility: visible !important; + -webkit-animation-name: flipInX; + animation-name: flipInX; +} +@-webkit-keyframes flipInY { + 0% { + -webkit-transform: perspective(400px) rotateY(90deg); + transform: perspective(400px) rotateY(90deg); + opacity: 0; + } + 40% { + -webkit-transform: perspective(400px) rotateY(-10deg); + transform: perspective(400px) rotateY(-10deg); + } + 70% { + -webkit-transform: perspective(400px) rotateY(10deg); + transform: perspective(400px) rotateY(10deg); + } + 100% { + -webkit-transform: perspective(400px) rotateY(0deg); + transform: perspective(400px) rotateY(0deg); + opacity: 1; + } +} +@keyframes flipInY { + 0% { + -webkit-transform: perspective(400px) rotateY(90deg); + -ms-transform: perspective(400px) rotateY(90deg); + transform: perspective(400px) rotateY(90deg); + opacity: 0; + } + 40% { + -webkit-transform: perspective(400px) rotateY(-10deg); + -ms-transform: perspective(400px) rotateY(-10deg); + transform: perspective(400px) rotateY(-10deg); + } + 70% { + -webkit-transform: perspective(400px) rotateY(10deg); + -ms-transform: perspective(400px) rotateY(10deg); + transform: perspective(400px) rotateY(10deg); + } + 100% { + -webkit-transform: perspective(400px) rotateY(0deg); + -ms-transform: perspective(400px) rotateY(0deg); + transform: perspective(400px) rotateY(0deg); + opacity: 1; + } +} +.flipInY { + -webkit-backface-visibility: visible !important; + -ms-backface-visibility: visible !important; + backface-visibility: visible !important; + -webkit-animation-name: flipInY; + animation-name: flipInY; +} +@-webkit-keyframes flipOutX { + 0% { + -webkit-transform: perspective(400px) rotateX(0deg); + transform: perspective(400px) rotateX(0deg); + opacity: 1; + } + 100% { + -webkit-transform: perspective(400px) rotateX(90deg); + transform: perspective(400px) rotateX(90deg); + opacity: 0; + } +} +@keyframes flipOutX { + 0% { + -webkit-transform: perspective(400px) rotateX(0deg); + -ms-transform: perspective(400px) rotateX(0deg); + transform: perspective(400px) rotateX(0deg); + opacity: 1; + } + 100% { + -webkit-transform: perspective(400px) rotateX(90deg); + -ms-transform: perspective(400px) rotateX(90deg); + transform: perspective(400px) rotateX(90deg); + opacity: 0; + } +} +.flipOutX { + -webkit-animation-name: flipOutX; + animation-name: flipOutX; + -webkit-backface-visibility: visible !important; + -ms-backface-visibility: visible !important; + backface-visibility: visible !important; +} +@-webkit-keyframes flipOutY { + 0% { + -webkit-transform: perspective(400px) rotateY(0deg); + transform: perspective(400px) rotateY(0deg); + opacity: 1; + } + 100% { + -webkit-transform: perspective(400px) rotateY(90deg); + transform: perspective(400px) rotateY(90deg); + opacity: 0; + } +} +@keyframes flipOutY { + 0% { + -webkit-transform: perspective(400px) rotateY(0deg); + -ms-transform: perspective(400px) rotateY(0deg); + transform: perspective(400px) rotateY(0deg); + opacity: 1; + } + 100% { + -webkit-transform: perspective(400px) rotateY(90deg); + -ms-transform: perspective(400px) rotateY(90deg); + transform: perspective(400px) rotateY(90deg); + opacity: 0; + } +} +.flipOutY { + -webkit-backface-visibility: visible !important; + -ms-backface-visibility: visible !important; + backface-visibility: visible !important; + -webkit-animation-name: flipOutY; + animation-name: flipOutY; +} +@-webkit-keyframes lightSpeedIn { + 0% { + -webkit-transform: translateX(100%) skewX(-30deg); + transform: translateX(100%) skewX(-30deg); + opacity: 0; + } + 60% { + -webkit-transform: translateX(-20%) skewX(30deg); + transform: translateX(-20%) skewX(30deg); + opacity: 1; + } + 80% { + -webkit-transform: translateX(0%) skewX(-15deg); + transform: translateX(0%) skewX(-15deg); + opacity: 1; + } + 100% { + -webkit-transform: translateX(0%) skewX(0deg); + transform: translateX(0%) skewX(0deg); + opacity: 1; + } +} +@keyframes lightSpeedIn { + 0% { + -webkit-transform: translateX(100%) skewX(-30deg); + -ms-transform: translateX(100%) skewX(-30deg); + transform: translateX(100%) skewX(-30deg); + opacity: 0; + } + 60% { + -webkit-transform: translateX(-20%) skewX(30deg); + -ms-transform: translateX(-20%) skewX(30deg); + transform: translateX(-20%) skewX(30deg); + opacity: 1; + } + 80% { + -webkit-transform: translateX(0%) skewX(-15deg); + -ms-transform: translateX(0%) skewX(-15deg); + transform: translateX(0%) skewX(-15deg); + opacity: 1; + } + 100% { + -webkit-transform: translateX(0%) skewX(0deg); + -ms-transform: translateX(0%) skewX(0deg); + transform: translateX(0%) skewX(0deg); + opacity: 1; + } +} +.lightSpeedIn { + -webkit-animation-name: lightSpeedIn; + animation-name: lightSpeedIn; + -webkit-animation-timing-function: ease-out; + animation-timing-function: ease-out; +} +@-webkit-keyframes lightSpeedOut { + 0% { + -webkit-transform: translateX(0%) skewX(0deg); + transform: translateX(0%) skewX(0deg); + opacity: 1; + } + 100% { + -webkit-transform: translateX(100%) skewX(-30deg); + transform: translateX(100%) skewX(-30deg); + opacity: 0; + } +} +@keyframes lightSpeedOut { + 0% { + -webkit-transform: translateX(0%) skewX(0deg); + -ms-transform: translateX(0%) skewX(0deg); + transform: translateX(0%) skewX(0deg); + opacity: 1; + } + 100% { + -webkit-transform: translateX(100%) skewX(-30deg); + -ms-transform: translateX(100%) skewX(-30deg); + transform: translateX(100%) skewX(-30deg); + opacity: 0; + } +} +.lightSpeedOut { + -webkit-animation-name: lightSpeedOut; + animation-name: lightSpeedOut; + -webkit-animation-timing-function: ease-in; + animation-timing-function: ease-in; +} +@-webkit-keyframes rotateIn { + 0% { + -webkit-transform-origin: center center; + transform-origin: center center; + -webkit-transform: rotate(-200deg); + transform: rotate(-200deg); + opacity: 0; + } + 100% { + -webkit-transform-origin: center center; + transform-origin: center center; + -webkit-transform: rotate(0); + transform: rotate(0); + opacity: 1; + } +} +@keyframes rotateIn { + 0% { + -webkit-transform-origin: center center; + -ms-transform-origin: center center; + transform-origin: center center; + -webkit-transform: rotate(-200deg); + -ms-transform: rotate(-200deg); + transform: rotate(-200deg); + opacity: 0; + } + 100% { + -webkit-transform-origin: center center; + -ms-transform-origin: center center; + transform-origin: center center; + -webkit-transform: rotate(0); + -ms-transform: rotate(0); + transform: rotate(0); + opacity: 1; + } +} +.rotateIn { + -webkit-animation-name: rotateIn; + animation-name: rotateIn; +} +@-webkit-keyframes rotateInDownLeft { + 0% { + -webkit-transform-origin: left bottom; + transform-origin: left bottom; + -webkit-transform: rotate(-90deg); + transform: rotate(-90deg); + opacity: 0; + } + 100% { + -webkit-transform-origin: left bottom; + transform-origin: left bottom; + -webkit-transform: rotate(0); + transform: rotate(0); + opacity: 1; + } +} +@keyframes rotateInDownLeft { + 0% { + -webkit-transform-origin: left bottom; + -ms-transform-origin: left bottom; + transform-origin: left bottom; + -webkit-transform: rotate(-90deg); + -ms-transform: rotate(-90deg); + transform: rotate(-90deg); + opacity: 0; + } + 100% { + -webkit-transform-origin: left bottom; + -ms-transform-origin: left bottom; + transform-origin: left bottom; + -webkit-transform: rotate(0); + -ms-transform: rotate(0); + transform: rotate(0); + opacity: 1; + } +} +.rotateInDownLeft { + -webkit-animation-name: rotateInDownLeft; + animation-name: rotateInDownLeft; +} +@-webkit-keyframes rotateInDownRight { + 0% { + -webkit-transform-origin: right bottom; + transform-origin: right bottom; + -webkit-transform: rotate(90deg); + transform: rotate(90deg); + opacity: 0; + } + 100% { + -webkit-transform-origin: right bottom; + transform-origin: right bottom; + -webkit-transform: rotate(0); + transform: rotate(0); + opacity: 1; + } +} +@keyframes rotateInDownRight { + 0% { + -webkit-transform-origin: right bottom; + -ms-transform-origin: right bottom; + transform-origin: right bottom; + -webkit-transform: rotate(90deg); + -ms-transform: rotate(90deg); + transform: rotate(90deg); + opacity: 0; + } + 100% { + -webkit-transform-origin: right bottom; + -ms-transform-origin: right bottom; + transform-origin: right bottom; + -webkit-transform: rotate(0); + -ms-transform: rotate(0); + transform: rotate(0); + opacity: 1; + } +} +.rotateInDownRight { + -webkit-animation-name: rotateInDownRight; + animation-name: rotateInDownRight; +} +@-webkit-keyframes rotateInUpLeft { + 0% { + -webkit-transform-origin: left bottom; + transform-origin: left bottom; + -webkit-transform: rotate(90deg); + transform: rotate(90deg); + opacity: 0; + } + 100% { + -webkit-transform-origin: left bottom; + transform-origin: left bottom; + -webkit-transform: rotate(0); + transform: rotate(0); + opacity: 1; + } +} +@keyframes rotateInUpLeft { + 0% { + -webkit-transform-origin: left bottom; + -ms-transform-origin: left bottom; + transform-origin: left bottom; + -webkit-transform: rotate(90deg); + -ms-transform: rotate(90deg); + transform: rotate(90deg); + opacity: 0; + } + 100% { + -webkit-transform-origin: left bottom; + -ms-transform-origin: left bottom; + transform-origin: left bottom; + -webkit-transform: rotate(0); + -ms-transform: rotate(0); + transform: rotate(0); + opacity: 1; + } +} +.rotateInUpLeft { + -webkit-animation-name: rotateInUpLeft; + animation-name: rotateInUpLeft; +} +@-webkit-keyframes rotateInUpRight { + 0% { + -webkit-transform-origin: right bottom; + transform-origin: right bottom; + -webkit-transform: rotate(-90deg); + transform: rotate(-90deg); + opacity: 0; + } + 100% { + -webkit-transform-origin: right bottom; + transform-origin: right bottom; + -webkit-transform: rotate(0); + transform: rotate(0); + opacity: 1; + } +} +@keyframes rotateInUpRight { + 0% { + -webkit-transform-origin: right bottom; + -ms-transform-origin: right bottom; + transform-origin: right bottom; + -webkit-transform: rotate(-90deg); + -ms-transform: rotate(-90deg); + transform: rotate(-90deg); + opacity: 0; + } + 100% { + -webkit-transform-origin: right bottom; + -ms-transform-origin: right bottom; + transform-origin: right bottom; + -webkit-transform: rotate(0); + -ms-transform: rotate(0); + transform: rotate(0); + opacity: 1; + } +} +.rotateInUpRight { + -webkit-animation-name: rotateInUpRight; + animation-name: rotateInUpRight; +} +@-webkit-keyframes rotateOut { + 0% { + -webkit-transform-origin: center center; + transform-origin: center center; + -webkit-transform: rotate(0); + transform: rotate(0); + opacity: 1; + } + 100% { + -webkit-transform-origin: center center; + transform-origin: center center; + -webkit-transform: rotate(200deg); + transform: rotate(200deg); + opacity: 0; + } +} +@keyframes rotateOut { + 0% { + -webkit-transform-origin: center center; + -ms-transform-origin: center center; + transform-origin: center center; + -webkit-transform: rotate(0); + -ms-transform: rotate(0); + transform: rotate(0); + opacity: 1; + } + 100% { + -webkit-transform-origin: center center; + -ms-transform-origin: center center; + transform-origin: center center; + -webkit-transform: rotate(200deg); + -ms-transform: rotate(200deg); + transform: rotate(200deg); + opacity: 0; + } +} +.rotateOut { + -webkit-animation-name: rotateOut; + animation-name: rotateOut; +} +@-webkit-keyframes rotateOutDownLeft { + 0% { + -webkit-transform-origin: left bottom; + transform-origin: left bottom; + -webkit-transform: rotate(0); + transform: rotate(0); + opacity: 1; + } + 100% { + -webkit-transform-origin: left bottom; + transform-origin: left bottom; + -webkit-transform: rotate(90deg); + transform: rotate(90deg); + opacity: 0; + } +} +@keyframes rotateOutDownLeft { + 0% { + -webkit-transform-origin: left bottom; + -ms-transform-origin: left bottom; + transform-origin: left bottom; + -webkit-transform: rotate(0); + -ms-transform: rotate(0); + transform: rotate(0); + opacity: 1; + } + 100% { + -webkit-transform-origin: left bottom; + -ms-transform-origin: left bottom; + transform-origin: left bottom; + -webkit-transform: rotate(90deg); + -ms-transform: rotate(90deg); + transform: rotate(90deg); + opacity: 0; + } +} +.rotateOutDownLeft { + -webkit-animation-name: rotateOutDownLeft; + animation-name: rotateOutDownLeft; +} +@-webkit-keyframes rotateOutDownRight { + 0% { + -webkit-transform-origin: right bottom; + transform-origin: right bottom; + -webkit-transform: rotate(0); + transform: rotate(0); + opacity: 1; + } + 100% { + -webkit-transform-origin: right bottom; + transform-origin: right bottom; + -webkit-transform: rotate(-90deg); + transform: rotate(-90deg); + opacity: 0; + } +} +@keyframes rotateOutDownRight { + 0% { + -webkit-transform-origin: right bottom; + -ms-transform-origin: right bottom; + transform-origin: right bottom; + -webkit-transform: rotate(0); + -ms-transform: rotate(0); + transform: rotate(0); + opacity: 1; + } + 100% { + -webkit-transform-origin: right bottom; + -ms-transform-origin: right bottom; + transform-origin: right bottom; + -webkit-transform: rotate(-90deg); + -ms-transform: rotate(-90deg); + transform: rotate(-90deg); + opacity: 0; + } +} +.rotateOutDownRight { + -webkit-animation-name: rotateOutDownRight; + animation-name: rotateOutDownRight; +} +@-webkit-keyframes rotateOutUpLeft { + 0% { + -webkit-transform-origin: left bottom; + transform-origin: left bottom; + -webkit-transform: rotate(0); + transform: rotate(0); + opacity: 1; + } + 100% { + -transform-origin: left bottom; + -transform: rotate(-90deg); + opacity: 0; + } +} +@keyframes rotateOutUpLeft { + 0% { + -webkit-transform-origin: left bottom; + -ms-transform-origin: left bottom; + transform-origin: left bottom; + -webkit-transform: rotate(0); + -ms-transform: rotate(0); + transform: rotate(0); + opacity: 1; + } + 100% { + -transform-origin: left bottom; + -transform: rotate(-90deg); + opacity: 0; + } +} +.rotateOutUpLeft { + -webkit-animation-name: rotateOutUpLeft; + animation-name: rotateOutUpLeft; +} +@-webkit-keyframes rotateOutUpRight { + 0% { + -webkit-transform-origin: right bottom; + transform-origin: right bottom; + -webkit-transform: rotate(0); + transform: rotate(0); + opacity: 1; + } + 100% { + -webkit-transform-origin: right bottom; + transform-origin: right bottom; + -webkit-transform: rotate(90deg); + transform: rotate(90deg); + opacity: 0; + } +} +@keyframes rotateOutUpRight { + 0% { + -webkit-transform-origin: right bottom; + -ms-transform-origin: right bottom; + transform-origin: right bottom; + -webkit-transform: rotate(0); + -ms-transform: rotate(0); + transform: rotate(0); + opacity: 1; + } + 100% { + -webkit-transform-origin: right bottom; + -ms-transform-origin: right bottom; + transform-origin: right bottom; + -webkit-transform: rotate(90deg); + -ms-transform: rotate(90deg); + transform: rotate(90deg); + opacity: 0; + } +} +.rotateOutUpRight { + -webkit-animation-name: rotateOutUpRight; + animation-name: rotateOutUpRight; +} +@-webkit-keyframes slideInDown { + 0% { + opacity: 0; + -webkit-transform: translateY(-2000px); + transform: translateY(-2000px); + } + 100% { + -webkit-transform: translateY(0); + transform: translateY(0); + } +} +@keyframes slideInDown { + 0% { + opacity: 0; + -webkit-transform: translateY(-2000px); + -ms-transform: translateY(-2000px); + transform: translateY(-2000px); + } + 100% { + -webkit-transform: translateY(0); + -ms-transform: translateY(0); + transform: translateY(0); + } +} +.slideInDown { + -webkit-animation-name: slideInDown; + animation-name: slideInDown; +} +@-webkit-keyframes slideInLeft { + 0% { + opacity: 0; + -webkit-transform: translateX(-2000px); + transform: translateX(-2000px); + } + 100% { + -webkit-transform: translateX(0); + transform: translateX(0); + } +} +@keyframes slideInLeft { + 0% { + opacity: 0; + -webkit-transform: translateX(-2000px); + -ms-transform: translateX(-2000px); + transform: translateX(-2000px); + } + 100% { + -webkit-transform: translateX(0); + -ms-transform: translateX(0); + transform: translateX(0); + } +} +.slideInLeft { + -webkit-animation-name: slideInLeft; + animation-name: slideInLeft; +} +@-webkit-keyframes slideInRight { + 0% { + opacity: 0; + -webkit-transform: translateX(2000px); + transform: translateX(2000px); + } + 100% { + -webkit-transform: translateX(0); + transform: translateX(0); + } +} +@keyframes slideInRight { + 0% { + opacity: 0; + -webkit-transform: translateX(2000px); + -ms-transform: translateX(2000px); + transform: translateX(2000px); + } + 100% { + -webkit-transform: translateX(0); + -ms-transform: translateX(0); + transform: translateX(0); + } +} +.slideInRight { + -webkit-animation-name: slideInRight; + animation-name: slideInRight; +} +@-webkit-keyframes slideOutLeft { + 0% { + -webkit-transform: translateX(0); + transform: translateX(0); + } + 100% { + opacity: 0; + -webkit-transform: translateX(-2000px); + transform: translateX(-2000px); + } +} +@keyframes slideOutLeft { + 0% { + -webkit-transform: translateX(0); + -ms-transform: translateX(0); + transform: translateX(0); + } + 100% { + opacity: 0; + -webkit-transform: translateX(-2000px); + -ms-transform: translateX(-2000px); + transform: translateX(-2000px); + } +} +.slideOutLeft { + -webkit-animation-name: slideOutLeft; + animation-name: slideOutLeft; +} +@-webkit-keyframes slideOutRight { + 0% { + -webkit-transform: translateX(0); + transform: translateX(0); + } + 100% { + opacity: 0; + -webkit-transform: translateX(2000px); + transform: translateX(2000px); + } +} +@keyframes slideOutRight { + 0% { + -webkit-transform: translateX(0); + -ms-transform: translateX(0); + transform: translateX(0); + } + 100% { + opacity: 0; + -webkit-transform: translateX(2000px); + -ms-transform: translateX(2000px); + transform: translateX(2000px); + } +} +.slideOutRight { + -webkit-animation-name: slideOutRight; + animation-name: slideOutRight; +} +@-webkit-keyframes slideOutUp { + 0% { + -webkit-transform: translateY(0); + transform: translateY(0); + } + 100% { + opacity: 0; + -webkit-transform: translateY(-2000px); + transform: translateY(-2000px); + } +} +@keyframes slideOutUp { + 0% { + -webkit-transform: translateY(0); + -ms-transform: translateY(0); + transform: translateY(0); + } + 100% { + opacity: 0; + -webkit-transform: translateY(-2000px); + -ms-transform: translateY(-2000px); + transform: translateY(-2000px); + } +} +.slideOutUp { + -webkit-animation-name: slideOutUp; + animation-name: slideOutUp; +} +@-webkit-keyframes hinge { + 0% { + -webkit-transform: rotate(0); + transform: rotate(0); + -webkit-transform-origin: top left; + transform-origin: top left; + -webkit-animation-timing-function: ease-in-out; + animation-timing-function: ease-in-out; + } + 20%, + 60% { + -webkit-transform: rotate(80deg); + transform: rotate(80deg); + -webkit-transform-origin: top left; + transform-origin: top left; + -webkit-animation-timing-function: ease-in-out; + animation-timing-function: ease-in-out; + } + 40% { + -webkit-transform: rotate(60deg); + transform: rotate(60deg); + -webkit-transform-origin: top left; + transform-origin: top left; + -webkit-animation-timing-function: ease-in-out; + animation-timing-function: ease-in-out; + } + 80% { + -webkit-transform: rotate(60deg) translateY(0); + transform: rotate(60deg) translateY(0); + opacity: 1; + -webkit-transform-origin: top left; + transform-origin: top left; + -webkit-animation-timing-function: ease-in-out; + animation-timing-function: ease-in-out; + } + 100% { + -webkit-transform: translateY(700px); + transform: translateY(700px); + opacity: 0; + } +} +@keyframes hinge { + 0% { + -webkit-transform: rotate(0); + -ms-transform: rotate(0); + transform: rotate(0); + -webkit-transform-origin: top left; + -ms-transform-origin: top left; + transform-origin: top left; + -webkit-animation-timing-function: ease-in-out; + animation-timing-function: ease-in-out; + } + 20%, + 60% { + -webkit-transform: rotate(80deg); + -ms-transform: rotate(80deg); + transform: rotate(80deg); + -webkit-transform-origin: top left; + -ms-transform-origin: top left; + transform-origin: top left; + -webkit-animation-timing-function: ease-in-out; + animation-timing-function: ease-in-out; + } + 40% { + -webkit-transform: rotate(60deg); + -ms-transform: rotate(60deg); + transform: rotate(60deg); + -webkit-transform-origin: top left; + -ms-transform-origin: top left; + transform-origin: top left; + -webkit-animation-timing-function: ease-in-out; + animation-timing-function: ease-in-out; + } + 80% { + -webkit-transform: rotate(60deg) translateY(0); + -ms-transform: rotate(60deg) translateY(0); + transform: rotate(60deg) translateY(0); + opacity: 1; + -webkit-transform-origin: top left; + -ms-transform-origin: top left; + transform-origin: top left; + -webkit-animation-timing-function: ease-in-out; + animation-timing-function: ease-in-out; + } + 100% { + -webkit-transform: translateY(700px); + -ms-transform: translateY(700px); + transform: translateY(700px); + opacity: 0; + } +} +.hinge { + -webkit-animation-name: hinge; + animation-name: hinge; +} +/* originally authored by Nick Pettit - https://github.com/nickpettit/glide */ +@-webkit-keyframes rollIn { + 0% { + opacity: 0; + -webkit-transform: translateX(-100%) rotate(-120deg); + transform: translateX(-100%) rotate(-120deg); + } + 100% { + opacity: 1; + -webkit-transform: translateX(0px) rotate(0deg); + transform: translateX(0px) rotate(0deg); + } +} +@keyframes rollIn { + 0% { + opacity: 0; + -webkit-transform: translateX(-100%) rotate(-120deg); + -ms-transform: translateX(-100%) rotate(-120deg); + transform: translateX(-100%) rotate(-120deg); + } + 100% { + opacity: 1; + -webkit-transform: translateX(0px) rotate(0deg); + -ms-transform: translateX(0px) rotate(0deg); + transform: translateX(0px) rotate(0deg); + } +} +.rollIn { + -webkit-animation-name: rollIn; + animation-name: rollIn; +} +/* originally authored by Nick Pettit - https://github.com/nickpettit/glide */ +@-webkit-keyframes rollOut { + 0% { + opacity: 1; + -webkit-transform: translateX(0px) rotate(0deg); + transform: translateX(0px) rotate(0deg); + } + 100% { + opacity: 0; + -webkit-transform: translateX(100%) rotate(120deg); + transform: translateX(100%) rotate(120deg); + } +} +@keyframes rollOut { + 0% { + opacity: 1; + -webkit-transform: translateX(0px) rotate(0deg); + -ms-transform: translateX(0px) rotate(0deg); + transform: translateX(0px) rotate(0deg); + } + 100% { + opacity: 0; + -webkit-transform: translateX(100%) rotate(120deg); + -ms-transform: translateX(100%) rotate(120deg); + transform: translateX(100%) rotate(120deg); + } +} +.rollOut { + -webkit-animation-name: rollOut; + animation-name: rollOut; +} +.ink-navigation { + overflow: visible; +} +.ink-navigation ul { + list-style-type: none; + padding: 0; + margin: 0; +} +.ink-navigation ul li { + margin: 0; +} +.ink-navigation ul { + *height: 100%; +} +.ink-navigation ul.menu li { + *height: 100%; +} +.ink-navigation ul.menu li a { + -webkit-transition-property: background; + -moz-transition-property: background; + -o-transition-property: background; + -ms-transition-property: background; + transition-property: background; + -webkit-transition-duration: 140ms; + -moz-transition-duration: 140ms; + -o-transition-duration: 140ms; + -ms-transition-duration: 140ms; + transition-duration: 140ms; + -webkit-transition-timing-function: ease-in-out; + -moz-transition-timing-function: ease-in-out; + -o-transition-timing-function: ease-in-out; + -ms-transition-timing-function: ease-in-out; + transition-timing-function: ease-in-out; + -webkit-transition-delay: 0; + -moz-transition-delay: 0; + -o-transition-delay: 0; + -ms-transition-delay: 0; + transition-delay: 0; +} +.ink-navigation ul.menu li:hover ul.submenu { + display: block; +} +.ink-navigation ul.menu li ul.submenu { + display: none; + position: absolute; + z-index: 10; +} +.ink-navigation ul.menu li ul.submenu li { + overflow: hidden; +} +.ink-navigation ul.menu li ul.submenu li a { + padding: 0.5em 1em; + display: block; + float: none; +} +.ink-navigation ul.menu:after { + content: " "; + display: block; + height: 0; + clear: both; + visibility: hidden; + zoom: 1; +} +.ink-navigation ul.menu.horizontal li { + float: left; + position: relative; +} +.ink-navigation ul.menu.horizontal li a { + padding: 0.5em 1em; + display: block; + line-height: 1.7; +} +.ink-navigation ul.menu.horizontal li .control { + margin-top: .3em; +} +.ink-navigation ul.menu.horizontal li ul.submenu { + width: 8em; + top: 2.7em; + left: 0; + z-index: 50; +} +.ink-navigation ul.menu.horizontal li ul.submenu li { + float: none; +} +.ink-navigation ul.menu.vertical li { + line-height: 1.7; + position: relative; +} +.ink-navigation ul.menu.vertical li a { + padding: 0.5em 1em; + display: block; +} +.ink-navigation ul.menu.vertical li ul.submenu { + top: 0; + left: 100%; + min-width: 8em; +} +.ink-navigation ul.menu.vertical li ul.submenu li { + line-height: 1.7; + float: none; + position: static; +} +.ink-navigation ul.menu.vertical li ul.submenu.dropdown { + position: relative; + top: auto; + left: auto; +} +.ink-navigation .breadcrumbs li { + line-height: 2.7em; + display: inline; +} +.ink-navigation .breadcrumbs li a { + display: inline; + padding: 0; +} +.ink-navigation .breadcrumbs li a:hover { + background: transparent; +} +.ink-navigation .breadcrumbs li.active a { + cursor: default; + text-decoration: none; +} +.ink-navigation .breadcrumbs li:first-child a { + padding-left: 1.2em; +} +.ink-navigation .breadcrumbs li:after { + content: '/'; + display: inline; + margin: 0 0.7em; +} +.ink-navigation .breadcrumbs li:last-child:after { + content: ''; + display: none; +} +.ink-navigation ul.pagination li { + line-height: 1.7; + float: left; +} +.ink-navigation ul.pagination li a { + padding: 0.5em 1em; + display: block; + float: left; +} +.ink-navigation ul.pagination li:last-child a { + border: none; +} +.ink-navigation ul.pagination li.disabled a:hover { + cursor: default; + text-decoration: none; +} +.ink-navigation ul.pagination.dotted li a { + display: block; + height: 1em; + width: 1em; + margin-right: .6em; + padding: 0; + border-radius: 50%; + text-indent: -99999px; +} +.ink-navigation ul.pagination.dotted li:first-child a, +.ink-navigation ul.pagination.dotted li:last-child a { + height: auto; + width: auto; + background: none; +} +.ink-navigation ul.pagination.dotted li.previous a, +.ink-navigation ul.pagination.dotted li.next a { + display: none; +} +.ink-navigation ul.pagination.chevron li { + display: none; +} +.ink-navigation ul.pagination.chevron li a { + font-size: 0; +} +.ink-navigation ul.pagination.chevron li.next, +.ink-navigation ul.pagination.chevron li.previous { + display: block; +} +.ink-navigation ul.pagination.chevron li.next a, +.ink-navigation ul.pagination.chevron li.previous a { + display: block; + position: absolute; + top: 35%; + padding: 0 .5em; + margin: 0; + font-family: FontAwesome; + font-size: 4em; + -webkit-transition-property: all; + -moz-transition-property: all; + -o-transition-property: all; + -ms-transition-property: all; + transition-property: all; + -webkit-transition-duration: 140ms; + -moz-transition-duration: 140ms; + -o-transition-duration: 140ms; + -ms-transition-duration: 140ms; + transition-duration: 140ms; + -webkit-transition-timing-function: ease-in-out; + -moz-transition-timing-function: ease-in-out; + -o-transition-timing-function: ease-in-out; + -ms-transition-timing-function: ease-in-out; + transition-timing-function: ease-in-out; + -webkit-transition-delay: 0; + -moz-transition-delay: 0; + -o-transition-delay: 0; + -ms-transition-delay: 0; + transition-delay: 0; +} +.ink-navigation ul.pagination.chevron li.disabled a { + color: rgba(255, 255, 255, 0.6); + text-shadow: none; +} +.ink-navigation ul.pagination.chevron li.disabled a:hover, +.ink-navigation ul.pagination.chevron li.disabled a:focus { + color: rgba(255, 255, 255, 0.6); +} +.ink-navigation ul.pagination.chevron li.previous a { + left: 0; +} +.ink-navigation ul.pagination.chevron li.previous a:after { + content: "\f137"; +} +.ink-navigation ul.pagination.chevron li.next a { + right: 0; +} +.ink-navigation ul.pagination.chevron li.next a:after { + content: "\f138"; +} +.ink-navigation ul.pagination:after { + content: " "; + display: block; + height: 0; + clear: both; + visibility: hidden; + zoom: 1; +} +@media screen and (max-width: 650px) { + html body .ink-navigation .pagination li a { + display: none; + } + html body .ink-navigation .pagination li:first-child a, + html body .ink-navigation .pagination li:last-child a { + display: block; + } +} +.ink-navigation .pills li { + overflow: hidden; + display: block; + float: left; + margin: 0 .5em .5em 0; + line-height: 1.7; +} +.ink-navigation .pills li a { + display: block; + padding: 0.5em 1em; +} +.ink-navigation .pills li a:hover { + text-decoration: none; +} +.ink-navigation .pills li.active a, +.ink-navigation .pills li.disabled a { + cursor: default; +} +.ink-navigation .pills:after { + content: " "; + display: block; + height: 0; + clear: both; + visibility: hidden; + zoom: 1; +} +.ink-dropdown { + position: relative; + display: inline-block; +} +.ink-dropdown ul.dropdown-menu { + position: absolute; + background: #ffffff; + z-index: 30; + border: 1px solid #d9d9d9; + height: auto; + width: auto; + min-width: 10em; + border-radius: 5px; + -webkit-box-shadow: 0 0 1px 0 rgba(100, 100, 100, 0.3); + -moz-box-shadow: 0 0 1px 0 rgba(100, 100, 100, 0.3); + box-shadow: 0 0 1px 0 rgba(100, 100, 100, 0.3); + padding: 0.3em 0; + margin-left: 0px; + padding: 0.35em 0; + font-size: 0.85em; +} +.ink-dropdown ul.dropdown-menu li { + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; + border-top-right-radius: 0; + border-top-left-radius: 0; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; + width: auto; + height: auto; + min-height: auto; + display: list-item; + float: none; + margin: 0; + text-align: left; + text-transform: none; + padding: 0; + position: relative; + list-style-type: none; +} +.ink-dropdown ul.dropdown-menu li.separator-above { + padding-top: 0.35em; + margin-top: 0.35em; + border-top: 1px solid #d9d9d9; +} +.ink-dropdown ul.dropdown-menu li.separator-below { + padding-bottom: 0.35em; + margin-bottom: 0.35em; + border-bottom: 1px solid #d9d9d9; +} +.ink-dropdown ul.dropdown-menu li.heading { + font-weight: 700; + padding-bottom: 0.35em; + margin-bottom: 0.35em; + padding: 0.5em 0.8em; + color: #333333; +} +.ink-dropdown ul.dropdown-menu li a { + color: #444; + padding: 0.5em 0.8em; + display: block; + clear: both; +} +.ink-dropdown ul.dropdown-menu li a:hover { + background: #f2f2f2; + text-decoration: none; +} +.ink-dropdown ul.dropdown-menu li.active a { + background: #999999; + color: #ffffff; +} +.ink-dropdown ul.dropdown-menu li.disabled a { + color: #b3b3b3; +} +.ink-dropdown ul.dropdown-menu li.disabled a:hover { + background: transparent; + cursor: default; +} +.ink-dropdown ul.dropdown-menu li.submenu { + overflow: visible; +} +.ink-dropdown ul.dropdown-menu li.submenu > a { + white-space: nowrap; +} +.ink-dropdown ul.dropdown-menu li.submenu > a:after { + content: "\f0da"; + width: auto; + margin-left: 0.8em; + font-family: FontAwesome; + color: #b3b3b3; + clear: both; + text-align: right; +} +.ink-dropdown ul.dropdown-menu li.submenu:hover > a { + background: #f2f2f2; + text-decoration: none; +} +.ink-dropdown ul.dropdown-menu li.submenu:hover:hover > ul.dropdown-menu { + display: block; +} +.ink-dropdown ul.dropdown-menu li.submenu > ul.dropdown-menu { + font-size: inherit; + position: absolute; + top: -0.36em; + left: 100%; + display: none; +} +.ink-navigation ul.menu li.active a { + text-decoration: underline; +} +.ink-navigation ul.menu li.heading { + font-weight: 700; +} +.ink-navigation ul.menu li.disabled a { + color: #b3b3b3; + text-shadow: 0 1px 0 #ffffff; +} +.ink-navigation ul.menu li.disabled a:hover { + cursor: default; + background: none; + text-decoration: none; +} +.ink-navigation ul.menu li ul.submenu { + background: #ffffff; +} +.ink-navigation ul.menu li ul.submenu li a { + border-bottom: 1px solid rgba(0, 0, 0, 0.15); +} +.ink-navigation ul.menu li ul.submenu li a:hover { + background: #e6e6e6; +} +.ink-navigation ul.menu li ul.submenu li a:last-child a { + border: none; +} +.ink-navigation ul.menu li ul.submenu.dropdown li a { + border-bottom: 1px solid rgba(0, 0, 0, 0.15); +} +.ink-navigation ul.menu.vertical li a { + border-bottom: 1px solid rgba(0, 0, 0, 0.15); +} +.ink-navigation ul.menu.vertical li:last-child a { + border: none; +} +.ink-navigation ul.menu.vertical li .dropdown { + background: none; +} +.ink-navigation ul.menu.vertical li .dropdown li a { + border-bottom: 1px solid rgba(0, 0, 0, 0.15); +} +.ink-navigation ul.menu.vertical li .dropdown li a:hover { + background: none; +} +.ink-navigation ul.menu.vertical li:last-child .dropdown li:first-child a { + border-top: 1px solid rgba(0, 0, 0, 0.15); +} +.ink-navigation ul.menu.white { + background: #ffffff; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#f2f2f2'); + background: -moz-linear-gradient(top, #ffffff 0%, #f2f2f2 150%); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #ffffff), color-stop(150%, #f2f2f2)); + background: -webkit-linear-gradient(top, #ffffff 0%, #f2f2f2 150%); + background: -o-linear-gradient(top, #ffffff 0%, #f2f2f2 150%); + background: -ms-linear-gradient(top, #ffffff 0%, #f2f2f2 150%); + background: linear-gradient(to bottom, #ffffff 0%, #f2f2f2 150%); +} +.ink-navigation ul.menu.white li a { + color: #555555; + text-decoration: none; +} +.ink-navigation ul.menu.white li a:hover { + background: #d9d9d9; +} +.ink-navigation ul.menu.white li.active { + background: #d9d9d9; +} +.ink-navigation ul.menu.white li.disabled a { + color: #999999; + text-shadow: 0 1px 0 #ffffff; +} +.ink-navigation ul.menu.white li.disabled a:hover { + background: rgba(0, 0, 0, 0); +} +.ink-navigation ul.menu.white li ul.submenu li:hover { + background: rgba(0, 0, 0, 0.1); +} +.ink-navigation ul.menu.white li ul.submenu li a { + color: #555555; +} +.ink-navigation ul.menu.white li ul.submenu.dropdown { + background: #ffffff; +} +.ink-navigation ul.menu.white li ul.submenu.dropdown li a { + border-bottom: 1px solid rgba(0, 0, 0, 0.2); +} +.ink-navigation ul.menu.grey { + background: #e6e6e6; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#e6e6e6', endColorstr='#cccccc'); + background: -moz-linear-gradient(top, #e6e6e6 0%, #cccccc 150%); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #e6e6e6), color-stop(150%, #cccccc)); + background: -webkit-linear-gradient(top, #e6e6e6 0%, #cccccc 150%); + background: -o-linear-gradient(top, #e6e6e6 0%, #cccccc 150%); + background: -ms-linear-gradient(top, #e6e6e6 0%, #cccccc 150%); + background: linear-gradient(to bottom, #e6e6e6 0%, #cccccc 150%); +} +.ink-navigation ul.menu.grey li.active { + background: #b3b3b3; +} +.ink-navigation ul.menu.grey li.disabled a { + color: #999999; + text-shadow: 0 1px 0 #ffffff; +} +.ink-navigation ul.menu.grey li.disabled a:hover { + background: rgba(0, 0, 0, 0); +} +.ink-navigation ul.menu.grey li a { + color: #555555; + text-decoration: none; +} +.ink-navigation ul.menu.grey li a:hover { + background: #b3b3b3; +} +.ink-navigation ul.menu.grey li ul.submenu li:hover { + background: rgba(0, 0, 0, 0.1); +} +.ink-navigation ul.menu.grey li ul.submenu li a { + color: #555555; +} +.ink-navigation ul.menu.grey li ul.submenu.dropdown { + background: #ffffff; +} +.ink-navigation ul.menu.grey li ul.submenu.dropdown li a { + border-bottom: 1px solid rgba(0, 0, 0, 0.15); +} +.ink-navigation ul.menu.black { + background: #1a1a1a; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#1a1a1a', endColorstr='#0d0d0d'); + background: -moz-linear-gradient(top, #1a1a1a 0%, #0d0d0d 150%); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #1a1a1a), color-stop(150%, #0d0d0d)); + background: -webkit-linear-gradient(top, #1a1a1a 0%, #0d0d0d 150%); + background: -o-linear-gradient(top, #1a1a1a 0%, #0d0d0d 150%); + background: -ms-linear-gradient(top, #1a1a1a 0%, #0d0d0d 150%); + background: linear-gradient(to bottom, #1a1a1a 0%, #0d0d0d 150%); +} +.ink-navigation ul.menu.black li.active { + background: #333333; +} +.ink-navigation ul.menu.black li.disabled a { + color: #666666; + text-shadow: 0 -1px 0 #000000; +} +.ink-navigation ul.menu.black li.disabled a:hover { + background: rgba(0, 0, 0, 0); +} +.ink-navigation ul.menu.black li a { + color: #ffffff; + text-decoration: none; +} +.ink-navigation ul.menu.black li a:hover { + background: #333333; +} +.ink-navigation ul.menu.black li ul.submenu li:hover { + background: #e6e6e6; +} +.ink-navigation ul.menu.black li ul.submenu li a { + color: #555555; +} +.ink-navigation ul.menu.black li ul.submenu li a:hover { + background: #4d4d4d; + color: #ffffff; +} +.ink-navigation ul.menu.black li ul.submenu.dropdown { + background: #ffffff; +} +.ink-navigation ul.menu.black li ul.submenu.dropdown li a { + border-bottom: 1px solid rgba(0, 0, 0, 0.15); +} +.ink-navigation ul.menu.orange { + background: #f2990d; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#f2990d', endColorstr='#c27b0a'); + background: -moz-linear-gradient(top, #f2990d 0%, #c27b0a 150%); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #f2990d), color-stop(150%, #c27b0a)); + background: -webkit-linear-gradient(top, #f2990d 0%, #c27b0a 150%); + background: -o-linear-gradient(top, #f2990d 0%, #c27b0a 150%); + background: -ms-linear-gradient(top, #f2990d 0%, #c27b0a 150%); + background: linear-gradient(to bottom, #f2990d 0%, #c27b0a 150%); +} +.ink-navigation ul.menu.orange li.active { + background: #b36d00; +} +.ink-navigation ul.menu.orange li.disabled a { + color: #995e00; + text-shadow: 0 1px 0 #ffac29; +} +.ink-navigation ul.menu.orange li.disabled a:hover { + background: rgba(0, 0, 0, 0); +} +.ink-navigation ul.menu.orange li a { + color: #ffffff; + text-decoration: none; +} +.ink-navigation ul.menu.orange li a:hover { + background: #b36d00; +} +.ink-navigation ul.menu.orange li ul.submenu li:hover { + background: rgba(0, 0, 0, 0.1); +} +.ink-navigation ul.menu.orange li ul.submenu li a { + color: #555555; +} +.ink-navigation ul.menu.orange li ul.submenu li a:hover { + background: #da8a0b; + color: #ffffff; +} +.ink-navigation ul.menu.orange li ul.submenu.dropdown { + background: #ffffff; +} +.ink-navigation ul.menu.orange li ul.submenu.dropdown li a { + border-bottom: 1px solid rgba(0, 0, 0, 0.15); +} +.ink-navigation ul.menu.blue { + background: #1b75ce; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#1b75ce', endColorstr='#155ba1'); + background: -moz-linear-gradient(top, #1b75ce 0%, #155ba1 150%); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #1b75ce), color-stop(150%, #155ba1)); + background: -webkit-linear-gradient(top, #1b75ce 0%, #155ba1 150%); + background: -o-linear-gradient(top, #1b75ce 0%, #155ba1 150%); + background: -ms-linear-gradient(top, #1b75ce 0%, #155ba1 150%); + background: linear-gradient(to bottom, #1b75ce 0%, #155ba1 150%); +} +.ink-navigation ul.menu.blue li.active { + background: #0a4f92; +} +.ink-navigation ul.menu.blue li.disabled a { + color: #08427b; + text-shadow: 0 1px 0 #2289f0; +} +.ink-navigation ul.menu.blue li.disabled a:hover { + background: rgba(0, 0, 0, 0); +} +.ink-navigation ul.menu.blue li a { + color: #ffffff; + text-decoration: none; +} +.ink-navigation ul.menu.blue li a:hover { + background: #0a4f92; +} +.ink-navigation ul.menu.blue li ul.submenu li:hover { + background: rgba(0, 0, 0, 0.1); +} +.ink-navigation ul.menu.blue li ul.submenu li a { + color: #555555; +} +.ink-navigation ul.menu.blue li ul.submenu li a:hover { + background: #1868b8; + color: #ffffff; +} +.ink-navigation ul.menu.blue li ul.submenu.dropdown { + background: #ffffff; +} +.ink-navigation ul.menu.blue li ul.submenu.dropdown li a { + border-bottom: 1px solid rgba(0, 0, 0, 0.15); +} +.ink-navigation ul.menu.green { + background: #4c9220; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#4c9220', endColorstr='#366817'); + background: -moz-linear-gradient(top, #4c9220 0%, #366817 150%); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #4c9220), color-stop(150%, #366817)); + background: -webkit-linear-gradient(top, #4c9220 0%, #366817 150%); + background: -o-linear-gradient(top, #4c9220 0%, #366817 150%); + background: -ms-linear-gradient(top, #4c9220 0%, #366817 150%); + background: linear-gradient(to bottom, #4c9220 0%, #366817 150%); +} +.ink-navigation ul.menu.green li.active { + background: #2a580d; +} +.ink-navigation ul.menu.green li.disabled a { + color: #20420a; + text-shadow: 0 1px 0 #57b61b; +} +.ink-navigation ul.menu.green li.disabled a:hover { + background: rgba(0, 0, 0, 0); +} +.ink-navigation ul.menu.green li a { + color: #ffffff; + text-decoration: none; +} +.ink-navigation ul.menu.green li a:hover { + background: #2a580d; +} +.ink-navigation ul.menu.green li ul.submenu li:hover { + background: rgba(0, 0, 0, 0.1); +} +.ink-navigation ul.menu.green li ul.submenu li a { + color: #555555; +} +.ink-navigation ul.menu.green li ul.submenu li a:hover { + background: #417d1b; + color: #ffffff; +} +.ink-navigation ul.menu.green li ul.submenu.dropdown { + background: #ffffff; +} +.ink-navigation ul.menu.green li ul.submenu.dropdown li a { + border-bottom: 1px solid rgba(0, 0, 0, 0.15); +} +.ink-navigation ul.menu.red { + background: #be1c1c; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#be1c1c', endColorstr='#921515'); + background: -moz-linear-gradient(top, #be1c1c 0%, #921515 150%); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #be1c1c), color-stop(150%, #921515)); + background: -webkit-linear-gradient(top, #be1c1c 0%, #921515 150%); + background: -o-linear-gradient(top, #be1c1c 0%, #921515 150%); + background: -ms-linear-gradient(top, #be1c1c 0%, #921515 150%); + background: linear-gradient(to bottom, #be1c1c 0%, #921515 150%); +} +.ink-navigation ul.menu.red li.active { + background: #820b0b; +} +.ink-navigation ul.menu.red li.disabled a { + color: #530707; + text-shadow: 0 1px 0 #eb1717; +} +.ink-navigation ul.menu.red li.disabled a:hover { + background: rgba(0, 0, 0, 0); +} +.ink-navigation ul.menu.red li a { + color: #ffffff; + text-decoration: none; +} +.ink-navigation ul.menu.red li a:hover { + background: #820b0b; +} +.ink-navigation ul.menu.red li ul.submenu li:hover { + background: rgba(0, 0, 0, 0.1); +} +.ink-navigation ul.menu.red li ul.submenu li a { + color: #555555; +} +.ink-navigation ul.menu.red li ul.submenu li a:hover { + background: #a81919; + color: #ffffff; +} +.ink-navigation ul.menu.red li ul.submenu.dropdown { + background: #ffffff; +} +.ink-navigation ul.menu.red li ul.submenu.dropdown li a { + border-bottom: 1px solid rgba(0, 0, 0, 0.15); +} +.ink-navigation ul.menu.flat { + filter: none; +} +.ink-navigation ul.menu.flat.white { + background: #ffffff; +} +.ink-navigation ul.menu.flat.grey { + background: #d9d9d9; +} +.ink-navigation ul.menu.flat.black { + background: #000000; +} +.ink-navigation ul.menu.flat.orange { + background: #f2990d; +} +.ink-navigation ul.menu.flat.blue { + background: #1b75ce; +} +.ink-navigation ul.menu.flat.green { + background: #4c9220; +} +.ink-navigation ul.menu.flat.red { + background: #be1c1c; +} +.ink-navigation ul.menu.rounded.horizontal { + border-radius: 4px; +} +.ink-navigation ul.menu.rounded.horizontal li:first-child { + border-top-right-radius: 0; + border-bottom-right-radius: 0; + border-bottom-left-radius: 4px; + border-top-left-radius: 4px; +} +.ink-navigation ul.menu.rounded.horizontal li:first-child a { + border-top-right-radius: 0; + border-bottom-right-radius: 0; + border-bottom-left-radius: 4px; + border-top-left-radius: 4px; +} +.ink-navigation ul.menu.rounded.horizontal li ul.submenu { + border-top-right-radius: 0; + border-top-left-radius: 0; + border-bottom-right-radius: 4px; + border-bottom-left-radius: 4px; +} +.ink-navigation ul.menu.rounded.horizontal li ul.submenu li { + border-top-right-radius: 0; + border-top-left-radius: 0; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} +.ink-navigation ul.menu.rounded.horizontal li ul.submenu li:last-child { + border-top-right-radius: 0; + border-top-left-radius: 0; + border-bottom-right-radius: 4px; + border-bottom-left-radius: 4px; +} +.ink-navigation ul.menu.rounded.horizontal li ul.submenu li a { + border-top-right-radius: 0; + border-top-left-radius: 0; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} +.ink-navigation ul.menu.rounded.vertical { + border-radius: 4px; +} +.ink-navigation ul.menu.rounded.vertical li:first-child { + border-top-right-radius: 4px; + border-top-left-radius: 4px; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} +.ink-navigation ul.menu.rounded.vertical li:first-child a { + border-top-right-radius: 4px; + border-top-left-radius: 4px; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} +.ink-navigation ul.menu.rounded.vertical li:first-child .submenu.dropdown { + border-top-right-radius: 0; + border-top-left-radius: 0; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} +.ink-navigation ul.menu.rounded.vertical li:first-child .submenu.dropdown li a { + border-top-right-radius: 0; + border-top-left-radius: 0; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} +.ink-navigation ul.menu.rounded.vertical li:first-child .submenu.dropdown li:first-child, +.ink-navigation ul.menu.rounded.vertical li:first-child .submenu.dropdown li:last-child { + border-top-right-radius: 0; + border-top-left-radius: 0; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} +.ink-navigation ul.menu.rounded.vertical li:first-child .submenu.dropdown li:first-child a, +.ink-navigation ul.menu.rounded.vertical li:first-child .submenu.dropdown li:last-child a { + border-top-right-radius: 0; + border-top-left-radius: 0; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} +.ink-navigation ul.menu.rounded.vertical li:last-child { + border-top-right-radius: 0; + border-top-left-radius: 0; + border-bottom-right-radius: 4px; + border-bottom-left-radius: 4px; +} +.ink-navigation ul.menu.rounded.vertical li:last-child a { + border-top-right-radius: 0; + border-top-left-radius: 0; + border-bottom-right-radius: 4px; + border-bottom-left-radius: 4px; +} +.ink-navigation ul.menu.rounded.vertical li:last-child .submenu.dropdown { + border-top-right-radius: 0; + border-top-left-radius: 0; + border-bottom-right-radius: 4px; + border-bottom-left-radius: 4px; +} +.ink-navigation ul.menu.rounded.vertical li:last-child .submenu.dropdown li a { + border-top-right-radius: 0; + border-top-left-radius: 0; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} +.ink-navigation ul.menu.rounded.vertical li:last-child .submenu.dropdown li:first-child { + border-top-right-radius: 0; + border-top-left-radius: 0; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} +.ink-navigation ul.menu.rounded.vertical li:last-child .submenu.dropdown li:first-child a { + border-top-right-radius: 0; + border-top-left-radius: 0; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} +.ink-navigation ul.menu.rounded.vertical li:last-child .submenu.dropdown li:last-child { + border-top-right-radius: 0; + border-top-left-radius: 0; + border-bottom-right-radius: 4px; + border-bottom-left-radius: 4px; +} +.ink-navigation ul.menu.rounded.vertical li:last-child .submenu.dropdown li:last-child a { + border-top-right-radius: 0; + border-top-left-radius: 0; + border-bottom-right-radius: 4px; + border-bottom-left-radius: 4px; +} +.ink-navigation ul.menu.rounded.vertical li .submenu { + border-radius: 0 4px 4px 4px; +} +.ink-navigation ul.menu.rounded.vertical li .submenu.dropdown { + border-top-right-radius: 0; + border-top-left-radius: 0; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} +.ink-navigation ul.menu.rounded.vertical li .submenu.dropdown li { + border-top-right-radius: 0; + border-top-left-radius: 0; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} +.ink-navigation ul.menu.rounded.vertical li .submenu.dropdown li a { + border-top-right-radius: 0; + border-top-left-radius: 0; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} +.ink-navigation ul.menu.rounded.vertical li .submenu.dropdown li:first-child { + border-top-right-radius: 0; + border-top-left-radius: 0; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} +.ink-navigation ul.menu.rounded.vertical li .submenu.dropdown li:first-child a { + border-top-right-radius: 0; + border-top-left-radius: 0; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} +.ink-navigation ul.menu.rounded.vertical li .submenu.dropdown li:last-child { + border-top-right-radius: 0; + border-top-left-radius: 0; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} +.ink-navigation ul.menu.rounded.vertical li .submenu.dropdown li:last-child a { + border-top-right-radius: 0; + border-top-left-radius: 0; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} +.ink-navigation ul.menu.rounded.vertical li .submenu li a { + border-top-right-radius: 0; + border-top-left-radius: 0; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} +.ink-navigation ul.menu.rounded.vertical li .submenu li:first-child { + border-radius: 0 4px 0 0; +} +.ink-navigation ul.menu.rounded.vertical li .submenu li:first-child a { + border-radius: 0 4px 0 0; +} +.ink-navigation ul.menu.rounded.vertical li .submenu li:last-child { + border-top-right-radius: 0; + border-top-left-radius: 0; + border-bottom-right-radius: 4px; + border-bottom-left-radius: 4px; +} +.ink-navigation ul.menu.rounded.vertical li .submenu li:last-child a { + border-top-right-radius: 0; + border-top-left-radius: 0; + border-bottom-right-radius: 4px; + border-bottom-left-radius: 4px; +} +.ink-navigation ul.menu.shadowed { + -webkit-box-shadow: 0px 1px 2px 0 rgba(0, 0, 0, 0.3); + -moz-box-shadow: 0px 1px 2px 0 rgba(0, 0, 0, 0.3); + box-shadow: 0px 1px 2px 0 rgba(0, 0, 0, 0.3); +} +.ink-navigation ul.menu.shadowed li ul.submenu { + -webkit-box-shadow: 0px 1px 2px 0 rgba(0, 0, 0, 0.3); + -moz-box-shadow: 0px 1px 2px 0 rgba(0, 0, 0, 0.3); + box-shadow: 0px 1px 2px 0 rgba(0, 0, 0, 0.3); +} +.ink-navigation ul.menu.shadowed li ul.submenu.dropdown { + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; +} +.ink-navigation ul.breadcrumbs li.active a { + background: none; + color: #999999; +} +.ink-navigation ul.breadcrumbs li.active a:hover { + cursor: default; + text-decoration: none; +} +.ink-navigation ul.breadcrumbs li a:hover { + background: none; + text-decoration: underline; +} +.ink-navigation ul.breadcrumbs.white { + background: #ffffff; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#f2f2f2'); + background: -moz-linear-gradient(top, #ffffff 0%, #f2f2f2 150%); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #ffffff), color-stop(150%, #f2f2f2)); + background: -webkit-linear-gradient(top, #ffffff 0%, #f2f2f2 150%); + background: -o-linear-gradient(top, #ffffff 0%, #f2f2f2 150%); + background: -ms-linear-gradient(top, #ffffff 0%, #f2f2f2 150%); + background: linear-gradient(to bottom, #ffffff 0%, #f2f2f2 150%); +} +.ink-navigation ul.breadcrumbs.white li a { + color: #555555; +} +.ink-navigation ul.breadcrumbs.white li:after { + color: #555555; +} +.ink-navigation ul.breadcrumbs.white li.active a { + color: #999999; + text-shadow: 0 1px 0 #ffffff; +} +.ink-navigation ul.breadcrumbs.grey { + background: #e6e6e6; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#e6e6e6', endColorstr='#cccccc'); + background: -moz-linear-gradient(top, #e6e6e6 0%, #cccccc 150%); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #e6e6e6), color-stop(150%, #cccccc)); + background: -webkit-linear-gradient(top, #e6e6e6 0%, #cccccc 150%); + background: -o-linear-gradient(top, #e6e6e6 0%, #cccccc 150%); + background: -ms-linear-gradient(top, #e6e6e6 0%, #cccccc 150%); + background: linear-gradient(to bottom, #e6e6e6 0%, #cccccc 150%); +} +.ink-navigation ul.breadcrumbs.grey li a { + color: #555555; +} +.ink-navigation ul.breadcrumbs.grey li:after { + color: #555555; +} +.ink-navigation ul.breadcrumbs.grey li.active a { + color: #999999; + text-shadow: 0 1px 0 #ffffff; +} +.ink-navigation ul.breadcrumbs.black { + background: #1a1a1a; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#1a1a1a', endColorstr='#0d0d0d'); + background: -moz-linear-gradient(top, #1a1a1a 0%, #0d0d0d 150%); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #1a1a1a), color-stop(150%, #0d0d0d)); + background: -webkit-linear-gradient(top, #1a1a1a 0%, #0d0d0d 150%); + background: -o-linear-gradient(top, #1a1a1a 0%, #0d0d0d 150%); + background: -ms-linear-gradient(top, #1a1a1a 0%, #0d0d0d 150%); + background: linear-gradient(to bottom, #1a1a1a 0%, #0d0d0d 150%); +} +.ink-navigation ul.breadcrumbs.black li a { + color: #ffffff; +} +.ink-navigation ul.breadcrumbs.black li:after { + color: #ffffff; +} +.ink-navigation ul.breadcrumbs.black li.active a { + color: #666666; + text-shadow: 0 -1px 0 #000000; +} +.ink-navigation ul.breadcrumbs.orange { + background: #f2990d; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#f2990d', endColorstr='#c27b0a'); + background: -moz-linear-gradient(top, #f2990d 0%, #c27b0a 150%); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #f2990d), color-stop(150%, #c27b0a)); + background: -webkit-linear-gradient(top, #f2990d 0%, #c27b0a 150%); + background: -o-linear-gradient(top, #f2990d 0%, #c27b0a 150%); + background: -ms-linear-gradient(top, #f2990d 0%, #c27b0a 150%); + background: linear-gradient(to bottom, #f2990d 0%, #c27b0a 150%); +} +.ink-navigation ul.breadcrumbs.orange li a { + color: #ffffff; +} +.ink-navigation ul.breadcrumbs.orange li:after { + color: #ffffff; +} +.ink-navigation ul.breadcrumbs.orange li.active a { + color: #995e00; + text-shadow: 0 1px 0 #ffac29; +} +.ink-navigation ul.breadcrumbs.blue { + background: #1b75ce; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#1b75ce', endColorstr='#155ba1'); + background: -moz-linear-gradient(top, #1b75ce 0%, #155ba1 150%); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #1b75ce), color-stop(150%, #155ba1)); + background: -webkit-linear-gradient(top, #1b75ce 0%, #155ba1 150%); + background: -o-linear-gradient(top, #1b75ce 0%, #155ba1 150%); + background: -ms-linear-gradient(top, #1b75ce 0%, #155ba1 150%); + background: linear-gradient(to bottom, #1b75ce 0%, #155ba1 150%); +} +.ink-navigation ul.breadcrumbs.blue li a { + color: #ffffff; +} +.ink-navigation ul.breadcrumbs.blue li:after { + color: #ffffff; +} +.ink-navigation ul.breadcrumbs.blue li.active a { + color: #08427b; + text-shadow: 0 1px 0 #2289f0; +} +.ink-navigation ul.breadcrumbs.green { + background: #4c9220; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#4c9220', endColorstr='#366817'); + background: -moz-linear-gradient(top, #4c9220 0%, #366817 150%); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #4c9220), color-stop(150%, #366817)); + background: -webkit-linear-gradient(top, #4c9220 0%, #366817 150%); + background: -o-linear-gradient(top, #4c9220 0%, #366817 150%); + background: -ms-linear-gradient(top, #4c9220 0%, #366817 150%); + background: linear-gradient(to bottom, #4c9220 0%, #366817 150%); +} +.ink-navigation ul.breadcrumbs.green li a { + color: #ffffff; +} +.ink-navigation ul.breadcrumbs.green li:after { + color: #ffffff; +} +.ink-navigation ul.breadcrumbs.green li.active a { + color: #20420a; + text-shadow: 0 1px 0 #57b61b; +} +.ink-navigation ul.breadcrumbs.red { + background: #be1c1c; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#be1c1c', endColorstr='#921515'); + background: -moz-linear-gradient(top, #be1c1c 0%, #921515 150%); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #be1c1c), color-stop(150%, #921515)); + background: -webkit-linear-gradient(top, #be1c1c 0%, #921515 150%); + background: -o-linear-gradient(top, #be1c1c 0%, #921515 150%); + background: -ms-linear-gradient(top, #be1c1c 0%, #921515 150%); + background: linear-gradient(to bottom, #be1c1c 0%, #921515 150%); +} +.ink-navigation ul.breadcrumbs.red li a { + color: #ffffff; +} +.ink-navigation ul.breadcrumbs.red li:after { + color: #ffffff; +} +.ink-navigation ul.breadcrumbs.red li.active a { + color: #530707; + text-shadow: 0 1px 0 #eb1717; +} +.ink-navigation ul.breadcrumbs.flat { + background: #ffffff; + filter: none; +} +.ink-navigation ul.breadcrumbs.flat.grey { + background: #d9d9d9; +} +.ink-navigation ul.breadcrumbs.flat.black { + background: #000000; +} +.ink-navigation ul.breadcrumbs.flat.orange { + background: #f2990d; +} +.ink-navigation ul.breadcrumbs.flat.blue { + background: #1b75ce; +} +.ink-navigation ul.breadcrumbs.flat.green { + background: #4c9220; +} +.ink-navigation ul.breadcrumbs.flat.red { + background: #be1c1c; +} +.ink-navigation ul.breadcrumbs.rounded { + border-radius: 4px; +} +.ink-navigation ul.breadcrumbs.shadowed { + -webkit-box-shadow: 0px 1px 2px 0 rgba(0, 0, 0, 0.3); + -moz-box-shadow: 0px 1px 2px 0 rgba(0, 0, 0, 0.3); + box-shadow: 0px 1px 2px 0 rgba(0, 0, 0, 0.3); +} +.ink-navigation ul.pagination { + display: inline-block; +} +.ink-navigation ul.pagination.white li { + background: #ffffff; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#f2f2f2'); + background: -moz-linear-gradient(top, #ffffff 0%, #f2f2f2 150%); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #ffffff), color-stop(150%, #f2f2f2)); + background: -webkit-linear-gradient(top, #ffffff 0%, #f2f2f2 150%); + background: -o-linear-gradient(top, #ffffff 0%, #f2f2f2 150%); + background: -ms-linear-gradient(top, #ffffff 0%, #f2f2f2 150%); + background: linear-gradient(to bottom, #ffffff 0%, #f2f2f2 150%); +} +.ink-navigation ul.pagination.white li.active a { + background: #d9d9d9; +} +.ink-navigation ul.pagination.white li.disabled a { + color: #999999; + background: rgba(0, 0, 0, 0); + text-shadow: 0 1px 0 #ffffff; +} +.ink-navigation ul.pagination.white li a { + color: #555555; + text-decoration: none; +} +.ink-navigation ul.pagination.white li a:hover { + background: #d9d9d9; +} +.ink-navigation ul.pagination.grey li { + background: #e6e6e6; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#e6e6e6', endColorstr='#cccccc'); + background: -moz-linear-gradient(top, #e6e6e6 0%, #cccccc 150%); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #e6e6e6), color-stop(150%, #cccccc)); + background: -webkit-linear-gradient(top, #e6e6e6 0%, #cccccc 150%); + background: -o-linear-gradient(top, #e6e6e6 0%, #cccccc 150%); + background: -ms-linear-gradient(top, #e6e6e6 0%, #cccccc 150%); + background: linear-gradient(to bottom, #e6e6e6 0%, #cccccc 150%); +} +.ink-navigation ul.pagination.grey li.active a { + background: #b3b3b3; + color: #555555; +} +.ink-navigation ul.pagination.grey li.disabled a { + color: #999999; + background: rgba(0, 0, 0, 0); + text-shadow: 0 1px 0 #ffffff; +} +.ink-navigation ul.pagination.grey li a { + color: #555555; + text-decoration: none; +} +.ink-navigation ul.pagination.grey li a:hover { + background: #b3b3b3; +} +.ink-navigation ul.pagination.black li { + background: #1a1a1a; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#1a1a1a', endColorstr='#0d0d0d'); + background: -moz-linear-gradient(top, #1a1a1a 0%, #0d0d0d 150%); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #1a1a1a), color-stop(150%, #0d0d0d)); + background: -webkit-linear-gradient(top, #1a1a1a 0%, #0d0d0d 150%); + background: -o-linear-gradient(top, #1a1a1a 0%, #0d0d0d 150%); + background: -ms-linear-gradient(top, #1a1a1a 0%, #0d0d0d 150%); + background: linear-gradient(to bottom, #1a1a1a 0%, #0d0d0d 150%); +} +.ink-navigation ul.pagination.black li.active a { + background: #333333; +} +.ink-navigation ul.pagination.black li.disabled a { + color: #666666; + background: rgba(0, 0, 0, 0); + text-shadow: 0 -1px 0 #000000; +} +.ink-navigation ul.pagination.black li a { + color: #ffffff; + text-decoration: none; +} +.ink-navigation ul.pagination.black li a:hover { + background: #333333; +} +.ink-navigation ul.pagination.orange li { + background: #f2990d; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#f2990d', endColorstr='#c27b0a'); + background: -moz-linear-gradient(top, #f2990d 0%, #c27b0a 150%); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #f2990d), color-stop(150%, #c27b0a)); + background: -webkit-linear-gradient(top, #f2990d 0%, #c27b0a 150%); + background: -o-linear-gradient(top, #f2990d 0%, #c27b0a 150%); + background: -ms-linear-gradient(top, #f2990d 0%, #c27b0a 150%); + background: linear-gradient(to bottom, #f2990d 0%, #c27b0a 150%); +} +.ink-navigation ul.pagination.orange li.active a { + background: #b36d00; +} +.ink-navigation ul.pagination.orange li.disabled a { + color: #995e00; + background: rgba(0, 0, 0, 0); + text-shadow: 0 1px 0 #ffac29; +} +.ink-navigation ul.pagination.orange li a { + color: #ffffff; + text-decoration: none; +} +.ink-navigation ul.pagination.orange li a:hover { + background: #b36d00; +} +.ink-navigation ul.pagination.blue li { + background: #1b75ce; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#1b75ce', endColorstr='#155ba1'); + background: -moz-linear-gradient(top, #1b75ce 0%, #155ba1 150%); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #1b75ce), color-stop(150%, #155ba1)); + background: -webkit-linear-gradient(top, #1b75ce 0%, #155ba1 150%); + background: -o-linear-gradient(top, #1b75ce 0%, #155ba1 150%); + background: -ms-linear-gradient(top, #1b75ce 0%, #155ba1 150%); + background: linear-gradient(to bottom, #1b75ce 0%, #155ba1 150%); +} +.ink-navigation ul.pagination.blue li.active a { + background: #0a4f92; +} +.ink-navigation ul.pagination.blue li.disabled a { + color: #08427b; + background: rgba(0, 0, 0, 0); + text-shadow: 0 1px 0 #2289f0; +} +.ink-navigation ul.pagination.blue li a { + color: #ffffff; + text-decoration: none; +} +.ink-navigation ul.pagination.blue li a:hover { + background: #0a4f92; +} +.ink-navigation ul.pagination.green li { + background: #4c9220; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#4c9220', endColorstr='#366817'); + background: -moz-linear-gradient(top, #4c9220 0%, #366817 150%); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #4c9220), color-stop(150%, #366817)); + background: -webkit-linear-gradient(top, #4c9220 0%, #366817 150%); + background: -o-linear-gradient(top, #4c9220 0%, #366817 150%); + background: -ms-linear-gradient(top, #4c9220 0%, #366817 150%); + background: linear-gradient(to bottom, #4c9220 0%, #366817 150%); +} +.ink-navigation ul.pagination.green li.active a { + background: #2a580d; +} +.ink-navigation ul.pagination.green li.disabled a { + color: #20420a; + background: rgba(0, 0, 0, 0); + text-shadow: 0 1px 0 #57b61b; +} +.ink-navigation ul.pagination.green li a { + color: #ffffff; + text-decoration: none; +} +.ink-navigation ul.pagination.green li a:hover { + background: #2a580d; +} +.ink-navigation ul.pagination.red li { + background: #be1c1c; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#be1c1c', endColorstr='#921515'); + background: -moz-linear-gradient(top, #be1c1c 0%, #921515 150%); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #be1c1c), color-stop(150%, #921515)); + background: -webkit-linear-gradient(top, #be1c1c 0%, #921515 150%); + background: -o-linear-gradient(top, #be1c1c 0%, #921515 150%); + background: -ms-linear-gradient(top, #be1c1c 0%, #921515 150%); + background: linear-gradient(to bottom, #be1c1c 0%, #921515 150%); +} +.ink-navigation ul.pagination.red li.active a { + background: #820b0b; +} +.ink-navigation ul.pagination.red li.disabled a { + color: #530707; + background: rgba(0, 0, 0, 0); + text-shadow: 0 1px 0 #eb1717; +} +.ink-navigation ul.pagination.red li a { + color: #ffffff; + text-decoration: none; +} +.ink-navigation ul.pagination.red li a:hover { + background: #820b0b; +} +.ink-navigation ul.pagination.flat.white li { + background: #ffffff; + filter: none; +} +.ink-navigation ul.pagination.flat.grey li { + background: #d9d9d9; + filter: none; +} +.ink-navigation ul.pagination.flat.black li { + background: #000000; + filter: none; +} +.ink-navigation ul.pagination.flat.orange li { + background: #f2990d; + filter: none; +} +.ink-navigation ul.pagination.flat.blue li { + background: #1b75ce; + filter: none; +} +.ink-navigation ul.pagination.flat.green li { + background: #4c9220; + filter: none; +} +.ink-navigation ul.pagination.flat.red li { + background: #be1c1c; + filter: none; +} +.ink-navigation ul.pagination.rounded li:first-child, +.ink-navigation ul.pagination.rounded li:first-child a { + border-top-right-radius: 0; + border-bottom-right-radius: 0; + border-bottom-left-radius: 4px; + border-top-left-radius: 4px; +} +.ink-navigation ul.pagination.rounded li:last-child, +.ink-navigation ul.pagination.rounded li:last-child a { + border-top-right-radius: 4px; + border-bottom-right-radius: 4px; + border-bottom-left-radius: 0; + border-top-left-radius: 0; +} +.ink-navigation ul.pagination.shadowed li a { + -webkit-box-shadow: 0px 1px 2px 0 rgba(0, 0, 0, 0.3); + -moz-box-shadow: 0px 1px 2px 0 rgba(0, 0, 0, 0.3); + box-shadow: 0px 1px 2px 0 rgba(0, 0, 0, 0.3); +} +.ink-navigation ul.pagination li a { + text-decoration: none; +} +.ink-navigation ul.pagination li.active a { + text-decoration: underline; +} +.ink-navigation ul.pagination li.disabled a { + color: #b3b3b3; + text-shadow: 0 1px 0 #ffffff; +} +.ink-navigation ul.pagination li.disabled a:hover { + background: none; +} +.ink-navigation ul.pagination.dotted li { + background: none; + filter: none; +} +.ink-navigation ul.pagination.dotted li { + background: none; +} +.ink-navigation ul.pagination.dotted li a { + background: #999999; + filter: alpha(opacity=50); + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=50)"; + opacity: 0.5; +} +.ink-navigation ul.pagination.dotted li:hover a, +.ink-navigation ul.pagination.dotted li.active a { + filter: alpha(opacity=100); + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=100)"; + opacity: 1; +} +.ink-navigation ul.pagination.dotted.black li a { + background: #1a1a1a; +} +.ink-navigation ul.pagination.dotted.white li a { + background: #ffffff; +} +.ink-navigation ul.pagination.dotted.blue li a { + background: #1b75ce; +} +.ink-navigation ul.pagination.dotted.green li a { + background: #4c9220; +} +.ink-navigation ul.pagination.dotted.orange li a { + background: #f2990d; +} +.ink-navigation ul.pagination.dotted.red li a { + background: #be1c1c; +} +.ink-navigation ul.pagination.chevron li.next a, +.ink-navigation ul.pagination.chevron li.previous a { + color: #ffffff; + filter: alpha(opacity=60); + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=60)"; + opacity: 0.6; +} +.ink-navigation ul.pagination.chevron li.next a:hover, +.ink-navigation ul.pagination.chevron li.previous a:hover, +.ink-navigation ul.pagination.chevron li.next a:focus, +.ink-navigation ul.pagination.chevron li.previous a:focus, +.ink-navigation ul.pagination.chevron li.next a.active, +.ink-navigation ul.pagination.chevron li.previous a.active { + filter: alpha(opacity=80); + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=80)"; + opacity: 0.8; + text-decoration: none; + background: none; +} +.ink-navigation ul.pagination.chevron li.disabled a { + color: #ffffff; + filter: alpha(opacity=60); + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=60)"; + opacity: 0.6; + text-shadow: none; +} +.ink-navigation ul.pagination.chevron li.disabled a:hover, +.ink-navigation ul.pagination.chevron li.disabled a:focus { + color: #ffffff; + filter: alpha(opacity=60); + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=60)"; + opacity: 0.6; +} +.ink-navigation ul.pagination.chevron.black li.next a, +.ink-navigation ul.pagination.chevron.black li.previous a, +.ink-navigation ul.pagination.chevron.black li.disabled a { + color: #1a1a1a; +} +.ink-navigation ul.pagination.chevron.grey li.next a, +.ink-navigation ul.pagination.chevron.grey li.previous a, +.ink-navigation ul.pagination.chevron.grey li.disabled a { + color: #d9d9d9; +} +.ink-navigation ul.pagination.chevron.blue li.next a, +.ink-navigation ul.pagination.chevron.blue li.previous a, +.ink-navigation ul.pagination.chevron.blue li.disabled a { + color: #1b75ce; +} +.ink-navigation ul.pagination.chevron.green li.next a, +.ink-navigation ul.pagination.chevron.green li.previous a, +.ink-navigation ul.pagination.chevron.green li.disabled a { + color: #4c9220; +} +.ink-navigation ul.pagination.chevron.orange li.next a, +.ink-navigation ul.pagination.chevron.orange li.previous a, +.ink-navigation ul.pagination.chevron.orange li.disabled a { + color: #f2990d; +} +.ink-navigation ul.pagination.chevron.red li.next a, +.ink-navigation ul.pagination.chevron.red li.previous a, +.ink-navigation ul.pagination.chevron.red li.disabled a { + color: #be1c1c; +} +.ink-navigation ul.pills li { + background: #ffffff; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#f2f2f2'); + background: -moz-linear-gradient(top, #ffffff 0%, #f2f2f2 150%); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #ffffff), color-stop(150%, #f2f2f2)); + background: -webkit-linear-gradient(top, #ffffff 0%, #f2f2f2 150%); + background: -o-linear-gradient(top, #ffffff 0%, #f2f2f2 150%); + background: -ms-linear-gradient(top, #ffffff 0%, #f2f2f2 150%); + background: linear-gradient(to bottom, #ffffff 0%, #f2f2f2 150%); +} +.ink-navigation ul.pills li a { + color: #555555; + background: none; +} +.ink-navigation ul.pills li a:hover { + background: #d9d9d9; +} +.ink-navigation ul.pills li.active a { + background: #d9d9d9; +} +.ink-navigation ul.pills li.disabled a { + color: #999999; + background: rgba(0, 0, 0, 0); + text-shadow: 0 1px 0 #ffffff; +} +.ink-navigation ul.pills.grey li { + background: #e6e6e6; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#e6e6e6', endColorstr='#cccccc'); + background: -moz-linear-gradient(top, #e6e6e6 0%, #cccccc 150%); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #e6e6e6), color-stop(150%, #cccccc)); + background: -webkit-linear-gradient(top, #e6e6e6 0%, #cccccc 150%); + background: -o-linear-gradient(top, #e6e6e6 0%, #cccccc 150%); + background: -ms-linear-gradient(top, #e6e6e6 0%, #cccccc 150%); + background: linear-gradient(to bottom, #e6e6e6 0%, #cccccc 150%); +} +.ink-navigation ul.pills.grey li a { + color: #555555; +} +.ink-navigation ul.pills.grey li a:hover { + background: #b3b3b3; +} +.ink-navigation ul.pills.grey li.active a { + background: #b3b3b3; +} +.ink-navigation ul.pills.grey li.disabled a { + color: #999999; + background: rgba(0, 0, 0, 0); + text-shadow: 0 1px 0 #ffffff; +} +.ink-navigation ul.pills.black li { + background: #1a1a1a; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#1a1a1a', endColorstr='#0d0d0d'); + background: -moz-linear-gradient(top, #1a1a1a 0%, #0d0d0d 150%); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #1a1a1a), color-stop(150%, #0d0d0d)); + background: -webkit-linear-gradient(top, #1a1a1a 0%, #0d0d0d 150%); + background: -o-linear-gradient(top, #1a1a1a 0%, #0d0d0d 150%); + background: -ms-linear-gradient(top, #1a1a1a 0%, #0d0d0d 150%); + background: linear-gradient(to bottom, #1a1a1a 0%, #0d0d0d 150%); +} +.ink-navigation ul.pills.black li a { + color: #ffffff; +} +.ink-navigation ul.pills.black li a:hover { + background: #333333; +} +.ink-navigation ul.pills.black li.active a { + background: #333333; +} +.ink-navigation ul.pills.black li.disabled a { + color: #666666; + background: rgba(0, 0, 0, 0); + text-shadow: 0 -1px 0 #000000; +} +.ink-navigation ul.pills.orange li { + background: #f2990d; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#f2990d', endColorstr='#c27b0a'); + background: -moz-linear-gradient(top, #f2990d 0%, #c27b0a 150%); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #f2990d), color-stop(150%, #c27b0a)); + background: -webkit-linear-gradient(top, #f2990d 0%, #c27b0a 150%); + background: -o-linear-gradient(top, #f2990d 0%, #c27b0a 150%); + background: -ms-linear-gradient(top, #f2990d 0%, #c27b0a 150%); + background: linear-gradient(to bottom, #f2990d 0%, #c27b0a 150%); +} +.ink-navigation ul.pills.orange li a { + color: #ffffff; +} +.ink-navigation ul.pills.orange li a:hover { + background: #b36d00; +} +.ink-navigation ul.pills.orange li.active a { + background: #b36d00; +} +.ink-navigation ul.pills.orange li.disabled a { + color: #995e00; + background: rgba(0, 0, 0, 0); + text-shadow: 0 1px 0 #ffac29; +} +.ink-navigation ul.pills.blue li { + background: #1b75ce; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#1b75ce', endColorstr='#155ba1'); + background: -moz-linear-gradient(top, #1b75ce 0%, #155ba1 150%); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #1b75ce), color-stop(150%, #155ba1)); + background: -webkit-linear-gradient(top, #1b75ce 0%, #155ba1 150%); + background: -o-linear-gradient(top, #1b75ce 0%, #155ba1 150%); + background: -ms-linear-gradient(top, #1b75ce 0%, #155ba1 150%); + background: linear-gradient(to bottom, #1b75ce 0%, #155ba1 150%); +} +.ink-navigation ul.pills.blue li a { + color: #ffffff; +} +.ink-navigation ul.pills.blue li a:hover { + background: #0a4f92; +} +.ink-navigation ul.pills.blue li.active a { + background: #0a4f92; +} +.ink-navigation ul.pills.blue li.disabled a { + color: #08427b; + background: rgba(0, 0, 0, 0); + text-shadow: 0 1px 0 #2289f0; +} +.ink-navigation ul.pills.green li { + background: #4c9220; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#4c9220', endColorstr='#366817'); + background: -moz-linear-gradient(top, #4c9220 0%, #366817 150%); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #4c9220), color-stop(150%, #366817)); + background: -webkit-linear-gradient(top, #4c9220 0%, #366817 150%); + background: -o-linear-gradient(top, #4c9220 0%, #366817 150%); + background: -ms-linear-gradient(top, #4c9220 0%, #366817 150%); + background: linear-gradient(to bottom, #4c9220 0%, #366817 150%); +} +.ink-navigation ul.pills.green li a { + color: #ffffff; +} +.ink-navigation ul.pills.green li a:hover { + background: #2a580d; +} +.ink-navigation ul.pills.green li.active a { + background: #2a580d; +} +.ink-navigation ul.pills.green li.disabled a { + color: #20420a; + background: rgba(0, 0, 0, 0); + text-shadow: 0 1px 0 #57b61b; +} +.ink-navigation ul.pills.red li { + background: #be1c1c; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#be1c1c', endColorstr='#921515'); + background: -moz-linear-gradient(top, #be1c1c 0%, #921515 150%); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #be1c1c), color-stop(150%, #921515)); + background: -webkit-linear-gradient(top, #be1c1c 0%, #921515 150%); + background: -o-linear-gradient(top, #be1c1c 0%, #921515 150%); + background: -ms-linear-gradient(top, #be1c1c 0%, #921515 150%); + background: linear-gradient(to bottom, #be1c1c 0%, #921515 150%); +} +.ink-navigation ul.pills.red li a { + color: #ffffff; +} +.ink-navigation ul.pills.red li a:hover { + background: #820b0b; +} +.ink-navigation ul.pills.red li.active a { + background: #820b0b; +} +.ink-navigation ul.pills.red li.disabled a { + color: #530707; + background: rgba(0, 0, 0, 0); + text-shadow: 0 1px 0 #eb1717; +} +.ink-navigation ul.pills.flat li { + background: #ffffff; +} +.ink-navigation ul.pills.flat.grey li { + background: #d9d9d9; + filter: none; +} +.ink-navigation ul.pills.flat.black li { + background: #000000; + filter: none; +} +.ink-navigation ul.pills.flat.orange li { + background: #f2990d; + filter: none; +} +.ink-navigation ul.pills.flat.blue li { + background: #1b75ce; + filter: none; +} +.ink-navigation ul.pills.flat.green li { + background: #4c9220; + filter: none; +} +.ink-navigation ul.pills.flat.red li { + background: #be1c1c; + filter: none; +} +.ink-navigation ul.pills.rounded li { + border-radius: 4px; +} +.ink-navigation ul.pills.rounded li a { + border-radius: 4px; +} +.ink-navigation ul.pills.shadowed li { + -webkit-box-shadow: 0px 1px 2px 0 rgba(0, 0, 0, 0.3); + -moz-box-shadow: 0px 1px 2px 0 rgba(0, 0, 0, 0.3); + box-shadow: 0px 1px 2px 0 rgba(0, 0, 0, 0.3); +} +.ink-dropdown.red ul.dropdown-menu li.active a { + background: #c91111; + color: #ffffff; +} +.ink-dropdown.orange ul.dropdown-menu li.active a { + background: #ff9c00; + color: #ffffff; +} +.ink-dropdown.green ul.dropdown-menu li.active a { + background: #4a9b17; + color: #ffffff; +} +.ink-dropdown.blue ul.dropdown-menu li.active a { + background: #0f75da; + color: #ffffff; +} +.ink-dropdown.black ul.dropdown-menu li.active a { + background: #000000; + color: #ffffff; +} +.ink-form fieldset { + border: none; + margin-bottom: 1.5em; + padding: 0; +} +.ink-form fieldset legend { + font-size: 1.438em; + font-weight: 700; + width: 100%; + border-bottom: 1px solid #ddd; +} +.ink-form fieldset legend + * { + -webkit-margin-top-collapse: separate; + margin: 2em 0; +} +.ink-form p.tip { + font-size: .875em; + color: #aeaeae; + position: relative; + margin: .3em 0 0 0.1em; +} +.ink-form p.label { + color: #555555; + padding: 0; + white-space: normal; +} +.ink-form select, +.ink-form textarea, +.ink-form input[type="text"], +.ink-form input[type="password"], +.ink-form input[type="datetime"], +.ink-form input[type="datetime-local"], +.ink-form input[type="date"], +.ink-form input[type="month"], +.ink-form input[type="time"], +.ink-form input[type="week"], +.ink-form input[type="number"], +.ink-form input[type="email"], +.ink-form input[type="url"], +.ink-form input[type="search"], +.ink-form input[type="tel"], +.ink-form input[type="color"] { + border-radius: 4px; + padding: 8px 6px; + border: 1px solid #c4c4c4; + resize: none; + font-size: 14px; + background: #ffffff; + vertical-align: middle; +} +.ink-form select:focus, +.ink-form textarea:focus, +.ink-form input[type="text"]:focus, +.ink-form input[type="password"]:focus, +.ink-form input[type="datetime"]:focus, +.ink-form input[type="datetime-local"]:focus, +.ink-form input[type="date"]:focus, +.ink-form input[type="month"]:focus, +.ink-form input[type="time"]:focus, +.ink-form input[type="week"]:focus, +.ink-form input[type="number"]:focus, +.ink-form input[type="email"]:focus, +.ink-form input[type="url"]:focus, +.ink-form input[type="search"]:focus, +.ink-form input[type="tel"]:focus, +.ink-form input[type="color"]:focus { + outline: none; + border-color: rgba(153, 153, 153, 0.8999999999999999); + -webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.1), 0 0 10px rgba(153, 153, 153, 0.6); + -moz-box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.1), 0 0 10px rgba(153, 153, 153, 0.6); + box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.1), 0 0 10px rgba(153, 153, 153, 0.6); + outline: 0 none; +} +.ink-form .input-file { + border-radius: 4px; + padding: 6px; + border: 1px solid #c4c4c4; + background: #ffffff; + vertical-align: middle; + line-height: 1.2; +} +.ink-form .input-file input[type="file"] { + border-top-right-radius: 0; + border-top-left-radius: 0; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; + border: none; + padding: 0; + background: none; + width: 100%; +} +.ink-form .ink-button { + margin: 0 5px; +} +.ink-form label { + cursor: pointer; +} +.ink-form select { + line-height: 2; + cursor: pointer; +} +.ink-form textarea { + min-height: 5em; +} +.ink-form .control-group { + line-height: 2; + margin-bottom: 1em; +} +.ink-form .control-group:after { + content: " "; + display: block; + height: 0; + clear: both; + visibility: hidden; + zoom: 1; +} +.ink-form .control-group .control { + position: relative; +} +.ink-form .control-group .control:after { + content: " "; + display: block; + height: 0; + clear: both; + visibility: hidden; + zoom: 1; +} +.ink-form .control-group .control > input, +.ink-form .control-group .control > select, +.ink-form .control-group .control > textarea { + width: 100%; +} +.ink-form .control-group .control > input + [class^="icon-"], +.ink-form .control-group .control > select + [class^="icon-"], +.ink-form .control-group .control > textarea + [class^="icon-"], +.ink-form .control-group .control > input + [class*=" icon-"], +.ink-form .control-group .control > select + [class*=" icon-"], +.ink-form .control-group .control > textarea + [class*=" icon-"] { + display: none; +} +.ink-form .control-group .control.append-button span, +.ink-form .control-group .control.append-symbol span, +.ink-form .control-group .control.prepend-button span, +.ink-form .control-group .control.prepend-symbol span { + width: 100%; + position: relative; +} +.ink-form .control-group .control.append-button span > input, +.ink-form .control-group .control.append-symbol span > input, +.ink-form .control-group .control.prepend-button span > input, +.ink-form .control-group .control.prepend-symbol span > input, +.ink-form .control-group .control.append-button span > select, +.ink-form .control-group .control.append-symbol span > select, +.ink-form .control-group .control.prepend-button span > select, +.ink-form .control-group .control.prepend-symbol span > select, +.ink-form .control-group .control.append-button span > textarea, +.ink-form .control-group .control.append-symbol span > textarea, +.ink-form .control-group .control.prepend-button span > textarea, +.ink-form .control-group .control.prepend-symbol span > textarea { + width: 100%; +} +.ink-form .control-group .control.append-button > input[type="submit"], +.ink-form .control-group .control.append-symbol > input[type="submit"], +.ink-form .control-group .control.prepend-button > input[type="submit"], +.ink-form .control-group .control.prepend-symbol > input[type="submit"], +.ink-form .control-group .control.append-button > input[type="button"], +.ink-form .control-group .control.append-symbol > input[type="button"], +.ink-form .control-group .control.prepend-button > input[type="button"], +.ink-form .control-group .control.prepend-symbol > input[type="button"], +.ink-form .control-group .control.append-button > input[type="reset"], +.ink-form .control-group .control.append-symbol > input[type="reset"], +.ink-form .control-group .control.prepend-button > input[type="reset"], +.ink-form .control-group .control.prepend-symbol > input[type="reset"] { + width: auto; +} +.ink-form .control-group .control.append-button { + display: table; +} +.ink-form .control-group .control.append-button span { + display: table-cell; +} +.ink-form .control-group .control.append-button span > input, +.ink-form .control-group .control.append-button span > select, +.ink-form .control-group .control.append-button span > textarea { + border-top-right-radius: 0; + border-bottom-right-radius: 0; + border-bottom-left-radius: 4px; + border-top-left-radius: 4px; +} +.ink-form .control-group .control.append-button .ink-button { + margin: 0; + border-top-right-radius: 4px; + border-bottom-right-radius: 4px; + border-bottom-left-radius: 0; + border-top-left-radius: 0; + border-left: none; +} +.ink-form .control-group .control.prepend-button { + display: table; +} +.ink-form .control-group .control.prepend-button span { + display: table-cell; +} +.ink-form .control-group .control.prepend-button span > input, +.ink-form .control-group .control.prepend-button span > select, +.ink-form .control-group .control.prepend-button span > textarea { + border-top-right-radius: 4px; + border-bottom-right-radius: 4px; + border-bottom-left-radius: 0; + border-top-left-radius: 0; +} +.ink-form .control-group .control.prepend-button .ink-button { + margin: 0; + border-top-right-radius: 0; + border-bottom-right-radius: 0; + border-bottom-left-radius: 4px; + border-top-left-radius: 4px; + border-right: none; +} +.ink-form .control-group .control.append-symbol span { + display: block; +} +.ink-form .control-group .control.append-symbol span > input, +.ink-form .control-group .control.append-symbol span > select, +.ink-form .control-group .control.append-symbol span > textarea { + padding-right: 2.5em; +} +.ink-form .control-group .control.append-symbol span > [class^="icon-"], +.ink-form .control-group .control.append-symbol span > [class*=" icon-"] { + position: absolute; + right: 1em; + top: .15em; + pointer-events: none; +} +.ink-form .control-group .control.prepend-symbol span { + display: block; +} +.ink-form .control-group .control.prepend-symbol span > input, +.ink-form .control-group .control.prepend-symbol span > select, +.ink-form .control-group .control.prepend-symbol span > textarea { + padding-left: 2.5em; +} +.ink-form .control-group .control.prepend-symbol span > [class^="icon-"], +.ink-form .control-group .control.prepend-symbol span > [class*=" icon-"] { + position: absolute; + left: 1em; + top: .15em; + pointer-events: none; +} +.ink-form .control-group input[type="radio"], +.ink-form .control-group input[type="checkbox"] { + line-height: 2; + padding: 0; + border: none; + margin-top: 0.55em; + clear: left; + float: left; + cursor: pointer; +} +.ink-form .control-group input[type="radio"] + label, +.ink-form .control-group input[type="checkbox"] + label { + float: left; + line-height: 2.5; + margin-left: 0.55em; + margin-top: -0.4em; +} +.ink-form .control-group .inline label { + margin-right: 1em; +} +.ink-form .control-group.validation.error input, +.ink-form .control-group.validation.error textarea, +.ink-form .control-group.validation.error select { + outline: none; + border-color: rgba(200, 10, 16, 0.8); + -webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.1), 0 0 10px rgba(200, 10, 16, 0.5); + -moz-box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.1), 0 0 10px rgba(200, 10, 16, 0.5); + box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.1), 0 0 10px rgba(200, 10, 16, 0.5); + border: 1px solid rgba(200, 10, 16, 0.5); +} +.ink-form .control-group.validation.error p.tip { + color: rgba(151, 8, 12, 0.5); +} +.ink-form .control-group.validation.warning input, +.ink-form .control-group.validation.warning textarea, +.ink-form .control-group.validation.warning select { + outline: none; + border-color: rgba(255, 156, 0, 0.8999999999999999); + -webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.1), 0 0 10px rgba(255, 156, 0, 0.6); + -moz-box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.1), 0 0 10px rgba(255, 156, 0, 0.6); + box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.1), 0 0 10px rgba(255, 156, 0, 0.6); + border: 1px solid rgba(255, 156, 0, 0.6); +} +.ink-form .control-group.validation.warning p.tip { + color: rgba(204, 125, 0, 0.6); +} +.ink-form .control-group.required label, +.ink-form .control-group.required p.label { + color: #555555; +} +.ink-form .control-group.required label:after, +.ink-form .control-group.required p.label:after { + content: "\f069"; + color: #c91111; + margin-left: .6em; + font-family: FontAwesome; + font-size: .75em; + width: 1.25em; +} +.ink-form .control-group.required ul.control label:after { + content: ""; +} +.status-indicator { + position: relative; + color: transparent; + display: block; + float: right; + width: 1.6em; + height: 1.6em; + line-height: 1.6em; + font-family: FontAwesome; + color: #ffffff; + margin: 0.4em 0em 0.4em 0.4em; + border-radius: 100%; +} +.status-indicator.error { + background: #c91111; +} +.status-indicator.error:after { + content: "\f00d"; + text-shadow: 0 -1px 0 #9a0d0d; +} +.status-indicator.error:before { + border-right: 10px solid #c91111; + border-top: 5px solid transparent; + border-bottom: 5px solid transparent; +} +.status-indicator.success { + background: #4a9b17; +} +.status-indicator.success:after { + content: "\f00c"; + text-shadow: 0 -1px 0 #3f8514; +} +.status-indicator.success:before { + border-right: 10px solid #4a9b17; + border-top: 5px solid transparent; + border-bottom: 5px solid transparent; +} +.status-indicator.success:after, +.status-indicator.error:after { + display: block; + width: 104%; + text-align: center; +} +.status-indicator.success:before, +.status-indicator.error:before { + content: ""; + width: 0; + height: 0; + position: absolute; + left: -6px; + top: 0.5em; +} +.ink-alert.basic, +.ink-alert.block { + font-size: .938em; + margin: 1em 0 ; + position: relative; + border-radius: 4px; +} +.ink-alert.basic { + padding: 1em; + background: #fbe8bc; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fbe8bc', endColorstr='#f7d88c'); + background: -moz-linear-gradient(top, #fbe8bc 0%, #f7d88c 100%); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #fbe8bc), color-stop(100%, #f7d88c)); + background: -webkit-linear-gradient(top, #fbe8bc 0%, #f7d88c 100%); + background: -o-linear-gradient(top, #fbe8bc 0%, #f7d88c 100%); + background: -ms-linear-gradient(top, #fbe8bc 0%, #f7d88c 100%); + background: linear-gradient(to bottom, #fbe8bc 0%, #f7d88c 100%); + -webkit-box-shadow: 0 1px 0 0 rgba(255, 255, 255, 0.3) inset; + -moz-box-shadow: 0 1px 0 0 rgba(255, 255, 255, 0.3) inset; + box-shadow: 0 1px 0 0 rgba(255, 255, 255, 0.3) inset; + -webkit-box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.3); + -moz-box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.3); + box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.3); +} +.ink-alert.basic.success { + background: #55b11a; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#55b11a', endColorstr='#4a9b17'); + background: -moz-linear-gradient(top, #55b11a 0%, #4a9b17 100%); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #55b11a), color-stop(100%, #4a9b17)); + background: -webkit-linear-gradient(top, #55b11a 0%, #4a9b17 100%); + background: -o-linear-gradient(top, #55b11a 0%, #4a9b17 100%); + background: -ms-linear-gradient(top, #55b11a 0%, #4a9b17 100%); + background: linear-gradient(to bottom, #55b11a 0%, #4a9b17 100%); + color: #ffffff; +} +.ink-alert.basic.error { + background: #ee3838; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ee3838', endColorstr='#c91111'); + background: -moz-linear-gradient(top, #ee3838 0%, #c91111 100%); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #ee3838), color-stop(100%, #c91111)); + background: -webkit-linear-gradient(top, #ee3838 0%, #c91111 100%); + background: -o-linear-gradient(top, #ee3838 0%, #c91111 100%); + background: -ms-linear-gradient(top, #ee3838 0%, #c91111 100%); + background: linear-gradient(to bottom, #ee3838 0%, #c91111 100%); + color: #ffffff; +} +.ink-alert.basic.info { + background: #2c8ef0; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#2c8ef0', endColorstr='#0f75da'); + background: -moz-linear-gradient(top, #2c8ef0 0%, #0f75da 100%); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #2c8ef0), color-stop(100%, #0f75da)); + background: -webkit-linear-gradient(top, #2c8ef0 0%, #0f75da 100%); + background: -o-linear-gradient(top, #2c8ef0 0%, #0f75da 100%); + background: -ms-linear-gradient(top, #2c8ef0 0%, #0f75da 100%); + background: linear-gradient(to bottom, #2c8ef0 0%, #0f75da 100%); + color: #ffffff; +} +.ink-alert.basic .ink-close { + top: .55em; + *top: .2em; +} +.ink-alert.block { + background: #fefbf3; + -webkit-box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.3); + -moz-box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.3); + box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.3); + font-size: 1em; +} +.ink-alert.block > h4 { + padding: 1em; + font-size: .938em; + line-height: 1.5; + color: #555555; + background: #fbe8bc; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fbe8bc', endColorstr='#f7d88c'); + background: -moz-linear-gradient(top, #fbe8bc 0%, #f7d88c 100%); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #fbe8bc), color-stop(100%, #f7d88c)); + background: -webkit-linear-gradient(top, #fbe8bc 0%, #f7d88c 100%); + background: -o-linear-gradient(top, #fbe8bc 0%, #f7d88c 100%); + background: -ms-linear-gradient(top, #fbe8bc 0%, #f7d88c 100%); + background: linear-gradient(to bottom, #fbe8bc 0%, #f7d88c 100%); + -webkit-box-shadow: 0 1px 0 0 rgba(255, 255, 255, 0.3) inset; + -moz-box-shadow: 0 1px 0 0 rgba(255, 255, 255, 0.3) inset; + box-shadow: 0 1px 0 0 rgba(255, 255, 255, 0.3) inset; + border-top-right-radius: 4px; + border-top-left-radius: 4px; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; + margin: 0; + border-bottom: 1px solid #f6d074; +} +.ink-alert.block.success > h4 { + background: #55b11a; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#55b11a', endColorstr='#4a9b17'); + background: -moz-linear-gradient(top, #55b11a 0%, #4a9b17 100%); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #55b11a), color-stop(100%, #4a9b17)); + background: -webkit-linear-gradient(top, #55b11a 0%, #4a9b17 100%); + background: -o-linear-gradient(top, #55b11a 0%, #4a9b17 100%); + background: -ms-linear-gradient(top, #55b11a 0%, #4a9b17 100%); + background: linear-gradient(to bottom, #55b11a 0%, #4a9b17 100%); + border-bottom: 1px solid #448e15; + color: #ffffff; +} +.ink-alert.block.error > h4 { + background: #ee3838; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ee3838', endColorstr='#c91111'); + background: -moz-linear-gradient(top, #ee3838 0%, #c91111 100%); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #ee3838), color-stop(100%, #c91111)); + background: -webkit-linear-gradient(top, #ee3838 0%, #c91111 100%); + background: -o-linear-gradient(top, #ee3838 0%, #c91111 100%); + background: -ms-linear-gradient(top, #ee3838 0%, #c91111 100%); + background: linear-gradient(to bottom, #ee3838 0%, #c91111 100%); + border-bottom: 1px solid #bb1010; + color: #ffffff; +} +.ink-alert.block.info > h4 { + background: #2c8ef0; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#2c8ef0', endColorstr='#0f75da'); + background: -moz-linear-gradient(top, #2c8ef0 0%, #0f75da 100%); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #2c8ef0), color-stop(100%, #0f75da)); + background: -webkit-linear-gradient(top, #2c8ef0 0%, #0f75da 100%); + background: -o-linear-gradient(top, #2c8ef0 0%, #0f75da 100%); + background: -ms-linear-gradient(top, #2c8ef0 0%, #0f75da 100%); + background: linear-gradient(to bottom, #2c8ef0 0%, #0f75da 100%); + border-bottom: 1px solid #0d68c2; + color: #ffffff; +} +.ink-alert.block p, +.ink-alert.block ul, +.ink-alert.block ol { + padding: 0 1em 1em; +} +.ink-alert.block ul { + list-style: inside ; +} +.ink-alert .ink-dismiss { + position: absolute; + color: #000000; + font-family: Arial, sans-serif; + font-weight: bold; + line-height: 0.56em; + font-size: 1.8em; + padding: 5px; + border: none; + background: none; + text-shadow: 0px 1px 0px #ffffff; + filter: alpha(opacity=20); + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=20)"; + opacity: 0.2; + top: .5em; + *top: .2em; + right: .4em; +} +.ink-badge { + border-radius: 0.8em; + padding: .2em .6em; + color: #ffffff; + font-size: .875em; + margin-left: .6em; +} +.ink-badge.orange { + background: #ff9c00; +} +.ink-badge.red { + background: #c91111; +} +.ink-badge.green { + background: #4a9b17; +} +.ink-badge.blue { + background: #0f75da; +} +.ink-badge.white { + background: #ffffff; + color: #555555; +} +.ink-badge.black { + background: #000000; +} +.ink-badge.grey { + background: #808080; +} +.ink-tooltip { + display: inline-block; + position: relative; +} +.ink-tooltip > .content { + background: #f0f0f0; + padding: 0.5em 0.6em; + border-radius: 4px; + font-size: 0.8em; + color: #8c8c8c; +} +.ink-tooltip > .arrow { + position: absolute; +} +.ink-tooltip > .arrow.up, +.ink-tooltip > .arrow.down, +.ink-tooltip > .arrow.left, +.ink-tooltip > .arrow.right { + width: 0; + height: 0; +} +.ink-tooltip > .arrow.up { + border-left: 0.4em solid transparent; + border-right: 0.4em solid transparent; + border-bottom: 0.4em solid #f0f0f0; + top: -0.4em; + left: 50%; + margin-left: -0.2em; +} +.ink-tooltip > .arrow.down { + border-left: 0.4em solid transparent; + border-right: 0.4em solid transparent; + border-top: 0.4em solid #f0f0f0; + bottom: -0.36363636363636365em; + left: 50%; + margin-left: -0.2em; +} +.ink-tooltip > .arrow.right { + border-top: 0.4em solid transparent; + border-bottom: 0.4em solid transparent; + border-left: 0.4em solid #f0f0f0; + top: 50%; + right: -0.36363636363636365em; + margin-top: -0.4em; +} +.ink-tooltip > .arrow.left { + border-top: 0.4em solid transparent; + border-bottom: 0.4em solid transparent; + border-right: 0.4em solid #f0f0f0; + top: 50%; + left: -0.36363636363636365em; + margin-top: -0.4em; +} +.ink-tooltip.blue > .content { + background: #0f75da; + color: #ffffff; +} +.ink-tooltip.blue > .arrow.up { + border-bottom-color: #0f75da; +} +.ink-tooltip.blue > .arrow.down { + border-top-color: #0f75da; +} +.ink-tooltip.blue > .arrow.left { + border-right-color: #0f75da; +} +.ink-tooltip.blue > .arrow.right { + border-left-color: #0f75da; +} +.ink-tooltip.red > .content { + background: #c91111; + color: #ffffff; +} +.ink-tooltip.red > .arrow.up { + border-bottom-color: #c91111; +} +.ink-tooltip.red > .arrow.down { + border-top-color: #c91111; +} +.ink-tooltip.red > .arrow.left { + border-right-color: #c91111; +} +.ink-tooltip.red > .arrow.right { + border-left-color: #c91111; +} +.ink-tooltip.orange > .content { + background: #ff9c00; + color: #ffffff; +} +.ink-tooltip.orange > .arrow.up { + border-bottom-color: #ff9c00; +} +.ink-tooltip.orange > .arrow.down { + border-top-color: #ff9c00; +} +.ink-tooltip.orange > .arrow.left { + border-right-color: #ff9c00; +} +.ink-tooltip.orange > .arrow.right { + border-left-color: #ff9c00; +} +.ink-tooltip.green > .content { + background: #4a9b17; + color: #ffffff; +} +.ink-tooltip.green > .arrow.up { + border-bottom-color: #4a9b17; +} +.ink-tooltip.green > .arrow.down { + border-top-color: #4a9b17; +} +.ink-tooltip.green > .arrow.left { + border-right-color: #4a9b17; +} +.ink-tooltip.green > .arrow.right { + border-left-color: #4a9b17; +} +.ink-tooltip.black > .content { + background: #000000; + color: #ffffff; +} +.ink-tooltip.black > .arrow.up { + border-bottom-color: #000000; +} +.ink-tooltip.black > .arrow.down { + border-top-color: #000000; +} +.ink-tooltip.black > .arrow.left { + border-right-color: #000000; +} +.ink-tooltip.black > .arrow.right { + border-left-color: #000000; +} +.ink-tooltip.grey > .content { + background: #cccccc; + color: #333333; +} +.ink-tooltip.grey > .arrow.up { + border-bottom-color: #cccccc; +} +.ink-tooltip.grey > .arrow.down { + border-top-color: #cccccc; +} +.ink-tooltip.grey > .arrow.left { + border-right-color: #cccccc; +} +.ink-tooltip.grey > .arrow.right { + border-left-color: #cccccc; +} +.ink-button { + -webkit-appearance: menuitem; + font-weight: bold; + font-size: 15px; + padding: 7px 12px; + border: 1px solid #ccc; + cursor: pointer; + margin: 5px; + text-decoration: none; + text-align: center; + display: inline-block; + vertical-align: middle; + white-space: nowrap; + border-radius: 4px; + color: #333333; + border-color: #c8c8c8; + border-bottom-color: #aeaeae; + text-shadow: 0 0.09em 0.03em #ffffff; + background: #eeeeee; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#eeeeee', endColorstr='#c8c8c8'); + background: -moz-linear-gradient(top, #eeeeee 0%, #c8c8c8 100%); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #eeeeee), color-stop(100%, #c8c8c8)); + background: -webkit-linear-gradient(top, #eeeeee 0%, #c8c8c8 100%); + background: -o-linear-gradient(top, #eeeeee 0%, #c8c8c8 100%); + background: -ms-linear-gradient(top, #eeeeee 0%, #c8c8c8 100%); + background: linear-gradient(to bottom, #eeeeee 0%, #c8c8c8 100%); + -webkit-box-shadow: 0 1px 0 rgba(255, 255, 255, 0.2) inset; + -moz-box-shadow: 0 1px 0 rgba(255, 255, 255, 0.2) inset; + box-shadow: 0 1px 0 rgba(255, 255, 255, 0.2) inset; +} +.ink-button:hover { + background: #ffffff; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#cacaca'); + background: -moz-linear-gradient(top, #ffffff 0%, #cacaca 100%); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #ffffff), color-stop(100%, #cacaca)); + background: -webkit-linear-gradient(top, #ffffff 0%, #cacaca 100%); + background: -o-linear-gradient(top, #ffffff 0%, #cacaca 100%); + background: -ms-linear-gradient(top, #ffffff 0%, #cacaca 100%); + background: linear-gradient(to bottom, #ffffff 0%, #cacaca 100%); + -webkit-box-shadow: '0 1px 5px rgba(0, 0, 0, 0.1), inset 0 1px 0 rgba(255, 255, 255, 0.2), inset 0 0em .5em rgba(255, 255, 255, 0.5)'; + -moz-box-shadow: '0 1px 5px rgba(0, 0, 0, 0.1), inset 0 1px 0 rgba(255, 255, 255, 0.2), inset 0 0em .5em rgba(255, 255, 255, 0.5)'; + box-shadow: '0 1px 5px rgba(0, 0, 0, 0.1), inset 0 1px 0 rgba(255, 255, 255, 0.2), inset 0 0em .5em rgba(255, 255, 255, 0.5)'; + color: #333333; + text-decoration: none; +} +.ink-button:active { + background: #dcdcdc; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#dcdcdc', endColorstr='#ffffff'); + background: -moz-linear-gradient(top, #dcdcdc 0%, #ffffff 100%); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #dcdcdc), color-stop(100%, #ffffff)); + background: -webkit-linear-gradient(top, #dcdcdc 0%, #ffffff 100%); + background: -o-linear-gradient(top, #dcdcdc 0%, #ffffff 100%); + background: -ms-linear-gradient(top, #dcdcdc 0%, #ffffff 100%); + background: linear-gradient(to bottom, #dcdcdc 0%, #ffffff 100%); + -webkit-box-shadow: 0 3px 5px 0 rgba(0, 0, 0, 0.25) inset; + -moz-box-shadow: 0 3px 5px 0 rgba(0, 0, 0, 0.25) inset; + box-shadow: 0 3px 5px 0 rgba(0, 0, 0, 0.25) inset; +} +.ink-button[disabled], +.ink-button.disabled { + background: #eeeeee; + box-shadow: none; + border: none; + filter: none; +} +.ink-button[disabled]:hover, +.ink-button.disabled:hover { + background: #eeeeee; + cursor: not-allowed; +} +.ink-button.orange { + color: #ffffff; + border-color: #b36d00; + border-bottom-color: #804e00; + text-shadow: 0 -0.09em 0.03em #804e00; + background: #ff9c00; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff9c00', endColorstr='#b36d00'); + background: -moz-linear-gradient(top, #ff9c00 0%, #b36d00 100%); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #ff9c00), color-stop(100%, #b36d00)); + background: -webkit-linear-gradient(top, #ff9c00 0%, #b36d00 100%); + background: -o-linear-gradient(top, #ff9c00 0%, #b36d00 100%); + background: -ms-linear-gradient(top, #ff9c00 0%, #b36d00 100%); + background: linear-gradient(to bottom, #ff9c00 0%, #b36d00 100%); + -webkit-box-shadow: 0 1px 0 rgba(255, 255, 255, 0.2) inset; + -moz-box-shadow: 0 1px 0 rgba(255, 255, 255, 0.2) inset; + box-shadow: 0 1px 0 rgba(255, 255, 255, 0.2) inset; +} +.ink-button.orange:hover { + background: #ffaa24; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffaa24', endColorstr='#b87000'); + background: -moz-linear-gradient(top, #ffaa24 0%, #b87000 100%); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #ffaa24), color-stop(100%, #b87000)); + background: -webkit-linear-gradient(top, #ffaa24 0%, #b87000 100%); + background: -o-linear-gradient(top, #ffaa24 0%, #b87000 100%); + background: -ms-linear-gradient(top, #ffaa24 0%, #b87000 100%); + background: linear-gradient(to bottom, #ffaa24 0%, #b87000 100%); + -webkit-box-shadow: '0 1px 5px rgba(0, 0, 0, 0.1), inset 0 1px 0 rgba(255, 255, 255, 0.2), inset 0 0em .5em rgba(255, 255, 255, 0.5)'; + -moz-box-shadow: '0 1px 5px rgba(0, 0, 0, 0.1), inset 0 1px 0 rgba(255, 255, 255, 0.2), inset 0 0em .5em rgba(255, 255, 255, 0.5)'; + box-shadow: '0 1px 5px rgba(0, 0, 0, 0.1), inset 0 1px 0 rgba(255, 255, 255, 0.2), inset 0 0em .5em rgba(255, 255, 255, 0.5)'; + color: #ffffff; + text-decoration: none; +} +.ink-button.orange:active { + background: #db8600; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#db8600', endColorstr='#ffaa24'); + background: -moz-linear-gradient(top, #db8600 0%, #ffaa24 100%); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #db8600), color-stop(100%, #ffaa24)); + background: -webkit-linear-gradient(top, #db8600 0%, #ffaa24 100%); + background: -o-linear-gradient(top, #db8600 0%, #ffaa24 100%); + background: -ms-linear-gradient(top, #db8600 0%, #ffaa24 100%); + background: linear-gradient(to bottom, #db8600 0%, #ffaa24 100%); + -webkit-box-shadow: 0 3px 5px 0 rgba(0, 0, 0, 0.25) inset; + -moz-box-shadow: 0 3px 5px 0 rgba(0, 0, 0, 0.25) inset; + box-shadow: 0 3px 5px 0 rgba(0, 0, 0, 0.25) inset; +} +.ink-button.orange.flat { + background: #e68c00; +} +.ink-button.orange.flat:hover { + background: #cc7d00; +} +.ink-button.orange[disabled], +.ink-button.orange.disabled { + background: #dfc69f; + box-shadow: none; + border: none; + text-shadow: none; + filter: none; +} +.ink-button.orange[disabled]:hover, +.ink-button.orange.disabled:hover { + background: #dfc69f; + cursor: not-allowed; +} +.ink-button.red { + color: #ffffff; + border-color: #820b0b; + border-bottom-color: #530707; + text-shadow: 0 -0.09em 0.03em #530707; + background: #c91111; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#c91111', endColorstr='#820b0b'); + background: -moz-linear-gradient(top, #c91111 0%, #820b0b 100%); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #c91111), color-stop(100%, #820b0b)); + background: -webkit-linear-gradient(top, #c91111 0%, #820b0b 100%); + background: -o-linear-gradient(top, #c91111 0%, #820b0b 100%); + background: -ms-linear-gradient(top, #c91111 0%, #820b0b 100%); + background: linear-gradient(to bottom, #c91111 0%, #820b0b 100%); + -webkit-box-shadow: 0 1px 0 rgba(255, 255, 255, 0.2) inset; + -moz-box-shadow: 0 1px 0 rgba(255, 255, 255, 0.2) inset; + box-shadow: 0 1px 0 rgba(255, 255, 255, 0.2) inset; +} +.ink-button.red:hover { + background: #ea1414; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ea1414', endColorstr='#870b0b'); + background: -moz-linear-gradient(top, #ea1414 0%, #870b0b 100%); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #ea1414), color-stop(100%, #870b0b)); + background: -webkit-linear-gradient(top, #ea1414 0%, #870b0b 100%); + background: -o-linear-gradient(top, #ea1414 0%, #870b0b 100%); + background: -ms-linear-gradient(top, #ea1414 0%, #870b0b 100%); + background: linear-gradient(to bottom, #ea1414 0%, #870b0b 100%); + -webkit-box-shadow: '0 1px 5px rgba(0, 0, 0, 0.1), inset 0 1px 0 rgba(255, 255, 255, 0.2), inset 0 0em .5em rgba(255, 255, 255, 0.5)'; + -moz-box-shadow: '0 1px 5px rgba(0, 0, 0, 0.1), inset 0 1px 0 rgba(255, 255, 255, 0.2), inset 0 0em .5em rgba(255, 255, 255, 0.5)'; + box-shadow: '0 1px 5px rgba(0, 0, 0, 0.1), inset 0 1px 0 rgba(255, 255, 255, 0.2), inset 0 0em .5em rgba(255, 255, 255, 0.5)'; + color: #ffffff; + text-decoration: none; +} +.ink-button.red:active { + background: #a80e0e; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#a80e0e', endColorstr='#ea1414'); + background: -moz-linear-gradient(top, #a80e0e 0%, #ea1414 100%); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #a80e0e), color-stop(100%, #ea1414)); + background: -webkit-linear-gradient(top, #a80e0e 0%, #ea1414 100%); + background: -o-linear-gradient(top, #a80e0e 0%, #ea1414 100%); + background: -ms-linear-gradient(top, #a80e0e 0%, #ea1414 100%); + background: linear-gradient(to bottom, #a80e0e 0%, #ea1414 100%); + -webkit-box-shadow: 0 3px 5px 0 rgba(0, 0, 0, 0.25) inset; + -moz-box-shadow: 0 3px 5px 0 rgba(0, 0, 0, 0.25) inset; + box-shadow: 0 3px 5px 0 rgba(0, 0, 0, 0.25) inset; +} +.ink-button.red.flat { + background: #b10f0f; +} +.ink-button.red.flat:hover { + background: #9a0d0d; +} +.ink-button.red[disabled], +.ink-button.red.disabled { + background: #c99090; + box-shadow: none; + border: none; + text-shadow: none; + filter: none; +} +.ink-button.red[disabled]:hover, +.ink-button.red.disabled:hover { + background: #c99090; + cursor: not-allowed; +} +.ink-button.green { + color: #ffffff; + border-color: #2a580d; + border-bottom-color: #152c07; + text-shadow: 0 -0.09em 0.03em #152c07; + background: #4a9b17; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#4a9b17', endColorstr='#2a580d'); + background: -moz-linear-gradient(top, #4a9b17 0%, #2a580d 100%); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #4a9b17), color-stop(100%, #2a580d)); + background: -webkit-linear-gradient(top, #4a9b17 0%, #2a580d 100%); + background: -o-linear-gradient(top, #4a9b17 0%, #2a580d 100%); + background: -ms-linear-gradient(top, #4a9b17 0%, #2a580d 100%); + background: linear-gradient(to bottom, #4a9b17 0%, #2a580d 100%); + -webkit-box-shadow: 0 1px 0 rgba(255, 255, 255, 0.2) inset; + -moz-box-shadow: 0 1px 0 rgba(255, 255, 255, 0.2) inset; + box-shadow: 0 1px 0 rgba(255, 255, 255, 0.2) inset; +} +.ink-button.green:hover { + background: #59ba1c; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#59ba1c', endColorstr='#2c5d0e'); + background: -moz-linear-gradient(top, #59ba1c 0%, #2c5d0e 100%); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #59ba1c), color-stop(100%, #2c5d0e)); + background: -webkit-linear-gradient(top, #59ba1c 0%, #2c5d0e 100%); + background: -o-linear-gradient(top, #59ba1c 0%, #2c5d0e 100%); + background: -ms-linear-gradient(top, #59ba1c 0%, #2c5d0e 100%); + background: linear-gradient(to bottom, #59ba1c 0%, #2c5d0e 100%); + -webkit-box-shadow: '0 1px 5px rgba(0, 0, 0, 0.1), inset 0 1px 0 rgba(255, 255, 255, 0.2), inset 0 0em .5em rgba(255, 255, 255, 0.5)'; + -moz-box-shadow: '0 1px 5px rgba(0, 0, 0, 0.1), inset 0 1px 0 rgba(255, 255, 255, 0.2), inset 0 0em .5em rgba(255, 255, 255, 0.5)'; + box-shadow: '0 1px 5px rgba(0, 0, 0, 0.1), inset 0 1px 0 rgba(255, 255, 255, 0.2), inset 0 0em .5em rgba(255, 255, 255, 0.5)'; + color: #ffffff; + text-decoration: none; +} +.ink-button.green:active { + background: #3b7c12; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#3b7c12', endColorstr='#59ba1c'); + background: -moz-linear-gradient(top, #3b7c12 0%, #59ba1c 100%); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #3b7c12), color-stop(100%, #59ba1c)); + background: -webkit-linear-gradient(top, #3b7c12 0%, #59ba1c 100%); + background: -o-linear-gradient(top, #3b7c12 0%, #59ba1c 100%); + background: -ms-linear-gradient(top, #3b7c12 0%, #59ba1c 100%); + background: linear-gradient(to bottom, #3b7c12 0%, #59ba1c 100%); + -webkit-box-shadow: 0 3px 5px 0 rgba(0, 0, 0, 0.25) inset; + -moz-box-shadow: 0 3px 5px 0 rgba(0, 0, 0, 0.25) inset; + box-shadow: 0 3px 5px 0 rgba(0, 0, 0, 0.25) inset; +} +.ink-button.green.flat { + background: #3f8514; +} +.ink-button.green.flat:hover { + background: #356f10; +} +.ink-button.green[disabled], +.ink-button.green.disabled { + background: #93b180; + box-shadow: none; + border: none; + text-shadow: none; + filter: none; +} +.ink-button.green[disabled]:hover, +.ink-button.green.disabled:hover { + background: #93b180; + cursor: not-allowed; +} +.ink-button.blue { + color: #ffffff; + border-color: #0a4f92; + border-bottom-color: #073563; + text-shadow: 0 -0.09em 0.03em #073563; + background: #0f75da; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#0f75da', endColorstr='#0a4f92'); + background: -moz-linear-gradient(top, #0f75da 0%, #0a4f92 100%); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #0f75da), color-stop(100%, #0a4f92)); + background: -webkit-linear-gradient(top, #0f75da 0%, #0a4f92 100%); + background: -o-linear-gradient(top, #0f75da 0%, #0a4f92 100%); + background: -ms-linear-gradient(top, #0f75da 0%, #0a4f92 100%); + background: linear-gradient(to bottom, #0f75da 0%, #0a4f92 100%); + -webkit-box-shadow: 0 1px 0 rgba(255, 255, 255, 0.2) inset; + -moz-box-shadow: 0 1px 0 rgba(255, 255, 255, 0.2) inset; + box-shadow: 0 1px 0 rgba(255, 255, 255, 0.2) inset; +} +.ink-button.blue:hover { + background: #1d87ef; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#1d87ef', endColorstr='#0a5197'); + background: -moz-linear-gradient(top, #1d87ef 0%, #0a5197 100%); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #1d87ef), color-stop(100%, #0a5197)); + background: -webkit-linear-gradient(top, #1d87ef 0%, #0a5197 100%); + background: -o-linear-gradient(top, #1d87ef 0%, #0a5197 100%); + background: -ms-linear-gradient(top, #1d87ef 0%, #0a5197 100%); + background: linear-gradient(to bottom, #1d87ef 0%, #0a5197 100%); + -webkit-box-shadow: '0 1px 5px rgba(0, 0, 0, 0.1), inset 0 1px 0 rgba(255, 255, 255, 0.2), inset 0 0em .5em rgba(255, 255, 255, 0.5)'; + -moz-box-shadow: '0 1px 5px rgba(0, 0, 0, 0.1), inset 0 1px 0 rgba(255, 255, 255, 0.2), inset 0 0em .5em rgba(255, 255, 255, 0.5)'; + box-shadow: '0 1px 5px rgba(0, 0, 0, 0.1), inset 0 1px 0 rgba(255, 255, 255, 0.2), inset 0 0em .5em rgba(255, 255, 255, 0.5)'; + color: #ffffff; + text-decoration: none; +} +.ink-button.blue:active { + background: #0d63b9; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#0d63b9', endColorstr='#1d87ef'); + background: -moz-linear-gradient(top, #0d63b9 0%, #1d87ef 100%); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #0d63b9), color-stop(100%, #1d87ef)); + background: -webkit-linear-gradient(top, #0d63b9 0%, #1d87ef 100%); + background: -o-linear-gradient(top, #0d63b9 0%, #1d87ef 100%); + background: -ms-linear-gradient(top, #0d63b9 0%, #1d87ef 100%); + background: linear-gradient(to bottom, #0d63b9 0%, #1d87ef 100%); + -webkit-box-shadow: 0 3px 5px 0 rgba(0, 0, 0, 0.25) inset; + -moz-box-shadow: 0 3px 5px 0 rgba(0, 0, 0, 0.25) inset; + box-shadow: 0 3px 5px 0 rgba(0, 0, 0, 0.25) inset; +} +.ink-button.blue.flat { + background: #0d68c2; +} +.ink-button.blue.flat:hover { + background: #0c5baa; +} +.ink-button.blue[disabled], +.ink-button.blue.disabled { + background: #98b4d0; + box-shadow: none; + border: none; + text-shadow: none; + filter: none; +} +.ink-button.blue[disabled]:hover, +.ink-button.blue.disabled:hover { + background: #98b4d0; + cursor: not-allowed; +} +.button-group > .ink-button { + float: left; + margin: 5px 0; + border-top-right-radius: 0; + border-top-left-radius: 0; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; + border-left: none; +} +.button-group > .ink-button:first-child { + border-bottom-left-radius: 4px; + border-top-left-radius: 4px; + border-left: 1px solid #ccc; +} +.button-group > .ink-button:last-child { + border-bottom-right-radius: 4px; + border-top-right-radius: 4px; +} +.button-group:after { + content: " "; + display: block; + height: 0; + clear: both; + visibility: hidden; + zoom: 1; +} +.button-toolbar > .button-group { + margin-right: 10px; + float: left; +} +.button-toolbar:after { + content: " "; + display: block; + height: 0; + clear: both; + visibility: hidden; + zoom: 1; +} +table.ink-table { + width: 100%; + border-collapse: collapse; + border-spacing: 0; + background: none; +} +table.ink-table tr th { + padding: 5px 10px; + border-bottom: #bbbbbb 1px solid; + background: none; + font-weight: 700; + line-height: 2; +} +table.ink-table tr th[data-sortable="true"]:hover { + cursor: pointer; + text-decoration: underline; +} +table.ink-table tr th[data-sortable="true"]:hover i { + text-decoration: none; +} +table.ink-table tr th[data-sortable="true"] i { + padding-left: 0.5em; +} +table.ink-table tr td { + padding: 5px 10px; + border-bottom: #bbbbbb 1px solid; + background: none; + line-height: 2; +} +table.ink-table.alternating tbody tr:nth-child(odd) { + background-color: #efefef; +} +table.ink-table.hover tbody tr:hover { + background: #fefbd6; + cursor: pointer; +} +table.ink-table.bordered { + border-collapse: separate; + border: #bbbbbb 1px solid; + border-radius: 4px; +} +table.ink-table.bordered tr th { + border-left: #bbbbbb 1px solid; +} +table.ink-table.bordered tr th:first-child { + border-left: none; +} +table.ink-table.bordered tr:last-child td { + border-bottom: none; +} +table.ink-table.bordered tr td { + border-left: #bbbbbb 1px solid; +} +table.ink-table.bordered tr td:first-child { + border-left: none; +} +.content-left, +.align-left { + text-align: left; +} +.content-center, +.align-center { + text-align: center; +} +.content-right, +.align-right { + text-align: right; +} +.show-all { + display: inherit !important; +} +.hide-all { + display: none !important; +} +.ink-grid { + width: auto; + max-width: 1200px; + margin: 0 auto; + padding: 0 2em; +} +.column-group { + clear: both; + zoom: 1; +} +.column-group:after { + content: " "; + display: block; + height: 0; + clear: both; + visibility: hidden; +} +.column-group.gutters, +.column-group.horizontal-gutters { + margin-left: -2em; +} +.column-group.half-gutters, +.column-group.half-horizontal-gutters { + margin-left: -1em; +} +.column-group.quarter-gutters, +.column-group.quarter-horizontal-gutters { + margin-left: -0.5em; +} +.column-group.double-gutters, +.column-group.double-horizontal-gutters { + margin-left: -4em; +} +.large-95 { + width: 95%; + float: left; + clear: none; +} +.large-90 { + width: 90%; + float: left; + clear: none; +} +.large-85 { + width: 85%; + float: left; + clear: none; +} +.large-80 { + width: 80%; + float: left; + clear: none; +} +.large-75 { + width: 75%; + float: left; + clear: none; +} +.large-70 { + width: 70%; + float: left; + clear: none; +} +.large-65 { + width: 65%; + float: left; + clear: none; +} +.large-60 { + width: 60%; + float: left; + clear: none; +} +.large-55 { + width: 55%; + float: left; + clear: none; +} +.large-50 { + width: 50%; + float: left; + clear: none; +} +.large-45 { + width: 45%; + float: left; + clear: none; +} +.large-40 { + width: 40%; + float: left; + clear: none; +} +.large-35 { + width: 35%; + float: left; + clear: none; +} +.large-30 { + width: 30%; + float: left; + clear: none; +} +.large-25 { + width: 25%; + float: left; + clear: none; +} +.large-20 { + width: 20%; + float: left; + clear: none; +} +.large-15 { + width: 15%; + float: left; + clear: none; +} +.large-10 { + width: 10%; + float: left; + clear: none; +} +.large-5 { + width: 5%; + float: left; + clear: none; +} +.large-33 { + width: 33.33%; + float: left; + clear: none; +} +.large-66 { + width: 66.66%; + float: left; + clear: none; +} +.large-100 { + width: 100%; + clear: both; + float: none; +} +[class*="large-"] { + margin-top: 0; + zoom: 1; +} +table[class*="large-"], +th[class*="large-"], +td[class*="large-"] { + float: none; +} +body.animated *[class*="large-"] { + -webkit-transition-property: width, font-size, line-height; + -moz-transition-property: width, font-size, line-height; + -o-transition-property: width, font-size, line-height; + -ms-transition-property: width, font-size, line-height; + transition-property: width, font-size, line-height; + -webkit-transition-duration: 125ms; + -moz-transition-duration: 125ms; + -o-transition-duration: 125ms; + -ms-transition-duration: 125ms; + transition-duration: 125ms; + -webkit-transition-timing-function: ease-in-out; + -moz-transition-timing-function: ease-in-out; + -o-transition-timing-function: ease-in-out; + -ms-transition-timing-function: ease-in-out; + transition-timing-function: ease-in-out; + -webkit-transition-delay: 0; + -moz-transition-delay: 0; + -o-transition-delay: 0; + -ms-transition-delay: 0; + transition-delay: 0; +} +.ink-grid .column-group.gutters > [class*="large-"] { + padding-left: 2em; + margin-bottom: 2em; +} +.ink-grid .column-group.half-gutters > [class*="large-"] { + padding-left: 1em; + margin-bottom: 1em; +} +.ink-grid .column-group.quarter-gutters > [class*="large-"] { + padding-left: 0.5em; + margin-bottom: 0.5em; +} +.ink-grid .column-group.double-gutters > [class*="large-"] { + padding-left: 4em; + margin-bottom: 4em; +} +.ink-grid .column-group.horizontal-gutters > [class*="large-"] { + padding-left: 2em; +} +.ink-grid .column-group.half-horizontal-gutters > [class*="large-"] { + padding-left: 1em; +} +.ink-grid .column-group.quarter-horizontal-gutters > [class*="large-"] { + padding-left: 0.5em; +} +.ink-grid .column-group.double-horizontal-gutters > [class*="large-"] { + padding-left: 4em; +} +.ink-grid .column-group.vertical-gutters > [class*="large-"] { + margin-bottom: 2em; +} +.ink-grid .column-group.half-vertical-gutters > [class*="large-"] { + margin-bottom: 1em; +} +.ink-grid .column-group.quarter-vertical-gutters > [class*="large-"] { + margin-bottom: 0.5em; +} +.ink-grid .column-group.double-vertical-gutters > [class*="large-"] { + margin-bottom: 4em; +} +.ink-grid .column-group.large-gutters > [class*="large-"] { + padding-left: 2em; + margin-bottom: 2em; +} +.ink-grid .column-group.large-half-gutters > [class*="large-"] { + padding-left: 1em; + margin-bottom: 1em; +} +.ink-grid .column-group.large-quarter-gutters > [class*="large-"] { + padding-left: 0.5em; + margin-bottom: 0.5em; +} +.ink-grid .column-group.large-double-gutters > [class*="large-"] { + padding-left: 4em; + margin-bottom: 4em; +} +.ink-grid .column-group.large-horizontal-gutters > [class*="large-"] { + padding-left: 2em; +} +.ink-grid .column-group.large-half-horizontal-gutters > [class*="large-"] { + padding-left: 1em; +} +.ink-grid .column-group.quarter-horizontal-gutters > [class*="large-"] { + padding-left: 0.5em; +} +.ink-grid .column-group.double-horizontal-gutters > [class*="large-"] { + padding-left: 4em; +} +.ink-grid .column-group.large-vertical-gutters > [class*="large-"] { + margin-bottom: 2em; +} +.ink-grid .column-group.large-half-vertical-gutters > [class*="large-"] { + margin-bottom: 1em; +} +.ink-grid .column-group.large-quarter-vertical-gutters > [class*="large-"] { + margin-bottom: 0.5em; +} +.ink-grid .column-group.large-double-vertical-gutters > [class*="large-"] { + margin-bottom: 4em; +} +[class*="large-"]:empty:after { + content: "\00a0"; +} +.large-push-left { + float: left; +} +.large-push-center { + float: none; + margin-left: auto; + margin-right: auto; +} +.large-push-right { + float: right; +} +.large-align-left { + text-align: left; +} +.large-align-center { + text-align: center; +} +.large-align-right { + text-align: right; +} +.space { + margin: 2em; +} +.half-space { + margin: 1em; +} +.quarter-space { + margin: 0.5em; +} +.double-space { + margin: 4em; +} +.large-space { + margin: 2em; +} +.large-half-space { + margin: 1em; +} +.large-quarter-space { + margin: 0.5em; +} +.large-double-space { + margin: 4em; +} +.vspace, +.vertical-space { + margin-top: 2em; + margin-bottom: 2em; +} +.half-vertical-space { + margin-top: 1em; + margin-bottom: 1em; +} +.quarter-vertical-space { + margin-top: 0.5em; + margin-bottom: 0.5em; +} +.double-vertical-space { + margin-top: 4em; + margin-bottom: 4em; +} +.hspace, +.horizontal-space { + margin-left: 2em; + margin-right: 2em; +} +.half-horizontal-space { + margin-left: 1em; + margin-right: 1em; +} +.quarter-horizontal-space { + margin-left: 0.5em; + margin-right: 0.5em; +} +.double-horizontal-space { + margin-left: 4em; + margin-right: 4em; +} +.large-vspace, +.large-vertical-space { + margin-top: 2em; + margin-bottom: 2em; +} +.large-half-vertical-space { + margin-top: 1em; + margin-bottom: 1em; +} +.large-quarter-vertical-space { + margin-top: 0.5em; + margin-bottom: 0.5em; +} +.large-double-vertical-space { + margin-top: 4em; + margin-bottom: 4em; +} +.large-hspace, +.large-horizontal-space { + margin-left: 2em; + margin-right: 2em; +} +.large-half-horizontal-space { + margin-left: 1em; + margin-right: 1em; +} +.large-quarter-horizontal-space { + margin-left: 0.5em; + margin-right: 0.5em; +} +.large-double-horizontal-space { + margin-left: 4em; + margin-right: 4em; +} +.top-space { + margin-top: 2em; +} +.top-space:first-child { + margin-top: 2em; +} +.half-top-space { + margin-top: 1em; +} +.half-top-space:first-child { + margin-top: 1em; +} +.quarter-top-space { + margin-top: 0.5em; +} +.quarter-top-space:first-child { + margin-top: 0.5em; +} +.double-top-space { + margin-top: 4em; +} +.double-top-space:first-child { + margin-top: 4em; +} +.large-top-space { + margin-top: 2em; +} +.large-half-top-space { + margin-top: 1em; +} +.large-quarter-top-space { + margin-top: 0.5em; +} +.large-double-top-space { + margin-top: 4em; +} +.right-space { + margin-right: 2em; +} +.half-right-space { + margin-right: 1em; +} +.quarter-right-space { + margin-right: 0.5em; +} +.double-right-space { + margin-right: 4em; +} +.large-right-space { + margin-right: 2em; +} +.large-half-right-space { + margin-right: 1em; +} +.large-quarter-right-space { + margin-right: 0.5em; +} +.large-double-right-space { + margin-right: 4em; +} +.bottom-space { + margin-bottom: 2em; +} +.half-bottom-space { + margin-bottom: 1em; +} +.quarter-bottom-space { + margin-bottom: 0.5em; +} +.double-bottom-space { + margin-bottom: 4em; +} +.large-bottom-space { + margin-bottom: 2em; +} +.large-half-bottom-space { + margin-bottom: 1em; +} +.large-quarter-bottom-space { + margin-bottom: 0.5em; +} +.large-double-bottom-space { + margin-bottom: 4em; +} +.left-space { + margin-left: 2em; +} +.half-left-space { + margin-left: 1em; +} +.quarter-left-space { + margin-left: 0.5em; +} +.double-left-space { + margin-left: 0.5em; +} +.large-left-space { + margin-left: 2em; +} +.large-half-left-space { + margin-left: 1em; +} +.large-quarter-left-space { + margin-left: 0.5em; +} +.large-double-left-space { + margin-left: 0.5em; +} +@media screen and (min-width: 960px) { + .hide-large { + display: none !important; + } + .show-large { + display: inherit !important; + } + table.show-large { + display: table !important; + } + thead.show-large { + display: table-header-group !important; + } + tbody.show-large { + display: table-row-group !important; + } + tfoot.show-large { + display: table-footer-group !important; + } + tr.show-large { + display: table-row !important; + } + th.show-large, + td.show-large { + display: table-cell !important; + } +} +@media screen and (min-width: 650px) and (max-width: 959px) { + .ink-grid { + width: auto; + max-width: 1200px; + margin: 0 auto; + padding: 0 1.5em; + } + .column-group { + clear: both; + zoom: 1; + } + .column-group:after { + content: " "; + display: block; + height: 0; + clear: both; + visibility: hidden; + } + .column-group.gutters, + .column-group.horizontal-gutters { + margin-left: -1.5em; + } + .column-group.half-gutters, + .column-group.half-horizontal-gutters { + margin-left: -0.75em; + } + .column-group.quarter-gutters, + .column-group.quarter-horizontal-gutters { + margin-left: -0.375em; + } + .column-group.double-gutters, + .column-group.double-horizontal-gutters { + margin-left: -3em; + } + .medium-95 { + width: 95%; + float: left; + clear: none; + } + .medium-90 { + width: 90%; + float: left; + clear: none; + } + .medium-85 { + width: 85%; + float: left; + clear: none; + } + .medium-80 { + width: 80%; + float: left; + clear: none; + } + .medium-75 { + width: 75%; + float: left; + clear: none; + } + .medium-70 { + width: 70%; + float: left; + clear: none; + } + .medium-65 { + width: 65%; + float: left; + clear: none; + } + .medium-60 { + width: 60%; + float: left; + clear: none; + } + .medium-55 { + width: 55%; + float: left; + clear: none; + } + .medium-50 { + width: 50%; + float: left; + clear: none; + } + .medium-45 { + width: 45%; + float: left; + clear: none; + } + .medium-40 { + width: 40%; + float: left; + clear: none; + } + .medium-35 { + width: 35%; + float: left; + clear: none; + } + .medium-30 { + width: 30%; + float: left; + clear: none; + } + .medium-25 { + width: 25%; + float: left; + clear: none; + } + .medium-20 { + width: 20%; + float: left; + clear: none; + } + .medium-15 { + width: 15%; + float: left; + clear: none; + } + .medium-10 { + width: 10%; + float: left; + clear: none; + } + .medium-5 { + width: 5%; + float: left; + clear: none; + } + .medium-33 { + width: 33.33%; + float: left; + clear: none; + } + .medium-66 { + width: 66.66%; + float: left; + clear: none; + } + .medium-100 { + width: 100%; + clear: both; + float: none; + } + [class*="medium-"] { + margin-top: 0; + zoom: 1; + } + table[class*="medium-"], + th[class*="medium-"], + td[class*="medium-"] { + float: none; + } + body.animated *[class*="medium-"] { + -webkit-transition-property: width, font-size, line-height; + -moz-transition-property: width, font-size, line-height; + -o-transition-property: width, font-size, line-height; + -ms-transition-property: width, font-size, line-height; + transition-property: width, font-size, line-height; + -webkit-transition-duration: 125ms; + -moz-transition-duration: 125ms; + -o-transition-duration: 125ms; + -ms-transition-duration: 125ms; + transition-duration: 125ms; + -webkit-transition-timing-function: ease-in-out; + -moz-transition-timing-function: ease-in-out; + -o-transition-timing-function: ease-in-out; + -ms-transition-timing-function: ease-in-out; + transition-timing-function: ease-in-out; + -webkit-transition-delay: 0; + -moz-transition-delay: 0; + -o-transition-delay: 0; + -ms-transition-delay: 0; + transition-delay: 0; + } + .ink-grid .column-group.gutters > [class*="medium-"] { + padding-left: 1.5em; + margin-bottom: 1.5em; + } + .ink-grid .column-group.half-gutters > [class*="medium-"] { + padding-left: 0.75em; + margin-bottom: 0.75em; + } + .ink-grid .column-group.quarter-gutters > [class*="medium-"] { + padding-left: 0.375em; + margin-bottom: 0.375em; + } + .ink-grid .column-group.double-gutters > [class*="medium-"] { + padding-left: 3em; + margin-bottom: 3em; + } + .ink-grid .column-group.horizontal-gutters > [class*="medium-"] { + padding-left: 1.5em; + } + .ink-grid .column-group.half-horizontal-gutters > [class*="medium-"] { + padding-left: 0.75em; + } + .ink-grid .column-group.quarter-horizontal-gutters > [class*="medium-"] { + padding-left: 0.375em; + } + .ink-grid .column-group.double-horizontal-gutters > [class*="medium-"] { + padding-left: 3em; + } + .ink-grid .column-group.vertical-gutters > [class*="medium-"] { + margin-bottom: 1.5em; + } + .ink-grid .column-group.half-vertical-gutters > [class*="medium-"] { + margin-bottom: 0.75em; + } + .ink-grid .column-group.quarter-vertical-gutters > [class*="medium-"] { + margin-bottom: 0.375em; + } + .ink-grid .column-group.double-vertical-gutters > [class*="medium-"] { + margin-bottom: 3em; + } + .ink-grid .column-group.medium-gutters > [class*="medium-"] { + padding-left: 1.5em; + margin-bottom: 1.5em; + } + .ink-grid .column-group.medium-half-gutters > [class*="medium-"] { + padding-left: 0.75em; + margin-bottom: 0.75em; + } + .ink-grid .column-group.medium-quarter-gutters > [class*="medium-"] { + padding-left: 0.375em; + margin-bottom: 0.375em; + } + .ink-grid .column-group.medium-double-gutters > [class*="medium-"] { + padding-left: 3em; + margin-bottom: 3em; + } + .ink-grid .column-group.medium-horizontal-gutters > [class*="medium-"] { + padding-left: 1.5em; + } + .ink-grid .column-group.medium-half-horizontal-gutters > [class*="medium-"] { + padding-left: 0.75em; + } + .ink-grid .column-group.quarter-horizontal-gutters > [class*="medium-"] { + padding-left: 0.375em; + } + .ink-grid .column-group.double-horizontal-gutters > [class*="medium-"] { + padding-left: 3em; + } + .ink-grid .column-group.medium-vertical-gutters > [class*="medium-"] { + margin-bottom: 1.5em; + } + .ink-grid .column-group.medium-half-vertical-gutters > [class*="medium-"] { + margin-bottom: 0.75em; + } + .ink-grid .column-group.medium-quarter-vertical-gutters > [class*="medium-"] { + margin-bottom: 0.375em; + } + .ink-grid .column-group.medium-double-vertical-gutters > [class*="medium-"] { + margin-bottom: 3em; + } + [class*="medium-"]:empty:after { + content: "\00a0"; + } + .medium-push-left { + float: left; + } + .medium-push-center { + float: none; + margin-left: auto; + margin-right: auto; + } + .medium-push-right { + float: right; + } + .medium-align-left { + text-align: left; + } + .medium-align-center { + text-align: center; + } + .medium-align-right { + text-align: right; + } + .space { + margin: 1.5em; + } + .half-space { + margin: 0.75em; + } + .quarter-space { + margin: 0.375em; + } + .double-space { + margin: 3em; + } + .medium-space { + margin: 1.5em; + } + .medium-half-space { + margin: 0.75em; + } + .medium-quarter-space { + margin: 0.375em; + } + .medium-double-space { + margin: 3em; + } + .vspace, + .vertical-space { + margin-top: 1.5em; + margin-bottom: 1.5em; + } + .half-vertical-space { + margin-top: 0.75em; + margin-bottom: 0.75em; + } + .quarter-vertical-space { + margin-top: 0.375em; + margin-bottom: 0.375em; + } + .double-vertical-space { + margin-top: 3em; + margin-bottom: 3em; + } + .hspace, + .horizontal-space { + margin-left: 1.5em; + margin-right: 1.5em; + } + .half-horizontal-space { + margin-left: 0.75em; + margin-right: 0.75em; + } + .quarter-horizontal-space { + margin-left: 0.375em; + margin-right: 0.375em; + } + .double-horizontal-space { + margin-left: 3em; + margin-right: 3em; + } + .medium-vspace, + .medium-vertical-space { + margin-top: 1.5em; + margin-bottom: 1.5em; + } + .medium-half-vertical-space { + margin-top: 0.75em; + margin-bottom: 0.75em; + } + .medium-quarter-vertical-space { + margin-top: 0.375em; + margin-bottom: 0.375em; + } + .medium-double-vertical-space { + margin-top: 3em; + margin-bottom: 3em; + } + .medium-hspace, + .medium-horizontal-space { + margin-left: 1.5em; + margin-right: 1.5em; + } + .medium-half-horizontal-space { + margin-left: 0.75em; + margin-right: 0.75em; + } + .medium-quarter-horizontal-space { + margin-left: 0.375em; + margin-right: 0.375em; + } + .medium-double-horizontal-space { + margin-left: 3em; + margin-right: 3em; + } + .top-space { + margin-top: 1.5em; + } + .top-space:first-child { + margin-top: 1.5em; + } + .half-top-space { + margin-top: 0.75em; + } + .half-top-space:first-child { + margin-top: 0.75em; + } + .quarter-top-space { + margin-top: 0.375em; + } + .quarter-top-space:first-child { + margin-top: 0.375em; + } + .double-top-space { + margin-top: 3em; + } + .double-top-space:first-child { + margin-top: 3em; + } + .medium-top-space { + margin-top: 1.5em; + } + .medium-half-top-space { + margin-top: 0.75em; + } + .medium-quarter-top-space { + margin-top: 0.375em; + } + .medium-double-top-space { + margin-top: 3em; + } + .right-space { + margin-right: 1.5em; + } + .half-right-space { + margin-right: 0.75em; + } + .quarter-right-space { + margin-right: 0.375em; + } + .double-right-space { + margin-right: 3em; + } + .medium-right-space { + margin-right: 1.5em; + } + .medium-half-right-space { + margin-right: 0.75em; + } + .medium-quarter-right-space { + margin-right: 0.375em; + } + .medium-double-right-space { + margin-right: 3em; + } + .bottom-space { + margin-bottom: 1.5em; + } + .half-bottom-space { + margin-bottom: 0.75em; + } + .quarter-bottom-space { + margin-bottom: 0.375em; + } + .double-bottom-space { + margin-bottom: 3em; + } + .medium-bottom-space { + margin-bottom: 1.5em; + } + .medium-half-bottom-space { + margin-bottom: 0.75em; + } + .medium-quarter-bottom-space { + margin-bottom: 0.375em; + } + .medium-double-bottom-space { + margin-bottom: 3em; + } + .left-space { + margin-left: 1.5em; + } + .half-left-space { + margin-left: 0.75em; + } + .quarter-left-space { + margin-left: 0.375em; + } + .double-left-space { + margin-left: 0.375em; + } + .medium-left-space { + margin-left: 1.5em; + } + .medium-half-left-space { + margin-left: 0.75em; + } + .medium-quarter-left-space { + margin-left: 0.375em; + } + .medium-double-left-space { + margin-left: 0.375em; + } + .hide-medium { + display: none !important; + } + .show-medium { + display: inherit !important; + } + table.show-medium { + display: table !important; + } + thead.show-medium { + display: table-header-group !important; + } + tbody.show-medium { + display: table-row-group !important; + } + tfoot.show-medium { + display: table-footer-group !important; + } + tr.show-medium { + display: table-row !important; + } + th.show-medium, + td.show-medium { + display: table-cell !important; + } +} +@media screen and (max-width: 649px) { + .ink-grid { + width: auto; + max-width: 1200px; + margin: 0 auto; + padding: 0 1em; + } + .column-group { + clear: both; + zoom: 1; + } + .column-group:after { + content: " "; + display: block; + height: 0; + clear: both; + visibility: hidden; + } + .column-group.gutters, + .column-group.horizontal-gutters { + margin-left: -1em; + } + .column-group.half-gutters, + .column-group.half-horizontal-gutters { + margin-left: -0.5em; + } + .column-group.quarter-gutters, + .column-group.quarter-horizontal-gutters { + margin-left: -0.25em; + } + .column-group.double-gutters, + .column-group.double-horizontal-gutters { + margin-left: -2em; + } + .small-95 { + width: 95%; + float: left; + clear: none; + } + .small-90 { + width: 90%; + float: left; + clear: none; + } + .small-85 { + width: 85%; + float: left; + clear: none; + } + .small-80 { + width: 80%; + float: left; + clear: none; + } + .small-75 { + width: 75%; + float: left; + clear: none; + } + .small-70 { + width: 70%; + float: left; + clear: none; + } + .small-65 { + width: 65%; + float: left; + clear: none; + } + .small-60 { + width: 60%; + float: left; + clear: none; + } + .small-55 { + width: 55%; + float: left; + clear: none; + } + .small-50 { + width: 50%; + float: left; + clear: none; + } + .small-45 { + width: 45%; + float: left; + clear: none; + } + .small-40 { + width: 40%; + float: left; + clear: none; + } + .small-35 { + width: 35%; + float: left; + clear: none; + } + .small-30 { + width: 30%; + float: left; + clear: none; + } + .small-25 { + width: 25%; + float: left; + clear: none; + } + .small-20 { + width: 20%; + float: left; + clear: none; + } + .small-15 { + width: 15%; + float: left; + clear: none; + } + .small-10 { + width: 10%; + float: left; + clear: none; + } + .small-5 { + width: 5%; + float: left; + clear: none; + } + .small-33 { + width: 33.33%; + float: left; + clear: none; + } + .small-66 { + width: 66.66%; + float: left; + clear: none; + } + .small-100 { + width: 100%; + clear: both; + float: none; + } + [class*="small-"] { + margin-top: 0; + zoom: 1; + } + table[class*="small-"], + th[class*="small-"], + td[class*="small-"] { + float: none; + } + body.animated *[class*="small-"] { + -webkit-transition-property: width, font-size, line-height; + -moz-transition-property: width, font-size, line-height; + -o-transition-property: width, font-size, line-height; + -ms-transition-property: width, font-size, line-height; + transition-property: width, font-size, line-height; + -webkit-transition-duration: 125ms; + -moz-transition-duration: 125ms; + -o-transition-duration: 125ms; + -ms-transition-duration: 125ms; + transition-duration: 125ms; + -webkit-transition-timing-function: ease-in-out; + -moz-transition-timing-function: ease-in-out; + -o-transition-timing-function: ease-in-out; + -ms-transition-timing-function: ease-in-out; + transition-timing-function: ease-in-out; + -webkit-transition-delay: 0; + -moz-transition-delay: 0; + -o-transition-delay: 0; + -ms-transition-delay: 0; + transition-delay: 0; + } + .ink-grid .column-group.gutters > [class*="small-"] { + padding-left: 1em; + margin-bottom: 1em; + } + .ink-grid .column-group.half-gutters > [class*="small-"] { + padding-left: 0.5em; + margin-bottom: 0.5em; + } + .ink-grid .column-group.quarter-gutters > [class*="small-"] { + padding-left: 0.25em; + margin-bottom: 0.25em; + } + .ink-grid .column-group.double-gutters > [class*="small-"] { + padding-left: 2em; + margin-bottom: 2em; + } + .ink-grid .column-group.horizontal-gutters > [class*="small-"] { + padding-left: 1em; + } + .ink-grid .column-group.half-horizontal-gutters > [class*="small-"] { + padding-left: 0.5em; + } + .ink-grid .column-group.quarter-horizontal-gutters > [class*="small-"] { + padding-left: 0.25em; + } + .ink-grid .column-group.double-horizontal-gutters > [class*="small-"] { + padding-left: 2em; + } + .ink-grid .column-group.vertical-gutters > [class*="small-"] { + margin-bottom: 1em; + } + .ink-grid .column-group.half-vertical-gutters > [class*="small-"] { + margin-bottom: 0.5em; + } + .ink-grid .column-group.quarter-vertical-gutters > [class*="small-"] { + margin-bottom: 0.25em; + } + .ink-grid .column-group.double-vertical-gutters > [class*="small-"] { + margin-bottom: 2em; + } + .ink-grid .column-group.small-gutters > [class*="small-"] { + padding-left: 1em; + margin-bottom: 1em; + } + .ink-grid .column-group.small-half-gutters > [class*="small-"] { + padding-left: 0.5em; + margin-bottom: 0.5em; + } + .ink-grid .column-group.small-quarter-gutters > [class*="small-"] { + padding-left: 0.25em; + margin-bottom: 0.25em; + } + .ink-grid .column-group.small-double-gutters > [class*="small-"] { + padding-left: 2em; + margin-bottom: 2em; + } + .ink-grid .column-group.small-horizontal-gutters > [class*="small-"] { + padding-left: 1em; + } + .ink-grid .column-group.small-half-horizontal-gutters > [class*="small-"] { + padding-left: 0.5em; + } + .ink-grid .column-group.quarter-horizontal-gutters > [class*="small-"] { + padding-left: 0.25em; + } + .ink-grid .column-group.double-horizontal-gutters > [class*="small-"] { + padding-left: 2em; + } + .ink-grid .column-group.small-vertical-gutters > [class*="small-"] { + margin-bottom: 1em; + } + .ink-grid .column-group.small-half-vertical-gutters > [class*="small-"] { + margin-bottom: 0.5em; + } + .ink-grid .column-group.small-quarter-vertical-gutters > [class*="small-"] { + margin-bottom: 0.25em; + } + .ink-grid .column-group.small-double-vertical-gutters > [class*="small-"] { + margin-bottom: 2em; + } + [class*="small-"]:empty:after { + content: "\00a0"; + } + .small-push-left { + float: left; + } + .small-push-center { + float: none; + margin-left: auto; + margin-right: auto; + } + .small-push-right { + float: right; + } + .small-align-left { + text-align: left; + } + .small-align-center { + text-align: center; + } + .small-align-right { + text-align: right; + } + .space { + margin: 1em; + } + .half-space { + margin: 0.5em; + } + .quarter-space { + margin: 0.25em; + } + .double-space { + margin: 2em; + } + .small-space { + margin: 1em; + } + .small-half-space { + margin: 0.5em; + } + .small-quarter-space { + margin: 0.25em; + } + .small-double-space { + margin: 2em; + } + .vspace, + .vertical-space { + margin-top: 1em; + margin-bottom: 1em; + } + .half-vertical-space { + margin-top: 0.5em; + margin-bottom: 0.5em; + } + .quarter-vertical-space { + margin-top: 0.25em; + margin-bottom: 0.25em; + } + .double-vertical-space { + margin-top: 2em; + margin-bottom: 2em; + } + .hspace, + .horizontal-space { + margin-left: 1em; + margin-right: 1em; + } + .half-horizontal-space { + margin-left: 0.5em; + margin-right: 0.5em; + } + .quarter-horizontal-space { + margin-left: 0.25em; + margin-right: 0.25em; + } + .double-horizontal-space { + margin-left: 2em; + margin-right: 2em; + } + .small-vspace, + .small-vertical-space { + margin-top: 1em; + margin-bottom: 1em; + } + .small-half-vertical-space { + margin-top: 0.5em; + margin-bottom: 0.5em; + } + .small-quarter-vertical-space { + margin-top: 0.25em; + margin-bottom: 0.25em; + } + .small-double-vertical-space { + margin-top: 2em; + margin-bottom: 2em; + } + .small-hspace, + .small-horizontal-space { + margin-left: 1em; + margin-right: 1em; + } + .small-half-horizontal-space { + margin-left: 0.5em; + margin-right: 0.5em; + } + .small-quarter-horizontal-space { + margin-left: 0.25em; + margin-right: 0.25em; + } + .small-double-horizontal-space { + margin-left: 2em; + margin-right: 2em; + } + .top-space { + margin-top: 1em; + } + .top-space:first-child { + margin-top: 1em; + } + .half-top-space { + margin-top: 0.5em; + } + .half-top-space:first-child { + margin-top: 0.5em; + } + .quarter-top-space { + margin-top: 0.25em; + } + .quarter-top-space:first-child { + margin-top: 0.25em; + } + .double-top-space { + margin-top: 2em; + } + .double-top-space:first-child { + margin-top: 2em; + } + .small-top-space { + margin-top: 1em; + } + .small-half-top-space { + margin-top: 0.5em; + } + .small-quarter-top-space { + margin-top: 0.25em; + } + .small-double-top-space { + margin-top: 2em; + } + .right-space { + margin-right: 1em; + } + .half-right-space { + margin-right: 0.5em; + } + .quarter-right-space { + margin-right: 0.25em; + } + .double-right-space { + margin-right: 2em; + } + .small-right-space { + margin-right: 1em; + } + .small-half-right-space { + margin-right: 0.5em; + } + .small-quarter-right-space { + margin-right: 0.25em; + } + .small-double-right-space { + margin-right: 2em; + } + .bottom-space { + margin-bottom: 1em; + } + .half-bottom-space { + margin-bottom: 0.5em; + } + .quarter-bottom-space { + margin-bottom: 0.25em; + } + .double-bottom-space { + margin-bottom: 2em; + } + .small-bottom-space { + margin-bottom: 1em; + } + .small-half-bottom-space { + margin-bottom: 0.5em; + } + .small-quarter-bottom-space { + margin-bottom: 0.25em; + } + .small-double-bottom-space { + margin-bottom: 2em; + } + .left-space { + margin-left: 1em; + } + .half-left-space { + margin-left: 0.5em; + } + .quarter-left-space { + margin-left: 0.25em; + } + .double-left-space { + margin-left: 0.25em; + } + .small-left-space { + margin-left: 1em; + } + .small-half-left-space { + margin-left: 0.5em; + } + .small-quarter-left-space { + margin-left: 0.25em; + } + .small-double-left-space { + margin-left: 0.25em; + } + .hide-small { + display: none !important; + } + .show-small { + display: inherit !important; + } + table.show-small { + display: table !important; + } + thead.show-small { + display: table-header-group !important; + } + tbody.show-small { + display: table-row-group !important; + } + tfoot.show-small { + display: table-footer-group !important; + } + tr.show-small { + display: table-row !important; + } + th.show-small, + td.show-small { + display: table-cell !important; + } +} +.animated.slow { + animation-duration: 1s; +} +.animated.medium { + animation-duration: 0.5s; +} +.animated.fast { + animation-duration: 0.2s; +} +.ink-sticky-stuck { + position: fixed; +} +.ink-datepicker-wrapper { + position: relative; +} +.ink-datepicker-calendar { + margin-top: 0; + position: absolute; +} +.ink-datepicker-calendar.right { + left: 100%; + top: 0; +} +.ink-datepicker-calendar.left { + right: 100%; + top: 0; +} +.ink-datepicker-calendar.bottom { + top: 100%; + left: 0; +} +.ink-datepicker-calendar.top { + bottom: 100%; + left: 0; +} +.ink-datepicker-wrapper, +.ink-datepicker-calendar { + display: inline; + display: inline-block; +} +.ink-calendar { + border-radius: 4px; + text-align: center; + padding: 0.3em; + min-width: 17.400000000000002em; + font-size: 13px; + -webkit-box-shadow: 0px 1px 2px 0 rgba(0, 0, 0, 0.4); + -moz-box-shadow: 0px 1px 2px 0 rgba(0, 0, 0, 0.4); + box-shadow: 0px 1px 2px 0 rgba(0, 0, 0, 0.4); + background: #ffffff; + z-index: 10; +} +.ink-calendar a { + text-decoration: none; +} +.ink-calendar li { + list-style: none inside; +} +html.ink-modal-is-open .ink-calendar { + z-index: 101; +} +.ink-calendar-top-options { + padding: 5px; + font-size: .813em; + cursor: pointer; +} +.ink-calendar-top-options .clean { + float: left; +} +.ink-calendar-top-options .close { + float: right; +} +.ink-calendar-top { + line-height: 2em; + background: #e6e6e6; + border-radius: 4px; +} +.ink-calendar-top div { + float: left; +} +.ink-calendar-top .ink-calendar-prev, +.ink-calendar-top .ink-calendar-next { + width: 10%; +} +.ink-calendar-top .ink-calendar-prev a, +.ink-calendar-top .ink-calendar-next a { + display: block; +} +.ink-calendar-top .ink-calendar-month_desc { + width: 80%; +} +.ink-calendar-month, +.ink-calendar-year-selector, +.ink-calendar-month-selector { + margin-top: .5em; + padding-left: 0; +} +.ink-calendar-month li a, +.ink-calendar-year-selector li a, +.ink-calendar-month-selector li a { + margin: 0px; + line-height: 2em; + vertical-align: middle; + display: block; + border-radius: 4px; + color: #444444; +} +.ink-calendar-month li a:hover, +.ink-calendar-year-selector li a:hover, +.ink-calendar-month-selector li a:hover { + background: #e6e6e6; +} +.ink-calendar-month li a.ink-calendar-on, +.ink-calendar-year-selector li a.ink-calendar-on, +.ink-calendar-month-selector li a.ink-calendar-on, +.ink-calendar-month li a.ink-calendar-on:hover, +.ink-calendar-year-selector li a.ink-calendar-on:hover, +.ink-calendar-month-selector li a.ink-calendar-on:hover { + background: #0069d6; + color: #ffffff; +} +.ink-calendar-month li a.ink-calendar-off, +.ink-calendar-year-selector li a.ink-calendar-off, +.ink-calendar-month-selector li a.ink-calendar-off, +.ink-calendar-month li a.ink-calendar-off:hover, +.ink-calendar-year-selector li a.ink-calendar-off:hover, +.ink-calendar-month-selector li a.ink-calendar-off:hover { + background: #ffffff; + color: #aaaaaa; + cursor: default; +} +.ink-calendar-month ul, +.ink-calendar-year-selector ul, +.ink-calendar-month-selector ul { + clear: both; + padding-left: 0; +} +.ink-calendar-month ul li, +.ink-calendar-year-selector ul li, +.ink-calendar-month-selector ul li { + width: 2.4em; + float: left; + text-align: center; + padding: 0; + margin: 0; +} +.ink-calendar-year-selector ul li { + width: 25%; +} +.ink-calendar-month-selector ul li { + width: 25%; +} +.ink-calendar-year-selector, +.ink-calendar-month-selector { + display: none; +} +.ink-calendar-off, +.action_inactive { + color: #ddd !important; +} +.ink-calendar-month .ink-calendar-header { + border-bottom: 1px solid rgba(0, 0, 0, 0.1); + padding-bottom: .5em; + margin-bottom: .5em; + color: #aaa; +} +.ink-calendar-top:after, +.ink-calendar-middle:after, +.ink-calendar-top-options:after, +.ink-calendar-month .ink-calendar-header:after, +.ink-calendar-month .ink-calendar-middle ul:after { + content: " "; + display: block; + height: 0; + clear: both; + visibility: hidden; + zoom: 1; +} +.ink-modal { + top: 50%; + left: 50%; + width: 90%; + height: 90%; + background: #ffffff; + z-index: 100; + position: absolute; + border: 1px #666666 solid; + filter: alpha(opacity=100); + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=100)"; + opacity: 1; + -webkit-box-shadow: 0 0 15px 0 rgba(0, 0, 0, 0.8); + -moz-box-shadow: 0 0 15px 0 rgba(0, 0, 0, 0.8); + box-shadow: 0 0 15px 0 rgba(0, 0, 0, 0.8); + border-radius: 4px; + overflow: hidden; +} +.ink-modal:after { + content: " "; + display: block; + height: 0; + clear: both; + visibility: hidden; + zoom: 1; +} +.ink-modal > .modal-body { + padding: 1em; + overflow-y: auto; + overflow-x: hidden; + height: auto; +} +.ink-modal > .modal-body .ink-grid { + padding-left: 0; + padding-right: 0; + width: 100%; + min-width: 100%; +} +.ink-modal > .modal-header, +.ink-modal > header { + border-bottom: 1px #e6e6e6 solid; + overflow: hidden; + -webkit-box-shadow: 0 1px 2px 0 rgba(175, 175, 175, 0.2); + -moz-box-shadow: 0 1px 2px 0 rgba(175, 175, 175, 0.2); + box-shadow: 0 1px 2px 0 rgba(175, 175, 175, 0.2); +} +.ink-modal > .modal-header > .modal-close, +.ink-modal > header > .modal-close { + padding-top: 2px; + text-align: center; + color: #ffffff; + width: 26px; + height: 26px; + line-height: 1.2em; + border: 0; + background: #bfbfbf; + font-size: 0; + border-radius: 50%; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.6); + filter: alpha(opacity=60); + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=60)"; + opacity: 0.6; + -webkit-transition-property: opacity; + -moz-transition-property: opacity; + -o-transition-property: opacity; + -ms-transition-property: opacity; + transition-property: opacity; + -webkit-transition-duration: 125ms; + -moz-transition-duration: 125ms; + -o-transition-duration: 125ms; + -ms-transition-duration: 125ms; + transition-duration: 125ms; + -webkit-transition-timing-function: ease-in-out; + -moz-transition-timing-function: ease-in-out; + -o-transition-timing-function: ease-in-out; + -ms-transition-timing-function: ease-in-out; + transition-timing-function: ease-in-out; + -webkit-transition-delay: 0; + -moz-transition-delay: 0; + -o-transition-delay: 0; + -ms-transition-delay: 0; + transition-delay: 0; + float: right; +} +.ink-modal > .modal-header > .modal-close:after, +.ink-modal > header > .modal-close:after { + content: "\f00d"; + font-family: FontAwesome; + font-size: medium; + line-height: 22px; +} +.ink-modal > .modal-header > .modal-close:hover, +.ink-modal > header > .modal-close:hover { + filter: alpha(opacity=100); + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=100)"; + opacity: 1; +} +.ink-modal > .modal-footer, +.ink-modal > footer { + background: #e6e6e6; + margin-bottom: 0; + -webkit-box-shadow: 0 -1px 2px 0 rgba(175, 175, 175, 0.2); + -moz-box-shadow: 0 -1px 2px 0 rgba(175, 175, 175, 0.2); + box-shadow: 0 -1px 2px 0 rgba(175, 175, 175, 0.2); + position: absolute; + bottom: 0; + width: 100%; +} +.ink-modal > .modal-header, +.ink-modal > header, +.ink-modal > .modal-footer, +.ink-modal > footer { + padding: 0.8em 1em 0.65em 1em; +} +.ink-modal > .modal-header:before, +.ink-modal > header:before, +.ink-modal > .modal-footer:before, +.ink-modal > footer:before, +.ink-modal > .modal-header:after, +.ink-modal > header:after, +.ink-modal > .modal-footer:after, +.ink-modal > footer:after { + content: "."; + display: block; + height: 0; + clear: both; + visibility: hidden; +} +.ink-modal-open { + overflow: hidden; +} +.ink-tagfield input[type="text"].new-tag-input { + background-color: #fff; + border: 1px solid #ccc; + line-height: 1em; + margin: 0; + padding: 5px; + border-radius: 2px; +} +.ink-tagfield input[type="text"].new-tag-input:focus { + -webkit-box-shadow: 0px 0px 0px 3px #eaeaea; + -moz-box-shadow: 0px 0px 0px 3px #eaeaea; + box-shadow: 0px 0px 0px 3px #eaeaea; + border: 1px solid #c3c3c3; +} +.ink-tagfield span.ink-tag { + background-color: #1b1b1b; + color: #eaeaea; + text-shadow: none; + font-size: 0.9em; + font-weight: normal; + border: 1px solid #000; + padding: 4px 6px; +} +.ink-tagfield span.ink-tag i.icon-remove { + color: #ccc; + font-size: 0.9em; + font-weight: normal; + margin-left: 4px; +} +.ink-tagfield span.ink-tag i.icon-remove:hover { + cursor: pointer; + color: red; +} +/* Progess bars */ +.ink-progress-bar { + margin-bottom: 1em; + overflow: hidden; + background: #f2f2f2; + position: relative; + border-radius: 4px; + -webkit-box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.2) inset; + -moz-box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.2) inset; + box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.2) inset; +} +.ink-progress-bar .caption { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + line-height: 1.7; + text-align: center; + color: #000000; + font-size: 0.813em; + z-index: 10; +} +.ink-progress-bar .bar { + height: 1.3em; + text-shadow: 0 1px 0 rgba(0, 0, 0, 0.25); + -webkit-box-shadow: 0 1px 1px 0 rgba(0, 0, 0, 0.1) inset; + -moz-box-shadow: 0 1px 1px 0 rgba(0, 0, 0, 0.1) inset; + box-shadow: 0 1px 1px 0 rgba(0, 0, 0, 0.1) inset; + -webkit-transition-property: "width"; + -moz-transition-property: "width"; + -o-transition-property: "width"; + -ms-transition-property: "width"; + transition-property: "width"; + -webkit-transition-duration: 0.6s; + -moz-transition-duration: 0.6s; + -o-transition-duration: 0.6s; + -ms-transition-duration: 0.6s; + transition-duration: 0.6s; + -webkit-transition-timing-function: "ease"; + -moz-transition-timing-function: "ease"; + -o-transition-timing-function: "ease"; + -ms-transition-timing-function: "ease"; + transition-timing-function: "ease"; + -webkit-transition-delay: 0; + -moz-transition-delay: 0; + -o-transition-delay: 0; + -ms-transition-delay: 0; + transition-delay: 0; +} +.ink-progress-bar .bar.grey { + text-shadow: 0 -1px 0 rgba(255, 255, 255, 0.25); + background: #e6e6e6; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#e6e6e6', endColorstr='#cccccc'); + background: -moz-linear-gradient(top, #e6e6e6 0%, #cccccc 150%); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #e6e6e6), color-stop(150%, #cccccc)); + background: -webkit-linear-gradient(top, #e6e6e6 0%, #cccccc 150%); + background: -o-linear-gradient(top, #e6e6e6 0%, #cccccc 150%); + background: -ms-linear-gradient(top, #e6e6e6 0%, #cccccc 150%); + background: linear-gradient(to bottom, #e6e6e6 0%, #cccccc 150%); +} +.ink-progress-bar .bar.green { + background: #4c9220; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#4c9220', endColorstr='#366817'); + background: -moz-linear-gradient(top, #4c9220 0%, #366817 150%); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #4c9220), color-stop(150%, #366817)); + background: -webkit-linear-gradient(top, #4c9220 0%, #366817 150%); + background: -o-linear-gradient(top, #4c9220 0%, #366817 150%); + background: -ms-linear-gradient(top, #4c9220 0%, #366817 150%); + background: linear-gradient(to bottom, #4c9220 0%, #366817 150%); +} +.ink-progress-bar .bar.blue { + background: #1b75ce; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#1b75ce', endColorstr='#155ba1'); + background: -moz-linear-gradient(top, #1b75ce 0%, #155ba1 150%); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #1b75ce), color-stop(150%, #155ba1)); + background: -webkit-linear-gradient(top, #1b75ce 0%, #155ba1 150%); + background: -o-linear-gradient(top, #1b75ce 0%, #155ba1 150%); + background: -ms-linear-gradient(top, #1b75ce 0%, #155ba1 150%); + background: linear-gradient(to bottom, #1b75ce 0%, #155ba1 150%); +} +.ink-progress-bar .bar.red { + background: #be1c1c; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#be1c1c', endColorstr='#921515'); + background: -moz-linear-gradient(top, #be1c1c 0%, #921515 150%); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #be1c1c), color-stop(150%, #921515)); + background: -webkit-linear-gradient(top, #be1c1c 0%, #921515 150%); + background: -o-linear-gradient(top, #be1c1c 0%, #921515 150%); + background: -ms-linear-gradient(top, #be1c1c 0%, #921515 150%); + background: linear-gradient(to bottom, #be1c1c 0%, #921515 150%); +} +.ink-progress-bar .bar.orange { + background: #f2990d; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#f2990d', endColorstr='#c27b0a'); + background: -moz-linear-gradient(top, #f2990d 0%, #c27b0a 150%); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #f2990d), color-stop(150%, #c27b0a)); + background: -webkit-linear-gradient(top, #f2990d 0%, #c27b0a 150%); + background: -o-linear-gradient(top, #f2990d 0%, #c27b0a 150%); + background: -ms-linear-gradient(top, #f2990d 0%, #c27b0a 150%); + background: linear-gradient(to bottom, #f2990d 0%, #c27b0a 150%); +} +.ink-progress-bar .bar.black { + background: #4d4d4d; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#4d4d4d', endColorstr='#000000'); + background: -moz-linear-gradient(top, #4d4d4d 0%, #000000 150%); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #4d4d4d), color-stop(150%, #000000)); + background: -webkit-linear-gradient(top, #4d4d4d 0%, #000000 150%); + background: -o-linear-gradient(top, #4d4d4d 0%, #000000 150%); + background: -ms-linear-gradient(top, #4d4d4d 0%, #000000 150%); + background: linear-gradient(to bottom, #4d4d4d 0%, #000000 150%); +} +/* Tabs */ +.ink-tabs .tabs-nav { + list-style: none; + padding: 0em; +} +.ink-tabs .tabs-nav li { + line-height: 1.7; + position: relative; + margin: 0; +} +.ink-tabs .tabs-nav li a { + padding: 0.5em 1em; + display: block; +} +.ink-tabs .tabs-nav li a:hover { + background: #e8e8e8; +} +.ink-tabs .tabs-nav li.active a { + color: #555555; + cursor: default; + text-decoration: none; + background: #f7f7f7; + border: 1px solid #cccccc; +} +.ink-tabs .tabs-nav:after { + content: " "; + display: block; + height: 0; + clear: both; + visibility: hidden; + zoom: 1; +} +.ink-tabs .tabs-content { + margin-top: 1.5em; + overflow: auto; +} +.ink-tabs.top > .tabs-nav { + border-bottom: 1px solid #cccccc; +} +.ink-tabs.top > .tabs-nav li { + float: left; +} +.ink-tabs.top > .tabs-nav li a { + margin-right: .4em; + border-top-right-radius: 4px; + border-top-left-radius: 4px; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} +.ink-tabs.top > .tabs-nav li.active { + margin: 0 0 -2px 0; +} +.ink-tabs.top > .tabs-nav li.active a { + border-bottom-color: transparent; +} +.ink-tabs.bottom > .tabs-nav { + border-top: 1px solid #cccccc; +} +.ink-tabs.bottom > .tabs-nav li { + float: left; +} +.ink-tabs.bottom > .tabs-nav li a { + margin-right: .4em; + border-top-right-radius: 0; + border-top-left-radius: 0; + border-bottom-right-radius: 4px; + border-bottom-left-radius: 4px; +} +.ink-tabs.bottom > .tabs-nav li.active { + margin: -2px 0 0 0; +} +.ink-tabs.bottom > .tabs-nav li.active a { + border-top-color: transparent; +} +.ink-tabs.left > .tabs-nav { + border-right: 1px solid #cccccc; + float: left; + margin-right: 2em; +} +.ink-tabs.left > .tabs-nav li { + float: none; + text-align: right; +} +.ink-tabs.left > .tabs-nav li a { + margin-bottom: .4em; + border-top-right-radius: 0; + border-bottom-right-radius: 0; + border-bottom-left-radius: 4px; + border-top-left-radius: 4px; +} +.ink-tabs.left > .tabs-nav li.active { + margin: 0 -2px 0 0; +} +.ink-tabs.left > .tabs-nav li.active a { + border-right-color: transparent; +} +.ink-tabs.right > .tabs-nav { + border-left: 1px solid #cccccc; + float: right; + margin-left: 2em; +} +.ink-tabs.right > .tabs-nav li { + float: none; +} +.ink-tabs.right > .tabs-nav li a { + margin-bottom: .4em; + border-top-right-radius: 4px; + border-bottom-right-radius: 4px; + border-bottom-left-radius: 0; + border-top-left-radius: 0; +} +.ink-tabs.right > .tabs-nav li.active { + margin: 0 0 0 -2px; +} +.ink-tabs.right > .tabs-nav li.active a { + border-left-color: transparent; +} +.dragging { + cursor: move; + -moz-user-select: none; + -khtml-user-select: none; + -webkit-user-select: none; + -o-user-select: none; + -ms-user-select: none; + user-select: none; + -ms-user-drag: none; + -moz-user-drag: none; + -khtml-user-drag: none; + -webkit-user-drag: none; + -o-user-drag: none; + user-drag: none; +} +.ink-sortable-list li { + margin: 0; + border-bottom: 1px solid #ccc; + line-height: 40px; + cursor: move; + -moz-user-select: none; + -khtml-user-select: none; + -webkit-user-select: none; + -o-user-select: none; + -ms-user-select: none; + user-select: none; + -ms-user-drag: none; + -moz-user-drag: none; + -khtml-user-drag: none; + -webkit-user-drag: none; + -o-user-drag: none; + user-drag: none; +} +.ink-sortable-list li:hover, +.ink-sortable-list li.placeholder { + background: #cccccc; + background: rgba(204, 204, 204, 0.2); +} +.ink-sortable-list li.placeholder { + -webkit-box-shadow: 0 0px 10px 0 rgba(0, 0, 0, 0.3); + -moz-box-shadow: 0 0px 10px 0 rgba(0, 0, 0, 0.3); + box-shadow: 0 0px 10px 0 rgba(0, 0, 0, 0.3); +} +.ink-sortable-list li .ink-label { + margin: 0 .8em; +} +.ink-tree-view li { + list-style-type: none; +} +.ink-tree-view [data-open] > :before { + margin-left: -1.3em; + margin-right: .4em; + text-decoration: none; +} +.ink-carousel { + width: 100%; + position: relative; + overflow: hidden; + display: block; +} +.ink-carousel .stage { + left: 0; + height: auto !important; + margin-top: 0; + margin-bottom: 0; + padding-left: 0; + list-style-type: none; + white-space: nowrap; + position: relative; + -webkit-transition-property: all; + -moz-transition-property: all; + -o-transition-property: all; + -ms-transition-property: all; + transition-property: all; + -webkit-transition-duration: 0.5s; + -moz-transition-duration: 0.5s; + -o-transition-duration: 0.5s; + -ms-transition-duration: 0.5s; + transition-duration: 0.5s; + -webkit-transition-timing-function: ease; + -moz-transition-timing-function: ease; + -o-transition-timing-function: ease; + -ms-transition-timing-function: ease; + transition-timing-function: ease; + -webkit-transition-delay: 0; + -moz-transition-delay: 0; + -o-transition-delay: 0; + -ms-transition-delay: 0; + transition-delay: 0; +} +.ink-carousel .stage .slide { + position: relative; + display: inline-block; + vertical-align: top; + white-space: normal; + margin: 0; + float: none; + zoom: 1; + *display: inline; +} +.ink-carousel .hider { + -webkit-transition-property: all; + -moz-transition-property: all; + -o-transition-property: all; + -ms-transition-property: all; + transition-property: all; + -webkit-transition-duration: 0.5s; + -moz-transition-duration: 0.5s; + -o-transition-duration: 0.5s; + -ms-transition-duration: 0.5s; + transition-duration: 0.5s; + -webkit-transition-timing-function: ease; + -moz-transition-timing-function: ease; + -o-transition-timing-function: ease; + -ms-transition-timing-function: ease; + transition-timing-function: ease; + -webkit-transition-delay: 0; + -moz-transition-delay: 0; + -o-transition-delay: 0; + -ms-transition-delay: 0; + transition-delay: 0; + background-color: white; + margin: 0; +} +img { + width: auto; + max-width: 100%; + vertical-align: top; +} +figure { + position: relative; +} +figure.rounded { + border-radius: 6px; +} +figure.rounded img:first-child { + border-top-right-radius: 6px; + border-top-left-radius: 6px; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} +figure.rounded img:last-child { + border-top-right-radius: 0; + border-top-left-radius: 0; + border-bottom-right-radius: 6px; + border-bottom-left-radius: 6px; +} +figure.rounded figcaption:first-child { + border-top-right-radius: 6px; + border-top-left-radius: 6px; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} +figure.rounded figcaption:last-child { + border-top-right-radius: 0; + border-top-left-radius: 0; + border-bottom-right-radius: 6px; + border-bottom-left-radius: 6px; +} +figure.rounded.caption-over-top img { + border-radius: 6px; +} +figure.rounded.caption-over-top figcaption { + border-top-right-radius: 6px; + border-top-left-radius: 6px; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} +figure.rounded.caption-over-bottom img { + border-radius: 6px; +} +figure.rounded.caption-over-bottom figcaption { + border-top-right-radius: 0; + border-top-left-radius: 0; + border-bottom-right-radius: 6px; + border-bottom-left-radius: 6px; +} +figure.caption-over-top figcaption { + position: absolute; + left: 0; + top: 0; +} +figure.caption-over-top img + figcaption { + margin-top: 0; +} +figure.caption-over-bottom figcaption { + position: absolute; + left: 0; + bottom: 0; + margin-bottom: 4px; +} +figure.caption-over-top figcaption.light, +figure.caption-over-bottom figcaption.light { + background: rgba(255, 255, 255, 0.8); + color: #000000; +} +figure.caption-over-top figcaption.dark, +figure.caption-over-bottom figcaption.dark { + background: rgba(0, 0, 0, 0.8); + color: #ffffff; +} +figcaption { + font-size: 0.8em; + padding: 1em; + width: 100%; +} +figcaption.light { + background: #0d0d0d; + color: #555555; +} +figcaption.dark { + background: #0d0d0d; + color: #ffffff; +} +.push-left { + float: left !important; +} +.push-right { + float: right !important; +} +.push-center { + float: none !important; + margin-left: auto; + margin-right: auto; +} +.clearfix:after { + content: " "; + display: block; + height: 0; + clear: both; + visibility: hidden; + zoom: 1; +} +.no-margin { + margin: 0 !important; +} +.screen-size-helper { + height: 2.5em; + line-height: 1.6em; + font-size: 1em; + padding: 0.5333333333333333em 0.8em; + background: rgba(0, 0, 0, 0.85); + z-index: 100; +} +.screen-size-helper .title { + color: white; + text-shadow: 0 1px 0 #000000; + font-size: inherit; + line-height: inherit; + float: left; + text-transform: uppercase; + font-weight: 500; +} +.screen-size-helper ul { + color: white; + text-shadow: 0 1px 0 #000000; + float: right; + margin: 0; + padding: 0; + line-height: inherit !important; +} +.screen-size-helper ul li { + padding: 0; + margin: 0; + text-transform: uppercase; + font-weight: bold; + font-size: inherit !important; +} +.screen-size-helper ul li.small { + color: #4a9b17; +} +.screen-size-helper ul li.medium { + color: #ff9c00; +} +.screen-size-helper ul li.large { + color: #c91111; +} +.drag { + -webkit-box-shadow: 0 0px 10px 0 rgba(0, 0, 0, 0.3); + -moz-box-shadow: 0 0px 10px 0 rgba(0, 0, 0, 0.3); + box-shadow: 0 0px 10px 0 rgba(0, 0, 0, 0.3); +} +.ink-shade { + background: rgba(0, 0, 0, 0.8); + width: 100%; + height: 100%; + top: 0; + right: 0; + bottom: 0; + left: 0; + margin-top: 0; + position: fixed; + z-index: 100; + display: none; + filter: alpha(opacity=0); + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + opacity: 0; +} +.ink-shade.fade { + -webkit-transition-property: opacity; + -moz-transition-property: opacity; + -o-transition-property: opacity; + -ms-transition-property: opacity; + transition-property: opacity; + -webkit-transition-duration: 300ms; + -moz-transition-duration: 300ms; + -o-transition-duration: 300ms; + -ms-transition-duration: 300ms; + transition-duration: 300ms; + -webkit-transition-timing-function: ease-in-out; + -moz-transition-timing-function: ease-in-out; + -o-transition-timing-function: ease-in-out; + -ms-transition-timing-function: ease-in-out; + transition-timing-function: ease-in-out; + -webkit-transition-delay: 0; + -moz-transition-delay: 0; + -o-transition-delay: 0; + -ms-transition-delay: 0; + transition-delay: 0; +} +.ink-shade.visible { + filter: alpha(opacity=100); + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=100)"; + opacity: 1; +} diff --git a/ajax/libs/ink/2.3.1/css/ink.css.map b/ajax/libs/ink/2.3.1/css/ink.css.map new file mode 100644 index 000000000..5c646fa41 --- /dev/null +++ b/ajax/libs/ink/2.3.1/css/ink.css.map @@ -0,0 +1 @@ +{"version":3,"sources":["../../src/less/modules/reset.less","../../src/less/config/__typography.less","../../src/less/modules/fonts.less","../../src/less/modules/typography.less","../../src/less/modules/mixins.less","../../src/less/modules/labels.less","../../src/less/modules/footer.less","../../src/less/modules/icons/path.less","../../src/less/modules/icons/core.less","../../src/less/modules/icons/mixins.less","../../src/less/modules/icons/extras.less","../../src/less/modules/icons/icons.less","../../src/less/modules/icons/variables.less","../../src/less/modules/animations/animate.less","../../src/less/modules/navigation/core.less","../../src/less/modules/navigation/menu.less","../../src/less/modules/navigation/breadcrumbs.less","../../src/less/modules/navigation/pagination.less","../../src/less/modules/navigation/pills.less","../../src/less/modules/navigation/dropdown.less","../../src/less/modules/navigation/menu.themes.less","../../src/less/modules/navigation/breadcrumbs.themes.less","../../src/less/modules/navigation/pagination.themes.less","../../src/less/modules/navigation/pills.themes.less","../../src/less/modules/navigation/dropdown.themes.less","../../src/less/modules/forms.less","../../src/less/modules/alerts.less","../../src/less/modules/badges.less","../../src/less/modules/tooltips.less","../../src/less/modules/buttons.less","../../src/less/modules/tables.less","../../src/less/modules/grid.less","../../src/less/modules/js.animate.less","../../src/less/modules/js.sticky.less","../../src/less/modules/js.datepicker.less","../../src/less/modules/js.modal.less","../../src/less/modules/js.tagfield.less","../../src/less/modules/js.progressbar.less","../../src/less/modules/js.tabs.less","../../src/less/modules/js.sortable.list.less","../../src/less/modules/js.treeview.less","../../src/less/modules/js.carousel.less","../../src/less/modules/images.less","../../src/less/modules/utilities.less"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/ajax/libs/ink/2.3.1/font/FontAwesome.otf b/ajax/libs/ink/2.3.1/font/FontAwesome.otf new file mode 100755 index 0000000000000000000000000000000000000000..70125459f7d593b79cabc75bd60b91943aa65e93 GIT binary patch literal 61896 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 literal 0 HcmV?d00001 diff --git a/ajax/libs/ink/2.3.1/font/fontawesome-webfont.eot b/ajax/libs/ink/2.3.1/font/fontawesome-webfont.eot new file mode 100644 index 0000000000000000000000000000000000000000..0662cb96bfb78cb2603df4bc9995314bd6806312 GIT binary patch literal 37405 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�-A&iY%khEsGVMaq&$BJA^QAs8x>7-g_ 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 k3oQ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ajax/libs/ink/2.3.1/font/fontawesome-webfont.ttf b/ajax/libs/ink/2.3.1/font/fontawesome-webfont.ttf new file mode 100644 index 0000000000000000000000000000000000000000..d3659246915cacb0c9204271f1f9fc5f77049eac GIT binary patch literal 79076 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 literal 0 HcmV?d00001 diff --git a/ajax/libs/ink/2.3.1/font/ubuntu-b-webfont.eot b/ajax/libs/ink/2.3.1/font/ubuntu-b-webfont.eot new file mode 100644 index 0000000000000000000000000000000000000000..cbeffbd97b0fdb9d398688fdb80f495251c44e0f GIT binary patch literal 22373 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ajax/libs/ink/2.3.1/font/ubuntu-b-webfont.ttf b/ajax/libs/ink/2.3.1/font/ubuntu-b-webfont.ttf new file mode 100644 index 0000000000000000000000000000000000000000..864f6263b2da7c3b518795a32968b9f6597980f2 GIT binary patch literal 47568 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 literal 0 HcmV?d00001 diff --git a/ajax/libs/ink/2.3.1/font/ubuntu-bi-webfont.eot b/ajax/libs/ink/2.3.1/font/ubuntu-bi-webfont.eot new file mode 100644 index 0000000000000000000000000000000000000000..0e5ba8ea54e3b2b6943a9003e8133f0f3186b548 GIT binary patch literal 25337 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 F;ZUM&Vfg?6 literal 0 HcmV?d00001 diff --git a/ajax/libs/ink/2.3.1/font/ubuntu-bi-webfont.svg b/ajax/libs/ink/2.3.1/font/ubuntu-bi-webfont.svg new file mode 100644 index 000000000..b38e1a81f --- /dev/null +++ b/ajax/libs/ink/2.3.1/font/ubuntu-bi-webfont.svg @@ -0,0 +1,245 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ajax/libs/ink/2.3.1/font/ubuntu-bi-webfont.ttf b/ajax/libs/ink/2.3.1/font/ubuntu-bi-webfont.ttf new file mode 100644 index 0000000000000000000000000000000000000000..1bf7af6dbe399888c0204c1df3fe3d71eb14c6e2 GIT binary patch literal 55024 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 literal 0 HcmV?d00001 diff --git a/ajax/libs/ink/2.3.1/font/ubuntu-bi-webfont.woff b/ajax/libs/ink/2.3.1/font/ubuntu-bi-webfont.woff new file mode 100644 index 0000000000000000000000000000000000000000..0930e68624e24b6568ddf1637a6bfe75d11b2c4a GIT binary patch literal 29080 zcmY&;V{oQT6YlfGwr$(CZ5tcg)^2QjlZ|cLw(U)_v7MZ}^_}zM+*Mc2%yoD7u%^0a z#zRp;0ssVje@^KD)c?}u>;IMi%m4qMgoK(r001ogX7T=mVZiFMq?owGH#hiQrvC;D zC@kn0EFtBFaJ(=i=}c`6jd3&|AQ`m%NTsaDANN* z%GA!-5dZ*V`<9FS#y^QD0D-ByD-i$y{$CxI|AD}VRQ89Xg&hC@LH8|F_ifKywUM#J z!r0|o7jpMo2I~I;$->s_$2WHZ02m?w0ByZQs8ubN=Ei0Kz>nu|ng80y0i^Sfw)`dm z0E=&X0FrNzAss0Nde{&H30pwcgdyM}#D`OE3%-?yySY)%-f9a%6gT3dvsgaqH z(JrV7Jp_`Gi4kz02SOs$J5++GB4Q6a{v&%2T?>M2=6i(kz`?(D{-3-_t#PfXkwP`y zxG|D6qs-Kg_z7vcG1FNiBj7m8`xhcvZCxM$;E@FT_Mc8yysRRcFxs!4VxL~5fnX>U zP5h9^anU|VIHO@88MY-cJnTTf84J@-CZqY_2#5j*-@sr*Ft%OVSITH!f*$aD&iLKa z%-DKkSsFL{t@fuyez)2{6aU(%oHoKkE)G1nn8eW{%HbR85e4^Gh7<$M4q30?ztQ@) z31U4lzz5|px>2^@YgWs%$=v<&28z0;t}wm%w-}&%Mo=H$^xK&~m=~_7FfI>xzYLnG z#tW|ylyl(cvH!V{4p{9&ph7rAE5?Gm?m$C`4tX)CXb{00Ynau}8u?>D(8nr`LznSU zk~<|9%1x0V4`nHLqSrMje{$8#(L|W=MQTs+m6xf?InQ`1QMAOKHEa1qhYi;uyds=5 zxK+=#ITjMWMJsD z4YRTG9bwOS_0hR>9-`mTU1xH39^prIT11#@Joid!Xdj^de(Bfjt{V!a;8pS0ZSTHQ zt^P34zvF1iEUZ~>Jw5rIU%(Jh$R*C$BY(e&+>>UPZ;`Etk8#Y{tYP`R^8cIP9}y<& z1HI$D{X9`i=|Mrt1R|`4X3xWey}iAIQ+@rD!-GSEw}C;Y0e}z@Hc+%yu2&uwDwgZd zAI7q8X~Vs}-Jv&CAfN;9OcD?f7^=(mc_`ozKL9gz3uMl~VGEF0`UMw*6nLMIAqI@Dybq8q887Q@x_ph@ri?84Bg6}=oJy(LEJvD^c zo{rCbL6C2R=U%mUeZ!En1dV*PtpQql*k`PzywZSZTO`KdH94VRXnCMg;;)pLoRFlb ztgy5=Lm?$8EipAYJrNZd9SIEu17T%pZE`2vx`b%{Nnn^F6+^Jdato)xr#04Pd?VCEGDIHlV zx5DS0?QdgKcB}}5ZSEhBIk=o2%y>NG*N1xr$BbCz_FLwb7j~y-xlB$fUyY}5s>jn= z1CHmO$V#g0NT7g#;Hc35b^$PU@F*Z0&SrEjSQobSr#3-yb;eXh8c^h1&GgxKE6UseKZDv%D$>RIBAf`Az z6r`FO08fQyXED)@A&@$@Kkmof-acU=vgVR`tpP{;4%CR)^1MMhjU}IR?=Ycn?}T@} zSdDB8_lrExr^H}?vz%l@uCS-tClFtQm-bAUmRX$tTj;$wZn-b9%;lXepZH|2w3cX0740lS)@E(LVK@2CX^yYCWHhl4A z$=f;L_djdn^?CGQ%kn&rhOT2FoA8=Y2SSU9NT|Pr;>>i>K^&^Q%?Kq29^J$RO$^^ag z(N(iqB7li{b9#UMY5Esl(TOQgPr1-jr}N*^00MwtUjRhU^~ElDU)AFjO5fi;H3D{L zx~b&aspi_Lzv6$NpEs zR+pwbij2xWTav$RDodw!;*=}PTJqSBtzu{;nV{Yy{^PbpdQ{M{j)uF-tao3xtCU&4 zT$gE==`UYCNw^6%R=5t88%(&7(sY;vroGJM$eMT2qEfYYRryHMy<}wW&Z^!G>J%35 zDhlyy|HTvLS3U_vR$aQ3#IE_gea7m~upggfpoU|3oi_x>%I9YH(K#;^N#myJd8NB0 zDj2EIFw0cPc*cFVp_WaGF%?x9Zc1iwsvxKsOQFN)@Pd5Pf{q zTJR#DWTcsQv@}rsFz^T@I#>nNMWd`_DA2-oXy?!pja1PTeeqgI5sa0l1t~8YQLzuH z$r%-LP7PtI_2nVkVp%qrSXfngF$&jw1^Xe?zZ49$wWYyiwHk}V0&e31!Uiy(VRCxq zX~cfrMJgyMDD>nbxn3&}bQX+wz$Hy`l}xg#^#&Yz#cERBxq5s5`r6aW07q7l{1+iv zL|T4wkG+=Xe)J|aYH+rfYKGH3C-65Z$c{qVJK&1dQ%#O~oGFD-#$uo*7 zW*bfIJOP_v&g{&yWQdj!*WdgvWA{0jYvsHI z?n~S#9;u6~6HJ>vI{)xAJx{n&7vy}lXP>(y9_P0pBp;U~tQO$#=8i^NI&NqY)&AVS=+&VGBI zR!x?ScF-I(IG$LIy>)+C3sqo)!d7x^<1>5#*1SA&K0h6kLpXRWb$%}q2Ix_vV>x^H zk)sZ12|Gj`wgN4_>i*WXj$RxElCc7Zre=4m3G z$q~DDUuHy@W2$dPt@$`^8_d z2f~VegH!gMFRE8RdZu!)yzL9uRz8h7-rM)q(@l<-h%Yg3tOMRM|9aMU+HJW#7SH$+ z=f>~A(dk02-|ogBqC*BQ-=$+MjJ~5M-2!q{%}f8%2ywV1^gqDl{ZQ3X>LS+2C>{<` zr&)CIEAKODFn3k|Lr1Dy@oxboBR@NLwR|6jT&AQX_&G&Nnoy;lW;$q|2t&6sRwFCGL3=@)fGWKo|+xBPAdNu|>1Q5;P1bmCCQtg6+dz z3P+jQ4C+|T=_2Zehl6Mpu&!HLt7MCmsptf16EMGYD2mrXJSD6jyOIc67{b4e;=2(z z>{YFU>R&k2vEM2_MX#=W-7K9gB*`A_132sONYA7Y%Wz(%!|w%)7Um;Fb!+Ul>f-2z z+@$TZ6PsPE&0+aQ#%9B)wvk*G5XZ!Ii~7P!%kiiVKRvt0tmo>>M`vf;M|Thv-!9we z2Ng&PPe-n&cGf8Ieg395O7f6&ae%Nb*7LvP%$~y6{!{fL@)EOzgKcvN_g+X|1w))W z#*v>Xr^{6mM=62|M}-tOuh_MYfczz{KC%>ou~0|8O)@R7_6ajxb8tUMSaYy{Csh9~ zwt-&9$w6kPlO?X$$P*=RQ&!`n;4O7T_#k(^_*xHyZ_Duh-;x@<|_)fEEWr0%(hXXG7FsZbx<-1VImh1 zJt1jnKPp~|8%gOA5JN5k#|UF4NUSto77u`d*o!VZfRw*;Sllq+$B+i+y59j(!9GrcgN#*ip$X1ipD@v6~NUL)^^( z+2f77mDd9BAE<+}Pjof?vof3&`4mK^P%gVpNPnfKH73 zsyW)(b5C3C;bCDJ^O#cd_ePk?19Q{<9v;u^(p;UFErYLr2lGpyv>uPI(!!=L3!q!@ zKv_T4J5c@yAnlrfH~~rQN7asJr;7|u>h{J?`)S=C`;%)lpWn04#cmfqDI}ucuRHQL ztk50kGp4i`kR%n-dKK~0U2t;1c4uv#zo=SY`$|y}gOdSu1#6S=tQ-v(x;1+&GFzZS z3Xb-$*e{$xV$L9#m?%l%ZKZ+>o7e59=8>5|5H7c}2S?tXd4rv8dQ7{%%X zGt>Orm4xUR5X1RflztCo@A z)yVU*=TGP=feDG1WaD_yQK^9LgGOqEf=}TtCh8z{dK$ARr^_Lk2~&-fT{F?5fC2Wk z04;RTbx>xaj^jqLh05abgC#dZ=cnk%+LN4o@n~tZfj6W?i_2GQ6PURA;zuQfUzvB z()s3ZGvGKYlmt?qUPxXhp5}46kkipF@;27W5%%7EpkzF~DY%zL(exa4^nyP)=|49i zj9^#@bOG_}yjfo&o6T6ug{ZIhu$V!ge|3l39Yrlyi3~}P@^$(0xKbAmZ`1zI2477B zX@#0n7v#5q{H1T6BHCGd!Z9eZeFL(M9&VI>bnTpjRcIF{1OcZ8k zpo_T0NN}?o!*LbRY1#8$MO$ZI%8lM~AQ%3^pv2)sA(6YgePQzc|OgIYi zCQb+y*)ug1*h#fmwdm+w$2r5uS!5bRUtYQscKBLI(Qqql2=y~g*6#j&&?4B|6K{7P zf$AN`l&7hBZVQx7brPf0t!_Go??0<=zV?| zdFFH0wxi+J`LY}}*JTDBfqW;^-@WB3&O;oNV!j=TP1F-CYKAKDTXnn z$+R785J^h67;xf*030w`s~WRq3=g{5`f^ZAClVPBmz5d;Pt$?R=Cjw(4sXSmQZCLD ziY<@l+PXGnKD9f#xXyH2PR_b-pY%C{9y{|!7CAHMc8@C_p)rD|GPeKDtuG9uGp#u* zwcD6F+e+@r5@MyUqMZ<)Z~u=r z!a;$JURU&DCyA5cE)9J~DdU|l$(i^l+*xM!r+AHt3{&wX5A8^XObl!i13YA8P=wlWAMIh1$*Ed<{f-XAD z(iPn+!MWkMg-O0-yn^Wetv0V8!3CJx4mBt7>f*L^GVu}PCo zS}jbj&#&PNJeJo5Ipx4#B!3V{ljQ~kK#<%V=$~Y^nn>L?XRM)R({bUvu;Ug5fnr?= z0X!digb@QKJ7eA6AI}=o%_lnOYtNL4Pt|PB3a%mjhT-tkKWw2#}TmMW%2XiuG7O-N0 zVcgOoiKwmApYrZHTt+QF(m8LcUz~yL4D5JWyKOwGH{ImERq%A@Phx=II)1EoGX!`_ z%TJ<5ot!glwJG8Gel~C08GeWmy-anO>HJOxTf!cKF8*~&3=P5mI$WB*C=bn^63k9_ zQec8hrx;K)i;lrlz?4Bv3=-X|HEyV4qJ~}8URdb=ryEHE*XS_ zyN51hauSMh$d|`inI2tToXwkC?F9#?5!Il_xi|tyJ5ynub=}4DGk#C2nf&vD-Cx&f zUyqAQ6}5CN$8E9Dr(1?q#)zEmi|%zeM=}nDJ`2abyMs1kh~a)u#|Q@e?V_&-XB!}& zfnSrXv|r3k%$6OWjTpYGe>w=f?WdM8ySpt1c;{KK&i%bi2mb_28R2{8UW;w@kQhO= zj>at&ns0Gvy8}L{nuFju257c&Vq5->8ub0_>n9pyDiv1BUNoKo64okVM2tCny=bzu z()PBtlsQCSr^T^M1{{f zD*T7_pUvMhpwQ#U7=!)6$MADd>&sA|NHm)-&D6#Mr7RoCS}CEOF~=V)>R2H{6yhCc zk+qI0%$F^UV8V9e}=<(?H882 za=c2`)GdAodo)`A=tf)795)2&UBj7d!c-9%SVlBm@1I=pQUrX_>ByCRG$3qxn*MMI z&bOUhWEvtkNWi1x)o!4Fa18Y4)^PrU(75*m-8sYdw6EN7Rxe`{_s-Ohh(9Z6ns|?j ze2@V@IkE{Xnx%ARm7RxLN=%a|ZEI6Kz$p>IFLXy$i=I=MA}7_!W~vMRna5m=MG8Mo z6Tf8*6CuadpF%=fX}t4Gyh>ofbaED z$I$!;D0{j4RN8kQb(uk&vCZVdx|Sk@B-wh~$#+KR)F=;HfhbPbo+@;8ZN#gsSNY+N zoQ)ZRdH@ak$SDRN-Apz$mwAU#{u-UP3-!zlkx-|n+*_t)+t$xaA{v;`t73Z7*b}_% zpJ|LO+Dj9pYObAqn+otrh3{Hxcq$O(->8xH`6@crPqcxBl-Tj@oLJ%aR`^0PQw=@6B%#_ap88Qr%&)rYN2sFTE+Lc)bFU|}ti{{yO6 zeD>rhw8T{UDO*tPct8!x7d*VIv`!D%Gem0F++8aI^yU!VdMcU{f;O@6K>GSiV19~! z$@4=9)yARq^YeI3Up_KtUj0;GIuSu8E#s6qwjYaqGP2QqPE3$n?Ed-4k*2yxj;ra> zx0_EzPlkyj=yx`IrxV_mp6Ec3U(e0!p2o6Tzz3ob$!Wc-PP?z42mz`Q82B&&U+E21 zWYeKS5gkMHxHb%%aGya2`49um5IHur1W-uS3R3+<9{H)iCUAVddt93^y7qSF9sFtq& zA#8Z^oo=2hf)`e@j6cO5ev1;fBOy?G-R?d7q+jj&y0FTn(o|{Vj=$+((xbj3AEHTi z6zH=`VDF_*2q{X4RW-TCb~Qkdf{hOZS0BX@W6v(%RWt8B$ta~ukI*gV_Ux>F^+hl@ zk2TJoFzyp6g+J)j0ah;VB463ud^_!QsI4;pS`sEUq`F+iyuDfqx2smY zKJb@a+`=z<{2jgR^`QO^Ge1~)9UOW=+p^(%qH(8#aPouWxjq_kvwT>J5K`m!ox}Qi z><(*xqBW%$QMZBsmWNIff*^uT!JKmkG!KY&^U@}LDnf; zf`=543-BD+@MSocWaFStVab|yX<*>GIfd{dn0+EDHiImelnz}X;%W^ijk|xRd^?e# z4d_6r_n!9AA>jf`t^=(kcFBzbC?A8+sfK+9$~Zh$9m-vm>OSAgSX0l($w?!&1?3*9 z$lBqJ&J!V;r>2<}d$a`PtJM9m0kUt>2&G{6Glbv7l`5=&XN8%HnoTtnHy~lBtu&=) zBGg-Wbi^d+peakRvJlP~?%-!1dLM{|mXgf~WsQMvSU0$hSiv;V!0N`cbNjIb$6IiR z$$pG;z>k(-&t?SH7NNEA;O6;|@DnYM@D6*ps~e@&FjBIvQ;z-_{=nRy@IA|UptYwH z4h)b>4-435^%NMgx?ZF!o25{>=J(Xdl#=rVM5_+0AXu6Jr1h^ zb9oth9g@X46wbRs2$!Mj?`ou(%;mP1DG_&Hu^TC5yRqX-d(T@namMOuA45o?JIbV8 z$NITW=)h#NqW5~exX*kV*r>nm{>& zTRY1dzFMAJG=Jtd%6)zABHFANc*+hUB>`nm1LS_dYl6TfB{LwtjS z!C5M^;4X(b;gqST#Vr>0;os>L(!5gDbF~t*Ka7?oeM)tX6mfgg)28Vxy~+F8mCxu8 zVKw}YkzfJsNB2)1SAygpE2y3#IxUw5pZ9-yt}aTR zah*o5`-(OLumQaD@b@CK~Ka( zI=hh<+ZGxPeY;6ui)nXBgKeDk931nzWcZ@XI}qfrQmH` zY@UMp0-l`oa^m@V`qQpgA}d>EfLzTVmSbH>G46Ons3Ay!F3Z@|UsyXdCf!u}h6i<@ z37#Sz3wcY$wV`u3Yi(R53vyy2%h-Onq21@>G#8(;g|n?=WSNpywEeGF7Lwgz`~ z`>09HuWo2VVr}!j_dtJYquc4XM~v(1ELL50r+E7v69b&y{{f!G*@2i+!X)V7*>G}Jfg=F*G z&L^vj_t?8G=S~Xv_i`nAc;`1D9C ze1;UVA)y9g)pP?gtGb~rU44;fK=+6fayzWoo)j-& z3IAH8io+iY^Q#-9S!;)~4Fdqq;7O>maUwJ2VE1i$rsnsH zu#{ZKD}@r&A5yO+df8X$xOu(Z#U;Vp z=S!aXt(&BkfF5<818EI#G~TensCn+w{aKudbm`A!{&{7qIJVb)R7Y3BjBW@dnJB+oMa`o`1JR_QXbO~a zkvx-jC8bNAutA9Jg?j7mV~hs@>iopC=sy5Q$U=Y5j; zGBtc#UA>&1a>#jQJgfd~Lh695H^C$#aU&4D1hp#Eob6qUYOOazV-G{yQfme)F)%w4 zWv#>WaYS=VFBR~O6lv#U1vuzTzF z@5ua%@#&vv7n>sGZtXR>@53b!<+w-~a{0eVN3JZC@K&%tMpDtpoo&kwVK`&^3bC)P zDG1O{Ox5XMC^@u9^-~{_-QY1c^g40kf6M-vr@}0J;Pzkz!JPKI#^Z{3Epu`t{4tIm z;lCdD`@BabCSN=V3Og5eE5AA6hWorLhY5?LYLWIx*l~(%oXZ)A+7>T5j;7Ywe`$*k4Fl zRUT^VtrPMBl>3xdVd&I7X7FQenOeF&IZKyu8NbtLVD{SrCX1p~LX9Pu4b3ELvAh+| ztfNfDe5!-08d49Qu&ic=Nvgy!52a=?Lv%)Wr={;xKmxPE;np-fhP zUs53ni(J>;4(Ps$Ss-4AAXhofd)3bX>sqv`GKH!U5I^bU&T=-Ltx5uL#FJHdw2xXF zmWWssxGyJpYVc}gb2*h5cVIM@BZ2sY-wt^;{%nx>$P3FDL~6q{iEacan-~JT+FNTD zj8Nq2IGx82%(k?}Sg`hfP((&Vc!9T)F!_%x32Ei(H62SE{L?u0hxYEnC>jOH>ffx| zx*YruM|CzMD|Hexg0*}bER7{DMqN!0-P+vJHS0L>o zuHd4f0#kF>yiQkjYR(WLj>{Hzdm6GnE$^D`xF_W%?g@6)i5mjF{1Gy8Yar}kDT6Vv zFfuUC$4@O&;DnlbYqO=54?00^tAxfh(yWhI~{~ z$c~TQS<5#s2B=&fTTJ+MPo0ytp!zn8rTXsmGZ>2Ac&pIrk0yRFCw~w@Gk%&p+b4fK z>NSj|?C@;j5<|Kh2sCRHP?V4mUd>>9VW54%*FUcSX0kXhr)QG|rCu&9+F9{tkQPg_ zGiNc^n8!+2#*UJ8Apv`OBiqS^S?q_mH%|j_6&54w~*BC`P(pHSEl5y&fgXQ zPmRo0f<&t}Q(HcFIkQ#&v~t`ky+CLy=f(T4ZA zi7Dw)i7~=wNwDKOX~g1y`MSu?@r;Rnb9iv!u;#7d%4YD;eUYa^bQcAa6_jh_LN6TL zdI~HA$T13RHRWH^<8}oaZh3<3`yE|#=j1&C6kJJcgpH<_`(1|DO39IUF$uu15k# z5dLDGw$>?J^|mrEEx%Z6>++uNduSDdg$Y*=waCSsIZpzl?j2PLG2Bv5<-GJ4UUn;~ zeu0{fYipBs2{XyT@Px#3LSMzWAgCR?e~&bmZjK@n!;F#QhVblh1}wH`=7SccWSX2n zlE%dx-BRo-tEyD-zIy_E;o}#KFYzqzJbLYUvj2x&6T|kNbi04`A?XUa+jjqFf;s=z zN?Zf9Lm20BwT8Y=#yVT*p05m|5hN>Xe2O_STRbC{v9OU_qIm2vs5w{aq!2rTL2vHO z3Dpr!adArl`|mh~5<{`nkO<4@Mo;L0_svS{EPa3)ZP6Kp!ykUFFZGwv5dnYsIdt1N zpLO1ognzD;H-G;bS8A;^B_u4hP|zF(ty-6WX=*VP(iAt%;9z9{!_3xcChbr< z?9?Ns*vduXy>XH<9`G>jOXA@CiWsg<*)Mx$b<zt9ft`=6=i8sRB%&N zD#7W~bCfbt2Yt0s7RK_O7=9NaaLW+jS;!hhIxfTD{QPk`Cg%@zM9ZMrJN`mUqvZhK zvn1@z`S~JL+u~9u&tt9A*gDmMOm?<@-8+_>Am~ro>~gi!JSfp@3nL4R4Eov|hSUT6 zH8r|4QNf|$hc(rj?IETy;?J0G_l){yEUQS;?>bmZyfU;nSjxCxmooc2!=dBY>~-d1Jj zG`SsUo9-Sy9c$SIE>4B* zN0~V&2i+J1_NwKg8~ru}dY=KwOy%n$5%TNP4a{yjAC4mkVy-gOcQ$(U6=#8qYXI+s zMJ(t{mDHS9seh>j2xM$g6wsMsD6B)s2+b^4Q%idxMG(hOS6APm#;tcb&@_HF09W zHz%4ByneqC^B$d>yivF8L;6zE{6xz--Gj$Y-Z2Ab6#kZ2<@_#jQ8;@CfoH!QHKe>= zp{Dh%a&kKsZfiRp>?FKIctcdPb<={2Bfn`Yy&rktA-x8TWqk+G z|E}QVF>ANTQH?yyW*M3ix&bM4046!zQJdSn)aRBw)cb=0lYef7=yovNtFI|d9hY+% z=&NQ`$|jw4Y-RCY3AYc@z*d5%);lsNNetUt^!}Y0M>U^q*X2#3oS!+2xOX{@Xq?o` zqP4JyP;mdeaPX+{@^-5{c(Wih^e|$AnATLhE5~p^#Y^)X3)&OxYA-s)RYZg{3|^5J z+~jG^H(k&I1GHZzxNr8Rb^n{>fIpYWxIRc^U9NgG%dC z#O&UbxmfAdS>wT#w(J{A1IMI^dSL9IUTrZxvumA(6IBoH#-`e05~`gE@A{Uy&Z63q z$kE2rXdOFd1P%PDC)<7iM#(&3`zLgV1S?-|NK2|K3t42MLRd-dQphB5L{nPt*qE17N|BM zGrVr0Es+_M(jZAPCvTxQH985`9O~v)_QbgpVGsQT&cmxGYb$tM-S+3l1bLNqMf)QS z{tAtj=u~Ye$)skw8dZZsI1i!%*klS@e>y{|rZER)muxB4#4l&B$;0p?8m<<1z&Cx6Fyp=Z=T3d}}vH zpCnoWhRT{tJ=Lp72cG68m$R;@tYSJh>6$6kljhYwRUhzS6r|M+&CW$b#|U70pTo^Z z5Avj-ZWf7{jk;xL0>+FIcM6oxO#=RIEeFbMe^KRYW}cs-DLJ2TG0N++BV_fR z9ZXwnTk!k(t3JwFzVclqOFPvj_P#uK0oiT%ubBs#W82ihfvzk<8&YFC1rNrK!&lim zOs?}Es$Ppx0{pn$xlT`_H%j_fq*$VZ@*lzkrn;~!ZR8>oVXWfPVhGt$Kl2}!qes&% z%^5?Dm`{bGIKowq=uLrhl-lyu#FY2D>)jypcs|bizhG$0rnoYfrTFj#55@*KTz$mC}$vRIglP97u4YkkXl zVHFC+sBxrdP6k89G&cFIGN{e^5)pJpMH-ouQOr`j)=&ICa>NstaSXTD0Aw(>t1h+! zVUHl&Jtjx|MT9t=1eAm}yxz9Axw)9JimvAgkJ;w|M@CX$bPLMVCn9Bx> zc`Mjotz#t`JT-Y0acUFV#Q)3<;UAbk(tj(oDWFAck&(o92E9l_$km-xW2L4Sn8A~W zM72a_z*sn1Akkx%q;=rRjU~2>Az>z~&#que74=HwYzrh5F@>1>6gmiA?m-y#h9~R$ zi$mWA8poM16p^2Bad9Kxp(7K?I)S37@A?&AQ?ML$crJmub$SiGKM->9y;@ z(h7*FWbBh(%8L^c(`0--w#H(B2@^pvVpQ8{ugo=kotR(>4YWy)b%ZQxb}V1>?=M;H zx1Vq#-!6H!hq$96LCx0FUYrHX{vY^D9g2}E4p?ilZ)efBS;BgjMjd1JC_hq8xI5b+ z=Z*vYI+18{MK}v-&??9jKaGs09XfP?4quol@sVZhsQTspSnQ(HQ$%dxd5&~RTkx_TqL_Al>w&Hek43RM z9VLR;_G#1Ne8yix@NrAql<=EL)9OyrnXEc8cU+rtOC?st|6C|^lVb}8=F<`g!U&jY zQ8*?7?&EcC6$`;wIZnHF4~Gprr-_ah6u;e29#o8cavbqqG8<%;G3#_=m5V{i=t(m4 zP^3YkT2lf~aECADM2D3d-3CyF$h+8>vqgmyf;6 zeK1>wqaWG|y~p}9dk3L+RW?>Eu)KXM*u3XZY@v`u&t*MU&^=#m`Y#5F?oMykQ+g@K zl~0>KuO7onCkZJ!UZV6sm_(EN8f$_z9Aj+IPw;g2`uP{8C0(`3P>|5qT~W#Z-5Yr# z6`KsC#G&&roewk*(Kfqs)SO!*W^57|_R&_SemYF+ZH%3!+R-K@h>2Y&NTA|xXwa1> z&y+FFkzJT7UOz;K*0CZ6Ux^|ELnHCjI5XhBZ?}^$3Uu6YmiqVWzC&mEOj9r6SPetqOwpT^ev z$Q#Z4xaIf>P08+?8BRiOKWS&c{7Vb19AX_m4E3Q)p>xJNy9* zC(aZ}{07P9@kKxBHskOcHP>{cbIGnBpQ>r6?gfoAW(m0`UUj4ek#a&bg8J|cUd|RV zr|5iy3{mV+z)V$yh zd+V>xhKs3?GuUv$*Q&Dpr|RHUzqqZ2@-5RYOGXvxuMo135wj0pi1QvwHlXU_# ztN9C8z=^^&3Na@ZYoO-Q*T<$bJ(9 z4TkBGj5m{mdkVJ(CmFc>k^yY_8I)f#`iBx0#gkM#eWXZ}#TIVf1xp%288P&kx#Y{f z#d%PIXiSkm5CoDd)ZxO+N!HJIQ>vwRHVxT%xv4~^m{+r`A zg10{YkjgS1Ax8>8e`5)LoOTvWH5&!;GyiKOE>yagvbj zx5~ty$*ydv@d@c!>!4BvIG$ouO(ZwLKhF)8lr74%H;pPR9#wVUhz9PqC`X;=wO&k1 zaYUD`XBp=sZX_zrYy&XKb;u( zvaMxsQRt`kAOu>CsM*U%c7yd(Fywk`k-m2orzX39SdbW41Z3r=UzVP+`$D`ZtV(3GM0~5_AMB%HM7B1-LML#t6t1tWsOh zlaKBTWvf2eQ$(KL&%E^$z5>7ZM9e?_*r4&wv4t)R?95cHCM*Ru{3aN$ENGOzE=Fi$0gm|L4^P4 zBJ*>QOEma+JvB$f4>0<;2}|uedwme}vRp$ndtGPNOFw5C-jN< z7-Ai~ogYtOlqTdOl?vc;+VP_d*T(u>s*a7-@4+GXJR0!W`M74}#QzefbLclZJH4eh z(9%nP3TC*KJ+w*Q>V2Y$Wx}{#BveqXK`T8f8$9#^qR1gMXyLOWrKy3YE~T3Y%IQberCM?z#}Z z93pV4oH0siZo(sUUTg_osc-u~0lP3n&$srA)&ix?-RM5Uvc9GFV(gabQ*7cRjDpEw z7&EaEvr0pcC&}c?(uqf31CK*KVY|pX8>My9*m80?bC!;?F@yXmt`)xHb5wgOXtyze zo$fW3=`N-W3p{mxrgv4PyYdKpMme&RoX9G&dWHdLI#tWPl9Hx|*jB<^FDC!}f4!d< zKWiN&nHJ_?)=HWWD`{e}j>(0!o?cAV;fWf0BUN34Q>re9DaBw)OK)0T6G;ct3jeOA zQb-!a2Dnin->8^bajo#$kOT~&w|nO=QsBa>Fp3MR611Eo2CJ{88gwkKJ8Y{d&RfUaXE@8g=u`^?!gGff}T z8teOJQ`6?YSgdbzQ`0y5Vs9-823uN!!6gc|ZRiWZ;1`D4+P>Z$40eCLE!NNwgFje9 zeYAfVLwmP9nnvR34kNjG0N)DDl&I8HR;G9b$_}3gvZJd^DR{h6sNhOnN%H_IFePAw z^VHbXabbk=TMsY`<|O`aN5P%a+j44w*it|~RT`mD`aX4=_gy8T{X z4fnI!Ywy;Qo^E36COvi1k#6aC-Pq-XJxCbrCVPXyuCi%AgI&XIhP6_{G%+bNZHuNu z=rd8QW2(}Ao0fJ#Md&CNV1qPI32l&8OdF&XppG-k4brl^lPFdGs!ZaQhNjNgYuEK8 zTS{{RUjJZI`_31l{Vjok^{zzJrzAZAc1`^Q1N~ue-@O*6Csg(Hh&|dBUq04i@_Jpl zFW^{TWP7<`80&mykfGaFCd@h}1nX~Jc!H
`E8xpXZPAw+5JbEIo6+%N;|tmMPp zRV5hZo0q8+5(&n@bMZE2JM-NMY^_g>N6w&W!Ci}z8w+jy z@s72N-CkHnYxwo$0LRM4ZZj245IW!G@< z=x<{s$FmIQE0b%nX<2C26?L{*0urRuxKV-(MlrXLc6m)%3+yxjrE!C-6=Dv880FF} zg2gSWnesxsq^(HPwTESXM4PRoi$r#)^=!P`*^}hW+EEhOt<_g8UAc9etNF23K!Uj@ zKhS8$^_RTu-dL+M7TplS%tN5r5e_RPwk8;z0@PUO*Xr_LefLh+rQcKcihOf z*S5D9O;>bEFV9~&!|k*k!+x*iDYlL)0F73H=okAI-MZ1`>{d>{%I+}4E}7N0>4qdF z$rKZiQMD_xCaD%z%8ir_l~j8dfSWO{)0?amj`FVbXbOl=FTXyPw;d&Ad$%?4~`HtKu0*^RuP_Kor~t+F&t zxMkgy7oM=DDJIuD7#ws@DcU`?L#}slU;$X3T<>6oQ+1Zz%kb!C)Ii+HAz|Zz$K>M~ zizk>L`ipwMwK!-Cb=Uj3$5%~0-nW1Is+S+@+y8xk*r|>7ZEp2N968Z1eT&9hwg8Uw zWpHGiaB&Us(c>1n@GiN8s9T6jnc3d@MOYSn1lNTv9kkN_n5F-S`}rt1m8@A4VMPH>L6x zM5t;n3}c~z+mD*R#0U=6oW#QJxW3y#3KE*3n_8wD8@oNs_#_eeJKzqUIRZ5GQ{1tD zsb!kLipmuh$r_N|3hZT)1x6-n>p~6?;&?p>ajh)G)s?BbS|n~=42WA*IWdpN&rHmt z+?dGCp;sB;viOt0r8&)nwCoBs6+%@7HlRgEx0SW7kTWr>dbh3W4kR{pG!6E5`ok^Bs5=(X*$R#4 zLh;h}4ZMjaWu{v@0+OWt*HlMo|Ft6KvDz?M?FisW?EExWLp<3x3* zPHZOJICh72Z2afa`^x^$rbnUcPV@lOe&^Ss_^c>^V+INfh+92BU#tqZ*$l@(eCss+E%3RSyd;c?>wfOdHvQDF2`TI znJAXy^b0EKPuw`)5WRA>doEV+6wngPDDnW?p$EfaRQ}bQ|IPHLKkTBw?QywAL7xzF zf+(~L7Trl`Z<9v26BGDbXBqCqhkv6kDbHfouHCPlCy}*akN|5b| zyfj*=!YwTm^BhbL24W1fIH9mobQDaDn;cGcaAJY{)`IYaiJpn^+3XNX0Z{rU#e&=` zz?I{Zk&pE<&@7Z|ID1i5#y|gXUnaY-5fXyBjUVV?=DKm__$_mXv#ds0E zOusSi!^;$WI*Y4tFDqW*!tM|Ld|QFN(B&)3u5BqQrMI*1%KV;(KSrRy+SpWHD2k=C zChV+_op7RFSc+E8C<>#q&EO8kp^!jUg7_SZ+;iAcaO zhXh=$F7Z`Y`@D&F$yU-sB9FMcV~O6HqN1AKMC&To9_h!@UTOc6H*^21;YcJ5e{wDz z{!?RbDJxTmm9)5T828=hap^WqYHn)6lyAT_h;;{=Tzaa(MvAU5M!gwPtue}5>mpTZ zkn`!bjUKZ+MYE1OO8mr03ZLXIHC=zYiM2Ic|6Lb5)_84cmsC~%?KnA3+D3vyTZZ2z zn@Ja`KPX+4rlhOV5$Pi7?3n0aJ6J<_boV3JQ&CFNUZ7RXwya*D3z^KXIptz!pYTM8 zBI`_R(0F!JMeGpn0ZhFJgI@TfX@PmjK_P5Rm4z1Kna3nL>1IM_2;TP4w?$1EoPYXG zqS%gk8Uy=h0vqwNTQ(T|`6Ia&O{ikQ=e`!+@j}bm^FB&10DI97|50| ziKP15?Hu?B$ zx*WK5Zl0C;QmD8mn*-by?YHdD21K^@UHM9FvUNYDUbXZ;{ zSBEmoBRz)ynI6NkPdSFU2S6Xp&pg;H%RN3gn3nacLpRGf&wz|`j0S(z=M&G?&h_k^ zJ54?XJWtF_KO@CBj;4&{!az36;Bg#B2goZ&cZ;q0#7J-(rzbk0kww&AnTe&|#2I;4 zuzqUXLd$&$~{)FJ+u(#e$*kCHR7BZF@P4|w*`h_Fu9v%gp+`|JG zV+n`gYl1Ka{7oE7d6f2!5m_HLDhq@K7q}btnaYNR=gv(x_TXq^4|CBKEdCQqi>?S} z!#Hc^usIYSvAu`ST8h2H@yMn7vp&yqW{b7dS3WDiNw-lOpLl-E}4OUl`fg0T93cnP~euk{fW*(8lp$(@zW9z1KnCv zn7Fx{CYjR%o1@1jiQU5M`b6_h<%UoAS)AO9QziG}^fMiEcH=Ccs~cw^y~}b!uPF8T z(=8v%K3iW-gaUW$%}Hue<=vq}Cx189hW{VW2VugU=aWY@=^ZA-{Wzm!GjrNU=M=cb zoaW6nr{KTBoa6w?9cT4_%WC;fvl`FF81lS&>AaG(%Khef35&v_AJ!`M+~?z3t(j|{ zwOR9=AC>1Rh8N805-UbA`jN!0A7bf(Pc`#7m*5>K@x(3G;~h!!iPedwRi;rVrBRew zJU5jh_=_tO0ok@CDyQrJWGc~UH6XG1(*zS1B0X#Lav|XSQtaR9Mh`|N1h|g|KT4_k+1BMo<4p0lym?L zvy)g3OCONJ7p3>44-ONH^e-rvr*0fnjws$|3V`Mz?Ak$lahBzzd)>Kn`o-7&8Ur5q6!S)FbGv!7OQ@l_-NY-?MkX`weK2n~ z_AZ!f-o>|{x95L_*Dm*Gn>pH~+w%OnY>#d?`G#y;B+tJS<{w}Z*eUOm6u{c3cyz)o ztJyH9+3L9|f`u6+pm0m3i6e*qD?#BVKNFR>Pv4{WcFyl@DRu1DI{0?fTYoG4%gQ}X zVGUV8gD#(=tEqjutEuC&b~P0VrN*uMn$p6zTlF?2f0cG(=WKCGUdZxm_cDxPC+*AX z$@B>qEYsfPgxN}CALiVt33Uy->Uyf`uuJ0H9pLw(=NZw3BlB~&9^0Jg zOiBOp+V|?WuIzbuu=?T6-X(U$&XX+1Hm%>)vHTZ5S`99i%~7|iqr0BA1(*BHDb^@s zObhd>yuV!xs;7kdu$Y4ZtEFKf_J&vhUQ>bmJM9K+UuBT}stP!-2;){htbCrUDc$0E zSA?dUo6^nMgsy4vbQ8K+S5zn}VgUPcN`r}dteSS$U>__eib$|j_Oa@XDTBM5T2F;`S z@%_oQq4qwHx4$zIZtZRj_tmtG6u#2(qkA*0?VcEVdQ~Xc@nB2K&U#lYR$UZq@VNtj z)w*i$K&8)j&g*K9I^)j8$@Mk016|FFTY}-x@{QL{WqROoa?excO3+b3Cd{mrbrk-* zo-5Nc!cWsML|7pAhXd+IZt8l9NfmFV>nQ`6#7j3j!fWYFS)mI{$go4b;QvH7)7!Q( z#e{rTJ5!h4d;4alZ&J&g)zNh5_g}tMJ5%lj*-HQaf)1dCJ_{XwBU|cENeJ__p32ao zh0-E&TUu03(<1tBObayDpM@H|Y1{oN$zjd5<4BKErIylTG3J79K@XuJEQZ0eOro}0 zsF>a}<&d4C&rTn|T&*f5(al_po|HI$QR1`EX-;?Zv(T;f7M|y)C8TqXJUr4o78-|d96Y$bzecE zPg6T36PxP%h4Zl*+~q;YSYsSlnDjKZ(JcRR;s1L^W=R4AUD1`>2 z=qZNR7SprHpGcBcpkx-wvc>SZs`-h}%$>RS@O&2T2$=-Be{pYRxM#6{PbOXdX_@nI zqBrSwCwmi#FVffQaAjpWan3QvZk$!w`7S2TGy-RiFsUeVCKwf~m6RdX2EmUir(8Kj zn>q+Kz>S(IVOb@{l5=SKK{+*{sEz6|w}!hE@m>?|dXo8uzXra@ATGt2muU*wBrd}C zI61jM?xn_tT(#cjDGf#y)wNB_a9tFdM1MI#B0v6&RYgMZ;JT1^To=;H6jO!|a$7OK zynQ``lxFueF7wMhE__P7rQ>{cT&xQI)v@~~E@iqKw;t^o`cGX+6Q%xOg#L7m8@5=@P=-;$|V_-I?xU*cy1_2mxZrXR4 zj*-I8N&N(z*tN_(bFpGCO|xRxDXiEDm%FAG6Z%UNV?)SbwKx|!Hi?KA+p$c{OOZ_) zpSz*#0o)GzLN&L+KBxlcW8dAh{F~FjzUe&yYGXIrSjP;^Wn+EX#;{^z5^TI3jY!M8 z`IzZe>bg1Y>{lx~I@T4F`UC8YGV7S9@>>cb$!jCYI$DIZks_ogELC5S8^~bSAYxXp z23#QYso;(EH}CtNt|D>Ui{B1L8j|V!~{3tDH3` zdIeW_-2<=3$%~nCSLDy(8R-}k<|3zul0m7@=v=S9ik7h!IEiX3A)~!(`k*t6_N0t8 zR7J@(>h=Vc4IE8fyNZia#^D{Wez3jsiAGZSUh}->T^IiCzD;bW2n8w|Ds2qsRVysIA1)Hq_jEBI@t(AL`w+b)skc$0HM|v!5L7-v8=- z8y>p*=@XkGE%%SAIVSvr%!i%KQYN9WOPhe6Qel_26(B>>A~F@OfXMN}RJe|AA3AaS z5TyQ0PCO)?ja=G^a6(MiO4U#F2|IZ@=m8FuOaL7 zH}3?-XPmsYvU7d}EIzOIZK77W&Pwj7K+H%*z zZAlPY6jS72<$}nyu@=g2%#Udml-C-sdM<_9(yd@3`m)+mlg*Y4OhmO}Ol8#qjlr5H zzd0>RwUgH#-;A{@;S$MJ2d=dYD>j8yo1!LU@%QMI`lWOl520-DH!C&*9%3o$D~mu8?t3#Y7A#o~lwkMO+5QkvbyD;+dF;3K$tH7&A`T#^OLLjU$uV`e0)Raz`hNg_q-1m_<_9)bR(%VgS$5L4(?pf zA0kgSlKEvvPhprl_x1xo3to5sUCn7qa9E~8K5*UlaG1;V`qdG^T{_H0HtYChZ$DhG${;d3;_%n&IsR_=2 z>QNvlTA)W^pr40N%jsaB->H8}5B9v`S0n1IuVOyS=~-BvS{X@J&~dDpjAQL-PvcH| z6?J)-xZ2hvN3EbW0vu%jZO8kl<13aTrGpJL;lg&=L%b|SZNTllkX|9r{B!Qc$iuUk zzYi(SJ!hqS@uXiVBYBX8F+P}PjIaFijPa1a^I(nV9>)Zpi#%RGqULZ5=+fwcW8crb zq@3lmM^HS_No7DmVb)iGjEGDa>;mDd4CxjqpFtf|MYMEZYt7IraX^42cn5%2?09wJ z)el#yV*+w9k`us@O zhJoii)h>`|>D}7CB6ZMkpfTm*xbERs?tT7d9EEGXCGe_n4b($QTN+VIa5dmNGg}iD zOIJmbl{Dp+k(BFDTQ}i11Lt;#if}X%pTvkyI^pCXZE`te2E2b|Jsby&HImmH3l4*P zNUnK=2YV@Z{LdLPC-a?kn!0t>IH7w1Ph>yO#2rwfiTorj)yhM?0q+dKOndU^MZi7)r|fuozf zdw0IbzA*C7)1w0eo43qZsou7(XKUxamkw&CE&b^oJYK;M_AyS<*ETapXCVloXKIQh zOK5`DkOXZ}5rqIi^TM#`A`WzgK_3@_2`IAaNTx1Z5Z(}R+9fD|Q`#)Am_lnE zc3e4MmtL7>**@Vzp;d2UJS6Wyl7-hzN>*^P5mq1;g@F@_k)77G@T7(EHDy^eVEb~N zR+_c=rsaEOX4ARehTo5{SA-;YIgf6+BkDJdfNnW^h3b~WdyMmWk8%1vtckzQeNM(- z6Yw@N;iO)XJ}_fr7$|R}g%Y8XT8R9E4Pw^BnFaq(2Y=bK!^U6twiO+^v3cFzsl)W% zuk)9=i~0ch%xXq5g_C^7XX?_QDeLIw4BVKal1ctu@7XG{AynuEAd_YbyCyS13PX~hhL>UAnhb+E)(Xt@_Hu@$)K0~AmgX^wLd+hVV=x&r5F)r3*U>}g>EKG zw+Mx(mJxfJ2%Efjl-a_iX1rI>zBii5f_PTLcnIG;aqF_~N4jIoQdqaH!s3Zc`U+9Q z!#J5_*s8)p;8sDwhSH{_L60wx$)TYLPW{3L4Q$7daj1+WVIU^k4XPMT6p|)DuAsze zK=`uX;KxhGE_KyJ_({QP9BX{0ZuGTJ#-IAZ@Qw$bJ-&?n%Rs8J$jnY`PQ7e8u&wQI zk7e`m&09}A*(b2?oC$Q6o!R+|?{tR$9(ZK?na(w54&3K;f94A`fBTIw$T{vUL!a&$ z#z6YHA2RgBt(i<>AmAgC6S0m&>hYc2Vsz{QxeL1L0;mVO!$^~mBs5)#Met+Q7S`3nK+Gd&ME+(-T?kO zl;CAAncXJ}EpFg$m6yQAXs`~7Q?Zl^#0PD0OPL0TpH(EjVAkfdRyO{zz))~arffW4 zj@!{GhgOPPqa|Nz`_xpV(UNDM%%Rf_ZL<|-Q4iVokyO68~IX7Xxy-YN0cD(}@J zs=!p4uN)RO;Hs0F#Y97MnEV`p>#TN-lRt)M{ur~`0!{2M4>$9IsxqZAN{O_+$uAos zvwod!|JZWU{-NroMo6(0tt7=d)?E=3Y2}||LE~J>s9R|S#TnU^Q-55~qB#GB8 zJZAncLZv+hq0(4QVb>lIljx*f1r3w}(i>N|&e0nO=h>0W6(bwJLPskKIj;ta^(H2{tl2EzaVc-n1~Pe@cz7{$+b z|GZ}s(xQb(WQ#Tu5i&?b3{nbe5tQv@a1{|k(QG16gFyzBp@xvkCTcbY5#nNqhl>!y z3R+C#B9mFPXdx~VT$CfFbUW|qz$6a*IPc!?{`uZH^VAwT!Jqs9s;Uy0((976UAS*D z$aov5*h`pFt&&t_d{SjsGDhlITTsfasX07W27`LYb#v~6$w-bmNRninq{uSo4^!vJ zi*UU%?iZimk;(8LeH+{UD2g^fv+Y36HeuV&A!p{vQ;t&{2gs>=93MlAy+|EF&i9bC z>&STxtRJBsq_(qm7rka)TI?P6pOS<>B;B@;XP=e?&rYZ<#C5yG)Rrso{w3qN1^F#! z%^MVXUsf+uXGt7IopOO0N2f_6t2)RPzUvS*jYaQ0vaDsz6Ryo8W*%|<4etMj>-s86 z<|RIxet|bi&#s}xoO4Cf#`oW(r?(JSn=X9+SG(Syr%xxMe&{cmRs(1?M{&XQNZIR0 zMSql-S>;_BltS;LIVJtNK|=rg)GC(9Th${2wgKICM&h#0+@86=YE|0xh%|Hmu9*#c@p9M*182z7Jjjvr!iD z|A}&_!IU{)&0#MY%u*+!ENTg}$fGS(|2upA$^RdF(x+rXZOLW*74WBls;UP&--vYW zfDP&x^(JfKcd&~&guyx@D^f2jsK|=@qw`X)^UNyG=O$GAhpdl9`-*BF!{NE?bH@9E ziiy$l=Ps~;3+gsp;lLSJ_y=1E5v%|Jc-muNV9ul zWgE*qmVc~ztZuB!Sl_U@ujVy|I;$DzS-jMId(iSroe9WEv=39d=p8+i11&he`7 z_VGU8)8bpjFTwA|-@yM&Kt|9{aFq~?P=(M7;UeK*B4#2BL|sJRi5ZBsi5(LACvGBM zB0focjrbXf1c?`tW|9x2+@y|3TS%XhQIP4A`6g>8XC${zUQE76K|~=z;fA7~;yEQg zr434NlpT~SR3ub~b8>S!pb6inR%`9PViyyN%J}5Yvy~(FUfCPLigc-=R)s=z6;|BQwsA5s|Z^Xb|+jU+$X#x{7v|q2(Ab%AeO=&hy?{U2q{jS#MFtcjMI=E-@pg(6?_AN zf8Y!F1Qv)hXYM$5aa)9r^;9rW@mX8-U6CAsbn&fvBc7sf#ed%f$YgXJ^^;yGJ?ejyB**JYtLZQl@^f2 zc0Izr!L^H(32+y944flggx^;Zay`d2kYmQnE8ZR2?IY@5#rh#^6UKdldz;^SJSNH+ z=Q(g2%pI$vzq0uVW&Z$KT5|tfuHb@fuUU-&w)yIP@7Ct2MsKq-^*wDPgYAI5_OWi@ z6Y;LgK8|5wyE>%hDfRj~*|G4nty;3*Hp?=`eZQi9Yk5i^UvGWC%UpBVWk5abxD(+r7;-dFnPKc07CX#l zSW_S`=r=+n7s1vYk?VxhFr_+O%pvb5U;E`~;G1>XaxL%&JnyeIi zi2IPLi0GTLe-rl1b;w}VGIGz1mfVmveti!Ny<82KP5dGy#(bJ2u;~_cC!D2^laOtn zwfEI#Qar!hti0`+)}GShJco(S!{`Y}b^ddIr?N!*KH`qGaeFcCs!{JSTE=N4@HXtm zfUKrm?a;@l79Ibb=frj+0%yxSt$=BeOr@zKZ%@ zR%aHgf^2U0q%W(zdS<;YQ^reGFFPe|P3aZM2dcyQ-19Xg44NI_>3oSOmz`}$amZW+UTs#ol|nTfukfF78lV3bjRA*s{2W7KcDcxIwTB5L^QR4$u^rAOQ}X z@sJ=_c+LBBW0J`yGlyR$Lj?T!VYZ!L{I5QnEfOJ-L}J5E6b_<^!AUG}#FIcGNhFg( zDruyXK_*#blS3|fGbfGKV=uQzm=t(bn(+3S50~c;Q6jMSeW%Q*V z{TaYO1~C{fK88?^p8!J{#&AY3l2MFi3}YF`cqTBBNld1KDNJP=)0x3cW-*&N%%xIn z9HWV5ZgPMRY+(;OImii)i=7?3V>A0DN*wH#Xtr^O_Y%V)PMTl&$#0Hwn)|eJhI!0q zFI7CGntMFpDUW!}6FySI3!d?uv()mPeZ1x+uc$LW_?7J}Ajm=%vxs^Q)4)=e5TcPV z%UI3|KCzP3tYQu8Sj#nzuz~e#WD{Tb#&yndo*TU3tvDrC;v`-YBvFziSyCib(j;9n zB$EqVZ;1dI%{PFEIk36KOAak8~o~y zfX}+a)KI#V?!RJeptb-2c-lqIyAr`r7zE%PA&IypxD20DHiw0+oVS#WkfD{KD{{zI$(e9-_J z|7o`W*&PAq0QdhG2temQ#{EAJ`~T?=1+W2F0DS);;J@?#iwOOH;sF2>nzH{V#MD!*>bCtfd3|gB9Qm zE0rC!%uwpb1B$8H1R^9Y+(&HWtsMZPy~}bg`Ia`whzJlRej&3)Jhcnn^F*s70lyuC!U8+zJ?a`Vz*b zicg=YwEiXv;`u32yS8eB96~mnX z;{FlPS<7{NdORD|d_ewCzxbrUTTjSQVUlTavZyO^I|bL`&3@?-oe2CY9ByC*&tVH| zFTg?Xq1Bs|>{1=!G&JAwu_OQlR;2v<|IKp#G|@c7jJ#2d@KLG5wG1T4#he${t{S6+F5Fi{7?`Q_MqL$staRC zJ9&Y!4m-W{Y~4BKtki(6V+*_z-590cPp5Q~IuYMybWg z`AL%C2Ld(JL7k#5b!a2NQij|%^<~4o?n)v5fWU*2ZQe)VCIKEE|15y4nQ(63i*L7? zaie0cz!Xiwany|~Ifh68>J@gCuotj;=o>35mQb*ml43zIjtB~kSSx}sSO*IpgmFvH znm~~w>IQ%EaS?N18wB%jG@N82z!-Erdq~2_xX4{QK6N6r5muP^{SSBf2x4(kBe<%jGM|XCmKdG9jiaB%FW` zL@{i5%rIBfI`MFQE>wY-<;B%CRQDxTM9p&1yeiME3{;7lbVS29@!mf->%RliLBEEt zbiQ;_osT9I#WljKcImI>3tz`ddl*6&S zR!WLdy>0kx|0g|A#H}PQ7ZzvM8&TJ06f3dzlPQKo8F6c>Xxfmw6E1KJ?C1y}QBcR; zhWt!%*H({?lTMf}D!bI=5Y8Q&SD$yxXQ7x+DNYbgU8rwPvkBCL(h^&kWHGRgVI}`U z!;oi@mh$I}mfO7l1?iV6PfJQFSWDt=*2kRo#1h)f`Mr#Y7XW#Emdzo+A`Y^&s7bKX zeRISF5m@%KGlyb>(hUYs6-egrD1$Fy)N@zIuWIB(QEafoPOHb2UsO&a*pw+WdD?u|6gG zZ>+K}?=_^U2z2B$o4*9b*7}{#{&Gb6XvX&4&7_krvXKL+gn;0}!$Z_7Ed71tZ<3^w z%US^t|1_sC7PQ2m;bpS1(tV5P{;)%&C}$->o}YuEa7;uv#3ln2kyuVNb8v1Zz9F4M zXc|E%1pExr$qq!#cxGYPP@nK>hApWwJ(8!Q-DI_7a%ovuF;+qise0H$s`YY~Mohul z2ATi`+BR8^ykauAb)vlW2FpLp_`UmF^l!&_du;e-Mg_Dr+T+0_93E55_b9E%%43f) zf1=p=op`{#m`U0@F(}n)LIOx1HtTgHq?1LU2VIJzg zan(6aIYxB!f)u?Wxt0P-yLT~^yF8fjZCyC26@~faD0OOsduI&P=xKFN8pLiPgq>yr zFMl%a&E%s#5=gXeg6$&0tO+<`_qhw0y)c?Kz9Klu}I9`30co$7et_)J=|1N@Xt-slb-L zlF-a@g*8_;QZlInk}&nVno%c|pdJ$>gvKyt?#lWa|J_B~*22n!mnA-kOH3+0y<&Yg z$9W{t85^BaeA)-A7$bY6l)>KuQ!27FAs3>tP43JSE8~sq66w2o$Dk)Sl@zKj0~uR_ zq}Pz=OVoqGP;lrn6{|lZm17`&935PVB)%!>2gjwPCKJ#%Ea4>{W3UvxB!B3my32 zW@)7U!F2{yk=*6hp8B+=UM`xhk?p_?DFa$GOG!y%p>r=CS1z2`sLWQxC4&r^+l@?d zq8*344=p~CXKj+n6>jAODCpzZP3Xi<(je?3w`0z}s8tuW9&7fq>@p9qasj62@J*RhBiVY)kz;r&;s1|d#47oz1z88rrF8I+p2VYbGvoH^KDWBlcS_FCE)LP>T?>Kz zT`M#@^oLfbUj%CnOZDZrPTXWeEXN$N4pv}Q!<&YG_Y-bW_Um@cS33)@T8jFrwHf?fvdH z(L(VBDWUwdN&#*&pT}QZHitIKT({mK>GooVox=;Y>NWHieYqp%a=KdRcLg#@9HPZ> zS6WGcMA%*-BQpb*)23Kgn8uVrF*ksnmYmrhz@Dpyx3ldH#@zoS4u~h8dh;F>IUCL4LGq;ozVYB}n{pigK= zrCo*1nV#ZO6#dZe0$MOlg1&VSP`L{klFBC=$*;VR?^YkjnuN@M?1AT z971mkltK=NSp38wsT6YYi-L7@!NF+_h)6p|$#U8fjbZve*PF#%3t5rUL{BDf)ZxA3 zWU8vt(5k$GGPM=Cw~m(Vz18~~r2TkhCD0LszWm~0A1p@rNroUzWs*5pkeIPJ&d+wc z(mJd1Asi`z;$oK7#K4Ep_(=$+qtKcH$gEWuIYE>NOv#*N;nc!v?sQ(-IBw}rJB;en zOB zUz-ik*=M`v>aHE8iU$Hohuyd#8P> zE$71t$c_z77s6ib>zz?9ZR!|)lSVSQe;q{9`a0iyL${!bVlN@(X}$*=i&E@)^to*j zID|u+Mv#g$zbotL_-bHYTU4FiCF;kFi_35P5{A;VB7UMExoRpIaZ2@SF z2^DC^(>gw%1$BVooO93!!T`(N%<+HC#zlxJ`I=PtEl1WqdyE|l$Y<--<;@<0yB1-! zJ-E^HQ?0Z}?-75^ww?%xt#cbNWZ#iKyuwCGxOWBFZDb&T-P(E>Is z3_B(m;Lb$C$>PtJ_m1{Mv_JZs(PuQ*0YjGdqxKMT_asYdDWps-UIhj=h3z<`&^c&d z(X)Eo!%!Z|6|?ZfAiKtc-=YQWCdi398L8WNWo2o@D^g0DK20q%i6c!wt>WjiGNv=t2tyxDhboJ4bhLb*We*ahv_5#f*L#D5`jf@)-F`*57 zxiALx6#jViMcR!lCqdd4))^^OFzL?5lJ*IECM3Zztum9e#*ejl3W=4uH?PKF*ru_y zt7fC=A24dl6|bsL>L*mHTCDkGb7351v&gJoYOMfbKZ%}`7S!fci)0P~5erp(LIn95 zGFRG(-0Mz44%f#os6!G*X#F)3GU_%5VN+?eL|!bU^pYivNGu(J)xA3gQyAQgFA9U* zTex);>M`>{mNR1djWYT+C_HpXVCtAh3$bME->^#XGgDfsVL+EFQi|WWpmDx}U8D%j z^II9YFOXXobaiGnBA2F7T60FwED@c)^i(cl zj+J80PC(bG2OtSJ$8J(sgyJUz4&>&f*}U}PHfdA?PP89K z49oea_^%DUBTau2qryK&z=Drnt;qv&CePtz@j^G1dY`6w7I#!^44yoXM(sUU`G#~0 z4i!sh2+|x5_E`7;%yz%aj-=xy4T!pUW(61E&koh?F4+;jBG7Bt!gCT(#HCsc`qb~} zY8SM(VCvT%_4s&*-Te5e8ON17;+4;w5Dn!{QS2UOeE{Ppme!lw_3@4-MGNRB zeB*xi`!gGPxO_$T>z4JRBSBXk3E)w7Pjd};Z#Je>0ub(*CA27Yi z1YqPAr9y}GD7`VFH30r9i1J>c=REotwX@GxD83%V6-Z8a01~oKfqw!3zvP3Sz-;9s zaKh()A$2g)N};_VQm>0mcShoxPPT;Ei5jIX{%67~1M}#>nL&@wkEdhe9H4N(>|VvI zBcjz5hJqM&o-~MA|9-$|CcN5n-XO|PaR&`vXWy%9682vJ&;Bb(;0XL*J{PydNxAaW zi@f<2fcmtFB|g%=w607tMU*8t^@la)HM-O+B83aM0u8xf$Z7_@eh8MIw-W)p?6%_N z!Xynn)xL}#b5z7Bg8W6!7047PtZGx_#QmiRQQ+-+%!<4RR{`p+94jkzjG3OhO1{NQ z{+sapbsnB*3oCqT&^4Q(r`3o}8a^8;$z6(En1@g`Y%Eq0GIuZrxX5}D$F<>$|0_<| z1PQvSkW$SqoWh;--~QE#0y-B_LB04s7CPs+@>>f*mkF@EidMc!}YKK7+B?t#|6Wnf(LcXAj2&}X$dUPL|}0GVL@X`~5h$Nd)WOw?me>6~s0_ONk|iC1F~57bGM4*+6S zodOb@M+*N`CGb;o^$w=h+8H@Gy9xm7FbIFp`EgM^-4|H}X;C`64Va|zk9!)#hffw! zi@1Cgrcw$1QmWLhf&P?_!O_SA@fb?XG3NFnx@(B!0r_R7?I5%nVlwS17 z=|1k?PYF*bNt|qd!iE0~k`%z3mnPOfOrmEWvcgPW0PdZ64EwABlr2vXY^fRWd^RT& z1dQi+41#HQN7nOpOMRjkKAy@_fD1m35@)aMu+Nq-MPtFZq8^ChOnZtGsg`s!dOeynrevP4MlDW1Vc}1QfW46z^kUxP1M7lCuV>kiZs%y= ztc$abGgldaqdrM^F?mWabPrM4wjQOIhH2wUzim+hNI%6oIvbgLTh=fxwWj1@pGv!Q z0a=8OhzAuW7X`cxEL$TtMk5$BR>pM`ge4(0feysoGWdCwKxS|bYxe`jSdK)AOG z$HxrW-?JC=UG<+M=ZH&Nk2F$7xQ&=E*tZQ|^oc)V0_6TOfmKIaqzDj8@Wp!TIQVLW ziq#md9sA-B_vCjFBl_461jNENi%`5$8y^{PY+Qo&hO(~n|3ydn)*32O-5o9$fIyRw z2nv{v@28h^F`ZNPhPIu_U&a$ZEX{sbHeOh259RFi=x>3|PK{D%9k9RT)0~cJUKSIv zV06#_=8NlE#HA#?0`1+AihEiYA2gN$8|d|k3~`BlUo!&Gtb%(0U30n^x9=~KdaMa> z6}VX%_VXoiju6RvkXKw}3lSgUzK2p42s}824;v5cX%@iQLXS<-TgDpL)>>}Jy(YNB z(TAn{IU|eNjoFk*iC~D|tfu{8v5q3%oG{xf@yjggvapa?Dk{_m4)<@Jd{HS_(>JP( zrhXr>gsCi=v-fyjfhNg?^t<)*YKQlSaP0mNzu8g~H9CKoia!~NLiMA%D3(2qCE*QQ z^WQPZMz2H*?D!CVxDvwddm1`z8`>=FktKR?K-}RAFC)Z#oPCsOnFlvWhlaYnIfno1 z9GnMy8EWB(5hSzR4f@BX>RT6kMC=x-livJY*9 z>!KJN;Sy6-I#o`b+mvbr0u+8xR``H3TinVqzVRsDhBhm-3@83yIb2+;W^B9K&optT zGDB}XxcNq!Bs}FL8owkf1>|l~JoDlmcmJ}GVy55sGp5dxL~_zdJBA|TQI!s9GBuyio@DwB(u~Q$p!fO%#o9 zp^_ayVWDys=5J!cdW!MHPL_9`#I9~{S@EinVZx=}DH7bQ(Q25$@0hW9N^_mp87wE+ zi`0}$;Rn9FpHb2X;OVp1@M=TFxKk}z&3<@^@e+P(FH5z2fFJP-fV12((=2B$hqCDi!Tg$6m6hY52oSpU(*o33f8i{qQdH z{=}=oU^x2en=#f930){L^0)fUx1H$b@;kn;f;4CD=!=8G&w*v=&wcRpC~yxB+tTnp z#O0FTrXJX93sZ&!i-IQLRz|o7*^QS6$D?n%4;waQ)N?4NPaQJn?zK)Cho6vL9fr#9 z!$kCD*+X%7@(s0jWfV?N*MWK)_ z{@o&4-Dw*vk36zbV&Ib1aQ)MSS$!0TNM&TSoDdgJ!-NkviLjC}OSaPQ1MO^hUTPH+ z3nJkBPVe+rG}_1LtPG@Y3q^_ufbxTqZbCvIWo( z?&rngdby+L8q}@A5#A4b!K$)c?NKtoewMKBkdr$gbyAc`9zW!KsPgvj=og<`5o}1+ zsK3Sh{k1dsg$|?~YOLw;-_xAfVmnCur5&3KJsKnwyi`h(Bb^W_lHB&m$7VR_gmzLa zITn>K{0A1A{ea$IwP-#2+|DE6-KF$TN+X91B!P>)ST#;-5fVZElO;pCqyoE}GK$|n zXKIXsU^iF`_LoeNkJ24m@N2JGi9cM!F+oi>?-8a5MzrRX-AIPkjMaLmY}2@()F3WL zuhhBO)&a>El|1y*vC~jR_Zo~Z84tqrPNcM3fu>F?+QJ9Hz11qvKv6zcR9H`?Xbd?b z#O(^P&~M8J<)t%_YUF+~sq9Lr(u6|Wa2({V_RchTj_gfJaQ$mH#Mm4} zF-ivt(hc8OV`~F-7Q(T)SUB0q-pBlDNJ3(c%Hag!+G5kB&6Yc$F6MR0T3FnMDRJ3` z)mh_69uspXlZl6=ABj%m4#vjDG^2{BHO#7prkT+JXef!5FV~o4fE_8 z50TL8dev{OZ|7F>;?)Lw3th-EoD&I-OA0fobh;6OnvK^Ltj#tvXVj0!x2L>NxOc`S zBNls63yD7g{s#I$o1gu>@=mQp9eq_BqOXX+Hyb*2yB_zAAIZ6 z{{>vB414HXm3cKrJJ&Mj6Q#rE(V~-mF~vT7|k>F-yq`Q_XY*uH3``bP;mWtb#@0mVQv0rYdUs?i+ z7ZSt|=bJu6-k)SB=E6p|+|;7kkoL%tC&x2ylgiQ7hW4FB9bpSnVO)CDK^^}rR+dC* zF5msjGod-|lM1oA3IcEABO>i$F=fIZ+R7eW^qkz}tKMA{7vk0ECc~5^j&FAxXR7E% zu-qxF-bVsI$eoR?)ru^Lb8*}lH50$LB`zY?oVUAc0pQcX23odXnhl=7lBSR>+_gEY0Sexj=jce*(vxa`q^TK9*4?!KF3Iz%{ZE zOwMy6A8(fjai9zp+5Smp4{LP^>2WRKq{Y36zRg3Seoc#D!${9dc8Y?NEJ)doQlsum zhs~WuL1`kkA_DTKalnNBDG5{Fih$o1H{J2)Nl^=dXH&QYH<{X;(Zgpk65;N;+FRV~ zQdG6^kZc57kbn!OWiT=2qO=CroQC|Zde>jslKqJkqmitBeh8Cly`+V;rqAl}U->d+ zP}K4r1M`Ioi7cY{ij(qJ_7tnC6Mx`koLl>5LpgaepvAVCf9^+*PvR_r^a#;4_yD+uFGiFHU2Im|2mO&XJ{lxaBKQ8 z&N^tJZbyM=X&z!FMgLU%op&O{i)((wKwwaDF#L0Y-Xkrm+jY%Fk7lPs7&-n)hXlJA zUuuJdsJiU{x+075=XpSNF+ouxB0Lr*jPkU_Be8bFa#z-Pq^#gE8YJcMctL}zbmdg{ z@HJ)^G$&QkdS-TVWM*f((Ahs0x8SHb$@#hhWAsjYjie1b6qk;sRj-1`)F(Hrl` z&0l)%DJ2CuaExQMEPp=*A>N zPVs&IE@~5z&yXgj%JHZAcX1cVsnZTVeZHiGwEVQ?`kDBgTiX*aHQz$_)5;6*pDH;j z`S|+>lhn~-36PWM_fIDkXk=4~sGvC2KUJ~2C*1Ek9O+HFP0ZOpGKl>W=8uJx7AjVa z;J@|GyTVIzY(t@N{}8Y9ky(fLPM>5**3to$?F- zj&NBVcGA2N8XfHT2+`F&u{4gDi={G$)SNp?Q2w0lUU-co;JQV_emIa&F2C|PA%;#KIfV<{3|2PW??+hfLA*JrC|2zj~UE8zC?6FHf z&u=L#wAjEX{ z&^KMgu|sNIDfG}*MRzeCE!K{>KDd|&*N?=b{qlXzx4|aY7^|S#QbeFyY-h+Q`SK3w zFmdAtWAI`6#A~TKKGolZNUF`X7M{2)BPs5WGqJvYRZOCnVC$^Ns-MSfkzj}zC;--4 zu9S*>-u9iSCd?)!#-`5NFIXuk9AU%cHAn zgsB*`Qh}z{RoCYJnP^zZZmdH|*JAsDIR@A4P$Lm z1%eL;MRBPNgKWMG&0hmlFD$v8G~sR{NWCE%xd=*;W&UdUjPmUlu$)uYuBW~$4BHCK>U~KjuR81{hHLg4xD+N>o?r7^3rKdw z3uQ<;5NH zCHP8)!@q>eGCx?-#I9v-|Dfp}YSS~)70A~+hhzx$9si4MVuFR4UG8pY8p6kgON3Fz z!CYT?RvGZI<-R2>?5K&eSXgb6rg)h%A~8PX%|amAqnu({5dL>ADj$)0i!-bO*Q(Q% zTOyCg3T%j6VO2srI+R~*k2utc$^o36;%Dz;iDNyCQruJz8~ap>?eHO5V4Gogujx07 za$h!k@)PMU2w;$bk~EiUyf=>*nJTTrNE_entflp(bYPR-1A?X}zs_HK{URr6Wp%BW zb#GRd%1)%2aT>%tmeekk4)T?DQHqLX|2C|Am_J_HR4x$idPCMW{IaSn6N-Q!Mg_3p zOEjZ8mP&)5j|k6doN9-*Yn}XcNju!~l!|1=soANXo02`z*>o1$Oc4GQi^)}uXjF0b z_mcr3;SoFZrN>}0Zw+ptIJYN!!FRs8P~eHVUPWAlAY=+*ePb#D{*de@e*EIwB)0F$ zhn|v=KF*VUOiK{_4`cPaL43i+PS~X!yHrO0)pTN-GsthITyVtXN^-rX_;AfD`rT$R z2OUcgLLRso;RAa4vlu<$fGG6s%UFa+SNjCP_htK9US&ks8oAU2k9X*;0kvJU#Lf`g z8oRA26w4>3@WNvl6e|a(Wz)fjLPiY(p(Zc<7s}IeOOKi$chHG&WH-&2Id+1r%z}aV zvx53m0?E~q^EOV&0D`e*jtsFaBOao?)PTNIkPC_7PFGYQh%=S-{pjPI>VeBJQ`XEY z1zlF;@KAHN|5DS}Z0r~*hB-sVIpW=Jh*n{$3#|*<&#Dwlr&uSl{2NHubhbN?9qvyPe{^eQ<`^6Jhw8F{9nrC5jy4c(RjCFh~w)fsq5H za)ytIhG@+4$Hn~md8gYae((#10{k8K6oQAc$;svoCc8tU2-Ex8c6fC`5K5;G8;Ep2 z(`0uK>sM9G#wgyHj3g>0!iz2#E4S|1!ERKL#J}kNb067RUdl3`@>ik8@I~y)LiQaF zrFkufCp>qt>@WK#3Y%!L?@OfF+c9&I*z?`IQax8JTD0S;Ll0%2t8*##FLwcQ&6a+S zDXnbZ^{zHkc%0f~EcKY+3T`v6{#mFp^RR6Tcd92#)!6>=#imr(-TbFn9A4DU@;mee z6)(uXa@s$Z6h*EP@mrA$+?-1V>Sx5g`eQf!3eqBCC8QVi$|U3w0n8Z0i>nBb+-TC& z2Ps;DA0GoW)4>7bOn0Y7d`^a!h-NwBpJwBJW6s5)tud_Lz2fU7pY-Kk=Bmf z`y{47f(uS`+~&-bYm7oUnR8|HP_|UMo&GaFH1#vF;cg+f*iuqO@gPRYEH$&uRw_?E z`T084<+p^4C|*T$$7$p-DF*^6<`aNEMIjzCzw46p8FInlSzRWKz&fl4lMUQlF}K$3 zlJ2G+Xw8b}l1oieL0@(qo0%}q0qYnU)l!gUNB2jpCgujiioTtuzH za<7Y*S4s!|2dXCVj?o*|Ua}|TCHsxvGdbq~8|de_FMPn=a9jb6*ZlYiY#SS|Oa1B> z;I;e!rHm)EIfsEgQ+|Q~=rA(u@7f#td)NK zI9KLh&X8Xdn_i8iPT-8s;@eIK`fQE-w%@ z8TiCTheeW~UiF>cHv4HrEqJ?g!iqzf=r4B@8-MS_hJIVd<-h3it8;pU<_Q<{zlQ?a ze8X^qK|0@NU|l9ph`y0hf8H|D94(6Q?6j|sQCRn9Zb zH|Z&VR(<67snYNQ$ zvn+jG*w)@z9&Ms&!-{^apRCzjPdrJ(W*q@(;jdAVnGu`7m}~B?`Dlkh50#Ztq=ntj zHN$?owS!pP@$q|27jcAjdHJqPIx&KHWOJ=T0MxB`xA<@A$laT|Jqz1TPSrGDo(pwp z4(TJWb_EjY+)~Va^9=2N&$?L>7h_3Rb*A;mHRv+vln93uR*qe%#BVHymsEZ2n6WP_d}ek{w6&ZyT$YpweU#05y876GA6rA|bh?G52R2sw zrVu~u)IcN;T-KVuLT7=4{6gZE1-(+fgsVmICntU{Qf7| z>RD-AEQn3#1{bS3t*na;Wvy+a=<6frG!KZ?MgXX7ujX@M`Y9oV%K#SwN^UN<$e?S@l%d-SzIfW8fk2nPA=S z`cJ27Usdx*(mo$M5$0{(jO5*4WEEfa86GF*J_oQ0IHVkY4%H7^$*;#n)#CiDfU@jv zp1gc-FSA5Y@3dxd8qZ81^>K(AJ1?A%;8c>hj=Z^NaXM_tEu}sU+?pmo!t*4?+@&DU z4S!gDo8;u13XtJ$Bi*T!W@wyuU!QgOQ5wRHZOYWuT1HvUoyI6g+B!T7H%HW7(}R%D zE^Wb$X0&OzO^ybN{qFs_t=9;EUC1N!SzP&;En#%wL(SQa{%aKkLu?sD7|EXxPvzWO zIimcVwL^X0c0V>*DRjjEewWR#9gw5nd43-Ynu{o}x@YpVAF`zkY|khDsV(E~Jkxb( zP3WLnQyJYYHHRV_URW>(doAwFZ;+gSo(`j8o^t`?H8-*xiIaG$Rv1nQe+Szv_HrEz zxUmu)Iy>mRAvl3FIX#ahbdLiav4Vx&JOLEvdGwB2ltAB zgay?l@@pp^r>sj)s+sMlEfUq{?)pFpVHEwoaod97^m^rqh7kgcdc1SPK!rxs*g#kn zhX+_HXBGj@tvMGOL%2P0c_!fr){r~fZNZ`DpgOn9<23KX0EW|P#LZ1?(uXi7(4eYL zzmM^m^_>Y(TQZWO3BR%RA%cI65Yo?RQ~s>Xcya7#xQFBzE^m zyZyQ?M127tFTVV2Ou7n zQ{>YK?6dY-;L@#v?tA$A;;>R4$z7%$0p5r)Q^iWT6&JcD{K-}ExgYN^zTPMF_uUzD zOHQz0XOzj&VUATWU@#u|FRA!D%Y8>i!4;ENFjYJbSuGk<-jedyM9OhrS#rO`h5wGr zQ=e(+Y$nyC@1vBjR4^>_?iDrRILAcmL5S)@7~CW4@r#>o1c^J1LLJ z`dc<`6EEFE;K1Y4i+ub`wIg)vk{8Z8q3NPN&Pv>YZ314OaP+uhC#DKBB_)Mr6fE5Q z*XdPt%h_{|_rKXMk9h?t^f0soL&tSortmGedf%m4KOBHt+1I>~zer==?;VXrd079q)K{A!bKxh(fWxCd|ATccj3T>!z=L?a@DcCM6tWMII$hl0NZn+BcxH8ul|(_$J&;8;4)N$ zm(^D#2`93J9Y#4rD-Z$o8#|e)q6{)_IB>mOlol8H!z`h{BDHO*<&?i|=l)9i1{29c zo`RF9grW6WhD(Qo6y&D3f!m;r!Z~Dhgjf2|37fFV5E_>$+=)fJM=?xM_C=|~w=Z2n zWC=fLc;393J6xy779cu5%vHdohY%RdhLwi}r7QeE0!$qslop+Tf#bY}w!>}a_g<0~ zWIDiVCg^3N$6t>Imn$}ZE%{u`sW{E`ec4ZFpb1(@n++v!`T81$vR)6#IJ%5)FCYRC zxYf_{z@u~6;)w92TG6G2s)O37FjvFkL=hF;L{Q*vC@Acr*0$7?_<;yqODWV{r>5Qa ziP&S0I7@fS5|P(d8AP_N@VJ2()*Yp0fG9m6JnmF!a`af@D2%b(r}4;Nq|QB4!(3G~ z;f#nW^vj#GV$?g(Zc_NKA(5Xvnx%xIVBI^GlhJI3h`ZrJ)O}j;GlfkwJXjf+q>G!T zkL^q9YHvB{dd(_a%Vrrmbi7#v`&^s61mAdSOvzMM#pt3EYRcKBME?4##L4 zAKuF&tC$YkCmFT)As&qse0pYhu!%JQa(RuP_YI_c7T0 z_iu>g$unBl5!i>ssLJ`=VSWrC1xv%36Ex;Cv˵N7AprZTfzMydbKi!=Z6BQk(= zmGAY_5+4ZRD-X)*6|7Q;rxZdu&mHWS1gJB&D**O(i35v!3Aose0qT+?eN}pkeBf*@ zhy!+*N3cWfhO0e(grgdjk?55J!*g*7&6MwK{fexD1nd4Fss4294xQM|26>jzELYs8 zOoaYDWp|;UV3UTQ8d;gjEAsM2RhcyJHm@q`GB*KWc?e6_Re{sLaSV1q);95qD(iWZ zu+&wx{W{*L;!CM-Xt2w=M3pVj@=cgTkesaK0dd7XIKuDU16rLVMKo{+0Ch57stSoC>D5khOA)2T{?|Ku2i7}RnjKRKn@f##-@Pi2?n zbI6~aG6Sstslu>RtE7IS{cq9%8ch-4%oAN=?Yg@bjE;*++9Y+QJv4#DQ1?wfwZ@)~ z6#J5T+AIL)k>;4tT(3Ioa!dT0z*ZF%yFqdK*yxmcTl#pC9A0o-ew6-sOEm(>2fOMn z*pBGX{OdNS6hG(p+#-JWa;ibt@?@W(pMdV72HnCRZ!jW79KX=D)-0(DG28II*f&XS z!d3VTLOj{sVuW`Vw*HxLkzG9KX3@M89a{i9<*a&xKQI{kSRSlAQHknTgyS*HNsNiZS1mDlXDkDVd04PS9Pov)?;AU-`vvvtQAHq z#ylq}MkT;=|CYF!Mh-3;_v~u1EaeY3>9vR!FT9M*1Zq$6%fTk;wZJ2yVcs`ykxO#e z!vP^?S~s$L#{*_b&Wt|s>%6hbr7j#OuKDPGaxB6PiabfEwl_;`ity_=8)Wgg5b*j| zArj=!$RjoS31_-VOlVxy{-6NF<<=r)(kzLOvj(ggKc9*$BzT*G!HnrY&S1Nw%LiC7 zvu%-*6hL$Q{%{e1q80#6w=D%o0)D9EV_(>#;-w-WSVtIQ(s7^g!zig2De8NKQC=b` zI9dEtr_Dc~ejb3oCi!RL#-cDPo{%GDROv5IwTf+K57pzja2Uef6(}J7QN6CoadwcU zW39zxOvhs;NdPK}O}9(`gIcOMeKsodLFwm}_`To{J^aI$`N!!gI=bFx8*orfjE%Ur z_VX7}i;(#=DyLX9@sF3SFQs?VLdo4|Y}a0&h~u7HC}GgD<;)QKucfe`Krd)V?rc_A zFDM0)VRFaGHW>fiUMnI>)-+l}hHY*}pM@0#39^0!7DK_KrR?iKF~_lmCo8femrRE! z=tyk7@3P3@Gt5<^C{;@yWn?&?-uMGAagr0vYBvuV<&gd3FS?J=uR}{^Kj^R?si`z*M|}3YPaDH!vLte1 zM;%Ha4LqD+6#C4zC+Yu+O%E(gc`-(0yHk}+FPB{rw!1N!rsK)%Ped}kpD?1&LPdu$ zkE7`DNf?n1Pv*8S)X{0F%kWrH>0i7OvZbk*6LhR4W@o9K0$KQ+?B&4lmj*&$_38(5 zaRB$*USzdCKia%7*CxgaaWroSk28ur#?r7!*wbGvRqHe9azXu16#FXbb|~j%Kz2n?0=d_Yt?FK=BZ_^ zyuOTl0jzY@%BZ9k)jHciSpY`I!<0Nn3*lx2amBp|RB5PNhhk}nYC^{~ix{}?>)*Ak z362}B8bUT=b6G*C#8(Al5YI$$c{p||jyWbOgx>4$2u(Tq3u=n>1z@`yu2E=0t~{rW z)RYw}28==|;)h!yw1B@sd_34u4s%gbQz4=gN6RuW8I_^hStENA#j;<)6?B{z)^X9# zOmWog2GO~R9WbH8%cs@4_=eG__%ALMn>v!|B>j{97FjKYO-G8EQ;paT?V?}d%*Nq#3*nRwddqN@ZYpFGW}Mo$ zSKe;Hi2JsDf9!s;N|2m@qY8eF>nudD?{em3x)yk z9elww(`jFTJcav#a{NBRa!9rD9AaY8^X`bxSCW!~rHk(oOTZj4-&y-f zMPC^`{(l5W8n@*gwX3*@L5l`|b4yFD&8lBXiG4gSQG2UfMBVhyivV6fZ$`IdE0GbD z34N9k{&QjhfKAfbrX%TglxosqBu!hCrYQO)B!~9yMSg|sUHvhU43EVY)gZd~hg#=6 ztDOHun5rea)FO$~eb0!CQEpP`CmOxNm@_;C-Gm%Ipp=UcIuPLsP%Os%lEXN92y@0= z&%2H!m%S409D(B65XRWZZYa%x`q0gf5+db8gSQ4w4+nsoNGDaZhXou~0GLMV3jk+X z1~|x;0Uilcb!IVZUXGVA3a<6A6awg%fO<{73u&l;TnrQdy}-*Pl{a7u80Ga?J>%8f zQn#3JhO8S&o6`gjTqpvu=VNheyMdl}mbT=_i(1kk>u&W-aI=LbgaN7$H72qVQFOd7 z#L+a=8AUt?d9&^ch4xma4tRPP#44zvSNC2y$0#nc-e{kbE$IdkW@I62g*KEhH=4Md zjchAYCQoq?#tey8%f((J(bZe4wvJpqA9)PZF$l&~jdZEZbaqID4^yl2+h9HtTA zi8~VQ;x|jc#MLHm=7uXovk3f6awu2hp=^hlI)btcEUaW1hFwx#R`W_hNbp{7Bm_V^ z6FrK3Jrem&iZs;^X#%Mb8_?{K2IvmYaX`x{Et8l0RgFaI*CEUCIW>f^f4xtyYHk8D4E)_p;%_)gj~vbpjx77 zn-~SBk$H-2YklZqQzKhs@DP1WFZ}>T7)c0y5DY*9%y~Ejeyf^oj{v`glS~(Wi@-tP z6<#?@4ihvz0EtnMrHV*`I07lfLqTS?2g0L(&t1iWn~ejAyy0bL49b~o1P2s87kYr`1PHU zWj2yO>jmCBk&ttmlULCHkjc0Z}IOf%#4EbtcJNo{Zg%I zNR@6V+;vS+#T#mpkTxs^sgmx)&_e5^MMjmmq9N%1X8~xq4^#~)iGKQ{XGKm+EC7;* zt1yxdj$HuHL{CcvW|+2D#vU}QvMO|k6m0bQ^;D~b6hYGVDq{vWY)pUs)QS5{s^9?hsSi&r8?bcSRYdml zM3RUru!E6G`eNc5jc*ttNC!}^6#|e#!CG;{2X1ul2qF%TqsEV-g6|5pPmuE$i?q2( zMs!h0nVRunT73d5dvsBVDLWYOk*;5H(ls;_LL%(rLqwT}(zRf%C51Fd-Lz#DsRsc` zvm{K4&=~N-i0Kt)pl2=e+v+nr83Ne;ijo8v9ck``5>9VP+;$1Uv7N_au}DEg1*td* zsW=5EW2a#XU3!3$5AX+VW$0+C#c8Wn+hnTU$zmN91xYHMX zoZ}OCWBME;{SG9_$+#CJpqF(+%XZ;9@KiK@8Zm@2F6Ie`st^z)`C_2dB@Yhl=Y@Qk zb9Hc3NRx~%d$EKxjQ42LutI|l}f5bZ~*r)5UQqyHbs&^)@(ve(}_(#1_SB2hfZMhr$^q+ z`RW&vtP6`*$f?mQ`jK|2DoAdzD*-|uoS2ys8_9+17@dwKMBX54PSYZ zwP?R?*@Z5|D8GZ>nx+&p3`3OY=Z#uZ$vQAY?T@-yYO0h83)3lY9Y$*Bjvrt^BHZA5 z*_Ejmvx%72NPc`K`1Dxup1hm1Q5ayymR%0$`F9!Pt1;B1i0RR{T@Nd>DuUYLIgPJqT+}RbPI!npaeL+Mma_NPApP) zB$!B}oWsrE#L~9oNJGK~hPXL>sb8t=pqJeATW}!gB(dWVhSG7ElHMI3_$0AQ8L#)| zTFS6NTG?3#Fho_1dmYgglw|c46x+%__fjC)r~%cZ6=_O zL+BUKGuAZUP(4LSKnH(il!^(?MDVs>Kb{wRO<_*q-2e&?qewD*%KyDC|EZxv5 z){O~7(0)w7cWdY~#6j91-!S?@{a8Q8q>aa7pnfa5_JM{TrC<)_7p$~ymSjZ2aI$n5 z!Yor6w*`sKMRAJdqK6$Zp_X1Eh0l%l6UUUFuE+kl^chExqT~vC7!mJ-(QnvJ`L#*d zaUo1b3T7VXlT4U27>R>t$a*@kQ-~&(W7h1My*xwLrqjNxEuG8*Lz9JsN5TBhf|NednSo$T`S*J40Z4 z@5${o*z{4RAl@?$8(SE!SyOU_nGm;9ZjiBrTU>Wzx_BJw0PUXeV`maxe+Sqc;`_~g}2ON~ws@EPk{Gv+6N4H0z-2|Xb45+g4| zNIbGZ`WXF-5GzbK%n5{g6{LulsG$T`s`{c8RQdOYErwaRx+D{fZpRM}6~pWb5VOM- z-zxT&<9-Uv1!MsQW7k!O$A|(>eWLrAV^IFI32WSVeCj# zV+2Vf7emFSsw<0NaRIg;gQac42qweG97DqlU?|nWqFE$O!!4>)kbxRihyJ1IIXBix z0~^y4kQN)xY^RZ9gRmm}oPjjAM}x?4>v@w$#BVDes8F@wMT%OP_*;+x!y6%xT!anU z?kn5LHh;`pr7MZ7mO#9v3FT@Q@aSfvL+x(gN*4oQHp^==(#JlbEC}`J*{>DGNKP%{ zweA@^fH_5gbzs1|6QlsWVx#3!xupg@!4N2zBxV3-1mYsLt&afu!#}5OOqzPXxL;oY zOqgtLDhkdM0bSi94mbxJq!8~nmcR)qxK1b%Ou?oi_e5B!ib;^qvHjpdB*#70qYnui z6(nT{2EsYDL#QLH=8*1;r`bWq#C7;nG<-cj)rSs@Jj|`vif9r>A%;~n!UWOBs<-BN zwzDh(5{ZD<528Jw8b$@2Lxi3qBy2Clh@<*Eo@axA^$Z(Q$g%<<4o2Q*J+Romz)ggj zts@9FIT5TB!ezw-iJ|c7*Cfh|@=k^bmY*}*$Z1DUa)mKGx=07U@a9C;-rcx)k#)(L zTd|c8q=M-F+Mf#!!7Ln#g*ZtO%gBNxL=&wGeDcf;5q>O5vJpv7jSynk(M5cdad2%h z%r1wsnsnH?*+=c9pAF@jpx8a@KvL@ohiL*9CkX*K3`j0kB)S)A!G=q094>NS+=@_v zG8q_S!V!%J%BGQ~NSrHLEx6X0`4!O;0o$i>^Bfjr=^O0d$ho;}T)d78WM$Vu!zWRz zCl{Zf{T?;#GdHWjM}HVK)Xzh~zlh4L|X>dNERWG0C#WB;P6$he3K~6Z0o-CqzfdofxdI!jjvjTh`@i*#8Mgk;iA;(mP%~K?i7`8KV zi8$I|GNVO&m!cwassKK0lA;t=H&R|AxiK_T9!R1UMSzwh+BFF?kyqJa5JwU!BBpkd zvWRC$2m}!o5;j9FrL#y}(4k?7s@DUIMOCsHI8{j2WB1Xx+%>rF`w%;$=&m|GiVFc- zSA10qRj+T914L;Wtzuz06MP4Ad9|iRCvL(lb*c-| zM^?y{Xx+eFr2{t)+C*@-VE=4xEUYSnbc+mVXOo6USAy@P?b6Z)I`Z98s^je?#H`g+ zXkq8e%)_=$8C#2B@xyn@D zpvo!CogBU4r5LT*g=VY`r(Ja%yrzJq``ik@3mrgu+jkNmGhL+k_~|8;CZ_Q{f~Msj z3gjU){Oi!FKYsn=wR}t=H=h7^$IOr=cQZO9r*>qSDl%D96$ns;T!x(lbe+eM(WHX{o)?n*(Xu*J5_g5fF> z5wtNt8YQqd=QYTaMUJ?l-GkJ(O~in0 zBQfn~xRzk(#M$1p+1kAk*Ft{-n3_^{*0A7LFu5lN1aHvmlK`xM$gI7^CvMBhO}qVu zyEUCrGmw6OXGk+HSMrQpL@qs*?7V|^+-!`#b1?+BB_UJC=AV~z`h|Z&2}Z-1WR6s>yyeRSm{OA`To{PDIDBK; zW;vW-DWScanXn^EeHj9PFs3%R%_Tc{W8tbL``hi!0vk~DgF4wEXUW|f2ZXTl*K8!V zMS+)vo+^70RM09*z(k8cUD=fMw2-vMmm&gz8MLA(mhK;F8pAdaxm2S>N6wRiCT=I`Ga$gq+oy?@x2y(}BXgF>JA~4+o@qNLE@U=}z z#<5HJ2?D^eulUQ9#_DwCTCs1e*?H*r7#?NPm^n}6DElUy1z8X&m9VVqj)NQf;1e;_d6lcp3Xt+>On|z9{ClX0T zKQ3}%42LO;2RWQ>bj3K8UkiaLnte@5ZIACkD_nsov^be2XOd3LkHt9V zOc`p@zbs$a(t;x*BNMvI0UknyAKi`iLqcqWmpv!cnLtkbHfx9rV<$kT^dh!A@*h2MnNS2 zQ}A;}gOJtd8ia#|jfhomFl(p;lbu?~#+1TA(^wQ6L*xD(HcCOZ;uW@ay?&G9n>*QN zQr6?*$qzH2(%dpcxJez*NZKhfcPlXfskz}u1&%7GgpLFZ;}f0g5Ckxdj|@Nn8{UAy z5KoZxlURdm(o#J-93fPD%ESrcC7XoLM;<6WogsE(J+ zFB8&QpqrfRWJMk1)khP2ojn!gLFDu))Y{&q3W*BrewMVKq}G#6boeGGJnkPmNZ6Zg8+I-U1`RL0G^<7Byf>MN+4;0Bu}c|KXqMqxDf^xZ;Rx zuu9_?QMHg#w$Am}0K_d7pJCgt7PDu`sIiN6ogWB0oJBxL?Qis`k4_V?4nUylaWM}QU@v)TgF+aJ!Xl^ z_>>s!h9Ma`5r~CuFa;2Vsx$AVv>lp)pUo%&6ao(Xw&)B?KRm9%=;bXoilpCW-yCQ8i4eCI;vD?usoC$synPr zM}Vmg0=nE_fq40pE+l*(5l6`KBXFmyFM z8m@K@583@B!i_Y#Cc4LDfTX)1u{f_QND(7K!068|%#UrnO~Q?K{)c`m$OVmzXqT|x z^dmejaBW@xmOIhb&Yz#uE1*H=l#=^FOr62%dv4H7CfJ$U-w>zjD5KYlAHJ5`xkW zr?$m4!V5A)rw<*aQyouRXX(ap`ZzD`z`zZ{8B8YZo+!qvp)}HPnu36Jr9h9J-bIE& zhFJw5vD=%c1QsO5TprFY9+pdrkJIA(ToF1h0TCt(a4B1XkKVI;om6>s{DKeoBhNz4-$0HM(pURBn22G|)B;qE zRveiMp$OTkt)3I?7ZO*|NagJphBim-B-n|`4VlPO`Z^w|L=P~-&Q;bk>Cikg5k&+; iDD?QXND`igziX_SCB#P4YgG)|14)Vl6XXGeSA>AwlW%|k literal 0 HcmV?d00001 diff --git a/ajax/libs/ink/2.3.1/font/ubuntu-c-webfont.svg b/ajax/libs/ink/2.3.1/font/ubuntu-c-webfont.svg new file mode 100644 index 000000000..c0e3f9f63 --- /dev/null +++ b/ajax/libs/ink/2.3.1/font/ubuntu-c-webfont.svg @@ -0,0 +1,245 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ajax/libs/ink/2.3.1/font/ubuntu-c-webfont.ttf b/ajax/libs/ink/2.3.1/font/ubuntu-c-webfont.ttf new file mode 100644 index 0000000000000000000000000000000000000000..2fd18523fe88eb385fdd3c1c01cb8f51eecc0e62 GIT binary patch literal 50724 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 Y-%Ui;nyzPW@F#m{giEbW@|TSLA8Kc8FaQ7m literal 0 HcmV?d00001 diff --git a/ajax/libs/ink/2.3.1/font/ubuntu-c-webfont.woff b/ajax/libs/ink/2.3.1/font/ubuntu-c-webfont.woff new file mode 100644 index 0000000000000000000000000000000000000000..785b91b1f2bbc5f2dc32396359355bc45b4949e7 GIT binary patch literal 26828 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 literal 0 HcmV?d00001 diff --git a/ajax/libs/ink/2.3.1/font/ubuntu-l-webfont.eot b/ajax/libs/ink/2.3.1/font/ubuntu-l-webfont.eot new file mode 100644 index 0000000000000000000000000000000000000000..d875b93320f7a56101364aa0144ea067855d1cda GIT binary patch literal 23125 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 SCNaeNb2_($dNntoFrg6M9!N(3 literal 0 HcmV?d00001 diff --git a/ajax/libs/ink/2.3.1/font/ubuntu-l-webfont.svg b/ajax/libs/ink/2.3.1/font/ubuntu-l-webfont.svg new file mode 100644 index 000000000..7ef6956f7 --- /dev/null +++ b/ajax/libs/ink/2.3.1/font/ubuntu-l-webfont.svg @@ -0,0 +1,245 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ajax/libs/ink/2.3.1/font/ubuntu-l-webfont.ttf b/ajax/libs/ink/2.3.1/font/ubuntu-l-webfont.ttf new file mode 100644 index 0000000000000000000000000000000000000000..cc23e7b6c96103aaa702055883142615d19fee19 GIT binary patch literal 49492 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 Dd+VZ= literal 0 HcmV?d00001 diff --git a/ajax/libs/ink/2.3.1/font/ubuntu-l-webfont.woff b/ajax/libs/ink/2.3.1/font/ubuntu-l-webfont.woff new file mode 100644 index 0000000000000000000000000000000000000000..cb6adf4e7d05efb1056bba2a5cff9f5c203617e9 GIT binary patch literal 26620 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 literal 0 HcmV?d00001 diff --git a/ajax/libs/ink/2.3.1/font/ubuntumono-b-webfont.woff b/ajax/libs/ink/2.3.1/font/ubuntumono-b-webfont.woff new file mode 100644 index 0000000000000000000000000000000000000000..f511e76ffddf63b52b1f77bacea55d72b59d411d GIT binary patch literal 26220 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

Tq3q7>KvXaP~U z(5$0Hz>B<#dyqRyJIyLcj`ld1E64<4&NFuq_`==i8Nz<~JiH}Ae1GqGM!iQp&)i8^ zRb_NpJPP)&3*yEQ)5P3d>T?0=;$6zHU#PA^+ov$MsWql=YQ^md9!6`riwQ-eo%3Um zC0n&E_jPtK1csG>;NF<&^8eW@fMUt9~>~17s{F4J;d|dqwQc)ZqxaWV6*71IJ zAV`36sx68be%Z}*?|_ES26`m`^S)v!gtpqH5ZVx8nPW7#VY^W9217VG9#LU0h}ed@ zehJjJB5L^yLbn;dp!=@>iQ@$ESz?^OrW*Xh1HE30z2?RlX0BRloOMf$Gop`EsSfA$ zk=AM>)ouZJ;jyBcUShOg)fM!G$J;mO?`mV-2V;&gY3BOHqsEP5qErlNiY1YuTWR%K zAPRy~=PaKNZXR2XryHI0?i8S3=r-F%ys?Sbay#d+FNpv~4wuJ6FVOp}1khWVMTkc1 zQlep(7EL~SXqpFOs<6(?C4o$-OX*#eDS?=lw{-6KQ&9AuB^LGH{(TO^^z3)oAD?>d zpU#lyZ@FQ7D+R|S6mJLdXjWl2GaX?yy)ldBjJ_A3l#p5la95r?jY3&pj@MIb@RmWZ zXubb552;PeE3`L{-@kp!ox|~DCYkE$>q;FyvFTIMRCH@Hw|cm1G@Z((I$QesxK}nE z*}X13cysIU=I*YRWXsBQ`)KFk$D+bCU$-`$?un-Ntm_`>9opEkcK6nqBwaTYd&_tL zR(cfVXRnUu6rYE_m7I^hB~jWmAXYt1ESJ!?uoB;Z0fWO?m#4|rClP-u64h??Dc1uv zlJWm24wvR;UnUmUG3s`|etC#o-23Q!yUKC7{=Y;Q>at%ZUEZXNc->{vBQ!Let6kFe}QLNIa;eEL1tsx|r+=9ZV z)HUZXNx2I|5SK~Gv5Q0$k;|m+i%XR~e_lpwgHG#lpmma2!*nqZ>C_hIQCpfvZE$`! zNX4k;1+;+|a0TvIrdFOQ-GZx;MrAtLA=r@D;U_Kdl@?K12im^7Ch#)ZalmC#5wpO6i=m1f`YkPT)&Z-K9l*Uf=Qps+ZOJE<*KJ zv$_C~d z=7&rngPFbMlCs836P5yYxcepC+A3d_DQ>LG2==7hE-4$0xG7TZMA4=DL;7h4vEGK5 z;}sK-y*-1(#uIfJc_WWI81*Jbf3fe}-jjn=6T#J^hODM#aQ$)ua zS0UV#pxugfYXn!32{+}|(k}}TrzjjSMXseOLwjl0$^6}1vw%}I#2le}Aho`{d3R;T z-H>#bS4`5wbn);+Fk92UI(m&5&2G=O--|=exc#unDvoUQ3D5bfq?T+xy`#84aD_MD zFZtd44+H)+$?S^NBRgAjoq_E3l*y3&alCJBLt|Sn^(jZxBNP*J74s#gP*cLh%+UI$ z4vZ5w7lGJJ&UMYtRY6zfnz;+&Zu%-0)Ie?C&3BI`mxki3UQhu| zCOjki4ud>XtV{48s+n3Qff=9+qg}>8vxGIY%dk<~xUHjIhAG-*osM>iDR~FJGgc9T*yu~=3bX)miT*iP7$cYWHmjlNM%YPvZ z=k>VSmw@1WZMJvf|LxfPmp3+8o(speiY~<^23IKMV&=vcz&%AvjIDa9u?0&&rrxT{ z1Tv*-Y2o<3tS_AEeZ=y)qiBZv2!u}2dP{y!V0HFgom)|VG2^Ogc{U6jRR>AhM`8SiDH z5K&*N-{~w-L6cEN^K1Z(C=?AefTp*QUZrOh6uXeuLT8)B;Rg$$a;d?6CV zBhowY6b*se_;Rg=p+xHQb9kZ3azZ) zb?WB);DQLH+z{r>eptdO{V$orY~t$zb9k33$nFczLBjmjl5+@X^=W6RI!WgcovTm7 z0+g#Y57esHr>pfjfCmb52$WAE8oJ0Nv>NqArt!G0N8J~mNR5_>dbu=}*|}(Iiq@s+ zT%^)m@=Gl%tuDO+=B7pEbZ%IeUNO6@RtZl!aakGXt*gAGPY_&}1uJXOgfEg=x&Q(8 zUSyS7FHDs9QibWS&5{WGGmSgnt2>A9+x(PX&5y(JU%}`X1H~}#3?8CZRwpHO0Py{bbeau+c%hAMHqvbRK>I7 z*WZ9o@a8S#Ld(`oyE-4+f{X|UZ-nEcTOutXGU-38?hZUW3D%O@Ly9d6ddS82u*Y#R zx~zXGblIv>o!Cup_~7tROu0(k{k<^SEZTzkh_esTa`qzFS#F&stijHt%vkMgEc`FimmC!I#8$HU2^iBV&P zRH}qo5%4-RRD+-%_2~D}xBv?LOsF-q6b!tnm{ix8tV<%nqik!u9>+at%o^r53%QMP z+-j-Vs7ZDPB)bK1CUN_joY1Q7S&Fv$_AS6DMMwQ84QP##ZJo1 z>inN8Di>I3mnA-9ix=P}Wyus=ay`b*|ABkY$bcq~;Z6oY+fk;}aEJ=2Z67pA)aF{i z*xNm``*Ry-?^y5GoO!$zZAGTwsHIpt!UQ;RsC=A{zHG%*J zdjFWuU$z^G-d#y+%gYIkn0|`A@nSe%L++#dk~RjUnpaN!%AV+IiPnbe^WAamO&lPS z#h~v|G8ssk42~b((PHH~tZQ$fesM~#r!+Ddrj_|?9n-v4QkH4=*5EX)tE_;x`AkuA zHQYq#R2@iyUX>O zHP;+Ve`MLLX%ZjpNVDb^vzV@3vstq=#!#|QOHI?QcJ1mctcHO>M(qUsW6m*{Lqv-V z@sIwIbY+ZfC^Aa_5GkeL5dV-NWmZQ25D{S#eLwEfG|jd@G*IsHa@X(szPsJSD-rRLNEkK$xr(hGChmEA+=zx%*9uT(7`D$lt;3?ruk1?}~Ax@!6 zt79t1JFRRtCJ5F93*UtMHUl0_m$_+{W3Y^aw+X+S50h#iuxWW>*1d~`+E0MLZLm=1xDdG&<#Bo^M^F*sxlEd!T zKcBiHnRIDW$C)$^B={JA&oD#vin3PB?NW8vr`4-xACg)ADA`Q%PAoLD98xWtjhnNO zTNXdyn#r>suo2dlrgoJVB-&FSrCcc5yPWj_8_)GiH#gqd@y4Bhvhe?UR1<$`3 z6F-oYT^=O7>I)w|71>ro`?w%~8T(F4RF4R0wH#74JW|fWw2(@**j=WDM2Ty;-Adkq zm=;#5MR}{b$_s)h8d5a{h(hoi)JqEnUx>%N=?f{rCYf!xuKm7nWFiurne454e_ILF z!CLr{{}k5z-#RorRR=5TJ*3LG$q&R|Zckkt!a79pHRuTqVWo&q_?e{GJWdfe_e*1> z!t?@^l`xxMhbg{+{|f8S1_&<6K<`~`quZvDJ|ndaO|G+jl4Ko)M?+oXVT8itU7^u1 z;${L9eI8HWL?Ad$w&S!v3jFhc{~r9It%2*+*Us2golKmswRyd?vbCjZK6HsiT zOHt?wOcR~1#1-;Crdui94|D|mhdKkn4wxwJ^>qdUogKkI=cL+~XjhLV_Lps`jmsd; z8~LwsKT;1$x{hi=N5fWA3N4hOd->L_Wln-O(u6vD9G`m-pBtd(+VyjDoOeMeo}L$2 zCJ6j*7`P1{ynTBax(loGFbR|CLZlF;F|rT%Rcz^PV3?7#$O5|gYVsg8R})5jOSOsQ zuFeC)dhQu7zKFD-PNfk*I~i7j`+?>|BxzZ9lU0o(4Nn8jbZC_~8|cDI284I`R2Bxp z$j4RoD(nCf+BM!`ZnXA726bgJA9@Nmg6CiKyV4zF6ZJ6Tz(WuGfr;kA1MAyS-?;<6 zu1{jg+37(GyfimGx4LZJvtr(P>a{s@li6%n=1vb;Y~M9G_Kke;7V&|(pZH~(Ki&!6 zW!ZA`CbL?!FW#$TdqwQkO7&!@;?k*Vl$={BuRLL`;X!!`grNa{t7j2SWV+BPvGi6A zN?s;3s*7q*1QfA)e(p zflCg?1%cy*3nxz&VsO3?8@-wxJ5X4M4gQJj)e&hRlWp19Xvt;_d)#4h0E{Je4Pk;GN6>#|6DW6t*NpamQGeGs^WUX(f8hoy*>xBG@0D~CSxx5 zkgH2}hx+?Np<{d2x!+gR!H>rSqWH65^K>H*O}Yu!Vu?g7nn*m#&^;9V_n_mMuDZ&S3r7Xl-bcTN6ViRrpUi-N0iPAjcK`qYc-muNWB`IQ zXBwRy|HSj#d}Wa5U;v9`Z!Sd8|CX>Yuq|O=WZ+<60*L|ufOQOVc-muNWME)h{I3Q` zE@5E!|DT0{0Vsk3UH|}nQU$sIc-noFu}Z{15QaCoAXXyRhy)9Z1qE zIl^&>NDvX*)Q57(*X`2Ad!PUHDI+&)^=Epnxxg*3cZf54OMo*a0Ju(kJnUU>oc){@dEJj^UDf zwn4>Q(KC`VUVLNPSD?rBQ!h`}Tm?fAGj4%)Y3nvMy@O>ikGdpx7o1YpK?bDW0qe+_ z*Vuj9jY|9@Ymn~~u*AI+a$#eGbLMoN-k0oCVrw-qvfmxg^9qi5{+hlwQqWiPEV6gU z_B+5VgIT;^Ge07W?0x$mQfCegm4|lb;B!nJdc@4l*zdpSQ8SO+qj2WnQ&1-!33C$G zzrvb6z*DPGYUW0%M#D9wf?E(<)C+V3EzRAj9V*VVLqgt%KKuPC|CZ$9+Z@=Cb$Kq` zni^Xx{R1{>Q{Mmpc-muNV9sGJ~7W?zQFv8MTKPw%QaRWRxQ>9)+uZZ zYz}O5*d^HW*pG48aFlWU;mqOO#l^*?#^uJ9!gYsxA5RI-4_+_cCA<&##P}NccJO`T zH{vhjpTqx6z)E0(z#~B~!7V~sLQz8Vgd0TiMAnJC5mgcm5N#6OB6>;ml^B;;hu9-= zBk?ZrUlKu*43ch=E2Q|O0;DELvq`&2&yfBg6Cg7|mP&Dc0m3-NLrO+U>y%}bos{3G=&9UN4O1;sU7)&8twC*`+8cEn^=TSB8af&^8fP>a zG(9wXG#_X&X-(1A(P7eQ(sj`Nr*}YqmBBp2NrrEX8jMaEix?*v-!M@y$uQYss%N^! z%*bqp*+26P^M4jS7V9jvEbA;US?O4} z=6eeVeBt}ekHt^M&%`gwZ-L)6e=Gkv{{I5Z0ww|BhJY&pR|35Pj|E-|5(x?b05>w7 zeE@aodza->D3wuTC6%{&VG)ho0&9p?#z*iGtSl`pEw%Lld;p)p!v72dL<4FxCp-Ji zbE5~8*raXluXI6O{%g&1O46d9FPg?kZ>=R7h&9MNls5pS7; zk1UU&H$amSO?oTjI&Hg*3E`0}TYHuME@eo|IXNVE$Pw#R`945d>=C8Gj?{}jWmhCF z%c}mD=#oUYu*s*+%HzFe=r=f&uXkD7`V1?2SesaPl=+*yLDuSo`vmg$I47xUOVlG(=Q^!)05-TKFVom zhR5%=sAc|?^S_B6u_tBrVX!s*E!k(Z?dBe3TXwM^Gh64)^4wr6^TS=veE=3Jkx2jm zc-n2yS8z;m6vy%JNp`czruQyL)F}7f&8FzPvMYKg(L>rQ2^*`|5xop!#v6lp!RU1u zJYckFqYNHA>*E2h+_-;l&diz5od3h`ocR;R-}-H*JO8VXW{ZSLIN{i^6M=(BqHq#T z46(!!PXdV~kxUAyq>)YrnPibo4!Lw7kB)SrGx-$Ig|2inH}#+=h4i8~edvpZj)99J z+!RwnDP{DdKLZ%ZAOs9-oF7|AF`GlsE@V>}a>$Rs8+g{f3h#Wbcf zgPF`?Hgl*J8?CgknHwD716$a`P7ZRMV`66q@7TnCi4X_7C6aC2=DkF5h!gze2fsMV zDIRc-)68Wad#T|OwcO_+Pif;ZPt1R+;|0%n&Kc_Y&OToAl2c6h=nwA zm?oC6m>|uBSjsY%^NAI#VkN6t%Nnk7g!Qar0~`6mH?DD(b6n>QZ^bFm5+kt^C-IUX ziIODAk|L>+Ch45#0++eM9WHW-yKLp8WN?#Pk||m2l5EM5Tt}!eplMpUrLOd7N;P{8 zrAz5nmbGh`0ZLtIC|$}TrCV97EK!y!|K)isb(O2@&bmN-C|Fxl-P~Y38GcK*-{uPi zo7xATy2J0a?l3j}01Ww=IRF3vc-lS9u?~VT6ouiILMdPo6XK#Ibu;N}SQZxI)FwWM zt1gcEEVmBE_;PsF8@KcQ%X#wY0{qGbP@|8W-$LxA^&4oy0PP;fIdmZH!7~uXfv`JB zjk^n-*e^0f+7Kindk}Jj+!7Qb?+67#tqCQfSP?2jxgg9C)$#`pn%-;UUQC}Rme?rz bBbNE6)Li{bfY!bNwzxZw00B@&0`ULauQ}U{ul9o0X9GrUo@fIi?}HtJ?&{5eOI|)A9C{^H%4nlsTb-OXo;|G{IP+!=f{5;phktf&8i_h z-MBxZau!@LQRDEVmdf5fT^BLaor#4sNXYOlDvSBV%za_uI=H%X3XRbAHisb*Rvf%> zp^)*qv8@z=8nCMz^I#s`N_})K#%Tl-%VZ0}+xhp6+PvSzFLcd1sj;RxVxdQlUn z*zGOI4TE-|zoSoVlI>4LQ#k<}t*_t2)@z~3BI=m1r8W@e=d9eB&oACxpZr3f zD21pLxI#w~XkW9aw>h{og?YMvmMLb!{C~i2QUCB%SuRP}i#B{R01>~vPlh_QUeiHY z3<&*ZZlI!S1Y()=r;68u;r8bDnnGMMtMvi2p~ZFxO{g!g+=YtVTl9~31K{)$y^M$O z5tL79a+##~Vv`$Eu;#x1R$5kgDvTVy^En3X$PJwQtm0awOiY|!W+GlyKQ>&&iTS=+ zt@y;I!K9&}<|?I<9S!Sgj{nb9%V7+Y@L-8)X~hQGYE%9r+MGdbM$VHJ9lesmw6W#I z5DD1CN1nBj1BV&oexa}0FCF-y^|#JPI&h^>>~iv0kogYr3mj&VTBLvMj+n}Dktyj~ z0ktKBopi2Y3c2DF}=MD#GKK1K0k>2#+PBL2A3zoR~B#bOKPexHm(s z6^}b6`;EPCA{=_4)O$ty9+Hp2+^xI?kk|??ePiPI5)+>DRCY}%gqp({6V$FBgya$N zUsE&vCv7Exg?})GB=g?p_03gb8>}%K+c)JRJ!~@bmuff;h8H^|7jhHVWHF32*sA=c z@*Y<)H?k^3vm<9Aia-nkacO9S;`bUhc70T)4*}{hg44{~9B7=vw(I1MDD>(@#)F2= z_s_O)+%Ypb1j*ao*&EqHac9>B)cM%d}H#@8H8TR@c1W}~)c;vnEpG*(`_(+*By~GbzUXAbWZEayX zo5#?RcEjM&vc5wV{uZlkb|hmmdf3;T9FJ99mZeU+YO>R$qjbQCnou_pQuq^5DVdt& zmwIEBmH*pH_|M|aWUyRfuEnVRtWHZnO!HGQHk^O8ba@{w6<2S>OHE#lT+h*(9fW#I zPk+YRctIk`VWfS??6D+0$;F_bN#UjGEpY`_v#UTx&-)?TyaVJqW?$sBsOYp{7#9vz zsp8zQ-u(WU9#e`9Uuz4H30GD4VvLy7oWZe9i1p0b)SYL zo^aB|65Z^HPOiXfru`?bic^(YM=P;OGbz>CzZF`@88gSZ%4(tT) zLqy=--*LHmK};M^uLQUGIB_|G(c7@31LX}u(7>=+J+B`X z!zVVoku67;OOU&GtY;$)S=fqp-DaIc*(Gv`RX@mgQZGYQu|tv0ghRZDD^Uz2Aa{yp z)^Vx;6>3*FY*7BRWNB7Ey7LKw{sdPUGoemx5#r#%@!J^7D6H!DZ}*XAMml3t0iRJ| zDqtOELM&x=w`n@Zw||T=PFfddj`_T{!48q3h@MQE`>+mI@Xm$)Zj`TTVR_}W=L844 zIAh_i8lCz4P$R|=%2*0oshPY5SX1u<=e{EYSmz+tmD->#%=KK{pa728H)qH22yUPs zrGeJESdmXD#VMkXhb0jZgCtbEDVkCd{d0&IqYr`(p=HR=5Pg9uML!_IQ|BmCEE1cR z;=hyWyLJk@Hfn=YGER`Rf6~mE^S}dZ!!>+p$I$W(GwBsx`>jW%(PSTp|rFD3ckjSyu#6zxC7tL0(q* zdSWG}q$bN3Ro7KUp}dk6#v;q9L=5B>N1UJfjfrDWWC=H=4 zdO-hP(60Lf_7IOA(K^aqjEE3(@W~ji?i3XIX>(I~WtpCfeG^)#8pJ$&s}~{~1gX$R z6SQY^f*QSImDF;bG%|X^vp*yc{H%tz;?-VJM0tARA|Q|Qjhy* z=)#hvK>X5$x)Rrg9OEZXqoF`vVuNfOLl~~dwn6Ti`jMsYKG{uBOO6n51OZl)bj*V; zhccUC^`Z+i=#U~1{kD`er0B;hbt1zc&X&$~JY0bNq(Hu%e2n+lkMsN|vm3>{eF;%- z8WL%Qz_-Tv>IA^6@6kaGjgMXNiAvDzX|sZHMV6RmE|LB(&hyWDxz94C z1#EU*cu`}1K6T<5R)Je7OY{;Eq_bvHMTUrA)EmqM>fA);41r;N>ZGbi@r))ZCYyUl zt=$!t^=o(hodXh@@-HCv>B%^qr<-|7F0iw}bYn)U0Ug4oinCN!?rn?W%SYm3i2BAH~Dg`Z(LZ6x3f-pk@9RTsaDAkGQySvW* zJ%z3r-F1fYrPEE|A4^${bJMG z)95X))}I&7VYvDfs7#233TaR~Q_XwR!|CS(X$zA~xp;-?T7)#i_-NeZ6o+V-AIxS@ zu3>=y){ls+4Ruj1sjaV)!N*vFt_n5vuuqBwI7od z2*u05wPf#UdNwhKn3mftVEJ^9WN@1X#pdYH$m4>2Q)gGPYp{%ea*dl1t7W3EuOkRS z2By5O2(qX|idj;A*bA{i|IvPl)q*UaQxgJlH0-C|PvN2&GqK`yu51usU8R}Xldwx^ zI+@P)h|V9!+B53WmS`8nI}QGu{`Z}U6C(-&+kyk=khU}hKl9)O^}421AX5Adn_l|h zTym()t-A9-kiDwGmL@gj@KCn7-WlryLUn^7CRf=7w7GA!fV`x}a=}Ah!M^Cz&?Utk zXThsblg_q@W1R68=0*;L&R0l2jpmY0j9Ss^xhqr}N^+ecL*5bWDm|uk*Z2Q+xcSS# zP>L^S0?y0X@bn$VkLxz+Id7M=#;!CvzpENC;TzB;tmmVY6G*N%5s7B( z?8{4wSkVLKE>Rp}7sotExIqIOr`Uia^H=iC>Ggbx&jmd09VLigI3MHaoHGeeYc_r{ zr@4Pvm|L+2Q35o2^-z=h$s`2eXrpdEJIqXxSvW3{HvJ(x9f5guDsG?jz$)Tbr6T5n zXr@M{t?~ZvpW$- z_#3m7e}tO2yUic|ZH0;uk8u#YH6sDX?R#3NP^Ev}52f2Oj?&i>8X!8exfN-kfI=t8 zpR}g%Pozf=6cNd*OP~O)eKS^Q2%G?QtoMjilL6+-la$Db&aodp#iH)QtHOBl+NcTd zA#I)f{8|fmRY_r5*SsEVo97{`HP}EVbVJs)7I}9z`4F0)1HOly|R;Jn|22_3F37@)b^3dY`Ovm@1B*q^5oN_+@ z!9jl?{@GA~70G$GJA|Aefbik!PyG)IU?$7V56CN#dX_eppN^=$<#U$VL-6GAa*9+5 zPIxY{;3F~i^hn_@gy8bl`aLbvJ}uckn*;t9LVCnxeNO2~z{-cV#Q?T}18AcIE@I_+ zOT*`p5jI}v3Xkojvf56rVlj%AP|A4|AClnTkzP@yLtB=vQp9;r+H{40l7kEx0XU=$ zLm1MhRlc|FwL1V5HYAnH&WE6K>TuXqM8jqlG`W=^@mA(B+Hwu~K-xr%Kp_%w@~{Lx z4m`M#l5?Kj23xv#X*_vY*oA_n=I2R%$d~{`u9yXU3_n;*MK3ltAJHBVL_a1ZED3v6 z@|ZiSPua)yncjSl2L`&I82TYi8p7B zS&Yn^DJseqY4;Mjx%I$sPPH8KlyWybg>yl?9GF~eI2NV`f9 z^P6b)4be%F;WEUJanSDr?JObDLYuO5)NfjU~76lX^^Rpd&+fEMezmy)FJ)~IiP~BN$VR%1<#$IDi8V$3eG8qlS zZSCwb;+eHSGJcfOLlzvfqBbq(L%_N&4#_FkV3ER zAu&Tmt3O-N8 z*)nruO)@!g@v$HoiKF%0O%%^;@1Pzzo|sR}V3X8$$s_ZBK>fHV#GN~lQa z;sIxxt3cQdC*R7vySJ6vo^(@QK2OSW5g9S7qxAwTalwUzpoo7`Qer4d zV9t{hL}H)TM*~i9Ar7?(55pP)$4x zvT$L!MMHuKMyub|J}6Vbal2_ZKCh0he1#+PYHXN+xH1r}?2RFo7z2}4e^}3g^C|}O ze)FgBJzPEZiwg#g(#ZE~Yc|z3~&6 z2j$_X3(IVbgl)3a$ESk(K#hb`xN#HD);Jsh1&{6LjCieTtWmv!r;5e;TO$zhVH-s( z?Q?q1=D@7_@F=Z04zktK6h4iv#{fLbN%@D6aK`s%oLst!P`GJ`TkoU%19essqX?{~ z;_Llov~65rIRn#UTcQmq#sYrDjnqCdm~(tXlICQ9M@$}RtPkoD!zU-Rv@+0M`{QYZ z-*}o=fo2UM_?YBEDeFW^K5mT8d7Q}2Ndl^6&t@Y`#7aZ!wt?;rcKj~j&5Z{EgK!YK zNo_U*gCvJlC5PV*eq5Jndvd+33IiQ243$g@dZC5={>YrpuZaAMs+gEN^>1pq*HGdI zyAtN)%);w%)2gc67>*hgHw_AC)r0FzQDd%uc=mY9MMq>{kB*Jw_FD^nuznOUT+~gJ zaKNWVW&aUaw^H&F*F9{U5@r?!DedFoK8J|@?U}rP+gE6cHkOQ|af|@IH(N7kn;4Lz zg_BsTIl@jQgOGci1N%=DZ7$@1-Dqv{6VDd*Q5_9aI+Oo9JLSl~REQ4I8CD|Tr^>0N z1dQm&D~o*2b=WmH1Ydb=`P9~U!cLCq3>QuYTFE{t^lVbu`4Zx=1!BW#VwnG*!_ytO zTH5sstT8j%=$yCCHo_;1g}wJ%qDEouQolutw$Y=Ctob-fnvPZdi5`3a>TR&xg5WCK zJmAa3gihe}4x0Md62-Gq0Fh#a5eA}$xNiDY01>_=XE0|H``SPrT>I_HL5`*%xXACc zokUzRkm3|k!$TgDeod-T#5jfG-KkTHU14R)BNw^Fi3yb zkk=EXuMWV}6c%I@JtT5p)wR-|uuB^cXS93TV1g5A4^4n>AiyfFFfg)>U+aP?`TOwZ zQ-h7gR!~qhGW+)uDbrF~Qo3MUsOZOEKI3ptj^{f7aA5kgFOhPALMa1WvC)G})o3#< zD7kXip=)&wmw7CUIDU*9{g%wWCYLi!{@-++)gC@XdO~n3SbxwOySTI)a^#@gq)+-U zasg6ARZx)n48PL%sfMpsAAelgLs&kInvj3tzfi~hC!dbgq>nNGT9D4M^;0W~qK(L; zhlOuO28ZNnl31X7%4xaJJ#tQ=H;&2ZK(NGKCb{5N;yXmr5n#uhr~W`gt-6|8Z?v;T z9>Q4=R++o(?1gtQqX{1;1tRcr-Car;inJnjn{ir2=^v@rcT*VZxHMv-&Fkp!%6mp* z!Z}Qs*ubpd;{u9oK44S^9*+?aAjyBt^>FbVWpuP%br*p2s<>dxXg@Gqi>=F8bYXVL zsX`T9PvL~xue>nB2x5vGf=$fav&@hdep)bqB1b+z91AY8)x8`l#8wOmPnaPy_+*Vu zP~ILfe2Jd=Q+j-Bw54`j!-R*i=&xb=c>!r<492{L`EAV&A&8$k9@jq4`aSsc8!5PO zTs9wCe2kF~pn7X>_}f(aLTJ2^*3Mc)4^Qimq&lLC5h4$REiGxn5r0<%j=mx`5Qcf$ z@YI{ac+jE4prS%vuB4!g?TZL>mfXM}i5o}3Lj zhjB=UvVtXxm6uBB2t?1OZ&MDoaY9L5M#@o+SiY?FPZ7je^Nw8XIP|3Ne3(0#-47v^ zTg$@VVpLL6k@(A!P(DIoKpBrTC7Q#bMq#jP$q7Z!WPW~_$c%#7Y#RstLgS)rvgGyaxFZ&pT*PA%^P zvS%Pbz;l8qsQ`Sj90J}W9MoQ8;~q1P0Q6Pz@79xlhxHh$Cg`jqLxmYZSf)@cy2{k* zN4rR>C8Jq&1_>S^j-VaXU!UmF=heURn7ilrtfG84;ie#(Zju+NFf9yCn8^Ty+=lz5~28EhrN^^!^1(A;C-EGF)9q^jV0RzWG zYGi^d+xsFTqDw!K5)qct&XW;=BPnr~|N6K~YJFQ9B9$D7m@BkIA>(PhSgxZ1hgLFz zb6r*%1v@jqpa^&agLkB1@rndaF07cqUD5vGu?YU~_^FHWrSR(ocNZHsJtx(T4`6ih z#^m>&4W+@-PRX=ejB!!S-zzlnynNBfLtFNO4|sS)^Vb+$2DZ!ybRaC0$A9nt^NEreZ202}P%>lrmS7@TC<;>bV@uE;z;q^cnvEn|z&c)Bko#oWRv zLnisu6xuK(<`{JQ>IAPcTr}=~gdW)FLWpg12eFjZwgc8!i(4x$I*RD{U`lW`SJspu zV-#=?lak|)zm_|blsQP=CMVLTG*ysCNG%Nc0V>eAYX5{e#=8|V} zH5PAoOn2#qMz0yRAl|WH8qJ*)m6wazR~S5=p`b2<3N{KA7U^8ML(a}SW>*&zdNI7h zS=b`*8stJSXSLjZ)hDGA++Q28fU1{a1!UL4WvnR<1e4W6VLal^pkkq^nCgW&i%s%kM8$Ei4;6@J?xGS_ z8o3lSVER2gQs^l0!g#1HwZ~*dKOCmKh4>V>hha4AZ_8OVYHZQ~TxoChEKUgo&aqfT&_7ba|2SWmG_Q6joRupN z^vvpHG*UVZk?}@MvqkLZBMYfBGo4z#g|j9DF|#9O7CFMBA$^adgol;GCHe3tUxp}4 z$BP^0Yw#&1sAtJoN%=8;uxDqm>6)IhiyTkUW5cN^8-U~*R>)El#DhlPe;(E+#?>}_ z9OFPs{!tPE;*uyf`uY3yDwm4qy?Pp>$QjioC|#O>&l`@1kBi;r5M@ve0#gljYaFH! zK6UI6>bTk*dC_htB53MOW3N)|s&YGK$o4oxMiBDAXXb7+ejPqgNj(HF0wNm)t9_V^ z##pgDRFck-+LwqW%o_aQfuWR@;F|F-I;5J4IQR~&V5HT{U)i;r_Ar2F6 zGCcJjw6=67GblK)*=)oGe#)If?F_Tpz9-sH(O)y-m;5W4RTf(zCIpw zS>teRZa1`hq^wcD+_HUy1^KIcY#QY4f@me8@rSP5g0ypKVF{K+t%13Gki%n+Ou?d^ zg8Cm5qP6K5DXePx!>mu7X}g2x%+L_9m^TZMm-<;D-&S^fuz~6!9%z%jQGc^NIH601 zKxH52K%6&a>tTW9ttg~>lg|ZIFt_Wr%ZkN!d;_FyKDj85AgEfD4xb#>sH5e@2N0Ic z+Pc77UxX6GbO`IrmEZxilcBfQ0UGFOL2X?{EYUKHlBC?2Bx^ewt5J ze0Z43*Jnb46IHEGS)7wT^q85!0@wB&M2}#kZ#Koi?&J>=J!n*=d+%`}<8}KAx>ofbu_c(Ja_|0v2i;8Z#Q{E(wtE1rl+pZ@$O z@{9~~O@+Wc)ZjSj`W0zt^L%@*V(e>5NlKD{P+E01R!;ksl;l+!z@HZyuiw)Ie#|!K zi!G!8EFL1bhg;N2y1u(DD50c6Tzcsw2hip34E*(m;UkF+9)Vo>4O=$R?%hpSx9lScRe4YSnnwIh)cB36-7hPo(-A3IgLNm#N- zNgM9nvhWiaZM?a5?owhTtF|@N7DPW$E!Ct)ugI;9`uwMO5_8latz$=p$~=3+(OwSr z;%0NJI1yNrM)vPThEXEgAQ6IzG{*k;b~w^hLJQ%$L@()ZEg{2pG1Zklh=enBM~=g{|EgbEM6I)|{m$e`_SeORXlmA?j_3GGt#7}J zw(lvlZP%EL6*|fz>&wJ%+sJVcYGUyTF`m)=B1F!)5h)qPifa4hE&+0sS|09JdioyZ z%fs`&llUBB=&d8M3(Gn;u*tDGlydv>palp-x$E_!*L}M0YBH-#HXrcJ&B`khgG2mV zf&o*Jfcs=3ou?0D_%S;7QNpp`F!}2H=<2l2!49Ol0U_JUYLKfy#gCkI`omT!bPLLL zBfV7X9VR)ItMq^dmQIWcFmdcMMc|L7*%N_2h?x=X&(}DaY3ifSwUIo0i#n@BDfRGj zG=MXNJhV4yGTH%30cL|mq}UuM$7x#vX{DvcfDXM?c>HP682qY;$8cuAcS+T2UrM}B z-iUmP7nnEl7y+k$!UzYPrPxD^6yE!17t===CEst2#ab9z5T1h{Z2=b(&v2z6+`E1n zPC?07OQfqW{d{+WR#Z-12*znn=5RE}PnX>AzUtOO?q*Kw2hG1;$YUXgj90Pw4knkO z`x1`J9+3TiL>YhMg|cIZvWLY7)%7-deYcbM?hIdbK(Nzy(BG90U3If)fTWie=oy|I zwSa`(+J6w-=DqsFatgE#tK200Z zrjO^av?_rhMJdG?7Ye8$L6}j4Cz%GKYe)ccrb*EnT5mQoz|<9-siwA4%cP)5@VK=mLT#AESv%POG$I&eR?^cf7@Zg-*-J;t_hwBtyQEXJ;OD9! zkjr9vk1_3N-qti_C#^snK)biGHoSn8ZS|53A;Rc*IS}J$zgQ*zsoL9ONH|fil~^6B zu;~hEuURZkYy$`BpPq97U}?AfEN7dCx7c9XI)!&+71mwR_JSh& zB}Q7v(f&qMD!w^i0n)feZ;Y&Rd4WPSDockYBsN};q>F0`{@kxw++4OWPT*q{V@tG8 zqCQp45IBOEw4Epvm9Hxe5EE!3>?1)-dCINL+w8|);IAa!bbCDg&3F7TLd!QE2E`Sy z?A!;A?RTHq11XCIwX@rvse=S3c}*XrgPF@A`5l43Z+M-MfBwZ>=ElDwTl4q&=>^azu$~LLPf*Lb9R2c>`!YV!A$rsZVnV$Uy4Azk><5yWYK4jWKV0E-N znpllw?dqywb2JuT>Oi0`yZ|uI_brnz3U~$rk3@{%Bix_RP~b0C#u-vPy+va z(Yl-ej0iH54%zY8!7tKjOxS@%10r=P593}gG^S^I20S+#De#iqBzOC!yy?*MXJc^i z%zvA@iY|C1mI);Z-f?hu94iso#27aaywZlbPErqnyFz1Z%9J~~DdzCR#nkagkoQOp z7`Bgyua&w{W-G3tTj0sS0U^)#1C;t>Ag8z5)VxZrL}dFV)IyewCe0&D7uA(bfu*iw zwCK_=V1d!246H0t3K|L8q_^XexMYf2mG`ZKy2b4moS;U9YO$b4K91>`kwx4glY)*K z731ifFT7o8600mz>e=570_K4c!X(5sZsVuO#zc~_2yqOLMX&Ui$_R(PE?NyS8^CZ5 z=vXQ^!({RM{qEZBe!5(+Z#onr{;d!Pm3{edVq_4MCQ7Ddsed{s z=r`3I8X?{=efCNTf;;9aR(`K2B4+KNHv46nxH2(Hmb%If94Q($9uPi?vsh>v#mPSiAVjcmy)vaN_#_z?{Z_Ns5NAESX z&0?BFQObffI>OCoWdtB*3&*17hsx!i&_l!Nchz z)}E2OyO7Pv3B_3rx1c&^`E>1mbLm;o~6DgGZ=XGToDpmnm+%%N)5Uc&Z*@H2YNif$A?c4UB@1U8w8~DJYT(LJ12r#A>E~b#*v)ls24? z(4)@pCtI{7dP{HNG&S=FnO8Jh$mQPUE}b`_jDYc#snjk5?ZO?(l^kEyv>jL&CKA0` zhWcCL+>{|6X{u+`QH-`7{-xNcMHGCCImAhHD?5^>Ww4ZHNHze93&dT2+(h~n=tnG3 zPFJCL?t2KgaHg8R#SE?YySGMLPlzuF1G}c*DOFp?XjD6)3p<9E6;TG_$*|dJVee1w z0}O`88h8&m85#S4oFir-bl_B&UEdzxb<9j^YKsXH<)UVRntAT~l{InJgZ3K~4}n3C zd%=T2RLd@Mwh-#Piuc5wZ_XD@VN=z9=qPT-DQ~>in@G5>R(m&YPDgq;E}cVd!cQgG zpZ%UWWWyup=AaGOJo>u>q9XTh58gfbsFt!o$k0k;fAr9oLa-IZe>0~nlTBk(S;QyX zEDVf%?>K792-rF&$YDuJoqia%p}?)8IzE-n1CQ}Pmcq)Xom53n;om?Uvr*f>pnk$_ z7Ul4Ll6*(^A+LP=`NwOF0zF2Pl!MF+D$E2W$sk(rII8u8?g)^|fW&Pi{hnnZ*%b{k z%9Ov-nD25*WJ5PF;lib{`c})H*C1_yzrrQbRgq6%MW_QLdUw_PC?}Y*$7Y!*GGgl- z4~RFI0-10fQ?Hcyd;G4Tq`oR&B@-A)QD)49nc~!M`k8&%!`N$2Gm!5ns8Iav&-MttCyi!JTXVdP7vxlt-yDytCq`xbXpw_GYJV%FF;J%}0QBncb6D_kYXSIzBr-4IV$(TCbg zOHVk!$$F&>X&ecicE0osWK56W# ztQQ?J+bNT|^Yk__^F*~qCpS4pK5x57JF;tQX~||f@U?VfdyoX{KGIRdGhwmr)JesI8Pb^V}m6Tu7S{5yF zHeyTJzb2|d63wsNu$A=EDFl|o@X0$eyVI6W^W93r^HHR~Euv*4%l%KtBxYm*0eG~b z$YCGP8Q*v`2vxGZk5%XsgCdbc7{cDrsJVfOIp0`yy+Jb9(FGu>(2!7lY*govu`et1 z2dG4PJgsM6v`0xo54!a%y@+hJlKIh1@e4VtsoI1LVrv8W1DCWIBW}RI4Ubj+&PFMm zfrEKcGM$g!T3X}0_x(BOIZcft(Z85%p=XBB z9K+#ID{wBI92eCLulMNQk&qFBFg-jJBJV^FapRy}4nM&{mwco?wamrVLD#{tk=XAoixt~<@oq46gIZ;n3_A!$$S#30Rr~rCetd#s=cn{gJYD?Fc@Z)3imKf*l19*=JM`eB(ZCfB zXeG)q{l%tg)`HcWc;7Z#1=djG5!%$vu5?6xHZh-d#q;(6QaGhfDg0GJ3*?>TrK_Re6` z8I%UhrFyx|c-AP1_kW*q2rMn|A!E^vicqHyMbq~t*gri%eRPak@xv_XfSEj!)-?d; z%E#YA1z811uN@GqIwX^fk5%#Sj!eL#g6^1|K9!7dCnh92^mVI0Zce%e8#RD>u!MCV zE2R3>3{u%iIRAMuKX3*RZI=Q1&o_*`yXY?TCo39py=!SH-hvArCi?Wp%`o^_1bcRNY0 zw?Ipr7TU{rkV`-cTaK9Dm|>`TY&0xRCrT9dFiVWHq(mD8d)#a8qj<`bA8>i9jb~tf zizm!mvU}+7dPCY84pIT5tE2aA-^}|qn#U2Scq9Mb+CwV#R~CgvU|9W!-i4u1RA@$e zT9_AmwV1-}y`>xu2qpY;uRKeaZh_VOFn1j|MrDEs4Qrv;27bi4MkGbH|?g^-8EgTk~@h2@yc z;N(L$6RO;vf@I7hn5dk5`jrhYV+0;blw(WzwHrkZfy((BYU>$_<_9Hb!5+5zOf*G2 z5oXX_COkWxMw6*BUV`FOin7CL*Fb*N+ApMCyZ53kxx~5-}`oCRs^9PV`NnIi72ZJ?sUQyWt(S!V?KdXDCIJvkTbsuD!Q4=QDHHkUqQL&% ze=Z)>kyww#`=``E$k@z3*P--E{G|=-o81kkH)1%L$oL=Xyf`h4o)J%Euw`WY?m0VE zQG!k_;q`AZ1&6XwHfq%BC8qceDX!FTl|yy>S4qj(7;&k^`SR%52n`uyd;?S5u2}TK z1}mhVbkGx|QGvLpvOKohFdh;UR@c<9q3$H@)ztDsW9>%a@Ew?%gf=F2B*@X)ynYf$#nH>git*JKH7wTRR15;&vC@=_ z_l&Xnjpp?L$}+k4R(V@_;B(@pI8YM2O*{oy)tPM7(U2BT74Y{i21}bv$E;lp;?9$}Vew)7|Xf zGv58hrFfhn6IWw6S3-!pgE>oAQDm#FS`;pKvlopBAfx0}xCS7+gX?D}^r?hzky67u z;e63Lzy-B&zuyMHzp0#Rd8T=0gZ@WBgpwEPC}X_`p?UjR2(U>5-7P(~xE+yt=C&Nl z*tChL21_?@4)IW`MU7s;sBn-(g|S1QQq-{cVOA;{(Ze{FNOF)DURz+F76ZQ}ZnV7c zTu*Klo+p@Wk6oT7<03Ma4pESUpPrYBvFI|w6~&$kk0*F7!~?8Cw#!tEMJq~+Ri!uo z(U0XybnXnpcevVu3=eljc9>Mkjrgl+>2L3?46e5Nf<-I8u|af*bwlUX7osS72}Sfj zu8x`fK>>a1ved9hhV!DQBQ{GMfIc^18Vw`ZSnH<%gPvaBo$iNfNo?c2)YK_w9pU#fZ`~ zE(9fxtbZL0iiC~d24p2swNm!)q|Acs$Vek|eB|F@TiCb(L-yUiqo4K}9Tb_BF>mSq{y_mVvqekq_et*TQFpnb|IpBd>>m@NPEoZ%o2%xAkLyg6s zsN{Ne-<)Gh7=iou-$tp#^DnejO1%n`o*|X+Y4rA$JTp4W1Dib^I&_JavPW#Zb`fZk zUcmnR2D|WZjOK9iiwgeJh&9cyZEgxoOmVdiOgVE2Aqb$zG=VyMmuH#+71e=&UX(u> zI<*i@SJ8lerQP?kIDn)cHcW@GRF9A~Be3#JyJJC()k2HYW~Uabn2|wga#=9HM4g8# zk{w7TUvcp!Nw%g|9VbA0cBoxwN1fWn{1-wNuRatVexjyUV)7wH(tZ{@i+ncNy~lf`RL#5!1#|ID@|p7D3m|Y#?h)5 zzrOKaTr znQxP_ceo1SbX#O#@1oels-QvM6AgJM1D)y;ffFW_C^--ZRb}nRXgc4pAfNqCM!y#I z4m&cgF;V$?NPFGXCbcew1lPi?5^CP4A#^jpY3M*i5c8G3M`;Khq6Zh(dbmtoSeO$e z6!l8dwQK~24cKLd^n~3Sge+N37 z%DWBcR%umT7mrQFpD$_E0m%*=Spq8`5YQC=w|Vl0ug+Jm{?9;)NS^9o+ja9GGkjG? zReC0TC`H*3!uD9j6$^8Uzn@JXzQJKW(+Ck1cQ_cYN!IdHZt%IZol4xY;rsj4aD)Zc zYB1D+{vOo+A^AaE?9N?FB_x=dpwU(1EOC3~WcfD|>p;`9L{smXfgejq?`<_QCZ2$E zjO{aBI$pU$r7T`YvEu5v1(b>)XL)QDFfqGo!R z{D$~1r-~qk+zR&2jSrbzj7kTm{;4TbV^_sXcoa^fOVZz{hH0@=kU&4Zptb^DgafUgr7%Kd_^ z2`so-bXP}6M}9bDJT>bqQ;}M^TEp&fs#)~fx9E#OBB5xp7b2zM%$EJz9`Zi|*dQn0 z(YXg9?Gwa15wZJV%PAv}M>ODH52uDM%=P!c?y4V*%>jzE(P$r*bloPQRAo12M(?7q zei^SPgD9R$EVnPK* z0kmAK8Zo}zU{v_+OtS)blr^C^5xlnxQ$$=s&ADW3bp|~CvQQ>}uVf4XXlVsmmxXaJ0~6y8w@`piTsCbKOwVt^9H2g;MW#OCDsEP08UCK0c> zvtYoHk&m>|eyJq_$zK*koI!S5ng=EE)7@A0zf6N_8%U55ZftLTst%1tDnc0oGXVSL zw%7p$l5WU%33gbIC=MjCrNjWoU1W*`3C}XcCAyG890-D$V5Af5T-KXlK^0$;fPi;( zGiGO=A1>Ia@K^^IPb?d>Q8v#m8POFRm$~fnZW3oOSo(D zDRa9l!UV#I6AM5*u1EmjB=Of+s8_=v%W6<7;3LqUzzLDRGoZpOBuyQ%)G2}YR-Z|a z?kx-*@k?%AZ}W<)1Z9sBmUL#awiP2PN1j6Wln6*4f`{Sop$zvxtk@9Bn#5<(c>?Un zTcrA)Cae%Ud;QuepH6F;q$Wv9ct#>GBm6D9Cu3VV9Z1I`c(#0#Y{U)3W&fqA&e{=( zdMg}EoAl(XV-!y?!a~vAvia#Bl@CodtWbl`q&XwTTd!ZIdfH2?)Q1Tz6ZE<}eRjN>?|nIH_!jS%=2 zy2mu|%!KS*(l(<=Y6~_<%=dwu$_VW>gM2XdPvI%XGyOl?09~h2OO87+l_O5JyRZ{J zf)hnZGQ3lJQ6Nc|hP?M-r|#oGv>3$*R!nL5DNSV2qIvzMK_<|NeA(f2VFZ3%u@AX^ z1gh%i&~8B-d{F9l3Usy0J;huKOWR>X&KJxo6C8K?V~%MMQbuugAsDW#GKxYUH~XYz zp`$$r>W4w4MAlEn{|;VQJeP>9p||yphf=R>pLm{BE9oF+j!e`Z9q!+6a|E#}h>c4b zhQ};Gb}^Ma`UeuO@x zXQ00`nGqX&*RxMT8SQ`rHr)7W1wlH114mAoP5hLY)40P|tz}suS+oz=Guku84C537 zm#`Mrp`D(CSxQ=gq{#Ro1fN6Ik>Z2g&}{O<%Z&%rs@tUZ@!TG9IeShWEp&bWk=|w} z?4OK^svScnqT;-j3?x4yyL$>bXo?{Y04!0QQ=sJp0YExr7D`laJ2XHy4H2XT59mH} zN^O_^mUP>z1;jgf6t;)PM5#nB^+dBG0RPn;id(ukD+B^>Jqx==B27!hq@u(;s9KyW zyW!;+r9&b*WpcoSevv{ohUa2Gnb43bUgypQXNR@0d^RW7|$1AF^QnE z-p(~p->xne7+9MA`}qJaA8&sf+#aQW)vWgP#ir@Dj^8FG}G@F{ON zsQC5(K8I4UT~vyVRDLI9YJSQ_1dQSDvIvHrP6^bd=R{tkYtu(iUwP;mmOLq8!q{-U zG*mbsUX2NR(f)>yE4aNtPafP|ZG?oCiB5Rw*>0*+n!Zv0mK_<}aU384n4tqCdBP*i z158PB31>3yBDk_WPJ@b^K}3Y9WU~9hXqE`7*lVN4l?;Ul!*SApU!H7%A@Gtsz7Q9- zlC}ZwM6b7|98mhWQI2^K4Tj30&9I8|j5-5HST|H0Zem2p)ND~UD?A7i{qoB(4v3qh zT2N(z5Bx1w?D5V;0>j=&9x?$4Q6uls{6iw>PJ!Jc-+34dB}1EL18p1?Q6mxF0q#2x zGT+bsg8ROLr5%Ol^Gw*1q{@gqM3PFgx2sIk9+X{VVs08^gvu~R8L|3WFfx9LO8iZ) zE1-l`k&Xcq8LW=c%u_UxpjjBW^1jjdWf|Dn>jXt2%NT{6mlZQ{rn7_X_!b0vgv!Nm z`#IRCFnB#HhWoty6C{zs{-h&%Uh6$iX6%k!QyB5@&A;HR~d}K(A_vfC22sD@xl>FXJV54p%sBa6?O?? zj}jt2iDO{`t4>RTR@BiJq0pN79KV>&rvq+l+UdaEh}or%fUvj4Gs#J;m?mRc&H+y? zNaZ7u&7L$KMDmgI%nyaiG25*8%u*^$1PAC?5eiBK6mu6{0yU{MD8vKUki|d(3Te>1 zz}ZePe5y0ykOb{WOcSfq+t4@XfJObHTJTcO;D=L)DRBdDaR7|n5|W!zJ4Me%zEog~ zZva>$En;(y=E#ythZq{3oJAo>rfJL^-D-MG{JY$8au*qzk$|uzP56MZ3V41Qz&t%dsW8@E*F);|(Q=k~VE`40$IF(%cwgJxxrqu$KSi$$hC-m=5xF?@tb38s+!SL-aXKhCQ&LD6lvMBf^AZW zH8&^Mwn8Ap^C189D#lh!am$|Q;9_f#8Iyw=c9#FRfFcIgVt9KNRu~0gnEmR?kM+N# zrrGl1i9`yyn3TmL_F3R{1DZMGth1>F#1w8YEp=Ozh^q}bo1n9w5Y{a*T?|ZP5knlo z$_76Y3e76dI0F!QA7+iUCZTMJ0mjE*tW>e61v4$qLM&my`0d%xM?;e^(4#_l3{*$j zmaE|)cNp)e%_ARx;$&wyvg2MT>)c9g(R?|8_^3Ui_W#--)`w0ys`9ZIs!WF5HN zGA#oOiPZQ?R?OLJ13bCKgYz5`j!B6peV0@$6v7h_a`iYT1Wv-pOfq*9T^U&2D_UHlh&vaF4kTN&$F}6mEk}~7 zpun0;2o_r=Li*GxbcYWt=4V{?4(ZtLLLAaeyilQvs|lk4&1Yq}QyK-a27n$3&Y;Ie zpb>13rX9=V`4V8;JJ$#Q9bngi3p;ZHuXJhw?W0uZ$q}ecH%~b5ORB}<5~e1bC4vM{ z{0eWi8OH%vkiLX~5TNvNEop^hR9d>3e$ApWNyR7iM(Xe2D2L5=h=?3^lqSfx$P`LU zpDgHPA~leW3(`2F5`+R=7ev%U;xC$OeUq`Vs$l)(Fmym@um40|&~_-wM5{10A)(rvg{q zaa7RlnJ`Gw6Rd``svwJ%3QlL03L_9ClA($sl6-_a1^agn@tAv3;%6rX#Re>*8HuC< zIv`mXczqT4#+1oVqLj=^BKv%b;=bPOB(!>@Z??;aTkoWf^Xc2;!WfY zf(x-m1QZ)D8tZ6nCr~r@tIP23VWd@LiTin_=*H^@KwijO6|huNpf3T9VM>jXaZ5x*G|R+<0nRjDN)=!daHcg-z%mG_ zhYZFxa3L&K9YD>oQj{s%F(4?Xo)Yb{dbzjeZIzc5D#l7<7+>j-B!F7SOqbw{qdo3GF4znNO+%RD3jTHOilrwl*)*(F<)u>b}*ETp-LR);V5*@b)Er?6r79}FHy<)N( z@1h|8SoKzM)i$nBpLyJ(QGYdr(h|><@7X z3)~GF&>k$!OVpaj=Vd5;vo>fJ`huF2>r*7SzwTX zYlfdJI^dE32ORP^!}eaJD_i~`HoLYSh0v2st)NvTafVp48nr+SJ>8HT47<)Y#$<&Q zJ!{=9*Ao6c6YG}j3y}9fpNSHCH)lm=XShNHJ5=L!=oFvrN+i)$Gejgx^YYI>d4?}3y`t7(jBou>m zQ(70q zdWC|!_5!JR$7C5x2rx4@a>Lo99M+~?S=%0wxng;0q&l9BVkUFqgOR}@IAl{Rb!aBR zFM!~fIX$NY;>dYg8s6a4{x0F8#-kMmB(NA#g|ru(J11qlQ=((-O z7aeFh?zIu!;u$53SZa6&BH_9MhKmxN#B62m5bSPzh@&JRMX*+t100%&jTTlJY;NEV z3WO%IeU1~>@%Dibr1>~kxSe%UidA+yNP&uSw_9B?CX&Ig49fp9_X1mx2w}^SD!yz? zfcFCT0S~WmC|B0aDQCQ#e0~5OiFrD72vX@ez|W5`RkrYUz2KJe(5rSES10*@YOgeH z^Sq&h19pbwW(Hplt?c&a#M8c__TfUDkU%QfTzm}ZelQCWMDr)mA|T{6IZN08P?$0p z>_@A1SBP*2K$Mq(H~pjnrM6MaJ~cSJT-_b==)b~O%Vw+Q_wFa@y*VN^n{V(dADA~# z9wWovGnPPyXzq<;Ppw`1&E~<@Ziu2OflgGRqc;ui1wo&x{m@$)xnRCcKUv?%3V>LR zUD-;&92w=<5K$AW{Gf0qK@}4%kp_tUmRjmvlfOB|tv0}nbtu+CMEr-18p?A%Vn*>% zz4RRzryi&6=~+r1&s-QD-WHLG$R!B9e>31C8 zQ?PPJJ8yyt>CdL_^!7Un7jI&1vb#5VX9Ham3WPK@mFfrJ?v z)MeSJHX9N`6yY7D9NCB`r~wRt;3n}ZZI;2>!ImInxU0_OunjNo+;uclBfQnXwMfcr zZp@b=$T=?&QvCx6>Kj-#tyUSG(BvM*k~^Qco?Zk##Ui!RWY0}TA|?`kjV*vao}*`w z*93o>+3Ew9c3}_E>)9mxhic>QU+Vq43||hY3sm&6=n7FpV`)a^%wS3z{r9jXs`kKh zXUv%hJ;=M+I*0pHUai~nLxfZvcf_G=X=;L&!`YKu+j*fUmTCUKW;ugzLh=71L{Yd8M3jFFT>VrtiZ zh6ow6^{=$6(`^HQv)H$*D9k;m64U|=ea9sE#u*3hO%g0e)K`NNh`K;eAEQqMeq>q% zXp|ZJk1#@`QR^INfHd0?_wJ<)1F`<>vXT?81fU%!0L=^6mr3==9r{oipC0=zbO$My z{yGOpjKhJOomQUsXIO_W4BG79$$BRMi1&kdxHDKEIN>V|cOuR91m`JcT#cW<3e)n`1(r@#T3K5INxyQ@Kx0>P}b zW7#Lj!3%&#r)Nl^8vyM+0(r&}89%hCAbKf`U^gOBtq+vW#S%`#v*S&`nz(yS!$7ce zh6~#DOumir!?nQ<4JyzK0h~z;LO7S@ij;2~Q^oZ#sKv94N{$Ryrp|Y+e^lJ(62r*zpQz-ptAD?~JvH4co z2jKhm04PCdkQ!uCLP?iD20pFZ2fm>Mq`oY{+d(tU%c>q$EVraOx|_V?2Zom=iGw3; zha+vhshw;A^)UtRswN&ugY;6EFW z><~>ya0u}VklTKd61AE4TJ5uB5jJl+FS}j7(n@rt=nS(8=18A^fX3fv6B{HM?5+5%wuC1C^!@>`^mjEK7FB;supI4UC&ocCZ__Sf>#y+@~Hpmg(DU!>dEbEd^Iv2;0B3{+UBX5%J1->JL!S@YQ4Auw)j(Nby z1a};xjnqINt&C5(qQUlO`%2jLap4VdXdIiwhmIgF#sr7ptM3QIz|tou4IoZdIP8SZ zVMV0_l%?`jWm}Du1N1Cxdkd5l41j`!Sl!~1uVX)ShCOzfj)llTKklbNJsKQ9`Hjs+ zktuztfg|g)fnH)(_(JBX?PmkO)-RfhpD(7(YpCt>yfcMSPh6B#tnlyb<2`;7&?x3)q%~o^-7Z315k?foM-1@e0|;h?inVQzs4% z!<|B8B{<|G4&Lj4N(91cH?MRCONSa^E)l&TIyeCmkJ&pweSYDk*ezhPQv(?9ni%s` zeQ2d>T1CJNlLjV}a^gODLgow^e>&qa0Y+#Dd?M03BbxqkCuNLU;|E}gmKabR@BSl> z26aVkXq}*p5Yv(hj)WdLCT5c%ctFCViH(O#mC=NjZxqi@bDwIQtP%!hECYE#?tsG8 z_PJ+fWdY%#uZ9=&|A|4cbju&RhAeK`p^i9@iO$Gp2@>?55 zF&LGbZ^)Q=OPMO746I0ct)*5|9d(TN&*6DE<6l4pQVPjl3(sTh^e7i`Z2&zV$y_hX zJoLW^Bt&1+ARHO%F;>q!Vj50F%mPIlYzEH&xPpbi+yE~gI47?dM_u1|$LB`&gy6J8fA%(BYo{Uk+ zW1};k9ha)l0~$>$3XlwBpT$2L##lOWd4s45r{yAeu|)=y*bx9rbEKOo;w>Bku%b;s#GvCRP~GWC_beS143=ZJV6|MVgRi2M_V)0Lb?g{T>3}rQvXc^`0bvF`=S`2 zo&#->&HXqsAysW^QBEoe6zmv#AQx?BHEu31Xm>{eQKwf~;1K101{gC%W~|}B1}ofK}f~v zcLo+3N_w|TN7FALX+4~l8*`;$*?BD*^B502Xf~jPfV}yV11+T{3Ccq2d>m4fha`M@ z5;i>XW=hP243QH%oqo6kkN9Fp;^M@4qiDGe)|d|_p}Nz>ZupF5uSjbHAT1QLocx8O zXAU3IpLZSHbZ=dkVfreIBQn3zpV@uYT!+& n1z0re+MARYs}xKR4#?Lc{lb8glME@oU}=Hhq<+QoKkZDwn8I^( literal 0 HcmV?d00001 diff --git a/ajax/libs/ink/2.3.1/font/ubuntumono-bi-webfont.svg b/ajax/libs/ink/2.3.1/font/ubuntumono-bi-webfont.svg new file mode 100644 index 000000000..9a51532d6 --- /dev/null +++ b/ajax/libs/ink/2.3.1/font/ubuntumono-bi-webfont.svg @@ -0,0 +1,242 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ajax/libs/ink/2.3.1/font/ubuntumono-bi-webfont.ttf b/ajax/libs/ink/2.3.1/font/ubuntumono-bi-webfont.ttf new file mode 100644 index 0000000000000000000000000000000000000000..62e9d3d3f6240ba08d1345ceea524a4dd09dbfa7 GIT binary patch literal 52880 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

7(|0G*?-n!CV@nILvfCQKqUu0NNtfW&I29(25# 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

q9Gwfu!-3q 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 literal 0 HcmV?d00001 diff --git a/ajax/libs/ink/2.3.1/font/ubuntumono-r-webfont.eot b/ajax/libs/ink/2.3.1/font/ubuntumono-r-webfont.eot new file mode 100644 index 0000000000000000000000000000000000000000..5f01407e50f5411d2d28247f81f21cc187552c41 GIT binary patch literal 22522 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 literal 0 HcmV?d00001 diff --git a/ajax/libs/ink/2.3.1/font/ubuntumono-r-webfont.svg b/ajax/libs/ink/2.3.1/font/ubuntumono-r-webfont.svg new file mode 100644 index 000000000..3beefcd8c --- /dev/null +++ b/ajax/libs/ink/2.3.1/font/ubuntumono-r-webfont.svg @@ -0,0 +1,242 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ajax/libs/ink/2.3.1/font/ubuntumono-r-webfont.ttf b/ajax/libs/ink/2.3.1/font/ubuntumono-r-webfont.ttf new file mode 100644 index 0000000000000000000000000000000000000000..f3d77f549bfb36ba09afd272f3ba9a3b58790b60 GIT binary patch literal 48132 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 G#{L(1ui4=M literal 0 HcmV?d00001 diff --git a/ajax/libs/ink/2.3.1/font/ubuntumono-r-webfont.woff b/ajax/libs/ink/2.3.1/font/ubuntumono-r-webfont.woff new file mode 100644 index 0000000000000000000000000000000000000000..4e6c2cf936235a175f1d18280efaf178f2248d87 GIT binary patch literal 25976 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 literal 0 HcmV?d00001 diff --git a/ajax/libs/ink/2.3.1/font/ubuntumono-ri-webfont.eot b/ajax/libs/ink/2.3.1/font/ubuntumono-ri-webfont.eot new file mode 100644 index 0000000000000000000000000000000000000000..237d7e545d2e96a5847f465ce61c22b9c12b69a6 GIT binary patch literal 25753 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 Gqe(0TIY?6g literal 0 HcmV?d00001 diff --git a/ajax/libs/ink/2.3.1/font/ubuntumono-ri-webfont.svg b/ajax/libs/ink/2.3.1/font/ubuntumono-ri-webfont.svg new file mode 100644 index 000000000..0d169d053 --- /dev/null +++ b/ajax/libs/ink/2.3.1/font/ubuntumono-ri-webfont.svg @@ -0,0 +1,242 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ajax/libs/ink/2.3.1/font/ubuntumono-ri-webfont.ttf b/ajax/libs/ink/2.3.1/font/ubuntumono-ri-webfont.ttf new file mode 100644 index 0000000000000000000000000000000000000000..de3719ccd5bd82337c44fe47fb9ce007953b55a2 GIT binary patch literal 55820 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 Va`^#Gw@w8B00001P(}jp003E;APxWk literal 0 HcmV?d00001 diff --git a/ajax/libs/ink/2.3.1/js/autoload.js b/ajax/libs/ink/2.3.1/js/autoload.js new file mode 100644 index 000000000..b560e5483 --- /dev/null +++ b/ajax/libs/ink/2.3.1/js/autoload.js @@ -0,0 +1,76 @@ +Ink.createModule('Ink.Autoload', 1, ['Ink.Dom.Selector_1', 'Ink.Dom.Loaded_1', 'Ink.UI.SmoothScroller_1', 'Ink.UI.Close_1'], function( Selector, Loaded, Scroller, Close ){ + 'use strict'; + + var Autoload = { + selectors: { + /* Match module names to element classes (or more complex selectors) + * which get the UI modules instantiated automatically. */ + 'Animate_1' : '.ink-animate', + 'Carousel_1' : '.ink-carousel', + 'DatePicker_1' : '.ink-datepicker', + 'Gallery_1' : 'ul.ink-gallery-source', + 'Modal_1' : '.ink-modal', + 'ProgressBar_1' : '.ink-progress-bar', + 'SortableList_1': '.ink-sortable-list', + 'Spy_1' : '[data-spy="true"]', + 'Stacker_1' : '.ink-stacker', + 'Sticky_1' : '.ink-sticky, .sticky', + 'Table_1' : '.ink-table', + 'Tabs_1' : '.ink-tabs', + 'Toggle_1' : '.ink-toggle, .toggle', + 'Tooltip_1' : '.ink-tooltip, .tooltip', + 'TreeView_1' : '.ink-tree-view' + }, + defaultOptions: {}, + run: function (parentEl, options){ + options = options || {}; + + if (options.waitForDOMLoaded) { + Loaded.run(autoload); + } else { + autoload(); + } + + function autoload() { + for(var mod in Autoload.selectors) if (Autoload.selectors.hasOwnProperty(mod)) { + // `elements` need to be in a closure because requireModules is async. + findElements(mod); + } + if (options.createClose) { + new Close(); + } + if (options.createSmoothScroller) { + Scroller.init(); + } + } + + function findElements(mod) { + var modName = 'Ink.UI.' + mod; + var elements = Selector.select( Autoload.selectors[mod], parentEl ); + if( elements.length ){ + Ink.requireModules( [modName], function( Component ) { + for (var i = 0, len = elements.length; i < len; i++) { + new Component(elements[i], Autoload.defaultOptions[modName]); + } + }); + } + } + } + }; + + for (var k in Autoload.selectors) if (Autoload.selectors.hasOwnProperty(k)) { + Autoload.defaultOptions[k] = {}; + } + + if (!window.INK_NO_AUTO_LOAD) { + Autoload.run(document, { + waitForDOMLoaded: true, + createSmoothScroller: true, + createClose: true + }); + Autoload.firstRunDone = true; + } + + return Autoload; +}); + diff --git a/ajax/libs/ink/2.3.1/js/holder.js b/ajax/libs/ink/2.3.1/js/holder.js new file mode 100644 index 000000000..f85fc5457 --- /dev/null +++ b/ajax/libs/ink/2.3.1/js/holder.js @@ -0,0 +1,440 @@ +/* + +Holder - 1.9 - client side image placeholders +(c) 2012-2013 Ivan Malopinsky / http://imsky.co + +Provided under the Apache 2.0 License: http://www.apache.org/licenses/LICENSE-2.0 +Commercial use requires attribution. + +*/ + +var Holder = Holder || {}; +(function (app, win) { + +var preempted = false, +fallback = false, +canvas = document.createElement('canvas'); + +//getElementsByClassName polyfill +document.getElementsByClassName||(document.getElementsByClassName=function(e){var t=document,n,r,i,s=[];if(t.querySelectorAll)return t.querySelectorAll("."+e);if(t.evaluate){r=".//*[contains(concat(' ', @class, ' '), ' "+e+" ')]",n=t.evaluate(r,t,null,0,null);while(i=n.iterateNext())s.push(i)}else{n=t.getElementsByTagName("*"),r=new RegExp("(^|\\s)"+e+"(\\s|$)");for(i=0;i 1) { + text_height = template.size / (ctx.measureText(text).width / width); + } + //Resetting font size if necessary + ctx.font = "bold " + (text_height * ratio) + "px " + font; + ctx.fillText(text, (width / 2), (height / 2), width); + return canvas.toDataURL("image/png"); +} + +function render(mode, el, holder, src) { + var dimensions = holder.dimensions, + theme = holder.theme, + text = holder.text ? decodeURIComponent(holder.text) : holder.text; + var dimensions_caption = dimensions.width + "x" + dimensions.height; + + theme = (text ? extend(theme, { + text: text + }) : theme); + theme = (holder.font ? extend(theme, { + font: holder.font + }) : theme); + + if (mode == "image") { + el.setAttribute("data-src", src); + el.setAttribute("alt", text ? text : theme.text ? theme.text + " [" + dimensions_caption + "]" : dimensions_caption); + + if (fallback || !holder.auto) { + el.style.width = dimensions.width + "px"; + el.style.height = dimensions.height + "px"; + } + + if (fallback) { + el.style.backgroundColor = theme.background; + + } else { + el.setAttribute("src", draw(ctx, dimensions, theme, ratio)); + } + } else { + if (!fallback) { + el.style.backgroundImage = "url(" + draw(ctx, dimensions, theme, ratio) + ")"; + el.style.backgroundSize = dimensions.width + "px " + dimensions.height + "px"; + } + } +}; + +function fluid(el, holder, src) { + var dimensions = holder.dimensions, + theme = holder.theme, + text = holder.text; + var dimensions_caption = dimensions.width + "x" + dimensions.height; + theme = (text ? extend(theme, { + text: text + }) : theme); + + var fluid = document.createElement("div"); + + if (el.fluidRef) { + fluid = el.fluidRef; + } + + fluid.style.backgroundColor = theme.background; + fluid.style.color = theme.foreground; + fluid.className = el.className + " holderjs-fluid"; + fluid.style.width = holder.dimensions.width + (holder.dimensions.width.indexOf("%") > 0 ? "" : "px"); + fluid.style.height = holder.dimensions.height + (holder.dimensions.height.indexOf("%") > 0 ? "" : "px"); + fluid.id = el.id; + + el.style.width = 0; + el.style.height = 0; + + if (!el.fluidRef) { + + if (theme.text) { + fluid.appendChild(document.createTextNode(theme.text)) + } else { + fluid.appendChild(document.createTextNode(dimensions_caption)) + fluid_images.push(fluid); + setTimeout(fluid_update, 0); + } + + } + + el.fluidRef = fluid; + el.parentNode.insertBefore(fluid, el.nextSibling) + + if (window.jQuery) { + jQuery(function ($) { + $(el).on("load", function () { + el.style.width = fluid.style.width; + el.style.height = fluid.style.height; + $(el).show(); + $(fluid).remove(); + }); + }) + } +} + +function fluid_update() { + for (i in fluid_images) { + if (!fluid_images.hasOwnProperty(i)) continue; + var el = fluid_images[i], + label = el.firstChild; + + el.style.lineHeight = el.offsetHeight + "px"; + label.data = el.offsetWidth + "x" + el.offsetHeight; + } +} + +function parse_flags(flags, options) { + + var ret = { + theme: settings.themes.gray + }, render = false; + + for (sl = flags.length, j = 0; j < sl; j++) { + var flag = flags[j]; + if (app.flags.dimensions.match(flag)) { + render = true; + ret.dimensions = app.flags.dimensions.output(flag); + } else if (app.flags.fluid.match(flag)) { + render = true; + ret.dimensions = app.flags.fluid.output(flag); + ret.fluid = true; + } else if (app.flags.colors.match(flag)) { + ret.theme = app.flags.colors.output(flag); + } else if (options.themes[flag]) { + //If a theme is specified, it will override custom colors + ret.theme = options.themes[flag]; + } else if (app.flags.text.match(flag)) { + ret.text = app.flags.text.output(flag); + } else if (app.flags.font.match(flag)) { + ret.font = app.flags.font.output(flag); + } else if (app.flags.auto.match(flag)) { + ret.auto = true; + } + } + + return render ? ret : false; + +}; + + + +if (!canvas.getContext) { + fallback = true; +} else { + if (canvas.toDataURL("image/png") + .indexOf("data:image/png") < 0) { + //Android doesn't support data URI + fallback = true; + } else { + var ctx = canvas.getContext("2d"); + } +} + +var dpr = 1, bsr = 1; + +if(!fallback){ + dpr = window.devicePixelRatio || 1, + bsr = ctx.webkitBackingStorePixelRatio || ctx.mozBackingStorePixelRatio || ctx.msBackingStorePixelRatio || ctx.oBackingStorePixelRatio || ctx.backingStorePixelRatio || 1; +} + +var ratio = dpr / bsr; + +var fluid_images = []; + +var settings = { + domain: "holder.js", + images: "img", + bgnodes: ".holderjs", + themes: { + "gray": { + background: "#eee", + foreground: "#aaa", + size: 12 + }, + "social": { + background: "#3a5a97", + foreground: "#fff", + size: 12 + }, + "industrial": { + background: "#434A52", + foreground: "#C2F200", + size: 12 + }, + "ink": { + background: "#222", + foreground: "#fff", + size: 18 + } + }, + stylesheet: ".holderjs-fluid {font-size:16px;font-weight:bold;text-align:center;font-family:sans-serif;margin:0}" +}; + + +app.flags = { + dimensions: { + regex: /^(\d+)x(\d+)$/, + output: function (val) { + var exec = this.regex.exec(val); + return { + width: +exec[1], + height: +exec[2] + } + } + }, + fluid: { + regex: /^([0-9%]+)x([0-9%]+)$/, + output: function (val) { + var exec = this.regex.exec(val); + return { + width: exec[1], + height: exec[2] + } + } + }, + colors: { + regex: /#([0-9a-f]{3,})\:#([0-9a-f]{3,})/i, + output: function (val) { + var exec = this.regex.exec(val); + return { + size: settings.themes.gray.size, + foreground: "#" + exec[2], + background: "#" + exec[1] + } + } + }, + text: { + regex: /text\:(.*)/, + output: function (val) { + return this.regex.exec(val)[1]; + } + }, + font: { + regex: /font\:(.*)/, + output: function (val) { + return this.regex.exec(val)[1]; + } + }, + auto: { + regex: /^auto$/ + } +} + +for (var flag in app.flags) { + if (!app.flags.hasOwnProperty(flag)) continue; + app.flags[flag].match = function (val) { + return val.match(this.regex) + } +} + +app.add_theme = function (name, theme) { + name != null && theme != null && (settings.themes[name] = theme); + return app; +}; + +app.add_image = function (src, el) { + var node = selector(el); + if (node.length) { + for (var i = 0, l = node.length; i < l; i++) { + var img = document.createElement("img") + img.setAttribute("data-src", src); + node[i].appendChild(img); + } + } + return app; +}; + +app.run = function (o) { + var options = extend(settings, o), + images = [], imageNodes = [], bgnodes = []; + + if(typeof(options.images) == "string"){ + imageNodes = selector(options.images); + } + else if (window.NodeList && options.images instanceof window.NodeList) { + imageNodes = options.images; + } else if (window.Node && options.images instanceof window.Node) { + imageNodes = [options.images]; + } + + if(typeof(options.bgnodes) == "string"){ + bgnodes = selector(options.bgnodes); + } else if (window.NodeList && options.elements instanceof window.NodeList) { + bgnodes = options.bgnodes; + } else if (window.Node && options.bgnodes instanceof window.Node) { + bgnodes = [options.bgnodes]; + } + + preempted = true; + + for (i = 0, l = imageNodes.length; i < l; i++) images.push(imageNodes[i]); + + var holdercss = document.getElementById("holderjs-style"); + if (!holdercss) { + holdercss = document.createElement("style"); + holdercss.setAttribute("id", "holderjs-style"); + holdercss.type = "text/css"; + document.getElementsByTagName("head")[0].appendChild(holdercss); + } + + if (!options.nocss) { + if (holdercss.styleSheet) { + holdercss.styleSheet.cssText += options.stylesheet; + } else { + holdercss.appendChild(document.createTextNode(options.stylesheet)); + } + } + + + + var cssregex = new RegExp(options.domain + "\/(.*?)\"?\\)"); + + for (var l = bgnodes.length, i = 0; i < l; i++) { + var src = window.getComputedStyle(bgnodes[i], null) + .getPropertyValue("background-image"); + var flags = src.match(cssregex); + if (flags) { + var holder = parse_flags(flags[1].split("/"), options); + if (holder) { + render("background", bgnodes[i], holder, src); + } + } + } + + for (l = images.length, i = 0; i < l; i++) { + + var attr_src = attr_data_src = src = null; + + try{ + attr_src = images[i].getAttribute("src"); + attr_datasrc = images[i].getAttribute("data-src"); + }catch(e){} + + if (attr_datasrc == null && !! attr_src && attr_src.indexOf(options.domain) >= 0) { + src = attr_src; + } else if ( !! attr_datasrc && attr_datasrc.indexOf(options.domain) >= 0) { + src = attr_datasrc; + } + + if (src) { + var holder = parse_flags(src.substr(src.lastIndexOf(options.domain) + options.domain.length + 1) + .split("/"), options); + if (holder) { + if (holder.fluid) { + fluid(images[i], holder, src); + } else { + render("image", images[i], holder, src); + } + } + } + } + return app; +}; + +contentLoaded(win, function () { + if (window.addEventListener) { + window.addEventListener("resize", fluid_update, false); + window.addEventListener("orientationchange", fluid_update, false); + } else { + window.attachEvent("onresize", fluid_update) + } + preempted || app.run(); +}); + +if (typeof define === "function" && define.amd) { + define("Holder", [], function () { + return app; + }); +} + +})(Holder, window); diff --git a/ajax/libs/ink/2.3.1/js/html5shiv-printshiv.js b/ajax/libs/ink/2.3.1/js/html5shiv-printshiv.js new file mode 100644 index 000000000..b12379e0d --- /dev/null +++ b/ajax/libs/ink/2.3.1/js/html5shiv-printshiv.js @@ -0,0 +1,11 @@ +/* + HTML5 Shiv v3.7.0 | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed +*/ +(function(j,f){function s(a,b){var c=a.createElement("p"),m=a.getElementsByTagName("head")[0]||a.documentElement;c.innerHTML="x";return m.insertBefore(c.lastChild,m.firstChild)}function o(){var a=d.elements;return"string"==typeof a?a.split(" "):a}function n(a){var b=t[a[u]];b||(b={},p++,a[u]=p,t[p]=b);return b}function v(a,b,c){b||(b=f);if(e)return b.createElement(a);c||(c=n(b));b=c.cache[a]?c.cache[a].cloneNode():y.test(a)?(c.cache[a]=c.createElem(a)).cloneNode():c.createElem(a); +return b.canHaveChildren&&!z.test(a)?c.frag.appendChild(b):b}function A(a,b){if(!b.cache)b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag();a.createElement=function(c){return!d.shivMethods?b.createElem(c):v(c,a,b)};a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+o().join().replace(/\w+/g,function(a){b.createElem(a);b.frag.createElement(a);return'c("'+a+'")'})+");return n}")(d,b.frag)} +function w(a){a||(a=f);var b=n(a);if(d.shivCSS&&!q&&!b.hasCSS)b.hasCSS=!!s(a,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}");e||A(a,b);return a}function B(a){for(var b,c=a.attributes,m=c.length,f=a.ownerDocument.createElement(l+":"+a.nodeName);m--;)b=c[m],b.specified&&f.setAttribute(b.nodeName,b.nodeValue);f.style.cssText=a.style.cssText;return f}function x(a){function b(){clearTimeout(d._removeSheetTimer); +c&&c.removeNode(!0);c=null}var c,f,d=n(a),e=a.namespaces,j=a.parentWindow;if(!C||a.printShived)return a;"undefined"==typeof e[l]&&e.add(l);j.attachEvent("onbeforeprint",function(){b();var g,i,d;d=a.styleSheets;for(var e=[],h=d.length,k=Array(h);h--;)k[h]=d[h];for(;d=k.pop();)if(!d.disabled&&D.test(d.media)){try{g=d.imports,i=g.length}catch(j){i=0}for(h=0;h+~])("+o().join("|")+")(?=[[\\s,>+~#.:]|$)", +"gi");for(k="$1"+l+"\\:$2";i--;)e=g[i]=g[i].split("}"),e[e.length-1]=e[e.length-1].replace(h,k),g[i]=e.join("}");e=g.join("{");i=a.getElementsByTagName("*");h=i.length;k=RegExp("^(?:"+o().join("|")+")$","i");for(d=[];h--;)g=i[h],k.test(g.nodeName)&&d.push(g.applyElement(B(g)));f=d;c=s(a,e)});j.attachEvent("onafterprint",function(){for(var a=f,c=a.length;c--;)a[c].removeNode();clearTimeout(d._removeSheetTimer);d._removeSheetTimer=setTimeout(b,500)});a.printShived=!0;return a}var r=j.html5||{},z=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i, +y=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,q,u="_html5shiv",p=0,t={},e;(function(){try{var a=f.createElement("a");a.innerHTML="";q="hidden"in a;var b;if(!(b=1==a.childNodes.length)){f.createElement("a");var c=f.createDocumentFragment();b="undefined"==typeof c.cloneNode||"undefined"==typeof c.createDocumentFragment||"undefined"==typeof c.createElement}e=b}catch(d){e=q=!0}})();var d={elements:r.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output progress section summary template time video", +version:"3.7.0",shivCSS:!1!==r.shivCSS,supportsUnknownElements:e,shivMethods:!1!==r.shivMethods,type:"default",shivDocument:w,createElement:v,createDocumentFragment:function(a,b){a||(a=f);if(e)return a.createDocumentFragment();for(var b=b||n(a),c=b.frag.cloneNode(),d=0,j=o(),l=j.length;darticle,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}"; +c=d.insertBefore(c.lastChild,d.firstChild);b.hasCSS=!!c}g||t(a,b);return a}var k=l.html5||{},s=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,r=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,j,o="_html5shiv",h=0,n={},g;(function(){try{var a=f.createElement("a");a.innerHTML="";j="hidden"in a;var b;if(!(b=1==a.childNodes.length)){f.createElement("a");var c=f.createDocumentFragment();b="undefined"==typeof c.cloneNode|| +"undefined"==typeof c.createDocumentFragment||"undefined"==typeof c.createElement}g=b}catch(d){g=j=!0}})();var e={elements:k.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output progress section summary template time video",version:"3.7.0",shivCSS:!1!==k.shivCSS,supportsUnknownElements:g,shivMethods:!1!==k.shivMethods,type:"default",shivDocument:q,createElement:p,createDocumentFragment:function(a,b){a||(a=f); +if(g)return a.createDocumentFragment();for(var b=b||i(a),c=b.frag.cloneNode(),d=0,e=m(),h=e.length;d 0) { + pRMs.push(o); + } + else { + cb = o.cb; + if (!cb) { continue; } + delete o.cb; // to make sure I won't call this more than once! + cb.apply(false, o.args); + } + } + + pendingRMs = pRMs; + + if (pendingRMs.length > 0) { + setTimeout( function() { Ink._checkPendingRequireModules(); }, 0 ); + } + }, + + /** + * Get the path of a certain module by looking up the paths given in setPath (and ultimately the default Ink path) + * + * @method getPath + * @param modName Name of the module you want the path of. + * @param noLib Exclude the 'lib.js' filename + */ + getPath: function(key, noLib) { + var split = key.split(/[._]/g); + var curKey; + var i; + var root; + var path; + // Look for Ink.Dom.Element.1, Ink.Dom.Element, Ink.Dom, Ink in this order. + for (i = split.length; i >= 0; i -= 1) { + curKey = split.slice(0, i + 1).join('.'); // See comment in setPath + if (paths[curKey]) { + root = curKey; + break; + } + } + path = paths[root || 'Ink']; + if (!/\/$/.test(path)) { + path += '/'; + } + if (i < split.length) { + path += split.slice(i + 1).join('/') + '/'; + } + if (!noLib) { + path += 'lib.js'; + } + return path; + }, + + /** + * Sets the URL path for a namespace. Use this to customize where + * requireModules (and createModule) will load dependencies from. + * + * @method setPath + * + * @param key + * @param rootURI + * + * @example + * Ink.setPath('Ink', 'http://my-cdn/Ink/'); + * Ink.setPath('Lol', 'http://my-cdn/Lol/'); + * + * // Loads from http://my-cdn/Ink/Dom/Whatever/lib.js + * Ink.requireModules(['Ink.Dom.Whatever'], function () { ... }); + * // Loads from http://my-cdn/Lol/Whatever/lib.js + * Ink.requireModules(['Lol.Whatever'], function () { ... }); + */ + setPath: function(key, rootURI) { + // Replacing version separator with dot because the difference + // between a submodule and a version doesn't matter here. + // It would also overcomplicate the implementation of getPath + paths[key.replace(/_/, '.')] = rootURI; + }, + + /** + * Loads a script by creating a ` + */ + var Browser = { + /** + * True if the browser is Internet Explorer + * + * @property IE + * @type {Boolean} + * @public + * @static + */ + IE: false, + + /** + * True if the browser is Gecko based + * + * @property GECKO + * @type {Boolean} + * @public + * @static + */ + GECKO: false, + + /** + * True if the browser is Opera + * + * @property OPERA + * @type {Boolean} + * @public + * @static + */ + OPERA: false, + + /** + * True if the browser is Safari + * + * @property SAFARI + * @type {Boolean} + * @public + * @static + */ + SAFARI: false, + + /** + * True if the browser is Konqueror + * + * @property KONQUEROR + * @type {Boolean} + * @public + * @static + */ + KONQUEROR: false, + + /** + * True if browser is Chrome + * + * @property CHROME + * @type {Boolean} + * @public + * @static + */ + CHROME: false, + + /** + * The specific browser model. False if it is unavailable. + * + * @property model + * @type {Boolean|String} + * @public + * @static + */ + model: false, + + /** + * The browser version. False if it is unavailable. + * + * @property version + * @type {Boolean|String} + * @public + * @static + */ + version: false, + + /** + * The user agent string. False if it is unavailable. + * + * @property userAgent + * @type {Boolean|String} + * @public + * @static + */ + userAgent: false, + + /** + * Initialization function for the Browser object. + * + * Is called automatically when this module is loaded, and calls setDimensions, setBrowser and setReferrer. + * + * @method init + * @public + */ + init: function() { + this.detectBrowser(); + this.setDimensions(); + this.setReferrer(); + }, + + /** + * Retrieves and stores window dimensions in this object. Called automatically when this module is loaded. + * + * @method setDimensions + * @public + */ + setDimensions: function() { + //this.windowWidth=window.innerWidth !== null? window.innerWidth : document.documentElement && document.documentElement.clientWidth ? document.documentElement.clientWidth : document.body !== null ? document.body.clientWidth : null; + //this.windowHeight=window.innerHeight != null? window.innerHeight : document.documentElement && document.documentElement.clientHeight ? document.documentElement.clientHeight : document.body != null? document.body.clientHeight : null; + var myWidth = 0, myHeight = 0; + if ( typeof window.innerWidth=== 'number' ) { + myWidth = window.innerWidth; + myHeight = window.innerHeight; + } else if( document.documentElement && ( document.documentElement.clientWidth || document.documentElement.clientHeight ) ) { + myWidth = document.documentElement.clientWidth; + myHeight = document.documentElement.clientHeight; + } else if( document.body && ( document.body.clientWidth || document.body.clientHeight ) ) { + myWidth = document.body.clientWidth; + myHeight = document.body.clientHeight; + } + this.windowWidth = myWidth; + this.windowHeight = myHeight; + }, + + /** + * Stores the referrer. Called automatically when this module is loaded. + * + * @method setReferrer + * @public + */ + setReferrer: function() { + if (document.referrer && document.referrer.length) { + this.referrer = window.escape(document.referrer); + } else { + this.referrer = false; + } + }, + + /** + * Detects the browser and stores the found properties. Called automatically when this module is loaded. + * + * @method detectBrowser + * @public + */ + detectBrowser: function() { + this._sniffUserAgent(navigator.userAgent); + }, + + _sniffUserAgent: function (sAgent) { + this.userAgent = sAgent; + + sAgent = sAgent.toLowerCase(); + + if (/applewebkit\//.test(sAgent)) { + this.cssPrefix = '-webkit-'; + this.domPrefix = 'Webkit'; + if(/(chrome|crios)\//.test(sAgent)) { + // Chrome + this.CHROME = true; + this.model = 'chrome'; + this.version = sAgent.replace(/(.*)chrome\/([^\s]+)(.*)/, "$2"); + } else { + // Safari + this.SAFARI = true; + this.model = 'safari'; + var rVersion = /version\/([^) ]+)/; + if (rVersion.test(sAgent)) { + this.version = sAgent.match(rVersion)[1]; + } else { + this.version = sAgent.replace(/(.*)applewebkit\/([^\s]+)(.*)/, "$2"); + } + } + } else if (/opera/.test(sAgent)) { + // Opera + this.OPERA = true; + this.model = 'opera'; + this.version = sAgent.replace(/(.*)opera.([^\s$]+)(.*)/, "$2"); + this.cssPrefix = '-o-'; + this.domPrefix = 'O'; + } else if (/konqueror/.test(sAgent)) { + // Konqueroh + this.KONQUEROR = true; + this.model = 'konqueror'; + this.version = sAgent.replace(/(.*)konqueror\/([^;]+);(.*)/, "$2"); + this.cssPrefix = '-khtml-'; + this.domPrefix = 'Khtml'; + } else if (/(msie|trident)/i.test(sAgent)) { + // MSIE + this.IE = true; + this.model = 'ie'; + if (/rv:((?:\d|\.)+)/.test(sAgent)) { // IE 11 + this.version = sAgent.match(/rv:((?:\d|\.)+)/)[1]; + } else { + this.version = sAgent.replace(/(.*)\smsie\s([^;]+);(.*)/, "$2"); + } + this.cssPrefix = '-ms-'; + this.domPrefix = 'ms'; + } else if (/gecko/.test(sAgent)) { + // GECKO + // Supports only: + // Camino, Chimera, Epiphany, Minefield (firefox 3), Firefox, Firebird, Phoenix, Galeon, + // Iceweasel, K-Meleon, SeaMonkey, Netscape, Songbird, Sylera, + this.cssPrefix = '-moz-'; + this.domPrefix = 'Moz'; + + this.GECKO = true; + + var re = /(camino|chimera|epiphany|minefield|firefox|firebird|phoenix|galeon|iceweasel|k\-meleon|seamonkey|netscape|songbird|sylera)/; + if(re.test(sAgent)) { + this.model = sAgent.match(re)[1]; + this.version = sAgent.replace(new RegExp("(.*)"+this.model+"\/([^;\\s$]+)(.*)"), "$2"); + } else { + // probably is mozilla + this.model = 'mozilla'; + var reVersion = /(.*)rv:([^)]+)(.*)/; + if(reVersion.test(sAgent)) { + this.version = sAgent.replace(reVersion, "$2"); + } + } + } + }, + + /** + * Debug function which displays browser (and Ink.Dom.Browser) information as an alert message. + * + * @method debug + * @public + * + * @example + * + * The following code + * + * Ink.requireModules(['Ink.Dom.Browser_1'], function (Browser) { + * Browser.debug(); + * }); + * + * Alerts (On Firefox 22): + * + * known browsers: (ie, gecko, opera, safari, konqueror) + * false,true,false,false,false + * model -> firefox + * version -> 22.0 + * + * original UA -> Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:22.0) Gecko/20100101 Firefox/22.0 + */ + debug: function() { + /*global alert:false */ + var str = "known browsers: (ie, gecko, opera, safari, konqueror) \n"; + str += [this.IE, this.GECKO, this.OPERA, this.SAFARI, this.KONQUEROR] +"\n"; + str += "model -> "+this.model+"\n"; + str += "version -> "+this.version+"\n"; + str += "\n"; + str += "original UA -> "+this.userAgent; + + alert(str); + } + }; + + Browser.init(); + + return Browser; +}); + +/** + * @author inkdev AT sapo.pt + */ + +Ink.createModule( 'Ink.Dom.Css', 1, [], function() { + + 'use strict'; + + /** + * @module Ink.Dom.Css_1 + */ + + // getComputedStyle feature detection. + var getCs = ("defaultView" in document) && ("getComputedStyle" in document.defaultView) ? document.defaultView.getComputedStyle : window.getComputedStyle; + + /** + * @class Ink.Dom.Css + * @static + */ + + var Css = { + /** + * adds or removes a class to the given element according to addRemState + * + * @method addRemoveClassName + * @param {DOMElement|string} elm DOM element or element id + * @param {string} className class name to add or remove. + * @param {boolean} addRemState Whether to add or remove. `true` to add, `false` to remove. + * + * @example + * Ink.requireModules(['Ink.Dom.Css_1'], function (Css) { + * Css.addRemoveClassName(myElm, 'classss', true); // Adds the `classss` class. + * Css.addRemoveClassName(myElm, 'classss', false); // Removes the `classss` class. + * }); + */ + addRemoveClassName: function(elm, className, addRemState) { + if (addRemState) { + return this.addClassName(elm, className); + } + this.removeClassName(elm, className); + }, + + /** + * add a class to a given element + * + * @method addClassName + * @param {DOMElement|String} elm DOM element or element id + * @param {String} className + */ + addClassName: function(elm, className) { + elm = Ink.i(elm); + if (!elm || !className) { return null; } + className = ('' + className).split(/[, ]+/); + var i = 0; + var len = className.length; + + for (; i < len; i++) { + if (typeof elm.classList !== "undefined") { + elm.classList.add(className[i]); + } else if (!Css.hasClassName(elm, className[i])) { + elm.className += (elm.className ? ' ' : '') + className[i]; + } + } + }, + + /** + * removes a class from a given element + * + * @method removeClassName + * @param {DOMElement|String} elm DOM element or element id + * @param {String} className + */ + removeClassName: function(elm, className) { + elm = Ink.i(elm); + if (!elm || !className) { return null; } + + className = ('' + className).split(/[, ]+/); + var i = 0; + var len = className.length; + + if (typeof elm.classList !== "undefined"){ + for (; i < len; i++) { + elm.classList.remove(className[i]); + } + } else { + var elmClassName = elm.className || ''; + var re; + for (; i < len; i++) { + re = new RegExp("(^|\\s+)" + className[i] + "(\\s+|$)"); + elmClassName = elmClassName.replace(re, ' '); + } + elm.className = (elmClassName + .replace(/^\s+/, '') + .replace(/\s+$/, '')); + } + }, + + /** + * Alias to addRemoveClassName. Utility function, saves many if/elses. + * + * @method setClassName + * @param {DOMElement|String} elm DOM element or element id + * @param {String} className + * @param {Boolean} add true to add, false to remove + */ + setClassName: function(elm, className, add) { + this.addRemoveClassName(elm, className, add || false); + }, + + /** + * @method hasClassName + * @param {DOMElement|String} elm DOM element or element id + * @param {String|Array} classNames classNames to test + * @param {Boolean} [all=false] if true, return whether all classes in classNames are there. Otherwise, return true if any is present. + * @return {Boolean} true if a given class is applied to a given element + */ + hasClassName: function(elm, className, all) { + elm = Ink.i(elm); + if (!elm || !className) { return false; } + + className = ('' + className).split(/[, ]+/); + var i = 0; + var len = className.length; + var has; + var re; + + for ( ; i < len; i++) { + if (typeof elm.classList !== "undefined"){ + has = elm.classList.contains(className[i]); + } else { + var elmClassName = elm.className; + if (elmClassName === className[i]) { + has = true; + } else { + re = new RegExp("(^|\\s)" + className[i] + "(\\s|$)"); + has = re.test(elmClassName); + } + } + if (has && !all) { return true; } // return if looking for any class + if (!has && all) { return false; } // return if looking for all classes + } + + if (all) { + // if we got here, all classes were found so far + return true; + } else { + // if we got here with all == false, no class was found + return false; + } + }, + + /** + * Add and removes the class from the element with a timeout, so it blinks + * + * @method blinkClass + * @param {DOMElement|String} elm DOM element or element id + * @param {String} className class name + * @param {Boolean} timeout timeout in ms between adding and removing, default 100 ms + * @param {Boolean} negate is true, class is removed then added + */ + blinkClass: function(element, className, timeout, negate){ + element = Ink.i(element); + Css.addRemoveClassName(element, className, !negate); + setTimeout(function() { + Css.addRemoveClassName(element, className, negate); + }, Number(timeout) || 100); + }, + + /** + * Add or remove a class name from a given element + * + * @method toggleClassName + * @param {DOMElement|String} elm DOM element or element id + * @param {String} className class name + * @param {Boolean} forceAdd forces the addition of the class if it doesn't exists + */ + toggleClassName: function(elm, className, forceAdd) { + if (elm && className){ + if (typeof elm.classList !== "undefined" && !/[, ]/.test(className)){ + elm = Ink.i(elm); + if (elm !== null){ + elm.classList.toggle(className); + } + return true; + } + } + + if (typeof forceAdd !== 'undefined') { + if (forceAdd === true) { + Css.addClassName(elm, className); + } + else if (forceAdd === false) { + Css.removeClassName(elm, className); + } + } else { + if (Css.hasClassName(elm, className)) { + Css.removeClassName(elm, className); + } else { + Css.addClassName(elm, className); + } + } + }, + + /** + * sets the opacity of given client a given element + * + * @method setOpacity + * @param {DOMElement|String} elm DOM element or element id + * @param {Number} value allows 0 to 1(default mode decimal) or percentage (warning using 0 or 1 will reset to default mode) + */ + setOpacity: function(elm, value) { + elm = Ink.i(elm); + if (elm !== null){ + var val = 1; + + if (!isNaN(Number(value))){ + if (value <= 0) { val = 0; } + else if (value <= 1) { val = value; } + else if (value <= 100) { val = value / 100; } + else { val = 1; } + } + + if (typeof elm.style.opacity !== 'undefined') { + elm.style.opacity = val; + } + else { + elm.style.filter = "alpha(opacity:"+(val*100|0)+")"; + } + } + }, + + /** + * Converts a css property name to a string in camelcase to be used with CSSStyleDeclaration. + * @method _camelCase + * @private + * @param {String} str String to convert + * @return {String} Converted string + */ + _camelCase: function(str) { + return str ? str.replace(/-(\w)/g, function (_, $1) { + return $1.toUpperCase(); + }) : str; + }, + + + /** + * Gets the value for an element's style attribute + * + * @method getStyle + * @param {DOMElement|String} elm DOM element or element id + * @param {String} style Which css attribute to fetch + * @return Style value + */ + getStyle: function(elm, style) { + elm = Ink.i(elm); + if (elm !== null) { + style = style === 'float' ? 'cssFloat': this._camelCase(style); + + var value = elm.style[style]; + + if (getCs && (!value || value === 'auto')) { + var css = getCs(elm, null); + value = css ? css[style] : null; + } + else if (!value && elm.currentStyle) { + value = elm.currentStyle[style]; + if (value === 'auto' && (style === 'width' || style === 'height')) { + value = elm["offset" + style.charAt(0).toUpperCase() + style.slice(1)] + "px"; + } + } + + if (style === 'opacity') { + return value ? parseFloat(value, 10) : 1.0; + } + else if (style === 'borderTopWidth' || style === 'borderBottomWidth' || + style === 'borderRightWidth' || style === 'borderLeftWidth' ) { + if (value === 'thin') { return '1px'; } + else if (value === 'medium') { return '3px'; } + else if (value === 'thick') { return '5px'; } + } + + return value === 'auto' ? null : value; + } + }, + + + /** + * Adds CSS rules to an element's style attribute. + * + * @method setStyle + * @param {DOMElement|String} elm DOM element or element id + * @param {String} style Which css attribute to set + * + * @example + * Change his color + *

"He" is me

+ * + * + */ + setStyle: function(elm, style) { + elm = Ink.i(elm); + if (elm === null) { return; } + if (typeof style === 'string') { + elm.style.cssText += '; '+style; + + if (style.indexOf('opacity') !== -1) { + this.setOpacity(elm, style.match(/opacity:\s*(\d?\.?\d*)/)[1]); + } + } + else { + for (var prop in style) { + if (style.hasOwnProperty(prop)){ + if (prop === 'opacity') { + this.setOpacity(elm, style[prop]); + } + else if (prop === 'float' || prop === 'cssFloat') { + if (typeof elm.style.styleFloat === 'undefined') { + elm.style.cssFloat = style[prop]; + } + else { + elm.style.styleFloat = style[prop]; + } + } else { + elm.style[prop] = style[prop]; + } + } + } + } + }, + + + /** + * Makes an element visible + * + * @method show + * @param {DOMElement|String} elm DOM element or element id + * @param {String} forceDisplayProperty Css display property to apply on show + */ + show: function(elm, forceDisplayProperty) { + elm = Ink.i(elm); + if (elm !== null) { + elm.style.display = (forceDisplayProperty) ? forceDisplayProperty : ''; + } + }, + + /** + * Hides an element + * + * @method hide + * @param {DOMElement|String} elm DOM element or element id + */ + hide: function(elm) { + elm = Ink.i(elm); + if (elm !== null) { + elm.style.display = 'none'; + } + }, + + /** + * shows or hides according to param show + * + * @method showHide + * @param {DOMElement|String} elm DOM element or element id + * @param {boolean} [show=false] Whether to show or hide `elm`. + */ + showHide: function(elm, show) { + elm = Ink.i(elm); + if (elm) { + elm.style.display = show ? '' : 'none'; + } + }, + + /** + * Shows or hides an element depending on current state + * @method toggle + * @param {DOMElement|String} elm DOM element or element id + * @param {Boolean} forceShow Forces showing if element is hidden + */ + toggle: function(elm, forceShow) { + elm = Ink.i(elm); + if (elm !== null) { + if (typeof forceShow !== 'undefined') { + if (forceShow === true) { + this.show(elm); + } else { + this.hide(elm); + } + } else { + if (this.getStyle(elm,'display').toLowerCase() === 'none') { + this.show(elm); + } + else { + this.hide(elm); + } + } + } + }, + + _getRefTag: function(head){ + if (head.firstElementChild) { + return head.firstElementChild; + } + + for (var child = head.firstChild; child; child = child.nextSibling){ + if (child.nodeType === 1){ + return child; + } + } + return null; + }, + + /** + * Adds css style tags to the head section of a page + * + * @method appendStyleTag + * @param {String} selector The css selector for the rule + * @param {String} style The content of the style rule + * @param {Object} options Options for the tag + * @param {String} [options.type] file type + * @param {Boolean} [options.force] if true, style tag will be appended to end of head + */ + appendStyleTag: function(selector, style, options){ + options = Ink.extendObj({ + type: 'text/css', + force: false + }, options || {}); + + var styles = document.getElementsByTagName("style"), + oldStyle = false, setStyle = true, i, l; + + for (i=0, l=styles.length; i= 0) { + setStyle = false; + } + } + + if (setStyle) { + var defStyle = document.createElement("style"), + head = document.getElementsByTagName("head")[0], + refTag = false, styleStr = ''; + + defStyle.type = options.type; + + styleStr += selector +" {"; + styleStr += style; + styleStr += "} "; + + if (typeof defStyle.styleSheet !== "undefined") { + defStyle.styleSheet.cssText = styleStr; + } else { + defStyle.appendChild(document.createTextNode(styleStr)); + } + + if (options.force){ + head.appendChild(defStyle); + } else { + refTag = this._getRefTag(head); + if (refTag){ + head.insertBefore(defStyle, refTag); + } + } + } + }, + + /** + * Adds a link tag for a stylesheet to the head section of a page + * + * @method appendStylesheet + * @param {String} path File path + * @param {Object} options Options for the tag + * @param {String} [options.media='screen'] media type + * @param {String} [options.type='text/css'] file type + * @param {Boolean} [options.force=false] if true, tag will be appended to end of head + */ + appendStylesheet: function(path, options){ + options = Ink.extendObj({ + media: 'screen', + type: 'text/css', + force: false + }, options || {}); + + var refTag, + style = document.createElement("link"), + head = document.getElementsByTagName("head")[0]; + + style.media = options.media; + style.type = options.type; + style.href = path; + style.rel = "Stylesheet"; + + if (options.force){ + head.appendChild(style); + } + else { + refTag = this._getRefTag(head); + if (refTag){ + head.insertBefore(style, refTag); + } + } + }, + + /** + * Loads CSS via LINK element inclusion in HEAD (skips append if already there) + * + * Works similarly to appendStylesheet but: + * a) supports all browsers; + * b) supports optional callback which gets invoked once the CSS has been applied + * + * @method appendStylesheetCb + * @param {String} cssURI URI of the CSS to load, if empty ignores and just calls back directly + * @param {Function(cssURI)} [callback] optional callback which will be called once the CSS is loaded + */ + _loadingCSSFiles: {}, + _loadedCSSFiles: {}, + appendStylesheetCb: function(url, callback) { + if (!url) { + return callback(url); + } + + if (this._loadedCSSFiles[url]) { + return callback(url); + } + + var cbs = this._loadingCSSFiles[url]; + if (cbs) { + return cbs.push(callback); + } + + this._loadingCSSFiles[url] = [callback]; + + var linkEl = document.createElement('link'); + linkEl.type = 'text/css'; + linkEl.rel = 'stylesheet'; + linkEl.href = url; + + var headEl = document.getElementsByTagName('head')[0]; + headEl.appendChild(linkEl); + + var imgEl = document.createElement('img'); + /* + var _self = this; + (function(_url) { + imgEl.onerror = function() { + //var url = this; + var url = _url; + _self._loadedCSSFiles[url] = true; + var callbacks = _self._loadingCSSFiles[url]; + for (var i = 0, f = callbacks.length; i < f; ++i) { + callbacks[i](url); + } + delete _self._loadingCSSFiles[url]; + }; + })(url); + */ + imgEl.onerror = Ink.bindEvent(function(event, _url) { + //var url = this; + var url = _url; + this._loadedCSSFiles[url] = true; + var callbacks = this._loadingCSSFiles[url]; + for (var i = 0, f = callbacks.length; i < f; ++i) { + callbacks[i](url); + } + delete this._loadingCSSFiles[url]; + }, this, url); + imgEl.src = url; + }, + + /** + * Converts decimal to hexadecimal values, for use with colors + * + * @method decToHex + * @param {String} dec Either a single decimal value, + * an rgb(r, g, b) string or an Object with r, g and b properties + * @return Hexadecimal value + */ + decToHex: function(dec) { + var normalizeTo2 = function(val) { + if (val.length === 1) { + val = '0' + val; + } + val = val.toUpperCase(); + return val; + }; + + if (typeof dec === 'object') { + var rDec = normalizeTo2(parseInt(dec.r, 10).toString(16)); + var gDec = normalizeTo2(parseInt(dec.g, 10).toString(16)); + var bDec = normalizeTo2(parseInt(dec.b, 10).toString(16)); + return rDec+gDec+bDec; + } + else { + dec += ''; + var rgb = dec.match(/\((\d+),\s?(\d+),\s?(\d+)\)/); + if (rgb !== null) { + return normalizeTo2(parseInt(rgb[1], 10).toString(16)) + + normalizeTo2(parseInt(rgb[2], 10).toString(16)) + + normalizeTo2(parseInt(rgb[3], 10).toString(16)); + } + else { + return normalizeTo2(parseInt(dec, 10).toString(16)); + } + } + }, + + /** + * Converts hexadecimal values to decimal, for use with colors + * + * @method hexToDec + * @param {String} hex hexadecimal value with 6, 3, 2 or 1 characters + * @return {Number} Object with properties r, g, b if length of number is >= 3 or decimal value instead. + */ + hexToDec: function(hex){ + if (hex.indexOf('#') === 0) { + hex = hex.substr(1); + } + if (hex.length === 6) { // will return object RGB + return { + r: parseInt(hex.substr(0,2), 16), + g: parseInt(hex.substr(2,2), 16), + b: parseInt(hex.substr(4,2), 16) + }; + } + else if (hex.length === 3) { // will return object RGB + return { + r: parseInt(hex.charAt(0) + hex.charAt(0), 16), + g: parseInt(hex.charAt(1) + hex.charAt(1), 16), + b: parseInt(hex.charAt(2) + hex.charAt(2), 16) + }; + } + else if (hex.length <= 2) { // will return int + return parseInt(hex, 16); + } + }, + + /** + * use this to obtain the value of a CSS property (searched from loaded CSS documents) + * + * @method getPropertyFromStylesheet + * @param {String} selector a CSS rule. must be an exact match + * @param {String} property a CSS property + * @return {String} value of the found property, or null if it wasn't matched + */ + getPropertyFromStylesheet: function(selector, property) { + var rule = this.getRuleFromStylesheet(selector); + if (rule) { + return rule.style[property]; + } + return null; + }, + + getPropertyFromStylesheet2: function(selector, property) { + var rules = this.getRulesFromStylesheet(selector); + /* + rules.forEach(function(rule) { + var x = rule.style[property]; + if (x !== null && x !== undefined) { + return x; + } + }); + */ + var x; + for(var i=0, t=rules.length; i < t; i++) { + x = rules[i].style[property]; + if (x !== null && x !== undefined) { + return x; + } + } + return null; + }, + + getRuleFromStylesheet: function(selector) { + var sheet, rules, ri, rf, rule; + var s = document.styleSheets; + if (!s) { + return null; + } + + for (var si = 0, sf = document.styleSheets.length; si < sf; ++si) { + sheet = document.styleSheets[si]; + rules = sheet.rules ? sheet.rules : sheet.cssRules; + if (!rules) { return null; } + + for (ri = 0, rf = rules.length; ri < rf; ++ri) { + rule = rules[ri]; + if (!rule.selectorText) { continue; } + if (rule.selectorText === selector) { + return rule; + } + } + } + + return null; + }, + + getRulesFromStylesheet: function(selector) { + var res = []; + var sheet, rules, ri, rf, rule; + var s = document.styleSheets; + if (!s) { return res; } + + for (var si = 0, sf = document.styleSheets.length; si < sf; ++si) { + sheet = document.styleSheets[si]; + rules = sheet.rules ? sheet.rules : sheet.cssRules; + if (!rules) { + return null; + } + + for (ri = 0, rf = rules.length; ri < rf; ++ri) { + rule = rules[ri]; + if (!rule.selectorText) { continue; } + if (rule.selectorText === selector) { + res.push(rule); + } + } + } + + return res; + }, + + getPropertiesFromRule: function(selector) { + var rule = this.getRuleFromStylesheet(selector); + var props = {}; + var prop, i, f; + + /*if (typeof rule.style.length === 'snumber') { + for (i = 0, f = rule.style.length; i < f; ++i) { + prop = this._camelCase( rule.style[i] ); + props[prop] = rule.style[prop]; + } + } + else { // HANDLES IE 8, FIREFOX RULE JOINING... */ + rule = rule.style.cssText; + var parts = rule.split(';'); + var steps, val, pre, pos; + for (i = 0, f = parts.length; i < f; ++i) { + if (parts[i].charAt(0) === ' ') { + parts[i] = parts[i].substring(1); + } + steps = parts[i].split(':'); + prop = this._camelCase( steps[0].toLowerCase() ); + val = steps[1]; + if (val) { + val = val.substring(1); + + if (prop === 'padding' || prop === 'margin' || prop === 'borderWidth') { + + if (prop === 'borderWidth') { pre = 'border'; pos = 'Width'; } + else { pre = prop; pos = ''; } + + if (val.indexOf(' ') !== -1) { + val = val.split(' '); + props[pre + 'Top' + pos] = val[0]; + props[pre + 'Bottom'+ pos] = val[0]; + props[pre + 'Left' + pos] = val[1]; + props[pre + 'Right' + pos] = val[1]; + } + else { + props[pre + 'Top' + pos] = val; + props[pre + 'Bottom'+ pos] = val; + props[pre + 'Left' + pos] = val; + props[pre + 'Right' + pos] = val; + } + } + else if (prop === 'borderRadius') { + if (val.indexOf(' ') !== -1) { + val = val.split(' '); + props.borderTopLeftRadius = val[0]; + props.borderBottomRightRadius = val[0]; + props.borderTopRightRadius = val[1]; + props.borderBottomLeftRadius = val[1]; + } + else { + props.borderTopLeftRadius = val; + props.borderTopRightRadius = val; + props.borderBottomLeftRadius = val; + props.borderBottomRightRadius = val; + } + } + else { + props[prop] = val; + } + } + } + //} + //console.log(props); + + return props; + }, + + /** + * Changes the font size of the elements which match the given CSS rule + * For this function to work, the CSS file must be in the same domain than the host page, otherwise JS can't access it. + * + * @method changeFontSize + * @param {String} selector CSS selector rule + * @param {Number} delta number of pixels to change on font-size + * @param {String} [op] supported operations are '+' and '*'. defaults to '+' + * @param {Number} [minVal] if result gets smaller than minVal, change does not occurr + * @param {Number} [maxVal] if result gets bigger than maxVal, change does not occurr + */ + changeFontSize: function(selector, delta, op, minVal, maxVal) { + var that = this; + Ink.requireModules(['Ink.Dom.Selector_1'], function(Selector) { + var e; + if (typeof selector !== 'string') { e = '1st argument must be a CSS selector rule.'; } + else if (typeof delta !== 'number') { e = '2nd argument must be a number.'; } + else if (op !== undefined && op !== '+' && op !== '*') { e = '3rd argument must be one of "+", "*".'; } + else if (minVal !== undefined && (typeof minVal !== 'number' || minVal <= 0)) { e = '4th argument must be a positive number.'; } + else if (maxVal !== undefined && (typeof maxVal !== 'number' || maxVal < maxVal)) { e = '5th argument must be a positive number greater than minValue.'; } + if (e) { throw new TypeError(e); } + + var val, el, els = Selector.select(selector); + if (minVal === undefined) { minVal = 1; } + op = (op === '*') ? function(a,b){return a*b;} : function(a,b){return a+b;}; + for (var i = 0, f = els.length; i < f; ++i) { + el = els[i]; + val = parseFloat( that.getStyle(el, 'fontSize')); + val = op(val, delta); + if (val < minVal) { continue; } + if (typeof maxVal === 'number' && val > maxVal) { continue; } + el.style.fontSize = val + 'px'; + } + }); + } + + }; + + return Css; + +}); + +/** + * @author inkdev AT sapo.pt + */ + +Ink.createModule('Ink.Dom.Element', 1, [], function() { + + 'use strict'; + + var createContextualFragmentSupport = ( + typeof document.createRange === 'function' && + typeof window.Range.prototype.createContextualFragment === 'function'); + + var deleteThisTbodyToken = 'Ink.Dom.Element tbody: ' + Math.random(); + var browserCreatesTbodies = (function () { + var div = document.createElement('div'); + div.innerHTML = ''; + return div.getElementsByTagName('tbody').length !== 0; + }()); + + function rect(elem){ + var dimensions = {}; + try { + dimensions = elem.getBoundingClientRect(); + } catch(e){ + dimensions = { top: elem.offsetTop, left: elem.offsetLeft }; + } + return dimensions; + } + + /** + * @module Ink.Dom.Element_1 + */ + + /** + * @class Ink.Dom.Element + */ + + var InkElement = { + + /** + * Shortcut for `document.getElementById` + * + * @method get + * @param {String|DOMElement} elm Either an ID of an element, or an element. + * @return {DOMElement|null} The DOM element with the given id or null when it was not found + */ + get: function(elm) { + if(typeof elm !== 'undefined') { + if(typeof elm === 'string') { + return document.getElementById(elm); + } + return elm; + } + return null; + }, + + /** + * Creates a DOM element + * + * @method create + * @param {String} tag tag name + * @param {Object} properties object with properties to be set on the element. You can also call other functions in Ink.Dom.Element like this + * + * @example + * + * var myPanel = InkElement.create('div', { + * appendHTML: '', + * className: 'classes to add', + * insertAfter: anotherPane + * }; + * + * myPanel.innerHTML; // -> '
+ * myPanel.parentNode; // -> anotherPane + */ + create: function(tag, properties) { + var el = document.createElement(tag); + //Ink.extendObj(el, properties); + for(var property in properties) { + if(properties.hasOwnProperty(property)) { + if (property in InkElement) { + InkElement[property](el, properties[property]); + } else { + if(property === 'className' || property === 'class') { + el.className = properties.className || properties['class']; + } else { + el.setAttribute(property, properties[property]); + } + } + } + } + return el; + }, + + /** + * Removes a DOM Element from the DOM + * + * @method remove + * @param {DOMElement} elm The element to remove + */ + remove: function(el) { + var parEl; + if (el && (parEl = el.parentNode)) { + parEl.removeChild(el); + } + }, + + /** + * Scrolls the window to an element + * + * @method scrollTo + * @param {DOMElement|String} elm Element where to scroll + */ + scrollTo: function(elm) { + elm = InkElement.get(elm); + if(elm) { + if (elm.scrollIntoView) { + return elm.scrollIntoView(); + } + + var elmOffset = {}, + elmTop = 0, elmLeft = 0; + + do { + elmTop += elm.offsetTop || 0; + elmLeft += elm.offsetLeft || 0; + + elm = elm.offsetParent; + } while(elm); + + elmOffset = {x: elmLeft, y: elmTop}; + + window.scrollTo(elmOffset.x, elmOffset.y); + } + }, + + /** + * Gets the top cumulative offset for an element + * + * Requires Ink.Dom.Browser + * + * @method offsetTop + * @param {DOMElement|String} elm target element + * @return {Number} Offset from the target element to the top of the document + */ + offsetTop: function(elm) { + return InkElement.offset(elm)[1]; + }, + + /** + * Gets the left cumulative offset for an element + * + * Requires Ink.Dom.Browser + * + * @method offsetLeft + * @param {DOMElement|String} elm target element + * @return {Number} Offset from the target element to the left of the document + */ + offsetLeft: function(elm) { + return InkElement.offset(elm)[0]; + }, + + /** + * Gets the element offset relative to its closest positioned ancestor + * + * @method positionedOffset + * @param {DOMElement|String} elm target element + * @return {Array} Array with the element offsetleft and offsettop relative to the closest positioned ancestor + */ + positionedOffset: function(element) { + var valueTop = 0, valueLeft = 0; + element = InkElement.get(element); + do { + valueTop += element.offsetTop || 0; + valueLeft += element.offsetLeft || 0; + element = element.offsetParent; + if (element) { + if (element.tagName.toLowerCase() === 'body') { break; } + + var value = element.style.position; + if (!value && element.currentStyle) { + value = element.currentStyle.position; + } + if ((!value || value === 'auto') && typeof getComputedStyle !== 'undefined') { + var css = getComputedStyle(element, null); + value = css ? css.position : null; + } + if (value === 'relative' || value === 'absolute') { break; } + } + } while (element); + return [valueLeft, valueTop]; + }, + + /** + * Gets the cumulative offset for an element + * + * Returns the top left position of the element on the page + * + * Requires Ink.Dom.Browser + * + * @method offset + * @param {DOMElement|String} elm Target element + * @return {[Number, Number]} Array with pixel distance from the target element to the top left corner of the document + */ + offset: function(el) { + /*jshint boss:true */ + el = Ink.i(el); + var res = [0, 0]; + var doc = el.ownerDocument, + docElem = doc.documentElement, + box = rect(el), + body = doc.body, + clientTop = docElem.clientTop || body.clientTop || 0, + clientLeft = docElem.clientLeft || body.clientLeft || 0, + scrollTop = doc.pageYOffset || docElem.scrollTop || body.scrollTop, + scrollLeft = doc.pageXOffset || docElem.scrollLeft || body.scrollLeft, + top = box.top + scrollTop - clientTop, + left = box.left + scrollLeft - clientLeft; + res = [left, top]; + return res; + }, + + /** + * Gets the scroll of the element + * + * @method scroll + * @param {DOMElement|String} [elm] target element or document.body + * @returns {Array} offset values for x and y scroll + */ + scroll: function(elm) { + elm = elm ? Ink.i(elm) : document.body; + return [ + ( ( !window.pageXOffset ) ? elm.scrollLeft : window.pageXOffset ), + ( ( !window.pageYOffset ) ? elm.scrollTop : window.pageYOffset ) + ]; + }, + + _getPropPx: function(cs, prop) { + var n, c; + var val = cs.getPropertyValue ? cs.getPropertyValue(prop) : cs[prop]; + if (!val) { n = 0; } + else { + c = val.indexOf('px'); + if (c === -1) { n = 0; } + else { + n = parseFloat(val, 10); + } + } + + //console.log([prop, ' "', val, '" ', n].join('')); + + return n; + }, + + /** + * Alias for offset() + * + * @method offset2 + * @deprecated Kept for historic reasons. Use offset() instead. + */ + offset2: function(el) { + return InkElement.offset(el); + }, + + /** + * Verifies the existence of an attribute + * + * @method hasAttribute + * @param {Object} elm target element + * @param {String} attr attribute name + * @return {Boolean} Boolean based on existance of attribute + */ + hasAttribute: function(elm, attr){ + return elm.hasAttribute ? elm.hasAttribute(attr) : !!elm.getAttribute(attr); + }, + /** + * Inserts a element immediately after a target element + * + * @method insertAfter + * @param {DOMElement} newElm element to be inserted + * @param {DOMElement|String} targetElm key element + */ + insertAfter: function(newElm, targetElm) { + /*jshint boss:true */ + if (targetElm = InkElement.get(targetElm)) { + if (targetElm.nextSibling !== null) { + targetElm.parentNode.insertBefore(newElm, targetElm.nextSibling); + } else { + targetElm.parentNode.appendChild(newElm); + } + } + }, + + /** + * Inserts an element before a target element + * + * @method insertBefore + * @param {DOMElement} newElm element to be inserted + * @param {DOMElement|String} targetElm key element + */ + insertBefore: function (newElm, targetElm) { + /*jshint boss:true */ + if ( (targetElm = InkElement.get(targetElm)) ) { + targetElm.parentNode.insertBefore(newElm, targetElm); + } + }, + + /** + * Inserts a element at the top of the childNodes of a target element + * + * @method insertTop + * @param {DOMElement} newElm element to be inserted + * @param {DOMElement|String} targetElm key element + */ + insertTop: function(newElm,targetElm) { + /*jshint boss:true */ + if (targetElm = InkElement.get(targetElm)) { + if (targetElm.firstChild) { + targetElm.insertBefore(newElm, targetElm.firstChild); + } else { + targetElm.appendChild(newElm); + } + } + }, + + /** + * Inserts an element after all the child nodes of another element + * + * @method insertBottom + * @param {DOMElement} newElm element to be inserted + * @param {DOMElement|String} targetElm key element + */ + insertBottom: function(newElm,targetElm) { + /*jshint boss:true */ + targetElm.appendChild(newElm); + }, + + /** + * Retrieves textContent from node + * + * @method innerText + * @param {DOMNode} node from which to retreive text from. Can be any node type. + * @return {String} the text + */ + textContent: function(node){ + node = Ink.i(node); + var text, k, cs, m; + + switch(node && node.nodeType) { + case 9: /*DOCUMENT_NODE*/ + // IE quirks mode does not have documentElement + return InkElement.textContent(node.documentElement || node.body && node.body.parentNode || node.body); + + case 1: /*ELEMENT_NODE*/ + text = node.innerText; + if (typeof text !== 'undefined') { + return text; + } + /* falls through */ + case 11: /*DOCUMENT_FRAGMENT_NODE*/ + text = node.textContent; + if (typeof text !== 'undefined') { + return text; + } + + if (node.firstChild === node.lastChild) { + // Common case: 0 or 1 children + return InkElement.textContent(node.firstChild); + } + + text = []; + cs = node.childNodes; + for (k = 0, m = cs.length; k < m; ++k) { + text.push( InkElement.textContent( cs[k] ) ); + } + return text.join(''); + + case 3: /*TEXT_NODE*/ + case 4: /*CDATA_SECTION_NODE*/ + return node.nodeValue; + } + return ''; + }, + + /** + * Removes all nodes children and adds the text + * + * @method setTextContent + * @param {DOMNode} node node to add the text to. Can be any node type. + * @param {String} text text to be appended to the node. + */ + setTextContent: function(node, text){ + node = Ink.i(node); + switch(node && node.nodeType) + { + case 1: /*ELEMENT_NODE*/ + if ('innerText' in node) { + node.innerText = text; + break; + } + /* falls through */ + case 11: /*DOCUMENT_FRAGMENT_NODE*/ + if ('textContent' in node) { + node.textContent = text; + break; + } + /* falls through */ + case 9: /*DOCUMENT_NODE*/ + while(node.firstChild) { + node.removeChild(node.firstChild); + } + if (text !== '') { + var doc = node.ownerDocument || node; + node.appendChild(doc.createTextNode(text)); + } + break; + + case 3: /*TEXT_NODE*/ + case 4: /*CDATA_SECTION_NODE*/ + node.nodeValue = text; + break; + } + }, + + /** + * Tells if element is a clickable link + * + * @method isLink + * @param {DOMNode} node node to check if it's link + * @return {Boolean} + */ + isLink: function(element){ + var b = element && element.nodeType === 1 && ((/^a|area$/i).test(element.tagName) || + element.hasAttributeNS && element.hasAttributeNS('http://www.w3.org/1999/xlink','href')); + return !!b; + }, + + /** + * Tells if ancestor is ancestor of node + * + * @method isAncestorOf + * @param {DOMNode} ancestor ancestor node + * @param {DOMNode} node descendant node + * @return {Boolean} + */ + isAncestorOf: function(ancestor, node){ + /*jshint boss:true */ + if (!node || !ancestor) { + return false; + } + if (node.compareDocumentPosition) { + return (ancestor.compareDocumentPosition(node) & 0x10) !== 0;/*Node.DOCUMENT_POSITION_CONTAINED_BY*/ + } + while (node = node.parentNode){ + if (node === ancestor){ + return true; + } + } + return false; + }, + + /** + * Tells if descendant is descendant of node + * + * @method descendantOf + * @param {DOMNode} node the ancestor + * @param {DOMNode} descendant the descendant + * @return {Boolean} true if 'descendant' is descendant of 'node' + */ + descendantOf: function(node, descendant){ + return node !== descendant && InkElement.isAncestorOf(node, descendant); + }, + + /** + * Get first child in document order of node type 1 + * @method firstElementChild + * @param {DOMNode} elm parent node + * @return {DOMNode} the element child + */ + firstElementChild: function(elm){ + if(!elm) { + return null; + } + if ('firstElementChild' in elm) { + return elm.firstElementChild; + } + var child = elm.firstChild; + while(child && child.nodeType !== 1) { + child = child.nextSibling; + } + return child; + }, + + /** + * Get last child in document order of node type 1 + * @method lastElementChild + * @param {DOMNode} elm parent node + * @return {DOMNode} the element child + */ + lastElementChild: function(elm){ + if(!elm) { + return null; + } + if ('lastElementChild' in elm) { + return elm.lastElementChild; + } + var child = elm.lastChild; + while(child && child.nodeType !== 1) { + child = child.previousSibling; + } + return child; + }, + + /** + * Get the first element sibling after the node + * + * @method nextElementSibling + * @param {DOMNode} node current node + * @return {DOMNode|Null} the first element sibling after node or null if none is found + */ + nextElementSibling: function(node){ + var sibling = null; + + if(!node){ return sibling; } + + if("nextElementSibling" in node){ + return node.nextElementSibling; + } else { + sibling = node.nextSibling; + + // 1 === Node.ELEMENT_NODE + while(sibling && sibling.nodeType !== 1){ + sibling = sibling.nextSibling; + } + + return sibling; + } + }, + + /** + * Get the first element sibling before the node + * + * @method previousElementSibling + * @param {DOMNode} node current node + * @return {DOMNode|Null} the first element sibling before node or null if none is found + */ + previousElementSibling: function(node){ + var sibling = null; + + if(!node){ return sibling; } + + if("previousElementSibling" in node){ + return node.previousElementSibling; + } else { + sibling = node.previousSibling; + + // 1 === Node.ELEMENT_NODE + while(sibling && sibling.nodeType !== 1){ + sibling = sibling.previousSibling; + } + + return sibling; + } + }, + + /** + * Returns the width of the given element, in pixels + * + * @method elementWidth + * @param {DOMElement|string} element target DOM element or target ID + * @return {Number} the element's width + */ + elementWidth: function(element) { + if(typeof element === "string") { + element = document.getElementById(element); + } + return element.offsetWidth; + }, + + /** + * Returns the height of the given element, in pixels + * + * @method elementHeight + * @param {DOMElement|string} element target DOM element or target ID + * @return {Number} the element's height + */ + elementHeight: function(element) { + if(typeof element === "string") { + element = document.getElementById(element); + } + return element.offsetHeight; + }, + + /** + * Returns the element's left position in pixels + * + * @method elementLeft + * @param {DOMElement|string} element target DOM element or target ID + * @return {Number} element's left position + */ + elementLeft: function(element) { + if(typeof element === "string") { + element = document.getElementById(element); + } + return element.offsetLeft; + }, + + /** + * Returns the element's top position in pixels + * + * @method elementTop + * @param {DOMElement|string} element target DOM element or target ID + * @return {Number} element's top position + */ + elementTop: function(element) { + if(typeof element === "string") { + element = document.getElementById(element); + } + return element.offsetTop; + }, + + /** + * Returns the dimensions of the given element, in pixels + * + * @method elementDimensions + * @param {element} element target element + * @return {Array} array with element's width and height + */ + elementDimensions: function(element) { + element = Ink.i(element); + return [element.offsetWidth, element.offsetHeight]; + }, + + /** + * Returns the outer (width + margin + padding included) dimensions of an element, in pixels. + * + * Requires Ink.Dom.Css + * + * @method outerDimensions + * @param {DOMElement} element Target element + * @return {Array} Array with element width and height. + */ + outerDimensions: function (element) { + var bbox = rect(element); + + var Css = Ink.getModule('Ink.Dom.Css_1'); + var getStyle = Ink.bindMethod(Css, 'getStyle', element); + + return [ + bbox.right - bbox.left + parseFloat(getStyle('marginLeft') || 0) + parseFloat(getStyle('marginRight') || 0), // w + bbox.bottom - bbox.top + parseFloat(getStyle('marginTop') || 0) + parseFloat(getStyle('marginBottom') || 0) // h + ]; + }, + + /** + * Check whether an element is inside the viewport + * + * @method inViewport + * @param {DOMElement} element Element to check + * @param {Boolean} [partial=false] Return `true` even if it is only partially visible. + * @return {Boolean} + */ + inViewport: function (element, partial) { + var dims = rect(Ink.i(element)); + if (partial) { + return dims.bottom > 0 && // from the top + dims.left < InkElement.viewportWidth() && // from the right + dims.top < InkElement.viewportHeight() && // from the bottom + dims.right > 0; // from the left + } else { + return dims.top > 0 && // from the top + dims.right < InkElement.viewportWidth() && // from the right + dims.bottom < InkElement.viewportHeight() && // from the bottom + dims.left > 0; // from the left + } + }, + + /** + * Check whether an element is hidden + * Taken from Mootools Element extras ( https://gist.github.com/cheeaun/73342 ) + * Does not take into account visibility:hidden + * @method isHidden + * @param {DOMElement} element Element to check + * @return {Boolean} + */ + + isHidden: function (element) { + var w = element.offsetWidth, + h = element.offsetHeight, + force = (element.tagName.toLowerCase() === 'tr'); + + var Css = Ink.getModule('Ink.Dom.Css_1'); + + return (w===0 && h===0 && !force) ? true : + (w!==0 && h!==0 && !force) ? false : + Css.getStyle(element, 'display').toLowerCase() === 'none'; + }, + + /** + * Check whether an element is visible + * + * @method isVisible + * @param {DOMElement} element Element to check + * @return {Boolean} + */ + + isVisible: function (element) { + return !this.isHidden(element); + }, + + /** + * Applies the cloneFrom's dimensions to cloneTo + * + * @method clonePosition + * @param {DOMElement} cloneTo element to be position cloned + * @param {DOMElement} cloneFrom element to get the cloned position + * @return {DOMElement} the element with positionClone + */ + clonePosition: function(cloneTo, cloneFrom){ + var pos = InkElement.offset(cloneFrom); + cloneTo.style.left = pos[0]+'px'; + cloneTo.style.top = pos[1]+'px'; + + return cloneTo; + }, + + /** + * Slices off a piece of text at the end of the element and adds the ellipsis + * so all text fits in the element. + * + * @method ellipsizeText + * @param {DOMElement} element which text is to add the ellipsis + * @param {String} [ellipsis='\u2026'] String to append to the chopped text + */ + ellipsizeText: function(element, ellipsis){ + /*jshint boss:true */ + if (element = Ink.i(element)){ + while (element && element.scrollHeight > (element.offsetHeight + 8)) { + element.textContent = element.textContent.replace(/(\s+\S+)\s*$/, ellipsis || '\u2026'); + } + } + }, + + /** + * Searches up the DOM tree for an element fulfilling the boolTest function (returning trueish) + * + * @method findUpwardsHaving + * @param {HtmlElement} element + * @param {Function} boolTest + * @return {HtmlElement|false} the matched element or false if did not match + */ + findUpwardsHaving: function(element, boolTest) { + while (element && element.nodeType === 1) { + if (boolTest(element)) { + return element; + } + element = element.parentNode; + } + return false; + }, + + /** + * Śearches up the DOM tree for an element of specified class name + * + * @method findUpwardsByClass + * @param {HtmlElement} element + * @param {String} className + * @returns {HtmlElement|false} the matched element or false if did not match + */ + findUpwardsByClass: function(element, className) { + var re = new RegExp("(^|\\s)" + className + "(\\s|$)"); + var tst = function(el) { + var cls = el.className; + return cls && re.test(cls); + }; + return InkElement.findUpwardsHaving(element, tst); + }, + + /** + * Śearches up the DOM tree for an element of specified tag + * + * @method findUpwardsByTag + * @param {HtmlElement} element + * @param {String} tag + * @returns {HtmlElement|false} the matched element or false if did not match + */ + findUpwardsByTag: function(element, tag) { + tag = tag.toUpperCase(); + var tst = function(el) { + return el.nodeName && el.nodeName.toUpperCase() === tag; + }; + return InkElement.findUpwardsHaving(element, tst); + }, + + /** + * Śearches up the DOM tree for an element of specified id + * + * @method findUpwardsById + * @param {HtmlElement} element + * @param {String} id + * @returns {HtmlElement|false} the matched element or false if did not match + */ + findUpwardsById: function(element, id) { + var tst = function(el) { + return el.id === id; + }; + return InkElement.findUpwardsHaving(element, tst); + }, + + /** + * Śearches up the DOM tree for an element matching the given selector + * + * @method findUpwardsBySelector + * @param {HtmlElement} element + * @param {String} sel + * @returns {HtmlElement|false} the matched element or false if did not match + */ + findUpwardsBySelector: function(element, sel) { + var Selector = Ink.getModule('Ink.Dom.Selector'); + if (!Selector) { + throw new Error('This method requires Ink.Dom.Selector'); + } + var tst = function(el) { + return Selector.matchesSelector(el, sel); + }; + return InkElement.findUpwardsHaving(element, tst); + }, + + /** + * Returns trimmed text content of descendants + * + * @method getChildrenText + * @param {DOMElement} el element being seeked + * @param {Boolean} [removeIt] whether to remove the found text nodes or not + * @return {String} text found + */ + getChildrenText: function(el, removeIt) { + var node, + j, + part, + nodes = el.childNodes, + jLen = nodes.length, + text = ''; + + if (!el) { + return text; + } + + for (j = 0; j < jLen; ++j) { + node = nodes[j]; + if (!node) { continue; } + if (node.nodeType === 3) { // TEXT NODE + part = InkElement._trimString( String(node.data) ); + if (part.length > 0) { + text += part; + if (removeIt) { el.removeChild(node); } + } + else { el.removeChild(node); } + } + } + + return text; + }, + + /** + * String trim implementation + * Used by getChildrenText + * + * function _trimString + * param {String} text + * return {String} trimmed text + */ + _trimString: function(text) { + return (String.prototype.trim) ? text.trim() : text.replace(/^\s*/, '').replace(/\s*$/, ''); + }, + + /** + * Returns the values of a select element + * + * @method getSelectValues + * @param {DomElement|String} select element + * @return {Array} selected values + */ + getSelectValues: function (select) { + var selectEl = Ink.i(select); + var values = []; + for (var i = 0; i < selectEl.options.length; ++i) { + values.push( selectEl.options[i].value ); + } + return values; + }, + + + /* used by fills */ + _normalizeData: function(data) { + var d, data2 = []; + for (var i = 0, f = data.length; i < f; ++i) { + d = data[i]; + + if (!(d instanceof Array)) { // if not array, wraps primitive twice: val -> [val, val] + d = [d, d]; + } + else if (d.length === 1) { // if 1 element array: [val] -> [val, val] + d.push(d[0]); + } + data2.push(d); + } + return data2; + }, + + + /** + * Fills select element with choices + * + * @method fillSelect + * @param {DomElement|String} container select element which will get filled + * @param {Array} data data which will populate the component + * @param {Boolean} [skipEmpty] true to skip empty option + * @param {String|Number} [defaultValue] primitive value to select at beginning + */ + fillSelect: function(container, data, skipEmpty, defaultValue) { + var containerEl = Ink.i(container); + if (!containerEl) { return; } + + containerEl.innerHTML = ''; + var d, optionEl; + + if (!skipEmpty) { + // add initial empty option + optionEl = document.createElement('option'); + optionEl.setAttribute('value', ''); + containerEl.appendChild(optionEl); + } + + data = InkElement._normalizeData(data); + + for (var i = 0, f = data.length; i < f; ++i) { + d = data[i]; + + optionEl = document.createElement('option'); + optionEl.setAttribute('value', d[0]); + if (d.length > 2) { + optionEl.setAttribute('extra', d[2]); + } + optionEl.appendChild( document.createTextNode(d[1]) ); + + if (d[0] === defaultValue) { + optionEl.setAttribute('selected', 'selected'); + } + + containerEl.appendChild(optionEl); + } + }, + + + /** + * Select element on steroids - allows the creation of new values + * + * @method fillSelect2 + * @param {DomElement|String} ctn select element which will get filled + * @param {Object} opts + * @param {Array} [opts.data] data which will populate the component + * @param {Boolean} [opts.skipEmpty] if true empty option is not created (defaults to false) + * @param {String} [opts.emptyLabel] label to display on empty option + * @param {String} [opts.createLabel] label to display on create option + * @param {String} [opts.optionsGroupLabel] text to display on group surrounding value options + * @param {String} [opts.defaultValue] option to select initially + * @param {Function(selEl, addOptFn)} [opts.onCreate] callback that gets called once user selects the create option + */ + fillSelect2: function(ctn, opts) { + ctn = Ink.i(ctn); + ctn.innerHTML = ''; + + var defs = { + skipEmpty: false, + skipCreate: false, + emptyLabel: 'none', + createLabel: 'create', + optionsGroupLabel: 'groups', + emptyOptionsGroupLabel: 'none exist', + defaultValue: '' + }; + if (!opts) { throw 'param opts is a requirement!'; } + if (!opts.data) { throw 'opts.data is a requirement!'; } + opts = Ink.extendObj(defs, opts); + + var optionEl, d; + + var optGroupValuesEl = document.createElement('optgroup'); + optGroupValuesEl.setAttribute('label', opts.optionsGroupLabel); + + opts.data = InkElement._normalizeData(opts.data); + + if (!opts.skipCreate) { + opts.data.unshift(['$create$', opts.createLabel]); + } + + if (!opts.skipEmpty) { + opts.data.unshift(['', opts.emptyLabel]); + } + + for (var i = 0, f = opts.data.length; i < f; ++i) { + d = opts.data[i]; + + optionEl = document.createElement('option'); + optionEl.setAttribute('value', d[0]); + optionEl.appendChild( document.createTextNode(d[1]) ); + + if (d[0] === opts.defaultValue) { optionEl.setAttribute('selected', 'selected'); } + + if (d[0] === '' || d[0] === '$create$') { + ctn.appendChild(optionEl); + } + else { + optGroupValuesEl.appendChild(optionEl); + } + } + + var lastValIsNotOption = function(data) { + var lastVal = data[data.length-1][0]; + return (lastVal === '' || lastVal === '$create$'); + }; + + if (lastValIsNotOption(opts.data)) { + optionEl = document.createElement('option'); + optionEl.setAttribute('value', '$dummy$'); + optionEl.setAttribute('disabled', 'disabled'); + optionEl.appendChild( document.createTextNode(opts.emptyOptionsGroupLabel) ); + optGroupValuesEl.appendChild(optionEl); + } + + ctn.appendChild(optGroupValuesEl); + + var addOption = function(v, l) { + var optionEl = ctn.options[ctn.options.length - 1]; + if (optionEl.getAttribute('disabled')) { + optionEl.parentNode.removeChild(optionEl); + } + + // create it + optionEl = document.createElement('option'); + optionEl.setAttribute('value', v); + optionEl.appendChild( document.createTextNode(l) ); + optGroupValuesEl.appendChild(optionEl); + + // select it + ctn.options[ctn.options.length - 1].setAttribute('selected', true); + }; + + if (!opts.skipCreate) { + ctn.onchange = function() { + if ((ctn.value === '$create$') && (typeof opts.onCreate === 'function')) { opts.onCreate(ctn, addOption); } + }; + } + }, + + + /** + * Creates set of radio buttons, returns wrapper + * + * @method fillRadios + * @param {DomElement|String} insertAfterEl element which will precede the input elements + * @param {String} name name to give to the form field ([] is added if not as suffix already) + * @param {Array} data data which will populate the component + * @param {Boolean} [skipEmpty] true to skip empty option + * @param {String|Number} [defaultValue] primitive value to select at beginning + * @param {String} [splitEl] name of element to add after each input element (example: 'br') + * @return {DOMElement} wrapper element around radio buttons + */ + fillRadios: function(insertAfterEl, name, data, skipEmpty, defaultValue, splitEl) { + var afterEl = Ink.i(insertAfterEl); + afterEl = afterEl.nextSibling; + while (afterEl && afterEl.nodeType !== 1) { + afterEl = afterEl.nextSibling; + } + var containerEl = document.createElement('span'); + if (afterEl) { + afterEl.parentNode.insertBefore(containerEl, afterEl); + } else { + Ink.i(insertAfterEl).appendChild(containerEl); + } + + data = InkElement._normalizeData(data); + + if (name.substring(name.length - 1) !== ']') { + name += '[]'; + } + + var d, inputEl; + + if (!skipEmpty) { + // add initial empty option + inputEl = document.createElement('input'); + inputEl.setAttribute('type', 'radio'); + inputEl.setAttribute('name', name); + inputEl.setAttribute('value', ''); + containerEl.appendChild(inputEl); + if (splitEl) { containerEl.appendChild( document.createElement(splitEl) ); } + } + + for (var i = 0; i < data.length; ++i) { + d = data[i]; + + inputEl = document.createElement('input'); + inputEl.setAttribute('type', 'radio'); + inputEl.setAttribute('name', name); + inputEl.setAttribute('value', d[0]); + containerEl.appendChild(inputEl); + containerEl.appendChild( document.createTextNode(d[1]) ); + if (splitEl) { containerEl.appendChild( document.createElement(splitEl) ); } + + if (d[0] === defaultValue) { + inputEl.checked = true; + } + } + + return containerEl; + }, + + + /** + * Creates set of checkbox buttons, returns wrapper + * + * @method fillChecks + * @param {DomElement|String} insertAfterEl element which will precede the input elements + * @param {String} name name to give to the form field ([] is added if not as suffix already) + * @param {Array} data data which will populate the component + * @param {Boolean} [skipEmpty] true to skip empty option + * @param {String|Number} [defaultValue] primitive value to select at beginning + * @param {String} [splitEl] name of element to add after each input element (example: 'br') + * @return {DOMElement} wrapper element around checkboxes + */ + fillChecks: function(insertAfterEl, name, data, defaultValue, splitEl) { + var afterEl = Ink.i(insertAfterEl); + afterEl = afterEl.nextSibling; + while (afterEl && afterEl.nodeType !== 1) { + afterEl = afterEl.nextSibling; + } + var containerEl = document.createElement('span'); + if (afterEl) { + afterEl.parentNode.insertBefore(containerEl, afterEl); + } else { + Ink.i(insertAfterEl).appendChild(containerEl); + } + + data = InkElement._normalizeData(data); + + if (name.substring(name.length - 1) !== ']') { + name += '[]'; + } + + var d, inputEl; + + for (var i = 0; i < data.length; ++i) { + d = data[i]; + + inputEl = document.createElement('input'); + inputEl.setAttribute('type', 'checkbox'); + inputEl.setAttribute('name', name); + inputEl.setAttribute('value', d[0]); + containerEl.appendChild(inputEl); + containerEl.appendChild( document.createTextNode(d[1]) ); + if (splitEl) { containerEl.appendChild( document.createElement(splitEl) ); } + + if (d[0] === defaultValue) { + inputEl.checked = true; + } + } + + return containerEl; + }, + + + /** + * Returns index of element from parent, -1 if not child of parent... + * + * @method parentIndexOf + * @param {DOMElement} parentEl Element to parse + * @param {DOMElement} childEl Child Element to look for + * @return {Number} + */ + parentIndexOf: function(parentEl, childEl) { + var node, idx = 0; + for (var i = 0, f = parentEl.childNodes.length; i < f; ++i) { + node = parentEl.childNodes[i]; + if (node.nodeType === 1) { // ELEMENT + if (node === childEl) { return idx; } + ++idx; + } + } + return -1; + }, + + + /** + * Returns an array of elements - the next siblings + * + * @method nextSiblings + * @param {String|DomElement} elm element + * @return {Array} Array of next sibling elements + */ + nextSiblings: function(elm) { + if(typeof(elm) === "string") { + elm = document.getElementById(elm); + } + if(typeof(elm) === 'object' && elm !== null && elm.nodeType && elm.nodeType === 1) { + var elements = [], + siblings = elm.parentNode.children, + index = InkElement.parentIndexOf(elm.parentNode, elm); + + for(var i = ++index, len = siblings.length; i
" + deleteThisTbodyToken + "
"; + } else { + div.innerHTML = "" + html + "
"; + } + return div.firstChild; + }, + TBODY: function (div, html) { + div.innerHTML = '' + html + '
'; + return div.firstChild.getElementsByTagName('tbody')[0]; + }, + THEAD: function (div, html) { + div.innerHTML = '' + html + '
'; + return div.firstChild.getElementsByTagName('thead')[0]; + }, + TFOOT: function (div, html) { + div.innerHTML = '' + html + '
'; + return div.firstChild.getElementsByTagName('tfoot')[0]; + }, + TR: function (div, html) { + div.innerHTML = '' + html + '
'; + return div.firstChild.firstChild.firstChild; + } + }, + + /** + * Gets a wrapper DIV with a certain HTML content for being inserted in `elm`. + * Necessary for appendHTML,prependHTML functions, because they need a container element to copy the children from. + * + * Works around IE table quirks + * @method _getWrapper + * @private + * @param elm + * @param html + */ + _getWrapper: function (elm, html) { + var nodeName = elm.nodeName && elm.nodeName.toUpperCase(); + var wrapper = document.createElement('div'); + var wrapFunc = InkElement._wrapElements[nodeName]; + + if ( !wrapFunc ) { + wrapper.innerHTML = html; + return wrapper; + } + // special cases + wrapper = wrapFunc(wrapper, html); + // worst case: tbody auto-creation even when our HTML has a tbody. + if (browserCreatesTbodies && nodeName === 'TABLE') { + // terrible case. Deal with tbody creation too. + var tds = wrapper.getElementsByTagName('td'); + for (var i = 0, len = tds.length; i < len; i++) { + if (tds[i].innerHTML === deleteThisTbodyToken) { + var tbody = tds[i].parentNode.parentNode; + tbody.parentNode.removeChild(tbody); + } + } + } + return wrapper; + }, + + /** + * parses and appends an html string to a container, not destroying its contents + * + * @method appendHTML + * @param {String|DomElement} elm element + * @param {String} html markup string + */ + appendHTML: function(elm, html){ + var wrapper = InkElement._getWrapper(elm, html); + while (wrapper.firstChild) { + elm.appendChild(wrapper.firstChild); + } + }, + + /** + * parses and prepends an html string to a container, not destroying its contents + * + * @method prependHTML + * @param {String|DomElement} elm element + * @param {String} html markup string + */ + prependHTML: function(elm, html){ + var wrapper = InkElement._getWrapper(elm, html); + while (wrapper.lastChild) { + elm.insertBefore(wrapper.lastChild, elm.firstChild); + } + }, + + /** + * sets the Inner HTML of an element to the given HTML string + * + * @method setHTML + * @param {String|DomElement} elm element + * @param {String} html markup string + */ + setHTML: function (elm, html) { + try { + elm.innerHTML = html; + } catch (e) { + // Tables in IE7 + while (elm.firstChild) { + elm.removeChild(elm.firstChild); + } + InkElement.appendHTML(elm, html); + } + }, + + /** + * Wraps an element inside a container. + * + * The container may or may not be in the document yet. + * + * @method wrap + * @param {String|DomElement} target Element to be wrapped + * @param {String|DomElement} container Element to wrap the target + * @return Container element + * + * @example + * before: + * + *
+ * + * call this function to wrap #target with a wrapper div. + * + * InkElement.wrap('target', InkElement.create('div', {id: 'container'}); + * + * after: + * + *
+ */ + wrap: function (target, container) { + target = Ink.i(target); + container = Ink.i(container); + + var nextNode = target.nextSibling; + var parent = target.parentNode; + + container.appendChild(target); + + if (nextNode !== null) { + parent.insertBefore(container, nextNode); + } else { + parent.appendChild(container); + } + + return container; + }, + + /** + * Pulls an element out of its wrapper. + * + * @method unwrap + * @param elem The element you're trying to unwrap. This should be a child of the wrapper. + * @param {String} [wrapperSelector] Use this if you want to find your wrapper (if `elem` is inside several layers of wrappers). + * + * @example + * + * When you have this: + * + *
+ *
+ *
+ * + * If you do this: + * + * InkElement.unwrap('unwrapMe'); + * + * You get this: + * + *
+ *
+ * + **/ + unwrap: function (elem, wrapperSelector) { + elem = Ink.i(elem); + var wrapper; + if (wrapperSelector) { + wrapper = InkElement.findUpwardsBySelector(elem, wrapperSelector); + } else { + wrapper = elem.parentNode; + } + if (!wrapper || !wrapper.parentNode) { return; } + + InkElement.insertBefore(elem, wrapper); + }, + + /** + * Replaces an element with another. + * + * @method replace + * @param element The element to be replaced. + * @param replacement The new element. + * + * @example + * var newelement1 = InkElement.create('div'); + * // ... + * replace(Ink.i('element1'), newelement1); + */ + replace: function (element, replacement) { + InkElement.insertBefore(replacement, element); + InkElement.remove(element); + }, + + /** + * Removes direct children on type text. + * Useful to remove nasty layout gaps generated by whitespace on the markup. + * + * @method removeTextNodeChildren + * @param {DOMElement} el + */ + removeTextNodeChildren: function(el) { + var prevEl, toRemove, parent = el; + el = el.firstChild; + while (el) { + toRemove = (el.nodeType === 3); + prevEl = el; + el = el.nextSibling; + if (toRemove) { + parent.removeChild(prevEl); + } + } + }, + + /** + * Pass an HTML string and receive a documentFragment with the corresponding elements + * @method htmlToFragment + * @param {String} html html string + * @return {DocumentFragment} DocumentFragment containing all of the elements from the html string + */ + htmlToFragment: (createContextualFragmentSupport ? + function(html){ + var range; + + if(typeof html !== 'string'){ return document.createDocumentFragment(); } + + range = document.createRange(); + + // set the context to document.body (firefox does this already, webkit doesn't) + range.selectNode(document.body); + + return range.createContextualFragment(html); + } : function (html) { + var fragment = document.createDocumentFragment(), + tempElement, + current; + + if(typeof html !== 'string'){ return fragment; } + + tempElement = document.createElement('div'); + tempElement.innerHTML = html; + + // append child removes elements from the original parent + while( (current = tempElement.firstChild) ){ // intentional assignment + fragment.appendChild(current); + } + + return fragment; + }), + + _camelCase: function(str) + { + return str ? str.replace(/-(\w)/g, function (_, $1){ + return $1.toUpperCase(); + }) : str; + }, + + /** + * Gets all of the data attributes from an element + * + * @method data + * @param {String|DomElement} selector Element or CSS selector + * @return {Object} Object with the data-* properties. If no data-attributes are present, an empty object is returned. + */ + data: function(selector) { + var el; + if (typeof selector !== 'object' && typeof selector !== 'string') { + throw '[Ink.Dom.Element.data] :: Invalid selector defined'; + } + + if (typeof selector === 'object') { + el = selector; + } + else { + var InkDomSelector = Ink.getModule('Ink.Dom.Selector', 1); + if (!InkDomSelector) { + throw "[Ink.Dom.Element.data] :: this method requires Ink.Dom.Selector - v1"; + } + el = InkDomSelector.select(selector); + if (el.length <= 0) { + throw "[Ink.Dom.Element.data] :: Can't find any element with the specified selector"; + } + el = el[0]; + } + + var dataset = {}; + var attrs = el.attributes || []; + + var curAttr, curAttrName, curAttrValue; + if (attrs) { + for (var i = 0, total = attrs.length; i < total; ++i) { + curAttr = attrs[i]; + curAttrName = curAttr.name; + curAttrValue = curAttr.value; + if (curAttrName && curAttrName.indexOf('data-') === 0) { + dataset[InkElement._camelCase(curAttrName.replace('data-', ''))] = curAttrValue; + } + } + } + + return dataset; + }, + + /** + * @method moveCursorTo + * @param {Input|Textarea} el + * @param {Number} t + */ + moveCursorTo: function(el, t) { + if (el.setSelectionRange) { + el.setSelectionRange(t, t); + //el.focus(); + } + else { + var range = el.createTextRange(); + range.collapse(true); + range.moveEnd( 'character', t); + range.moveStart('character', t); + range.select(); + } + }, + + /** + * @method pageWidth + * @return {Number} page width + */ + pageWidth: function() { + var xScroll; + + if (window.innerWidth && window.scrollMaxX) { + xScroll = window.innerWidth + window.scrollMaxX; + } else if (document.body.scrollWidth > document.body.offsetWidth){ + xScroll = document.body.scrollWidth; + } else { + xScroll = document.body.offsetWidth; + } + + var windowWidth; + + if (window.self.innerWidth) { + if(document.documentElement.clientWidth){ + windowWidth = document.documentElement.clientWidth; + } else { + windowWidth = window.self.innerWidth; + } + } else if (document.documentElement && document.documentElement.clientWidth) { + windowWidth = document.documentElement.clientWidth; + } else if (document.body) { + windowWidth = document.body.clientWidth; + } + + if(xScroll < windowWidth){ + return xScroll; + } else { + return windowWidth; + } + }, + + /** + * @method pageHeight + * @return {Number} page height + */ + pageHeight: function() { + var yScroll; + + if (window.innerHeight && window.scrollMaxY) { + yScroll = window.innerHeight + window.scrollMaxY; + } else if (document.body.scrollHeight > document.body.offsetHeight){ + yScroll = document.body.scrollHeight; + } else { + yScroll = document.body.offsetHeight; + } + + var windowHeight; + + if (window.self.innerHeight) { + windowHeight = window.self.innerHeight; + } else if (document.documentElement && document.documentElement.clientHeight) { + windowHeight = document.documentElement.clientHeight; + } else if (document.body) { + windowHeight = document.body.clientHeight; + } + + if(yScroll < windowHeight){ + return windowHeight; + } else { + return yScroll; + } + }, + + /** + * @method viewportWidth + * @return {Number} viewport width in pixels + */ + viewportWidth: function() { + if(typeof window.innerWidth !== "undefined") { + return window.innerWidth; + } + if (document.documentElement && typeof document.documentElement.offsetWidth !== "undefined") { + return document.documentElement.offsetWidth; + } + }, + + /** + * @method viewportHeight + * @return {Number} viewport height + */ + viewportHeight: function() { + if (typeof window.innerHeight !== "undefined") { + return window.innerHeight; + } + if (document.documentElement && typeof document.documentElement.offsetHeight !== "undefined") { + return document.documentElement.offsetHeight; + } + }, + + /** + * @method scrollWidth + * @return {Number} scroll width + */ + scrollWidth: function() { + if (typeof window.self.pageXOffset !== 'undefined') { + return window.self.pageXOffset; + } + if (typeof document.documentElement !== 'undefined' && typeof document.documentElement.scrollLeft !== 'undefined') { + return document.documentElement.scrollLeft; + } + return document.body.scrollLeft; + }, + + /** + * @method scrollHeight + * @return {Number} scroll height + */ + scrollHeight: function() { + if (typeof window.self.pageYOffset !== 'undefined') { + return window.self.pageYOffset; + } + if (typeof document.documentElement !== 'undefined' && typeof document.documentElement.scrollTop !== 'undefined') { + return document.documentElement.scrollTop; + } + return document.body.scrollTop; + } + }; + + return InkElement; + +}); + +/** + * @author inkdev AT sapo.pt + */ + +Ink.createModule('Ink.Dom.Event', 1, [], function() { + /* jshint + asi:true, + strict:false, + laxcomma:true, + eqeqeq:false, + laxbreak:true, + boss:true, + curly:false, + expr:true + */ + + /*! + * Bean - copyright (c) Jacob Thornton 2011-2012 + * https://github.com/fat/bean + * MIT license + */ + var bean = (function (name, context, definition) { + return definition() + })('bean', this, function (name, context) { + name = name || 'bean' + context = context || this + + var win = window + , old = context[name] + , namespaceRegex = /[^\.]*(?=\..*)\.|.*/ + , nameRegex = /\..*/ + , addEvent = 'addEventListener' + , removeEvent = 'removeEventListener' + , doc = document || {} + , root = doc.documentElement || {} + , W3C_MODEL = root[addEvent] + , eventSupport = W3C_MODEL ? addEvent : 'attachEvent' + , ONE = {} // singleton for quick matching making add() do one() + + , slice = Array.prototype.slice + , str2arr = function (s, d) { return s.split(d || ' ') } + , isString = function (o) { return typeof o == 'string' } + , isFunction = function (o) { return typeof o == 'function' } + + // events that we consider to be 'native', anything not in this list will + // be treated as a custom event + , standardNativeEvents = + 'click dblclick mouseup mousedown contextmenu ' + // mouse buttons + 'mousewheel mousemultiwheel DOMMouseScroll ' + // mouse wheel + 'mouseover mouseout mousemove selectstart selectend ' + // mouse movement + 'keydown keypress keyup ' + // keyboard + 'orientationchange ' + // mobile + 'focus blur change reset select submit ' + // form elements + 'load unload beforeunload resize move DOMContentLoaded ' + // window + 'readystatechange message ' + // window + 'error abort scroll ' // misc + // element.fireEvent('onXYZ'... is not forgiving if we try to fire an event + // that doesn't actually exist, so make sure we only do these on newer browsers + , w3cNativeEvents = + 'show ' + // mouse buttons + 'input invalid ' + // form elements + 'touchstart touchmove touchend touchcancel ' + // touch + 'gesturestart gesturechange gestureend ' + // gesture + 'textinput' + // TextEvent + 'readystatechange pageshow pagehide popstate ' + // window + 'hashchange offline online ' + // window + 'afterprint beforeprint ' + // printing + 'dragstart dragenter dragover dragleave drag drop dragend ' + // dnd + 'loadstart progress suspend emptied stalled loadmetadata ' + // media + 'loadeddata canplay canplaythrough playing waiting seeking ' + // media + 'seeked ended durationchange timeupdate play pause ratechange ' + // media + 'volumechange cuechange ' + // media + 'checking noupdate downloading cached updateready obsolete ' // appcache + + // convert to a hash for quick lookups + , nativeEvents = (function (hash, events, i) { + for (i = 0; i < events.length; i++) events[i] && (hash[events[i]] = 1) + return hash + }({}, str2arr(standardNativeEvents + (W3C_MODEL ? w3cNativeEvents : '')))) + + // custom events are events that we *fake*, they are not provided natively but + // we can use native events to generate them + , customEvents = (function () { + var isAncestor = 'compareDocumentPosition' in root + ? function (element, container) { + return container.compareDocumentPosition && (container.compareDocumentPosition(element) & 16) === 16 + } + : 'contains' in root + ? function (element, container) { + container = container.nodeType === 9 || container === window ? root : container + return container !== element && container.contains(element) + } + : function (element, container) { + while (element = element.parentNode) if (element === container) return 1 + return 0 + } + , check = function (event) { + var related = event.relatedTarget + return !related + ? related == null + : (related !== this && related.prefix !== 'xul' && !/document/.test(this.toString()) + && !isAncestor(related, this)) + } + + return { + mouseenter: { base: 'mouseover', condition: check } + , mouseleave: { base: 'mouseout', condition: check } + , mousewheel: { base: /Firefox/.test(navigator.userAgent) ? 'DOMMouseScroll' : 'mousewheel' } + } + }()) + + // we provide a consistent Event object across browsers by taking the actual DOM + // event object and generating a new one from its properties. + , Event = (function () { + // a whitelist of properties (for different event types) tells us what to check for and copy + var commonProps = str2arr('altKey attrChange attrName bubbles cancelable ctrlKey currentTarget ' + + 'detail eventPhase getModifierState isTrusted metaKey relatedNode relatedTarget shiftKey ' + + 'srcElement target timeStamp type view which propertyName') + , mouseProps = commonProps.concat(str2arr('button buttons clientX clientY dataTransfer ' + + 'fromElement offsetX offsetY pageX pageY screenX screenY toElement')) + , mouseWheelProps = mouseProps.concat(str2arr('wheelDelta wheelDeltaX wheelDeltaY wheelDeltaZ ' + + 'axis')) // 'axis' is FF specific + , keyProps = commonProps.concat(str2arr('char charCode key keyCode keyIdentifier ' + + 'keyLocation location')) + , textProps = commonProps.concat(str2arr('data')) + , touchProps = commonProps.concat(str2arr('touches targetTouches changedTouches scale rotation')) + , messageProps = commonProps.concat(str2arr('data origin source')) + , stateProps = commonProps.concat(str2arr('state')) + , overOutRegex = /over|out/ + // some event types need special handling and some need special properties, do that all here + , typeFixers = [ + { // key events + reg: /key/i + , fix: function (event, newEvent) { + newEvent.keyCode = event.keyCode || event.which + return keyProps + } + } + , { // mouse events + reg: /click|mouse(?!(.*wheel|scroll))|menu|drag|drop/i + , fix: function (event, newEvent, type) { + newEvent.rightClick = event.which === 3 || event.button === 2 + newEvent.pos = { x: 0, y: 0 } + if (event.pageX || event.pageY) { + newEvent.clientX = event.pageX + newEvent.clientY = event.pageY + } else if (event.clientX || event.clientY) { + newEvent.clientX = event.clientX + doc.body.scrollLeft + root.scrollLeft + newEvent.clientY = event.clientY + doc.body.scrollTop + root.scrollTop + } + if (overOutRegex.test(type)) { + newEvent.relatedTarget = event.relatedTarget + || event[(type == 'mouseover' ? 'from' : 'to') + 'Element'] + } + return mouseProps + } + } + , { // mouse wheel events + reg: /mouse.*(wheel|scroll)/i + , fix: function () { return mouseWheelProps } + } + , { // TextEvent + reg: /^text/i + , fix: function () { return textProps } + } + , { // touch and gesture events + reg: /^touch|^gesture/i + , fix: function () { return touchProps } + } + , { // message events + reg: /^message$/i + , fix: function () { return messageProps } + } + , { // popstate events + reg: /^popstate$/i + , fix: function () { return stateProps } + } + , { // everything else + reg: /.*/ + , fix: function () { return commonProps } + } + ] + , typeFixerMap = {} // used to map event types to fixer functions (above), a basic cache mechanism + + , Event = function (event, element, isNative) { + if (!arguments.length) return + event = event || ((element.ownerDocument || element.document || element).parentWindow || win).event + this.originalEvent = event + this.isNative = isNative + this.isBean = true + + if (!event) return + + var type = event.type + , target = event.target || event.srcElement + , i, l, p, props, fixer + + this.target = target && target.nodeType === 3 ? target.parentNode : target + + if (isNative) { // we only need basic augmentation on custom events, the rest expensive & pointless + fixer = typeFixerMap[type] + if (!fixer) { // haven't encountered this event type before, map a fixer function for it + for (i = 0, l = typeFixers.length; i < l; i++) { + if (typeFixers[i].reg.test(type)) { // guaranteed to match at least one, last is .* + typeFixerMap[type] = fixer = typeFixers[i].fix + break + } + } + } + + props = fixer(event, this, type) + for (i = props.length; i--;) { + if (!((p = props[i]) in this) && p in event) this[p] = event[p] + } + } + } + + // preventDefault() and stopPropagation() are a consistent interface to those functions + // on the DOM, stop() is an alias for both of them together + Event.prototype.preventDefault = function () { + if (this.originalEvent.preventDefault) this.originalEvent.preventDefault() + else this.originalEvent.returnValue = false + } + Event.prototype.stopPropagation = function () { + if (this.originalEvent.stopPropagation) this.originalEvent.stopPropagation() + else this.originalEvent.cancelBubble = true + } + Event.prototype.stop = function () { + this.preventDefault() + this.stopPropagation() + this.stopped = true + } + // stopImmediatePropagation() has to be handled internally because we manage the event list for + // each element + // note that originalElement may be a Bean#Event object in some situations + Event.prototype.stopImmediatePropagation = function () { + if (this.originalEvent.stopImmediatePropagation) this.originalEvent.stopImmediatePropagation() + this.isImmediatePropagationStopped = function () { return true } + } + Event.prototype.isImmediatePropagationStopped = function () { + return this.originalEvent.isImmediatePropagationStopped && this.originalEvent.isImmediatePropagationStopped() + } + Event.prototype.clone = function (currentTarget) { + //TODO: this is ripe for optimisation, new events are *expensive* + // improving this will speed up delegated events + var ne = new Event(this, this.element, this.isNative) + ne.currentTarget = currentTarget + return ne + } + + return Event + }()) + + // if we're in old IE we can't do onpropertychange on doc or win so we use doc.documentElement for both + , targetElement = function (element, isNative) { + return !W3C_MODEL && !isNative && (element === doc || element === win) ? root : element + } + + /** + * Bean maintains an internal registry for event listeners. We don't touch elements, objects + * or functions to identify them, instead we store everything in the registry. + * Each event listener has a RegEntry object, we have one 'registry' for the whole instance. + */ + , RegEntry = (function () { + // each handler is wrapped so we can handle delegation and custom events + var wrappedHandler = function (element, fn, condition, args) { + var call = function (event, eargs) { + return fn.apply(element, args ? slice.call(eargs, event ? 0 : 1).concat(args) : eargs) + } + , findTarget = function (event, eventElement) { + return fn.__beanDel ? fn.__beanDel.ft(event.target, element) : eventElement + } + , handler = condition + ? function (event) { + var target = findTarget(event, this) // deleated event + if (condition.apply(target, arguments)) { + if (event) event.currentTarget = target + return call(event, arguments) + } + } + : function (event) { + if (fn.__beanDel) event = event.clone(findTarget(event)) // delegated event, fix the fix + return call(event, arguments) + } + handler.__beanDel = fn.__beanDel + return handler + } + + , RegEntry = function (element, type, handler, original, namespaces, args, root) { + var customType = customEvents[type] + , isNative + + if (type == 'unload') { + // self clean-up + handler = once(removeListener, element, type, handler, original) + } + + if (customType) { + if (customType.condition) { + handler = wrappedHandler(element, handler, customType.condition, args) + } + type = customType.base || type + } + + this.isNative = isNative = nativeEvents[type] && !!element[eventSupport] + this.customType = !W3C_MODEL && !isNative && type + this.element = element + this.type = type + this.original = original + this.namespaces = namespaces + this.eventType = W3C_MODEL || isNative ? type : 'propertychange' + this.target = targetElement(element, isNative) + this[eventSupport] = !!this.target[eventSupport] + this.root = root + this.handler = wrappedHandler(element, handler, null, args) + } + + // given a list of namespaces, is our entry in any of them? + RegEntry.prototype.inNamespaces = function (checkNamespaces) { + var i, j, c = 0 + if (!checkNamespaces) return true + if (!this.namespaces) return false + for (i = checkNamespaces.length; i--;) { + for (j = this.namespaces.length; j--;) { + if (checkNamespaces[i] == this.namespaces[j]) c++ + } + } + return checkNamespaces.length === c + } + + // match by element, original fn (opt), handler fn (opt) + RegEntry.prototype.matches = function (checkElement, checkOriginal, checkHandler) { + return this.element === checkElement && + (!checkOriginal || this.original === checkOriginal) && + (!checkHandler || this.handler === checkHandler) + } + + return RegEntry + }()) + + , registry = (function () { + // our map stores arrays by event type, just because it's better than storing + // everything in a single array. + // uses '$' as a prefix for the keys for safety and 'r' as a special prefix for + // rootListeners so we can look them up fast + var map = {} + + // generic functional search of our registry for matching listeners, + // `fn` returns false to break out of the loop + , forAll = function (element, type, original, handler, root, fn) { + var pfx = root ? 'r' : '$' + if (!type || type == '*') { + // search the whole registry + for (var t in map) { + if (t.charAt(0) == pfx) { + forAll(element, t.substr(1), original, handler, root, fn) + } + } + } else { + var i = 0, l, list = map[pfx + type], all = element == '*' + if (!list) return + for (l = list.length; i < l; i++) { + if ((all || list[i].matches(element, original, handler)) && !fn(list[i], list, i, type)) return + } + } + } + + , has = function (element, type, original, root) { + // we're not using forAll here simply because it's a bit slower and this + // needs to be fast + var i, list = map[(root ? 'r' : '$') + type] + if (list) { + for (i = list.length; i--;) { + if (!list[i].root && list[i].matches(element, original, null)) return true + } + } + return false + } + + , get = function (element, type, original, root) { + var entries = [] + forAll(element, type, original, null, root, function (entry) { + return entries.push(entry) + }) + return entries + } + + , put = function (entry) { + var has = !entry.root && !this.has(entry.element, entry.type, null, false) + , key = (entry.root ? 'r' : '$') + entry.type + ;(map[key] || (map[key] = [])).push(entry) + return has + } + + , del = function (entry) { + forAll(entry.element, entry.type, null, entry.handler, entry.root, function (entry, list, i) { + list.splice(i, 1) + entry.removed = true + if (list.length === 0) delete map[(entry.root ? 'r' : '$') + entry.type] + return false + }) + } + + // dump all entries, used for onunload + , entries = function () { + var t, entries = [] + for (t in map) { + if (t.charAt(0) == '$') entries = entries.concat(map[t]) + } + return entries + } + + return { has: has, get: get, put: put, del: del, entries: entries } + }()) + + // we need a selector engine for delegated events, use querySelectorAll if it exists + // but for older browsers we need Qwery, Sizzle or similar + , selectorEngine + , setSelectorEngine = function (e) { + if (!arguments.length) { + selectorEngine = doc.querySelectorAll + ? function (s, r) { + return r.querySelectorAll(s) + } + : function () { + throw new Error('Bean: No selector engine installed') // eeek + } + } else { + selectorEngine = e + } + } + + // we attach this listener to each DOM event that we need to listen to, only once + // per event type per DOM element + , rootListener = function (event, type) { + if (!W3C_MODEL && type && event && event.propertyName != '_on' + type) return + + var listeners = registry.get(this, type || event.type, null, false) + , l = listeners.length + , i = 0 + + event = new Event(event, this, true) + if (type) event.type = type + + // iterate through all handlers registered for this type, calling them unless they have + // been removed by a previous handler or stopImmediatePropagation() has been called + for (; i < l && !event.isImmediatePropagationStopped(); i++) { + if (!listeners[i].removed) listeners[i].handler.call(this, event) + } + } + + // add and remove listeners to DOM elements + , listener = W3C_MODEL + ? function (element, type, add) { + // new browsers + element[add ? addEvent : removeEvent](type, rootListener, false) + } + : function (element, type, add, custom) { + // IE8 and below, use attachEvent/detachEvent and we have to piggy-back propertychange events + // to simulate event bubbling etc. + var entry + if (add) { + registry.put(entry = new RegEntry( + element + , custom || type + , function (event) { // handler + rootListener.call(element, event, custom) + } + , rootListener + , null + , null + , true // is root + )) + if (custom && element['_on' + custom] == null) element['_on' + custom] = 0 + entry.target.attachEvent('on' + entry.eventType, entry.handler) + } else { + entry = registry.get(element, custom || type, rootListener, true)[0] + if (entry) { + entry.target.detachEvent('on' + entry.eventType, entry.handler) + registry.del(entry) + } + } + } + + , once = function (rm, element, type, fn, originalFn) { + // wrap the handler in a handler that does a remove as well + return function () { + fn.apply(this, arguments) + rm(element, type, originalFn) + } + } + + , removeListener = function (element, orgType, handler, namespaces) { + var type = orgType && orgType.replace(nameRegex, '') + , handlers = registry.get(element, type, null, false) + , removed = {} + , i, l + + for (i = 0, l = handlers.length; i < l; i++) { + if ((!handler || handlers[i].original === handler) && handlers[i].inNamespaces(namespaces)) { + // TODO: this is problematic, we have a registry.get() and registry.del() that + // both do registry searches so we waste cycles doing this. Needs to be rolled into + // a single registry.forAll(fn) that removes while finding, but the catch is that + // we'll be splicing the arrays that we're iterating over. Needs extra tests to + // make sure we don't screw it up. @rvagg + registry.del(handlers[i]) + if (!removed[handlers[i].eventType] && handlers[i][eventSupport]) + removed[handlers[i].eventType] = { t: handlers[i].eventType, c: handlers[i].type } + } + } + // check each type/element for removed listeners and remove the rootListener where it's no longer needed + for (i in removed) { + if (!registry.has(element, removed[i].t, null, false)) { + // last listener of this type, remove the rootListener + listener(element, removed[i].t, false, removed[i].c) + } + } + } + + // set up a delegate helper using the given selector, wrap the handler function + , delegate = function (selector, fn) { + //TODO: findTarget (therefore $) is called twice, once for match and once for + // setting e.currentTarget, fix this so it's only needed once + var findTarget = function (target, root) { + var i, array = isString(selector) ? selectorEngine(selector, root) : selector + for (; target && target !== root; target = target.parentNode) { + for (i = array.length; i--;) { + if (array[i] === target) return target + } + } + } + , handler = function (e) { + var match = findTarget(e.target, this) + if (match) fn.apply(match, arguments) + } + + // __beanDel isn't pleasant but it's a private function, not exposed outside of Bean + handler.__beanDel = { + ft : findTarget // attach it here for customEvents to use too + , selector : selector + } + return handler + } + + , fireListener = W3C_MODEL ? function (isNative, type, element) { + // modern browsers, do a proper dispatchEvent() + var evt = doc.createEvent(isNative ? 'HTMLEvents' : 'UIEvents') + evt[isNative ? 'initEvent' : 'initUIEvent'](type, true, true, win, 1) + element.dispatchEvent(evt) + } : function (isNative, type, element) { + // old browser use onpropertychange, just increment a custom property to trigger the event + element = targetElement(element, isNative) + isNative ? element.fireEvent('on' + type, doc.createEventObject()) : element['_on' + type]++ + } + + /** + * Public API: off(), on(), add(), (remove()), one(), fire(), clone() + */ + + /** + * off(element[, eventType(s)[, handler ]]) + */ + , off = function (element, typeSpec, fn) { + var isTypeStr = isString(typeSpec) + , k, type, namespaces, i + + if (isTypeStr && typeSpec.indexOf(' ') > 0) { + // off(el, 't1 t2 t3', fn) or off(el, 't1 t2 t3') + typeSpec = str2arr(typeSpec) + for (i = typeSpec.length; i--;) + off(element, typeSpec[i], fn) + return element + } + + type = isTypeStr && typeSpec.replace(nameRegex, '') + if (type && customEvents[type]) type = customEvents[type].base + + if (!typeSpec || isTypeStr) { + // off(el) or off(el, t1.ns) or off(el, .ns) or off(el, .ns1.ns2.ns3) + if (namespaces = isTypeStr && typeSpec.replace(namespaceRegex, '')) namespaces = str2arr(namespaces, '.') + removeListener(element, type, fn, namespaces) + } else if (isFunction(typeSpec)) { + // off(el, fn) + removeListener(element, null, typeSpec) + } else { + // off(el, { t1: fn1, t2, fn2 }) + for (k in typeSpec) { + if (typeSpec.hasOwnProperty(k)) off(element, k, typeSpec[k]) + } + } + + return element + } + + /** + * on(element, eventType(s)[, selector], handler[, args ]) + */ + , on = function(element, events, selector, fn) { + var originalFn, type, types, i, args, entry, first + + //TODO: the undefined check means you can't pass an 'args' argument, fix this perhaps? + if (selector === undefined && typeof events == 'object') { + //TODO: this can't handle delegated events + for (type in events) { + if (events.hasOwnProperty(type)) { + on.call(this, element, type, events[type]) + } + } + return + } + + if (!isFunction(selector)) { + // delegated event + originalFn = fn + args = slice.call(arguments, 4) + fn = delegate(selector, originalFn, selectorEngine) + } else { + args = slice.call(arguments, 3) + fn = originalFn = selector + } + + types = str2arr(events) + + // special case for one(), wrap in a self-removing handler + if (this === ONE) { + fn = once(off, element, events, fn, originalFn) + } + + for (i = types.length; i--;) { + // add new handler to the registry and check if it's the first for this element/type + first = registry.put(entry = new RegEntry( + element + , types[i].replace(nameRegex, '') // event type + , fn + , originalFn + , str2arr(types[i].replace(namespaceRegex, ''), '.') // namespaces + , args + , false // not root + )) + if (entry[eventSupport] && first) { + // first event of this type on this element, add root listener + listener(element, entry.eventType, true, entry.customType) + } + } + + return element + } + + /** + * add(element[, selector], eventType(s), handler[, args ]) + * + * Deprecated: kept (for now) for backward-compatibility + */ + , add = function (element, events, fn, delfn) { + return on.apply( + null + , !isString(fn) + ? slice.call(arguments) + : [ element, fn, events, delfn ].concat(arguments.length > 3 ? slice.call(arguments, 5) : []) + ) + } + + /** + * one(element, eventType(s)[, selector], handler[, args ]) + */ + , one = function () { + return on.apply(ONE, arguments) + } + + /** + * fire(element, eventType(s)[, args ]) + * + * The optional 'args' argument must be an array, if no 'args' argument is provided + * then we can use the browser's DOM event system, otherwise we trigger handlers manually + */ + , fire = function (element, type, args) { + var types = str2arr(type) + , i, j, l, names, handlers + + for (i = types.length; i--;) { + type = types[i].replace(nameRegex, '') + if (names = types[i].replace(namespaceRegex, '')) names = str2arr(names, '.') + if (!names && !args && element[eventSupport]) { + fireListener(nativeEvents[type], type, element) + } else { + // non-native event, either because of a namespace, arguments or a non DOM element + // iterate over all listeners and manually 'fire' + handlers = registry.get(element, type, null, false) + args = [false].concat(args) + for (j = 0, l = handlers.length; j < l; j++) { + if (handlers[j].inNamespaces(names)) { + handlers[j].handler.apply(element, args) + } + } + } + } + return element + } + + /** + * clone(dstElement, srcElement[, eventType ]) + * + * TODO: perhaps for consistency we should allow the same flexibility in type specifiers? + */ + , clone = function (element, from, type) { + var handlers = registry.get(from, type, null, false) + , l = handlers.length + , i = 0 + , args, beanDel + + for (; i < l; i++) { + if (handlers[i].original) { + args = [ element, handlers[i].type ] + if (beanDel = handlers[i].handler.__beanDel) args.push(beanDel.selector) + args.push(handlers[i].original) + on.apply(null, args) + } + } + return element + } + + , bean = { + 'on' : on + , 'add' : add + , 'one' : one + , 'off' : off + , 'remove' : off + , 'clone' : clone + , 'fire' : fire + , 'Event' : Event + , 'setSelectorEngine' : setSelectorEngine + , 'noConflict' : function () { + context[name] = old + return this + } + } + + // for IE, clean up on unload to avoid leaks + if (win.attachEvent) { + var cleanup = function () { + var i, entries = registry.entries() + for (i in entries) { + if (entries[i].type && entries[i].type !== 'unload') off(entries[i].element, entries[i].type) + } + win.detachEvent('onunload', cleanup) + win.CollectGarbage && win.CollectGarbage() + } + win.attachEvent('onunload', cleanup) + } + + // initialize selector engine to internal default (qSA or throw Error) + setSelectorEngine(Ink.ss) + + return bean + }); + + /** + * Keep this declaration here and off Bean as it extends the Event + * object and some properties are readonly in strict mode + */ + 'use strict'; + + /** + * Instantiate browser native events array + */ + + /** + * @module Ink.Dom.Event_1 + */ + + /** + * @class Ink.Dom.Event + */ + + var InkEvent = { + + KEY_BACKSPACE: 8, + KEY_TAB: 9, + KEY_RETURN: 13, + KEY_ESC: 27, + KEY_LEFT: 37, + KEY_UP: 38, + KEY_RIGHT: 39, + KEY_DOWN: 40, + KEY_DELETE: 46, + KEY_HOME: 36, + KEY_END: 35, + KEY_PAGEUP: 33, + KEY_PAGEDOWN: 34, + KEY_INSERT: 45, + + /** + * Returns a function which calls `func`, waiting at least `wait` + * milliseconds between calls. This is useful for events such as `scroll` + * or `resize`, which can be triggered too many times per second, slowing + * down the browser with needless function calls. + * + * *note:* This does not delay the first function call to the function. + * + * @method throttle + * @param {Function} func Function to call. Arguments and context are both passed. + * @param {Number} [wait=0] Milliseconds to wait between calls. + * + * @example + * + * Suppose you are observing the `scroll` event, but your application is lagging because `scroll` is triggered too many times. + * + * // BEFORE + * InkEvent.observe(window, 'scroll', function () { + * ... + * }); // When scrolling on mobile devices or on firefox's smooth scroll + * // this is expensive because onscroll is called many times + * + * // AFTER + * InkEvent.observe(window, 'scroll', InkEvent.throttle(function () { + * ... + * }, 100)); // The event handler is called only every 100ms. Problem solved. + * + * @example + * var handler = InkEvent.throttle(function () { + * ... + * }, 100); + * + * InkEvent.observe(window, 'scroll', handler); + * InkEvent.observe(window, 'resize', handler); + * + * // on resize, both the "scroll" and the "resize" events are triggered + * // a LOT of times. This prevents both of them being called a lot of + * // times when the window is being resized by a user. + * + **/ + throttle: function (func, wait) { + wait = wait || 0; + var lastCall = 0; // Warning: This breaks on Jan 1st 1970 0:00 + var timeout; + var throttled = function () { + var now = +new Date(); + var timeDiff = now - lastCall; + if (timeDiff >= wait) { + lastCall = now; + return func.apply(this, [].slice.call(arguments)); + } else { + var that = this; + var args = [].slice.call(arguments); + if (!timeout) { + timeout = setTimeout(function () { + timeout = null; + return throttled.apply(that, args); + }, wait - timeDiff); + } + } + }; + return throttled; + }, + + /** + * Returns the target of the event object + * + * @method element + * @param {Object} ev event object + * @return {Node} The target + */ + element: function(ev) { + var node = ev.delegationTarget || + ev.target || + // IE stuff + (ev.type === 'mouseout' && ev.fromElement) || + (ev.type === 'mouseleave' && ev.fromElement) || + (ev.type === 'mouseover' && ev.toElement) || + (ev.type === 'mouseenter' && ev.toElement) || + ev.srcElement || + null; + return node && (node.nodeType === 3 || node.nodeType === 4) ? node.parentNode : node; + }, + + /** + * Returns the related target of the event object + * + * @method relatedTarget + * @param {Object} ev event object + * @return {Node} The related target + */ + relatedTarget: function(ev){ + var node = ev.relatedTarget || + // IE stuff + (ev.type === 'mouseout' && ev.toElement) || + (ev.type === 'mouseleave' && ev.toElement) || + (ev.type === 'mouseover' && ev.fromElement) || + (ev.type === 'mouseenter' && ev.fromElement) || + null; + return node && (node.nodeType === 3 || node.nodeType === 4) ? node.parentNode : node; + }, + + /** + * Navigate up the DOM tree, looking for a tag with the name `elmTagName`. + * + * If such tag is not found, `document` is returned. + * + * @method findElement + * @param {Object} ev event object + * @param {String} elmTagName tag name to find + * @param {Boolean} [force=false] If this is true, never return `document`, and returns `false` instead. + * @return {DOMElement} the first element which matches given tag name or the document element if the wanted tag is not found + */ + findElement: function(ev, elmTagName, force) + { + var node = this.element(ev); + while(true) { + if(node.nodeName.toLowerCase() === elmTagName.toLowerCase()) { + return node; + } else { + node = node.parentNode; + if(!node) { + if(force) { + return false; + } + return document; + } + if(!node.parentNode){ + if(force){ return false; } + return document; + } + } + } + }, + + /** + * Attaches an event to element + * + * @method observe + * @param {DOMElement|String} element Element id or element + * @param {String} eventName Event name + * @param {Function} callBack Receives event object as a + * parameter. If you're manually firing custom events, check the + * eventName property of the event object to make sure you're handling + * the right event. + * @param {Boolean} [useCapture] Set to true to change event listening from bubbling to capture. + * @return {Function} The event handler used. Hang on to this if you want to `stopObserving` later. + */ + observe: function(element, eventName, callBack, useCapture) { + element = Ink.i(element); + if(element) { + if(element.addEventListener) { + element.addEventListener(eventName, callBack, !!useCapture); + } else { + element.attachEvent('on' + eventName, (callBack = Ink.bind(callBack, element))); + } + return callBack; + } + }, + + /** + * Like observe, but listen to the event only once. + * + * @method observeOnce + * @param {DOMElement|String} element Element id or element + * @param {String} eventName Event name + * @param {Function} callBack Receives event object as a + * parameter. If you're manually firing custom events, check the + * eventName property of the event object to make sure you're handling + * the right event. + * @param {Boolean} [useCapture] Set to true to change event listening from bubbling to capture. + * @return {Function} The event handler used. Hang on to this if you want to `stopObserving` later. + */ + observeOnce: function (element, eventName, callBack, useCapture) { + var onceBack = function () { + InkEvent.stopObserving(element, eventName, onceBack); + return callBack(); + }; + return InkEvent.observe(element, eventName, onceBack, useCapture); + }, + + /** + * Attaches an event to a selector or array of elements. + * + * Requires Ink.Dom.Selector + * + * @method observeMulti + * @param {Array|String} elements + * @param ... See the `observe` function. + * @return {Function} The used callback. + */ + observeMulti: function (elements, eventName, callBack, useCapture) { + if (typeof elements === 'string') { + elements = Ink.ss(elements); + } else if ( /* is an element */ elements && elements.nodeType === 1) { + elements = [elements]; + } + if (!elements[0]) { return false; } + + for (var i = 0, len = elements.length; i < len; i++) { + this.observe(elements[i], eventName, callBack, useCapture); + } + return callBack; + }, + + /** + * Observe an event on the given element and every children which matches the selector string (if provided). + * + * Requires Ink.Dom.Selector if you need to use a selector. + * + * @method observeDelegated + * @param {DOMElement|String} element Element to observe. + * @param {String} eventName Event name to observe. + * @param {String} selector Child element selector. When null, finds any element. + * @param {Function} callback Callback to be called when the event is fired + * @return {Function} The used callback, for ceasing to listen to the event later. + **/ + observeDelegated: function (element, eventName, selector, callback) { + return InkEvent.observe(element, eventName, function (event) { + var fromElement = InkEvent.element(event); + if (!fromElement || fromElement === element) { return; } + + var cursor = fromElement; + + // Go up the document tree until we hit the element itself. + while (cursor !== element && cursor !== document && cursor) { + if (Ink.Dom.Selector_1.matchesSelector(cursor, selector)) { + event.delegationTarget = cursor; + return callback(event); + } + cursor = cursor.parentNode; + } + }); + }, + + /** + * Remove an event attached to an element + * + * @method stopObserving + * @param {DOMElement|String} element element id or element + * @param {String} eventName event name + * @param {Function} callBack callback function + * @param {Boolean} [useCapture] set to true if the event was being observed with useCapture set to true as well. + */ + stopObserving: function(element, eventName, callBack, useCapture) { + element = Ink.i(element); + + if(element) { + if(element.removeEventListener) { + element.removeEventListener(eventName, callBack, !!useCapture); + } else { + element.detachEvent('on' + eventName, callBack); + } + } + }, + + /** + * Stops event propagation and bubbling + * + * @method stop + * @param {Object} event event handle + */ + stop: function(event) + { + if(event.cancelBubble !== null) { + event.cancelBubble = true; + } + if(event.stopPropagation) { + event.stopPropagation(); + } + if(event.preventDefault) { + event.preventDefault(); + } + if(window.attachEvent) { + event.returnValue = false; + } + if(event.cancel !== null) { + event.cancel = true; + } + }, + + /** + * Stops event propagation + * + * @method stopPropagation + * @param {Object} event event handle + */ + stopPropagation: function(event) { + if(event.cancelBubble !== null) { + event.cancelBubble = true; + } + if(event.stopPropagation) { + event.stopPropagation(); + } + }, + + /** + * Stops event default behaviour + * + * @method stopDefault + * @param {Object} event event handle + */ + stopDefault: function(event) + { + if(event.preventDefault) { + event.preventDefault(); + } + if(window.attachEvent) { + event.returnValue = false; + } + if(event.cancel !== null) { + event.cancel = true; + } + }, + + /** + * @method pointer + * @param {Object} ev event object + * @return {Object} an object with the mouse X and Y position + */ + pointer: function(ev) + { + return { + x: this.pointerX(ev), + y: this.pointerY(ev) + }; + }, + + /** + * @method pointerX + * @param {Object} ev event object + * @return {Number} mouse X position + */ + pointerX: function(ev) + { + return (ev.touches && ev.touches[0] && ev.touches[0].pageX) || + (ev.pageX) || + (ev.clientX + (document.documentElement.scrollLeft || document.body.scrollLeft)); + }, + + /** + * @method pointerY + * @param {Object} ev event object + * @return {Number} mouse Y position + */ + pointerY: function(ev) + { + return (ev.touches && ev.touches[0] && ev.touches[0].pageY) || + (ev.pageY) || + (ev.clientY + (document.documentElement.scrollTop || document.body.scrollTop)); + }, + + /** + * @method isLeftClick + * @param {Object} ev event object + * @return {Boolean} True if the event is a left mouse click + */ + isLeftClick: function(ev) { + if (window.addEventListener) { + if(ev.button === 0){ + return true; + } else if(ev.type === 'touchend' && ev.button === null){ + // [todo] do the above check for pointerEvents too + return true; + } + } + else { + if(ev.button === 1){ return true; } + } + return false; + }, + + /** + * @method isRightClick + * @param {Object} ev event object + * @return {Boolean} True if there is a right click on the event + */ + isRightClick: function(ev) { + return (ev.button === 2); + }, + + /** + * @method isMiddleClick + * @param {Object} ev event object + * @return {Boolean} True if there is a middle click on the event + */ + isMiddleClick: function(ev) { + if (window.addEventListener) { + return (ev.button === 1); + } + else { + return (ev.button === 4); + } + return false; + }, + + /** + * Work in Progress. + * Used in SAPO.Component.MaskedInput + * + * @method getCharFromKeyboardEvent + * @param {KeyboardEvent} event keyboard event + * @param {optional Boolean} [changeCasing] if true uppercases, if false lowercases, otherwise keeps casing + * @return {String} character representation of pressed key combination + */ + getCharFromKeyboardEvent: function(event, changeCasing) { + var k = event.keyCode; + var c = String.fromCharCode(k); + + var shiftOn = event.shiftKey; + if (k >= 65 && k <= 90) { // A-Z + if (typeof changeCasing === 'boolean') { + shiftOn = changeCasing; + } + return (shiftOn) ? c : c.toLowerCase(); + } + else if (k >= 96 && k <= 105) { // numpad digits + return String.fromCharCode( 48 + (k-96) ); + } + switch (k) { + case 109: case 189: return '-'; + case 107: case 187: return '+'; + } + return c; + }, + + debug: function(){} +}; + +/** + * bean.on() lets you attach event listeners to both elements and objects. + * http://github.com/fat/bean#on + * + * @method on + * @param {DOMElement|Object} element An HTML DOM element or any JavaScript Object + * @param {String} eventType An Event (or multiple events, space separated) to listen to + * @param {String} [selector] A CSS DOM Element selector string to bind the listener to child elements matching the selector + * @param {Function} [handler] The callback function + * @param {Object} [args...] Additional arguments to pass to the callback function when triggered + * + * @return {DOMElement|Object} Returns the original DOM Element or Javascript Object + */ + +/** + * bean.one() is an alias for bean.on() except that the handler will only be executed once and then removed for the event type(s). + * http://github.com/fat/bean#one + * + * @method one + * @param {DOMElement|Object} element An HTML DOM element or any JavaScript Object + * @param {String} eventType An Event (or multiple events, space separated) to listen to + * @param {String} [selector] A CSS DOM Element selector string to bind the listener to child elements matching the selector + * @param {Function} [handler] The callback function + * @param [args...] Additional arguments to pass to the callback function when triggered + * + * @return {DOMElement|Object} Returns the original DOM Element or Javascript Object + */ + +/** + * bean.off() is how you get rid of handlers once you no longer want them active. It's also a good idea to call off on elements before you remove them from your DOM; this gives Bean a chance to clean up some things and prevents memory leaks. + * http://github.com/fat/bean#off + * + * @method off + * @param {DOMElement|Object} element An HTML DOM element or any JavaScript Object + * @param {String} eventType An Event (or multiple events, space separated) to remove + * @param {Function} [handler] The specific callback function to remove + * + * @return {DOMElement|Object} Returns the original DOM Element or Javascript Object + */ + +/** + * bean.clone() is a method for cloning events from one DOM element or object to another. + * http://github.com/fat/bean#clone + * + * @method clone + * @param {DOMElement|Object} destElement An HTML DOM element or any JavaScript Object to copy events to + * @param {String} srcElement An HTML DOM element or any JavaScript Object to copy events from + * @param {String} [eventType] An Event (or multiple events, space separated) to clone + * + * @return {DOMElement|Object} Returns the original DOM Element or Javascript Object + */ + +/** + * bean.fire() gives you the ability to trigger events. + * http://github.com/fat/bean#fire + * + * @method fire + * @param {DOMElement|Object} destElement An HTML DOM element or any JavaScript Object fire the event on + * @param {String} eventType An Event (or multiple events, space separated) to fire + * @param [args...] Additional arguments to pass to the callback function when triggered + * + * @return {DOMElement|Object} Returns the original DOM Element or Javascript Object + */ + +return Ink.extendObj(InkEvent, bean); + +}); + +/** + * @module Ink.Dom.FormSerialize + * @author inkdev AT sapo.pt + */ + +Ink.createModule('Ink.Dom.FormSerialize', 1, [], function () { + 'use strict'; + /** + * Supports serialization of form data to/from javascript Objects. + * + * Valid applications are ad hoc AJAX/syndicated submission of forms, restoring form values from server side state, etc. + * + * @class Ink.Dom.FormSerialize + * + */ + var FormSerialize = { + + /** + * Serializes a form into an object, turning field names into keys, and field values into values. + * + * note: Multi-select and checkboxes with multiple values will yield arrays + * + * @method serialize + * @return {Object} map of fieldName -> String|String[]|Boolean + * @param {DomElement|String} form form element from which the extraction is to occur + * + * @example + *
+ * + * + *
+ * + */ + serialize: function(form) { + form = Ink.i(form); + var map = this._getFieldNameInputsMap(form); + + var map2 = {}; + for (var k in map) if (map.hasOwnProperty(k)) { + if(k !== null) { + var tmpK = k.replace(/\[\]$/, ''); + map2[tmpK] = this._getValuesOfField( map[k] ); + } else { + map2[k] = this._getValuesOfField( map[k] ); + } + } + + delete map2['null']; // this can occur. if so, delete it... + return map2; + }, + + + + + /** + * Sets form elements's values with values given from object + * + * One cannot restore the values of an input with `type="file"` (browser prohibits it) + * + * @method fillIn + * @param {DomElement|String} form form element which is to be populated + * @param {Object} map2 map of fieldName -> String|String[]|Boolean + * @example + *
+ * + * + *
+ * + */ + fillIn: function(form, map2) { + form = Ink.i(form); + var map = this._getFieldNameInputsMap(form); + delete map['null']; // this can occur. if so, delete it... + + for (var k in map2) if (map2.hasOwnProperty(k)) { + this._setValuesOfField( map[k], map2[k] ); + } + }, + + + + _getFieldNameInputsMap: function(formEl) { + var name, nodeName, el, map = {}; + for (var i = 0, f = formEl.elements.length; i < f; ++i) { + el = formEl.elements[i]; + name = el.getAttribute('name'); + nodeName = el.nodeName.toLowerCase(); + if (nodeName === 'fieldset') { + continue; + } else if (map[name] === undefined) { + map[name] = [el]; + } else { + map[name].push(el); + } + } + return map; + }, + + + + _getValuesOfField: function(fieldInputs) { + var nodeName = fieldInputs[0].nodeName.toLowerCase(); + var type = fieldInputs[0].getAttribute('type'); + var value = fieldInputs[0].value; + var i, f, j, o, el, m, res = []; + + switch(nodeName) { + case 'select': + for (i = 0, f = fieldInputs.length; i < f; ++i) { + res[i] = []; + m = fieldInputs[i].getAttribute('multiple'); + for (j = 0, o = fieldInputs[i].options.length; j < o; ++j) { + el = fieldInputs[i].options[j]; + if (el.selected) { + if (m) { + res[i].push(el.value); + } else { + res[i] = el.value; + break; + } + } + } + } + return ((fieldInputs.length > 0 && /\[[^\]]*\]$/.test(fieldInputs[0].getAttribute('name'))) ? res : res[0]); + + case 'textarea': + case 'input': + if (type === 'checkbox' || type === 'radio') { + for (i = 0, f = fieldInputs.length; i < f; ++i) { + el = fieldInputs[i]; + if (el.checked) { + res.push( el.value ); + } + } + if (type === 'checkbox') { + return (fieldInputs.length > 1) ? res : !!(res.length); + } + return (fieldInputs.length > 1) ? res[0] : !!(res.length); // on radios only 1 option is selected at most + } + else { + //if (fieldInputs.length > 1) { throw 'Got multiple input elements with same name!'; } + if(fieldInputs.length > 0 && /\[[^\]]*\]$/.test(fieldInputs[0].getAttribute('name'))) { + var tmpValues = []; + for(i=0, f = fieldInputs.length; i < f; ++i) { + tmpValues.push(fieldInputs[i].value); + } + return tmpValues; + } else { + return value; + } + } + break; // to keep JSHint happy... (reply to this comment by gamboa: - ROTFL) + + default: + //throw 'Unsupported element: "' + nodeName + '"!'; + return undefined; + } + }, + + + + _valInArray: function(val, arr) { + for (var i = 0, f = arr.length; i < f; ++i) { + if (arr[i] === val) { return true; } + } + return false; + }, + + + + _setValuesOfField: function(fieldInputs, fieldValues) { + if (!fieldInputs) { return; } + var nodeName = fieldInputs[0].nodeName.toLowerCase(); + var type = fieldInputs[0].getAttribute('type'); + var i, f, el; + + switch(nodeName) { + case 'select': + if (fieldInputs.length > 1) { throw 'Got multiple select elements with same name!'; } + for (i = 0, f = fieldInputs[0].options.length; i < f; ++i) { + el = fieldInputs[0].options[i]; + el.selected = (fieldValues instanceof Array) ? this._valInArray(el.value, fieldValues) : el.value === fieldValues; + } + break; + case 'textarea': + case 'input': + if (type === 'checkbox' || type === 'radio') { + for (i = 0, f = fieldInputs.length; i < f; ++i) { + el = fieldInputs[i]; + //el.checked = (fieldValues instanceof Array) ? this._valInArray(el.value, fieldValues) : el.value === fieldValues; + el.checked = (fieldValues instanceof Array) ? this._valInArray(el.value, fieldValues) : (fieldInputs.length > 1 ? el.value === fieldValues : !!fieldValues); + } + } + else { + if (fieldInputs.length > 1) { throw 'Got multiple input elements with same name!'; } + if (type !== 'file') { + fieldInputs[0].value = fieldValues; + } + } + break; + + default: + throw 'Unsupported element: "' + nodeName + '"!'; + } + } + }; + + return FormSerialize; +}); + +/** + * @module Ink.Dom.Loaded_1 + * @author inkdev AT sapo.pt + * @version 1 + */ +Ink.createModule('Ink.Dom.Loaded', 1, [], function() { + + 'use strict'; + + /** + * The Loaded class provides a method that allows developers to queue functions to run when + * the page is loaded (document is ready). + * + * @class Ink.Dom.Loaded + * @version 1 + * @static + */ + var Loaded = { + + /** + * Callbacks and their contexts. Array of 2-arrays. + * + * [] + * + * @attribute _contexts Array + * @private + * + */ + _contexts: [], // Callbacks' queue + + /** + * Adds a new function that will be invoked once the document is ready + * + * @method run + * @param {Object} [win=window] Window object to attach/add the event + * @param {Function} fn Callback function to be run after the page is loaded + * @public + * @example + * Ink.requireModules(['Ink.Dom.Loaded_1'], function(Loaded){ + * Loaded.run(function(){ + * console.log('This will run when the page/document is ready/loaded'); + * }); + * }); + */ + run: function(win, fn) { + if (!fn) { + fn = win; + win = window; + } + + var context; + + for (var i = 0, len = this._contexts.length; i < len; i++) { + if (this._contexts[i][0] === win) { + context = this._contexts[i][1]; + break; + } + } + if (!context) { + context = { + cbQueue: [], + win: win, + doc: win.document, + root: win.document.documentElement, + done: false, + top: true + }; + context.handlers = { + checkState: Ink.bindEvent(this._checkState, this, context), + poll: Ink.bind(this._poll, this, context) + }; + this._contexts.push( + [win, context] // Javascript Objects cannot map different windows to + // different values. + ); + } + + var ael = context.doc.addEventListener; + context.add = ael ? 'addEventListener' : 'attachEvent'; + context.rem = ael ? 'removeEventListener' : 'detachEvent'; + context.pre = ael ? '' : 'on'; + context.det = ael ? 'DOMContentLoaded' : 'onreadystatechange'; + context.wet = context.pre + 'load'; + + var csf = context.handlers.checkState; + var alreadyLoaded = ( + context.doc.readyState === 'complete' && + context.win.location.toString() !== 'about:blank'); // https://code.google.com/p/chromium/issues/detail?id=32357 + + if (alreadyLoaded){ + setTimeout(Ink.bind(function () { + fn.call(context.win, 'lazy'); + }, this), 0); + } else { + context.cbQueue.push(fn); + + context.doc[context.add]( context.det , csf ); + context.win[context.add]( context.wet , csf ); + + var frameElement = 1; + try{ + frameElement = context.win.frameElement; + } catch(e) {} + if ( !ael && context.root && context.root.doScroll ) { // IE HACK + try { + context.top = !frameElement; + } catch(e) { } + if (context.top) { + this._poll(context); + } + } + } + }, + + /** + * Function that will be running the callbacks after the page is loaded + * + * @method _checkState + * @param {Event} event Triggered event + * @private + */ + _checkState: function(event, context) { + if ( !event || (event.type === 'readystatechange' && context.doc.readyState !== 'complete')) { + return; + } + var where = (event.type === 'load') ? context.win : context.doc; + where[context.rem](context.pre+event.type, context.handlers.checkState, false); + this._ready(context); + }, + + /** + * Polls the load progress of the page to see if it has already loaded or not + * + * @method _poll + * @private + */ + + /** + * + * function _poll + */ + _poll: function(context) { + try { + context.root.doScroll('left'); + } catch(e) { + return setTimeout(context.handlers.poll, 50); + } + this._ready(context); + }, + + /** + * Function that runs the callbacks from the queue when the document is ready. + * + * @method _ready + * @private + */ + _ready: function(context) { + if (!context.done) { + context.done = true; + for (var i = 0; i < context.cbQueue.length; ++i) { + context.cbQueue[i].call(context.win); + } + context.cbQueue = []; + } + } + }; + + return Loaded; + +}); + +/** + * @module Ink.Dom.Selector_1 + * @author inkdev AT sapo.pt + * @version 1 + */ +Ink.createModule('Ink.Dom.Selector', 1, [], function() { + /*jshint forin:false, eqnull:true, noempty:false, expr:true, boss:true, maxdepth:false*/ + 'use strict'; + + /** + * @class Ink.Dom.Selector + * @static + * @version 1 + */ + + +/*! + * Sizzle CSS Selector Engine + * Copyright 2013 jQuery Foundation and other contributors + * Released under the MIT license + * http://sizzlejs.com/ + */ + +var i, + cachedruns, + Expr, + getText, + isXML, + compile, + outermostContext, + recompare, + sortInput, + + // Local document vars + setDocument, + document, + docElem, + documentIsHTML, + rbuggyQSA, + rbuggyMatches, + matches, + contains, + + // Instance-specific data + expando = "sizzle" + -(new Date()), + preferredDoc = window.document, + support = {}, + dirruns = 0, + done = 0, + classCache = createCache(), + tokenCache = createCache(), + compilerCache = createCache(), + hasDuplicate = false, + sortOrder = function() { return 0; }, + + // General-purpose constants + strundefined = typeof undefined, + MAX_NEGATIVE = 1 << 31, + + // Array methods + arr = [], + pop = arr.pop, + push_native = arr.push, + push = arr.push, + slice = arr.slice, + // Use a stripped-down indexOf if we can't use a native one + indexOf = arr.indexOf || function( elem ) { + var i = 0, + len = this.length; + for ( ; i < len; i++ ) { + if ( this[i] === elem ) { + return i; + } + } + return -1; + }, + + + // Regular expressions + + // 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 quoted, + // then not containing pseudos/brackets, + // then attribute selectors/non-parenthetical expressions, + // then anything else + // These preferences are here to reduce the number of selectors + // needing tokenize in the PSEUDO preFilter + pseudos = ":(" + characterEncoding + ")(?:\\(((['\"])((?:\\\\.|[^\\\\])*?)\\3|((?:\\\\.|[^\\\\()[\\]]|" + attributes.replace( 3, 8 ) + ")*)|.*)\\)|)", + + // 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 ), + ridentifier = new RegExp( "^" + identifier + "$" ), + + 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 ), + "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace + + "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace + + "*(\\d+)|))" + whitespace + "*\\)|)", "i" ), + // For use in libraries implementing .is() + // We use this for POS matching in `select` + "needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + + whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" ) + }, + + rsibling = /[\x20\t\r\n\f]*[+~]/, + + rnative = /^[^{]+\{\s*\[native code/, + + // Easily-parseable/retrievable ID or TAG or CLASS selectors + rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, + + rinputs = /^(?:input|select|textarea|button)$/i, + rheader = /^h\d$/i, + + rescape = /'|\\/g, + rattributeQuotes = /\=[\x20\t\r\n\f]*([^'"\]]*)[\x20\t\r\n\f]*\]/g, + + // CSS escapes http://www.w3.org/TR/CSS21/syndata.html#escaped-characters + runescape = /\\([\da-fA-F]{1,6}[\x20\t\r\n\f]?|.)/g, + funescape = function( _, escaped ) { + var high = "0x" + escaped - 0x10000; + // NaN means non-codepoint + return high !== high ? + escaped : + // BMP codepoint + high < 0 ? + String.fromCharCode( high + 0x10000 ) : + // Supplemental Plane codepoint (surrogate pair) + String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 ); + }; + +// Optimize for push.apply( _, NodeList ) +try { + push.apply( + (arr = slice.call( preferredDoc.childNodes )), + preferredDoc.childNodes + ); + // Support: Android<4.0 + // Detect silently failing push.apply + arr[ preferredDoc.childNodes.length ].nodeType; +} catch ( e ) { + push = { apply: arr.length ? + + // Leverage slice if possible + function( target, els ) { + push_native.apply( target, slice.call(els) ); + } : + + // Support: IE<9 + // Otherwise append directly + function( target, els ) { + var j = target.length, + i = 0; + // Can't trust NodeList.length + while ( (target[j++] = els[i++]) ) {} + target.length = j - 1; + } + }; +} + +/* + * For feature detection + * @param {Function} fn The function to test for native support + */ +function isNative( fn ) { + return rnative.test( fn + "" ); +} + +/* + * Create key-value caches of limited size + * @returns {Function(string, Object)} Returns the Object data after storing it on itself with + * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength) + * deleting the oldest entry + */ +function createCache() { + var cache, + keys = []; + + return (cache = function( key, value ) { + // Use (key + " ") to avoid collision with native prototype properties (see Issue #157) + if ( keys.push( key += " " ) > Expr.cacheLength ) { + // Only keep the most recent entries + delete cache[ keys.shift() ]; + } + return (cache[ key ] = value); + }); +} + +/* + * Mark a function for special use by Sizzle + * @param {Function} fn The function to mark + */ +function markFunction( fn ) { + fn[ expando ] = true; + return fn; +} + +/* + * Support testing using an element + * @param {Function} fn Passed the created div and expects a boolean result + */ +function assert( fn ) { + var div = document.createElement("div"); + + try { + return !!fn( div ); + } catch (e) { + return false; + } finally { + // release memory in IE + div = null; + } +} + +function Sizzle( selector, context, results, seed ) { + var match, elem, m, nodeType, + // QSA vars + i, groups, old, nid, newContext, newSelector; + + if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) { + setDocument( context ); + } + + context = context || document; + results = results || []; + + if ( !selector || typeof selector !== "string" ) { + return results; + } + + if ( (nodeType = context.nodeType) !== 1 && nodeType !== 9 ) { + return []; + } + + if ( documentIsHTML && !seed ) { + + // Shortcuts + 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, context.getElementsByTagName( selector ) ); + return results; + + // Speed-up: Sizzle(".CLASS") + } else if ( (m = match[3]) && support.getElementsByClassName && context.getElementsByClassName ) { + push.apply( results, context.getElementsByClassName( m ) ); + return results; + } + } + + // QSA path + if ( support.qsa && !rbuggyQSA.test(selector) ) { + old = true; + nid = expando; + newContext = context; + newSelector = 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 ( 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 + toSelector( groups[i] ); + } + newContext = rsibling.test( selector ) && context.parentNode || context; + newSelector = groups.join(","); + } + + if ( newSelector ) { + try { + push.apply( results, + newContext.querySelectorAll( newSelector ) + ); + return results; + } catch(qsaError) { + } finally { + if ( !old ) { + context.removeAttribute("id"); + } + } + } + } + } + + // All others + return select( selector.replace( rtrim, "$1" ), context, results, seed ); +} + +/* + * Detect xml + * @param {Element|Object} elem An element or a document + */ +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; +}; + +/* + * Sets document-related variables once based on the current document + * @param {Element|Object} [doc] An element or document object to use to set the document + * @returns {Object} Returns the current document + */ +setDocument = Sizzle.setDocument = function( node ) { + var doc = node ? node.ownerDocument || node : preferredDoc; + + // If no document and documentElement is available, return + if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) { + return document; + } + + // Set our document + document = doc; + docElem = doc.documentElement; + + // Support tests + documentIsHTML = !isXML( doc ); + + // Check if getElementsByTagName("*") returns only elements + support.getElementsByTagName = assert(function( div ) { + div.appendChild( doc.createComment("") ); + return !div.getElementsByTagName("*").length; + }); + + // Check if attributes should be retrieved by attribute nodes + support.attributes = 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 + support.getElementsByClassName = 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 getElementsByName privileges form controls or returns elements by ID + // If so, assume (for broader support) that getElementById returns elements by name + support.getByName = assert(function( div ) { + // Inject content + div.id = expando + 0; + // Support: Windows 8 Native Apps + // Assigning innerHTML with "name" attributes throws uncatchable exceptions + // http://msdn.microsoft.com/en-us/library/ie/hh465388.aspx + div.appendChild( document.createElement("a") ).setAttribute( "name", expando ); + div.appendChild( document.createElement("i") ).setAttribute( "name", expando ); + docElem.appendChild( div ); + + // Test + var pass = doc.getElementsByName && + // buggy browsers will return fewer than the correct 2 + doc.getElementsByName( expando ).length === 2 + + // buggy browsers will return more than the correct 0 + doc.getElementsByName( expando + 0 ).length; + + // Cleanup + docElem.removeChild( div ); + + return pass; + }); + + // Support: Webkit<537.32 + // Detached nodes confoundingly follow *each other* + support.sortDetached = assert(function( div1 ) { + return div1.compareDocumentPosition && + // Should return 1, but Webkit returns 4 (following) + (div1.compareDocumentPosition( document.createElement("div") ) & 1); + }); + + // IE6/7 return modified attributes + Expr.attrHandle = assert(function( div ) { + div.innerHTML = ""; + return div.firstChild && typeof div.firstChild.getAttribute !== strundefined && + div.firstChild.getAttribute("href") === "#"; + }) ? + {} : + { + "href": function( elem ) { + return elem.getAttribute( "href", 2 ); + }, + "type": function( elem ) { + return elem.getAttribute("type"); + } + }; + + // ID find and filter + if ( support.getByName ) { + Expr.find["ID"] = function( id, context ) { + if ( typeof context.getElementById !== strundefined && documentIsHTML ) { + 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] : []; + } + }; + Expr.filter["ID"] = function( id ) { + var attrId = id.replace( runescape, funescape ); + return function( elem ) { + return elem.getAttribute("id") === attrId; + }; + }; + } else { + Expr.find["ID"] = function( id, context ) { + if ( typeof context.getElementById !== strundefined && documentIsHTML ) { + var m = context.getElementById( id ); + + return m ? + m.id === id || typeof m.getAttributeNode !== strundefined && m.getAttributeNode("id").value === id ? + [m] : + undefined : + []; + } + }; + Expr.filter["ID"] = function( id ) { + var attrId = id.replace( runescape, funescape ); + return function( elem ) { + var node = typeof elem.getAttributeNode !== strundefined && elem.getAttributeNode("id"); + return node && node.value === attrId; + }; + }; + } + + // Tag + Expr.find["TAG"] = support.getElementsByTagName ? + function( tag, context ) { + if ( typeof context.getElementsByTagName !== strundefined ) { + return context.getElementsByTagName( tag ); + } + } : + function( tag, context ) { + var elem, + tmp = [], + i = 0, + results = context.getElementsByTagName( tag ); + + // Filter out possible comments + if ( tag === "*" ) { + while ( (elem = results[i++]) ) { + if ( elem.nodeType === 1 ) { + tmp.push( elem ); + } + } + + return tmp; + } + return results; + }; + + // Name + Expr.find["NAME"] = support.getByName && function( tag, context ) { + if ( typeof context.getElementsByName !== strundefined ) { + return context.getElementsByName( name ); + } + }; + + // Class + Expr.find["CLASS"] = support.getElementsByClassName && function( className, context ) { + if ( typeof context.getElementsByClassName !== strundefined && documentIsHTML ) { + return context.getElementsByClassName( className ); + } + }; + + // QSA and matchesSelector support + + // matchesSelector(:active) reports false when true (IE9/Opera 11.5) + rbuggyMatches = []; + + // qSa(:focus) reports false when true (Chrome 21), + // no need to also add to buggyMatches since matches checks buggyQSA + // A support test would require too much code (would include document ready) + rbuggyQSA = [ ":focus" ]; + + if ( (support.qsa = isNative(doc.querySelectorAll)) ) { + // 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 explicitly + // 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 and will not see later tests + if ( !div.querySelectorAll(":checked").length ) { + rbuggyQSA.push(":checked"); + } + }); + + assert(function( div ) { + + // Opera 10-12/IE8 - ^= $= *= and empty values + // Should not select anything + div.innerHTML = ""; + if ( div.querySelectorAll("[i^='']").length ) { + rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:\"\"|'')" ); + } + + // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled) + // IE8 throws error here and will not see later tests + if ( !div.querySelectorAll(":enabled").length ) { + rbuggyQSA.push( ":enabled", ":disabled" ); + } + + // Opera 10-11 does not throw on post-comma invalid pseudos + div.querySelectorAll("*,:x"); + rbuggyQSA.push(",.*:"); + }); + } + + if ( (support.matchesSelector = isNative( (matches = docElem.matchesSelector || + docElem.mozMatchesSelector || + docElem.webkitMatchesSelector || + docElem.oMatchesSelector || + docElem.msMatchesSelector) )) ) { + + assert(function( div ) { + // Check to see if it's possible to do matchesSelector + // on a disconnected node (IE 9) + support.disconnectedMatch = matches.call( div, "div" ); + + // This should fail with an exception + // Gecko does not error, returns false instead + matches.call( div, "[s!='']:x" ); + rbuggyMatches.push( "!=", pseudos ); + }); + } + + rbuggyQSA = new RegExp( rbuggyQSA.join("|") ); + rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join("|") ); + + // Element contains another + // Purposefully does not implement inclusive descendent + // As in, an element does not contain itself + contains = isNative(docElem.contains) || docElem.compareDocumentPosition ? + 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 ) : + a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16 + )); + } : + function( a, b ) { + if ( b ) { + while ( (b = b.parentNode) ) { + if ( b === a ) { + return true; + } + } + } + return false; + }; + + // Document order sorting + sortOrder = docElem.compareDocumentPosition ? + function( a, b ) { + + // Flag for duplicate removal + if ( a === b ) { + hasDuplicate = true; + return 0; + } + + var compare = b.compareDocumentPosition && a.compareDocumentPosition && a.compareDocumentPosition( b ); + + if ( compare ) { + // Disconnected nodes + if ( compare & 1 || + (recompare && b.compareDocumentPosition( a ) === compare) ) { + + // Choose the first element that is related to our preferred document + if ( a === doc || contains(preferredDoc, a) ) { + return -1; + } + if ( b === doc || contains(preferredDoc, b) ) { + return 1; + } + + // Maintain original order + return sortInput ? + ( indexOf.call( sortInput, a ) - indexOf.call( sortInput, b ) ) : + 0; + } + + return compare & 4 ? -1 : 1; + } + + // Not directly comparable, sort on existence of method + return a.compareDocumentPosition ? -1 : 1; + } : + function( a, b ) { + var cur, + i = 0, + aup = a.parentNode, + bup = b.parentNode, + ap = [ a ], + bp = [ b ]; + + // Exit early if the nodes are identical + if ( a === b ) { + hasDuplicate = true; + return 0; + + // Parentless nodes are either documents or disconnected + } else if ( !aup || !bup ) { + return a === doc ? -1 : + b === doc ? 1 : + aup ? -1 : + bup ? 1 : + 0; + + // If the nodes are siblings, we can do a quick check + } else if ( aup === bup ) { + return siblingCheck( a, b ); + } + + // Otherwise we need full lists of their ancestors for comparison + cur = a; + while ( (cur = cur.parentNode) ) { + ap.unshift( cur ); + } + cur = b; + while ( (cur = cur.parentNode) ) { + bp.unshift( cur ); + } + + // Walk down the tree looking for a discrepancy + while ( ap[i] === bp[i] ) { + i++; + } + + return i ? + // Do a sibling check if the nodes have a common ancestor + siblingCheck( ap[i], bp[i] ) : + + // Otherwise nodes in our document sort first + ap[i] === preferredDoc ? -1 : + bp[i] === preferredDoc ? 1 : + 0; + }; + + return document; +}; + +Sizzle.matches = function( expr, elements ) { + return Sizzle( expr, null, null, elements ); +}; + +Sizzle.matchesSelector = function( elem, expr ) { + // Set document vars if needed + if ( ( elem.ownerDocument || elem ) !== document ) { + setDocument( elem ); + } + + // Make sure that attribute selectors are quoted + expr = expr.replace( rattributeQuotes, "='$1']" ); + + // rbuggyQSA always contains :focus, so no need for an existence check + if ( support.matchesSelector && documentIsHTML && (!rbuggyMatches || !rbuggyMatches.test(expr)) && !rbuggyQSA.test(expr) ) { + try { + var ret = matches.call( elem, expr ); + + // IE 9's matchesSelector returns false on disconnected nodes + if ( ret || support.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, document, null, [elem] ).length > 0; +}; + +Sizzle.contains = function( context, elem ) { + // Set document vars if needed + if ( ( context.ownerDocument || context ) !== document ) { + setDocument( context ); + } + return contains( context, elem ); +}; + +Sizzle.attr = function( elem, name ) { + var val; + + // Set document vars if needed + if ( ( elem.ownerDocument || elem ) !== document ) { + setDocument( elem ); + } + + if ( documentIsHTML ) { + name = name.toLowerCase(); + } + if ( (val = Expr.attrHandle[ name ]) ) { + return val( elem ); + } + if ( !documentIsHTML || support.attributes ) { + return elem.getAttribute( name ); + } + return ( (val = elem.getAttributeNode( name )) || elem.getAttribute( name ) ) && elem[ name ] === true ? + name : + val && val.specified ? val.value : null; +}; + +Sizzle.error = function( msg ) { + throw new Error( "Syntax error, unrecognized expression: " + msg ); +}; + +// Document sorting and removing duplicates +Sizzle.uniqueSort = function( results ) { + var elem, + duplicates = [], + j = 0, + i = 0; + + // Unless we *know* we can detect duplicates, assume their presence + hasDuplicate = !support.detectDuplicates; + // Compensate for sort limitations + recompare = !support.sortDetached; + sortInput = !support.sortStable && results.slice( 0 ); + results.sort( sortOrder ); + + if ( hasDuplicate ) { + while ( (elem = results[i++]) ) { + if ( elem === results[ i ] ) { + j = duplicates.push( i ); + } + } + while ( j-- ) { + results.splice( duplicates[ j ], 1 ); + } + } + + return results; +}; + +/* + * Checks document order of two siblings + * @param {Element} a + * @param {Element} b + * @returns Returns -1 if a precedes b, 1 if a follows b + */ +function siblingCheck( a, b ) { + var cur = b && a, + diff = cur && ( ~b.sourceIndex || MAX_NEGATIVE ) - ( ~a.sourceIndex || MAX_NEGATIVE ); + + // Use IE sourceIndex if available on both nodes + if ( diff ) { + return diff; + } + + // Check if b follows a + if ( cur ) { + while ( (cur = cur.nextSibling) ) { + if ( cur === b ) { + return -1; + } + } + } + + return a ? 1 : -1; +} + +// 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 no nodeType, this is expected to be an array + for ( ; (node = elem[i]); i++ ) { + // Do not traverse comment nodes + ret += getText( node ); + } + } else 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 + + return ret; +}; + +Expr = Sizzle.selectors = { + + // Can be adjusted by the user + cacheLength: 50, + + createPseudo: markFunction, + + match: matchExpr, + + find: {}, + + relative: { + ">": { dir: "parentNode", first: true }, + " ": { dir: "parentNode" }, + "+": { dir: "previousSibling", first: true }, + "~": { dir: "previousSibling" } + }, + + preFilter: { + "ATTR": function( match ) { + match[1] = match[1].replace( runescape, funescape ); + + // Move the given value to match[3] whether quoted or unquoted + match[3] = ( match[4] || match[5] || "" ).replace( runescape, funescape ); + + if ( match[2] === "~=" ) { + match[3] = " " + match[3] + " "; + } + + return match.slice( 0, 4 ); + }, + + "CHILD": function( match ) { + /* matches from matchExpr["CHILD"] + 1 type (only|nth|...) + 2 what (child|of-type) + 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...) + 4 xn-component of xn+y argument ([+-]?\d*n|) + 5 sign of xn-component + 6 x of xn-component + 7 sign of y-component + 8 y of y-component + */ + match[1] = match[1].toLowerCase(); + + if ( match[1].slice( 0, 3 ) === "nth" ) { + // nth-* requires argument + if ( !match[3] ) { + Sizzle.error( match[0] ); + } + + // numeric x and y parameters for Expr.filter.CHILD + // remember that false/true cast respectively to 0/1 + match[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === "even" || match[3] === "odd" ) ); + match[5] = +( ( match[7] + match[8] ) || match[3] === "odd" ); + + // other types prohibit arguments + } else if ( match[3] ) { + Sizzle.error( match[0] ); + } + + return match; + }, + + "PSEUDO": function( match ) { + var excess, + unquoted = !match[5] && match[2]; + + if ( matchExpr["CHILD"].test( match[0] ) ) { + return null; + } + + // Accept quoted arguments as-is + if ( match[4] ) { + match[2] = match[4]; + + // Strip excess characters from unquoted arguments + } else if ( unquoted && 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 + match[0] = match[0].slice( 0, excess ); + match[2] = unquoted.slice( 0, excess ); + } + + // Return only captures needed by the pseudo filter method (type and argument) + return match.slice( 0, 3 ); + } + }, + + filter: { + + "TAG": function( nodeName ) { + if ( nodeName === "*" ) { + return function() { return true; }; + } + + nodeName = nodeName.replace( runescape, funescape ).toLowerCase(); + return function( elem ) { + return elem.nodeName && elem.nodeName.toLowerCase() === nodeName; + }; + }, + + "CLASS": function( className ) { + var pattern = classCache[ className + " " ]; + + return pattern || + (pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) && + classCache( className, function( elem ) { + return pattern.test( elem.className || (typeof elem.getAttribute !== strundefined && elem.getAttribute("class")) || "" ); + }); + }, + + "ATTR": function( name, operator, check ) { + return function( elem ) { + 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.slice( -check.length ) === check : + operator === "~=" ? ( " " + result + " " ).indexOf( check ) > -1 : + operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" : + false; + }; + }, + + "CHILD": function( type, what, argument, first, last ) { + var simple = type.slice( 0, 3 ) !== "nth", + forward = type.slice( -4 ) !== "last", + ofType = what === "of-type"; + + return first === 1 && last === 0 ? + + // Shortcut for :nth-*(n) + function( elem ) { + return !!elem.parentNode; + } : + + function( elem, context, xml ) { + var cache, outerCache, node, diff, nodeIndex, start, + dir = simple !== forward ? "nextSibling" : "previousSibling", + parent = elem.parentNode, + name = ofType && elem.nodeName.toLowerCase(), + useCache = !xml && !ofType; + + if ( parent ) { + + // :(first|last|only)-(child|of-type) + if ( simple ) { + while ( dir ) { + node = elem; + while ( (node = node[ dir ]) ) { + if ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) { + return false; + } + } + // Reverse direction for :only-* (if we haven't yet done so) + start = dir = type === "only" && !start && "nextSibling"; + } + return true; + } + + start = [ forward ? parent.firstChild : parent.lastChild ]; + + // non-xml :nth-child(...) stores cache data on `parent` + if ( forward && useCache ) { + // Seek `elem` from a previously-cached index + outerCache = parent[ expando ] || (parent[ expando ] = {}); + cache = outerCache[ type ] || []; + nodeIndex = cache[0] === dirruns && cache[1]; + diff = cache[0] === dirruns && cache[2]; + node = nodeIndex && parent.childNodes[ nodeIndex ]; + + while ( (node = ++nodeIndex && node && node[ dir ] || + + // Fallback to seeking `elem` from the start + (diff = nodeIndex = 0) || start.pop()) ) { + + // When found, cache indexes on `parent` and break + if ( node.nodeType === 1 && ++diff && node === elem ) { + outerCache[ type ] = [ dirruns, nodeIndex, diff ]; + break; + } + } + + // Use previously-cached element index if available + } else if ( useCache && (cache = (elem[ expando ] || (elem[ expando ] = {}))[ type ]) && cache[0] === dirruns ) { + diff = cache[1]; + + // xml :nth-child(...) or :nth-last-child(...) or :nth(-last)?-of-type(...) + } else { + // Use the same loop as above to seek `elem` from the start + while ( (node = ++nodeIndex && node && node[ dir ] || + (diff = nodeIndex = 0) || start.pop()) ) { + + if ( ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) && ++diff ) { + // Cache the index of each encountered element + if ( useCache ) { + (node[ expando ] || (node[ expando ] = {}))[ type ] = [ dirruns, diff ]; + } + + if ( node === elem ) { + break; + } + } + } + } + + // Incorporate the offset, then check against cycle size + diff -= last; + return diff === first || ( diff % first === 0 && diff / first >= 0 ); + } + }; + }, + + "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: { + // Potentially complex 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; + }; + }), + + // "Whether an element is represented by a :lang() selector + // is based solely on the element's language value + // being equal to the identifier C, + // or beginning with the identifier C immediately followed by "-". + // The matching of C against the element's language value is performed case-insensitively. + // The identifier C does not have to be a valid language name." + // http://www.w3.org/TR/selectors/#lang-pseudo + "lang": markFunction( function( lang ) { + // lang value must be a valid identifier + if ( !ridentifier.test(lang || "") ) { + Sizzle.error( "unsupported lang: " + lang ); + } + lang = lang.replace( runescape, funescape ).toLowerCase(); + return function( elem ) { + var elemLang; + do { + if ( (elemLang = documentIsHTML ? + elem.lang : + elem.getAttribute("xml:lang") || elem.getAttribute("lang")) ) { + + elemLang = elemLang.toLowerCase(); + return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0; + } + } while ( (elem = elem.parentNode) && elem.nodeType === 1 ); + return false; + }; + }), + + // Miscellaneous + "target": function( elem ) { + var hash = window.location && window.location.hash; + return hash && hash.slice( 1 ) === elem.id; + }, + + "root": function( elem ) { + return elem === docElem; + }, + + "focus": function( elem ) { + return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex); + }, + + // Boolean properties + "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; + }, + + // Contents + "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 "?") + for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { + if ( elem.nodeName > "@" || elem.nodeType === 3 || elem.nodeType === 4 ) { + return false; + } + } + return true; + }, + + "parent": function( elem ) { + return !Expr.pseudos["empty"]( elem ); + }, + + // Element/input types + "header": function( elem ) { + return rheader.test( elem.nodeName ); + }, + + "input": function( elem ) { + return rinputs.test( elem.nodeName ); + }, + + "button": function( elem ) { + var name = elem.nodeName.toLowerCase(); + return name === "input" && elem.type === "button" || name === "button"; + }, + + "text": function( elem ) { + var 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" && + elem.type === "text" && + ( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === elem.type ); + }, + + // Position-in-collection + "first": createPositionalPseudo(function() { + return [ 0 ]; + }), + + "last": createPositionalPseudo(function( matchIndexes, length ) { + return [ length - 1 ]; + }), + + "eq": createPositionalPseudo(function( matchIndexes, length, argument ) { + return [ argument < 0 ? argument + length : argument ]; + }), + + "even": createPositionalPseudo(function( matchIndexes, length ) { + var i = 0; + for ( ; i < length; i += 2 ) { + matchIndexes.push( i ); + } + return matchIndexes; + }), + + "odd": createPositionalPseudo(function( matchIndexes, length ) { + var i = 1; + for ( ; i < length; i += 2 ) { + matchIndexes.push( i ); + } + return matchIndexes; + }), + + "lt": createPositionalPseudo(function( matchIndexes, length, argument ) { + var i = argument < 0 ? argument + length : argument; + for ( ; --i >= 0; ) { + matchIndexes.push( i ); + } + return matchIndexes; + }), + + "gt": createPositionalPseudo(function( matchIndexes, length, argument ) { + var i = argument < 0 ? argument + length : argument; + for ( ; ++i < length; ) { + matchIndexes.push( i ); + } + return matchIndexes; + }) + } +}; + +// Add button/input type pseudos +for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) { + Expr.pseudos[ i ] = createInputPseudo( i ); +} +for ( i in { submit: true, reset: true } ) { + Expr.pseudos[ i ] = createButtonPseudo( i ); +} + +function tokenize( selector, parseOnly ) { + var matched, match, tokens, type, + soFar, groups, preFilters, + cached = tokenCache[ 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 ) { + // Don't consume trailing commas as valid + soFar = soFar.slice( match[0].length ) || soFar; + } + groups.push( tokens = [] ); + } + + matched = false; + + // Combinators + if ( (match = rcombinators.exec( soFar )) ) { + matched = match.shift(); + tokens.push( { + value: matched, + // Cast descendant combinators to space + type: match[0].replace( rtrim, " " ) + } ); + soFar = soFar.slice( matched.length ); + } + + // Filters + for ( type in Expr.filter ) { + if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] || + (match = preFilters[ type ]( match ))) ) { + matched = match.shift(); + tokens.push( { + value: matched, + type: type, + matches: match + } ); + soFar = soFar.slice( matched.length ); + } + } + + 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 toSelector( tokens ) { + var i = 0, + len = tokens.length, + selector = ""; + for ( ; i < len; i++ ) { + selector += tokens[i].value; + } + return selector; +} + +function addCombinator( matcher, combinator, base ) { + var dir = combinator.dir, + checkNonElements = base && dir === "parentNode", + doneName = done++; + + return combinator.first ? + // Check against closest ancestor/preceding element + function( elem, context, xml ) { + while ( (elem = elem[ dir ]) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + return matcher( elem, context, xml ); + } + } + } : + + // Check against all ancestor/preceding elements + function( elem, context, xml ) { + var data, cache, outerCache, + dirkey = dirruns + " " + doneName; + + // We can't set arbitrary data on XML nodes, so they don't benefit from dir caching + if ( xml ) { + while ( (elem = elem[ dir ]) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + if ( matcher( elem, context, xml ) ) { + return true; + } + } + } + } else { + while ( (elem = elem[ dir ]) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + outerCache = elem[ expando ] || (elem[ expando ] = {}); + if ( (cache = outerCache[ dir ]) && cache[0] === dirkey ) { + if ( (data = cache[1]) === true || data === cachedruns ) { + return data === true; + } + } else { + cache = outerCache[ dir ] = [ dirkey ]; + cache[1] = matcher( elem, context, xml ) || cachedruns; + if ( cache[1] === true ) { + return true; + } + } + } + } + } + }; +} + +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 ) { + var temp, i, elem, + preMap = [], + postMap = [], + preexisting = results.length, + + // Get initial elements from seed or context + elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ), + + // 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 ) { + temp = condense( matcherOut, postMap ); + postFilter( temp, [], context, xml ); + + // Un-match failing elements by moving them back to matcherIn + i = temp.length; + while ( i-- ) { + if ( (elem = temp[i]) ) { + matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem); + } + } + } + + if ( seed ) { + if ( postFinder || preFilter ) { + if ( postFinder ) { + // Get the final matcherOut by condensing this intermediate into postFinder contexts + temp = []; + i = matcherOut.length; + while ( i-- ) { + if ( (elem = matcherOut[i]) ) { + // Restore matcherIn since elem is not yet a final match + temp.push( (matcherIn[i] = elem) ); + } + } + postFinder( null, (matcherOut = []), temp, xml ); + } + + // Move matched elements from seed to results to keep them synchronized + i = matcherOut.length; + while ( i-- ) { + if ( (elem = matcherOut[i]) && + (temp = postFinder ? indexOf.call( seed, elem ) : preMap[i]) > -1 ) { + + seed[temp] = !(results[temp] = elem); + } + } + } + + // Add elements to results, through postFinder if defined + } 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 { + 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 && toSelector( tokens.slice( 0, i - 1 ) ).replace( rtrim, "$1" ), + matcher, + i < j && matcherFromTokens( tokens.slice( i, j ) ), + j < len && matcherFromTokens( (tokens = tokens.slice( j )) ), + j < len && toSelector( tokens ) + ); + } + matchers.push( matcher ); + } + } + + return elementMatcher( matchers ); +} + +function matcherFromGroupMatchers( elementMatchers, setMatchers ) { + // A counter to specify which element is currently being matched + var matcherCachedRuns = 0, + 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 ), + // Use integer dirruns iff this is the outermost matcher + dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1); + + if ( outermost ) { + outermostContext = context !== document && context; + cachedruns = matcherCachedRuns; + } + + // Add elements passing elementMatchers directly to results + // Keep `i` a string if there are no elements so `matchedCount` will be "00" below + for ( ; (elem = elems[i]) != null; i++ ) { + if ( byElement && elem ) { + j = 0; + while ( (matcher = elementMatchers[j++]) ) { + if ( matcher( elem, context, xml ) ) { + results.push( elem ); + break; + } + } + if ( outermost ) { + dirruns = dirrunsUnique; + cachedruns = ++matcherCachedRuns; + } + } + + // 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 ) { + j = 0; + while ( (matcher = setMatchers[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; + }; + + return bySet ? + markFunction( superMatcher ) : + superMatcher; +} + +compile = Sizzle.compile = function( selector, group /* Internal Use Only */ ) { + var i, + setMatchers = [], + elementMatchers = [], + cached = compilerCache[ 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 ) { + var i = 0, + len = contexts.length; + for ( ; i < len; i++ ) { + Sizzle( selector, contexts[i], results ); + } + return results; +} + +function select( selector, context, results, seed ) { + var i, tokens, token, type, find, + match = tokenize( selector ); + + 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 && documentIsHTML && + Expr.relative[ tokens[1].type ] ) { + + context = ( Expr.find["ID"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0]; + if ( !context ) { + return results; + } + + selector = selector.slice( tokens.shift().value.length ); + } + + // Fetch a seed set for right-to-left matching + i = matchExpr["needsContext"].test( selector ) ? 0 : tokens.length; + while ( 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( runescape, funescape ), + rsibling.test( tokens[0].type ) && context.parentNode || context + )) ) { + + // If seed is empty or no tokens remain, we can return early + tokens.splice( i, 1 ); + selector = seed.length && toSelector( tokens ); + if ( !selector ) { + push.apply( results, seed ); + 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, + !documentIsHTML, + results, + rsibling.test( selector ) + ); + return results; +} + +// Deprecated +Expr.pseudos["nth"] = Expr.pseudos["eq"]; + +// Easy API for creating new setFilters +function setFilters() {} +setFilters.prototype = Expr.filters = Expr.pseudos; +Expr.setFilters = new setFilters(); + +// Check sort stability +support.sortStable = expando.split("").sort( sortOrder ).join("") === expando; + +// Initialize with the default document +setDocument(); + +// Always assume the presence of duplicates if sort doesn't +// pass them to our comparison function (as in Google Chrome). +[0, 0].sort( sortOrder ); +support.detectDuplicates = hasDuplicate; + +// EXPOSE +/*if ( typeof define === "function" && define.amd ) { + define(function() { return Sizzle; }); +} else { + window.Sizzle = Sizzle; +}*/ +// EXPOSE + +/** + * Alias for the Sizzle selector engine + * + * @method select + * @param {String} selector CSS selector to search for elements + * @param {DOMElement} [context] By default the search is done in the document element. However, you can specify an element as search context + * @param {Array} [results] By default this is considered an empty array. But if you want to merge it with other searches you did, pass their result array through here. + * @param {Object} [seed] + * @return {Array} Array of resulting DOM Elements + */ + +/** + * Returns elements which match with the second argument to the function. + * + * @method matches + * @param {String} selector CSS selector to search for elements + * @param {Array} matches Elements to be 'matched' with + * @return {Array} Elements that matched + */ + +/** + * Returns true iif element matches given selector + * + * @method matchesSelector + * @param {DOMElement} element to test + * @param {String} selector CSS selector to test the element with + * @return {Boolean} true iif element matches the CSS selector + */ + +return { + select: Sizzle, + matches: Sizzle.matches, + matchesSelector: Sizzle.matchesSelector +}; + + +}); //( window ); + +/** + * @module Ink.Util.Array_1 + * @author inkdev AT sapo.pt + * @version 1 + */ +Ink.createModule('Ink.Util.Array', '1', [], function() { + + 'use strict'; + + var arrayProto = Array.prototype; + + /** + * Utility functions to use with Arrays + * + * @class Ink.Util.Array + * @version 1 + * @static + */ + var InkArray = { + + /** + * Checks if value exists in array + * + * @method inArray + * @param {Mixed} value + * @param {Array} arr + * @return {Boolean} True if value exists in the array + * @public + * @static + * @example + * Ink.requireModules(['Ink.Util.Array_1'], function( InkArray ){ + * var testArray = [ 'value1', 'value2', 'value3' ]; + * if( InkArray.inArray( 'value2', testArray ) === true ){ + * console.log( "Yep it's in the array." ); + * } else { + * console.log( "No it's NOT in the array." ); + * } + * }); + */ + inArray: function(value, arr) { + if (typeof arr === 'object') { + for (var i = 0, f = arr.length; i < f; ++i) { + if (arr[i] === value) { + return true; + } + } + } + return false; + }, + + /** + * Sorts an array of object by an object property + * + * @method sortMulti + * @param {Array} arr array of objects to sort + * @param {String} key property to sort by + * @return {Array|Boolean} False if it's not an array, returns a sorted array if it's an array. + * @public + * @static + * @example + * Ink.requireModules(['Ink.Util.Array_1'], function( InkArray ){ + * var testArray = [ + * { 'myKey': 'value1' }, + * { 'myKey': 'value2' }, + * { 'myKey': 'value3' } + * ]; + * + * InkArray.sortMulti( testArray, 'myKey' ); + * }); + */ + sortMulti: function(arr, key) { + if (typeof arr === 'undefined' || arr.constructor !== Array) { return false; } + if (typeof key !== 'string') { return arr.sort(); } + if (arr.length > 0) { + if (typeof(arr[0][key]) === 'undefined') { return false; } + arr.sort(function(a, b){ + var x = a[key]; + var y = b[key]; + return ((x < y) ? -1 : ((x > y) ? 1 : 0)); + }); + } + return arr; + }, + + /** + * Returns the associated key of an array value + * + * @method keyValue + * @param {String} value Value to search for + * @param {Array} arr Array where the search will run + * @param {Boolean} [first] Flag that determines if the search stops at first occurrence. It also returns an index number instead of an array of indexes. + * @return {Boolean|Number|Array} False if not exists | number if exists and 3rd input param is true | array if exists and 3rd input param is not set or it is !== true + * @public + * @static + * @example + * Ink.requireModules(['Ink.Util.Array_1'], function( InkArray ){ + * var testArray = [ 'value1', 'value2', 'value3', 'value2' ]; + * console.log( InkArray.keyValue( 'value2', testArray, true ) ); // Result: 1 + * console.log( InkArray.keyValue( 'value2', testArray ) ); // Result: [1, 3] + * }); + */ + keyValue: function(value, arr, first) { + if (typeof value !== 'undefined' && typeof arr === 'object' && this.inArray(value, arr)) { + var aKeys = []; + for (var i = 0, f = arr.length; i < f; ++i) { + if (arr[i] === value) { + if (typeof first !== 'undefined' && first === true) { + return i; + } else { + aKeys.push(i); + } + } + } + return aKeys; + } + return false; + }, + + /** + * Returns the array shuffled, false if the param is not an array + * + * @method shuffle + * @param {Array} arr Array to shuffle + * @return {Boolean|Number|Array} False if not an array | Array shuffled + * @public + * @static + * @example + * Ink.requireModules(['Ink.Util.Array_1'], function( InkArray ){ + * var testArray = [ 'value1', 'value2', 'value3', 'value2' ]; + * console.log( InkArray.shuffle( testArray ) ); // Result example: [ 'value3', 'value2', 'value2', 'value1' ] + * }); + */ + shuffle: function(arr) { + if (typeof(arr) !== 'undefined' && arr.constructor !== Array) { return false; } + var total = arr.length, + tmp1 = false, + rnd = false; + + while (total--) { + rnd = Math.floor(Math.random() * (total + 1)); + tmp1 = arr[total]; + arr[total] = arr[rnd]; + arr[rnd] = tmp1; + } + return arr; + }, + + /** + * Runs a function through each of the elements of an array + * + * @method forEach + * @param {Array} arr Array to be cycled/iterated + * @param {Function} cb The function receives as arguments the value, index and array. + * @return {Array} Array iterated. + * @public + * @static + * @example + * Ink.requireModules(['Ink.Util.Array_1'], function( InkArray ){ + * var testArray = [ 'value1', 'value2', 'value3', 'value2' ]; + * InkArray.forEach( testArray, function( value, index, arr ){ + * console.log( 'The value is: ' + value + ' | The index is: ' + index ); + * }); + * }); + */ + forEach: function(array, callback, context) { + if (arrayProto.forEach) { + return arrayProto.forEach.call(array, callback, context); + } + for (var i = 0, len = array.length >>> 0; i < len; i++) { + callback.call(context, array[i], i, array); + } + }, + + /** + * Alias for backwards compatibility. See forEach + * + * @method forEach + */ + each: function () { + InkArray.forEach.apply(InkArray, [].slice.call(arguments)); + }, + + /** + * Run a `map` function for each item in the array. The function will receive each item as argument and its return value will change the corresponding array item. + * @method map + * @param {Array} array The array to map over + * @param {Function} map The map function. Will take `(item, index, array)` and `this` will be the `context` argument. + * @param {Object} [context] Object to be `this` in the map function. + * + * @example + * InkArray.map([1, 2, 3, 4], function (item) { + * return item + 1; + * }); // -> [2, 3, 4, 5] + */ + map: function (array, callback, context) { + if (arrayProto.map) { + return arrayProto.map.call(array, callback, context); + } + var mapped = new Array(len); + for (var i = 0, len = array.length >>> 0; i < len; i++) { + mapped[i] = callback.call(context, array[i], i, array); + } + return mapped; + }, + + /** + * Run a test function through all the input array. Items which pass the test function (for which the test function returned `true`) are kept in the array. Other items are removed. + * @param {Array} array + * @param {Function} test A test function taking `(item, index, array)` + * @param {Object} [context] Object to be `this` in the test function. + * @return filtered array + * + * @example + * InkArray.filter([1, 2, 3, 4, 5], function (val) { + * return val > 2; + * }) // -> [3, 4, 5] + */ + filter: function (array, test, context) { + if (arrayProto.filter) { + return arrayProto.filter.call(array, test, context); + } + var filtered = [], + val = null; + for (var i = 0, len = array.length; i < len; i++) { + val = array[i]; // it might be mutated + if (test.call(context, val, i, array)) { + filtered.push(val); + } + } + return filtered; + }, + + /** + * Runs a callback function, which should return true or false. + * If one of the 'runs' returns true, it will return. Otherwise if none returns true, it will return false. + * See more at: https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array/some (MDN) + * + * @method some + * @param {Array} arr The array you walk to iterate through + * @param {Function} cb The callback that will be called on the array's elements. It receives the value, the index and the array as arguments. + * @param {Object} Context object of the callback function + * @return {Boolean} True if the callback returns true at any point, false otherwise + * @public + * @static + * @example + * Ink.requireModules(['Ink.Util.Array_1'], function( InkArray ){ + * var testArray1 = [ 10, 20, 50, 100, 30 ]; + * var testArray2 = [ 1, 2, 3, 4, 5 ]; + * + * function myTestFunction( value, index, arr ){ + * if( value > 90 ){ + * return true; + * } + * return false; + * } + * console.log( InkArray.some( testArray1, myTestFunction, null ) ); // Result: true + * console.log( InkArray.some( testArray2, myTestFunction, null ) ); // Result: false + * }); + */ + some: function(arr, cb, context){ + + if (arr === null){ + throw new TypeError('First argument is invalid.'); + } + + var t = Object(arr); + var len = t.length >>> 0; + if (typeof cb !== "function"){ throw new TypeError('Second argument must be a function.'); } + + for (var i = 0; i < len; i++) { + if (i in t && cb.call(context, t[i], i, t)){ return true; } + } + + return false; + }, + + /** + * Returns an array containing every item that is shared between the two given arrays + * + * @method intersect + * @param {Array} arr Array1 to be intersected with Array2 + * @param {Array} arr Array2 to be intersected with Array1 + * @return {Array} Empty array if one of the arrays is false (or do not intersect) | Array with the intersected values + * @public + * @static + * @example + * Ink.requireModules(['Ink.Util.Array_1'], function( InkArray ){ + * var testArray1 = [ 'value1', 'value2', 'value3' ]; + * var testArray2 = [ 'value2', 'value3', 'value4', 'value5', 'value6' ]; + * console.log( InkArray.intersect( testArray1,testArray2 ) ); // Result: [ 'value2', 'value3' ] + * }); + */ + intersect: function(arr1, arr2) { + if (!arr1 || !arr2 || arr1 instanceof Array === false || arr2 instanceof Array === false) { + return []; + } + + var shared = []; + for (var i = 0, I = arr1.length; i= from && i < from + rLen){ + continue; + } + + output.push(arr[i]); + } + + return output; + } + }; + + return InkArray; + +}); + + + +/** + * @module Ink.Util.BinPack_1 + * @author inkdev AT sapo.pt + * @version 1 + */ +Ink.createModule('Ink.Util.BinPack', '1', [], function() { + + 'use strict'; + + /*jshint boss:true */ + + // https://github.com/jakesgordon/bin-packing/ + + /* + Copyright (c) 2011, 2012, 2013 Jake Gordon and contributors + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. + */ + + + + var Packer = function(w, h) { + this.init(w, h); + }; + + Packer.prototype = { + + init: function(w, h) { + this.root = { x: 0, y: 0, w: w, h: h }; + }, + + fit: function(blocks) { + var n, node, block; + for (n = 0; n < blocks.length; ++n) { + block = blocks[n]; + if (node = this.findNode(this.root, block.w, block.h)) { + block.fit = this.splitNode(node, block.w, block.h); + } + } + }, + + findNode: function(root, w, h) { + if (root.used) { + return this.findNode(root.right, w, h) || this.findNode(root.down, w, h); + } + else if ((w <= root.w) && (h <= root.h)) { + return root; + } + else { + return null; + } + }, + + splitNode: function(node, w, h) { + node.used = true; + node.down = { x: node.x, y: node.y + h, w: node.w, h: node.h - h }; + node.right = { x: node.x + w, y: node.y, w: node.w - w, h: h }; + return node; + } + + }; + + + + var GrowingPacker = function() {}; + + GrowingPacker.prototype = { + + fit: function(blocks) { + var n, node, block, len = blocks.length; + var w = len > 0 ? blocks[0].w : 0; + var h = len > 0 ? blocks[0].h : 0; + this.root = { x: 0, y: 0, w: w, h: h }; + for (n = 0; n < len ; n++) { + block = blocks[n]; + if (node = this.findNode(this.root, block.w, block.h)) { + block.fit = this.splitNode(node, block.w, block.h); + } + else { + block.fit = this.growNode(block.w, block.h); + } + } + }, + + findNode: function(root, w, h) { + if (root.used) { + return this.findNode(root.right, w, h) || this.findNode(root.down, w, h); + } + else if ((w <= root.w) && (h <= root.h)) { + return root; + } + else { + return null; + } + }, + + splitNode: function(node, w, h) { + node.used = true; + node.down = { x: node.x, y: node.y + h, w: node.w, h: node.h - h }; + node.right = { x: node.x + w, y: node.y, w: node.w - w, h: h }; + return node; + }, + + growNode: function(w, h) { + var canGrowDown = (w <= this.root.w); + var canGrowRight = (h <= this.root.h); + + var shouldGrowRight = canGrowRight && (this.root.h >= (this.root.w + w)); // attempt to keep square-ish by growing right when height is much greater than width + var shouldGrowDown = canGrowDown && (this.root.w >= (this.root.h + h)); // attempt to keep square-ish by growing down when width is much greater than height + + if (shouldGrowRight) { + return this.growRight(w, h); + } + else if (shouldGrowDown) { + return this.growDown(w, h); + } + else if (canGrowRight) { + return this.growRight(w, h); + } + else if (canGrowDown) { + return this.growDown(w, h); + } + else { + return null; // need to ensure sensible root starting size to avoid this happening + } + }, + + growRight: function(w, h) { + this.root = { + used: true, + x: 0, + y: 0, + w: this.root.w + w, + h: this.root.h, + down: this.root, + right: { x: this.root.w, y: 0, w: w, h: this.root.h } + }; + var node; + if (node = this.findNode(this.root, w, h)) { + return this.splitNode(node, w, h); + } + else { + return null; + } + }, + + growDown: function(w, h) { + this.root = { + used: true, + x: 0, + y: 0, + w: this.root.w, + h: this.root.h + h, + down: { x: 0, y: this.root.h, w: this.root.w, h: h }, + right: this.root + }; + var node; + if (node = this.findNode(this.root, w, h)) { + return this.splitNode(node, w, h); + } + else { + return null; + } + } + + }; + + + + var sorts = { + random: function() { return Math.random() - 0.5; }, + w: function(a, b) { return b.w - a.w; }, + h: function(a, b) { return b.h - a.h; }, + a: function(a, b) { return b.area - a.area; }, + max: function(a, b) { return Math.max(b.w, b.h) - Math.max(a.w, a.h); }, + min: function(a, b) { return Math.min(b.w, b.h) - Math.min(a.w, a.h); }, + height: function(a, b) { return sorts.msort(a, b, ['h', 'w']); }, + width: function(a, b) { return sorts.msort(a, b, ['w', 'h']); }, + area: function(a, b) { return sorts.msort(a, b, ['a', 'h', 'w']); }, + maxside: function(a, b) { return sorts.msort(a, b, ['max', 'min', 'h', 'w']); }, + msort: function(a, b, criteria) { /* sort by multiple criteria */ + var diff, n; + for (n = 0; n < criteria.length; ++n) { + diff = sorts[ criteria[n] ](a, b); + if (diff !== 0) { + return diff; + } + } + return 0; + } + }; + + + + // end of Jake's code + + + + // aux, used to display blocks in unfitted property + var toString = function() { + return [this.w, ' x ', this.h].join(''); + }; + + + + /** + * Binary Packing algorithm implementation + * + * Based on the work of Jake Gordon + * + * see https://github.com/jakesgordon/bin-packing/ + * + * @class Ink.Util.BinPack + * @version 1 + * @static + */ + var BinPack = { + + /** + * @method binPack + * @param {Object} o options + * @param {Object[]} o.blocks array of items with w and h integer attributes. + * @param {Number[2]} [o.dimensions] if passed, container has fixed dimensions + * @param {String} [o.sorter] sorter function. one of: random, height, width, area, maxside + * @return {Object} + * * {Number[2]} dimensions - resulted container size, + * * {Number} filled - filled ratio, + * * {Object[]} fitted, + * * {Object[]} unfitted, + * * {Object[]} blocks + * @static + */ + binPack: function(o) { + var i, f, bl; + + + + // calculate area if not there already + for (i = 0, f = o.blocks.length; i < f; ++i) { + bl = o.blocks[i]; + if (! ('area' in bl) ) { + bl.area = bl.w * bl.h; + } + } + + + + // apply algorithm + var packer = o.dimensions ? new Packer(o.dimensions[0], o.dimensions[1]) : new GrowingPacker(); + + if (!o.sorter) { o.sorter = 'maxside'; } + + o.blocks.sort( sorts[ o.sorter ] ); + + packer.fit(o.blocks); + + var dims2 = [packer.root.w, packer.root.h]; + + + + // layout is done here, generating report data... + var fitted = []; + var unfitted = []; + + for (i = 0, f = o.blocks.length; i < f; ++i) { + bl = o.blocks[i]; + if (bl.fit) { + fitted.push(bl); + } + else { + bl.toString = toString; // TO AID SERIALIZATION + unfitted.push(bl); + } + } + + var area = dims2[0] * dims2[1]; + var fit = 0; + for (i = 0, f = fitted.length; i < f; ++i) { + bl = fitted[i]; + fit += bl.area; + } + + return { + dimensions: dims2, + filled: fit / area, + blocks: o.blocks, + fitted: fitted, + unfitted: unfitted + }; + } + }; + + + + return BinPack; + +}); + +/** + * @module Ink.Util.Cookie_1 + * @author inkdev AT sapo.pt + * @version 1 + */ +Ink.createModule('Ink.Util.Cookie', '1', [], function() { + + 'use strict'; + + /** + * Utilities for Cookie handling + * + * @class Ink.Util.Cookie + * @version 1 + * @static + */ + var Cookie = { + + /** + * Gets an object with current page cookies + * + * @method get + * @param {String} name + * @return {String|Object} If the name is specified, it returns the value related to that property. Otherwise it returns the full cookie object + * @public + * @static + * @example + * Ink.requireModules(['Ink.Util.Cookie_1'], function( InkCookie ){ + * var myCookieValue = InkCookie.get('someVarThere'); + * console.log( myCookieValue ); // This will output the value of the cookie 'someVarThere', from the cookie object. + * }); + */ + get: function(name) + { + var cookie = document.cookie || false; + + var _Cookie = {}; + if(cookie) { + cookie = cookie.replace(new RegExp("; ", "g"), ';'); + var aCookie = cookie.split(';'); + var aItem = []; + if(aCookie.length > 0) { + for(var i=0; i < aCookie.length; i++) { + aItem = aCookie[i].split('='); + if(aItem.length === 2) { + _Cookie[aItem[0]] = decodeURIComponent(aItem[1]); + } + aItem = []; + } + } + } + if(name) { + if(typeof(_Cookie[name]) !== 'undefined') { + return _Cookie[name]; + } else { + return null; + } + } + return _Cookie; + }, + + /** + * Sets a cookie + * + * @method set + * @param {String} name Cookie name + * @param {String} value Cookie value + * @param {Number} [expires] Number to add to current Date in seconds + * @param {String} [path] Path to sets cookie (default '/') + * @param {String} [domain] Domain to sets cookie (default current hostname) + * @param {Boolean} [secure] True if wants secure, default 'false' + * @public + * @static + * @example + * Ink.requireModules(['Ink.Util.Cookie_1'], function( InkCookie ){ + * var expireDate = new Date( 2014,00,01, 0,0,0); + * InkCookie.set( 'someVarThere', 'anyValueHere', expireDate.getTime() ); + * }); + */ + set: function(name, value, expires, path, domain, secure) + { + var sName; + if(!name || value===false || typeof(name) === 'undefined' || typeof(value) === 'undefined') { + return false; + } else { + sName = name+'='+encodeURIComponent(value); + } + var sExpires = false; + var sPath = false; + var sDomain = false; + var sSecure = false; + + if(expires && typeof(expires) !== 'undefined' && !isNaN(expires)) { + var oDate = new Date(); + var sDate = (parseInt(Number(oDate.valueOf()), 10) + (Number(parseInt(expires, 10)) * 1000)); + + var nDate = new Date(sDate); + var expiresString = nDate.toGMTString(); + + var re = new RegExp("([^\\s]+)(\\s\\d\\d)\\s(\\w\\w\\w)\\s(.*)"); + expiresString = expiresString.replace(re, "$1$2-$3-$4"); + + sExpires = 'expires='+expiresString; + } else { + if(typeof(expires) !== 'undefined' && !isNaN(expires) && Number(parseInt(expires, 10))===0) { + sExpires = ''; + } else { + sExpires = 'expires=Thu, 01-Jan-2037 00:00:01 GMT'; + } + } + + if(path && typeof(path) !== 'undefined') { + sPath = 'path='+path; + } else { + sPath = 'path=/'; + } + + if(domain && typeof(domain) !== 'undefined') { + sDomain = 'domain='+domain; + } else { + var portClean = new RegExp(":(.*)"); + sDomain = 'domain='+window.location.host; + sDomain = sDomain.replace(portClean,""); + } + + if(secure && typeof(secure) !== 'undefined') { + sSecure = secure; + } else { + sSecure = false; + } + + document.cookie = sName+'; '+sExpires+'; '+sPath+'; '+sDomain+'; '+sSecure; + }, + + /** + * Delete a cookie + * + * @method remove + * @param {String} cookieName Cookie name + * @param {String} [path] Path of the cookie (default '/') + * @param {String} [domain] Domain of the cookie (default current hostname) + * @public + * @static + * @example + * Ink.requireModules(['Ink.Util.Cookie_1'], function( InkCookie ){ + * InkCookie.remove( 'someVarThere' ); + * }); + */ + remove: function(cookieName, path, domain) + { + //var expiresDate = 'Thu, 01-Jan-1970 00:00:01 GMT'; + var sPath = false; + var sDomain = false; + var expiresDate = -999999999; + + if(path && typeof(path) !== 'undefined') { + sPath = path; + } else { + sPath = '/'; + } + + if(domain && typeof(domain) !== 'undefined') { + sDomain = domain; + } else { + sDomain = window.location.host; + } + + this.set(cookieName, 'deleted', expiresDate, sPath, sDomain); + } + }; + + return Cookie; + +}); + +/** + * @module Ink.Util.Date_1 + * @author inkdev AT sapo.pt + * @version 1 + */ +Ink.createModule('Ink.Util.Date', '1', [], function() { + + 'use strict'; + + /** + * Class to provide the same features that php date does + * + * @class Ink.Util.Date + * @version 1 + * @static + */ + var InkDate = { + + /** + * Function that returns the string representation of the month [PT only] + * + * @method _months + * @param {Number} index Month javascript (0 to 11) + * @return {String} The month's name + * @private + * @static + * @example + * console.log( InkDate._months(0) ); // Result: Janeiro + */ + _months: function(index){ + var _m = ['Janeiro', 'Fevereiro', 'Março', 'Abril', 'Maio', 'Junho', 'Julho', 'Agosto', 'Setembro', 'Outubro', 'Novembro', 'Dezembro']; + return _m[index]; + }, + + /** + * Function that returns the month [PT only] ( 0 to 11 ) + * + * @method _iMonth + * @param {String} month Month javascript (0 to 11) + * @return {Number} The month's number + * @private + * @static + * @example + * console.log( InkDate._iMonth('maio') ); // Result: 4 + */ + _iMonth : function( month ) + { + if ( Number( month ) ) { return +month - 1; } + return { + 'janeiro' : 0 , + 'jan' : 0 , + 'fevereiro' : 1 , + 'fev' : 1 , + 'março' : 2 , + 'mar' : 2 , + 'abril' : 3 , + 'abr' : 3 , + 'maio' : 4 , + 'mai' : 4 , + 'junho' : 5 , + 'jun' : 5 , + 'julho' : 6 , + 'jul' : 6 , + 'agosto' : 7 , + 'ago' : 7 , + 'setembro' : 8 , + 'set' : 8 , + 'outubro' : 9 , + 'out' : 9 , + 'novembro' : 10 , + 'nov' : 10 , + 'dezembro' : 11 , + 'dez' : 11 + }[ month.toLowerCase( ) ]; + } , + + /** + * Function that returns the representation the day of the week [PT Only] + * + * @method _wDays + * @param {Number} index Week's day index + * @return {String} The week's day name + * @private + * @static + * @example + * console.log( InkDate._wDays(0) ); // Result: Domingo + */ + _wDays: function(index){ + var _d = ['Domingo', 'Segunda', 'Terça', 'Quarta', 'Quinta', 'Sexta', 'Sábado']; + return _d[index]; + }, + + /** + * Function that returns day of the week in javascript 1 to 7 + * + * @method _iWeek + * @param {String} week Week's day name + * @return {Number} The week's day index + * @private + * @static + * @example + * console.log( InkDate._iWeek('quarta') ); // Result: 3 + */ + _iWeek: function( week ) + { + if ( Number( week ) ) { return +week || 7; } + return { + 'segunda' : 1 , + 'seg' : 1 , + 'terça' : 2 , + 'ter' : 2 , + 'quarta' : 3 , + 'qua' : 3 , + 'quinta' : 4 , + 'qui' : 4 , + 'sexta' : 5 , + 'sex' : 5 , + 'sábado' : 6 , + 'sáb' : 6 , + 'domingo' : 7 , + 'dom' : 7 + }[ week.toLowerCase( ) ]; + }, + + /** + * Function that returns the number of days of a given month (m) on a given year (y) + * + * @method _daysInMonth + * @param {Number} _m Month + * @param {Number} _y Year + * @return {Number} Number of days of a give month on a given year + * @private + * @static + * @example + * console.log( InkDate._daysInMonth(2,2013) ); // Result: 28 + */ + _daysInMonth: function(_m,_y){ + var nDays; + + if(_m===1 || _m===3 || _m===5 || _m===7 || _m===8 || _m===10 || _m===12) + { + nDays= 31; + } + else if ( _m===4 || _m===6 || _m===9 || _m===11) + { + nDays = 30; + } + else + { + if((_y%400===0) || (_y%4===0 && _y%100!==0)) + { + nDays = 29; + } + else + { + nDays = 28; + } + } + return nDays; + }, + + /** + * Function that works exactly as php date() function + * Works like PHP 5.2.2 PHP Date function + * + * @method get + * @param {String} format - as the string in which the date it will be formatted - mandatory + * @param {Date} [_date] - the date to format. If undefined it will do it on now() date. Can receive unix timestamp or a date object + * @return {String} Formatted date + * @public + * @static + * @example + * + */ + get: function(format, _date){ + /*jshint maxcomplexity:65 */ + if(typeof(format) === 'undefined' || format === ''){ + format = "Y-m-d"; + } + + + var iFormat = format.split(""); + var result = new Array(iFormat.length); + var escapeChar = "\\"; + var jsDate; + + if (typeof(_date) === 'undefined'){ + jsDate = new Date(); + } else if (typeof(_date)==='number'){ + jsDate = new Date(_date*1000); + } else { + jsDate = new Date(_date); + } + + var jsFirstDay, jsThisDay, jsHour; + /* This switch is presented in the same order as in php date function (PHP 5.2.2) */ + for (var i = 0; i < iFormat.length; i++) { + switch(iFormat[i]) { + case escapeChar: + result[i] = iFormat[i+1]; + i++; + break; + + + /* DAY */ + case "d": /* Day of the month, 2 digits with leading zeros; ex: 01 to 31 */ + var jsDay = jsDate.getDate(); + result[i] = (String(jsDay).length > 1) ? jsDay : "0" + jsDay; + break; + + case "D": /* A textual representation of a day, three letters; Seg to Dom */ + result[i] = this._wDays(jsDate.getDay()).substring(0, 3); + break; + + case "j": /* Day of the month without leading zeros; ex: 1 to 31 */ + result[i] = jsDate.getDate(); + break; + + case "l": /* A full textual representation of the day of the week; Domingo to Sabado */ + result[i] = this._wDays(jsDate.getDay()); + break; + + case "N": /* ISO-8601 numeric representation of the day of the week; 1 (Segunda) to 7 (Domingo) */ + result[i] = jsDate.getDay() || 7; + break; + + case "S": /* English ordinal suffix for the day of the month, 2 characters; st, nd, rd or th. Works well with j */ + var temp = jsDate.getDate(); + var suffixes = ["st", "nd", "rd"]; + var suffix = ""; + + if (temp >= 11 && temp <= 13) { + result[i] = "th"; + } else { + result[i] = (suffix = suffixes[String(temp).substr(-1) - 1]) ? (suffix) : ("th"); + } + break; + + case "w": /* Numeric representation of the day of the week; 0 (for Sunday) through 6 (for Saturday) */ + result[i] = jsDate.getDay(); + break; + + case "z": /* The day of the year (starting from 0); 0 to 365 */ + jsFirstDay = Date.UTC(jsDate.getFullYear(), 0, 0); + jsThisDay = Date.UTC(jsDate.getFullYear(), jsDate.getMonth(), jsDate.getDate()); + result[i] = Math.floor((jsThisDay - jsFirstDay) / (1000 * 60 * 60 * 24)); + break; + + /* WEEK */ + case "W": /* ISO-8601 week number of year, weeks starting on Monday; ex: 42 (the 42nd week in the year) */ + var jsYearStart = new Date( jsDate.getFullYear( ) , 0 , 1 ); + jsFirstDay = jsYearStart.getDay() || 7; + + var days = Math.floor( ( jsDate - jsYearStart ) / ( 24 * 60 * 60 * 1000 ) + 1 ); + + result[ i ] = Math.ceil( ( days - ( 8 - jsFirstDay ) ) / 7 ) + 1; + break; + + + /* MONTH */ + case "F": /* A full textual representation of a month, such as Janeiro or Marco; Janeiro a Dezembro */ + result[i] = this._months(jsDate.getMonth()); + break; + + case "m": /* Numeric representation of a month, with leading zeros; 01 to 12 */ + var jsMonth = String(jsDate.getMonth() + 1); + result[i] = (jsMonth.length > 1) ? jsMonth : "0" + jsMonth; + break; + + case "M": /* A short textual representation of a month, three letters; Jan a Dez */ + result[i] = this._months(jsDate.getMonth()).substring(0,3); + break; + + case "n": /* Numeric representation of a month, without leading zeros; 1 a 12 */ + result[i] = jsDate.getMonth() + 1; + break; + + case "t": /* Number of days in the given month; ex: 28 */ + result[i] = this._daysInMonth(jsDate.getMonth()+1,jsDate.getYear()); + break; + + /* YEAR */ + case "L": /* Whether it's a leap year; 1 if it is a leap year, 0 otherwise. */ + var jsYear = jsDate.getFullYear(); + result[i] = (jsYear % 4) ? false : ( (jsYear % 100) ? true : ( (jsYear % 400) ? false : true ) ); + break; + + case "o": /* ISO-8601 year number. This has the same value as Y, except that if the ISO week number (W) belongs to the previous or next year, that year is used instead. */ + throw '"o" not implemented!'; + + case "Y": /* A full numeric representation of a year, 4 digits; 1999 */ + result[i] = jsDate.getFullYear(); + break; + + case "y": /* A two digit representation of a year; 99 */ + result[i] = String(jsDate.getFullYear()).substring(2); + break; + + /* TIME */ + case "a": /* Lowercase Ante meridiem and Post meridiem; am or pm */ + result[i] = (jsDate.getHours() < 12) ? "am" : "pm"; + break; + + case "A": /* Uppercase Ante meridiem and Post meridiem; AM or PM */ + result[i] = (jsDate.getHours < 12) ? "AM" : "PM"; + break; + + case "B": /* Swatch Internet time; 000 through 999 */ + throw '"B" not implemented!'; + + case "g": /* 12-hour format of an hour without leading zeros; 1 to 12 */ + jsHour = jsDate.getHours(); + result[i] = (jsHour <= 12) ? jsHour : (jsHour - 12); + break; + + case "G": /* 24-hour format of an hour without leading zeros; 1 to 23 */ + result[i] = String(jsDate.getHours()); + break; + + case "h": /* 12-hour format of an hour with leading zeros; 01 to 12 */ + jsHour = String(jsDate.getHours()); + jsHour = (jsHour <= 12) ? jsHour : (jsHour - 12); + result[i] = (jsHour.length > 1) ? jsHour : "0" + jsHour; + break; + + case "H": /* 24-hour format of an hour with leading zeros; 01 to 24 */ + jsHour = String(jsDate.getHours()); + result[i] = (jsHour.length > 1) ? jsHour : "0" + jsHour; + break; + + case "i": /* Minutes with leading zeros; 00 to 59 */ + var jsMinute = String(jsDate.getMinutes()); + result[i] = (jsMinute.length > 1) ? jsMinute : "0" + jsMinute; + break; + + case "s": /* Seconds with leading zeros; 00 to 59; */ + var jsSecond = String(jsDate.getSeconds()); + result[i] = (jsSecond.length > 1) ? jsSecond : "0" + jsSecond; + break; + + case "u": /* Microseconds */ + throw '"u" not implemented!'; + + + /* TIMEZONE */ + + case "e": /* Timezone identifier */ + throw '"e" not implemented!'; + + case "I": /* "1" if Daylight Savings Time, "0" otherwise. Works only on the northern hemisphere */ + jsFirstDay = new Date(jsDate.getFullYear(), 0, 1); + result[i] = (jsDate.getTimezoneOffset() !== jsFirstDay.getTimezoneOffset()) ? (1) : (0); + break; + + case "O": /* Difference to Greenwich time (GMT) in hours */ + var jsMinZone = jsDate.getTimezoneOffset(); + var jsMinutes = jsMinZone % 60; + jsHour = String(((jsMinZone - jsMinutes) / 60) * -1); + + if (jsHour.charAt(0) !== "-") { + jsHour = "+" + jsHour; + } + + jsHour = (jsHour.length === 3) ? (jsHour) : (jsHour.replace(/([+\-])(\d)/, "$1" + 0 + "$2")); + result[i] = jsHour + jsMinutes + "0"; + break; + + case "P": /* Difference to Greenwich time (GMT) with colon between hours and minutes */ + throw '"P" not implemented!'; + + case "T": /* Timezone abbreviation */ + throw '"T" not implemented!'; + + case "Z": /* Timezone offset in seconds. The offset for timezones west of UTC is always negative, and for those east of UTC is always positive. */ + result[i] = jsDate.getTimezoneOffset() * 60; + break; + + + /* FULL DATE/TIME */ + + case "c": /* ISO 8601 date */ + throw '"c" not implemented!'; + + case "r": /* RFC 2822 formatted date */ + var jsDayName = this._wDays(jsDate.getDay()).substr(0, 3); + var jsMonthName = this._months(jsDate.getMonth()).substr(0, 3); + result[i] = jsDayName + ", " + jsDate.getDate() + " " + jsMonthName + this.get(" Y H:i:s O",jsDate); + break; + + case "U": /* Seconds since the Unix Epoch (January 1 1970 00:00:00 GMT) */ + result[i] = Math.floor(jsDate.getTime() / 1000); + break; + + default: + result[i] = iFormat[i]; + } + } + + return result.join(''); + + }, + + /** + * Functions that works like php date() function but return a date based on the formatted string + * Works like PHP 5.2.2 PHP Date function + * + * @method set + * @param {String} [format] As the string in which the date it will be formatted. By default is 'Y-m-d' + * @param {String} str_date The date formatted - Mandatory. + * @return {Date} Date object based on the formatted date + * @public + * @static + */ + set : function( format , str_date ) { + if ( typeof str_date === 'undefined' ) { return ; } + if ( typeof format === 'undefined' || format === '' ) { format = "Y-m-d"; } + + var iFormat = format.split(""); + var result = new Array( iFormat.length ); + var escapeChar = "\\"; + var mList; + + var objIndex = { + year : undefined , + month : undefined , + day : undefined , + dayY : undefined , + dayW : undefined , + week : undefined , + hour : undefined , + hourD : undefined , + min : undefined , + sec : undefined , + msec : undefined , + ampm : undefined , + diffM : undefined , + diffH : undefined , + date : undefined + }; + + var matches = 0; + + /* This switch is presented in the same order as in php date function (PHP 5.2.2) */ + for ( var i = 0; i < iFormat.length; i++) { + switch( iFormat[ i ] ) { + case escapeChar: + result[i] = iFormat[ i + 1 ]; + i++; + break; + + /* DAY */ + case "d": /* Day of the month, 2 digits with leading zeros; ex: 01 to 31 */ + result[ i ] = '(\\d{2})'; + objIndex.day = { original : i , match : matches++ }; + break; + + case "j": /* Day of the month without leading zeros; ex: 1 to 31 */ + result[ i ] = '(\\d{1,2})'; + objIndex.day = { original : i , match : matches++ }; + break; + + case "D": /* A textual representation of a day, three letters; Seg to Dom */ + result[ i ] = '([\\wá]{3})'; + objIndex.dayW = { original : i , match : matches++ }; + break; + + case "l": /* A full textual representation of the day of the week; Domingo to Sabado */ + result[i] = '([\\wá]{5,7})'; + objIndex.dayW = { original : i , match : matches++ }; + break; + + case "N": /* ISO-8601 numeric representation of the day of the week; 1 (Segunda) to 7 (Domingo) */ + result[ i ] = '(\\d)'; + objIndex.dayW = { original : i , match : matches++ }; + break; + + case "w": /* Numeric representation of the day of the week; 0 (for Sunday) through 6 (for Saturday) */ + result[ i ] = '(\\d)'; + objIndex.dayW = { original : i , match : matches++ }; + break; + + case "S": /* English ordinal suffix for the day of the month, 2 characters; st, nd, rd or th. Works well with j */ + result[ i ] = '\\w{2}'; + break; + + case "z": /* The day of the year (starting from 0); 0 to 365 */ + result[ i ] = '(\\d{1,3})'; + objIndex.dayY = { original : i , match : matches++ }; + break; + + /* WEEK */ + case "W": /* ISO-8601 week number of year, weeks starting on Monday; ex: 42 (the 42nd week in the year) */ + result[ i ] = '(\\d{1,2})'; + objIndex.week = { original : i , match : matches++ }; + break; + + /* MONTH */ + case "F": /* A full textual representation of a month, such as Janeiro or Marco; Janeiro a Dezembro */ + result[ i ] = '([\\wç]{4,9})'; + objIndex.month = { original : i , match : matches++ }; + break; + + case "M": /* A short textual representation of a month, three letters; Jan a Dez */ + result[ i ] = '(\\w{3})'; + objIndex.month = { original : i , match : matches++ }; + break; + + case "m": /* Numeric representation of a month, with leading zeros; 01 to 12 */ + result[ i ] = '(\\d{2})'; + objIndex.month = { original : i , match : matches++ }; + break; + + case "n": /* Numeric representation of a month, without leading zeros; 1 a 12 */ + result[ i ] = '(\\d{1,2})'; + objIndex.month = { original : i , match : matches++ }; + break; + + case "t": /* Number of days in the given month; ex: 28 */ + result[ i ] = '\\d{2}'; + break; + + /* YEAR */ + case "L": /* Whether it's a leap year; 1 if it is a leap year, 0 otherwise. */ + result[ i ] = '\\w{4,5}'; + break; + + case "o": /* ISO-8601 year number. This has the same value as Y, except that if the ISO week number (W) belongs to the previous or next year, that year is used instead. */ + throw '"o" not implemented!'; + + case "Y": /* A full numeric representation of a year, 4 digits; 1999 */ + result[ i ] = '(\\d{4})'; + objIndex.year = { original : i , match : matches++ }; + break; + + case "y": /* A two digit representation of a year; 99 */ + result[ i ] = '(\\d{2})'; + if ( typeof objIndex.year === 'undefined' || iFormat[ objIndex.year.original ] !== 'Y' ) { + objIndex.year = { original : i , match : matches++ }; + } + break; + + /* TIME */ + case "a": /* Lowercase Ante meridiem and Post meridiem; am or pm */ + result[ i ] = '(am|pm)'; + objIndex.ampm = { original : i , match : matches++ }; + break; + + case "A": /* Uppercase Ante meridiem and Post meridiem; AM or PM */ + result[ i ] = '(AM|PM)'; + objIndex.ampm = { original : i , match : matches++ }; + break; + + case "B": /* Swatch Internet time; 000 through 999 */ + throw '"B" not implemented!'; + + case "g": /* 12-hour format of an hour without leading zeros; 1 to 12 */ + result[ i ] = '(\\d{1,2})'; + objIndex.hourD = { original : i , match : matches++ }; + break; + + case "G": /* 24-hour format of an hour without leading zeros; 1 to 23 */ + result[ i ] = '(\\d{1,2})'; + objIndex.hour = { original : i , match : matches++ }; + break; + + case "h": /* 12-hour format of an hour with leading zeros; 01 to 12 */ + result[ i ] = '(\\d{2})'; + objIndex.hourD = { original : i , match : matches++ }; + break; + + case "H": /* 24-hour format of an hour with leading zeros; 01 to 24 */ + result[ i ] = '(\\d{2})'; + objIndex.hour = { original : i , match : matches++ }; + break; + + case "i": /* Minutes with leading zeros; 00 to 59 */ + result[ i ] = '(\\d{2})'; + objIndex.min = { original : i , match : matches++ }; + break; + + case "s": /* Seconds with leading zeros; 00 to 59; */ + result[ i ] = '(\\d{2})'; + objIndex.sec = { original : i , match : matches++ }; + break; + + case "u": /* Microseconds */ + throw '"u" not implemented!'; + + /* TIMEZONE */ + case "e": /* Timezone identifier */ + throw '"e" not implemented!'; + + case "I": /* "1" if Daylight Savings Time, "0" otherwise. Works only on the northern hemisphere */ + result[i] = '\\d'; + break; + + case "O": /* Difference to Greenwich time (GMT) in hours */ + result[ i ] = '([-+]\\d{4})'; + objIndex.diffH = { original : i , match : matches++ }; + break; + + case "P": /* Difference to Greenwich time (GMT) with colon between hours and minutes */ + throw '"P" not implemented!'; + + case "T": /* Timezone abbreviation */ + throw '"T" not implemented!'; + + case "Z": /* Timezone offset in seconds. The offset for timezones west of UTC is always negative, and for those east of UTC is always positive. */ + result[ i ] = '(\\-?\\d{1,5})'; + objIndex.diffM = { original : i , match : matches++ }; + break; + + /* FULL DATE/TIME */ + case "c": /* ISO 8601 date */ + throw '"c" not implemented!'; + + case "r": /* RFC 2822 formatted date */ + result[ i ] = '([\\wá]{3}, \\d{1,2} \\w{3} \\d{4} \\d{2}:\\d{2}:\\d{2} [+\\-]\\d{4})'; + objIndex.date = { original : i , match : matches++ }; + break; + + case "U": /* Seconds since the Unix Epoch (January 1 1970 00:00:00 GMT) */ + result[ i ] = '(\\d{1,13})'; + objIndex.date = { original : i , match : matches++ }; + break; + + default: + result[ i ] = iFormat[ i ]; + } + } + + var pattr = new RegExp( result.join('') ); + + try { + mList = str_date.match( pattr ); + if ( !mList ) { return; } + } + catch ( e ) { return ; } + + var _haveDatetime = typeof objIndex.date !== 'undefined'; + + var _haveYear = typeof objIndex.year !== 'undefined'; + + var _haveYDay = typeof objIndex.dayY !== 'undefined'; + + var _haveDay = typeof objIndex.day !== 'undefined'; + var _haveMonth = typeof objIndex.month !== 'undefined'; + var _haveMonthDay = _haveMonth && _haveDay; + var _haveOnlyDay = !_haveMonth && _haveDay; + + var _haveWDay = typeof objIndex.dayW !== 'undefined'; + var _haveWeek = typeof objIndex.week !== 'undefined'; + var _haveWeekWDay = _haveWeek && _haveWDay; + var _haveOnlyWDay = !_haveWeek && _haveWDay; + + var _validDate = _haveYDay || _haveMonthDay || !_haveYear && _haveOnlyDay || _haveWeekWDay || !_haveYear && _haveOnlyWDay; + var _noDate = !_haveYear && !_haveYDay && !_haveDay && !_haveMonth && !_haveWDay && !_haveWeek; + + var _haveHour12 = typeof objIndex.hourD !== 'undefined' && typeof objIndex.ampm !== 'undefined'; + var _haveHour24 = typeof objIndex.hour !== 'undefined'; + var _haveHour = _haveHour12 || _haveHour24; + + var _haveMin = typeof objIndex.min !== 'undefined'; + var _haveSec = typeof objIndex.sec !== 'undefined'; + var _haveMSec = typeof objIndex.msec !== 'undefined'; + + var _haveMoreM = !_noDate || _haveHour; + var _haveMoreS = _haveMoreM || _haveMin; + + var _haveDiffM = typeof objIndex.diffM !== 'undefined'; + var _haveDiffH = typeof objIndex.diffH !== 'undefined'; + //var _haveGMT = _haveDiffM || _haveDiffH; + var hour; + var min; + + if ( _haveDatetime ) { + if ( iFormat[ objIndex.date.original ] === 'U' ) { + return new Date( +mList[ objIndex.date.match + 1 ] * 1000 ); + } + + var dList = mList[ objIndex.date.match + 1 ].match( /\w{3}, (\d{1,2}) (\w{3}) (\d{4}) (\d{2}):(\d{2}):(\d{2}) ([+\-]\d{4})/ ); + hour = +dList[ 4 ] + ( +dList[ 7 ].slice( 0 , 3 ) ); + min = +dList[ 5 ] + ( dList[ 7 ].slice( 0 , 1 ) + dList[ 7 ].slice( 3 ) ) / 100 * 60; + + return new Date( dList[ 3 ] , this._iMonth( dList[ 2 ] ) , dList[ 1 ] , hour , min , dList[ 6 ] ); + } + + var _d = new Date( ); + var year; + var month; + var day; + var sec; + var msec; + var gmt; + + if ( !_validDate && !_noDate ) { return ; } + + if ( _validDate ) { + if ( _haveYear ) { + var _y = _d.getFullYear( ) - 50 + ''; + year = mList[ objIndex.year.match + 1 ]; + if ( iFormat[ objIndex.year.original ] === 'y' ) { + year = +_y.slice( 0 , 2 ) + ( year >= ( _y ).slice( 2 ) ? 0 : 1 ) + year; + } + } else { + year = _d.getFullYear(); + } + + if ( _haveYDay ) { + month = 0; + day = mList[ objIndex.dayY.match + 1 ]; + } else if ( _haveDay ) { + if ( _haveMonth ) { + month = this._iMonth( mList[ objIndex.month.match + 1 ] ); + } else { + month = _d.getMonth( ); + } + + day = mList[ objIndex.day.match + 1 ]; + } else { + month = 0; + + var week; + if ( _haveWeek ) { + week = mList[ objIndex.week.match + 1 ]; + } else { + week = this.get( 'W' , _d ); + } + + day = ( week - 2 ) * 7 + ( 8 - ( ( new Date( year , 0 , 1 ) ).getDay( ) || 7 ) ) + this._iWeek( mList[ objIndex.week.match + 1 ] ); + } + + if ( month === 0 && day > 31 ) { + var aux = new Date( year , month , day ); + month = aux.getMonth( ); + day = aux.getDate( ); + } + } + else { + year = _d.getFullYear( ); + month = _d.getMonth( ); + day = _d.getDate( ); + } + + if ( _haveHour12 ) { hour = +mList[ objIndex.hourD.match + 1 ] + ( mList[ objIndex.ampm.match + 1 ] === 'pm' ? 12 : 0 ); } + else if ( _haveHour24 ) { hour = mList[ objIndex.hour.match + 1 ]; } + else if ( _noDate ) { hour = _d.getHours( ); } + else { hour = '00'; } + + if ( _haveMin ) { min = mList[ objIndex.min.match + 1 ]; } + else if ( !_haveMoreM ) { min = _d.getMinutes( ); } + else { min = '00'; } + + if ( _haveSec ) { sec = mList[ objIndex.sec.match + 1 ]; } + else if ( !_haveMoreS ) { sec = _d.getSeconds( ); } + else { sec = '00'; } + + if ( _haveMSec ) { msec = mList[ objIndex.msec.match + 1 ]; } + else { msec = '000'; } + + if ( _haveDiffH ) { gmt = mList[ objIndex.diffH.match + 1 ]; } + else if ( _haveDiffM ) { gmt = String( -1 * mList[ objIndex.diffM.match + 1 ] / 60 * 100 ).replace( /^(\d)/ , '+$1' ).replace( /(^[\-+])(\d{3}$)/ , '$10$2' ); } + else { gmt = '+0000'; } + + return new Date( year, month, day, hour, min, sec ); + } + }; + + + return InkDate; + +}); + +/** + * @module Ink.Util.Dumper_1 + * @author inkdev AT sapo.pt + * @version 1 + */ +Ink.createModule('Ink.Util.Dumper', '1', [], function() { + + 'use strict'; + + /** + * Dump/Profiling Utilities + * + * @class Ink.Util.Dumper + * @version 1 + * @static + */ + var Dumper = { + + /** + * Hex code for the 'tab' + * + * @property _tab + * @type {String} + * @private + * @readOnly + * @static + * + */ + _tab: '\xA0\xA0\xA0\xA0', + + /** + * Function that returns the argument passed formatted + * + * @method _formatParam + * @param {Mixed} param + * @return {String} The argument passed formatted + * @private + * @static + */ + _formatParam: function(param) + { + var formated = ''; + + switch(typeof(param)) { + case 'string': + formated = '(string) '+param; + break; + case 'number': + formated = '(number) '+param; + break; + case 'boolean': + formated = '(boolean) '+param; + break; + case 'object': + if(param !== null) { + if(param.constructor === Array) { + formated = 'Array \n{\n' + this._outputFormat(param, 0) + '\n}'; + } else { + formated = 'Object \n{\n' + this._outputFormat(param, 0) + '\n}'; + } + } else { + formated = 'null'; + } + break; + default: + formated = false; + } + + return formated; + }, + + /** + * Function that returns the tabs concatenated + * + * @method _getTabs + * @param {Number} numberOfTabs Number of Tabs + * @return {String} Tabs concatenated + * @private + * @static + */ + _getTabs: function(numberOfTabs) + { + var tabs = ''; + for(var _i = 0; _i < numberOfTabs; _i++) { + tabs += this._tab; + } + return tabs; + }, + + /** + * Function that formats the parameter to display + * + * @method _outputFormat + * @param {Any} param + * @param {Number} dim + * @return {String} The parameter passed formatted to displat + * @private + * @static + */ + _outputFormat: function(param, dim) + { + var formated = ''; + //var _strVal = false; + var _typeof = false; + for(var key in param) { + if(param[key] !== null) { + if(typeof(param[key]) === 'object' && (param[key].constructor === Array || param[key].constructor === Object)) { + if(param[key].constructor === Array) { + _typeof = 'Array'; + } else if(param[key].constructor === Object) { + _typeof = 'Object'; + } + formated += this._tab + this._getTabs(dim) + '[' + key + '] => '+_typeof+'\n'; + formated += this._tab + this._getTabs(dim) + '{\n'; + formated += this._outputFormat(param[key], dim + 1) + this._tab + this._getTabs(dim) + '}\n'; + } else if(param[key].constructor === Function) { + continue; + } else { + formated = formated + this._tab + this._getTabs(dim) + '[' + key + '] => ' + param[key] + '\n'; + } + } else { + formated = formated + this._tab + this._getTabs(dim) + '[' + key + '] => null \n'; + } + } + return formated; + }, + + /** + * Print variable structure. Can be passed an output target + * + * @method printDump + * @param {Object|String|Boolean} param + * @param {optional String|Object} target (can be an element ID or an element) + * @public + * @static + */ + printDump: function(param, target) + { + /*jshint evil:true */ + if(!target || typeof(target) === 'undefined') { + document.write('
'+this._formatParam(param)+'
'); + } else { + if(typeof(target) === 'string') { + document.getElementById(target).innerHTML = '
' + this._formatParam(param) + '
'; + } else if(typeof(target) === 'object') { + target.innerHTML = '
'+this._formatParam(param)+'
'; + } else { + throw "TARGET must be an element or an element ID"; + } + } + }, + + /** + * Function that returns the variable's structure + * + * @method returnDump + * @param {Object|String|Boolean} param + * @return {String} The variable structure + * @public + * @static + */ + returnDump: function(param) + { + return this._formatParam(param); + }, + + /** + * Function that alerts the variable structure + * + * @method alertDump + * @param {Object|String|Boolean} param + * @public + * @static + */ + alertDump: function(param) + { + window.alert(this._formatParam(param).replace(/()(Array|Object)(<\/b>)/g, "$2")); + }, + + /** + * Print to new window the variable structure + * + * @method windowDump + * @param {Object|String|Boolean} param + * @public + * @static + */ + windowDump: function(param) + { + var dumperwindow = 'dumperwindow_'+(Math.random() * 10000); + var win = window.open('', + dumperwindow, + 'width=400,height=300,left=50,top=50,status,menubar,scrollbars,resizable' + ); + win.document.open(); + win.document.write('
'+this._formatParam(param)+'
'); + win.document.close(); + win.focus(); + } + + }; + + return Dumper; + +}); + +/** + * @module Ink.Util.I18n_1 + * @author inkdev AT sapo.pt + */ + +Ink.createModule('Ink.Util.I18n', '1', [], function () { + 'use strict'; + + var pattrText = /\{(?:(\{.*?})|(?:%s:)?(\d+)|(?:%s)?|([\w-]+))}/g; + + var funcOrVal = function( ret , args ) { + if ( typeof ret === 'function' ) { + return ret.apply(this, args); + } else if (typeof ret !== undefined) { + return ret; + } else { + return ''; + } + }; + + /** + * Creates a new internationalization helper object + * + * @class Ink.Util.I18n + * @constructor + * + * @param {Object} dict object mapping language codes (in the form of `pt_PT`, `pt_BR`, `fr`, `en_US`, etc.) to their Object dictionaries. + * @param {Object} dict.(dictionaries...) + * @param {String} [lang='pt_PT'] language code of the target language + * + * @example + * var dictionaries = { // This could come from a JSONP request from your server + * 'pt_PT': { + * 'hello': 'olá', + * 'me': 'eu', + * 'i have a {} for you': 'tenho um {} para ti' // Old syntax using `{%s}` tokens still available + * }, + * 'pt_BR': { + * 'hello': 'oi', + * 'me': 'eu', + * 'i have a {} for you': 'tenho um {} para você' + * } + * }; + * Ink.requireModules(['Ink.Util.I18n_1'], function (I18n) { + * var i18n = new I18n(dictionaries, 'pt_PT'); + * i18n.text('hello'); // returns 'olá' + * i18n.text('i have a {} for you', 'IRON SWORD'); // returns 'tenho um IRON SWORD' para ti + * + * i18n.lang('pt_BR'); // Changes language. pt_BR dictionary is loaded + * i18n.text('hello'); // returns 'oi' + * + * i18n.lang('en_US'); // Missing language. + * i18n.text('hello'); // returns 'hello'. If testMode is on, returns '[hello]' + * }); + * + * @example + * // The old {%s} syntax from libsapo's i18n is still supported + * i18n.text('hello, {%s}!', 'someone'); // -> 'olá, someone!' + */ + var I18n = function( dict , lang , testMode ) { + if ( !( this instanceof I18n ) ) { return new I18n( dict , lang , testMode ); } + + this.reset( ) + .lang( lang ) + .testMode( testMode ) + .append( dict || { } , lang ); + }; + + I18n.prototype = { + reset: function( ) { + this._dicts = [ ]; + this._dict = { }; + this._testMode = false; + this._lang = this._gLang; + + return this; + }, + /** + * Adds translation strings for this helper to use. + * + * @method append + * @param {Object} dict object containing language objects identified by their language code + * @example + * var i18n = new I18n({}, 'pt_PT'); + * i18n.append({'pt_PT': { + * 'sfraggles': 'braggles' + * }}); + * i18n.text('sfraggles') // -> 'braggles' + */ + append: function( dict ) { + this._dicts.push( dict ); + + this._dict = Ink.extendObj(this._dict , dict[ this._lang ] ); + + return this; + }, + /** + * Get the language code + * + * @returns {String} the language code for this instance + * @method {String} lang + */ + /** + * Set the language. If there are more dictionaries available in cache, they will be loaded. + * + * @method lang + * @param lang {String} Language code to set this instance to. + */ + lang: function( lang ) { + if ( !arguments.length ) { return this._lang; } + + if ( lang && this._lang !== lang ) { + this._lang = lang; + + this._dict = { }; + + for ( var i = 0, l = this._dicts.length; i < l; i++ ) { + this._dict = Ink.extendObj( this._dict , this._dicts[ i ][ lang ] || { } ); + } + } + + return this; + }, + /** + * Get the testMode + * + * @returns {Boolean} the testMode for this instance + * @method {Boolean} testMode + */ + /** + * Sets or unsets test mode. In test mode, unknown strings are wrapped + * in `[ ... ]`. This is useful for debugging your application and + * making sure all your translation keys are in place. + * + * @method testMode + * @param {Boolean} bool boolean value to set the test mode to. + */ + testMode: function( bool ) { + if ( !arguments.length ) { return !!this._testMode; } + + if ( bool !== undefined ) { this._testMode = !!bool; } + + return this; + }, + + /** + * Return an arbitrary key from the current language dictionary + * + * @method getKey + * @param {String} key + * @return {Any} The object which happened to be in the current language dictionary on the given key. + * + * @example + * _.getKey('astring'); // -> 'a translated string' + * _.getKey('anobject'); // -> {'a': 'translated object'} + * _.getKey('afunction'); // -> function () { return 'this is a localized function' } + */ + getKey: function( key ) { + var ret; + var gLang = this._gLang; + var lang = this._lang; + + if ( key in this._dict ) { + ret = this._dict[ key ]; + } else { + I18n.lang( lang ); + + ret = this._gDict[ key ]; + + I18n.lang( gLang ); + } + + return ret; + }, + + /** + * Given a translation key, return a translated string, with replaced parameters. + * When a translated string is not available, the original string is returned unchanged. + * + * @method {String} text + * @param {String} str key to look for in i18n dictionary (which is returned verbatim if unknown) + * @param {Object} [namedParms] named replacements. Replaces {named} with values in this object. + * @param {String} [arg1] replacement #1 (replaces first {} and all {1}) + * @param {String} [arg2] replacement #2 (replaces second {} and all {2}) + * @param {String} [argn...] replacement #n (replaces nth {} and all {n}) + * + * @example + * _('Gosto muito de {} e o céu é {}.', 'carros', 'azul'); + * // returns 'Gosto muito de carros e o céu é azul.' + * + * @example + * _('O {1} é {2} como {2} é a cor do {3}.', 'carro', 'azul', 'FCP'); + * // returns 'O carro é azul como azul é o FCP.' + * + * @example + * _('O {person1} dava-se com a {person2}', {person1: 'coisinho', person2: 'coisinha'}); + * // -> 'O coisinho dava-se com a coisinha' + * + * @example + * // This is a bit more complex + * var i18n = make().lang('pt_PT').append({ + * pt_PT: { + * array: [1, 2], + * object: {'a': '-a-', 'b': '-b-'}, + * func: function (a, b) {return '[[' + a + ',' + b + ']]';} + * } + * }); + * i18n.text('array', 0); // -> '1' + * i18n.text('object', 'a'); // -> '-a-' + * i18n.text('func', 'a', 'b'); // -> '[[a,b]]' + */ + text: function( str /*, replacements...*/ ) { + if ( typeof str !== 'string' ) { return; } // Backwards-compat + + var pars = Array.prototype.slice.call( arguments , 1 ); + var idx = 0; + var isObj = typeof pars[ 0 ] === 'object'; + + var original = this.getKey( str ); + if ( original === undefined ) { original = this._testMode ? '[' + str + ']' : str; } + if ( typeof original === 'number' ) { original += ''; } + + if (typeof original === 'string') { + original = original.replace( pattrText , function( m , $1 , $2 , $3 ) { + var ret = + $1 ? $1 : + $2 ? pars[ $2 - ( isObj ? 0 : 1 ) ] : + $3 ? pars[ 0 ][ $3 ] || '' : + pars[ (idx++) + ( isObj ? 1 : 0 ) ]; + return funcOrVal( ret , [idx].concat(pars) ); + }); + return original; + } + + return ( + typeof original === 'function' ? original.apply( this , pars ) : + original instanceof Array ? funcOrVal( original[ pars[ 0 ] ] , pars ) : + typeof original === 'object' ? funcOrVal( original[ pars[ 0 ] ] , pars ) : + ''); + }, + + /** + * Given a singular string, a plural string, and a number, translates + * either the singular or plural string. + * + * @method ntext + * @return {String} + * + * @param {String} strSin word to use when count is 1 + * @param {String} strPlur word to use otherwise + * @param {Number} count number which defines which word to use + * @param [...] extra arguments, to be passed to `text()` + * + * @example + * i18n.ntext('platypus', 'platypuses', 1); // returns 'ornitorrinco' + * i18n.ntext('platypus', 'platypuses', 2); // returns 'ornitorrincos' + * + * @example + * // The "count" argument is passed to text() + * i18n.ntext('{} platypus', '{} platypuses', 1); // returns '1 ornitorrinco' + * i18n.ntext('{} platypus', '{} platypuses', 2); // returns '2 ornitorrincos' + */ + ntext: function( strSin , strPlur , count ) { + var pars = Array.prototype.slice.apply( arguments ); + var original; + + if ( pars.length === 2 && typeof strPlur === 'number' ) { + original = this.getKey( strSin ); + if ( !( original instanceof Array ) ) { return ''; } + + pars.splice( 0 , 1 ); + original = original[ strPlur === 1 ? 0 : 1 ]; + } else { + pars.splice( 0 , 2 ); + original = count === 1 ? strSin : strPlur; + } + + return this.text.apply( this , [ original ].concat( pars ) ); + }, + + /** + * Returns the ordinal suffix of `num` (For example, 1 > 'st', 2 > 'nd', 5 > 'th', ...). + * + * This works by using transforms (in the form of Objects or Functions) passed into the + * function or found in the special key `_ordinals` in the active language dictionary. + * + * @method ordinal + * + * @param {Number} num Input number + * + * @param {Object|Function} [options={}] + * + * Maps for translating. Each of these options' fallback is found in the current + * language's dictionary. The lookup order is the following: + * + * 1. `exceptions` + * 2. `byLastDigit` + * 3. `default` + * + * Each of these may be either an `Object` or a `Function`. If it's a function, it + * is called (with `number` and `digit` for any function except for byLastDigit, + * which is called with the `lastDigit` of the number in question), and if the + * function returns a string, that is used. If it's an object, the property is + * looked up using `[...]`. If what is found is a string, it is used. + * + * @param {Object|Function} [options.byLastDigit={}] + * If the language requires the last digit to be considered, mappings of last digits + * to ordinal suffixes can be created here. + * + * @param {Object|Function} [options.exceptions={}] + * Map unique, special cases to their ordinal suffixes. + * + * @returns {String} Ordinal suffix for `num`. + * + * @example + * var i18n = new I18n({ + * pt_PT: { // 1º, 2º, 3º, 4º, ... + * _ordinal: { // The _ordinals key each translation dictionary is special. + * 'default': "º" // Usually the suffix is "º" in portuguese... + * } + * }, + * fr: { // 1er, 2e, 3e, 4e, ... + * _ordinal: { // The _ordinals key is special. + * 'default': "e", // Usually the suffix is "e" in french... + * exceptions: { + * 1: "er" // ... Except for the number one. + * } + * } + * }, + * en_US: { // 1st, 2nd, 3rd, 4th, ..., 11th, 12th, ... 21st, 22nd... + * _ordinal: { + * 'default': "th",// Usually the digit is "th" in english... + * byLastDigit: { + * 1: "st", // When the last digit is 1, use "th"... + * 2: "nd", // When the last digit is 2, use "nd"... + * 3: "rd" // When the last digit is 3, use "rd"... + * }, + * exceptions: { // But these numbers are special + * 0: "", + * 11: "th", + * 12: "th", + * 13: "th" + * } + * } + * } + * }, 'pt_PT'); + * + * i18n.ordinal(1); // returns 'º' + * i18n.ordinal(2); // returns 'º' + * i18n.ordinal(11); // returns 'º' + * + * i18n.lang('fr'); + * i18n.ordinal(1); // returns 'er' + * i18n.ordinal(2); // returns 'e' + * i18n.ordinal(11); // returns 'e' + * + * i18n.lang('en_US'); + * i18n.ordinal(1); // returns 'st' + * i18n.ordinal(2); // returns 'nd' + * i18n.ordinal(12); // returns 'th' + * i18n.ordinal(22); // returns 'nd' + * i18n.ordinal(3); // returns 'rd' + * i18n.ordinal(4); // returns 'th' + * i18n.ordinal(5); // returns 'th' + * + **/ + ordinal: function( num ) { + if ( num === undefined ) { return ''; } + + var lastDig = +num.toString( ).slice( -1 ); + + var ordDict = this.getKey( '_ordinals' ); + if ( ordDict === undefined ) { return ''; } + + if ( typeof ordDict === 'string' ) { return ordDict; } + + var ret; + + if ( typeof ordDict === 'function' ) { + ret = ordDict( num , lastDig ); + + if ( typeof ret === 'string' ) { return ret; } + } + + if ( 'exceptions' in ordDict ) { + ret = typeof ordDict.exceptions === 'function' ? ordDict.exceptions( num , lastDig ) : + num in ordDict.exceptions ? funcOrVal( ordDict.exceptions[ num ] , [num , lastDig] ) : + undefined; + + if ( typeof ret === 'string' ) { return ret; } + } + + if ( 'byLastDigit' in ordDict ) { + ret = typeof ordDict.byLastDigit === 'function' ? ordDict.byLastDigit( lastDig , num ) : + lastDig in ordDict.byLastDigit ? funcOrVal( ordDict.byLastDigit[ lastDig ] , [lastDig , num] ) : + undefined; + + if ( typeof ret === 'string' ) { return ret; } + } + + if ( 'default' in ordDict ) { + ret = funcOrVal( ordDict['default'] , [ num , lastDig ] ); + + if ( typeof ret === 'string' ) { return ret; } + } + + return ''; + }, + + /** + * Returns an alias to `text()`, for convenience. The resulting function is + * traditionally assigned to "_". + * + * @method alias + * @returns {Function} an alias to `text()`. You can also access the rest of the translation API through this alias. + * + * @example + * var i18n = new I18n({ + * 'pt_PT': { + * 'hi': 'olá', + * '{} day': '{} dia', + * '{} days': '{} dias', + * '_ordinals': { + * 'default': 'º' + * } + * } + * }, 'pt_PT'); + * var _ = i18n.alias(); + * _('hi'); // -> 'olá' + * _('{} days', 3); // -> '3 dias' + * _.ntext('{} day', '{} days', 2); // -> '2 dias' + * _.ntext('{} day', '{} days', 1); // -> '1 dia' + * _.ordinal(3); // -> 'º' + */ + alias: function( ) { + var ret = Ink.bind( I18n.prototype.text , this ); + ret.ntext = Ink.bind( I18n.prototype.ntext , this ); + ret.append = Ink.bind( I18n.prototype.append , this ); + ret.ordinal = Ink.bind( I18n.prototype.ordinal , this ); + ret.testMode = Ink.bind( I18n.prototype.testMode , this ); + + return ret; + } + }; + + /** + * @static + * @method I18n.reset + * + * Reset I18n global state (global dictionaries, and default language for instances) + **/ + I18n.reset = function( ) { + I18n.prototype._gDicts = [ ]; + I18n.prototype._gDict = { }; + I18n.prototype._gLang = 'pt_PT'; + }; + I18n.reset( ); + + /** + * @static + * @method I18n.append + * + * @param dict {Object} Dictionary to be added + * @param lang {String} Language to be added to + * + * Add a dictionary to be used in all I18n instances for the corresponding language + */ + I18n.append = function( dict , lang ) { + if ( lang ) { + if ( !( lang in dict ) ) { + var obj = { }; + + obj[ lang ] = dict; + + dict = obj; + } + + if ( lang !== I18n.prototype._gLang ) { I18n.lang( lang ); } + } + + I18n.prototype._gDicts.push( dict ); + + Ink.extendObj( I18n.prototype._gDict , dict[ I18n.prototype._gLang ] ); + }; + + /** + * @static + * @method I18n.lang + * + * @param lang {String} String in the format `"pt_PT"`, `"fr"`, etc. + * + * Set global default language of I18n instances to `lang` + */ + /** + * @static + * @method I18n.lang + * + * Get the current default language of I18n instances. + * + * @return {String} language code + */ + I18n.lang = function( lang ) { + if ( !arguments.length ) { return I18n.prototype._gLang; } + + if ( lang && I18n.prototype._gLang !== lang ) { + I18n.prototype._gLang = lang; + + I18n.prototype._gDict = { }; + + for ( var i = 0, l = I18n.prototype._gDicts.length; i < l; i++ ) { + Ink.extendObj( I18n.prototype._gDict , I18n.prototype._gDicts[ i ][ lang ] || { } ); + } + } + }; + + return I18n; +}); + +/** + * @module Ink.Util.Json_1 + * + * @author inkdev AT sapo.pt + */ + +Ink.createModule('Ink.Util.Json', '1', [], function() { + 'use strict'; + + var function_call = Function.prototype.call; + var cx = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g; + + function twoDigits(n) { + var r = '' + n; + if (r.length === 1) { + return '0' + r; + } else { + return r; + } + } + + var dateToISOString = Date.prototype.toISOString ? + Ink.bind(function_call, Date.prototype.toISOString) : + function(date) { + // Adapted from https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString + return date.getUTCFullYear() + + '-' + twoDigits( date.getUTCMonth() + 1 ) + + '-' + twoDigits( date.getUTCDate() ) + + 'T' + twoDigits( date.getUTCHours() ) + + ':' + twoDigits( date.getUTCMinutes() ) + + ':' + twoDigits( date.getUTCSeconds() ) + + '.' + String( (date.getUTCMilliseconds()/1000).toFixed(3) ).slice( 2, 5 ) + + 'Z'; + }; + + /** + * Use this class to convert JSON strings to JavaScript objects + * `(Json.parse)` and also to do the opposite operation `(Json.stringify)`. + * Internally, the standard JSON implementation is used if available + * Otherwise, the functions mimic the standard implementation. + * + * Here's how to produce JSON from an existing object: + * + * Ink.requireModules(['Ink.Util.Json_1'], function (Json) { + * var obj = { + * key1: 'value1', + * key2: 'value2', + * keyArray: ['arrayValue1', 'arrayValue2', 'arrayValue3'] + * }; + * Json.stringify(obj); // The above object as a JSON string + * }); + * + * And here is how to parse JSON: + * + * Ink.requireModules(['Ink.Util.Json_1'], function (Json) { + * var source = '{"key": "value", "array": [true, null, false]}'; + * Json.parse(source); // The above JSON string as an object + * }); + * @class Ink.Util.Json + * @static + * + */ + var InkJson = { + _nativeJSON: window.JSON || null, + + _convertToUnicode: false, + + // Escape characters so as to embed them in JSON strings + _escape: function (theString) { + var _m = { '\b': '\\b', '\t': '\\t', '\n': '\\n', '\f': '\\f', '\r': '\\r', '"': '\\"', '\\': '\\\\' }; + + if (/["\\\x00-\x1f]/.test(theString)) { + theString = theString.replace(/([\x00-\x1f\\"])/g, function(a, b) { + var c = _m[b]; + if (c) { + return c; + } + c = b.charCodeAt(); + return '\\u00' + Math.floor(c / 16).toString(16) + (c % 16).toString(16); + }); + } + + return theString; + }, + + // A character conversion map + _toUnicode: function (theString) + { + if(!this._convertToUnicode) { + return this._escape(theString); + } else { + var unicodeString = ''; + var inInt = false; + var theUnicode = false; + var i = 0; + var total = theString.length; + while(i < total) { + inInt = theString.charCodeAt(i); + if( (inInt >= 32 && inInt <= 126) || + //(inInt >= 48 && inInt <= 57) || + //(inInt >= 65 && inInt <= 90) || + //(inInt >= 97 && inInt <= 122) || + inInt === 8 || + inInt === 9 || + inInt === 10 || + inInt === 12 || + inInt === 13 || + inInt === 32 || + inInt === 34 || + inInt === 47 || + inInt === 58 || + inInt === 92) { + + if(inInt === 34 || inInt === 92 || inInt === 47) { + theUnicode = '\\'+theString.charAt(i); + } else if(inInt === 8) { + theUnicode = '\\b'; + } else if(inInt === 9) { + theUnicode = '\\t'; + } else if(inInt === 10) { + theUnicode = '\\n'; + } else if(inInt === 12) { + theUnicode = '\\f'; + } else if(inInt === 13) { + theUnicode = '\\r'; + } else { + theUnicode = theString.charAt(i); + } + } else { + if(this._convertToUnicode) { + theUnicode = theString.charCodeAt(i).toString(16)+''.toUpperCase(); + while (theUnicode.length < 4) { + theUnicode = '0' + theUnicode; + } + theUnicode = '\\u' + theUnicode; + } else { + theUnicode = theString.charAt(i); + } + } + unicodeString += theUnicode; + + i++; + } + + return unicodeString; + } + + }, + + _stringifyValue: function(param) { + if (typeof param === 'string') { + return '"' + this._toUnicode(param) + '"'; + } else if (typeof param === 'number' && (isNaN(param) || !isFinite(param))) { // Unusable numbers go null + return 'null'; + } else if (typeof param === 'undefined' || param === null) { // And so does undefined + return 'null'; + } else if (typeof param.toJSON === 'function') { + var t = param.toJSON(); + if (typeof t === 'string') { + return '"' + this._escape(t) + '"'; + } else { + return this._escape(t.toString()); + } + } else if (typeof param === 'number' || typeof param === 'boolean') { // These ones' toString methods return valid JSON. + return '' + param; + } else if (typeof param === 'function') { + return 'null'; // match JSON.stringify + } else if (param.constructor === Date) { + return '"' + this._escape(dateToISOString(param)) + '"'; + } else if (param.constructor === Array) { + var arrayString = ''; + for (var i = 0, len = param.length; i < len; i++) { + if (i > 0) { + arrayString += ','; + } + arrayString += this._stringifyValue(param[i]); + } + return '[' + arrayString + ']'; + } else { // Object + var objectString = ''; + for (var k in param) { + if ({}.hasOwnProperty.call(param, k)) { + if (objectString !== '') { + objectString += ','; + } + objectString += '"' + this._escape(k) + '": ' + this._stringifyValue(param[k]); + } + } + return '{' + objectString + '}'; + } + }, + + /** + * serializes a JSON object into a string. + * + * @method stringify + * @param {Object} input Data to be serialized into JSON + * @param {Boolean} convertToUnicode When `true`, converts string contents to unicode \uXXXX + * @return {String} serialized string + * + * @example + * Json.stringify({a:1.23}); // -> string: '{"a": 1.23}' + */ + stringify: function(input, convertToUnicode) { + this._convertToUnicode = !!convertToUnicode; + if(!this._convertToUnicode && this._nativeJSON) { + return this._nativeJSON.stringify(input); + } + return this._stringifyValue(input); // And recurse. + }, + + /** + * @method parse + * @param text {String} Input string + * @param reviver {Function} Function receiving `(key, value)`, and `this`=(containing object), used to walk objects. + * + * @example + * Simple example: + * + * Json.parse('{"a": "3","numbers":false}', + * function (key, value) { + * if (!this.numbers && key === 'a') { + * return "NO NUMBERS"; + * } else { + * return value; + * } + * }); // -> object: {a: 'NO NUMBERS', numbers: false} + */ + /* From https://github.com/douglascrockford/JSON-js/blob/master/json.js */ + parse: function (text, reviver) { + /*jshint evil:true*/ + +// The parse method takes a text and an optional reviver function, and returns +// a JavaScript value if the text is a valid JSON text. + + var j; + + function walk(holder, key) { + +// The walk method is used to recursively walk the resulting structure so +// that modifications can be made. + + var k, v, value = holder[key]; + if (value && typeof value === 'object') { + for (k in value) { + if (Object.prototype.hasOwnProperty.call(value, k)) { + v = walk(value, k); + if (v !== undefined) { + value[k] = v; + } else { + delete value[k]; + } + } + } + } + return reviver.call(holder, key, value); + } + + +// Parsing happens in four stages. In the first stage, we replace certain +// Unicode characters with escape sequences. JavaScript handles many characters +// incorrectly, either silently deleting them, or treating them as line endings. + + text = String(text); + cx.lastIndex = 0; + if (cx.test(text)) { + text = text.replace(cx, function (a) { + return '\\u' + + ('0000' + a.charCodeAt(0).toString(16)).slice(-4); + }); + } + +// In the second stage, we run the text against regular expressions that look +// for non-JSON patterns. We are especially concerned with '()' and 'new' +// because they can cause invocation, and '=' because it can cause mutation. +// But just to be safe, we want to reject all unexpected forms. + +// We split the second stage into 4 regexp operations in order to work around +// crippling inefficiencies in IE's and Safari's regexp engines. First we +// replace the JSON backslash pairs with '@' (a non-JSON character). Second, we +// replace all simple value tokens with ']' characters. Third, we delete all +// open brackets that follow a colon or comma or that begin the text. Finally, +// we look to see that the remaining characters are only whitespace or ']' or +// ',' or ':' or '{' or '}'. If that is so, then the text is safe for eval. + + if (/^[\],:{}\s]*$/ + .test(text.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@') + .replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']') + .replace(/(?:^|:|,)(?:\s*\[)+/g, ''))) { + +// In the third stage we use the eval function to compile the text into a +// JavaScript structure. The '{' operator is subject to a syntactic ambiguity +// in JavaScript: it can begin a block or an object literal. We wrap the text +// in parens to eliminate the ambiguity. + + j = eval('(' + text + ')'); + +// In the optional fourth stage, we recursively walk the new structure, passing +// each name/value pair to a reviver function for possible transformation. + + return typeof reviver === 'function' ? + walk({'': j}, '') : + j; + } + +// If the text is not JSON parseable, then a SyntaxError is thrown. + + throw new SyntaxError('JSON.parse'); + } + }; + + return InkJson; +}); + +/** + * @module Ink.Util.String_1 + * @author inkdev AT sapo.pt + * @version 1 + */ +Ink.createModule('Ink.Util.String', '1', [], function() { + + 'use strict'; + + /** + * String Manipulation Utilities + * + * @class Ink.Util.String + * @version 1 + * @static + */ + var InkUtilString = { + + /** + * List of special chars + * + * @property _chars + * @type {Array} + * @private + * @readOnly + * @static + */ + _chars: ['&','à','á','â','ã','ä','å','æ','ç','è','é', + 'ê','ë','ì','í','î','ï','ð','ñ','ò','ó','ô', + 'õ','ö','ø','ù','ú','û','ü','ý','þ','ÿ','À', + 'Á','Â','Ã','Ä','Å','Æ','Ç','È','É','Ê','Ë', + 'Ì','Í','Î','Ï','Ð','Ñ','Ò','Ó','Ô','Õ','Ö', + 'Ø','Ù','Ú','Û','Ü','Ý','Þ','€','\"','ß','<', + '>','¢','£','¤','¥','¦','§','¨','©','ª','«', + '¬','\xad','®','¯','°','±','²','³','´','µ','¶', + '·','¸','¹','º','»','¼','½','¾'], + + /** + * List of the special characters' html entities + * + * @property _entities + * @type {Array} + * @private + * @readOnly + * @static + */ + _entities: ['amp','agrave','aacute','acirc','atilde','auml','aring', + 'aelig','ccedil','egrave','eacute','ecirc','euml','igrave', + 'iacute','icirc','iuml','eth','ntilde','ograve','oacute', + 'ocirc','otilde','ouml','oslash','ugrave','uacute','ucirc', + 'uuml','yacute','thorn','yuml','Agrave','Aacute','Acirc', + 'Atilde','Auml','Aring','AElig','Ccedil','Egrave','Eacute', + 'Ecirc','Euml','Igrave','Iacute','Icirc','Iuml','ETH','Ntilde', + 'Ograve','Oacute','Ocirc','Otilde','Ouml','Oslash','Ugrave', + 'Uacute','Ucirc','Uuml','Yacute','THORN','euro','quot','szlig', + 'lt','gt','cent','pound','curren','yen','brvbar','sect','uml', + 'copy','ordf','laquo','not','shy','reg','macr','deg','plusmn', + 'sup2','sup3','acute','micro','para','middot','cedil','sup1', + 'ordm','raquo','frac14','frac12','frac34'], + + /** + * List of accented chars + * + * @property _accentedChars + * @type {Array} + * @private + * @readOnly + * @static + */ + _accentedChars:['à','á','â','ã','ä','å', + 'è','é','ê','ë', + 'ì','í','î','ï', + 'ò','ó','ô','õ','ö', + 'ù','ú','û','ü', + 'ç','ñ', + 'À','Á','Â','Ã','Ä','Å', + 'È','É','Ê','Ë', + 'Ì','Í','Î','Ï', + 'Ò','Ó','Ô','Õ','Ö', + 'Ù','Ú','Û','Ü', + 'Ç','Ñ'], + + /** + * List of the accented chars (above), but without the accents + * + * @property _accentedRemovedChars + * @type {Array} + * @private + * @readOnly + * @static + */ + _accentedRemovedChars:['a','a','a','a','a','a', + 'e','e','e','e', + 'i','i','i','i', + 'o','o','o','o','o', + 'u','u','u','u', + 'c','n', + 'A','A','A','A','A','A', + 'E','E','E','E', + 'I','I','I','I', + 'O','O','O','O','O', + 'U','U','U','U', + 'C','N'], + /** + * Object that contains the basic HTML unsafe chars, as keys, and their HTML entities as values + * + * @property _htmlUnsafeChars + * @type {Object} + * @private + * @readOnly + * @static + */ + _htmlUnsafeChars:{'<':'<','>':'>','&':'&','"':'"',"'":'''}, + + /** + * Convert first letter of a word to upper case
+ * If param as more than one word, it converts first letter of all words that have more than 2 letters + * + * @method ucFirst + * @param {String} string + * @param {Boolean} [firstWordOnly=false] capitalize only first word. + * @return {String} string camel cased + * @public + * @static + * + * @example + * InkString.ucFirst('hello world'); // -> 'Hello World' + * InkString.ucFirst('hello world', true); // -> 'Hello world' + */ + ucFirst: function(string, firstWordOnly) { + var replacer = firstWordOnly ? /(^|\s)(\w)(\S{2,})/ : /(^|\s)(\w)(\S{2,})/g; + return string ? String(string).replace(replacer, function(_, $1, $2, $3){ + return $1 + $2.toUpperCase() + $3.toLowerCase(); + }) : string; + }, + + /** + * Remove spaces and new line from biggin and ends of string + * + * @method trim + * @param {String} string + * @return {String} string trimmed + * @public + * @static + */ + trim: function(string) + { + if (typeof string === 'string') { + return string.replace(/^\s+|\s+$|\n+$/g, ''); + } + return string; + }, + + /** + * Removes HTML tags of string + * + * @method stripTags + * @param {String} string + * @param {String} allowed + * @return {String} String stripped from HTML tags, leaving only the allowed ones (if any) + * @public + * @static + * @example + * + */ + stripTags: function(string, allowed) + { + if (allowed && typeof allowed === 'string') { + var aAllowed = InkUtilString.trim(allowed).split(','); + var aNewAllowed = []; + var cleanedTag = false; + for(var i=0; i < aAllowed.length; i++) { + if(InkUtilString.trim(aAllowed[i]) !== '') { + cleanedTag = InkUtilString.trim(aAllowed[i].replace(/(<|\>)/g, '').replace(/\s/, '')); + aNewAllowed.push('(<'+cleanedTag+'\\s[^>]+>|<(\\s|\\/)?(\\s|\\/)?'+cleanedTag+'>)'); + } + } + var strAllowed = aNewAllowed.join('|'); + var reAllowed = new RegExp(strAllowed, "i"); + + var aFoundTags = string.match(new RegExp("<[^>]*>", "g")); + + for(var j=0; j < aFoundTags.length; j++) { + if(!aFoundTags[j].match(reAllowed)) { + string = string.replace((new RegExp(aFoundTags[j], "gm")), ''); + } + } + return string; + } else { + return string.replace(/<[^\>]+\>/g, ''); + } + }, + + /** + * Convert listed characters to HTML entities + * + * @method htmlEntitiesEncode + * @param {String} string + * @return {String} string encoded + * @public + * @static + */ + htmlEntitiesEncode: function(string) + { + if (string && string.replace) { + var re = false; + for (var i = 0; i < InkUtilString._chars.length; i++) { + re = new RegExp(InkUtilString._chars[i], "gm"); + string = string.replace(re, '&' + InkUtilString._entities[i] + ';'); + } + } + return string; + }, + + /** + * Convert listed HTML entities to character + * + * @method htmlEntitiesDecode + * @param {String} string + * @return {String} string decoded + * @public + * @static + */ + htmlEntitiesDecode: function(string) + { + if (string && string.replace) { + var re = false; + for (var i = 0; i < InkUtilString._entities.length; i++) { + re = new RegExp("&"+InkUtilString._entities[i]+";", "gm"); + string = string.replace(re, InkUtilString._chars[i]); + } + string = string.replace(/&#[^;]+;?/g, function($0){ + if ($0.charAt(2) === 'x') { + return String.fromCharCode(parseInt($0.substring(3), 16)); + } + else { + return String.fromCharCode(parseInt($0.substring(2), 10)); + } + }); + } + return string; + }, + + /** + * Encode a string to UTF8 + * + * @method utf8Encode + * @param {String} string + * @return {String} string utf8 encoded + * @public + * @static + */ + utf8Encode: function(string) { + /*jshint bitwise:false*/ + string = string.replace(/\r\n/g,"\n"); + var utfstring = ""; + + for (var n = 0; n < string.length; n++) { + + var c = string.charCodeAt(n); + + if (c < 128) { + utfstring += String.fromCharCode(c); + } + else if((c > 127) && (c < 2048)) { + utfstring += String.fromCharCode((c >> 6) | 192); + utfstring += String.fromCharCode((c & 63) | 128); + } + else { + utfstring += String.fromCharCode((c >> 12) | 224); + utfstring += String.fromCharCode(((c >> 6) & 63) | 128); + utfstring += String.fromCharCode((c & 63) | 128); + } + + } + return utfstring; + }, + + /** + * Make a string shorter without cutting words + * + * @method shortString + * @param {String} str + * @param {Number} n - number of chars of the short string + * @return {String} string shortened + * @public + * @static + */ + shortString: function(str,n) { + var words = str.split(' '); + var resultstr = ''; + for(var i = 0; i < words.length; i++ ){ + if((resultstr + words[i] + ' ').length>=n){ + resultstr += '…'; + break; + } + resultstr += words[i] + ' '; + } + return resultstr; + }, + + /** + * Truncates a string, breaking words and adding ... at the end + * + * @method truncateString + * @param {String} str + * @param {Number} length - length limit for the string. String will be + * at most this big, ellipsis included. + * @return {String} string truncated + * @public + * @static + */ + truncateString: function(str, length) { + if(str.length - 1 > length) { + return str.substr(0, length - 1) + "\u2026"; + } else { + return str; + } + }, + + /** + * Decode a string from UTF8 + * + * @method utf8Decode + * @param {String} string + * @return {String} string utf8 decoded + * @public + * @static + */ + utf8Decode: function(utfstring) { + /*jshint bitwise:false*/ + var string = ""; + var i = 0, c = 0, c2 = 0, c3 = 0; + + while ( i < utfstring.length ) { + + c = utfstring.charCodeAt(i); + + if (c < 128) { + string += String.fromCharCode(c); + i++; + } + else if((c > 191) && (c < 224)) { + c2 = utfstring.charCodeAt(i+1); + string += String.fromCharCode(((c & 31) << 6) | (c2 & 63)); + i += 2; + } + else { + c2 = utfstring.charCodeAt(i+1); + c3 = utfstring.charCodeAt(i+2); + string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63)); + i += 3; + } + + } + return string; + }, + + /** + * Convert all accented chars to char without accent. + * + * @method removeAccentedChars + * @param {String} string + * @return {String} string without accented chars + * @public + * @static + */ + removeAccentedChars: function(string) + { + var newString = string; + var re = false; + for (var i = 0; i < InkUtilString._accentedChars.length; i++) { + re = new RegExp(InkUtilString._accentedChars[i], "gm"); + newString = newString.replace(re, '' + InkUtilString._accentedRemovedChars[i] + ''); + } + return newString; + }, + + /** + * Count the number of occurrences of a specific needle in a haystack + * + * @method substrCount + * @param {String} haystack + * @param {String} needle + * @return {Number} Number of occurrences + * @public + * @static + */ + substrCount: function(haystack,needle) + { + return haystack ? haystack.split(needle).length - 1 : 0; + }, + + /** + * Eval a JSON string to a JS object + * + * @method evalJSON + * @param {String} strJSON + * @param {Boolean} sanitize + * @return {Object} JS Object + * @public + * @static + */ + evalJSON: function(strJSON, sanitize) { + /* jshint evil:true */ + if( (typeof sanitize === 'undefined' || sanitize === null) || InkUtilString.isJSON(strJSON)) { + try { + if(typeof(JSON) !== "undefined" && typeof(JSON.parse) !== 'undefined'){ + return JSON.parse(strJSON); + } + return eval('('+strJSON+')'); + } catch(e) { + throw new Error('ERROR: Bad JSON string...'); + } + } + }, + + /** + * Checks if a string is a valid JSON object (string encoded) + * + * @method isJSON + * @param {String} str + * @return {Boolean} + * @public + * @static + */ + isJSON: function(str) + { + str = str.replace(/\\./g, '@').replace(/"[^"\\\n\r]*"/g, ''); + return (/^[,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]*$/).test(str); + }, + + /** + * Escapes unsafe html chars to their entities + * + * @method htmlEscapeUnsafe + * @param {String} str String to escape + * @return {String} Escaped string + * @public + * @static + */ + htmlEscapeUnsafe: function(str){ + var chars = InkUtilString._htmlUnsafeChars; + return str !== null ? String(str).replace(/[<>&'"]/g,function(c){return chars[c];}) : str; + }, + + /** + * Normalizes whitespace in string. + * String is trimmed and sequences of many + * Whitespaces are collapsed. + * + * @method normalizeWhitespace + * @param {String} str String to normalize + * @return {String} string normalized + * @public + * @static + */ + normalizeWhitespace: function(str){ + return str !== null ? InkUtilString.trim(String(str).replace(/\s+/g,' ')) : str; + }, + + /** + * Converts string to unicode + * + * @method toUnicode + * @param {String} str + * @return {String} string unicoded + * @public + * @static + */ + toUnicode: function(str) { + if (typeof str === 'string') { + var unicodeString = ''; + var inInt = false; + var theUnicode = false; + var total = str.length; + var i=0; + + while(i < total) + { + inInt = str.charCodeAt(i); + if( (inInt >= 32 && inInt <= 126) || + inInt === 8 || + inInt === 9 || + inInt === 10 || + inInt === 12 || + inInt === 13 || + inInt === 32 || + inInt === 34 || + inInt === 47 || + inInt === 58 || + inInt === 92) { + + /* + if(inInt == 34 || inInt == 92 || inInt == 47) { + theUnicode = '\\'+str.charAt(i); + } else { + } + */ + if(inInt === 8) { + theUnicode = '\\b'; + } else if(inInt === 9) { + theUnicode = '\\t'; + } else if(inInt === 10) { + theUnicode = '\\n'; + } else if(inInt === 12) { + theUnicode = '\\f'; + } else if(inInt === 13) { + theUnicode = '\\r'; + } else { + theUnicode = str.charAt(i); + } + } else { + theUnicode = str.charCodeAt(i).toString(16)+''.toUpperCase(); + while (theUnicode.length < 4) { + theUnicode = '0' + theUnicode; + } + theUnicode = '\\u' + theUnicode; + } + unicodeString += theUnicode; + + i++; + } + return unicodeString; + } + }, + + /** + * Escapes a unicode character. returns \xXX if hex smaller than 0x100, otherwise \uXXXX + * + * @method escape + * @param {String} c Char + * @return {String} escaped char + * @public + * @static + */ + + /** + * @param {String} c char + */ + escape: function(c) { + var hex = (c).charCodeAt(0).toString(16).split(''); + if (hex.length < 3) { + while (hex.length < 2) { hex.unshift('0'); } + hex.unshift('x'); + } + else { + while (hex.length < 4) { hex.unshift('0'); } + hex.unshift('u'); + } + + hex.unshift('\\'); + return hex.join(''); + }, + + /** + * Unescapes a unicode character escape sequence + * + * @method unescape + * @param {String} es Escape sequence + * @return {String} String des-unicoded + * @public + * @static + */ + unescape: function(es) { + var idx = es.lastIndexOf('0'); + idx = idx === -1 ? 2 : Math.min(idx, 2); + //console.log(idx); + var hexNum = es.substring(idx); + //console.log(hexNum); + var num = parseInt(hexNum, 16); + return String.fromCharCode(num); + }, + + /** + * Escapes a string to unicode characters + * + * @method escapeText + * @param {String} txt + * @param {Array} [whiteList] + * @return {String} Escaped to Unicoded string + * @public + * @static + */ + escapeText: function(txt, whiteList) { + if (whiteList === undefined) { + whiteList = ['[', ']', '\'', ',']; + } + var txt2 = []; + var c, C; + for (var i = 0, f = txt.length; i < f; ++i) { + c = txt[i]; + C = c.charCodeAt(0); + if (C < 32 || C > 126 && whiteList.indexOf(c) === -1) { + c = InkUtilString.escape(c); + } + txt2.push(c); + } + return txt2.join(''); + }, + + /** + * Regex to check escaped strings + * + * @property escapedCharRegex + * @type {Regex} + * @public + * @readOnly + * @static + */ + escapedCharRegex: /(\\x[0-9a-fA-F]{2})|(\\u[0-9a-fA-F]{4})/g, + + /** + * Unescapes a string + * + * @method unescapeText + * @param {String} txt + * @return {String} Unescaped string + * @public + * @static + */ + unescapeText: function(txt) { + /*jshint boss:true */ + var m; + while (m = InkUtilString.escapedCharRegex.exec(txt)) { + m = m[0]; + txt = txt.replace(m, InkUtilString.unescape(m)); + InkUtilString.escapedCharRegex.lastIndex = 0; + } + return txt; + }, + + /** + * Compares two strings + * + * @method strcmp + * @param {String} str1 + * @param {String} str2 + * @return {Number} + * @public + * @static + */ + strcmp: function(str1, str2) { + return ((str1 === str2) ? 0 : ((str1 > str2) ? 1 : -1)); + }, + + /** + * Splits long string into string of, at most, maxLen (that is, all but last have length maxLen, + * last can measure maxLen or less) + * + * @method packetize + * @param {String} string string to divide + * @param {Number} maxLen packet size + * @return {Array} string divided + * @public + * @static + */ + packetize: function(str, maxLen) { + var len = str.length; + var parts = new Array( Math.ceil(len / maxLen) ); + var chars = str.split(''); + var sz, i = 0; + while (len) { + sz = Math.min(maxLen, len); + parts[i++] = chars.splice(0, sz).join(''); + len -= sz; + } + return parts; + } + }; + + return InkUtilString; + +}); + +/** + * @module Ink.Util.Url_1 + * @author inkdev AT sapo.pt + * @version 1 + */ +Ink.createModule('Ink.Util.Url', '1', [], function() { + + 'use strict'; + + /** + * Utility functions to use with URLs + * + * @class Ink.Util.Url + * @version 1 + * @static + */ + var Url = { + + /** + * Auxiliary string for encoding + * + * @property _keyStr + * @type {String} + * @readOnly + * @private + */ + _keyStr : 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=', + + + /** + * Get current URL of page + * + * @method getUrl + * @return {String} Current URL + * @public + * @static + * @example + * Ink.requireModules(['Ink.Util.Url_1'], function( InkUrl ){ + * console.log( InkUrl.getUrl() ); // Will return it's window URL + * }); + */ + getUrl: function() + { + return window.location.href; + }, + + /** + * Generates an uri with query string based on the parameters object given + * + * @method genQueryString + * @param {String} uri + * @param {Object} params + * @return {String} URI with query string set + * @public + * @static + * @example + * Ink.requireModules(['Ink.Util.Url_1'], function( InkUrl ){ + * var queryString = InkUrl.genQueryString( 'http://www.sapo.pt/', { + * 'param1': 'valueParam1', + * 'param2': 'valueParam2' + * }); + * + * console.log( queryString ); // Result: http://www.sapo.pt/?param1=valueParam1¶m2=valueParam2 + * }); + */ + genQueryString: function(uri, params) { + var hasQuestionMark = uri.indexOf('?') !== -1; + var sep, pKey, pValue, parts = [uri]; + + for (pKey in params) { + if (params.hasOwnProperty(pKey)) { + if (!hasQuestionMark) { + sep = '?'; + hasQuestionMark = true; + } else { + sep = '&'; + } + pValue = params[pKey]; + if (typeof pValue !== 'number' && !pValue) { + pValue = ''; + } + parts = parts.concat([sep, encodeURIComponent(pKey), '=', encodeURIComponent(pValue)]); + } + } + + return parts.join(''); + }, + + /** + * Get query string of current or passed URL + * + * @method getQueryString + * @param {String} [str] URL String. When not specified it uses the current URL. + * @return {Object} Key-Value object with the pairs variable: value + * @public + * @static + * @example + * Ink.requireModules(['Ink.Util.Url_1'], function( InkUrl ){ + * var queryStringParams = InkUrl.getQueryString( 'http://www.sapo.pt/?var1=valueVar1&var2=valueVar2' ); + * console.log( queryStringParams ); + * // Result: + * // { + * // var1: 'valueVar1', + * // var2: 'valueVar2' + * // } + * }); + */ + getQueryString: function(str) + { + var url; + if(str && typeof(str) !== 'undefined') { + url = str; + } else { + url = this.getUrl(); + } + var aParams = {}; + if(url.match(/\?(.+)/i)) { + var queryStr = url.replace(/^(.*)\?([^\#]+)(\#(.*))?/g, "$2"); + if(queryStr.length > 0) { + var aQueryStr = queryStr.split(/[;&]/); + for(var i=0; i < aQueryStr.length; i++) { + var pairVar = aQueryStr[i].split('='); + aParams[decodeURIComponent(pairVar[0])] = (typeof(pairVar[1]) !== 'undefined' && pairVar[1]) ? decodeURIComponent(pairVar[1]) : false; + } + } + } + return aParams; + }, + + /** + * Get URL hash + * + * @method getAnchor + * @param {String} [str] URL String. If not set, it will get the current URL. + * @return {String|Boolean} Hash in the URL. If there's no hash, returns false. + * @public + * @static + * @example + * Ink.requireModules(['Ink.Util.Url_1'], function( InkUrl ){ + * var anchor = InkUrl.getAnchor( 'http://www.sapo.pt/page.php#TEST' ); + * console.log( anchor ); // Result: TEST + * }); + */ + getAnchor: function(str) + { + var url; + if(str && typeof(str) !== 'undefined') { + url = str; + } else { + url = this.getUrl(); + } + var anchor = false; + if(url.match(/#(.+)/)) { + anchor = url.replace(/([^#]+)#(.*)/, "$2"); + } + return anchor; + }, + + /** + * Get anchor string of current or passed URL + * + * @method getAnchorString + * @param {String} [string] If not provided it uses the current URL. + * @return {Object} Returns a key-value object of the 'variables' available in the hashtag of the URL + * @public + * @static + * @example + * Ink.requireModules(['Ink.Util.Url_1'], function( InkUrl ){ + * var hashParams = InkUrl.getAnchorString( 'http://www.sapo.pt/#var1=valueVar1&var2=valueVar2' ); + * console.log( hashParams ); + * // Result: + * // { + * // var1: 'valueVar1', + * // var2: 'valueVar2' + * // } + * }); + */ + getAnchorString: function(string) + { + var url; + if(string && typeof(string) !== 'undefined') { + url = string; + } else { + url = this.getUrl(); + } + var aParams = {}; + if(url.match(/#(.+)/i)) { + var anchorStr = url.replace(/^([^#]+)#(.*)?/g, "$2"); + if(anchorStr.length > 0) { + var aAnchorStr = anchorStr.split(/[;&]/); + for(var i=0; i < aAnchorStr.length; i++) { + var pairVar = aAnchorStr[i].split('='); + aParams[decodeURIComponent(pairVar[0])] = (typeof(pairVar[1]) !== 'undefined' && pairVar[1]) ? decodeURIComponent(pairVar[1]) : false; + } + } + } + return aParams; + }, + + + /** + * Parse passed URL + * + * @method parseUrl + * @param {String} url URL to be parsed + * @return {Object} Parsed URL as a key-value object. + * @public + * @static + * @example + * Ink.requireModules(['Ink.Util.Url_1'], function( InkUrl ){ + * var parsedURL = InkUrl.parseUrl( 'http://www.sapo.pt/index.html?var1=value1#anchor' ) + * console.log( parsedURL ); + * // Result: + * // { + * // 'scheme' => 'http', + * // 'host' => 'www.sapo.pt', + * // 'path' => '/index.html', + * // 'query' => 'var1=value1', + * // 'fragment' => 'anchor' + * // } + * }); + * + */ + parseUrl: function(url) { + var aURL = {}; + if(url && typeof url === 'string') { + if(url.match(/^([^:]+):\/\//i)) { + var re = /^([^:]+):\/\/([^\/]*)\/?([^\?#]*)\??([^#]*)#?(.*)/i; + if(url.match(re)) { + aURL.scheme = url.replace(re, "$1"); + aURL.host = url.replace(re, "$2"); + aURL.path = '/'+url.replace(re, "$3"); + aURL.query = url.replace(re, "$4") || false; + aURL.fragment = url.replace(re, "$5") || false; + } + } else { + var re1 = new RegExp("^([^\\?]+)\\?([^#]+)#(.*)", "i"); + var re2 = new RegExp("^([^\\?]+)\\?([^#]+)#?", "i"); + var re3 = new RegExp("^([^\\?]+)\\??", "i"); + if(url.match(re1)) { + aURL.scheme = false; + aURL.host = false; + aURL.path = url.replace(re1, "$1"); + aURL.query = url.replace(re1, "$2"); + aURL.fragment = url.replace(re1, "$3"); + } else if(url.match(re2)) { + aURL.scheme = false; + aURL.host = false; + aURL.path = url.replace(re2, "$1"); + aURL.query = url.replace(re2, "$2"); + aURL.fragment = false; + } else if(url.match(re3)) { + aURL.scheme = false; + aURL.host = false; + aURL.path = url.replace(re3, "$1"); + aURL.query = false; + aURL.fragment = false; + } + } + if(aURL.host) { + var regPort = /^(.*?)\\:(\\d+)$/i; + // check for port + if(aURL.host.match(regPort)) { + var tmpHost1 = aURL.host; + aURL.host = tmpHost1.replace(regPort, "$1"); + aURL.port = tmpHost1.replace(regPort, "$2"); + } else { + aURL.port = false; + } + // check for user and pass + if(aURL.host.match(/@/i)) { + var tmpHost2 = aURL.host; + aURL.host = tmpHost2.split('@')[1]; + var tmpUserPass = tmpHost2.split('@')[0]; + if(tmpUserPass.match(/\:/)) { + aURL.user = tmpUserPass.split(':')[0]; + aURL.pass = tmpUserPass.split(':')[1]; + } else { + aURL.user = tmpUserPass; + aURL.pass = false; + } + } + } + } + return aURL; + }, + + /** + * Take a URL object from Ink.Util.Url.parseUrl or a window.location + * object and returns a URL string. + * + * @method format + * @param urlObj window.location, a.href, or parseUrl object to format + * @return {String} Full URL. + */ + format: function (urlObj) { + var protocol = ''; + var host = ''; + var path = ''; + var frag = ''; + var query = ''; + + if (typeof urlObj.protocol === 'string') { + protocol = urlObj.protocol + '//'; // here it comes with the colon + } else if (typeof urlObj.scheme === 'string') { + protocol = urlObj.scheme + '://'; + } + + host = urlObj.host || urlObj.hostname || ''; + path = urlObj.path || ''; + + if (typeof urlObj.query === 'string') { + query = urlObj.query; + } else if (typeof urlObj.search === 'string') { + query = urlObj.search.replace(/^\?/, ''); + } + if (typeof urlObj.fragment === 'string') { + frag = urlObj.fragment; + } else if (typeof urlObj.hash === 'string') { + frag = urlObj.hash.replace(/#$/, ''); + } + + return [ + protocol, + host, + path, + query && '?' + query, + frag && '#' + frag + ].join(''); + }, + + /** + * Get last loaded script element + * + * @method currentScriptElement + * @param {String} [match] String to match against the script src attribute + * @return {DOMElement|Boolean} Returns the + * + **/ + function Animate(elOrSelector, options) { + this._element = Common.elOrSelector(elOrSelector); + this._options = Common.options({ + trigger: ['Element', null], + duration: ['String', 'slow'], // Actually a string with a duration name, or a number of ms + animation: ['String'], + removeClass: ['Boolean', true], + onEnd: ['Function', function () {}] + }, options || {}, this._element); + + if (!isNaN(parseInt(this._options.duration, 10))) { + this._options.duration = parseInt(this._options.duration, 10); + } + + if (this._options.trigger) { + InkEvent.observe(this._options.trigger, 'click', Ink.bind(function () { + this.animate(); + }, this)); // later + } else { + this.animate(); + } + } + + Animate.prototype.animate = function () { + Animate.animate(this._element, this._options.animation, this._options); + }; + + Ink.extendObj(Animate, { + /** + * Prefix for CSS animation-related properties in this browser. + * + * @property _animationPrefix + * @private + **/ + _animationPrefix: animationPrefix, + + /** + * Whether CSS3 animation is supported in this browser. + * + * @property {Boolean} animationSupported + **/ + animationSupported: !!animationPrefix, + + /** + * The correct event for the animationend event in this browser, with the correct prefix + * + * @property {String} animationEndEventName + **/ + animationEndEventName: animationEndEventName, + + /** + * Animate a div using one of the animate.css classes + * + * **Note: This is a utility method inside the `Animate` class, which you can access through `Animate.animate()`. Do not mix these up.** + * + * @example + * + * Animate.animate(myDiv, 'shake', { + * onEnd: function () { + * alert('Finished shaking!'); + * } + * }); + * + * @static + * @method animate + * @param element {DOMElement} animated element + * @param animation {String} animation name + * @param [options] {Object} + * @param [options.onEnd=null] {Function} callback for animation end + * @param [options.removeClass=false] {Boolean} whether to remove the Css class when finished + * @param [options.duration=medium] {String|Number} duration name (fast|medium|slow) or duration in ms + **/ + animate: function (element, animation, options) { + element = Common.elOrSelector(element); + + if (typeof options === 'number' || typeof options === 'string') { + options = { duration: options }; + } + + if (typeof arguments[3] === 'function') { + options.onEnd = arguments[3]; + } + + if (typeof options.duration !== 'number' && typeof options.duration !== 'string') { + options.duration = 400; + } + + if (!Animate.animationSupported) { + if (options.onEnd) { + setTimeout(function () { + options.onEnd(null); + }, 0); + } + return; + } + + if (typeof options.duration === 'number') { + element.style[animationPrefix + 'Duration'] = options.duration + 'ms'; + } else if (typeof options.duration === 'string') { + Css.addClassName(element, options.duration); + } + + Css.addClassName(element, ['animated', animation]); + + function onAnimationEnd(event) { + if (event.target !== element) { return; } + if (event.animationName !== animation) { return; } + if (options.onEnd) { options.onEnd(event); } + if (options.removeClass) { + Css.removeClassName(element, animation); + } + if (typeof options.duration === 'string') { + Css.removeClassName(element, options.duration); + } + element.removeEventListener(animationEndEventName, onAnimationEnd, false); + } + + element.addEventListener(animationEndEventName, onAnimationEnd, false); + } + }); + + return Animate; +}); + + +/** + * @module Ink.UI.Carousel_1 + * @author inkdev AT sapo.pt + * @version 1 + */ +Ink.createModule('Ink.UI.Carousel', '1', + ['Ink.UI.Common_1', 'Ink.Dom.Event_1', 'Ink.Dom.Css_1', 'Ink.Dom.Element_1', 'Ink.UI.Pagination_1', 'Ink.Dom.Browser_1', 'Ink.Dom.Selector_1'], + function(Common, InkEvent, Css, InkElement, Pagination, Browser/*, Selector*/) { + 'use strict'; + + /* + * TODO: + * keyboardSupport + */ + + function limitRange(n, min, max) { + return Math.min(max, Math.max(min, n)); + } + + var requestAnimationFrame = window.requestAnimationFrame || + window.mozRequestAnimationFrame || + window.webkitRequestAnimationFrame || + function (cb) {return setTimeout(cb, 1000 / 30); }; + + /** + * @class Ink.UI.Carousel_1 + * @constructor + * + * @param {String|DOMElement} selector + * @param {Object} [options] + * @param {Integer} [autoAdvance=0] The number of milliseconds to wait between auto-advancing pages. Set to 0 to disable auto-advance. + * @param {String} [options.axis='x'] Can be `'x'` or `'y'`, for a horizontal or vertical carousel + * @param {Boolean} [options.center=false] Center the carousel. + * @param {Number} [options.initialPage=0] When initialized, set the page to this. + * @TODO @param {Boolean} [options.keyboardSupport=false] Enable keyboard support + * @param {Boolean} [options.swipe=true] Enable swipe support where available + * @param {String|DOMElement|Ink.UI.Pagination_1} [options.pagination] Either an `
    ` element to add pagination markup to, or an `Ink.UI.Pagination` instance to use. + * @param {Function} [options.onChange] Callback for when the page is changed. + */ + var Carousel = function(selector, options) { + this._handlers = { + paginationChange: Ink.bindMethod(this, '_onPaginationChange'), + windowResize: InkEvent.throttle(Ink.bindMethod(this, 'refit'), 200) + }; + + InkEvent.observe(window, 'resize', this._handlers.windowResize); + + var element = this._element = Common.elOrSelector(selector, '1st argument'); + + var opts = this._options = Common.options({ + autoAdvance: ['Integer', 0], + axis: ['String', 'x'], + initialPage: ['Integer', 0], + hideLast: ['Boolean', false], + center: ['Boolean', false], + keyboardSupport:['Boolean', false], + pagination: ['String', null], + onChange: ['Function', null], + swipe: ['Boolean', true] + // TODO exponential swipe + // TODO specify break point for next page when moving finger + }, options || {}, element, this); + + this._isY = (opts.axis === 'y'); + + var ulEl = Ink.s('ul.stage', element); + this._ulEl = ulEl; + + InkElement.removeTextNodeChildren(ulEl); + + this.refit(); // recalculate this._numPages + + if (this._isY) { + // Override white-space: no-wrap which is only necessary to make sure horizontal stuff stays horizontal, but breaks stuff intended to be vertical. + this._ulEl.style.whiteSpace = 'normal'; + } + + if (opts.swipe) { + InkEvent.observe(element, 'touchstart', Ink.bindMethod(this, '_onTouchStart')); + InkEvent.observe(element, 'touchmove', Ink.bindMethod(this, '_onTouchMove')); + InkEvent.observe(element, 'touchend', Ink.bindMethod(this, '_onTouchEnd')); + } + + this._setUpPagination(); + this._setUpAutoAdvance(); + this._setUpHider(); + }; + + Carousel.prototype = { + /** + * Measure the carousel once again, adjusting the involved elements' + * sizes. Called automatically when the window resizes, in order to + * cater for changes from responsive media queries, for instance. + * + * @method refit + * @public + */ + refit: function() { + var _isY = this._isY; + + var size = function (elm, perpendicular) { + if (!perpendicular) { + return InkElement.outerDimensions(elm)[_isY ? 1 : 0]; + } else { + return InkElement.outerDimensions(elm)[_isY ? 0 : 1]; + } + }; + + this._liEls = Ink.ss('li.slide', this._ulEl); + var numSlides = this._liEls.length; + + var contRect = this._ulEl.getBoundingClientRect(); + this._ctnLength = _isY ? contRect.bottom - contRect.top : contRect.right - contRect.left; + this._elLength = size(this._liEls[0]); + this._slidesPerPage = Math.floor( this._ctnLength / this._elLength ) || 1; + + var numPages = Math.ceil( numSlides / this._slidesPerPage ); + var numPagesChanged = this._numPages !== numPages; + this._numPages = numPages; + this._deltaLength = this._slidesPerPage * this._elLength; + + this._center(); + this._updateHider(); + this._IE7(); + + if (this._pagination && numPagesChanged) { + this._pagination.setSize(this._numPages); + } + this.setPage(limitRange(this.getPage(), 1, this._numPages)); + }, + + _setUpPagination: function () { + if (this._options.pagination) { + if (Common.isDOMElement(this._options.pagination) || + typeof this._options.pagination === 'string') { + // if dom element or css selector string... + this._pagination = new Pagination(this._options.pagination, { + size: this._numPages, + onChange: this._handlers.paginationChange + }); + } else { + // assumes instantiated pagination + this._pagination = this._options.pagination; + this._pagination._options.onChange = this._handlers.paginationChange; + this._pagination.setSize(this._numPages); + } + this._pagination.setCurrent(this._options.initialPage || 0); + } else { + this._currentPage = this._options.initialPage || 0; + } + }, + + _setUpAutoAdvance: function () { + if (!this._options.autoAdvance) { return; } + var self = this; + + setTimeout(function autoAdvance() { + self.nextPage(true /* wrap */); + setTimeout(autoAdvance, self._options.autoAdvance); + }, this._options.autoAdvance); + }, + + _setUpHider: function () { + if (this._options.hideLast) { + var hiderEl = InkElement.create('div', { + className: 'hider', + insertBottom: this._element + }); + hiderEl.style.position = 'absolute'; + hiderEl.style[ this._isY ? 'left' : 'top' ] = '0'; // fix to top.. + hiderEl.style[ this._isY ? 'right' : 'bottom' ] = '0'; // and bottom... + hiderEl.style[ this._isY ? 'bottom' : 'right' ] = '0'; // and move to the end. + this._hiderEl = hiderEl; + } + }, + + _center: function() { + if (!this._options.center) { return; } + var gap = Math.floor( (this._ctnLength - (this._elLength * this._slidesPerPage) ) / 2 ); + + var pad; + if (this._isY) { + pad = [gap, 'px 0']; + } else { + pad = ['0 ', gap, 'px']; + } + + this._ulEl.style.padding = pad.join(''); + }, + + _updateHider: function() { + if (!this._hiderEl) { return; } + if (this.getPage() === 0) { + var gap = Math.floor( this._ctnLength - (this._elLength * this._slidesPerPage) ); + if (this._options.center) { + gap /= 2; + } + this._hiderEl.style[ this._isY ? 'height' : 'width' ] = gap + 'px'; + } else { + this._hiderEl.style[ this._isY ? 'height' : 'width' ] = '0px'; + } + }, + + /** + * Refit stuff for IE7 because it won't support inline-block. + * + * @method _IE7 + * @private + */ + _IE7: function () { + if (Browser.IE && '' + Browser.version.split('.')[0] === '7') { + // var numPages = this._numPages; + var slides = Ink.ss('li.slide', this._ulEl); + var stl = function (prop, val) {slides[i].style[prop] = val; }; + for (var i = 0, len = slides.length; i < len; i++) { + stl('position', 'absolute'); + stl(this._isY ? 'top' : 'left', (i * this._elLength) + 'px'); + } + } + }, + + _onTouchStart: function (event) { + if (event.touches.length > 1) { return; } + + this._swipeData = { + x: InkEvent.pointerX(event), + y: InkEvent.pointerY(event), + lastUlPos: null + }; + + var ulRect = this._ulEl.getBoundingClientRect(); + + this._swipeData.inUlX = this._swipeData.x - ulRect.left; + this._swipeData.inUlY = this._swipeData.y - ulRect.top; + + setTransitionProperty(this._ulEl, 'none'); + + this._touchMoveIsFirstTouchMove = true; + + // event.preventDefault(); + event.stopPropagation(); + }, + + _onTouchMove: function (event) { + if (event.touches.length > 1) { return; /* multitouch event, not my problem. */ } + + var pointerX = InkEvent.pointerX(event); + var pointerY = InkEvent.pointerY(event); + + var deltaY = Math.abs(pointerY - this._swipeData.y); + var deltaX = Math.abs(pointerX - this._swipeData.x); + + if (this._touchMoveIsFirstTouchMove) { + this._touchMoveIsFirstTouchMove = undefined; + this._scrolling = this._isY ? + deltaX > deltaY : + deltaY > deltaX ; + + if (!this._scrolling) { + this._onAnimationFrame(); + } + } + + if (!this._scrolling && this._swipeData) { + event.preventDefault(); + + this._swipeData.pointerPos = this._isY ? pointerY : pointerX; + } + + event.stopPropagation(); + }, + + _onAnimationFrame: function () { + var swipeData = this._swipeData; + + if (!swipeData || this._scrolling || this._touchMoveIsFirstTouchMove) { return; } + + var elRect = this._element.getBoundingClientRect(); + + var newPos; + + if (!this._isY) { + newPos = swipeData.pointerPos - swipeData.inUlX - elRect.left; + } else { + newPos = swipeData.pointerPos - swipeData.inUlY - elRect.top; + } + + this._ulEl.style[this._isY ? 'top' : 'left'] = newPos + 'px'; + + swipeData.lastUlPos = newPos; + + requestAnimationFrame(Ink.bindMethod(this, '_onAnimationFrame')); + }, + + _onTouchEnd: function (event) { + if (this._swipeData && this._swipeData.pointerPos && !this._scrolling && !this._touchMoveIsFirstTouchMove) { + var snapToNext = 0.1; // swipe 10% of the way to change page + var progress = - this._swipeData.lastUlPos; + + var curPage = this.getPage(); + var estimatedPage = progress / this._elLength / this._slidesPerPage; + + if (Math.round(estimatedPage) === curPage) { + var diff = estimatedPage - curPage; + if (Math.abs(diff) > snapToNext) { + diff = diff > 0 ? 1 : -1; + curPage += diff; + } + } else { + curPage = Math.round(estimatedPage); + } + + this.setPage(curPage); + + event.stopPropagation(); + // event.preventDefault(); + } + + setTransitionProperty(this._ulEl, null /* transition: left, top */); + this._swipeData = null; + this._touchMoveIsFirstTouchMove = undefined; + this._scrolling = undefined; + }, + + _onPaginationChange: function(pgn) { + this._setPage(pgn.getCurrent()); + }, + + /** + * Get the currently displayed page. + * @method getPage + **/ + getPage: function () { + if (this._pagination) { + return this._pagination.getCurrent(); + } else { + return this._currentPage; + } + }, + + /** + * Set the current page to `page` + * @method setPage + * @param page + * @param [wrap=false] Wrap over the first and last pages. (For example, going to the 5th page when there are only 4 pages goes to the 1st page) + **/ + setPage: function (page, wrap) { + if (wrap) { + // Pages outside the range [0..this._numPages] are wrapped. + page = page % this._numPages; + if (page < 0) { page = this._numPages - page; } + } + page = limitRange(page, 0, this._numPages - 1); + + if (this._pagination) { + this._pagination.setCurrent(page); + } else { + this._setPage(page); + } + }, + + _setPage: function (page) { + this._ulEl.style[ this._isY ? 'top' : 'left'] = + ['-', page * this._deltaLength, 'px'].join(''); + + if (this._options.onChange) { + this._options.onChange.call(this, page); + } + + this._currentPage = page; + + this._updateHider(); + }, + + /** + * Change to the next page + * @method nextPage + * @param {Boolean} [wrap=false] If true, going to the page after the last page takes you to the first page. + **/ + nextPage: function (wrap) { + this.setPage(this.getPage() + 1, wrap); + }, + + /** + * Change to the previous page + * @method previousPage + * @param {Boolean} [wrap=false] If true, going to the page after the last page takes you to the first page. + **/ + previousPage: function (wrap) { this.setPage(this.getPage() - 1, wrap); } + }; + + function setTransitionProperty(el, newTransition) { + el.style.transitionProperty = + el.style.oTransitionProperty = + el.style.msTransitionProperty = + el.style.mozTransitionProperty = + el.style.webkitTransitionProperty = newTransition; + } + + return Carousel; + +}); + +/** + * @module Ink.UI.Close_1 + * @author inkdev AT sapo.pt + */ +Ink.createModule('Ink.UI.Close', '1', ['Ink.Dom.Event_1','Ink.Dom.Element_1'], function(InkEvent, InkElement) { + 'use strict'; + + /** + * Subscribes clicks on the document.body. If and only if you clicked on an element + * having class "ink-close" or "ink-dismiss", will go up the DOM hierarchy looking for an element with any + * of the following classes: "ink-alert", "ink-alert-block". + * If it is found, it is removed from the DOM. + * + * One should call close once per page (full page refresh). + * + * @class Ink.UI.Close + * @constructor + * @example + * + */ + var Close = function() { + InkEvent.observe(document.body, 'click', function(ev) { + var el = InkEvent.element(ev); + + el = InkElement.findUpwardsByClass(el, 'ink-close') || + InkElement.findUpwardsByClass(el, 'ink-dismiss'); + + if (!el) { + return; // ink-close or ink-dismiss class not found + } + + var toRemove = el; + toRemove = InkElement.findUpwardsByClass(el, 'ink-alert') || + InkElement.findUpwardsByClass(el, 'ink-alert-block'); + + if (toRemove) { + InkEvent.stop(ev); + InkElement.remove(toRemove); + } + }); + }; + + return Close; + +}); + +/** + * @module Ink.UI.Common_1 + * @author inkdev AT sapo.pt + * @version 1 + */ +Ink.createModule('Ink.UI.Common', '1', ['Ink.Dom.Element_1', 'Ink.Net.Ajax_1','Ink.Dom.Css_1','Ink.Dom.Selector_1','Ink.Util.Url_1'], function(InkElement, Ajax,Css,Selector,Url) { + + 'use strict'; + + var instances = {}; + var lastIdNum = 0; + var nothing = {} /* a marker, for reference comparison. */; + + var keys = Object.keys || function (obj) { + var ret = []; + for (var k in obj) if (obj.hasOwnProperty(k)) { + ret.push(k); + } + return ret; + }; + + /** + * The Common class provides auxiliar methods to ease some of the most common/repetitive UI tasks. + * + * @class Ink.UI.Common + * @version 1 + * @static + */ + var Common = { + + /** + * Supported Ink Layouts + * + * @property Layouts + * @type Object + * @readOnly + */ + Layouts: { + SMALL: 'small', + MEDIUM: 'medium', + LARGE: 'large' + }, + + /** + * Method to check if an item is a valid DOM Element. + * + * @method isDOMElement + * @static + * @param {Mixed} o The object to be checked. + * @return {Boolean} True if it's a valid DOM Element. + * @example + * var el = Ink.s('#element'); + * if( Ink.UI.Common.isDOMElement( el ) === true ){ + * // It is a DOM Element. + * } else { + * // It is NOT a DOM Element. + * } + */ + isDOMElement: function(o) { + return o && typeof o === 'object' && 'nodeType' in o && o.nodeType === 1; + }, + + /** + * Method to check if an item is a valid integer. + * + * @method isInteger + * @static + * @param {Mixed} n The value to be checked. + * @return {Boolean} True if 'n' is a valid integer. + * @example + * var value = 1; + * if( Ink.UI.Common.isInteger( value ) === true ){ + * // It is an integer. + * } else { + * // It is NOT an integer. + * } + */ + isInteger: function(n) { + return (typeof n === 'number' && n % 1 === 0); + }, + + /** + * Method to get a DOM Element. The first parameter should be either a DOM Element or a valid CSS Selector. + * If not, then it will throw an exception. Otherwise, it returns a DOM Element. + * + * @method elOrSelector + * @static + * @param {DOMElement|String} elOrSelector DOM Element or CSS Selector + * @param {String} fieldName This field is used in the thrown Exception to identify the parameter. + * @return {DOMElement} Returns the DOMElement passed or the first result of the CSS Selector. Otherwise it throws an exception. + * @example + * // In case there are several .myInput, it will retrieve the first found + * var el = Ink.UI.Common.elOrSelector('.myInput','My Input'); + */ + elOrSelector: function(elOrSelector, fieldName) { + if (!this.isDOMElement(elOrSelector)) { + var t = Selector.select(elOrSelector); + if (t.length === 0) { throw new TypeError(fieldName + ' must either be a DOM Element or a selector expression!\nThe script element must also be after the DOM Element itself.'); } + return t[0]; + } + return elOrSelector; + }, + + /** + * Does the same as `elOrSelector` but returns an array of elements. + * + * see elOrSelector + * + * @method elsOrSelector + * + * @static + * + * @param ... (See elOrSelector's params) + * @param {Boolean} required If true, accept an empty array as output. + * @return {Array} The selected DOM Elements. + * @example + * var elements = Ink.UI.Common.elsOrSelector('input.my-inputs', 'My Input'); + */ + elsOrSelector: function(elsOrSelector, fieldName, required) { + var ret; + if (typeof elsOrSelector === 'string') { + ret = Selector.select(elsOrSelector); + } else if (Common.isDOMElement(elsOrSelector)) { + ret = [elsOrSelector]; + } else if (elsOrSelector && typeof elsOrSelector === 'object' && typeof elsOrSelector.length === 'number') { + ret = elsOrSelector; + } + + if (ret && ret.length) { + return ret; + } else { + if (required || arguments.length === 2) { + throw new TypeError(fieldName + ' must either be a DOM Element, an Array of elements, or a selector expression!\nThe script element must also be after the DOM Element itself.'); + } else { + return []; + } + } + }, + + /** + * Get options from an "options" object and the Element's data attributes. + * + * The element's data attributes take precedence. + * + * Values from the element's data-atrributes are coerced into the required type. + * + * Mainly for Ink UI.* modules + * + * @method options + * + * @param {Object} [fieldId=''] Tag used in thrown exceptions: ": ..." + * @param {Object} defaults Object with arrays of option defaults + * @param {Object} overrides Object containing options given from user through JavaScript + * @param {DOMElement} [element] Element with data-attributes + * + * @example + * + * this._options = Ink.UI.Common.options('MyComponent', { + * 'anobject': ['Object', null], // Defaults to null + * 'target': ['Element', null], + * 'stuff': ['Number', 0.1], + * 'stuff2': ['Integer', 0], + * 'doKickFlip': ['Boolean', false], + * 'targets': ['Elements'], // Required option since no default was given + * 'onClick': ['Function', null] + * }, options || {}, elm) + * + * @example + * + * ### Note about booleans + * + * Here is how options are read from the markup + * data-attributes, for several values`data-a-boolean`. + * + * Options considered true: + * + * - `data-a-boolean="true"` + * - (Every other value which is not on the list below.) + * + * Options considered false: + * + * - `data-a-boolean="false"` + * - `data-a-boolean=""` + * - `data-a-boolean` + * + * Options which go to default: + * + * - (no attribute). When `data-a-boolean` is ommitted, the + * option is not considered true nor false, and as such + * defaults to what is in the `defaults` argument. + * + **/ + options: function (fieldId, defaults, overrides, element) { + if (typeof fieldId !== 'string') { + element = overrides; + overrides = defaults; + defaults = fieldId; + fieldId = ''; + } + overrides = overrides || {}; + var out = {}; + var dataAttrs = element ? InkElement.data(element) : {}; + var fromDataAttrs; + var type; + var lType; + var defaultVal; + + var invalidStr = function (str) { + if (fieldId) { str = fieldId + ': "' + ('' + str).replace(/"/, '\\"') + '"'; } + return str; + }; + + var quote = function (str) { + return '"' + ('' + str).replace(/"/, '\\"') + '"'; + }; + + var invalidThrow = function (str) { + throw new Error(invalidStr(str)); + }; + + var invalid = function (str) { + Ink.error(invalidStr(str) + '. Ignoring option.'); + }; + + function optionValue(key) { + type = defaults[key][0]; + lType = type.toLowerCase(); + defaultVal = defaults[key].length === 2 ? defaults[key][1] : nothing; + + if (!type) { + invalidThrow('Ink.UI.Common.options: Always specify a type!'); + } + if (!(lType in Common._coerce_funcs)) { + invalidThrow('Ink.UI.Common.options: ' + defaults[key][0] + ' is not a valid type. Use one of ' + keys(Common._coerce_funcs).join(', ')); + + } + if (!defaults[key].length || defaults[key].length > 2) { + invalidThrow('the "defaults" argument must be an object mapping option names to [typestring, optional] arrays.'); + } + + if (key in dataAttrs) { + fromDataAttrs = Common._coerce_from_string(lType, dataAttrs[key], key, fieldId); + // (above can return `nothing`) + } else { + fromDataAttrs = nothing; + } + + if (fromDataAttrs !== nothing) { + if (!Common._options_validate(fromDataAttrs, lType)) { + invalid('(' + key + ' option) Invalid ' + lType + ' ' + quote(fromDataAttrs)); + return defaultVal; + } else { + return fromDataAttrs; + } + } else if (key in overrides) { + return overrides[key]; + } else if (defaultVal !== nothing) { + return defaultVal; + } else { + invalidThrow('Option ' + key + ' is required!'); + } + } + + for (var key in defaults) { + if (defaults.hasOwnProperty(key)) { + out[key] = optionValue(key); + } + } + + return out; + }, + + _coerce_from_string: function (type, val, paramName, fieldId) { + if (type in Common._coerce_funcs) { + return Common._coerce_funcs[type](val, paramName, fieldId); + } else { + return val; + } + }, + + _options_validate: function (val, type) { + if (type in Common._options_validate_types) { + return Common._options_validate_types[type].call(Common, val); + } else { + // 'object' options cannot be passed through data-attributes. + // Json you say? Not any good to embed in HTML. + return false; + } + }, + + _coerce_funcs: (function () { + var ret = { + element: function (val) { + return Common.elOrSelector(val, ''); + }, + elements: function (val) { + return Common.elsOrSelector(val, '', false /*not required, so don't throw an exception now*/); + }, + object: function (val) { return val; }, + number: function (val) { return parseFloat(val); }, + 'boolean': function (val) { + return !(val === 'false' || val === '' || val === null); + }, + string: function (val) { return val; }, + 'function': function (val, paramName, fieldId) { + Ink.error(fieldId + ': You cannot specify the option "' + paramName + '" through data-attributes because it\'s a function'); + return nothing; + } + }; + ret['float'] = ret.integer = ret.number; + return ret; + }()), + + _options_validate_types: (function () { + var types = { + string: function (val) { + return typeof val === 'string'; + }, + number: function (val) { + return typeof val === 'number' && !isNaN(val) && isFinite(val); + }, + integer: function (val) { + return val === Math.round(val); + }, + element: function (val) { + return Common.isDOMElement(val); + }, + elements: function (val) { + return val && typeof val === 'object' && typeof val.length === 'number' && val.length; + }, + 'boolean': function (val) { + return typeof val === 'boolean'; + } + }; + types['float'] = types.number; + return types; + }()), + + /** + * Method to make a deep copy (clone) of an object. + * Note: The object cannot have loops. + * + * @method clone + * @static + * @param {Object} o The object to be cloned/copied. + * @return {Object} Returns the result of the clone/copy. + * @example + * var originalObj = { + * key1: 'value1', + * key2: 'value2', + * key3: 'value3' + * }; + * var cloneObj = Ink.UI.Common.clone( originalObj ); + */ + clone: function(o) { + try { + return JSON.parse( JSON.stringify(o) ); + } catch (ex) { + throw new Error('Given object cannot have loops!'); + } + }, + + + /** + * Method to return the 'nth' position that an element occupies relatively to its parent. + * + * @method childIndex + * @static + * @param {DOMElement} childEl Valid DOM Element. + * @return {Number} Numerical position of an element relatively to its parent. + * @example + * + *
      + *
    • One
    • + *
    • Two
    • + *
    • Three
    • + *
    • Four
    • + *
    + * + * + */ + childIndex: function(childEl) { + if( Common.isDOMElement(childEl) ){ + var els = Selector.select('> *', childEl.parentNode); + for (var i = 0, f = els.length; i < f; ++i) { + if (els[i] === childEl) { + return i; + } + } + } + throw 'not found!'; + }, + + + /** + * This method provides a more convenient way to do an async AJAX request and expect a JSON response. + * It offers a callback option, as third paramenter, for a better async handling. + * + * @method ajaxJSON + * @static + * @async + * @param {String} endpoint Valid URL to be used as target by the request. + * @param {Object} params This field is used in the thrown Exception to identify the parameter. + * @example + * // In case there are several .myInput, it will retrieve the first found + * var el = Ink.UI.Common.elOrSelector('.myInput','My Input'); + */ + ajaxJSON: function(endpoint, params, cb) { + new Ajax( + endpoint, + { + evalJS: 'force', + method: 'POST', + parameters: params, + + onSuccess: function( r) { + try { + r = r.responseJSON; + if (r.status !== 'ok') { + throw 'server error: ' + r.message; + } + cb(null, r); + } catch (ex) { + cb(ex); + } + }, + + onFailure: function() { + cb('communication failure'); + } + } + ); + }, + + + /** + * Method to get the current Ink layout applied. + * + * @method currentLayout + * @static + * @return {String} 'small', 'medium' or 'large' + * @example + * var inkLayout = Ink.UI.Common.currentLayout(); + * if (inkLayout === 'small') { + * // ... + * } + */ + currentLayout: function() { + var i, f, k, v, el, detectorEl = Selector.select('#ink-layout-detector')[0]; + if (!detectorEl) { + detectorEl = document.createElement('div'); + detectorEl.id = 'ink-layout-detector'; + for (k in this.Layouts) { + if (this.Layouts.hasOwnProperty(k)) { + v = this.Layouts[k]; + el = document.createElement('div'); + el.className = 'show-' + v + ' hide-all'; + el.setAttribute('data-ink-layout', v); + detectorEl.appendChild(el); + } + } + document.body.appendChild(detectorEl); + } + + var result = ''; + var resultCount = 0; + for (i = 0, f = detectorEl.childNodes.length; i < f; ++i) { + el = detectorEl.childNodes[i]; + if (Css.getStyle(el, 'display') === 'block') { + result = el.getAttribute('data-ink-layout'); + resultCount += 1; + } + } + + if (resultCount === 1) { + return result; + } else { + return 'large'; + } + }, + + + /** + * Method to set the location's hash (window.location.hash). + * + * @method hashSet + * @static + * @param {Object} o Object with the info to be placed in the location's hash. + * @example + * // It will set the location's hash like: #key1=value1&key2=value2&key3=value3 + * Ink.UI.Common.hashSet({ + * key1: 'value1', + * key2: 'value2', + * key3: 'value3' + * }); + */ + hashSet: function(o) { + if (typeof o !== 'object') { throw new TypeError('o should be an object!'); } + var hashParams = Url.getAnchorString(); + hashParams = Ink.extendObj(hashParams, o); + window.location.hash = Url.genQueryString('', hashParams).substring(1); + }, + + /** + * Method to remove children nodes from a given object. + * This method was initially created to help solve a problem in Internet Explorer(s) that occurred when trying + * to set the innerHTML of some specific elements like 'table'. + * + * @method cleanChildren + * @static + * @param {DOMElement} parentEl Valid DOM Element + * @example + * + *
      + *
    • One
    • + *
    • Two
    • + *
    • Three
    • + *
    • Four
    • + *
    + * + * + * + * + *
      + */ + cleanChildren: function(parentEl) { + if( !Common.isDOMElement(parentEl) ){ + throw 'Please provide a valid DOMElement'; + } + var prevEl, el = parentEl.lastChild; + while (el) { + prevEl = el.previousSibling; + parentEl.removeChild(el); + el = prevEl; + } + }, + + /** + * This method stores the id and/or the classes of a given element in a given object. + * + * @method storeIdAndClasses + * @static + * @param {DOMElement} fromEl Valid DOM Element to get the id and classes from. + * @param {Object} inObj Object where the id and classes will be saved. + * @example + *
      + * + * + */ + storeIdAndClasses: function(fromEl, inObj) { + if( !Common.isDOMElement(fromEl) ){ + throw 'Please provide a valid DOMElement as first parameter'; + } + + var id = fromEl.id; + if (id) { + inObj._id = id; + } + + var classes = fromEl.className; + if (classes) { + inObj._classes = classes; + } + }, + + /** + * This method sets the id and className properties of a given DOM Element based on a given similar object + * resultant of the previous function 'storeIdAndClasses'. + * + * @method restoreIdAndClasses + * @static + * @param {DOMElement} toEl Valid DOM Element to set the id and classes on. + * @param {Object} inObj Object where the id and classes to be set are. + * @example + *
      + * + * + * + * + *
      + */ + restoreIdAndClasses: function(toEl, inObj) { + + if( !Common.isDOMElement(toEl) ){ + throw 'Please provide a valid DOMElement as first parameter'; + } + + if (inObj._id && toEl.id !== inObj._id) { + toEl.id = inObj._id; + } + + if (inObj._classes && toEl.className.indexOf(inObj._classes) === -1) { + if (toEl.className) { toEl.className += ' ' + inObj._classes; } + else { toEl.className = inObj._classes; } + } + + if (inObj._instanceId && !toEl.getAttribute('data-instance')) { + toEl.setAttribute('data-instance', inObj._instanceId); + } + }, + + /** + * This method saves a component's instance reference for later retrieval. + * + * @method registerInstance + * @static + * @param {Object} inst Object that holds the instance. + * @param {DOMElement} el DOM Element to associate with the object. + * @param {Object} [optionalPrefix] Defaults to 'instance' + */ + registerInstance: function(inst, el, optionalPrefix) { + if (inst._instanceId) { return; } + + if (typeof inst !== 'object') { throw new TypeError('1st argument must be a JavaScript object!'); } + + if (inst._options && inst._options.skipRegister) { return; } + + if (!this.isDOMElement(el)) { throw new TypeError('2nd argument must be a DOM element!'); } + if (optionalPrefix !== undefined && typeof optionalPrefix !== 'string') { throw new TypeError('3rd argument must be a string!'); } + var id = (optionalPrefix || 'instance') + (++lastIdNum); + instances[id] = inst; + inst._instanceId = id; + var dataInst = el.getAttribute('data-instance'); + dataInst = (dataInst !== null) ? [dataInst, id].join(' ') : id; + el.setAttribute('data-instance', dataInst); + }, + + /** + * This method deletes/destroy an instance with a given id. + * + * @method unregisterInstance + * @static + * @param {String} id Id of the instance to be destroyed. + */ + unregisterInstance: function(id) { + delete instances[id]; + }, + + /** + * This method retrieves the registered instance(s) of a given element or instance id. + * + * @method getInstance + * @static + * @param {String|DOMElement} instanceIdOrElement Instance's id or DOM Element from which we want the instances. + * @return {Object|Object[]} Returns an instance or a collection of instances. + */ + getInstance: function(instanceIdOrElement) { + var ids; + if (this.isDOMElement(instanceIdOrElement)) { + ids = instanceIdOrElement.getAttribute('data-instance'); + if (ids === null) { throw new Error('argument is not a DOM instance element!'); } + } + else { + ids = instanceIdOrElement; + } + + ids = ids.split(' '); + var inst, id, i, l = ids.length; + + var res = []; + for (i = 0; i < l; ++i) { + id = ids[i]; + if (!id) { throw new Error('Element is not a JS instance!'); } + inst = instances[id]; + if (!inst) { throw new Error('Instance "' + id + '" not found!'); } + res.push(inst); + } + + return (l === 1) ? res[0] : res; + }, + + /** + * This method retrieves the registered instance(s) of an element based on the given selector. + * + * @method getInstanceFromSelector + * @static + * @param {String} selector CSS selector to define the element from which it'll get the instance(s). + * @return {Object|Object[]} Returns an instance or a collection of instances. + */ + getInstanceFromSelector: function(selector) { + var el = Selector.select(selector)[0]; + if (!el) { throw new Error('Element not found!'); } + return this.getInstance(el); + }, + + /** + * This method retrieves the registered instances' ids of all instances. + * + * @method getInstanceIds + * @static + * @return {String[]} Id or collection of ids of all existing instances. + */ + getInstanceIds: function() { + var res = []; + for (var id in instances) { + if (instances.hasOwnProperty(id)) { + res.push( id ); + } + } + return res; + }, + + /** + * This method retrieves all existing instances. + * + * @method getInstances + * @static + * @return {Object[]} Collection of existing instances. + */ + getInstances: function() { + var res = []; + for (var id in instances) { + if (instances.hasOwnProperty(id)) { + res.push( instances[id] ); + } + } + return res; + }, + + /** + * This method is not to supposed to be invoked by the Common component. + * Components should copy this method as its destroy method. + * + * @method destroyComponent + * @static + */ + destroyComponent: function() { + Common.unregisterInstance(this._instanceId); + this._element.parentNode.removeChild(this._element); + } + + }; + + return Common; + +}); + +/** + * @module Ink.UI.DatePicker_1 + * @author inkdev AT sapo.pt + * @version 1 + */ +Ink.createModule('Ink.UI.DatePicker', '1', ['Ink.UI.Common_1','Ink.Dom.Event_1','Ink.Dom.Css_1','Ink.Dom.Element_1','Ink.Dom.Selector_1','Ink.Util.Array_1','Ink.Util.Date_1', 'Ink.Dom.Browser_1'], function(Common, Event, Css, InkElement, Selector, InkArray, InkDate ) { + 'use strict'; + + // Repeat a string. Long version of (new Array(n)).join(str); + function strRepeat(n, str) { + var ret = ''; + for (var i = 0; i < n; i++) { + ret += str; + } + return ret; + } + + // Clamp a number into a min/max limit + function clamp(n, min, max) { + if (n > max) { n = max; } + if (n < min) { n = min; } + + return n; + } + + function dateishFromYMDString(YMD) { + var split = YMD.split('-'); + return dateishFromYMD(+split[0], +split[1] - 1, +split[2]); + } + + function dateishFromYMD(year, month, day) { + return {_year: year, _month: month, _day: day}; + } + + function dateishFromDate(date) { + return {_year: date.getFullYear(), _month: date.getMonth(), _day: date.getDate()}; + } + + /** + * @class Ink.UI.DatePicker + * @constructor + * @version 1 + * + * @param {String|DOMElement} selector + * @param {Object} [options] Options + * @param {Boolean} [options.autoOpen=false] set to `true` to automatically open the datepicker. + * @param {String} [options.cleanText] text to display on clean button. defaults to 'Limpar' + * @param {String} [options.closeText] text to display on close button. defaults to 'Fechar' + * @param {String} [options.cssClass] CSS class to be applied to the datepicker + * @param {String} [options.dateRange] enforce limits to year, month and day for the Date, ex: '1990-08-25:2020-11' + * @param {Boolean} [options.displayInSelect] whether to display the component in a select. defaults to false. + * @param {String|DOMElement} [options.dayField] (if using options.displayInSelect) `` field with months. + * @param {String|DOMElement} [options.yearField] (if using options.displayInSelect) ` + * + */ + var DatePicker = function(selector, options) { + this._element = selector && + Common.elOrSelector(selector, '[Ink.UI.DatePicker_1]: selector argument'); + + this._options = Common.options('Ink.UI.DatePicker_1', { + autoOpen: ['Boolean', false], + cleanText: ['String', 'Clear'], + closeText: ['String', 'Close'], + containerElement:['Element', null], + cssClass: ['String', 'ink-calendar bottom'], + dateRange: ['String', null], + + // use this in a must be a direct child of .control, and if not, remove this block. + this._wrapper = this._element.parentNode; + this._wrapperIsControl = true; + } else { + this._wrapper = InkElement.create('div', { className: 'ink-datepicker-wrapper' }); + InkElement.wrap(this._element, this._wrapper); + } + InkElement.insertAfter(this._containerObject, this._element); + }, + + /** + * Render the topmost bar with the "close" and "clear" buttons. + */ + _renderSuperTopBar: function () { + if((!this._options.showClose) || (!this._options.showClean)){ return; } + + this._superTopBar = document.createElement("div"); + this._superTopBar.className = 'ink-calendar-top-options'; + if(this._options.showClean){ + this._superTopBar.appendChild(InkElement.create('a', { + className: 'clean', + setHTML: this._options.cleanText + })); + } + if(this._options.showClose){ + this._superTopBar.appendChild(InkElement.create('a', { + className: 'close', + setHTML: this._options.closeText + })); + } + this._containerObject.appendChild(this._superTopBar); + }, + + _listenToContainerObjectEvents: function () { + Event.observe(this._containerObject,'mouseover',Ink.bindEvent(function(e){ + Event.stop( e ); + this._hoverPicker = true; + },this)); + + Event.observe(this._containerObject,'mouseout',Ink.bindEvent(function(e){ + Event.stop( e ); + this._hoverPicker = false; + },this)); + + Event.observe(this._containerObject,'click',Ink.bindEvent(this._onClick, this)); + }, + + _onClick: function(e){ + var elem = Event.element(e); + + if (Css.hasClassName(elem, 'ink-calendar-off')) { + Event.stopDefault(e); + return null; + } + + Event.stop(e); + + // Relative changers + this._onRelativeChangerClick(elem); + + // Absolute changers + this._onAbsoluteChangerClick(elem); + + // Mode changers + if (Css.hasClassName(elem, 'ink-calendar-link-month')) { + this._showMonthSelector(); + } else if (Css.hasClassName(elem, 'ink-calendar-link-year')) { + this._showYearSelector(); + } else if(Css.hasClassName(elem, 'clean')){ + this._clean(); + } else if(Css.hasClassName(elem, 'close')){ + this._hide(false); + } + + this._updateDescription(); + }, + + /** + * Handle click events on a changer (« ») for next/prev year/month + * @method _onChangerClick + * @private + **/ + _onRelativeChangerClick: function (elem) { + var changeYear = { + change_year_next: 1, + change_year_prev: -1 + }; + var changeMonth = { + change_month_next: 1, + change_month_prev: -1 + }; + + if( elem.className in changeMonth ) { + this._updateCal(changeMonth[elem.className]); + } else if( elem.className in changeYear ) { + this._showYearSelector(changeYear[elem.className]); + } + }, + + /** + * Handle click events on an atom-changer (day button, month button, year button) + * + * @method _onAbsoluteChangerClick + * @private + */ + _onAbsoluteChangerClick: function (elem) { + var elemData = InkElement.data(elem); + + if( Number(elemData.calDay) ){ + this.setDate( [this._year, this._month + 1, elemData.calDay].join('-') ); + this._hide(); + } else if( Number(elemData.calMonth) ) { + this._month = Number(elemData.calMonth) - 1; + this._showDefaultView(); + this._updateCal(); + } else if( Number(elemData.calYear) ){ + this._changeYear(Number(elemData.calYear)); + } + }, + + _changeYear: function (year) { + year = +year; + if(year){ + this._year = year; + if( typeof this._options.onYearSelected === 'function' ){ + this._options.onYearSelected(this, { + 'year': this._year + }); + } + this._showMonthSelector(); + } + }, + + _clean: function () { + if(this._options.displayInSelect){ + this._options.yearField.selectedIndex = 0; + this._options.monthField.selectedIndex = 0; + this._options.dayField.selectedIndex = 0; + } else { + this._element.value = ''; + } + }, + + /** + * Hides the DatePicker. If the component is shy (options.shy), behaves differently. + * + * @method _hide + * @param [blur=true] Set to false to indicate this is not just a blur and force hiding even if the component is shy. + */ + _hide: function(blur) { + blur = blur === undefined ? true : blur; + if (blur === false || (blur && this._options.shy)) { + Css.addClassName(this._containerObject, 'hide-all'); + } + }, + + /** + * Sets the range of dates allowed to be selected in the Date Picker + * + * @method _setMinMax + * @param {String} dateRange Two dates separated by a ':'. Example: 2013-01-01:2013-12-12 + * @private + */ + _setMinMax: function( dateRange ) { + var self = this; + + var noMinLimit = { + _year: -Number.MAX_VALUE, + _month: 0, + _day: 1 + }; + + var noMaxLimit = { + _year: Number.MAX_VALUE, + _month: 11, + _day: 31 + }; + + function noLimits() { + self._min = noMinLimit; + self._max = noMaxLimit; + } + + if (!dateRange) { return noLimits(); } + + var dates = dateRange.split( ':' ); + var rDate = /^(\d{4})((\-)(\d{1,2})((\-)(\d{1,2}))?)?$/; + + InkArray.each([ + {name: '_min', date: dates[0], noLim: noMinLimit}, + {name: '_max', date: dates[1], noLim: noMaxLimit} + ], Ink.bind(function (data) { + + var lim = data.noLim; + + if ( data.date.toUpperCase() === 'NOW' ) { + var now = new Date(); + lim = dateishFromDate(now); + } else if (data.date.toUpperCase() === 'EVER') { + lim = data.noLim; + } else if ( rDate.test( data.date ) ) { + lim = dateishFromYMDString(data.date); + + lim._month = clamp(lim._month, 0, 11); + lim._day = clamp(lim._day, 1, this._daysInMonth( lim._year, lim._month )); + } + + this[data.name] = lim; + }, this)); + + // Should be equal, or min should be smaller + var valid = this._dateCmp(this._max, this._min) !== -1; + + if (!valid) { + noLimits(); + } + }, + + /** + * Checks if a date is between the valid range. + * Starts by checking if the date passed is valid. If not, will fallback to the 'today' date. + * Then checks if the all params are inside of the date range specified. If not, it will fallback to the nearest valid date (either Min or Max). + * + * @method _fitDateToRange + * @param {Number} year Year with 4 digits (yyyy) + * @param {Number} month Month + * @param {Number} day Day + * @return {Array} Array with the final processed date. + * @private + */ + _fitDateToRange: function( date ) { + if ( !this._isValidDate( date ) ) { + date = dateishFromDate(new Date()); + } + + if (this._dateCmp(date, this._min) === -1) { + return Ink.extendObj({}, this._min); + } else if (this._dateCmp(date, this._max) === 1) { + return Ink.extendObj({}, this._max); + } + + return Ink.extendObj({}, date); // date is okay already, just copy it. + }, + + /** + * Checks whether a date is within the valid date range + * @method _dateWithinRange + * @param year + * @param month + * @param day + * @return {Boolean} + * @private + */ + _dateWithinRange: function (date) { + if (!arguments.length) { + date = this; + } + + return (!this._dateAboveMax(date) && + (!this._dateBelowMin(date))); + }, + + _dateAboveMax: function (date) { + return this._dateCmp(date, this._max) === 1; + }, + + _dateBelowMin: function (date) { + return this._dateCmp(date, this._min) === -1; + }, + + _dateCmp: function (self, oth) { + return this._dateCmpUntil(self, oth, '_day'); + }, + + /** + * _dateCmp with varied precision. You can compare down to the day field, or, just to the month. + * // the following two dates are considered equal because we asked + * // _dateCmpUntil to just check up to the years. + * + * _dateCmpUntil({_year: 2000, _month: 10}, {_year: 2000, _month: 11}, '_year') === 0 + */ + _dateCmpUntil: function (self, oth, depth) { + var props = ['_year', '_month', '_day']; + var i = -1; + + do { + i++; + if (self[props[i]] > oth[props[i]]) { return 1; } + else if (self[props[i]] < oth[props[i]]) { return -1; } + } while (props[i] !== depth && + self[props[i + 1]] !== undefined && oth[props[i + 1]] !== undefined); + + return 0; + }, + + /** + * Sets the markup in the default view mode (showing the days). + * Also disables the previous and next buttons in case they don't meet the range requirements. + * + * @method _showDefaultView + * @private + */ + _showDefaultView: function(){ + this._yearSelector.style.display = 'none'; + this._monthSelector.style.display = 'none'; + this._monthPrev.childNodes[0].className = 'change_month_prev'; + this._monthNext.childNodes[0].className = 'change_month_next'; + + if ( !this._getPrevMonth() ) { + this._monthPrev.childNodes[0].className = 'action_inactive'; + } + + if ( !this._getNextMonth() ) { + this._monthNext.childNodes[0].className = 'action_inactive'; + } + + this._monthContainer.style.display = 'block'; + }, + + /** + * Updates the date shown on the datepicker + * + * @method _updateDate + * @private + */ + _updateDate: function(){ + var dataParsed; + if(!this._options.displayInSelect && this._element.value){ + dataParsed = this._parseDate(this._element.value); + } else if (this._options.displayInSelect) { + dataParsed = { + _year: this._options.yearField[this._options.yearField.selectedIndex].value, + _month: this._options.monthField[this._options.monthField.selectedIndex].value - 1, + _day: this._options.dayField[this._options.dayField.selectedIndex].value + }; + } + + if (dataParsed) { + dataParsed = this._fitDateToRange(dataParsed); + this._year = dataParsed._year; + this._month = dataParsed._month; + this._day = dataParsed._day; + } + this.setDate(); + this._updateDescription(); + this._renderMonth(); + }, + + /** + * Updates the date description shown at the top of the datepicker + * + * EG "12 de November" + * + * @method _updateDescription + * @private + */ + _updateDescription: function(){ + this._monthChanger.innerHTML = this._options.month[ this._month + 1 ]; + this._ofText.innerHTML = this._options.ofText; + this._yearChanger.innerHTML = this._year; + }, + + /** + * Renders the year selector view of the datepicker + * + * @method _showYearSelector + * @private + */ + _showYearSelector: function(inc){ + this._incrementViewingYear(inc); + + var firstYear = this._year - (this._year % 10); + var thisYear = firstYear - 1; + var str = "
      • "; + + if (thisYear > this._min._year) { + str += '
      • ' + this._options.prevLinkText + '
      • '; + } else { + str += '
      •  
      • '; + } + + for (var i=1; i < 11; i++){ + if (i % 4 === 0){ + str+='
        '; + } + + thisYear = firstYear + i - 1; + + str += this._getYearButtonHtml(thisYear); + } + + if( thisYear < this._max._year){ + str += '
      • ' + this._options.nextLinkText + '
      • '; + } else { + str += '
      •  
      • '; + } + + str += "
    • "; + + this._yearSelector.innerHTML = str; + this._monthPrev.childNodes[0].className = 'action_inactive'; + this._monthNext.childNodes[0].className = 'action_inactive'; + this._monthSelector.style.display = 'none'; + this._monthContainer.style.display = 'none'; + this._yearSelector.style.display = 'block'; + }, + + /** + * For the year selector. + * + * Update this._year, to find the next decade or use nextValidDateFn to find it. + */ + _incrementViewingYear: function (inc) { + if (!inc) { return; } + + var year = +this._year + inc*10; + year = year - year % 10; + if ( year > this._max._year || year + 9 < this._min._year){ + return; + } + this._year = +this._year + inc*10; + }, + + _getYearButtonHtml: function (thisYear) { + if ( this._acceptableYear({_year: thisYear}) ){ + var className = (thisYear === this._year) ? ' class="ink-calendar-on"' : ''; + return '
    • ' + thisYear +'
    • '; + } else { + return '
    • ' + thisYear +'
    • '; + + } + }, + + /** + * Show the month selector (happens when you click a year, or the "month" link. + * @method _showMonthSelector + * @private + */ + _showMonthSelector: function () { + this._yearSelector.style.display = 'none'; + this._monthContainer.style.display = 'none'; + this._monthPrev.childNodes[0].className = 'action_inactive'; + this._monthNext.childNodes[0].className = 'action_inactive'; + this._addMonthClassNames(); + this._monthSelector.style.display = 'block'; + }, + + /** + * This function returns the given date in the dateish format + * + * @method _parseDate + * @param {String} dateStr A date on a string. + * @private + */ + _parseDate: function(dateStr){ + var date = InkDate.set( this._options.format , dateStr ); + if (date) { + return dateishFromDate(date); + } + return null; + }, + + /** + * Checks if a date is valid + * + * @method _isValidDate + * @param {Dateish} date + * @private + * @return {Boolean} True if the date is valid, false otherwise + */ + _isValidDate: function(date){ + var yearRegExp = /^\d{4}$/; + var validOneOrTwo = /^\d{1,2}$/; + return ( + yearRegExp.test(date._year) && + validOneOrTwo.test(date._month) && + validOneOrTwo.test(date._day) && + +date._month + 1 >= 1 && + +date._month + 1 <= 12 && + +date._day >= 1 && + +date._day <= this._daysInMonth(date._year, date._month + 1) + ); + }, + + /** + * Checks if a given date is an valid format. + * + * @method _isDate + * @param {String} format A date format. + * @param {String} dateStr A date on a string. + * @private + * @return {Boolean} True if the given date is valid according to the given format + */ + _isDate: function(format, dateStr){ + try { + if (typeof format === 'undefined'){ + return false; + } + var date = InkDate.set( format , dateStr ); + if( date && this._isValidDate( dateishFromDate(date) )) { + return true; + } + } catch (ex) {} + + return false; + }, + + _acceptableDay: function (date) { + return this._acceptableDateComponent(date, 'validDayFn'); + }, + + _acceptableMonth: function (date) { + return this._acceptableDateComponent(date, 'validMonthFn'); + }, + + _acceptableYear: function (date) { + return this._acceptableDateComponent(date, 'validYearFn'); + }, + + /** DRY base for the above 2 functions */ + _acceptableDateComponent: function (date, userCb) { + if (this._options[userCb]) { + return this._callUserCallbackBool(this._options[userCb], date); + } else { + return this._dateWithinRange(date); + } + }, + + /** + * This method returns the date written with the format specified on the options + * + * @method _writeDateInFormat + * @private + * @return {String} Returns the current date of the object in the specified format + */ + _writeDateInFormat:function(){ + return InkDate.get( this._options.format , this.getDate()); + }, + + /** + * This method allows the user to set the DatePicker's date on run-time. + * + * @method setDate + * @param {String} dateString A date string in yyyy-mm-dd format. + * @public + */ + setDate: function( dateString ) { + if ( /\d{4}-\d{1,2}-\d{1,2}/.test( dateString ) ) { + var auxDate = dateString.split( '-' ); + this._year = +auxDate[ 0 ]; + this._month = +auxDate[ 1 ] - 1; + this._day = +auxDate[ 2 ]; + } + + this._setDate( ); + }, + + /** + * Get the current date as a JavaScript date. + * + * @method getDate + */ + getDate: function () { + if (!this._day) { + throw 'Ink.UI.DatePicker: Still picking a date. Cannot getDate now!'; + } + return new Date(this._year, this._month, this._day); + }, + + /** + * Sets the chosen date on the target input field + * + * @method _setDate + * @param {DOMElement} objClicked Clicked object inside the DatePicker's calendar. + * @private + */ + _setDate : function( objClicked ) { + if (objClicked) { + var data = InkElement.data(objClicked); + this._day = (+data.calDay) || this._day; + } + + var dt = this._fitDateToRange(this); + + this._year = dt._year; + this._month = dt._month; + this._day = dt._day; + + if(!this._options.displayInSelect){ + this._element.value = this._writeDateInFormat(); + } else { + this._options.dayField.value = this._day; + this._options.monthField.value = this._month + 1; + this._options.yearField.value = this._year; + } + + if(this._options.onSetDate) { + this._options.onSetDate( this , { date : this.getDate() } ); + } + }, + + /** + * Makes the necessary work to update the calendar + * when choosing a different month + * + * @method _updateCal + * @param {Number} inc Indicates previous or next month + * @private + */ + _updateCal: function(inc){ + if( typeof this._options.onMonthSelected === 'function' ){ + this._options.onMonthSelected(this, { + 'year': this._year, + 'month' : this._month + }); + } + if (inc && this._updateMonth(inc) === null) { + return; + } + this._renderMonth(); + }, + + /** + * Function that returns the number of days on a given month on a given year + * + * @method _daysInMonth + * @param {Number} _y - year + * @param {Number} _m - month + * @private + * @return {Number} The number of days on a given month on a given year + */ + _daysInMonth: function(_y,_m){ + var exceptions = { + 2: ((_y % 400 === 0) || (_y % 4 === 0 && _y % 100 !== 0)) ? 29 : 28, + 4: 30, + 6: 30, + 9: 30, + 11: 30 + }; + + return exceptions[_m] || 31; + }, + + + /** + * Updates the calendar when a different month is chosen + * + * @method _updateMonth + * @param {Number} incValue - indicates previous or next month + * @private + */ + _updateMonth: function(incValue){ + var date; + if (incValue > 0) { + date = this._getNextMonth(); + } else if (incValue < 0) { + date = this._getPrevMonth(); + } + if (!date) { return null; } + this._year = date._year; + this._month = date._month; + this._day = date._day; + }, + + /** + * Get the next month we can show. + */ + _getNextMonth: function (date) { + return this._tryLeap( date, 'Month', 'next', function (d) { + d._month += 1; + if (d._month > 11) { + d._month = 0; + d._year += 1; + } + return d; + }); + }, + + /** + * Get the previous month we can show. + */ + _getPrevMonth: function (date) { + return this._tryLeap( date, 'Month', 'prev', function (d) { + d._month -= 1; + if (d._month < 0) { + d._month = 11; + d._year -= 1; + } + return d; + }); + }, + + /** + * Get the next year we can show. + */ + _getPrevYear: function (date) { + return this._tryLeap( date, 'Year', 'prev', function (d) { + d._year -= 1; + return d; + }); + }, + + /** + * Get the next year we can show. + */ + _getNextYear: function (date) { + return this._tryLeap( date, 'Year', 'next', function (d) { + d._year += 1; + return d; + }); + }, + + /** + * DRY base for a function which tries to get the next or previous valid year or month. + * + * It checks if we can go forward by using _dateCmp with atomic + * precision (this means, {_year} for leaping years, and + * {_year, month} for leaping months), then it tries to get the + * result from the user-supplied callback (nextDateFn or prevDateFn), + * and when this is not present, advance the date forward using the + * `advancer` callback. + */ + _tryLeap: function (date, atomName, directionName, advancer) { + date = date || { _year: this._year, _month: this._month, _day: this._day }; + + var maxOrMin = directionName === 'prev' ? '_min' : '_max'; + var boundary = this[maxOrMin]; + + // Check if we're by the boundary of min/max year/month + if (this._dateCmpUntil(date, boundary, atomName) === 0) { + return null; // We're already at the boundary. Bail. + } + + var leapUserCb = this._options[directionName + 'ValidDateFn']; + if (leapUserCb) { + return this._callUserCallbackDate(leapUserCb, date); + } else { + date = advancer(date); + } + + date = this._fitDateToRange(date); + + return this['_acceptable' + atomName](date) ? date : null; + }, + + _getNextDecade: function (date) { + date = date || { _year: this._year, _month: this._month, _day: this._day }; + var decade = this._getCurrentDecade(date); + if (decade + 10 > this._max._year) { return null; } + return decade + 10; + }, + + _getPrevDecade: function (date) { + date = date || { _year: this._year, _month: this._month, _day: this._day }; + var decade = this._getCurrentDecade(date); + if (decade - 10 < this._min._year) { return null; } + return decade - 10; + }, + + /** Returns the decade given a date or year*/ + _getCurrentDecade: function (year) { + year = year ? (year._year || year) : this._year; + return Math.floor(year / 10) * 10; // Round to first place + }, + + _callUserCallbackBase: function (cb, date) { + return cb.call(this, date._year, date._month + 1, date._day); + }, + + _callUserCallbackBool: function (cb, date) { + return !!this._callUserCallbackBase(cb, date); + }, + + _callUserCallbackDate: function (cb, date) { + var ret = this._callUserCallbackBase(cb, date); + return ret ? dateishFromDate(ret) : null; + }, + + /** + * Key-value object that (for a given key) points to the correct parsing format for the DatePicker + * @property _dateParsers + * @type {Object} + * @readOnly + */ + _dateParsers: { + 'yyyy-mm-dd' : 'Y-m-d' , + 'yyyy/mm/dd' : 'Y/m/d' , + 'yy-mm-dd' : 'y-m-d' , + 'yy/mm/dd' : 'y/m/d' , + 'dd-mm-yyyy' : 'd-m-Y' , + 'dd/mm/yyyy' : 'd/m/Y' , + 'dd-mm-yy' : 'd-m-y' , + 'dd/mm/yy' : 'd/m/y' , + 'mm/dd/yyyy' : 'm/d/Y' , + 'mm-dd-yyyy' : 'm-d-Y' + }, + + /** + * Renders the current month + * + * @method _renderMonth + * @private + */ + _renderMonth: function(){ + var month = this._month; + var year = this._year; + + // Week day of the first day in the month + var wDayFirst = (new Date( year , month , 1 )).getDay(); + + var startWeekDay = this._options.startWeekDay || 0; + + this._showDefaultView(); + + if(startWeekDay > wDayFirst) { + wDayFirst = 7 + startWeekDay - wDayFirst; + } else { + wDayFirst += startWeekDay; + } + + var html = ''; + + html += this._getMonthCalendarHeaderHtml(startWeekDay); + + var counter = 0; + html+='
        '; + + var emptyHtml = '
      •  
      • '; + + // Add padding if the first day of the month is not monday. + if(wDayFirst !== 0) { + var empties = wDayFirst - startWeekDay - 1; + counter += empties; + html += strRepeat(empties, emptyHtml); + } + + html += this._getDayButtonsHtml(counter, year, month); + + html += '
      '; + + this._monthContainer.innerHTML = html; + }, + + _getDayButtonsHtml: function (counter, year, month) { + var daysInMonth = this._daysInMonth(year, month); + var ret = ''; + for (var day = 1; day <= daysInMonth; day++) { + if (counter === 7){ // new week + counter=0; + ret += '
        '; + } + + ret += this._getDayButtonHtml(year, month, day); + + counter++; + if(counter === 7){ + ret += '
      '; + } + } + return ret; + }, + + /** + * Get the HTML markup for a single day in month view, given year, month, day. + * + * @method _getDayButtonHtml + * @private + */ + _getDayButtonHtml: function (year, month, day) { + var attrs = ' '; + var date = dateishFromYMD(year, month, day); + if (!this._acceptableDay(date)) { + attrs += 'class="ink-calendar-off"'; + } else { + attrs += 'data-cal-day="' + day + '"'; + } + + if (this._day && this._dateCmp(date, this) === 0) { + attrs += 'class="ink-calendar-on" data-cal-day="' + day + '"'; + } + + return '
    • ' + day + '
    • '; + }, + + /** Write the top bar of the calendar (M T W T F S S) */ + _getMonthCalendarHeaderHtml: function (startWeekDay) { + var ret = '
        '; + var wDay; + for(var i=0; i<7; i++){ + wDay = (startWeekDay + i) % 7; + ret += '
      • ' + + this._options.wDay[wDay].substring(0,1) + + '
      • '; + } + return ret + '
      '; + }, + + /** + * This method adds class names to month buttons, to visually distinguish. + * + * @method _addMonthClassNames + * @param {DOMElement} parent DOMElement where all the months are. + * @private + */ + _addMonthClassNames: function(parent){ + InkArray.forEach( + (parent || this._monthSelector).getElementsByTagName('a'), + Ink.bindMethod(this, '_addMonthButtonClassNames')); + }, + + /** + * Add the ink-calendar-on className if the given button is the current month, + * otherwise add the ink-calendar-off className if the given button refers to + * an unacceptable month (given dateRange and validMonthFn) + */ + _addMonthButtonClassNames: function (btn) { + var data = InkElement.data(btn); + if (!data.calMonth) { throw 'not a calendar month button!'; } + + var month = +data.calMonth - 1; + + if ( month === this._month ) { + Css.addClassName( btn, 'ink-calendar-on' ); // This month + Css.removeClassName( btn, 'ink-calendar-off' ); + } else { + Css.removeClassName( btn, 'ink-calendar-on' ); // Not this month + + var toDisable = !this._acceptableMonth({_year: this._year, _month: month}); + Css.addRemoveClassName( btn, 'ink-calendar-off', toDisable); + } + }, + + /** + * Prototype's method to allow the 'i18n files' to change all objects' language at once. + * @param {Object} options Object with the texts' configuration. + * @param {String} closeText Text of the close anchor + * @param {String} cleanText Text of the clean text anchor + * @param {String} prevLinkText "Previous" link's text + * @param {String} nextLinkText "Next" link's text + * @param {String} ofText The text "of", present in 'May of 2013' + * @param {Object} month An object with keys from 1 to 12 that have the full months' names + * @param {Object} wDay An object with keys from 0 to 6 that have the full weekdays' names + * @public + */ + lang: function( options ){ + this._lang = options; + }, + + /** + * This calls the rendering of the selected month. (Deprecated: use show() instead) + * + * @method showMonth + * @public + */ + showMonth: function(){ + this._renderMonth(); + }, + + /** + * Returns true if the calendar sceen is in 'select day' mode + * + * @return {Boolean} True if the calendar sceen is in 'select day' mode + * @public + */ + isMonthRendered: function(){ + var header = Selector.select('.ink-calendar-header', this._containerObject)[0]; + + return ((Css.getStyle(header.parentNode,'display') !== 'none') && + (Css.getStyle(header.parentNode.parentNode,'display') !== 'none') ); + }, + + /** + * Destroys this datepicker, removing it from the page. + * + * @public + **/ + destroy: function () { + InkElement.unwrap(this._element); + InkElement.remove(this._wrapper); + InkElement.remove(this._containerObject); + Common.unregisterInstance.call(this); + } + }; + + return DatePicker; +}); + +/* + * @module Ink.UI.Draggable_1 + * @author inkdev AT sapo.pt + * @version 1 + */ +Ink.createModule("Ink.UI.Draggable","1",["Ink.Dom.Element_1", "Ink.Dom.Event_1", "Ink.Dom.Css_1", "Ink.Dom.Browser_1", "Ink.Dom.Selector_1", "Ink.UI.Common_1"],function( InkElement, InkEvent, Css, Browser, Selector, Common) { + 'use strict'; + + var x = 0, + y = 1; // For accessing coords in [x, y] arrays + + // Get a value between two boundaries + function between (val, min, max) { + val = Math.min(val, max); + val = Math.max(val, min); + return val; + } + + /** + * @class Ink.UI.Draggable + * @version 1 + * @constructor + * @param {String|DOMElement} target Target element. + * @param {Object} [options] Optional object for configuring the component + * @param {String} [options.constraint] Movement constraint. None by default. Can be `vertical`, `horizontal`, or `both`. + * @param {String|DomElement} [options.constraintElm] Constrain dragging to be within this element. None by default. + * @param {Number} [options.top,left,right,bottom] Limits for constraining draggable movement. + * @param {String|DOMElement} [options.handle] if specified, this element will be used as a handle for dragging. + * @param {Boolean} [options.revert] if true, reverts the draggable to the original position when dragging stops + * @param {String} [options.cursor] cursor type (CSS `cursor` value) used when the mouse is over the draggable object + * @param {Number} [options.zIndex] zindex applied to the draggable element while dragged + * @param {Number} [options.fps] if defined, on drag will run every n frames per second only + * @param {DomElement} [options.droppableProxy] if set, a shallow copy of the droppableProxy will be put on document.body with transparent bg + * @param {String} [options.mouseAnchor] defaults to mouse cursor. can be 'left|center|right top|center|bottom' + * @param {String} [options.dragClass='drag'] class to add when the draggable is being dragged. + * @param {Function} [options.onStart] callback called when dragging starts + * @param {Function} [options.onEnd] callback called when dragging stops + * @param {Function} [options.onDrag] callback called while dragging, prior to position updates + * @param {Function} [options.onChange] callback called while dragging, after position updates + * @example + * Ink.requireModules( ['Ink.UI.Draggable_1'], function( Draggable ){ + * new Draggable( '#myElementId' ); + * }); + */ + var Draggable = function(element, options) { + this.init(element, options); + }; + + Draggable.prototype = { + + /** + * Init function called by the constructor + * + * @method _init + * @param {String|DOMElement} element ID of the element or DOM Element. + * @param {Object} [options] Options object for configuration of the module. + * @private + */ + init: function(element, options) { + var o = Ink.extendObj( { + constraint: false, + constraintElm: false, + top: false, + right: false, + bottom: false, + left: false, + handle: options.handler /* old option name */ || false, + revert: false, + cursor: 'move', + zindex: options.zindex /* old option name */ || 9999, + dragClass: 'drag', + onStart: false, + onEnd: false, + onDrag: false, + onChange: false, + droppableProxy: false, + mouseAnchor: undefined, + skipChildren: true, + fps: 100, + debug: false + }, options || {}, InkElement.data(element)); + + this.options = o; + this.element = Common.elOrSelector(element); + this.constraintElm = o.constraintElm && Common.elOrSelector(o.constraintElm); + + this.handle = false; + this.elmStartPosition = false; + this.active = false; + this.dragged = false; + this.prevCoords = false; + this.placeholder = false; + + this.position = false; + this.zindex = false; + this.firstDrag = true; + + if (o.fps) { + this.deltaMs = 1000 / o.fps; + this.lastRunAt = 0; + } + + this.handlers = {}; + this.handlers.start = Ink.bindEvent(this._onStart,this); + this.handlers.dragFacade = Ink.bindEvent(this._onDragFacade,this); + this.handlers.drag = Ink.bindEvent(this._onDrag,this); + this.handlers.end = Ink.bindEvent(this._onEnd,this); + this.handlers.selectStart = function(event) { InkEvent.stop(event); return false; }; + + // set handle + this.handle = (this.options.handle) ? + Common.elOrSelector(this.options.handle) : this.element; + this.handle.style.cursor = o.cursor; + + InkEvent.observe(this.handle, 'touchstart', this.handlers.start); + InkEvent.observe(this.handle, 'mousedown', this.handlers.start); + + if (Browser.IE) { + InkEvent.observe(this.element, 'selectstart', this.handlers.selectStart); + } + }, + + /** + * Removes the ability of the element of being dragged + * + * @method destroy + * @public + */ + destroy: function() { + InkEvent.stopObserving(this.handle, 'touchstart', this.handlers.start); + InkEvent.stopObserving(this.handle, 'mousedown', this.handlers.start); + + if (Browser.IE) { + InkEvent.stopObserving(this.element, 'selectstart', this.handlers.selectStart); + } + }, + + /** + * Gets coordinates for a given event (with added page scroll) + * + * @method _getCoords + * @param {Object} e window.event object. + * @return {Array} Array where the first position is the x coordinate, the second is the y coordinate + * @private + */ + _getCoords: function(e) { + var ps = [InkElement.scrollWidth(), InkElement.scrollHeight()]; + return { + x: (e.touches ? e.touches[0].clientX : e.clientX) + ps[x], + y: (e.touches ? e.touches[0].clientY : e.clientY) + ps[y] + }; + }, + + /** + * Clones src element's relevant properties to dst + * + * @method _cloneStyle + * @param {DOMElement} src Element from where we're getting the styles + * @param {DOMElement} dst Element where we're placing the styles. + * @private + */ + _cloneStyle: function(src, dst) { + dst.className = src.className; + dst.style.borderWidth = '0'; + dst.style.padding = '0'; + dst.style.position = 'absolute'; + dst.style.width = InkElement.elementWidth(src) + 'px'; + dst.style.height = InkElement.elementHeight(src) + 'px'; + dst.style.left = InkElement.elementLeft(src) + 'px'; + dst.style.top = InkElement.elementTop(src) + 'px'; + dst.style.cssFloat = Css.getStyle(src, 'float'); + dst.style.display = Css.getStyle(src, 'display'); + }, + + /** + * onStart event handler + * + * @method _onStart + * @param {Object} e window.event object + * @return {Boolean|void} In some cases return false. Otherwise is void + * @private + */ + _onStart: function(e) { + if (!this.active && InkEvent.isLeftClick(e) || typeof e.button === 'undefined') { + + var tgtEl = InkEvent.element(e); + if (this.options.skipChildren && tgtEl !== this.handle) { return; } + + InkEvent.stop(e); + + Css.addClassName(this.element, this.options.dragClass); + + this.elmStartPosition = [ + InkElement.elementLeft(this.element), + InkElement.elementTop( this.element) + ]; + + var pos = [ + parseInt(Css.getStyle(this.element, 'left'), 10), + parseInt(Css.getStyle(this.element, 'top'), 10) + ]; + + var dims = InkElement.elementDimensions(this.element); + + this.originalPosition = [ pos[x] ? pos[x]: null, pos[y] ? pos[y] : null ]; + this.delta = this._getCoords(e); // mouse coords at beginning of drag + + this.active = true; + this.position = Css.getStyle(this.element, 'position'); + this.zindex = Css.getStyle(this.element, 'zIndex'); + + var div = document.createElement('div'); + div.style.position = this.position; + div.style.width = dims[x] + 'px'; + div.style.height = dims[y] + 'px'; + div.style.marginTop = Css.getStyle(this.element, 'margin-top'); + div.style.marginBottom = Css.getStyle(this.element, 'margin-bottom'); + div.style.marginLeft = Css.getStyle(this.element, 'margin-left'); + div.style.marginRight = Css.getStyle(this.element, 'margin-right'); + div.style.borderWidth = '0'; + div.style.padding = '0'; + div.style.cssFloat = Css.getStyle(this.element, 'float'); + div.style.display = Css.getStyle(this.element, 'display'); + div.style.visibility = 'hidden'; + + this.delta2 = [ this.delta.x - this.elmStartPosition[x], this.delta.y - this.elmStartPosition[y] ]; // diff between top-left corner of obj and mouse + if (this.options.mouseAnchor) { + var parts = this.options.mouseAnchor.split(' '); + var ad = [dims[x], dims[y]]; // starts with 'right bottom' + if (parts[0] === 'left') { ad[x] = 0; } else if(parts[0] === 'center') { ad[x] = parseInt(ad[x]/2, 10); } + if (parts[1] === 'top') { ad[y] = 0; } else if(parts[1] === 'center') { ad[y] = parseInt(ad[y]/2, 10); } + this.applyDelta = [this.delta2[x] - ad[x], this.delta2[y] - ad[y]]; + } + + var dragHandlerName = this.options.fps ? 'dragFacade' : 'drag'; + + this.placeholder = div; + + if (this.options.onStart) { this.options.onStart(this.element, e); } + + if (this.options.droppableProxy) { // create new transparent div to optimize DOM traversal during drag + this.proxy = document.createElement('div'); + dims = [ + window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth, + window.innerHeight || document.documentElement.clientHeight || document.body.clientHeight + ]; + var fs = this.proxy.style; + fs.width = dims[x] + 'px'; + fs.height = dims[y] + 'px'; + fs.position = 'fixed'; + fs.left = '0'; + fs.top = '0'; + fs.zIndex = this.options.zindex + 1; + fs.backgroundColor = '#FF0000'; + Css.setOpacity(this.proxy, 0); + + var firstEl = document.body.firstChild; + while (firstEl && firstEl.nodeType !== 1) { firstEl = firstEl.nextSibling; } + document.body.insertBefore(this.proxy, firstEl); + + + InkEvent.observe(this.proxy, 'mousemove', this.handlers[dragHandlerName]); + InkEvent.observe(this.proxy, 'touchmove', this.handlers[dragHandlerName]); + } + else { + InkEvent.observe(document, 'mousemove', this.handlers[dragHandlerName]); + } + + this.element.style.position = 'absolute'; + this.element.style.zIndex = this.options.zindex; + this.element.parentNode.insertBefore(this.placeholder, this.element); + + this._onDrag(e); + + InkEvent.observe(document, 'mouseup', this.handlers.end); + InkEvent.observe(document, 'touchend', this.handlers.end); + + return false; + } + }, + + /** + * Function that gets the timestamp of the current run from time to time. (FPS) + * + * @method _onDragFacade + * @param {Object} window.event object. + * @private + */ + _onDragFacade: function(e) { + var now = +new Date(); + if (!this.lastRunAt || now > this.lastRunAt + this.deltaMs) { + this.lastRunAt = now; + this._onDrag(e); + } + }, + + /** + * Function that handles the dragging movement + * + * @method _onDrag + * @param {Object} window.event object. + * @private + */ + _onDrag: function(e) { + if (this.active) { + InkEvent.stop(e); + this.dragged = true; + var mouseCoords = this._getCoords(e), + mPosX = mouseCoords.x, + mPosY = mouseCoords.y, + o = this.options, + newX = false, + newY = false; + + if (this.prevCoords && mPosX !== this.prevCoords.x || mPosY !== this.prevCoords.y) { + if (o.onDrag) { o.onDrag(this.element, e); } + this.prevCoords = mouseCoords; + + newX = this.elmStartPosition[x] + mPosX - this.delta.x; + newY = this.elmStartPosition[y] + mPosY - this.delta.y; + + var draggableSize = InkElement.elementDimensions(this.element); + + if (this.constraintElm) { + var offset = InkElement.offset(this.constraintElm); + var size = InkElement.elementDimensions(this.constraintElm); + var constTop = offset[y] + (o.top || 0), + constBottom = offset[y] + size[y] - (o.bottom || 0), + constLeft = offset[x] + (o.left || 0), + constRight = offset[x] + size[x] - (o.right || 0); + + newY = between(newY, constTop, constBottom - draggableSize[y]); + newX = between(newX, constLeft, constRight - draggableSize[x]); + } else if (o.constraint) { + var right = o.right === false ? InkElement.pageWidth() - draggableSize[x] : o.right, + left = o.left === false ? 0 : o.left, + top = o.top === false ? 0 : o.top, + bottom = o.bottom === false ? InkElement.pageHeight() - draggableSize[y] : o.bottom; + if (o.constraint === 'horizontal' || o.constraint === 'both') { + newX = between(newX, left, right); + } + if (o.constraint === 'vertical' || o.constraint === 'both') { + newY = between(newY, top, bottom); + } + } + + var Droppable = Ink.getModule('Ink.UI.Droppable_1'); + if (this.firstDrag) { + if (Droppable) { Droppable.updateAll(); } + /*this.element.style.position = 'absolute'; + this.element.style.zIndex = this.options.zindex; + this.element.parentNode.insertBefore(this.placeholder, this.element);*/ + this.firstDrag = false; + } + + if (newX) { this.element.style.left = newX + 'px'; } + if (newY) { this.element.style.top = newY + 'px'; } + + if (Droppable) { + // apply applyDelta defined on drag init + var mouseCoords2 = this.options.mouseAnchor ? + {x: mPosX - this.applyDelta[x], y: mPosY - this.applyDelta[y]} : + mouseCoords; + Droppable.action(mouseCoords2, 'drag', e, this.element); + } + if (o.onChange) { o.onChange(this); } + } + } + }, + + /** + * Function that handles the end of the dragging process + * + * @method _onEnd + * @param {Object} window.event object. + * @private + */ + _onEnd: function(e) { + InkEvent.stopObserving(document, 'mousemove', this.handlers.drag); + InkEvent.stopObserving(document, 'touchmove', this.handlers.drag); + + if (this.options.fps) { + this._onDrag(e); + } + + Css.removeClassName(this.element, this.options.dragClass); + + if (this.active && this.dragged) { + + if (this.options.droppableProxy) { // remove transparent div... + document.body.removeChild(this.proxy); + } + + if (this.pt) { // remove debugging element... + InkElement.remove(this.pt); + this.pt = undefined; + } + + /*if (this.options.revert) { + this.placeholder.parentNode.removeChild(this.placeholder); + }*/ + + if(this.placeholder) { + InkElement.remove(this.placeholder); + } + + if (this.options.revert) { + this.element.style.position = this.position; + if (this.zindex !== null) { + this.element.style.zIndex = this.zindex; + } + else { + this.element.style.zIndex = 'auto'; + } // restore default zindex of it had none + + this.element.style.left = (this.originalPosition[x]) ? this.originalPosition[x] + 'px' : ''; + this.element.style.top = (this.originalPosition[y]) ? this.originalPosition[y] + 'px' : ''; + } + + if (this.options.onEnd) { + this.options.onEnd(this.element, e); + } + + var Droppable = Ink.getModule('Ink.UI.Droppable_1'); + if (Droppable) { + Droppable.action(this._getCoords(e), 'drop', e, this.element); + } + + this.position = false; + this.zindex = false; + this.firstDrag = true; + } + + this.active = false; + this.dragged = false; + } + }; + + return Draggable; + +}); + +/** + * @module Ink.UI.Dropdown_1 + * + * @author inkdev AT sapo.pt + * @version 1 + */ +Ink.createModule('Ink.UI.Dropdown', '1', ['Ink.UI.Common_1', 'Ink.UI.Toggle_1', 'Ink.Dom.Event_1', 'Ink.Dom.Element_1'], function(Common, Toggle, InkEvent, InkElement) { + 'use strict'; + + function Dropdown(trigger, options) { + this._init(trigger, options); + } + + Dropdown.prototype = { + /** + * Use this UI module to achieve a dropdown menu. + * + * @class Ink.UI.Dropdown + * + * @constructor + * @param {DOMElement|String} trigger + * @param {Object} options + * @param {DOMElement|String} options.target Target of the dropdown action. + */ + _init: function(trigger, options) { + this._element = Common.elOrSelector(trigger); + this._options = Common.options('Ink.UI.Dropdown_1', { + 'target': ['Element'], + 'hoverOpen': ['Number', null], + 'dismissOnInsideClick': ['Boolean', false], + 'dismissOnOutsideClick': ['Boolean', true], + 'dismissAfter': ['Number', null], + 'onInsideClick': ['Function', null], + 'onOutsideClick': ['Function', null], + 'onOpen': ['Function', null], + 'onDismiss': ['Function', null] + }, options || {}, this._element); + + this._toggle = new Toggle(this._element, { + target: this._options.target, + closeOnInsideClick: null, + closeOnClick: false, + onChangeState: Ink.bind(function (newState) { + return this._openOrDismiss(newState, true, true); + }, this) + }); + + // Event where we set this._dismissTimeout and clear this._openTimeout + InkEvent.observeMulti([this._options.target, this._element], + 'mouseout', Ink.bindMethod(this, '_onMouseOut')); + + // Events to keep clearing this._dismissTimeout and set this._openTimeout + InkEvent.observeMulti([this._options.target, this._element], + 'mouseover', Ink.bindMethod(this, '_onMouseOver')); + + // to call dismissOnInsideClick and onInsideClick + InkEvent.observe(this._options.target, 'click', Ink.bindMethod(this, '_onInsideClick')); + // to call dismissOnOutsideClick and onOutsideClick + InkEvent.observe(document, 'click', Ink.bindMethod(this, '_onOutsideClick')); + }, + + /** + * Called when the mouse is over the toggler, or the dropdown. + * + * Deals with "hoverOpen" by setting the dropdown to open later. Also cancels "dismissAfter". + * @method _onMouseOver + * @private + **/ + _onMouseOver: function () { + if (typeof this._options.hoverOpen === 'number' && this._toggle.getState() === false) { + clearTimeout(this._openTimeout); + this._openTimeout = setTimeout( + Ink.bindMethod(this, 'open', true), + this._options.hoverOpen * 1000); + } + if (typeof this._options.dismissAfter === 'number') { + clearTimeout(this._dismissTimeout); + } + }, + + /** + * Called when the mouse leaves either the toggler, or the dropdown. + * + * Deals with "dismissAfter" by setting the dropdown to be dismissed later. Also cancels "hoverOpen". + * @method _onMouseOut + * @private + **/ + _onMouseOut: function () { + if (typeof this._options.dismissAfter === 'number' && this._toggle.getState() === true) { + clearTimeout(this._dismissTimeout); + this._dismissTimeout = setTimeout( + Ink.bindMethod(this, 'dismiss', true), + this._options.dismissAfter * 1000); + } + if (typeof this._options.hoverOpen === 'number') { + clearTimeout(this._openTimeout); + } + }, + + /** + * Handle clicks on the dropdown. + * @method _onInsideClick + * @private + */ + _onInsideClick: function (event) { + var ret = this._handlerCall('onInsideClick', InkEvent.element(event)); + if (ret === false) { return false; } + if (this._options.dismissOnInsideClick) { + this.dismiss(true); + } + InkEvent.stop(event); + }, + + /** + * Handle clicks outside the dropdown. + * @method _onInsideClick + * @private + */ + _onOutsideClick: function (event) { + var target = InkEvent.element(event); + var foundElem = InkElement.findUpwardsHaving(target, Ink.bind(function (needle) { + return needle === this._element; + }, this)); + var foundTarget = InkElement.findUpwardsHaving(target, Ink.bind(function (needle) { + return needle === this._options.target; + }, this)); + + if (!foundElem && !foundTarget) { + var ret = this._handlerCall('onOutsideClick', target); + if (ret === false) { return false; } + if (this._options.dismissOnOutsideClick) { + this.dismiss(true); + } + InkEvent.stop(event); + } + }, + + /** + * Dismiss the dropdown. + * + * @method dismiss + * @param [callHandler=false] call onDismiss handler + */ + dismiss: function (callHandler, doNotInformToggle) { + this._openOrDismiss(false, callHandler, doNotInformToggle); + }, + + /** + * Open the dropdown + * + * @method open + * @param [callHandler=false] call onOpen handler + */ + open: function (callHandler, _doNotInformToggle) { + this._openOrDismiss(true, callHandler, _doNotInformToggle); + }, + + /** + * DRY'ing up open() and dismiss() + * + * @method _openOrDismiss + * @param [newState=false] + * @param [callHandler=false] + * @private + */ + _openOrDismiss: function (newState, callHandler, _doNotInformToggle) { + if (this._toggle && this._toggle.getState() === newState) { return; } + if (callHandler) { + if (this._handlerCall(newState ? 'onOpen' : 'onDismiss') === false) { + return false; // canceled by event handler + } + } + if (!_doNotInformToggle) { + this._toggle.setState(newState); + } + clearTimeout(this._dismissTimeout); + clearTimeout(this._openTimeout); + }, + + /** + * call a method given by the user through the options + * + * @method _handlerCall + * @params handler {String} The handler name in this._options + * @params ... Arguments to pass to function + */ + _handlerCall: function (handler/*, ... */) { + if (this._options[handler]) { + return this._options[handler].call(this, [].slice.call(arguments, 1)); + } + } + }; + + return Dropdown; +}); + + +/** + * @module Ink.UI.Droppable_1 + * @author inkdev AT sapo.pt + * @version 1 + */ +Ink.createModule("Ink.UI.Droppable","1",["Ink.Dom.Element_1", "Ink.Dom.Event_1", "Ink.Dom.Css_1", "Ink.UI.Common_1", "Ink.Util.Array_1", "Ink.Dom.Selector_1"], function( InkElement, InkEvent, Css, Common, InkArray, Selector) { + 'use strict'; + + // Higher order functions + var hAddClassName = function (element) { + return function (className) {return Css.addClassName(element, className);}; + }; + var hRemoveClassName = function (element) { + return function (className) {return Css.removeClassName(element, className);}; + }; + + /** + * @class Ink.UI.Droppable + * @version 1 + * @static + */ + var Droppable = { + /** + * Flag that determines if it's in debug mode or not + * + * @property debug + * @type {Boolean} + * @private + */ + debug: false, + + /** + * Array with the data of each element (`{element: ..., data: ..., options: ...}`) + * + * @property _droppables + * @type {Array} + * @private + */ + _droppables: [], + + /** + * Array of data for each draggable. (`{element: ..., data: ...}`) + * + * @property _draggables + * @type {Array} + * @private + */ + _draggables: [], + + /** + * Makes an element droppable and adds it to the stack of droppable elements. + * Can consider it a constructor of droppable elements, but where no Droppable object is returned. + * + * In the following arguments, any events/callbacks you may pass, can be either functions or strings. If the 'move' or 'copy' strings are passed, the draggable gets moved into this droppable. If 'revert' is passed, an acceptable droppable is moved back to the element it came from. + + * + * @method add + * @param {String|DOMElement} element Target element + * @param {Object} [options] options object + * @param {String} [options.hoverClass] Classname(s) applied when an acceptable draggable element is hovering the element + * @param {String} [options.accept] Selector for choosing draggables which can be dropped in this droppable. + * @param {Function} [options.onHover] callback called when an acceptable draggable element is hovering the droppable. Gets the draggable and the droppable element as parameters. + * @param {Function|String} [options.onDrop] callback called when an acceptable draggable element is dropped. Gets the draggable, the droppable and the event as parameters. + * @param {Function|String} [options.onDropOut] callback called when a droppable is dropped outside this droppable. Gets the draggable, the droppable and the event as parameters. (see above for string options). + * @public + * + * @example + * + * + *
        + *
      • Draggable 1
      • + *
      • Draggable 2
      • + *
      • Draggable 3
      • + *
      + *
        + *
      + * + * + */ + add: function(element, options) { + element = Common.elOrSelector(element, 'Droppable.add target element'); + + var opt = Ink.extendObj( { + hoverClass: options.hoverclass /* old name */ || false, + accept: false, + onHover: false, + onDrop: false, + onDropOut: false + }, options || {}, InkElement.data(element)); + + if (typeof opt.hoverClass === 'string') { + opt.hoverClass = opt.hoverClass.split(/\s+/); + } + + function cleanStyle(draggable) { + draggable.style.position = 'inherit'; + } + var that = this; + var namedEventHandlers = { + move: function (draggable, droppable/*, event*/) { + cleanStyle(draggable); + droppable.appendChild(draggable); + }, + copy: function (draggable, droppable/*, event*/) { + cleanStyle(draggable); + droppable.appendChild(draggable.cloneNode); + }, + revert: function (draggable/*, droppable, event*/) { + that._findDraggable(draggable).originalParent.appendChild(draggable); + cleanStyle(draggable); + } + }; + var name; + + if (typeof opt.onHover === 'string') { + name = opt.onHover; + opt.onHover = namedEventHandlers[name]; + if (opt.onHover === undefined) { + throw new Error('Unknown hover event handler: ' + name); + } + } + if (typeof opt.onDrop === 'string') { + name = opt.onDrop; + opt.onDrop = namedEventHandlers[name]; + if (opt.onDrop === undefined) { + throw new Error('Unknown drop event handler: ' + name); + } + } + if (typeof opt.onDropOut === 'string') { + name = opt.onDropOut; + opt.onDropOut = namedEventHandlers[name]; + if (opt.onDropOut === undefined) { + throw new Error('Unknown dropOut event handler: ' + name); + } + } + + var elementData = { + element: element, + data: {}, + options: opt + }; + this._droppables.push(elementData); + this._update(elementData); + }, + + /** + * find droppable data about `element`. this data is added in `.add` + * + * @method _findData + * @param {DOMElement} element Needle + * @return {object} Droppable data of the element + * @private + */ + _findData: function (element) { + var elms = this._droppables; + for (var i = 0, len = elms.length; i < len; i++) { + if (elms[i].element === element) { + return elms[i]; + } + } + }, + /** + * Find draggable data about `element` + * + * @method _findDraggable + * @param {DOMElement} element Needle + * @return {Object} Draggable data queried + * @private + */ + _findDraggable: function (element) { + var elms = this._draggables; + for (var i = 0, len = elms.length; i < len; i++) { + if (elms[i].element === element) { + return elms[i]; + } + } + }, + + /** + * Invoke every time a drag starts + * + * @method updateAll + * @private + */ + updateAll: function() { + InkArray.each(this._droppables, Droppable._update); + }, + + /** + * Updates location and size of droppable element + * + * @method update * @param {String|DOMElement} element - target element + * @private + */ + update: function(element) { + this._update(this._findData(element)); + }, + + _update: function(elementData) { + var data = elementData.data; + var element = elementData.element; + data.left = InkElement.offsetLeft(element); + data.top = InkElement.offsetTop( element); + data.right = data.left + InkElement.elementWidth( element); + data.bottom = data.top + InkElement.elementHeight(element); + }, + + /** + * Removes an element from the droppable stack and removes the droppable behavior + * + * @method remove + * @param {String|DOMElement} elOrSelector Droppable element to disable. + * @return {Boolean} Whether the object was found and deleted + * @public + */ + remove: function(el) { + el = Common.elOrSelector(el); + var len = this._droppables.length; + for (var i = 0; i < len; i++) { + if (this._droppables[i].element === el) { + this._droppables.splice(i, 1); + break; + } + } + return len !== this._droppables.length; + }, + + /** + * Method called by a draggable to execute an action on a droppable + * + * @method action + * @param {Object} coords coordinates where the action happened + * @param {String} type type of action. drag or drop. + * @param {Object} ev Event object + * @param {Object} draggable draggable element + * @private + */ + action: function(coords, type, ev, draggable) { + // check all droppable elements + InkArray.each(this._droppables, Ink.bind(function(elementData) { + var data = elementData.data; + var opt = elementData.options; + var element = elementData.element; + + if (opt.accept && !Selector.matches(opt.accept, [draggable]).length) { + return; + } + + if (type === 'drag' && !this._findDraggable(draggable)) { + this._draggables.push({ + element: draggable, + originalParent: draggable.parentNode + }); + } + + // check if our draggable is over our droppable + if (coords.x >= data.left && coords.x <= data.right && + coords.y >= data.top && coords.y <= data.bottom) { + // INSIDE + if (type === 'drag') { + if (opt.hoverClass) { + InkArray.each(opt.hoverClass, + hAddClassName(element)); + } + if (opt.onHover) { + opt.onHover(draggable, element); + } + } else if (type === 'drop') { + if (opt.hoverClass) { + InkArray.each(opt.hoverClass, + hRemoveClassName(element)); + } + if (opt.onDrop) { + opt.onDrop(draggable, element, ev); + } + } + } else { + // OUTSIDE + + if (type === 'drag' && opt.hoverClass) { + InkArray.each(opt.hoverClass, hRemoveClassName(element)); + } else if (type === 'drop') { + if(opt.onDropOut){ + opt.onDropOut(draggable, element, ev); + } + } + } + }, this)); + } + }; + + return Droppable; +}); + +/** + * @module Ink.UI.FormValidator_1 + * @author inkdev AT sapo.pt + * @version 1 + **/ +Ink.createModule('Ink.UI.FormValidator', '1', ['Ink.Dom.Element_1', 'Ink.Dom.Css_1','Ink.Util.Validator_1','Ink.Dom.Selector_1'], function( InkElement, Css, InkValidator , Selector) { + 'use strict'; + + function elementsWithSameName(elm) { + if (!elm.name) { return []; } + if (!elm.form) { + return Selector.select('name="' + elm.name + '"'); + } + var ret = elm.form[elm.name]; + if(typeof(ret.length) === 'undefined') { + ret = [ret]; + } + return ret; + } + /** + * @class Ink.UI.FormValidator + * @version 1 + */ + var FormValidator = { + + /** + * Specifies the version of the component + * + * @property version + * @type {String} + * @readOnly + * @public + */ + version: '1', + + /** + * Available flags to use in the validation process. + * The keys are the 'rules', and their values are objects with the key 'msg', determining + * what is the error message. + * + * @property _flagMap + * @type {Object} + * @readOnly + * @private + */ + _flagMap: { + //'ink-fv-required': {msg: 'Campo obrigatório'}, + 'ink-fv-required': {msg: 'Required field'}, + //'ink-fv-email': {msg: 'E-mail inválido'}, + 'ink-fv-email': {msg: 'Invalid e-mail address'}, + //'ink-fv-url': {msg: 'URL inválido'}, + 'ink-fv-url': {msg: 'Invalid URL'}, + //'ink-fv-number': {msg: 'Número inválido'}, + 'ink-fv-number': {msg: 'Invalid number'}, + //'ink-fv-phone_pt': {msg: 'Número de telefone inválido'}, + 'ink-fv-phone_pt': {msg: 'Invalid phone number'}, + //'ink-fv-phone_cv': {msg: 'Número de telefone inválido'}, + 'ink-fv-phone_cv': {msg: 'Invalid phone number'}, + //'ink-fv-phone_mz': {msg: 'Número de telefone inválido'}, + 'ink-fv-phone_mz': {msg: 'Invalid phone number'}, + //'ink-fv-phone_ao': {msg: 'Número de telefone inválido'}, + 'ink-fv-phone_ao': {msg: 'Invalid phone number'}, + //'ink-fv-date': {msg: 'Data inválida'}, + 'ink-fv-date': {msg: 'Invalid date'}, + //'ink-fv-confirm': {msg: 'Confirmação inválida'}, + 'ink-fv-confirm': {msg: 'Confirmation does not match'}, + 'ink-fv-custom': {msg: ''} + }, + + /** + * This property holds all form elements for later validation + * + * @property elements + * @type {Object} + * @public + */ + elements: {}, + + /** + * This property holds the objects needed to cross-check for the 'confirm' rule + * + * @property confirmElms + * @type {Object} + * @public + */ + confirmElms: {}, + + /** + * This property holds the previous elements in the confirmElms property, but with a + * true/false specifying if it has the class ink-fv-confirm. + * + * @property hasConfirm + * @type {Object} + */ + hasConfirm: {}, + + /** + * Defined class name to use in error messages label + * + * @property _errorClassName + * @type {String} + * @readOnly + * @private + */ + _errorClassName: 'tip error', + + /** + * @property _errorValidationClassName + * @type {String} + * @readOnly + * @private + */ + _errorValidationClassName: 'validaton', + + /** + * @property _errorTypeWarningClassName + * @type {String} + * @readOnly + * @private + */ + _errorTypeWarningClassName: 'warning', + + /** + * @property _errorTypeErrorClassName + * @type {String} + * @readOnly + * @private + */ + _errorTypeErrorClassName: 'error', + + /** + * Check if a form is valid or not + * + * @method validate + * @param {DOMElement|String} elm DOM form element or form id + * @param {Object} options Options for + * @param {Function} [options.onSuccess] function to run when form is valid + * @param {Function} [options.onError] function to run when form is not valid + * @param {Array} [options.customFlag] custom flags to use to validate form fields + * @public + * @return {Boolean} Whether the form is deemed valid or not. + * + * @example + * + * ## What markup do I need? + * + * Besides the markup structure you can see in + * , you need to add + * the `ink-fv-*` classes to your inputs, which correspond to validation + * rules in this component. Available classes are: + * + * - `ink-fv-required` : Required field + * - `ink-fv-email` : Valid e-mail + * - `ink-fv-url` : Valid URL address + * - `ink-fv-number` : Valid number + * - `ink-fv-phone_pt`, `ink-fv-phone_cv`, `ink-fv-phone_mz`, `ink-fv-phone_ao` : Valid telephone number in Portugal, Cape Verde, Mozambique or Angola. + * - `ink-fv-date` : Valid date + * - `ink-fv-confirm` : Make the user type the same thing twice. Common rule for confirming passwords. + * - `ink-fv-custom` : Custom rule (see below example "Custom rule") + * + * E-mail field:
      + * Phone number field:
      + * Website field (optional): + * + * ## Simple usage + * + * So you have a form and would like to validate it? This example shows + * how to validate a form and stop it from being submitted when invalid. + * To use this, add the several ink-fv-* classes to your input elements. + * + * The validate() function will also add "invalid" classes to each of + * your elements so the user gets a color feedback and an error message + * below each element (control-group, really). + * + * var myForm = Ink.i('my-form'); + * InkEvent.observe(myForm, 'submit', function (ev) { + * var formIsValid = FormValidator.validate(myForm); + * if (!formIsValid) { + * InkEvent.stop(ev); // Cancel submission of form. + * } + * }); + * + * @example + * + * ## Custom rule. + * + * The following code validates using a custom rule named `minthree`, + * which fails if the input string has less than three characters. + * To do this, you must add the `ink-fv-custom` and `minthree` classes + * to the input elements you want to validate, and pass the `customFlag` + * option to this function, like so: + * + * var isValid = FormValidator.validate(myForm, { + * customFlag: [ + * { + * flag: 'minthree', // The name of this rule (add this class to your s + * msg: 'Please input at least three characters', // Error message when rule fails + * callback: function (el) { + * return el.value.length >= 3 // Return true when okay, false when not + * } + * } + * ] + * }); + */ + validate: function(elm, options) { + this._free(); + + options = Ink.extendObj({ + onSuccess: false, + onError: false, + customFlag: false, + confirmGroup: [] + }, options || {}); + + if(typeof(elm) === 'string') { + elm = document.getElementById(elm); + } + if(elm === null){ + return false; + } + this.element = elm; + + if(typeof(this.element.id) === 'undefined' || this.element.id === null || this.element.id === '') { + // generate a random ID + // TODO ugly and potentially problematic, and you know Murphy's law. + this.element.id = 'ink-fv_randomid_'+(Math.round(Math.random() * 99999)); + } + + this.custom = options.customFlag; + + this.confirmGroup = options.confirmGroup; + + var fail = this._validateElements(); + + if(fail.length > 0) { + if(options.onError) { + options.onError(fail); + } else { + this._showError(elm, fail); + } + return false; + } else { + if(!options.onError) { + this._clearError(elm); + } + this._clearCache(); + if(options.onSuccess) { + options.onSuccess(); + } + return true; + } + + }, + + /** + * Reset previously generated validation errors + * + * @method reset + * @public + */ + reset: function() + { + this._clearError(); + this._clearCache(); + }, + + /** + * Cleans the object + * + * @method _free + * @private + */ + _free: function() + { + this.element = null; + //this.elements = []; + this.custom = false; + this.confirmGroup = false; + }, + + /** + * Cleans the properties responsible for caching + * + * @method _clearCache + * @private + */ + _clearCache: function() + { + this.element = null; + this.elements = []; + this.custom = false; + this.confirmGroup = false; + }, + + /** + * Gets the form elements and stores them in the caching properties + * + * @method _getElements + * @private + */ + _getElements: function() + { + //this.elements = []; + // if(typeof(this.elements[this.element.id]) !== 'undefined') { + // return; + // } + + var elements = this.elements[this.element.id] = []; + this.confirmElms[this.element.id] = []; + //console.log(this.element); + //console.log(this.element.elements); + var formElms = Selector.select(':input', this.element); + var curElm = false; + for(var i=0, totalElm = formElms.length; i < totalElm; i++) { + curElm = formElms[i]; + var type = (curElm.getAttribute('type') + '').toLowerCase(); + + if (type === 'radio' || type === 'checkbox') { + if(elements.length === 0 || + ( + curElm.getAttribute('type') !== elements[elements.length - 1].getAttribute('type') && + curElm.getAttribute('name') !== elements[elements.length - 1].getAttribute('name') + )) { + for(var flag in this._flagMap) { + if(Css.hasClassName(curElm, flag)) { + elements.push(curElm); + break; + } + } + } + } else { + for(var flag2 in this._flagMap) { + if(Css.hasClassName(curElm, flag2) && flag2 !== 'ink-fv-confirm') { + /*if(flag2 == 'ink-fv-confirm') { + this.confirmElms[this.element.id].push(curElm); + this.hasConfirm[this.element.id] = true; + }*/ + elements.push(curElm); + break; + } + } + + if(Css.hasClassName(curElm, 'ink-fv-confirm')) { + this.confirmElms[this.element.id].push(curElm); + this.hasConfirm[this.element.id] = true; + } + + } + } + }, + + /** + * Runs the validation for each element + * + * @method _validateElements + * @private + */ + _validateElements: function() { + var oGroups; + this._getElements(); + if(this.hasConfirm[this.element.id] === true) { + oGroups = this._makeConfirmGroups(); + } + + var errors = []; + + var curElm = false; + var customErrors = false; + var inArray; + for(var i=0, totalElm = this.elements[this.element.id].length; i < totalElm; i++) { + inArray = false; + curElm = this.elements[this.element.id][i]; + + if(!curElm.disabled) { + for(var flag in this._flagMap) { + if(Css.hasClassName(curElm, flag)) { + if(flag !== 'ink-fv-custom' && flag !== 'ink-fv-confirm') { + if(!this._isValid(curElm, flag)) { + if(!inArray) { + errors.push({elm: curElm, errors:[flag]}); + inArray = true; + } else { + errors[(errors.length - 1)].errors.push(flag); + } + } + } else if(flag !== 'ink-fv-confirm'){ + customErrors = this._isCustomValid(curElm); + if(customErrors.length > 0) { + errors.push({elm: curElm, errors:[flag], custom: customErrors}); + } + } else if(flag === 'ink-fv-confirm'){ + continue; + } + } + } + } + } + errors = this._validateConfirmGroups(oGroups, errors); + //console.log(InkDumper.returnDump(errors)); + return errors; + }, + + /** + * Runs the 'confirm' validation for each group of elements + * + * @method _validateConfirmGroups + * @param {Array} oGroups Array/Object that contains the group of confirm objects + * @param {Array} errors Array that will store the errors + * @private + * @return {Array} Array of errors that was passed as 2nd parameter (either changed, or not, depending if errors were found). + */ + _validateConfirmGroups: function(oGroups, errors) { + //console.log(oGroups); + var curGroup = false; + for(var i in oGroups) if (oGroups.hasOwnProperty(i)) { + curGroup = oGroups[i]; + if(curGroup.length === 2) { + if(curGroup[0].value !== curGroup[1].value) { + errors.push({elm:curGroup[1], errors:['ink-fv-confirm']}); + } + } + } + return errors; + }, + + /** + * Creates the groups of 'confirm' objects + * + * @method _makeConfirmGroups + * @private + * @return {Array|Boolean} Returns the array of confirm elements or false on error. + */ + _makeConfirmGroups: function() + { + var oGroups; + if(this.confirmGroup && this.confirmGroup.length > 0) { + oGroups = {}; + var curElm = false; + var curGroup = false; + //this.confirmElms[this.element.id]; + for(var i=0, total=this.confirmElms[this.element.id].length; i < total; i++) { + curElm = this.confirmElms[this.element.id][i]; + for(var j=0, totalG=this.confirmGroup.length; j < totalG; j++) { + curGroup = this.confirmGroup[j]; + if(Css.hasClassName(curElm, curGroup)) { + if(typeof(oGroups[curGroup]) === 'undefined') { + oGroups[curGroup] = [curElm]; + } else { + oGroups[curGroup].push(curElm); + } + } + } + } + return oGroups; + } else { + if(this.confirmElms[this.element.id].length === 2) { + oGroups = { + "ink-fv-confirm": [ + this.confirmElms[this.element.id][0], + this.confirmElms[this.element.id][1] + ] + }; + } + return oGroups; + } + return false; + }, + + /** + * Validates an element with a custom validation + * + * @method _isCustomValid + * @param {DOMElemenmt} elm Element to be validated + * @private + * @return {Array} Array of errors. If no errors are found, results in an empty array. + */ + _isCustomValid: function(elm) + { + var customErrors = []; + var curFlag = false; + for(var i=0, tCustom = this.custom.length; i < tCustom; i++) { + curFlag = this.custom[i]; + if(Css.hasClassName(elm, curFlag.flag)) { + if(!curFlag.callback(elm, curFlag.msg)) { + customErrors.push({flag: curFlag.flag, msg: curFlag.msg}); + } + } + } + return customErrors; + }, + + /** + * Runs the normal validation functions for a specific element + * + * @method _isValid + * @param {DOMElement} elm DOMElement that will be validated + * @param {String} fieldType Rule to be validated. This must be one of the keys present in the _flagMap property. + * @private + * @return {Boolean} The result of the validation. + */ + _isValid: function(elm, fieldType) { + var nodeName = elm.nodeName.toLowerCase(); + var inputType = (elm.getAttribute('type') || '').toLowerCase(); + var value = this._trim(elm.value); + + // When we're analyzing emails, telephones, etc, and the field is + // empty, we check if it is required. If not required, it's valid. + if (fieldType !== 'ink-fv-required' && + inputType !== 'checkbox' && inputType !== 'radio' && + value === '') { + return !Css.hasClassName(elm, 'ink-fv-required'); + } + + switch(fieldType) { + case 'ink-fv-required': + if(nodeName === 'select') { + if(elm.selectedIndex > 0) { + return true; + } else { + return false; + } + } + if(inputType !== 'checkbox' && inputType !== 'radio' && + value !== '') { + return true; // A input type=text,email,etc. + } else if(inputType === 'checkbox' || inputType === 'radio') { + var aFormRadios = elementsWithSameName(elm); + var isChecked = false; + // check if any input of the radio is checked + for(var i=0, totalRadio = aFormRadios.length; i < totalRadio; i++) { + if(aFormRadios[i].checked === true) { + isChecked = true; + break; + } + } + return isChecked; + } + return false; + + case 'ink-fv-email': + return InkValidator.mail(elm.value); + + case 'ink-fv-url': + return InkValidator.url(elm.value); + + case 'ink-fv-number': + return !isNaN(Number(elm.value)) && isFinite(Number(elm.value)); + + case 'ink-fv-phone_pt': + return InkValidator.isPTPhone(elm.value); + + case 'ink-fv-phone_cv': + return InkValidator.isCVPhone(elm.value); + + case 'ink-fv-phone_ao': + return InkValidator.isAOPhone(elm.value); + + case 'ink-fv-phone_mz': + return InkValidator.isMZPhone(elm.value); + + case 'ink-fv-date': + var Element = Ink.getModule('Ink.Dom.Element',1); + var dataset = Element.data( elm ); + var validFormat = 'yyyy-mm-dd'; + + if( Css.hasClassName(elm, 'ink-datepicker') && ('format' in dataset) ){ + validFormat = dataset.format; + } else if( ('validFormat' in dataset) ){ + validFormat = dataset.validFormat; + } + + if( !(validFormat in InkValidator._dateParsers ) ){ + var validValues = []; + for( var val in InkValidator._dateParsers ){ + if (InkValidator._dateParsers.hasOwnProperty(val)) { + validValues.push(val); + } + } + throw new Error( + 'The attribute data-valid-format must be one of ' + + 'the following values: ' + validValues.join(', ')); + } + + return InkValidator.isDate( validFormat, elm.value ); + case 'ink-fv-custom': + break; + } + + return false; + }, + + /** + * Makes the necessary changes to the markup to show the errors of a given element + * + * @method _showError + * @param {DOMElement} formElm The form element to be changed to show the errors + * @param {Array} aFail An array with the errors found. + * @private + */ + _showError: function(formElm, aFail) { + this._clearError(formElm); + + //ink-warning-field + + //console.log(aFail); + var curElm = false; + for(var i=0, tFail = aFail.length; i < tFail; i++) { + curElm = aFail[i].elm; + if (curElm) { + this._showAnErrorOnElement(curElm, aFail[i]); + } + } + }, + + _showAnErrorOnElement: function (curElm, error) { + /* jshint noempty:false */ + + var controlGroupElm = InkElement.findUpwardsByClass( + curElm, 'control-group'); + var controlElm = InkElement.findUpwardsByClass( + curElm, 'control'); + + var errorClasses = [ + this._errorClassName, + this._errorTypeClassName].join(' '); + + var errorMsg = InkElement.create('p', { + className: errorClasses + }); + + if(error.errors[0] !== 'ink-fv-custom') { + errorMsg.innerHTML = this._flagMap[error.errors[0]].msg; + } else { + errorMsg.innerHTML = error.custom[0].msg; + } + + var target = (controlElm || controlGroupElm); + if (target) { + target.appendChild(errorMsg); + } else { + InkElement.insertAfter(errorMsg, curElm); + } + + if (controlElm) { + if(error.errors[0] === 'ink-fv-required') { + Css.addClassName(controlGroupElm, 'validation error'); + } else { + Css.addClassName(controlGroupElm, 'validation warning'); + } + } + }, + + /** + * Clears the error of a given element. Normally executed before any validation, for all elements, as a reset. + * + * @method _clearErrors + * @param {DOMElement} formElm Form element to be cleared. + * @private + */ + _clearError: function(formElm) { + //return; + var aErrorLabel = formElm.getElementsByTagName('p'); + + var curElm; + var control; + + for(var i = (aErrorLabel.length - 1); i >= 0; i--) { + curElm = aErrorLabel[i]; + if(Css.hasClassName(curElm, this._errorClassName)) { + control = InkElement.findUpwardsBySelector(curElm, '.control-group'); + if (control) { + Css.removeClassName(control, ['validation', 'error', 'warning']); + } + + if(Css.hasClassName(curElm, this._errorClassName, true /*both*/)) { + InkElement.remove(curElm); + } + } + } + + var aErrorLabel2 = formElm.getElementsByTagName('ul'); + for(i = (aErrorLabel2.length - 1); i >= 0; i--) { + curElm = aErrorLabel2[i]; + if(Css.hasClassName(curElm, 'control-group')) { + Css.removeClassName(curElm, 'validation error'); + } + } + }, + + /** + * Removes unnecessary spaces to the left or right of a string + * + * @method _trim + * @param {String} stri String to be trimmed + * @private + * @return {String|undefined} String trimmed. + */ + _trim: function(str) + { + if(typeof(str) === 'string') + { + return str.replace(/^\s+|\s+$|\n+$/g, ''); + } + } + }; + + return FormValidator; + +}); +/** + * @module Ink.UI.FormValidator_2 + * @author inkdev AT sapo.pt + * @version 2 + */ +Ink.createModule('Ink.UI.FormValidator', '2', [ 'Ink.UI.Common_1','Ink.Dom.Element_1','Ink.Dom.Event_1','Ink.Dom.Selector_1','Ink.Dom.Css_1','Ink.Util.Array_1','Ink.Util.I18n_1','Ink.Util.Validator_1'], function( Common, Element, Event, Selector, Css, InkArray, I18n, InkValidator ) { + 'use strict'; + + /** + * Validation Functions to be used + * Some functions are a port from PHP, others are the 'best' solutions available + * + * @type {Object} + * @private + * @static + */ + var validationFunctions = { + + /** + * Checks if the value is actually defined and is not empty + * + * @method validationFunctions.required + * @param {String} value Value to be checked + * @return {Boolean} True case is defined, false if it's empty or not defined. + */ + 'required': function( value ){ + return ( (typeof value !== 'undefined') && ( !(/^\s*$/).test(value) ) ); + }, + + /** + * Checks if the value has a minimum length + * + * @method validationFunctions.min_length + * @param {String} value Value to be checked + * @param {String|Number} minSize Number of characters that the value at least must have. + * @return {Boolean} True if the length of value is equal or bigger than the minimum chars defined. False if not. + */ + 'min_length': function( value, minSize ){ + return ( (typeof value === 'string') && ( value.length >= parseInt(minSize,10) ) ); + }, + + /** + * Checks if the value has a maximum length + * + * @method validationFunctions.max_length + * @param {String} value Value to be checked + * @param {String|Number} maxSize Number of characters that the value at maximum can have. + * @return {Boolean} True if the length of value is equal or smaller than the maximum chars defined. False if not. + */ + 'max_length': function( value, maxSize ){ + return ( (typeof value === 'string') && ( value.length <= parseInt(maxSize,10) ) ); + }, + + /** + * Checks if the value has an exact length + * + * @method validationFunctions.exact_length + * @param {String} value Value to be checked + * @param {String|Number} exactSize Number of characters that the value must have. + * @return {Boolean} True if the length of value is equal to the size defined. False if not. + */ + 'exact_length': function( value, exactSize ){ + return ( (typeof value === 'string') && ( value.length === parseInt(exactSize,10) ) ); + }, + + /** + * Checks if the value has a valid e-mail address + * + * @method validationFunctions.email + * @param {String} value Value to be checked + * @return {Boolean} True if the value is a valid e-mail address. False if not. + */ + 'email': function( value ){ + return ( ( typeof value === 'string' ) && InkValidator.mail( value ) ); + }, + + /** + * Checks if the value has a valid URL + * + * @method validationFunctions.url + * @param {String} value Value to be checked + * @param {Boolean} fullCheck Flag that specifies if the value must be validated as a full url (with the protocol) or not. + * @return {Boolean} True if the URL is considered valid. False if not. + */ + 'url': function( value, fullCheck ){ + fullCheck = fullCheck || false; + return ( (typeof value === 'string') && InkValidator.url( value, fullCheck ) ); + }, + + /** + * Checks if the value is a valid IP. Supports ipv4 and ipv6 + * + * @method validationFunctions.ip + * @param {String} value Value to be checked + * @param {String} ipType Type of IP to be validated. The values are: ipv4, ipv6. By default is ipv4. + * @return {Boolean} True if the value is a valid IP address. False if not. + */ + 'ip': function( value, ipType ){ + if( typeof value !== 'string' ){ + return false; + } + + return InkValidator.isIP(value, ipType); + }, + + /** + * Checks if the value is a valid phone number. Supports several countries, based in the Ink.Util.Validator class. + * + * @method validationFunctions.phone + * @param {String} value Value to be checked + * @param {String} phoneType Country's initials to specify the type of phone number to be validated. Ex: 'AO'. + * @return {Boolean} True if it's a valid phone number. False if not. + */ + 'phone': function( value, phoneType ){ + if( typeof value !== 'string' ){ + return false; + } + + var countryCode = phoneType ? phoneType.toUpperCase() : ''; + + return InkValidator['is' + countryCode + 'Phone'](value); + }, + + /** + * Checks if it's a valid credit card. + * + * @method validationFunctions.credit_card + * @param {String} value Value to be checked + * @param {String} cardType Type of credit card to be validated. The card types available are in the Ink.Util.Validator class. + * @return {Boolean} True if the value is a valid credit card number. False if not. + */ + 'credit_card': function( value, cardType ){ + if( typeof value !== 'string' ){ + return false; + } + + return InkValidator.isCreditCard( value, cardType || 'default' ); + }, + + /** + * Checks if the value is a valid date. + * + * @method validationFunctions.date + * @param {String} value Value to be checked + * @param {String} format Specific format of the date. + * @return {Boolean} True if the value is a valid date. False if not. + */ + 'date': function( value, format ){ + return ( (typeof value === 'string' ) && InkValidator.isDate(format, value) ); + }, + + /** + * Checks if the value only contains alphabetical values. + * + * @method validationFunctions.alpha + * @param {String} value Value to be checked + * @param {Boolean} supportSpaces Allow whitespace + * @return {Boolean} True if the value is alphabetical-only. False if not. + */ + 'alpha': function( value, supportSpaces ){ + return InkValidator.ascii(value, {singleLineWhitespace: supportSpaces}); + }, + + /* + * Check that the value contains only printable unicode text characters + * from the Basic Multilingual plane (BMP) + * Optionally allow punctuation and whitespace + * + * @method validationFunctions.text + * @param {String} value Value to be checked + * @return {Boolean} Whether the value only contains printable text characters + **/ + 'text': function (value, whitespace, punctuation) { + return InkValidator.unicode(value, { + singleLineWhitespace: whitespace, + unicodePunctuation: punctuation}); + }, + + /* + * Check that the value contains only printable text characters + * available in the latin-1 encoding. + * + * Optionally allow punctuation and whitespace + * + * @method validationFunctions.text + * @param {String} value Value to be checked + * @return {Boolean} Whether the value only contains printable text characters + **/ + 'latin': function (value, punctuation, whitespace) { + if ( typeof value !== 'string') { return false; } + return InkValidator.latin1(value, {latin1Punctuation: punctuation, singleLineWhitespace: whitespace}); + }, + + /** + * Checks if the value only contains alphabetical and numerical characters. + * + * @method validationFunctions.alpha_numeric + * @param {String} value Value to be checked + * @return {Boolean} True if the value is a valid alphanumerical. False if not. + */ + 'alpha_numeric': function( value ){ + return InkValidator.ascii(value, {numbers: true}); + }, + + /** + * Checks if the value only contains alphabetical, dash or underscore characteres. + * + * @method validationFunctions.alpha_dashes + * @param {String} value Value to be checked + * @return {Boolean} True if the value is a valid. False if not. + */ + 'alpha_dash': function( value ){ + return InkValidator.ascii(value, {dash: true, underscore: true}); + }, + + /** + * Checks if the value is a digit (an integer of length = 1). + * + * @method validationFunctions.digit + * @param {String} value Value to be checked + * @return {Boolean} True if the value is a valid digit. False if not. + */ + 'digit': function( value ){ + return ((typeof value === 'string') && /^[0-9]{1}$/.test(value)); + }, + + /** + * Checks if the value is a valid integer. + * + * @method validationFunctions.integer + * @param {String} value Value to be checked + * @param {String} positive Flag that specifies if the integer is must be positive (unsigned). + * @return {Boolean} True if the value is a valid integer. False if not. + */ + 'integer': function( value, positive ){ + return InkValidator.number(value, { + negative: !positive, + decimalPlaces: 0 + }); + }, + + /** + * Checks if the value is a valid decimal number. + * + * @method validationFunctions.decimal + * @param {String} value Value to be checked + * @param {String} decimalSeparator Character that splits the integer part from the decimal one. By default is '.'. + * @param {String} [decimalPlaces] Maximum number of digits that the decimal part must have. + * @param {String} [leftDigits] Maximum number of digits that the integer part must have, when provided. + * @return {Boolean} True if the value is a valid decimal number. False if not. + */ + 'decimal': function( value, decimalSeparator, decimalPlaces, leftDigits ){ + return InkValidator.number(value, { + decimalSep: decimalSeparator || '.', + decimalPlaces: +decimalPlaces || null, + maxDigits: +leftDigits + }); + }, + + /** + * Checks if it is a numeric value. + * + * @method validationFunctions.numeric + * @param {String} value Value to be checked + * @param {String} decimalSeparator Verifies if it's a valid decimal. Otherwise checks if it's a valid integer. + * @param {String} [decimalPlaces] (when the number is decimal) Maximum number of digits that the decimal part must have. + * @param {String} [leftDigits] (when the number is decimal) Maximum number of digits that the integer part must have, when provided. + * @return {Boolean} True if the value is numeric. False if not. + */ + 'numeric': function( value, decimalSeparator, decimalPlaces, leftDigits ){ + decimalSeparator = decimalSeparator || '.'; + if( value.indexOf(decimalSeparator) !== -1 ){ + return validationFunctions.decimal( value, decimalSeparator, decimalPlaces, leftDigits ); + } else { + return validationFunctions.integer( value ); + } + }, + + /** + * Checks if the value is in a specific range of values. The parameters after the first one are used for specifying the range, and are similar in function to python's range() function. + * + * @method validationFunctions.range + * @param {String} value Value to be checked + * @param {String} minValue Left limit of the range. + * @param {String} maxValue Right limit of the range. + * @param {String} [multipleOf] In case you want numbers that are only multiples of another number. + * @return {Boolean} True if the value is within the range. False if not. + */ + 'range': function( value, minValue, maxValue, multipleOf ){ + value = +value; + minValue = +minValue; + maxValue = +maxValue; + + if (isNaN(value) || isNaN(minValue) || isNaN(maxValue)) { + return false; + } + + if( value < minValue || value > maxValue ){ + return false; + } + + if (multipleOf) { + return (value - minValue) % multipleOf === 0; + } else { + return true; + } + }, + + /** + * Checks if the value is a valid color. + * + * @method validationFunctions.color + * @param {String} value Value to be checked + * @return {Boolean} True if the value is a valid color. False if not. + */ + 'color': function( value ){ + return InkValidator.isColor(value); + }, + + /** + * Checks if the value matches the value of a different field. + * + * @method validationFunctions.matches + * @param {String} value Value to be checked + * @param {String} fieldToCompare Name or ID of the field to compare. + * @return {Boolean} True if the values match. False if not. + */ + 'matches': function( value, fieldToCompare ){ + return ( value === this.getFormElements()[fieldToCompare][0].getValue() ); + } + + }; + + /** + * Error messages for the validation functions above + * @type {Object} + * @private + * @static + */ + var validationMessages = new I18n({ + en_US: { + 'formvalidator.required' : 'The {field} filling is mandatory', + 'formvalidator.min_length': 'The {field} must have a minimum size of {param1} characters', + 'formvalidator.max_length': 'The {field} must have a maximum size of {param1} characters', + 'formvalidator.exact_length': 'The {field} must have an exact size of {param1} characters', + 'formvalidator.email': 'The {field} must have a valid e-mail address', + 'formvalidator.url': 'The {field} must have a valid URL', + 'formvalidator.ip': 'The {field} does not contain a valid {param1} IP address', + 'formvalidator.phone': 'The {field} does not contain a valid {param1} phone number', + 'formvalidator.credit_card': 'The {field} does not contain a valid {param1} credit card', + 'formvalidator.date': 'The {field} should contain a date in the {param1} format', + 'formvalidator.alpha': 'The {field} should only contain letters', + 'formvalidator.text': 'The {field} should only contain alphabetic characters', + 'formvalidator.latin': 'The {field} should only contain alphabetic characters', + 'formvalidator.alpha_numeric': 'The {field} should only contain letters or numbers', + 'formvalidator.alpha_dashes': 'The {field} should only contain letters or dashes', + 'formvalidator.digit': 'The {field} should only contain a digit', + 'formvalidator.integer': 'The {field} should only contain an integer', + 'formvalidator.decimal': 'The {field} should contain a valid decimal number', + 'formvalidator.numeric': 'The {field} should contain a number', + 'formvalidator.range': 'The {field} should contain a number between {param1} and {param2}', + 'formvalidator.color': 'The {field} should contain a valid color', + 'formvalidator.matches': 'The {field} should match the field {param1}', + 'formvalidator.validation_function_not_found': 'The rule {rule} has not been defined' + }, + pt_PT: { + 'formvalidator.required' : 'Preencher {field} é obrigatório', + 'formvalidator.min_length': '{field} deve ter no mínimo {param1} caracteres', + 'formvalidator.max_length': '{field} tem um tamanho máximo de {param1} caracteres', + 'formvalidator.exact_length': '{field} devia ter exactamente {param1} caracteres', + 'formvalidator.email': '{field} deve ser um e-mail válido', + 'formvalidator.url': 'O {field} deve ser um URL válido', + 'formvalidator.ip': '{field} não tem um endereço IP {param1} válido', + 'formvalidator.phone': '{field} deve ser preenchido com um número de telefone {param1} válido.', + 'formvalidator.credit_card': '{field} não tem um cartão de crédito {param1} válido', + 'formvalidator.date': '{field} deve conter uma data no formato {param1}', + 'formvalidator.alpha': 'O campo {field} deve conter apenas caracteres alfabéticos', + 'formvalidator.text': 'O campo {field} deve conter apenas caracteres alfabéticos', + 'formvalidator.latin': 'O campo {field} deve conter apenas caracteres alfabéticos', + 'formvalidator.alpha_numeric': '{field} deve conter apenas letras e números', + 'formvalidator.alpha_dashes': '{field} deve conter apenas letras e traços', + 'formvalidator.digit': '{field} destina-se a ser preenchido com apenas um dígito', + 'formvalidator.integer': '{field} deve conter um número inteiro', + 'formvalidator.decimal': '{field} deve conter um número válido', + 'formvalidator.numeric': '{field} deve conter um número válido', + 'formvalidator.range': '{field} deve conter um número entre {param1} e {param2}', + 'formvalidator.color': '{field} deve conter uma cor válida', + 'formvalidator.matches': '{field} deve corresponder ao campo {param1}', + 'formvalidator.validation_function_not_found': '[A regra {rule} não foi definida]' + } + }, 'en_US'); + + /** + * Constructor of a FormElement. + * This type of object has particular methods to parse rules and validate them in a specific DOM Element. + * + * @param {DOMElement} element DOM Element + * @param {Object} options Object with configuration options + * @return {FormElement} FormElement object + */ + var FormElement = function( element, options ){ + this._element = Common.elOrSelector( element, 'Invalid FormElement' ); + this._errors = {}; + this._rules = {}; + this._value = null; + + this._options = Ink.extendObj( { + label: this._getLabel() + }, Element.data(this._element) ); + + this._options = Ink.extendObj( this._options, options || {} ); + + }; + + /** + * FormElement's prototype + */ + FormElement.prototype = { + + /** + * Function to get the label that identifies the field. + * If it can't find one, it will use the name or the id + * (depending on what is defined) + * + * @method _getLabel + * @return {String} Label to be used in the error messages + * @private + */ + _getLabel: function(){ + + var controlGroup = Element.findUpwardsByClass(this._element,'control-group'); + var label = Ink.s('label',controlGroup); + if( label ){ + label = Element.textContent(label); + } else { + label = this._element.name || this._element.id || ''; + } + + return label; + }, + + /** + * Function to parse a rules' string. + * Ex: required|number|max_length[30] + * + * @method _parseRules + * @param {String} rules String with the rules + * @private + */ + _parseRules: function( rules ){ + this._rules = {}; + rules = rules.split("|"); + var i, rulesLength = rules.length, rule, params, paramStartPos ; + if( rulesLength > 0 ){ + for( i = 0; i < rulesLength; i++ ){ + rule = rules[i]; + if( !rule ){ + continue; + } + + if( ( paramStartPos = rule.indexOf('[') ) !== -1 ){ + params = rule.substr( paramStartPos+1 ); + params = params.split(']'); + params = params[0]; + params = params.split(','); + for (var p = 0, len = params.length; p < len; p++) { + params[p] = + params[p] === 'true' ? true : + params[p] === 'false' ? false : + params[p]; + } + params.splice(0,0,this.getValue()); + + rule = rule.substr(0,paramStartPos); + + this._rules[rule] = params; + } else { + this._rules[rule] = [this.getValue()]; + } + } + } + }, + + /** + * Function to add an error to the FormElement's 'errors' object. + * It basically receives the rule where the error occurred, the parameters passed to it (if any) + * and the error message. + * Then it replaces some tokens in the message for a more 'custom' reading + * + * @method _addError + * @param {String|null} rule Rule that failed, or null if no rule was found. + * @private + * @static + */ + _addError: function(rule){ + var params = this._rules[rule] || []; + + var paramObj = { + field: this._options.label, + value: this.getValue() + }; + + for( var i = 1; i < params.length; i++ ){ + paramObj['param' + i] = params[i]; + } + + var i18nKey = 'formvalidator.' + rule; + + this._errors[rule] = validationMessages.text(i18nKey, paramObj); + + if (this._errors[rule] === i18nKey) { + this._errors[rule] = 'Validation message not found'; + } + }, + + /** + * Function to retrieve the element's value + * + * @method getValue + * @return {mixed} The DOM Element's value + * @public + */ + getValue: function(){ + + switch(this._element.nodeName.toLowerCase()){ + case 'select': + return Ink.s('option:selected',this._element).value; + case 'textarea': + return this._element.innerHTML; + case 'input': + if( "type" in this._element ){ + if( (this._element.type === 'radio') && (this._element.type === 'checkbox') ){ + if( this._element.checked ){ + return this._element.value; + } + } else if( this._element.type !== 'file' ){ + return this._element.value; + } + } else { + return this._element.value; + } + return; + default: + return this._element.innerHTML; + } + }, + + /** + * Function that returns the constructed errors object. + * + * @method getErrors + * @return {Object} Errors' object + * @public + */ + getErrors: function(){ + return this._errors; + }, + + /** + * Function that returns the DOM element related to it. + * + * @method getElement + * @return {Object} DOM Element + * @public + */ + getElement: function(){ + return this._element; + }, + + /** + * Get other elements in the same form. + * + * @method getFormElements + * @return {Object} A mapping of keys to other elements in this form. + * @public + */ + getFormElements: function () { + return this._options.form._formElements; + }, + + /** + * Function used to validate the element based on the rules defined. + * It parses the rules defined in the _options.rules property. + * + * @method validate + * @return {Boolean} True if every rule was valid. False if one fails. + * @public + */ + validate: function(){ + this._errors = {}; + + if( "rules" in this._options || 1){ + this._parseRules( this._options.rules ); + } + + if( ("required" in this._rules) || (this.getValue() !== '') ){ + for(var rule in this._rules) { + if (this._rules.hasOwnProperty(rule)) { + if( (typeof validationFunctions[rule] === 'function') ){ + if( validationFunctions[rule].apply(this, this._rules[rule] ) === false ){ + + this._addError( rule ); + return false; + + } + + } else { + + this._addError( null ); + return false; + } + } + } + } + + return true; + + } + }; + + + + /** + * @class Ink.UI.FormValidator_2 + * @version 2 + * @constructor + * @param {String|DOMElement} selector Either a CSS Selector string, or the form's DOMElement + * @param {String} [options.eventTrigger='submit'] What event do we listen for. + * @param {Boolean} [options.neverSubmit=false] Always cancel the event? Use this to avoid submitting the form. + * @param {Selector} [options.searchFor='input, select, textarea, .control-group'] Look in these inputs for validation data-attributes. + * @param {Function} [options.beforeValidation] Callback to be executed before validating the form + * @param {Function} [options.onError] Validation error callback + * @param {Function} [options.onSuccess] Validation success callback + * + * @example + * Ink.requireModules( ['Ink.UI.FormValidator_2'], function( FormValidator ){ + * var myValidator = new FormValidator( '#my-form' ); + * }); + */ + var FormValidator = function( selector, options ){ + + /** + * DOMElement of the
      being validated + * + * @property _rootElement + * @type {DOMElement} + */ + this._rootElement = Common.elOrSelector( selector ); + + /** + * Object that will gather the form elements by name + * + * @property _formElements + * @type {Object} + */ + this._formElements = {}; + + /** + * Error message DOMElements + * + * @property _errorMessages + */ + this._errorMessages = []; + + /** + * Array of elements marked with validation errors + * + * @property _markedErrorElements + */ + this._markedErrorElements = []; + + /** + * Configuration options. Fetches the data attributes first, then the ones passed when executing the constructor. + * By doing that, the latter will be the one with highest priority. + * + * @property _options + * @type {Object} + */ + this._options = Ink.extendObj({ + eventTrigger: 'submit', + neverSubmit: 'false', + searchFor: 'input, select, textarea, .control-group', + beforeValidation: undefined, + onError: undefined, + onSuccess: undefined + },Element.data(this._rootElement)); + + this._options = Ink.extendObj( this._options, options || {} ); + + // Sets an event listener for a specific event in the form, if defined. + // By default is the 'submit' event. + if( typeof this._options.eventTrigger === 'string' ){ + Event.observe( this._rootElement,this._options.eventTrigger, Ink.bindEvent(this.validate,this) ); + } + + this._init(); + }; + + /** + * Method used to set validation functions (either custom or ovewrite the existent ones) + * + * @method setRule + * @param {String} name Name of the function. E.g. 'required' + * @param {String} errorMessage Error message to be displayed in case of returning false. E.g. 'Oops, you passed {param1} as parameter1, lorem ipsum dolor...' + * @param {Function} cb Function to be executed when calling this rule + * @public + * @static + */ + FormValidator.setRule = function( name, errorMessage, cb ){ + validationFunctions[ name ] = cb; + if (validationMessages.getKey('formvalidator.' + name) !== errorMessage) { + var langObj = {}; langObj['formvalidator.' + name] = errorMessage; + var dictObj = {}; dictObj[validationMessages.lang()] = langObj; + validationMessages.append(dictObj); + } + }; + + /** + * Get the i18n object in charge of the error messages + * + * @method getI18n + * @return {Ink.Util.I18n} The i18n object the FormValidator is using. + */ + FormValidator.getI18n = function () { + return validationMessages; + }; + + /** + * Sets the I18n object for validation error messages + * + * @method setI18n + * @param {Ink.Util.I18n} i18n The I18n object. + */ + FormValidator.setI18n = function (i18n) { + validationMessages = i18n; + }; + + /** + * Add to the I18n dictionary. See `Ink.Util.I18n.append()` documentation. + * + * @method AppendI18n + */ + FormValidator.appendI18n = function () { + validationMessages.append.apply(validationMessages, [].slice.call(arguments)); + }; + + /** + * Sets the language of the error messages. pt_PT and en_US are available, but you can add new languages by using append() + * + * See the `Ink.Util.I18n.lang()` setter + * + * @method setLanguage + * @param language The language to set i18n to. + */ + FormValidator.setLanguage = function (language) { + validationMessages.lang(language); + }; + + /** + * Method used to get the existing defined validation functions + * + * @method getRules + * @return {Object} Object with the rules defined + * @public + * @static + */ + FormValidator.getRules = function(){ + return validationFunctions; + }; + + FormValidator.prototype = { + _init: function(){ + + }, + + /** + * Function that searches for the elements of the form, based in the + * this._options.searchFor configuration. + * + * @method getElements + * @return {Object} An object with the elements in the form, indexed by name/id + * @public + */ + getElements: function(){ + this._formElements = {}; + var formElements = Selector.select( this._options.searchFor, this._rootElement ); + if( formElements.length ){ + var i, element; + for( i=0; i'); + this._errorMessages.push(paragraph); + }, this)); + return false; + } + } + }; + + /** + * Returns the FormValidator's Object + */ + return FormValidator; + +}); + +/** + * @module Ink.UI.ImageQuery_1 + * @author inkdev AT sapo.pt + * @version 1 + */ +Ink.createModule('Ink.UI.ImageQuery', '1', ['Ink.UI.Common_1','Ink.Dom.Event_1','Ink.Dom.Element_1','Ink.Util.Array_1'], function(Common, Event, Element, InkArray ) { + 'use strict'; + + /** + * @class Ink.UI.ImageQuery + * @constructor + * @version 1 + * + * @param {String|DOMElement} selector + * @param {Object} [options] Options + * @param {String|Function} [options.src] String or Callback function (that returns a string) with the path to be used to get the images. + * @param {String|Function} [options.retina] String or Callback function (that returns a string) with the path to be used to get RETINA specific images. + * @param {Array} [options.queries] Array of queries + * @param {String} [options.queries.label] Label of the query. Ex. 'small' + * @param {Number} [options.queries.width] Min-width to use this query + * @param {Function} [options.onLoad] Date format string + * + * @example + *
      + * + *
      + * + */ + var ImageQuery = function(selector, options){ + + /** + * Get elements, create more ImageQueries if selector finds more than one + * + * [improvement] This is a useful pattern. More UI modules could use it. + */ + this._element = Common.elsOrSelector(selector, 'Ink.UI.ImageQuery', /*required=*/true); + + // In case we have several elements + for (var i = 1 /* start from second element*/; i < this._element.length; i++) { + new ImageQuery(this._element[i], options); + } + + this._element = this._element[0]; + + /** + * Default options, overriden by data-attributes if any. + * The parameters are: + * @param {array} queries Array of objects that determine the label/name and its min-width to be applied. + * @param {boolean} allowFirstLoad Boolean flag to allow the loading of the first element. + */ + this._options = Ink.extendObj({ + queries:[], + onLoad: null + }, options || {}, Element.data(this._element)); + + /** + * Determining the original basename (with the querystring) of the file. + */ + var pos; + if( (pos=this._element.src.lastIndexOf('?')) !== -1 ){ + var search = this._element.src.substr(pos); + this._filename = this._element.src.replace(search,'').split('/').pop()+search; + } else { + this._filename = this._element.src.split('/').pop(); + } + + this._init(); + }; + + ImageQuery.prototype = { + + /** + * Init function called by the constructor + * + * @method _init + * @private + */ + _init: function(){ + // Sort queries by width, in descendant order. + this._options.queries = InkArray.sortMulti(this._options.queries, 'width').reverse(); + + if( typeof this._options.onLoad === 'function' ){ + Event.observe(this._element, 'onload', Ink.bindEvent(this._onLoad, this)); + } + + Event.observe(window, 'resize', Ink.bindEvent(this._onResize, this)); + + // Imediate call to apply the right images based on the current viewport + this._onResize(); + }, + + /** + * Handles the resize event (as specified in the _init function) + * + * @method _onResize + * @private + */ + _onResize: Event.throttle(function(){ + if( !this._options.queries.length ){ + return; + } + + var current = this._findCurrentQuery(); + + /** + * Choosing the right src. The rule is: + * + * "If there is specifically defined in the query object, use that. Otherwise uses the global src." + * + * The above rule applies to a retina src. + */ + var src = current.src || this._options.src; + if ( window.devicePixelRatio > 1 && ('retina' in this._options ) ) { + src = current.retina || this._options.retina; + } + + /** + * Injects the file variable for usage in the 'templating system' below + */ + current.file = this._filename; + + /** + * Since we allow the src to be a callback, let's run it and get the results. + * For the inside, we're passing the element (img) being processed and the object of the selected + * query. + */ + if( typeof src === 'function' ){ + src = src.apply(this,[this._element,current]); + if( typeof src !== 'string' ){ + throw '[ImageQuery] :: "src" callback does not return a string'; + } + } + + /** + * Replace the values of the existing properties on the query object (except src and retina) in the + * defined src and/or retina. + */ + src = src.replace(/{:(.*?)}/g, function(_, prop) { + return current[prop]; + }); + + this._element.src = src; + + // Removes the injected file property + delete current.file; + }, 500), + + /** + * Queries are in a descendant order. We want to find the query with the highest width that fits + * the viewport, therefore the first one. + */ + _findCurrentQuery: function () { + /** + * Gets viewport width + */ + var viewportWidth = window.innerWidth || + document.documentElement.clientWidth || + document.body.clientWidth; + + var queries = this._options.queries; + var last = queries.length - 1; + + for( var query=0; query < last; query+=1 ){ + if (queries[query].width <= viewportWidth){ + return queries[query]; + } + } + + return queries[last]; + }, + + /** + * Handles the element loading (img onload) event + * + * @method _onLoad + * @private + */ + _onLoad: function(){ + + /** + * Since we allow a callback for this let's run it. + */ + this._options.onLoad.call(this); + } + + }; + + return ImageQuery; + +}); + +/** + * @module Ink.UI.Modal_1 + * @author inkdev AT sapo.pt + * @version 1 + */ +Ink.createModule('Ink.UI.Modal', '1', ['Ink.UI.Common_1','Ink.Dom.Event_1','Ink.Dom.Css_1','Ink.Dom.Element_1','Ink.Dom.Selector_1','Ink.Util.Array_1'], function(Common, Event, Css, InkElement, Selector, InkArray ) { + 'use strict'; + + var opacitySupported = (function (div) { + div.style.opacity = 'invalid'; + return div.style.opacity !== 'invalid'; + }(InkElement.create('div', {style: 'opacity: 1'}))); + + /** + * @class Ink.UI.Modal + * @constructor + * @version 1 + * @param {String|DOMElement} selector + * @param {Object} [options] Options + * @param {String} [options.width] Default/Initial width. Ex: '600px' + * @param {String} [options.height] Default/Initial height. Ex: '400px' + * @param {String} [options.shadeClass] Custom class to be added to the div.ink-shade + * @param {String} [options.modalClass] Custom class to be added to the div.ink-modal + * @param {String} [options.trigger] CSS Selector to target elements that will trigger the Modal. + * @param {String} [options.triggerEvent] Trigger's event to be listened. 'click' is the default value. Ex: 'mouseover', 'touchstart'... + * @param {Boolean} [options.autoDisplay=true] Display the Modal automatically when constructed. + * @param {String} [options.markup] Markup to be placed in the Modal when created + * @param {Function} [options.onShow] Callback function to run when the Modal is opened. + * @param {Function} [options.onDismiss] Callback function to run when the Modal is closed. Return `false` to cancel dismissing the Modal. + * @param {Boolean} [options.closeOnClick=false] Determines if the Modal should close when clicked outside of it. + * @param {Boolean} [options.closeOnEscape=true] Determines if the Modal should close when "Esc" key is pressed. + * @param {Boolean} [options.responsive] Determines if the Modal should behave responsively (adapt to smaller viewports). + * @param {Boolean} [options.disableScroll] Determines if the Modal should 'disable' the page's scroll (not the Modal's body). + * + * @example + *
      + *
      + * + * + * + *
      + *
      + * Open modal + * + */ + + function upName(dimension) { + // omg IE + var firstCharacter = dimension.match(/^./)[0]; + return firstCharacter.toUpperCase() + dimension.replace(/^./, ''); + } + function maxName(dimension) { + return 'max' + upName(dimension); + } + + var openModals = []; + + var Modal = function(selector, options) { + if (!selector) { + this._element = null; + } else { + this._element = Common.elOrSelector(selector, 'Ink.UI.Modal markup'); + } + + this._options = { + /** + * Width, height and markup really optional, as they can be obtained by the element + */ + width: undefined, + height: undefined, + + /** + * To add extra classes + */ + shadeClass: undefined, + modalClass: undefined, + + /** + * Optional trigger properties + */ + trigger: undefined, + triggerEvent: 'click', + autoDisplay: true, + + /** + * Remaining options + */ + markup: undefined, + onShow: undefined, + onDismiss: undefined, + closeOnClick: false, + closeOnEscape: true, + responsive: true, + disableScroll: true + }; + + + this._handlers = { + click: Ink.bindEvent(this._onShadeClick, this), + keyDown: Ink.bindEvent(this._onKeyDown, this), + resize: Ink.bindEvent(this._onResize, this) + }; + + this._wasDismissed = false; + + /** + * Modal Markup + */ + if( this._element ){ + this._markupMode = Css.hasClassName(this._element,'ink-modal'); // Check if the full modal comes from the markup + } else { + this._markupMode = false; + } + + if( !this._markupMode ){ + this._modalShadow = document.createElement('div'); + this._modalShadowStyle = this._modalShadow.style; + + this._modalDiv = document.createElement('div'); + this._modalDivStyle = this._modalDiv.style; + + if( !!this._element ){ + this._options.markup = this._element.innerHTML; + } + + /** + * Not in full markup mode, let's set the classes and css configurations + */ + Css.addClassName( this._modalShadow,'ink-shade' ); + Css.addClassName( this._modalDiv,'ink-modal ink-space' ); + + /** + * Applying the main css styles + */ + // this._modalDivStyle.position = 'absolute'; + this._modalShadow.appendChild( this._modalDiv); + document.body.appendChild( this._modalShadow ); + } else { + this._modalDiv = this._element; + this._modalDivStyle = this._modalDiv.style; + this._modalShadow = this._modalDiv.parentNode; + this._modalShadowStyle = this._modalShadow.style; + + this._contentContainer = Selector.select(".modal-body", this._modalDiv)[0]; + if( !this._contentContainer){ + throw new Error('Ink.UI.Modal: Missing div with class "modal-body"'); + } + + this._options.markup = this._contentContainer.innerHTML; + + /** + * First, will handle the least important: The dataset + */ + this._options = Ink.extendObj(this._options,InkElement.data(this._element)); + + } + + /** + * Now, the most important, the initialization options + */ + this._options = Ink.extendObj(this._options,options || {}); + + if( !this._markupMode ){ + this.setContentMarkup(this._options.markup); + } + + if( typeof this._options.shadeClass === 'string' ){ + Css.addClassName(this._modalShadow, this._options.shadeClass); + } + + if( typeof this._options.modalClass === 'string' ){ + Css.addClassName(this._modalDiv, this._options.modalClass); + } + + if( ("trigger" in this._options) && ( typeof this._options.trigger !== 'undefined' ) ){ + var triggerElement; + if( typeof this._options.trigger === 'string' ){ + triggerElement = Selector.select( this._options.trigger ); + Event.observeMulti(triggerElement, this._options.triggerEvent, Ink.bindEvent(this.open, this)); + } + } else if ( this._options.autoDisplay.toString() === "true" ) { + this.open(); + } + }; + + Modal.prototype = { + + /** + * Responsible for repositioning the modal + * + * @method _reposition + * @private + */ + _reposition: function(){ + this._modalDivStyle.marginTop = (-InkElement.elementHeight(this._modalDiv)/2) + 'px'; + this._modalDivStyle.marginLeft = (-InkElement.elementWidth(this._modalDiv)/2) + 'px'; + }, + + /** + * Responsible for resizing the modal + * + * @method _onResize + * @param {Boolean|Event} runNow Its executed in the begining to resize/reposition accordingly to the viewport. But usually it's an event object. + * @private + */ + _onResize: function( runNow ){ + if( typeof runNow === 'boolean' ){ + this._timeoutResizeFunction.call(this); + } else if( !this._resizeTimeout && (runNow && typeof runNow === 'object') ){ + this._resizeTimeout = setTimeout(Ink.bind(this._timeoutResizeFunction, this),250); + } + }, + + /** + * Timeout Resize Function + * + * @method _timeoutResizeFunction + * @private + */ + _timeoutResizeFunction: function(){ + /** + * Getting the current viewport size + */ + var isPercentage = { + width: ('' + this._options.width).indexOf('%') !== -1, + height: ('' + this._options.height).indexOf('%') !== -1 + }; + var currentViewport = { + height: InkElement.viewportHeight(), + width: InkElement.viewportWidth() + }; + + InkArray.forEach(['height', 'width'], Ink.bind(function (dimension) { + // Not used for percentage measurements + if (isPercentage[dimension]) { return; } + + if (currentViewport[dimension] > this.originalStatus[dimension]) { + this._modalDivStyle[dimension] = this._modalDivStyle[maxName(dimension)]; + } else { + this._modalDivStyle[dimension] = Math.round(currentViewport[dimension] * 0.9) + 'px'; + } + }, this)); + + this._resizeContainer(); + this._reposition(); + this._resizeTimeout = undefined; + }, + + /** + * Handle clicks on the shade element. + * + * @method _onShadeClick + * @param {Event} ev + * @private + */ + _onShadeClick: function(ev) { + var tgtEl = Event.element(ev); + + if (Css.hasClassName(tgtEl, 'ink-close') || Css.hasClassName(tgtEl, 'ink-dismiss') || + InkElement.findUpwardsBySelector(tgtEl, '.ink-close,.ink-dismiss') || + ( + this._options.closeOnClick && + (!InkElement.descendantOf(this._shadeElement, tgtEl) || (tgtEl === this._shadeElement)) + ) + ) { + var alertsInTheModal = Selector.select('.ink-alert', this._shadeElement), + alertsLength = alertsInTheModal.length; + for( var i = 0; i < alertsLength; i++ ){ + if( InkElement.descendantOf(alertsInTheModal[i], tgtEl) ){ + return; + } + } + + this.dismiss(); + + // Only stop the event if this dismisses this modal + if (this._wasDismissed) { + Event.stop(ev); + } + } + }, + + /** + * Responsible for handling the escape key pressing. + * + * @method _onKeyDown + * @param {Event} ev + * @private + */ + _onKeyDown: function(ev) { + if (ev.keyCode !== 27 || this._wasDismissed) { return; } + if (this._options.closeOnEscape.toString() === 'true' && + openModals[openModals.length - 1] === this) { + this.dismiss(); + if (this._wasDismissed) { + Event.stop(ev); + } + } + }, + + /** + * Responsible for setting the size of the modal (and position) based on the viewport. + * + * @method _resizeContainer + * @private + */ + _resizeContainer: function() { + // [3.0.0] drop this because everyone should have the new CSS now, which has this rule already with .ink-modal-is-open. + this._contentElement.style.overflow = this._contentElement.style.overflowX = this._contentElement.style.overflowY = 'hidden'; + var containerHeight = InkElement.elementHeight(this._modalDiv); + + this._modalHeader = Selector.select('.modal-header',this._modalDiv)[0]; + if( this._modalHeader ){ + containerHeight -= InkElement.elementHeight(this._modalHeader); + } + + this._modalFooter = Selector.select('.modal-footer',this._modalDiv)[0]; + if( this._modalFooter ){ + containerHeight -= InkElement.elementHeight(this._modalFooter); + } + + this._contentContainer.style.height = containerHeight + 'px'; + if( containerHeight !== InkElement.elementHeight(this._contentContainer) ){ + this._contentContainer.style.height = ~~(containerHeight - (InkElement.elementHeight(this._contentContainer) - containerHeight)) + 'px'; + } + + if( this._markupMode ){ return; } + + this._contentContainer.style.overflow = this._contentContainer.style.overflowX = 'hidden'; + this._contentContainer.style.overflowY = 'auto'; + this._contentElement.style.overflow = this._contentElement.style.overflowX = this._contentElement.style.overflowY = 'visible'; + }, + + /** + * Responsible for 'disabling' the page scroll + * + * @method _disableScroll + * @private + */ + _disableScroll: function() { + var htmlEl = document.documentElement; + this._oldHtmlOverflows = [ htmlEl.style.overflowX, + htmlEl.style.overflowY ]; + htmlEl.style.overflowX = htmlEl.style.overflowY = 'hidden'; + }, + + /************** + * PUBLIC API * + **************/ + + /** + * Display this Modal. Useful if you have initialized the modal + * @method open + * @param {Event} [event] (internal) In case its fired by the internal trigger. + */ + open: function(event) { + + if( event ){ Event.stop(event); } + + var elem = (document.compatMode === "CSS1Compat") ? document.documentElement : document.body; + + this._resizeTimeout = null; + + Css.addClassName( this._modalShadow,'ink-shade' ); + this._modalShadowStyle.display = this._modalDivStyle.display = 'block'; + setTimeout(Ink.bind(function() { + Css.addClassName( this._modalShadow, 'visible' ); + Css.addClassName( this._modalDiv, 'visible' ); + }, this), 100); + + /** + * Fallback to the old one + */ + this._contentElement = this._modalDiv; + this._shadeElement = this._modalShadow; + + if( !this._markupMode ){ + /** + * Setting the content of the modal + */ + this.setContentMarkup( this._options.markup ); + } + + /** + * If any size has been user-defined, let's set them as max-width and max-height + */ + + var isPercentage = { + width: ('' + this._options.width).indexOf('%') !== -1, + height: ('' + this._options.height).indexOf('%') !== -1 + }; + + InkArray.forEach(['width', 'height'], Ink.bind(function (dimension) { + if (this._options[dimension] !== undefined) { + this._modalDivStyle[dimension] = this._options[dimension]; + if (!isPercentage[dimension]) { + this._modalDivStyle[maxName(dimension)] = + InkElement['element' + upName(dimension)](this._modalDiv) + 'px'; + } + } else { + this._modalDivStyle[maxName(dimension)] = InkElement['element' + upName(dimension)](this._modalDiv) + 'px'; + } + + if (isPercentage[dimension] && parseInt(elem['client' + maxName(dimension)], 10) <= parseInt(this._modalDivStyle[dimension], 10) ) { + this._modalDivStyle[dimension] = Math.round(parseInt(elem['client' + maxName(dimension)], 10) * 0.9) + 'px'; + } + }, this)); + + this.originalStatus = { + viewportHeight: InkElement.elementHeight(elem), + viewportWidth: InkElement.elementWidth(elem), + height: InkElement.elementHeight(this._modalDiv), + width: InkElement.elementWidth(this._modalDiv) + }; + + /** + * Let's 'resize' it: + */ + if( this._options.responsive.toString() === 'true' ) { + this._onResize(true); + Event.observe( window,'resize',this._handlers.resize ); + } else { + this._resizeContainer(); + this._reposition(); + } + + if (this._options.onShow) { + this._options.onShow(this); + } + + if(this._options.disableScroll.toString() === 'true') { + this._disableScroll(); + } + + // subscribe events + Event.observe(this._shadeElement, 'click', this._handlers.click); + if (this._options.closeOnEscape.toString() === 'true') { + Event.observe(document, 'keydown', this._handlers.keyDown); + } + + Common.registerInstance(this, this._shadeElement, 'modal'); + + this._wasDismissed = false; + openModals.push(this); + + Css.addClassName(document.documentElement, 'ink-modal-is-open'); + }, + + /** + * Dismisses the modal + * + * @method dismiss + * @public + */ + dismiss: function() { + if (this._wasDismissed) { /* Already dismissed. WTF IE. */ return; } + + if (this._options.onDismiss) { + var ret = this._options.onDismiss(this); + if (ret === false) { return; } + } + + this._wasDismissed = true; + + if( this._options.responsive ){ + Event.stopObserving(window, 'resize', this._handlers.resize); + } + + // this._modalShadow.parentNode.removeChild(this._modalShadow); + + if( !this._markupMode ){ + this._modalShadow.parentNode.removeChild(this._modalShadow); + this.destroy(); + } else { + Css.removeClassName( this._modalDiv, 'visible' ); + Css.removeClassName( this._modalShadow, 'visible' ); + + this._waitForFade(this._modalShadow, Ink.bind(function () { + this._modalShadowStyle.display = 'none'; + }, this)); + } + + openModals = InkArray.remove(openModals, InkArray.keyValue(this, openModals), 1); + + if (openModals.length === 0) { // Document level stuff now there are no modals in play. + var htmlEl = document.documentElement; + + // Reenable scroll + if(this._options.disableScroll) { + htmlEl.style.overflowX = this._oldHtmlOverflows[0]; + htmlEl.style.overflowY = this._oldHtmlOverflows[1]; + } + + // Remove the class from the HTML element. + Css.removeClassName(htmlEl, 'ink-modal-is-open'); + } + }, + + /** + * Utility function to listen to the onTransmissionEnd event, or wait using setTimeouts + * + * Specific to this._element + */ + _waitForFade: function (elem, callback) { + if (!opacitySupported) { return callback(); } + + var transitionEndEventNames = [ + 'transitionEnd', 'oTransitionEnd', 'webkitTransitionEnd']; + var classicName; + var evName; + for (var i = 0, len = transitionEndEventNames.length; i < len; i++) { + evName = transitionEndEventNames[i]; + classicName = 'on' + evName.toLowerCase(); + if (classicName in elem) { + Event.observeOnce(elem, evName, callback); + return; + } + } + var fadeChecker = function () { + if( +Css.getStyle(elem, 'opacity') > 0 ){ + setTimeout(fadeChecker, 250); + } else { + callback(); + } + }; + setTimeout(fadeChecker, 500); + }, + + /** + * Removes the modal from the DOM + * + * @method destroy + * @public + */ + destroy: function() { + Common.unregisterInstance(this._instanceId); + }, + + /** + * Returns the content DOM element + * + * @method getContentElement + * @return {DOMElement} Modal main cointainer. + * @public + */ + getContentElement: function() { + return this._contentContainer; + }, + + /** + * Replaces the content markup + * + * @method setContentMarkup + * @param {String} contentMarkup + * @public + */ + setContentMarkup: function(contentMarkup) { + if( !this._markupMode ){ + this._modalDiv.innerHTML = [contentMarkup].join(''); + this._contentContainer = Selector.select(".modal-body",this._modalDiv); + if( !this._contentContainer.length ){ + // throw 'Missing div with class "modal-body"'; + var tempHeader = Selector.select(".modal-header",this._modalDiv); + var tempFooter = Selector.select(".modal-footer",this._modalDiv); + + InkArray.each(tempHeader, InkElement.remove); + InkArray.each(tempFooter, InkElement.remove); + + var body = document.createElement('div'); + Css.addClassName(body,'modal-body'); + body.innerHTML = this._modalDiv.innerHTML; + this._modalDiv.innerHTML = ''; + + var toAdd = tempHeader.concat([body]).concat(tempFooter); + InkArray.each(toAdd, Ink.bindMethod(this._modalDiv, 'appendChild')); + + // InkArray.each(tempHeader,Ink.bind(function( element ){ this._modalDiv.appendChild(element); },this)); + // this._modalDiv.appendChild(body); + // InkArray.each(tempFooter,Ink.bind(function( element ){ this._modalDiv.appendChild(element); },this)); + + this._contentContainer = Selector.select(".modal-body",this._modalDiv); + } + this._contentContainer = this._contentContainer[0]; + } else { + this._contentContainer.innerHTML = contentMarkup; + } + this._contentElement = this._modalDiv; + this._resizeContainer(); + } + + }; + + return Modal; + +}); + +/** + * @module Ink.UI.Pagination_1 + * @author inkdev AT sapo.pt + * @version 1 + */ +Ink.createModule('Ink.UI.Pagination', '1', + ['Ink.UI.Common_1','Ink.Dom.Event_1','Ink.Dom.Css_1','Ink.Dom.Element_1','Ink.Dom.Selector_1'], + function(Common, Event, Css, Element, Selector ) { + 'use strict'; + + /** + * Function to create the pagination anchors + * + * @method genAel + * @param {String} inner HTML to be placed inside the anchor. + * @return {DOMElement} Anchor created + */ + var genAEl = function(inner, index) { + var aEl = document.createElement('a'); + aEl.setAttribute('href', '#'); + if (index !== undefined) { + aEl.setAttribute('data-index', index); + } + aEl.innerHTML = inner; + return aEl; + }; + + /** + * @class Ink.UI.Pagination + * @constructor + * @version 1 + * @param {String|DOMElement} selector + * @param {Object} options Options + * @param {Number} [options.size] number of pages. + * @param {Number} [options.totalItemCount] Total numeber of items to display + * @param {Number} [options.itemsPerPage] number of items per page. + * @param {Number} [options.maxSize] If passed, only shows at most maxSize items. displays also first|prev page and next page|last buttons + * @param {Number} [options.start] start page. defaults to 1 + * @param {String} [options.firstLabel] label to display on first page button + * @param {String} [options.lastLabel] label to display on last page button + * @param {String} [options.previousLabel] label to display on previous button + * @param {String} [options.nextLabel] label to display on next button + * @param {String} [options.previousPageLabel] label to display on previous page button + * @param {String} [options.nextPageLabel] label to display on next page button + * @param {Function} [options.onChange] optional callback. Called with `(thisPaginator, newPageNumber)`. + * @param {String} [options.hashParameter] parameter to use on setHash. by default uses 'page' + * @param {String} [options.parentTag] HTML Tag used as the parent node. + * @param {String} [options.childTag] HTML Tag used as the child nodes. + * @param {String} [options.wrapperClass] CSS Class used in the wrapper element + * @param {String} [options.paginationClass] CSS Class used in the pagination element + * @param {String} [options.activeClass] CSS Class used to mark page as active + * @param {String} [options.disabledClass] CSS Class used to mark page as disabled + * @param {String} [options.hideClass] CSS Class used to hide elements + * @param {String} [options.previousClass] CSS Class used in the previous element + * @param {String} [options.previousPageClass] CSS Class used in the previous page element + * @param {String} [options.nextClass] CSS Class used in the next element + * @param {String} [options.nextPageClass] CSS Class used in the next page element + * @param {Function} [options.numberFormatter] optional function which takes and 0-indexed number and returns the string which appears on a numbered button + */ + var Pagination = function(selector, options) { + + this._element = Common.elOrSelector(selector, 'Ink.UI.Pagination element'); + + this._options = Common.options('Ink.UI.Pagination_1', { + size: ['Integer', null], + totalItemCount: ['Integer', null], + itemsPerPage: ['Integer', null], + maxSize: ['Integer', null], + start: ['Integer', 1], + firstLabel: ['String', 'First'], + lastLabel: ['String', 'Last'], + previousLabel: ['String', 'Previous'], + nextLabel: ['String', 'Next'], + previousPageLabel: ['String', null], + nextPageLabel: ['String', null], + onChange: ['Function', undefined], + hashParameter: ['String', 'page'], + parentTag: ['String', 'ul'], + childTag: ['String', 'li'], + wrapperClass: ['String', 'ink-navigation'], + paginationClass: ['String', 'pagination'], + activeClass: ['String', 'active'], + disabledClass: ['String', 'disabled'], + hideClass: ['String', 'hide-all'], + previousClass: ['String', 'previous'], + previousPageClass: ['String', 'previousPage'], + nextClass: ['String', 'next'], + nextPageClass: ['String', 'nextPage'], + + numberFormatter: ['Function', function(i) { return i + 1; }] + }, options || {}, this._element); + + if (!this._options.previousPageLabel) { + this._options.previousPageLabel = this._options.previousLabel + ' ' + this._options.maxSize; + } + + if (!this._options.nextPageLabel) { + this._options.nextPageLabel = this._options.nextLabel + ' ' + this._options.maxSize; + } + + this._handlers = { + click: Ink.bindEvent(this._onClick,this) + }; + + if (Common.isInteger(this._options.totalItemCount) && Common.isInteger(this._options.itemsPerPage)) { + this._size = Math.ceil(this._options.totalItemCount / this._options.itemsPerPage); + } else if (Common.isInteger(this._options.size)) { + this._size = this._options.size; + } else { + throw new TypeError('Ink.UI.Pagination: Please supply a size option or totalItemCount and itemsPerPage options.'); + } + + if (!Common.isInteger(this._options.start) && this._options.start > 0 && this._options.start <= this._size) { + throw new TypeError('start option is a required integer between 1 and size!'); + } + + if (this._options.maxSize && !Common.isInteger(this._options.maxSize) && this._options.maxSize > 0) { + throw new TypeError('maxSize option is a positive integer!'); + } + + else if (this._size < 0) { + throw new RangeError('size option must be equal or more than 0!'); + } + + this.setOnChange(this._options.onChange); + + this._current = this._options.start - 1; + this._itemLiEls = []; + + this._init(); + }; + + Pagination.prototype = { + + /** + * Init function called by the constructor + * + * @method _init + * @private + */ + _init: function() { + // generate and apply DOM + this._generateMarkup(this._element); + + this._updateItems(); + + // subscribe events + this._observe(); + + Common.registerInstance(this, this._element, 'pagination'); + }, + + /** + * Responsible for setting listener in the 'click' event of the Pagination element. + * + * @method _observe + * @private + */ + _observe: function() { + Event.observeDelegated(this._element, 'click', '.' + this._options.paginationClass + ' > ' + this._options.childTag, this._handlers.click); + }, + + /** + * Updates the markup everytime there's a change in the Pagination object. + * + * @method _updateItems + * @private + */ + _updateItems: function() { + var liEls = this._itemLiEls; + + var isSimpleToggle = this._size === liEls.length; + + var i, f, liEl; + + if (isSimpleToggle) { + // just toggle active class + for (i = 0, f = this._size; i < f; ++i) { + Css.setClassName(liEls[i], this._options.activeClass, i === this._current); + } + } + else { + // remove old items + for (i = liEls.length - 1; i >= 0; --i) { + this._ulEl.removeChild(liEls[i]); + } + + // add new items + liEls = []; + for (i = 0, f = this._size; i < f; ++i) { + liEl = document.createElement(this._options.childTag); + liEl.appendChild( genAEl( this._options.numberFormatter(i), i) ); + Css.setClassName(liEl, this._options.activeClass, i === this._current); + this._ulEl.insertBefore(liEl, this._nextEl); + liEls.push(liEl); + } + this._itemLiEls = liEls; + } + + if (this._options.maxSize) { + // toggle visible items + var page = Math.floor( this._current / this._options.maxSize ); + var pi = this._options.maxSize * page; + var pf = pi + this._options.maxSize - 1; + + for (i = 0, f = this._size; i < f; ++i) { + liEl = liEls[i]; + Css.setClassName(liEl, this._options.hideClass, i < pi || i > pf); + } + + this._pageStart = pi; + this._pageEnd = pf; + this._page = page; + + Css.setClassName(this._prevPageEl, this._options.disabledClass, !this.hasPreviousPage()); + Css.setClassName(this._nextPageEl, this._options.disabledClass, !this.hasNextPage()); + + Css.setClassName(this._firstEl, this._options.disabledClass, this.isFirst()); + Css.setClassName(this._lastEl, this._options.disabledClass, this.isLast()); + } + + // update prev and next + Css.setClassName(this._prevEl, this._options.disabledClass, !this.hasPrevious()); + Css.setClassName(this._nextEl, this._options.disabledClass, !this.hasNext()); + }, + + /** + * Returns the top element for the gallery DOM representation + * + * @method _generateMarkup + * @param {DOMElement} el + * @private + */ + _generateMarkup: function(el) { + Css.addClassName(el, 'ink-navigation'); + + var ulEl,liEl, + hasUlAlready = false; + if( ( ulEl = Selector.select('.' + this._options.paginationClass,el)).length < 1 ){ + ulEl = document.createElement(this._options.parentTag); + Css.addClassName(ulEl, this._options.paginationClass); + } else { + hasUlAlready = true; + ulEl = ulEl[0]; + } + + if (this._options.maxSize) { + liEl = document.createElement(this._options.childTag); + liEl.appendChild( genAEl(this._options.firstLabel) ); + this._firstEl = liEl; + Css.addClassName(liEl, this._options.firstClass); + ulEl.appendChild(liEl); + + liEl = document.createElement(this._options.childTag); + liEl.appendChild( genAEl(this._options.previousPageLabel) ); + this._prevPageEl = liEl; + Css.addClassName(liEl, this._options.previousPageClass); + ulEl.appendChild(liEl); + } + + liEl = document.createElement(this._options.childTag); + liEl.appendChild( genAEl(this._options.previousLabel) ); + this._prevEl = liEl; + Css.addClassName(liEl, this._options.previousClass); + ulEl.appendChild(liEl); + + liEl = document.createElement(this._options.childTag); + liEl.appendChild( genAEl(this._options.nextLabel) ); + this._nextEl = liEl; + Css.addClassName(liEl, this._options.nextClass); + ulEl.appendChild(liEl); + + if (this._options.maxSize) { + liEl = document.createElement(this._options.childTag); + liEl.appendChild( genAEl(this._options.nextPageLabel) ); + this._nextPageEl = liEl; + Css.addClassName(liEl, this._options.nextPageClass); + ulEl.appendChild(liEl); + + liEl = document.createElement(this._options.childTag); + liEl.appendChild( genAEl(this._options.lastLabel) ); + this._lastEl = liEl; + Css.addClassName(liEl, this._options.lastClass); + ulEl.appendChild(liEl); + } + + if( !hasUlAlready ){ + el.appendChild(ulEl); + } + + this._ulEl = ulEl; + }, + + /** + * Click handler + * + * @method _onClick + * @param {Event} ev + * @private + */ + _onClick: function(ev) { + Event.stop(ev); + + var liEl = Event.element(ev); + if ( Css.hasClassName(liEl, this._options.activeClass) || + Css.hasClassName(liEl, this._options.disabledClass) ) { return; } + + var isPrev = Css.hasClassName(liEl, this._options.previousClass); + var isNext = Css.hasClassName(liEl, this._options.nextClass); + var isPrevPage = Css.hasClassName(liEl, this._options.previousPageClass); + var isNextPage = Css.hasClassName(liEl, this._options.nextPageClass); + var isFirst = Css.hasClassName(liEl, this._options.firstClass); + var isLast = Css.hasClassName(liEl, this._options.lastClass); + + if (isFirst) { + this.setCurrent(0); + } + else if (isLast) { + this.setCurrent(this._size - 1); + } + else if (isPrevPage || isNextPage) { + this.setCurrent( (isPrevPage ? -1 : 1) * this._options.maxSize, true); + } + else if (isPrev || isNext) { + this.setCurrent(isPrev ? -1 : 1, true); + } + else { + var aElem = Ink.s('[data-index]', liEl); + var nr = parseInt( aElem.getAttribute('data-index'), 10); + this.setCurrent(nr); + } + }, + + + /** + * Allows you to subscribe to the onChange event + * + * @method setOnChange + * @param cb {Function} Callback called with `(thisPaginator, newPageNumber)`. + */ + setOnChange: function (onChange) { + if (onChange !== undefined && typeof onChange !== 'function') { + throw new TypeError('onChange option must be a function!'); + } + this._onChange = onChange; + }, + + /************** + * PUBLIC API * + **************/ + + /** + * Sets the number of pages + * + * @method setSize + * @param {Number} sz number of pages + * @public + */ + setSize: function(sz) { + if (!Common.isInteger(sz)) { + throw new TypeError('1st argument must be an integer number!'); + } + + this._size = sz; + this._updateItems(); + this._current = 0; + }, + + /** + * Calculate the number of pages, then call setSize(). + * + * @param setSizeInItems + * @param {Number} totalItems + * @param {Number} itemsPerPage + */ + setSizeInItems: function (totalItems, itemsPerPage) { + var pageNumber = Math.ceil(totalItems / itemsPerPage); + this.setSize(pageNumber); + }, + + /** + * Sets the current page + * + * @method setCurrent + * @param {Number} nr sets the current page to given number + * @param {Boolean} isRelative trueish to set relative change instead of absolute (default) + * @public + */ + setCurrent: function(nr, isRelative) { + if (!Common.isInteger(nr)) { + throw new TypeError('1st argument must be an integer number!'); + } + + if (isRelative) { + nr += this._current; + } + + if (nr > this._size - 1) { + nr = this._size - 1; + } + + if (nr < 0) { + nr = 0; + } + + this._current = nr; + this._updateItems(); + + if (this._onChange) { + this._onChange(this, nr); + } + + /*if (this._options.setHash) { + var o = {}; + o[this._options.hashParameter] = nr; + Common.setHash(o); + }*/ // undocumented option, removing + }, + + /** + * Returns the number of pages + * + * @method getSize + * @return {Number} Number of pages + * @public + */ + getSize: function() { + return this._size; + }, + + /** + * Returns current page + * + * @method getCurrent + * @return {Number} Current page + * @public + */ + getCurrent: function() { + return this._current; + }, + + /** + * Returns true iif at first page + * + * @method isFirst + * @return {Boolean} True if at first page + * @public + */ + isFirst: function() { + return this._current === 0; + }, + + /** + * Returns true iif at last page + * + * @method isLast + * @return {Boolean} True if at last page + * @public + */ + isLast: function() { + return this._current === this._size - 1; + }, + + /** + * Returns true iif has prior pages + * + * @method hasPrevious + * @return {Boolean} True if has prior pages + * @public + */ + hasPrevious: function() { + return this._current > 0; + }, + + /** + * Returns true iif has pages ahead + * + * @method hasNext + * @return {Boolean} True if has pages ahead + * @public + */ + hasNext: function() { + return this._current < this._size - 1; + }, + + /** + * Returns true iif has prior set of page(s) + * + * @method hasPreviousPage + * @return {Boolean} Returns true iif has prior set of page(s) + * @public + */ + hasPreviousPage: function() { + return this._options.maxSize && this._current > this._options.maxSize - 1; + }, + + /** + * Returns true iif has set of page(s) ahead + * + * @method hasNextPage + * @return {Boolean} Returns true iif has set of page(s) ahead + * @public + */ + hasNextPage: function() { + return this._options.maxSize && this._size - this._current >= this._options.maxSize + 1; + }, + + /** + * Unregisters the component and removes its markup from the DOM + * + * @method destroy + * @public + */ + destroy: Common.destroyComponent + }; + + return Pagination; + +}); + +/** + * @module Ink.UI.ProgressBar_1 + * @author inkdev AT sapo.pt + * @version 1 + */ +Ink.createModule('Ink.UI.ProgressBar', '1', ['Ink.Dom.Selector_1','Ink.Dom.Element_1'], function( Selector, Element ) { + 'use strict'; + + /** + * Associated to a .ink-progress-bar element, it provides the necessary + * method - setValue() - for the user to change the element's value. + * + * @class Ink.UI.ProgressBar + * @constructor + * @version 1 + * @param {String|DOMElement} selector + * @param {Object} [options] Options + * @param {Number} [options.startValue] Percentage of the bar that is filled. Range between 0 and 100. Default: 0 + * @param {Function} [options.onStart] Callback that is called when a change of value is started + * @param {Function} [options.onEnd] Callback that is called when a change of value ends + * + * @example + *
      + * I am a grey progress bar + *
      + *
      + * + */ + var ProgressBar = function( selector, options ){ + + if( typeof selector !== 'object' ){ + if( typeof selector !== 'string' ){ + throw '[Ink.UI.ProgressBar] :: Invalid selector'; + } else { + this._element = Selector.select(selector); + if( this._element.length < 1 ){ + throw "[Ink.UI.ProgressBar] :: Selector didn't find any elements"; + } + this._element = this._element[0]; + } + } else { + this._element = selector; + } + + + this._options = Ink.extendObj({ + 'startValue': 0, + 'onStart': function(){}, + 'onEnd': function(){} + },Element.data(this._element)); + + this._options = Ink.extendObj( this._options, options || {}); + this._value = this._options.startValue; + + this._init(); + }; + + ProgressBar.prototype = { + + /** + * Init function called by the constructor + * + * @method _init + * @private + */ + _init: function(){ + this._elementBar = Selector.select('.bar',this._element); + if( this._elementBar.length < 1 ){ + throw '[Ink.UI.ProgressBar] :: Bar element not found'; + } + this._elementBar = this._elementBar[0]; + + this._options.onStart = Ink.bind(this._options.onStart,this); + this._options.onEnd = Ink.bind(this._options.onEnd,this); + this.setValue( this._options.startValue ); + }, + + /** + * Sets the value of the Progressbar + * + * @method setValue + * @param {Number} newValue Numeric value, between 0 and 100, that represents the percentage of the bar. + * @public + */ + setValue: function( newValue ){ + this._options.onStart( this._value); + + newValue = parseInt(newValue,10); + if( isNaN(newValue) || (newValue < 0) ){ + newValue = 0; + } else if( newValue>100 ){ + newValue = 100; + } + this._value = newValue; + this._elementBar.style.width = this._value + '%'; + + this._options.onEnd( this._value ); + } + }; + + return ProgressBar; + +}); + +/** + * @module Ink.UI.SmoothScroller_1 + * @author inkdev AT sapo.pt + * @version 1 + */ +Ink.createModule('Ink.UI.SmoothScroller', '1', ['Ink.Dom.Event_1','Ink.Dom.Selector_1','Ink.Dom.Loaded_1'], function(Event, Selector, Loaded) { + 'use strict'; + + var requestAnimationFrame = + window.requestAnimationFrame || + function (cb) { return setTimeout(cb, 10); }; + + var cancelAnimationFrame = + window.cancelAnimationFrame || + function (id) { clearTimeout(id); }; + + /** + * @class Ink.UI.SmoothScroller + * @version 1 + * @static + * + * @example + * + * go to Part 1 + * + * [lots and lots of content...] + * + *

      Part 1

      + * + * + */ + var SmoothScroller = { + + /** + * Sets the speed of the scrolling + * + * @property speed + * @type {Number} + * @readOnly + * @static + */ + speed: 10, + + /** + * Returns the Y position of an element, relative to the document + * + * @method getTop + * @param {DOMElement} d DOMElement to get the Y position from + * @return {Number} Y position of div 'd' + * @public + * @static + */ + getTop: function(d) { + return Math.round( + SmoothScroller.scrollTop() + d.getBoundingClientRect().top); + }, + + + /** + * Returns the current scroll position + * + * @method scrollTop + * @return {Number} Current scroll position + * @public + * @static + */ + scrollTop: function() { + var body = document.body, + d = document.documentElement; + if (body && body.scrollTop){ + return body.scrollTop; + } + if (d && d.scrollTop){ + return d.scrollTop; + } + if (window.pageYOffset){ + return window.pageYOffset; + } + return 0; + }, + + /** + * Attaches an event for an element + * + * @method add + * @param {DOMElement} el DOMElement to make the listening of the event + * @param {String} event Event name to be listened + * @param {DOMElement} fn Callback function to run when the event is triggered. + * @public + * @static + */ + add: function(el, event, fn) { + Event.observe(el,event,fn); + }, + + + /** + * Kill an event of an element + * + * @method end + * @param {String} e Event to be killed/stopped + * @public + * @static + */ + // kill an event of an element + end: function(e) { + Event.stopDefault(e); + }, + + + /** + * Moves the scrollbar to the target element. This is the function + * which animates the scroll position bit by bit. It calls itself in + * the end through requestAnimationFrame + * + * @method scroll + * @param {Number} d Y coordinate value to stop + * @public + * @static + */ + scroll: function(d) { + var a = SmoothScroller.scrollTop(); + if (d > a) { + a += Math.ceil((d - a) / SmoothScroller.speed); + } else { + a = a + (d - a) / SmoothScroller.speed; + } + + window.scrollTo(0, a); + + cancelAnimationFrame(SmoothScroller.interval); + + if (!((a) === d || SmoothScroller.offsetTop === a)) { + SmoothScroller.interval = requestAnimationFrame( + Ink.bindMethod(SmoothScroller, 'scroll', d), document.body); + } else { + SmoothScroller.onDone(); + } + SmoothScroller.offsetTop = a; + }, + + + /** + * Has smooth scrolling applied to relevant elements upon page load. + * + * @method init + * @param [selector='a.scrollableLink,a.ink-smooth-scroll'] Selector string for finding links with smooth scrolling enabled. + * @public + * @static + */ + init: function(selector) { + Loaded.run(Ink.bindMethod(SmoothScroller, 'render', selector)); + }, + + /** + * This method extracts all the anchors and validates them as # and attaches the events + * + * @method render + * @public + * @static + */ + render: function(selector) { + var a = Selector.select(selector || 'a.scrollableLink,a.ink-smooth-scroll'); + + for (var i = 0; i < a.length; i++) { + var _elm = a[i]; + if (_elm.href && _elm.href.indexOf('#') !== -1 && ((_elm.pathname === location.pathname) || ('/' + _elm.pathname === location.pathname))) { + Event.observe(_elm,'click', Ink.bindEvent(SmoothScroller.onClick, this, _elm)); + } + } + }, + + + /** + * Click handler + * + * @method onClick + * @public + * @static + */ + onClick: function(event, _elm) { + SmoothScroller.end(event); + if(_elm !== null && _elm.getAttribute('href') !== null) { + var hashIndex = _elm.href.indexOf('#'); + if (hashIndex === -1) { + return; + } + var hash = _elm.href.substr((hashIndex + 1)); + var activeLiSelector = 'ul > li.active > ' + selector; + + var selector = 'a[name="' + hash + '"],#' + hash; + var elm = Selector.select(selector)[0]; + var activeLi = Selector.select(activeLiSelector)[0]; + activeLi = activeLi && activeLi.parentNode; + + if (typeof(elm) !== 'undefined') { + if (_elm.parentNode.className.indexOf('active') === -1) { + if (activeLi) { + activeLi.className = activeLi.className.replace(/(^|\s+)active($|\s+)/g, ''); + } + _elm.parentNode.className += " active"; + } + SmoothScroller.hash = hash; + SmoothScroller.scroll(SmoothScroller.getTop(elm)); + } + } + }, + + /** + * Called when the scroll movement is done. Updates browser address. + */ + onDone: function () { + window.location.hash = SmoothScroller.hash; + } + }; + + return SmoothScroller; + +}); + +/** + * @module Ink.UI.SortableList_1 + * @author inkdev AT sapo.pt + * @version 1 + */ +Ink.createModule('Ink.UI.SortableList', '1', ['Ink.UI.Common_1','Ink.Dom.Css_1','Ink.Dom.Event_1','Ink.Dom.Element_1','Ink.Dom.Selector_1'], function( Common, Css, Events, Element, Selector ) { + 'use strict'; + var hasTouch = (('ontouchstart' in window) || // html5 browsers + (navigator.maxTouchPoints > 0) || // future IE + (navigator.msMaxTouchPoints > 0)); + + /** + * Adds sortable behaviour to any list! + * + * @class Ink.UI.SortableList + * @constructor + * @version 1 + * @param {String|DOMElement} selector + * @param {String} [options.placeholderClass='placeholder'] CSS class to be added to the "ghost" element being dragged around + * @param {String} [options.draggedClass='hide-all'] CSS class added to the original element. + * @param {String} [options.draggingClass='dragging'] CSS class added to the html element when the user is dragging. + * @param {String} [options.dragSelector='li'] CSS selector for the drag enabled nodes. + * @param {String} [options.handleSelector=null] CSS selector for the drag handle. If present, you can only drag nodes by this selector. + * @param {String} [options.moveSelector=null] CSS selector to validate a node move. If present, you can only move nodes into this selector. + * @param {Boolean} [options.swap=false] Flag to swap moving element with target element instead of changing its order. + * @param {Boolean} [options.cancelMouseOut=false] Flag to cancel moving if mouse leaves the container element. + + * @example + *
        + *
      • drag hereprimeiro
      • + *
      • drag heresegundo
      • + *
      • drag hereterceiro
      • + *
      + * + */ + var Spy = function( selector, options ){ + + this._rootElement = Common.elOrSelector(selector,'1st argument'); + + /** + * Setting default options and - if needed - overriding it with the data attributes + */ + this._options = Ink.extendObj({ + target: undefined, + activeClass: 'active' + }, Element.data( this._rootElement ) ); + + /** + * In case options have been defined when creating the instance, they've precedence + */ + this._options = Ink.extendObj(this._options,options || {}); + + this._options.target = Common.elOrSelector( this._options.target, 'Target' ); + + this._init(); + }; + + Spy.prototype = { + /** + * Init function called by the constructor + * + * @method _init + * @private + */ + _init: function() { + addSpied(this._rootElement, this._options.target); + observeOnScroll(); + onScroll(); + } + }; + + return Spy; + +}); + +/** + * @module Ink.UI.Stacker_1 + **/ +Ink.createModule('Ink.UI.Stacker', 1, ['Ink.UI.Common_1', 'Ink.Dom.Event_1', 'Ink.Dom.Element_1'], function(InkUICommon, InkEvent, InkElement) { + 'use strict'; + +function Stacker(selector, options) { + this._init(selector, options); +} + +Stacker.prototype = { + /** + * This module combines several stacks of items together, in smaller screen sizes. + * + * The purpose is to have several stacks of items which may have different heights and as such cannot be used because of `float: left` quirks. + * + * For example, when you have three different columns of information: + * + * [col. A: 1] [col. B: 1] [col. C: 1] + * [col. B: 2] [col. C: 2] [col. C: 2] + * + * and the screen resizes and you need a layout of 2 columns, Stacker reorders the stacks so that you get: + * + * [col. A: 1] [col. B: 1] + * [col. C: 1] [col. A: 2] + * [col. B: 2] [col. C: 2] + * + * Note: If you just want to use a different amount of columns for your items in several viewports, but these items are guaranteed to have a fixed height, don't use this module. Use the `small-*`, `medium-*` and `large-*` classes instead. + * + * @class Ink.UI.Stacker_1 + * + * @constructor + * @param [container] {DOMElement|String} Element which contains the stacks (identified by the options.column selector) + * @param [options] + * @param [options.column='.stacker-column'] {String} Select the columns inside the `container` + * @param [options.item='.stacker-item'] {String} Select items in your stack + * + * @param [options.customBreakPoints] {Object} options for each breakpoint name. Use this if you have more breakpoints than Ink by default (`large`, `medium`, `small`) + * @param [options.customBreakpoints.(breakpoint)] {Object} + * @param options.customBreakpoints.(breakpoint).max Maximum screen size as seen in your media query + * @param options.customBreakpoints.(breakpoint).min Minimum screen size as seen in your media query + * @param options.customBreakpoints.(breakpoint).cols Column count for this size. + * + * @param [options.largeMax] {Number} Upper bound of `large` breakpoint + * @param [options.largeMin=961] {Number} Lower bound of `large` breakpoint + * @param [options.mediumMax=960] {Number} Upper bound of `medium` breakpoint + * @param [options.mediumMin=651] {Number} Lower bound of `medium` breakpoint + * @param [options.smallMax=650] {Number} Upper bound of `small` breakpoint + * @param [options.smallMin] {Number} Lower bound of `small` breakpoint + * + * @param [options.largeCols=3] {Integer} Number of columns in the `large` viewport + * @param [options.mediumCols=2] {Integer} Number of columns in the `medium` viewport + * @param [options.smallCols=1] {Integer} Number of columns in the `small` viewport + * + * @param [options.isOrdered=true] {Boolean} When `false`, do not reorder stacks when combining them. + * @param [options.onRunCallback] {Function} Called when instantiated + * @param [options.onResizeCallback] {Function} Called when resized because the window resized. + * @param [options.onAPIReloadCallback] {Function} Called when you ask to reload stack items from the DOM. + * + * @example + * + * Html: + * + *
      + *
      + *
      a
      + *
      d
      + *
      g
      + *
      + *
      + *
      b
      + *
      e
      + *
      h
      + *
      + *
      + *
      c
      + *
      f
      + *
      i
      + *
      + *
      + * + * Javascript: + * + * Ink.requireModules(['Ink.UI.Stacker_1'], function (Stacker) { + * var stacker = new Stacker('#stacker-container'); + * // Keep the "stacker" variable around if you want to call addItem and reloadItems + * }); + **/ + _init: function(selector, options) { + /* globals console */ + this._rootElm = InkUICommon.elsOrSelector(selector, 'Ink.UI.Stacker root element')[0] || null; + if(this._rootElm === null) { + if(typeof console !== 'undefined') { + console.warn('Ink.UI.Stacker: No root element'); + } + } + + this._options = InkUICommon.options({ + column: ['String', '.stacker-column'], + item: ['String', '.stacker-item'], + + // [3.0.0] review this when we have info about our breakpoints from the CSS + customBreakPoints: ['Object', null], // Must be: {xlarge: {max: 9999, min: 1281, cols: 5}, large:{max:1280, min:1001, cols:4} medium:{max:1000, min:801,cols:3}, ...etc..} + largeMax: ['Number', Number.MAX_VALUE], + largeMin: ['Number', 961], + mediumMax: ['Number', 960], + mediumMin: ['Number', 651], + smallMax: ['Number', 650], + smallMin: ['Number', 0], + + largeCols: ['Integer', 3], + mediumCols: ['Integer', 2], + smallCols: ['Integer', 1], + + isOrdered: ['Boolean', true], + onRunCallback: ['Function', null], + onResizeCallback: ['Function', null], + onAPIReloadCallback: ['Function', null] + }, options || {}, this._rootElm); + + this._aList = []; + + this._curLayout = 'large'; + + // [todo] is this needed? + this._runFirstTime = false; + + this._getPageItemsToList(); + + if(this._canApplyLayoutChange() || !this._runFirstTime) { + this._runFirstTime = true; + this._applyLayoutChange(); + if(typeof(this._options.onRunCallback) === 'function') { + this._options.onRunCallback(this._curLayout); + } + } + this._addEvents(); + }, + + /** + * Add an item to the end of your stacks. Call `reloadItems()` when you are done adding items. + * @method addItem + * @param {DOMElement} item + **/ + addItem: function(item) { + this._aList.push(item); + }, + + /** + * Update the layout of your items. + * + * Call this when: + * + * - The width has changed, but not because of the window resizing. + * - You used addItem to add some items + * + * @method reloadItems + **/ + reloadItems: function() { + this._applyLayoutChange(); + if(typeof(this._options.onAPIReloadCallback) === 'function') { + this._options.onAPIReloadCallback(this._curLayout); + } + }, + + _addEvents: function() { + InkEvent.observe(window, 'resize', Ink.bindEvent(this._onResize, this)); + }, + + _onResize: function() { + if(this._canApplyLayoutChange()) { + this._removeDomItems(); + this._applyLayoutChange(); + if(typeof(this._options.onResizeCallback) === 'function') { + this._options.onResizeCallback(this._curLayout); + } + } + }, + + _setCurLayout: function() { + var viewportWidth = InkElement.viewportWidth(); + if(this._options.customBreakpoints && typeof(this._options.customBreakPoints) === 'object') { + for(var prop in this._options.customBreakPoints) { + if(this._options.customBreakPoints.hasOwnProperty(prop)) { + if(viewportWidth >= Number(this._options.customBreakPoints[prop].min) && viewportWidth <= Number(this._options.customBreakPoints[prop].max) && this._curLayout !== prop) { + this._curLayout = prop; + return; + } + } + } + } else { + if(viewportWidth <= Number(this._options.largeMax) && viewportWidth >= Number(this._options.largeMin) && this._curLayout !== 'large') { + this._curLayout = 'large'; + } else if(viewportWidth >= Number(this._options.mediumMin) && viewportWidth <= Number(this._options.mediumMax) && this._curLayout !== 'medium') { + this._curLayout = 'medium'; + } else if(viewportWidth >= Number(this._options.smallMin) && viewportWidth <= Number(this._options.smallMax) && this._curLayout !== 'small') { + this._curLayout = 'small'; + } + } + }, + + _getColumnsToShow: function() { + if(this._options.customBreakPoints && typeof(this._options.customBreakPoints) === 'object') { + return Number(this._options.customBreakPoints[this._curLayout].cols); + } else { + return Number(this._options[this._curLayout+'Cols']); + } + }, + + _canApplyLayoutChange: function() { + var curLayout = this._curLayout; + this._setCurLayout(); + if(curLayout !== this._curLayout) { + return true; + } + return false; + }, + + _getPageItemsToList: function() { + this._aColumn = Ink.ss(this._options.column, this._rootElm); + var totalCols = this._aColumn.length; + var index = 0; + if(totalCols > 0) { + for(var i=0; i < this._aColumn.length; i++) { + var aItems = Ink.ss(this._options.item, this._aColumn[i]); + for(var j=0; j < aItems.length; j++) { + if(this._options.isOrdered) { + index = i + (j * totalCols); + } + this._aList[index] = aItems[j]; + if(!this._options.isOrdered) { + index++; + } + //aItems[j].style.height = (100 + (Math.random() * 100))+'px'; + aItems[j].parentNode.removeChild(aItems[j]); + } + } + if(this._aList.length > 0 && this._options.isOrdered) { + var aNewList = []; + for(var ii=0; ii < this._aList.length; ii++) { + if(typeof(this._aList[ii]) !== 'undefined') { + aNewList.push(this._aList[ii]); + } + } + this._aList = aNewList; + } + } + }, + + _removeDomItems: function() { + var totalCols = this._aColumn.length; + if(totalCols > 0) { + for(var i=0; i < totalCols; i++) { + var aItems = Ink.ss(this._options.item, this._aColumn[i]); + for(var j=aItems.length - 1; j >= 0; j--) { + aItems[j].parentNode.removeChild(aItems[j]); + } + } + } + }, + + _applyLayoutChange: function() { + var totalCols = this._getColumnsToShow(); + var totalItems = this._aList.length; + var index = 0; + var countCol = 0; + if(totalCols > 0) { + while(countCol < totalCols) { + this._aColumn[countCol].appendChild(this._aList[index]); + index++; + countCol++; + if(index === totalItems) { + return; + } + if(countCol === totalCols) { + countCol = 0; + } + } + } + } +}; + +return Stacker; + +}); + +/** + * @module Ink.UI.Sticky_1 + * @author inkdev AT sapo.pt + * @version 1 + */ +Ink.createModule('Ink.UI.Sticky', '1', ['Ink.UI.Common_1','Ink.Dom.Event_1','Ink.Dom.Element_1','Ink.Dom.Css_1'], function(Common, Event, Element, Css) { + 'use strict'; + + /** + * The Sticky component takes an element and transforms it's behavior in order to, when the user scrolls he sets its position + * to fixed and maintain it until the user scrolls back to the same place. + * + * @class Ink.UI.Sticky + * @constructor + * @version 1 + * @param {String|DOMElement} selector + * @param {Object} [options] Options + * @param {Number} [options.offsetBottom=0] Number of pixels of distance from the bottomElement. + * @param {Number} [options.offsetTop=0] Number of pixels of distance from the topElement. + * @param {Boolean} [options.inlineDimensions=true] Whether to set "style.height" and "style.width" in the stuck element. Turn this off when your `stickyClass` has its own height and width and you don't want this to be dealt with through javascript. + * @param {Boolean} [options.inlinePosition=true] Whether to set "style.left" in the stuck element. Turn this off when your `stickyClass` has its own "left" position and you don't want this to be dealt with through javascript. + * @param {String} [options.wrapperClass="ink-sticky-wrapper"] Css class for the wrapper element. + * @param {String} [options.stickyClass="ink-sticky-stuck"] Css class for sticking the sticky to the screen. Add your own "stuck" class to define your own sticky behaviour. + * @param {String} [options.topElement] CSS Selector that specifies a top element with which the component could collide. + * @param {String} [options.bottomElement] CSS Selector that specifies a bottom element with which the component could collide. + * @param {Array|String} [options.activateInLayouts='medium,large'] Layouts in which the sticky behaviour is present. Pass an array or comma-separated string. + * @example + * + */ + var Sticky = function( selector, options ){ + this._rootElement = Common.elOrSelector(selector, 'Ink.UI.Sticky_1'); + + this._options = Common.options({ + offsetBottom: ['Integer', 0], + offsetTop: ['Integer', 0], + topElement: ['Element', null], + wrapperClass: ['String', 'ink-sticky-wrapper'], + stickyClass: ['String', 'ink-sticky-stuck'], + inlineDimensions: ['Boolean', true], + inlinePosition: ['Boolean', true], + bottomElement: ['Element', null], + activateInLayouts: ['String', 'medium,large'] + }, options || {}, this._rootElement ); + + // Because String#indexOf is compatible with lt IE8 but not Array#indexOf + this._options.activateInLayouts = this._options.activateInLayouts.toString(); + + this._dims = null; // force a recalculation of the dimensions later + + this._options.offsetTop = parseInt(this._options.offsetTop, 10) || 0; + this._options.offsetBottom = parseInt(this._options.offsetBottom, 10) || 0; + + if (this._options.topElement) { + this._options.topElement = Common.elOrSelector(this._options.topElement, 'Top Element'); + } + if (this._options.bottomElement) { + this._options.bottomElement = Common.elOrSelector(this._options.bottomElement, 'Sticky bottom Element'); + } + + this._wrapper = Element.create('div', { className: this._options.wrapperClass }); + Element.wrap(this._rootElement, this._wrapper); + + this._init(); + }; + + Sticky.prototype = { + + /** + * Init function called by the constructor + * + * @method _init + * @private + */ + _init: function() { + var scrollTarget = document.addEventListener ? document : window; + this._onScroll = Ink.bind(Event.throttle(this._onScroll, 33), this); // Because this is called directly. + Event.observe( scrollTarget, 'scroll', this._onScroll ); + Event.observe( window, 'resize', Ink.bindEvent(Event.throttle(this._onResize, 100), this) ); + this._onScroll(); + }, + + /** + * Returns whether the sticky is disabled in the current view + * + * @method isDisabledInLayout + * @private + */ + _isDisabledInLayout: function () { + var currentLayout = Common.currentLayout(); + if (!currentLayout) { return false; } + return this._options.activateInLayouts.indexOf(currentLayout) === -1; + }, + + /** + * Scroll handler. + * + * @method _onScroll + * @private + */ + _onScroll: function(){ + var dims = this._getDims(); + var scrollHeight = Element.scrollHeight(); + + var unstick = this._isDisabledInLayout() || + scrollHeight <= dims.top - this._options.offsetTop || + (this._options.topElement && this._options.topElement.getBoundingClientRect().bottom + this._options.offsetTop > 0); + + if( unstick ) { + // We're on top, no sticking. position:static is the "normal" position. + this._unstick(); + return; + } + + // If we stick it now, what will be its boundingClientRect.bottom ? + var bottomOfSticky = this._options.offsetTop + dims.height + Element.scrollHeight(); + var maxBottomOfSticky = document.body.scrollHeight; + + if (this._options.bottomElement) { + maxBottomOfSticky = + this._options.bottomElement.getBoundingClientRect().top + + Element.scrollHeight(); + } + + maxBottomOfSticky -= this._options.offsetBottom; + + if ( bottomOfSticky < maxBottomOfSticky ) { + // Stick to screen! + this._stickTo('screen'); + } else { + // Stick to bottom + this._stickTo('bottom'); + } + }, + + /** + * Have the sticky stick nowhere, to the screen, or to the bottom. + * + * @method _stickTo + * @private + */ + _stickTo: function (where) { + var style = this._rootElement.style; + var dims = this._getDims(); + + Css.addClassName(this._rootElement, this._options.stickyClass); + this._wrapper.style.height = dims.height + 'px'; + + this._inlineDimensions(dims.height + 'px', dims.width + 'px'); + + if (this._options.inlinePosition === false) { + return; + } + + style.left = dims.left + 'px'; + + if (where === 'screen') { + style.bottom = null; + style.top = this._options.offsetTop + 'px'; + } else if (where === 'bottom') { + // Distance between bottom of sticky and bottom of document + var bottom = this._getBottomOffset(); + + // Distance between bottom of viewport and bottom of document + var bottomOfViewport = Element.scrollHeight() + Element.viewportHeight(); + var toBottomOfDocument = Element.pageHeight() - bottomOfViewport; + + style.bottom = bottom - toBottomOfDocument + 'px'; + style.top = 'auto'; + } + }, + + /** + * "unstick" the sticky from the screen or bottom of the document + * @method _unstick + * @private + */ + _unstick: function () { + Css.removeClassName(this._rootElement, this._options.stickyClass); + // deinline dimensions of our root element + this._inlineDimensions(null, null); + + // deinline the position of our root element + if (this._options.inlinePosition) { + this._rootElement.style.left = null; + this._rootElement.style.top = null; + this._rootElement.style.bottom = null; + } + + // deinline dimensions of wrapper + this._wrapper.style.height = null; + this._wrapper.style.width = null; + + // Break the "getDims" cache + this._dims = null; + }, + + /** + * Resize handler + * + * @method _onResize + * @private + */ + _onResize: function(){ + this._dims = null; // Blow the cache so _getDims recalculates + this._onScroll(); + }, + + /** + * Recalculate the "dims" cache, or get it. + * + * The "dims" cache is to be set to null when the element is liable to have changed dimensions + * + * (eg: on resize) + * + **/ + _getDims: function () { + if (this._dims !== null) { return this._dims; } + + var style = this._rootElement.style; + + // We unstick the sticky so we can measure. + var oldPosition = style.position; + var oldWidth = style.width; + + style.position = 'static'; // [todo] this should be a class toggle + style.width = null; + + var dimensionsInStatic = Element.outerDimensions(this._rootElement); + var rect = this._wrapper.getBoundingClientRect(); + this._dims = { + height: dimensionsInStatic[1], + width: dimensionsInStatic[0], + left: rect.left + Element.scrollWidth(), + top: rect.top + Element.scrollHeight() + }; + + style.position = oldPosition; + style.width = oldWidth; + + return this._dims; + }, + + /** + * Set style.height and style.width, but not if options.inlineDimensions === false + * + * @method _inlineDimensions + * @private + */ + _inlineDimensions: function (height, width) { + if (this._options.inlineDimensions) { + this._rootElement.style.height = height; + this._rootElement.style.width = width; + } + }, + + /** + * Get the distance between the bottom of the element and the bottom of the page + * + * @method _getBottomOffset + * @private + */ + _getBottomOffset: function () { + var bottom = this._options.offsetBottom; + if (this._options.bottomElement) { + bottom += Element.pageHeight() - + Element.offsetTop(this._options.bottomElement); + } + return bottom; + } + }; + + return Sticky; + +}); + +/** + * @module Ink.UI.Swipe + * @author ink AT sapo.pt + * @version 1 + */ +Ink.createModule('Ink.UI.Swipe', '1', ['Ink.Dom.Event_1', 'Ink.Dom.Element_1', 'Ink.UI.Common_1'], function(InkEvent, InkElement, Common) { + 'use strict'; + + /** + * Subscribe swipe gestures! + * + * Supports filtering swipes be any combination of the criteria supported in the options. + * + * @class Ink.UI.Swipe + * @constructor + * @param {String|DOMElement} el + * @param {Object} options + * @param {Function} [options.onEnd] callback function for the `touchend` event. Gets all the gesture information, and is filtered by min/max Dist and Duration options (see below) + * @param {Function} [options.onStart] callback function for `touchstart` event + * @param {Function} [options.onMove] callback function for every `touchmove` event. Gets current gesture information. + * @param {Number} [options.minDist] minimum allowed distance, in pixels + * @param {Number} [options.maxDist] maximum allowed distance, in pixels + * @param {Number} [options.minDuration] minimum allowed duration, in seconds + * @param {Number} [options.maxDuration] maximum allowed duration, in seconds + * @param {String} [options.axis] if either 'x' or 'y' is passed, only swipes where the dominant axis is the given one trigger the callback + * @param {String} [options.storeGesture=false] store gesture information and provide to the callback + * @param {String} [options.stopEvents=true] stop (default and propagation) of the received events + * + * ----- + * + * Arguments received by the callbacks + * ----------------------------------- + * + * `onStart`, `onMove`, and `onEnd` receive as argument an object containing: + * + * - `event`: the DOMEvent object + * - `element`: the target element + * - `Instance`: the `Ink.UI.Swipe_1` instance + * - `position`: `Array` with `[x, y]` coordinates of current position + * - `dt`: Time passed between now and the first event (onMove only) + * - `gesture`: an Array containing [x,y] coordinates of every touchmove event received (storeGesture only) (onEnd only) + * - `time`: an Array containing all the `dt` values for every touchmove event (onEnd only) + * - `overallMovement`: X and Y distance traveled by the touch movement (`[x, y]`) (onEnd only) + * - `overallTime`: total time passed (onEnd only) + * + */ + function Swipe(el, options) { + el = Common.elOrSelector(el, 'Swipe target'); + + this._options = Ink.extendObj({ + onEnd: undefined, + onStart: undefined, + onMove: undefined, + minDist: undefined, // in pixels + maxDist: undefined, + minDuration: undefined, // in seconds + maxDuration: undefined, + axis: undefined, // x | y + storeGesture: false, + stopEvents: true + }, InkElement.data(el), options || {}); + + if (typeof options === 'function') { + this._options.onEnd = options; + } + + this._handlers = { + down: Ink.bindEvent(this._onDown, this), + move: Ink.bindEvent(this._onMove, this), + up: Ink.bindEvent(this._onUp, this) + }; + + this._element = el; + + this._init(); + } + + Swipe.prototype = { + + version: '0.1', + + _supported: ('ontouchstart' in document.documentElement), + + _init: function() { + var db = document.body; + InkEvent.observe(db, 'touchstart', this._handlers.down); + if (this._options.storeGesture || this._options.onMove) { + InkEvent.observe(db, 'touchmove', this._handlers.move); + } + InkEvent.observe(db, 'touchend', this._handlers.up); + this._isOn = false; + }, + + _isMeOrParent: function(el, parentEl) { + if (!el) {return;} + do { + if (el === parentEl) { return true; } + el = el.parentNode; + } while (el); + return false; + }, + + _pushGesture: function (coords, dt) { + if (this._options.storeGesture) { + this._gesture.push(coords); + this._time.push(dt); + } + }, + + _onDown: function(event) { + if (event.changedTouches.length !== 1) { return; } + if (!this._isMeOrParent(event.target, this._element)) { return; } + + if( this._options.stopEvents === true ){ + InkEvent.stop(event); + } + event = event.changedTouches[0]; + this._isOn = true; + this._target = event.target; + + this._t0 = +new Date(); + this._p0 = [event.pageX, event.pageY]; + + if (this._options.storeGesture) { + this._gesture = []; + this._time = []; + } + + this._pushGesture(this._p0, 0); + + if (this._options.onStart) { + this._options.onStart({ + event: event, + element: this._element, + instance: this, + position: this._p0, + dt: 0 + }); + } + }, + + _onMove: function(event) { + if (!this._isOn || event.changedTouches.length !== 1) { return; } + if( this._options.stopEvents === true ) { + InkEvent.stop(event); + } + + event = event.changedTouches[0]; + var t1 = +new Date(); + var dt = (t1 - this._t0); + + var gesture = [event.pageX, event.pageY]; + + this._pushGesture(gesture, dt); + + if (this._options.onMove) { + this._options.onMove({ + event: event, + element: this._element, + instance: this, + position: gesture, + dt: dt + }); + } + }, + + _onUp: function(event) { + if (!this._isOn || event.changedTouches.length !== 1) { return; } + + if( this._options.stopEvents === true ){ + InkEvent.stop(event); + } + event = event.changedTouches[0]; // TODO SHOULD CHECK IT IS THE SAME TOUCH + this._isOn = false; + + var t1 = +new Date(); + var p1 = [event.pageX, event.pageY]; + var dt = (t1 - this._t0); + var dr = [ + p1[0] - this._p0[0], + p1[1] - this._p0[1] + ]; + var dist = Math.sqrt(dr[0]*dr[0] + dr[1]*dr[1]); + var axis = Math.abs(dr[0]) > Math.abs(dr[1]) ? 'x' : 'y'; + + var o = this._options; + if (o.minDist && dist < o.minDist) { return; } + if (o.maxDist && dist > o.maxDist) { return; } + if (o.minDuration && dt < o.minDuration) { return; } + if (o.maxDuration && dt > o.maxDuration) { return; } + if (o.axis && axis !== o.axis) { return; } + + if (this._options.onEnd) { + this._options.onEnd({ + event: event, + element: this._element, + instance: this, + gesture: this._gesture, + time: this._time, + axis: axis, + overallMovement: dr, + overallTime: dt + }); + } + } + }; + + return Swipe; +}); + +/** + * @module Ink.UI.Table_1 + * @author inkdev AT sapo.pt + * @version 1 + */ +Ink.createModule('Ink.UI.Table', '1', ['Ink.Util.Url_1','Ink.UI.Pagination_1','Ink.Net.Ajax_1','Ink.UI.Common_1','Ink.Dom.Event_1','Ink.Dom.Css_1','Ink.Dom.Element_1','Ink.Dom.Selector_1','Ink.Util.Array_1','Ink.Util.String_1', 'Ink.Util.Json_1'], function(InkUrl,Pagination, Ajax, Common, Event, Css, Element, Selector, InkArray, InkString, Json) { + 'use strict'; + + var rNumber = /\d/g; + // Turn into a number, if we can. For sorting data which could be numeric or not. + function maybeTurnIntoNumber(value) { + if( !isNaN(value) && rNumber.test(value) ){ + return parseInt(value, 10); + } else if( !isNaN(value) ){ + return parseFloat(value); + } + return value; + } + function cmp (a, b) { + if( a === b ){ + return 0; + } + return ( ( a > b ) ? 1 : -1 ); + } + // cmp function for comparing data which might be a number. + function numberishEnabledCmp (a, b) { + var aValue = maybeTurnIntoNumber(Element.textContent(a)); + var bValue = maybeTurnIntoNumber(Element.textContent(b)); + + return cmp(aValue, bValue); + } + // Object.keys polyfill + function keys(obj) { + if (typeof Object.keys !== 'undefined') { + return Object.keys(obj); + } + var ret = []; + for (var k in obj) if (obj.hasOwnProperty(k)) { + ret.push(k); + } + return ret; + } + + // Most processJSON* functions can just default to this. + function sameSame(obj) { return obj; } + /** + * The Table component transforms the native/DOM table element into a + * sortable, paginated component. + * + * @class Ink.UI.Table + * @constructor + * @version 1 + * @param {String|DOMElement} selector + * @param {Object} [options] Options + * @param {Number} [options.pageSize] + * Number of rows per page. Omit to avoid paginating. + * + * @param {String} [options.endpoint] + * Endpoint to get the records via AJAX. Omit if you don't want to do AJAX + * + * @param {Function} [options.createEndpointUrl] + * Callback to customise what URL the AJAX endpoint is at. Receives three + * arguments: base (the "endpoint" option), sort (`{ order: 'asc' or 'desc', field: fieldname }`) + * and page ({ page: page number, size: items per page }) + * + * @param {Function} [options.getDataFromEndPoint] + * Callback to allow the user to retrieve the data himself given an URL. + * Must accept two arguments: `url` and `callback`. This `callback` will + * take as a single argument a JavaScript object. + * + * @param {Function} [options.processJSONRows] + * Retrieve an array of rows from the data which came from AJAX. + * + * @param {Function} [options.processJSONHeaders] + * Get an object with all the headers' names as keys, and a { label, sortable } + * object as value. + * Example: `{col1: {label: "Column 1"}, col2: {label: "Column 2", sortable: true}`. + * Takes a single argument, the JSON response. + * + * @param {Function} [options.processJSONRow] + * Process a row object before it gets on the table. + * + * @param {Function} [options.processJSONField] + * Process the field data before putting it on the table. + * You can return HTML, a DOM element, or a string here. + * Arguments you receive: `(column, fieldData, rowIndex)`. + * + * @param {Function} [options.processJSONField.(field_name)] + * The same as processJSONField, but for a particular field. + * + * @param {Function} [options.processJSONTotalRows] + * A callback where you have a chance to say how many rows + * are in the dataset (not only on this page) you have on the + * collection. You get as an argument the JSON response. + * + * @param {Function} [options.getSortKey=null] + * A function taking a `{ columnIndex, columnName, data, element }` + * object and returning a value which serves as a sort key for the + * sorting operation. For example, if you want to sort by a + * `data-sort-key` atribute, set `getSortKey` to: + * + * function (cell) { + * return cell.element.getAttribute('data-sort-key'); + * } + * + * @param {Function} [options.getSortKey.(field_name)] + * Same as `options.getSortKey`, but for a particular field. + * + * @param {Object} [options.tdClassNames] + * An object mapping each field to what classes it gets. + * Example: `{ name: "large-10", isBoss: "hide-small" }` + * + * @param {String|DomElement|Ink.UI.Pagination} [options.pagination] + * Pagination instance or element. + * + * @param {Object} [options.paginationOptions] + * Override the options with which we instantiate the Ink.UI.Pagination. + * + * @param {Boolean} [options.allowResetSorting] + * Allow sort order to be set to "none" in addition to "ascending" and "descending" + * + * @param {String|Array} [options.visibleFields] + * Set of fields which get shown on the table + * @example + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
      PepperScoville Rating
      Trinidad Moruga Scorpion1500000
      Bhut Jolokia1000000
      Naga Viper1463700
      Red Savina Habanero580000
      Habanero350000
      Scotch Bonnet180000
      Malagueta50000
      Tabasco35000
      Serrano Chili27000
      Jalapeño8000
      Poblano1500
      Peperoncino500
      + * + * + */ + var Table = function( selector, options ){ + + /** + * Get the root element + */ + this._rootElement = Common.elOrSelector(selector, 'Ink.UI.Table :'); + + if( this._rootElement.nodeName.toLowerCase() !== 'table' ){ + throw new Error('[Ink.UI.Table] :: The element is not a table'); + } + + this._options = Common.options({ + pageSize: ['Integer', null], + endpoint: ['String', null], + createEndpointUrl: ['Function', null /* default func uses above option */], + getDataFromEndPoint: ['Function', null /* by default use plain ajax for JSON */], + processJSONRows: ['Function', sameSame], + processJSONRow: ['Function', sameSame], + processJSONField: ['Function', sameSame], + processJSONHeaders: ['Function', function (dt) { return dt.fields; }], + processJSONTotalRows: ['Function', function (dt) { return dt.length || dt.totalRows; }], + getSortKey: ['Function', null], + pagination: ['Element', null], + allowResetSorting: ['Boolean', false], + visibleFields: ['String', null], + tdClassNames: ['Object', {}], + paginationOptions: ['Object', null] + }, options || {}, this._rootElement); + + /** + * Checking if it's in markup mode or endpoint mode + */ + this._markupMode = !this._options.endpoint; + + if( this._options.visibleFields ){ + this._options.visibleFields = this._options.visibleFields.toString().split(/[, ]+/g); + } + + this._thead = this._rootElement.tHead || this._rootElement.createTHead(); + this._headers = Selector.select('th', this._thead); + + /** + * Initializing variables + */ + this._handlers = { + thClick: null + }; + this._originalFields = [ + // field headers from the DOM + ]; + this._sortableFields = { + // Identifies which columns are sorted and how. + // columnIndex: 'none'|'asc'|'desc' + }; + this._originalData = this._data = []; + this._pagination = null; + this._totalRows = 0; + + this._handlers.thClick = Event.observeDelegated(this._rootElement, 'click', + 'thead th[data-sortable="true"]', + Ink.bindMethod(this, '_onThClick')); + + this._init(); + }; + + Table.prototype = { + + /** + * Init function called by the constructor + * + * @method _init + * @private + */ + _init: function(){ + /** + * If not is in markup mode, we have to do the initial request + * to get the first data and the headers + */ + if( !this._markupMode ) { + /* Endpoint mode */ + this._getData( ); + } else /* Markup mode */ { + this._resetSortOrder(); + this._addHeadersClasses(); + + /** + * Getting the table's data + */ + this._data = Selector.select('tbody tr', this._rootElement); + this._originalData = this._data.slice(0); + + this._totalRows = this._data.length; + + /** + * Set pagination if options tell us to + */ + this._setPagination(); + } + }, + + /** + * Add the classes in this._options.tdClassNames to our table headers. + * @method _addHeadersClasses + * @private + */ + _addHeadersClasses: function () { + var headerLabel; + var classNames; + for (var i = 0, len = this._headers.length; i < len; i++) { + headerLabel = Element.textContent(this._headers[i]); + classNames = this._options.tdClassNames[headerLabel]; + // TODO do not find header labels this way. But how? + if (classNames) { + Css.addClassName(this._headers[i], classNames); + } + } + }, + + /** + * Click handler. This will mainly handle the sorting (when you click in the headers) + * + * @method _onThClick + * @param {Event} event Event obj + * @private + */ + _onThClick: function( event ){ + var tgtEl = Event.element(event), + paginated = this._options.pageSize !== undefined; + + Event.stop(event); + + var index = InkArray.keyValue(tgtEl, this._headers, true); + var sortable = index !== false && this._sortableFields[index] !== undefined; + + if( !sortable ){ + return; + } + + if( !this._markupMode && paginated ){ + this._invertSortOrder(index, false); + } else { + if ( (this._sortableFields[index] === 'desc') && this._options.allowResetSorting ) { + this._setSortOrderOfColumn(index, null); + this._data = this._originalData.slice(0); + } else { + this._invertSortOrder(index, true); + } + + var tbody = Selector.select('tbody',this._rootElement)[0]; + Common.cleanChildren(tbody); + InkArray.each(this._data, Ink.bindMethod(tbody, 'appendChild')); + + if (this._pagination) { + this._pagination.setCurrent(0); + this._paginate(1); + } + } + }, + + _invertSortOrder: function (index, sortAndReverse) { + var isAscending = this._sortableFields[index] === 'asc'; + + for (var i = 0, len = this._headers.length; i < len; i++) { + this._setSortOrderOfColumn(i, null); + } + + if (sortAndReverse) { + this._sort(index); + if (isAscending) { + this._data.reverse(); + } + } + + this._setSortOrderOfColumn(index, !isAscending); + }, + + _setSortOrderOfColumn: function(index, up) { + var header = this._headers[index]; + var caretHtml = ''; + var order = 'none'; + + if (up === true) { + caretHtml = ''; + order = 'asc'; + } else if (up === false) { + caretHtml = ''; + order = 'desc'; + } + + this._sortableFields[index] = order; + header.innerHTML = Element.textContent(header) + caretHtml; + }, + + /** + * Applies and/or changes the CSS classes in order to show the right columns + * + * @method _paginate + * @param {Number} page Current page + * @private + */ + _paginate: function( page ){ + if (!this._pagination) { return; } + + var pageSize = this._options.pageSize; + + // Hide everything except the items between these indices + var firstIndex = (page - 1) * pageSize; + var lastIndex = firstIndex + pageSize; + + InkArray.each(this._data, function(item, index){ + if (index >= firstIndex && index < lastIndex) { + Css.removeClassName(item,'hide-all'); + } else { + Css.addClassName(item,'hide-all'); + } + }); + + }, + + /* register fields into this._originalFields, whether they come from JSON or a table. + * @method _registerFieldNames + * @private + * @param [names] The field names in an array + **/ + _registerFieldNames: function (names) { + this._originalFields = []; + + InkArray.forEach(names, Ink.bind(function (field) { + if( !this._fieldIsVisible(field) ){ + return; // The user deems this not to be necessary to see. + } + this._originalFields.push(field); + }, this)); + }, + + _fieldIsVisible: function (field) { + return !this._options.visibleFields || + (this._options.visibleFields.indexOf(field) !== -1); + }, + + /** + * Sorts by a specific column. + * + * @method _sort + * @param {Number} index Column number (starting at 0) + * @private + */ + _sort: function( index ){ + // TODO this is THE worst way to declare field names. Incompatible with i18n and a lot of other things. + var fieldName = Element.textContent(this._headers[index]); + var keyFunction = this._options.getSortKey; + + if (keyFunction) { + keyFunction = + typeof keyFunction[fieldName] === 'function' ? + keyFunction[fieldName] : + typeof keyFunction === 'function' ? + keyFunction : + null; + } + + var self = this; + + this._data.sort(function (trA, trB) { + var elementA = Ink.ss('td', trA)[index]; + var elementB = Ink.ss('td', trB)[index]; + if (keyFunction) { + return cmp(userKey(elementA), userKey(elementB)); + } else { + return numberishEnabledCmp(elementA, elementB, index); + } + }); + + function userKey(element) { + return keyFunction.call(self, { + columnIndex: index, + columnName: fieldName, + data: Element.textContent(element), + element: element + }); + } + }, + + /** + * Assembles the headers markup + * + * @method _createHeadersFromJson + * @param {Object} headers Key-value object that contains the fields as keys, their configuration (label and sorting ability) as value + * @private + */ + _createHeadersFromJson: function( headers ){ + this._registerFieldNames(keys(headers)); + + if (this._thead.children.length) { return; } + + var tr = this._thead.insertRow(0); + var th; + + for (var i = 0, len = headers.length; i < len; i++) { + if (this._fieldIsVisible(headers[i])) { + th = Element.create('th'); + th = this._createSingleHeaderFromJson(headers[i], th); + tr.appendChild(th); + this._headers.push(th); + } + } + }, + + _createSingleHeaderFromJson: function (header, th) { + if (header.sortable) { + th.setAttribute('data-sortable','true'); + } + + if (header.label){ + Element.setTextContent(th, header.label); + } + + return th; + }, + + /** + * Reset the sort order as marked on the table headers to "none" + * + * @method _resetSortOrder + * @private + */ + _resetSortOrder: function(){ + /** + * Setting the sortable columns and its event listeners + */ + for (var i = 0, len = this._headers.length; i < len; i++) { + var dataset = Element.data( this._headers[i] ); + if (dataset.sortable && dataset.sortable.toString() === 'true') { + this._sortableFields[i] = 'none'; + } + } + }, + + /** + * This method gets the rows from AJAX and places them as and + * + * @method _createRowsFromJSON + * @param {Object} rows Array of objects with the data to be showed + * @private + */ + _createRowsFromJSON: function( rows ){ + var tbody = Selector.select('tbody',this._rootElement)[0]; + + if( !tbody ){ + tbody = document.createElement('tbody'); + this._rootElement.appendChild( tbody ); + } else { + Element.setHTML(tbody, ''); + } + + this._data = []; + var row; + + for (var trIndex in rows) { + if (rows.hasOwnProperty(trIndex)) { + row = this._options.processJSONRow(rows[trIndex]); + this._createSingleRowFromJson(tbody, row, trIndex); + } + } + + this._originalData = this._data.slice(0); + }, + + _createSingleRowFromJson: function (tbody, row, rowIndex) { + var tr = document.createElement('tr'); + tbody.appendChild( tr ); + for( var field in row ){ + if (row.hasOwnProperty(field)) { + this._createFieldFromJson(tr, row[field], field, rowIndex); + } + } + this._data.push(tr); + }, + + _createFieldFromJson: function (tr, fieldData, fieldName, rowIndex) { + if (!this._fieldIsVisible(fieldName)) { return; } + + var processor = + this._options.processJSONField[fieldName] || // per-field callback + this._options.processJSONField; // generic callback + + var result; + if (typeof processor === 'function') { + result = processor(fieldData, fieldName, rowIndex); + } else { + result = fieldData; + } + var elm = this._elOrFieldData(result); + + var className = this._options.tdClassNames[fieldName]; + if (className) { + Css.addClassName(elm, className); + } + + tr.appendChild(elm); + }, + + _elOrFieldData: function (processed) { + if (Common.isDOMElement(processed)) { + return processed; + } + + var isString = typeof processed === 'string'; + var isNumber = typeof processed === 'number'; + var elm = Element.create('td'); + + if (isString && /^\s*? + * + * + * + * + * + *

      Content

      + *

      Content

      + *

      Content

      + *

      Content

      + *

      Content

      + * + * + * + * + */ + var Tabs = function(selector, options) { + this._element = Common.elOrSelector(selector, 'Ink.UI.Tabs tab container'); + + this._options = Ink.extendObj({ + preventUrlChange: false, + active: undefined, + disabled: [], + onBeforeChange: undefined, + onChange: undefined, + triggerEventsOnLoad: true + }, options || {}, Element.data(this._element)); + + this._handlers = { + tabClicked: Ink.bindEvent(this._onTabClicked,this), + disabledTabClicked: Ink.bindEvent(this._onDisabledTabClicked,this), + resize: Ink.bindEvent(Event.throttle(this._onResize, 100),this) + }; + + this._init(); + }; + + Tabs.prototype = { + + /** + * Init function called by the constructor + * + * @method _init + * @private + */ + _init: function() { + this._menu = Selector.select('.tabs-nav', this._element)[0]; + this._menuTabs = this._menu.children; + this._contentTabs = Selector.select('.tabs-content', this._element); + + //initialization of the tabs, hides all content before setting the active tab + this._initializeDom(); + + // subscribe events + this._observe(); + + //sets the first active tab + this._setFirstActive(); + + this._handlers.resize(); + + Common.registerInstance(this, this._element, 'tabs'); + }, + + /** + * Initialization of the tabs, hides all content before setting the active tab + * + * @method _initializeDom + * @private + */ + _initializeDom: function(){ + for(var i = 0; i < this._contentTabs.length; i++){ + Css.addClassName(this._contentTabs[i], 'hide-all'); + } + }, + + /** + * Subscribe events + * + * @method _observe + * @private + */ + _observe: function() { + InkArray.each(this._menuTabs,Ink.bind(function(elem){ + var link = Selector.select('a', elem)[0]; + if(InkArray.inArray(link.getAttribute('href'), this._options.disabled)){ + this.disable(link); + } else { + this.enable(link); + } + },this)); + + Event.observe(window, 'resize', this._handlers.resize); + }, + + /** + * Run at instantiation, to determine which is the first active tab + * fallsback from window.location.href to options.active to the first not disabled tab + * + * @method _setFirstActive + * @private + */ + _setFirstActive: function() { + var hash = window.location.hash; + + var activeMenuLink = this._findLinkByHref(hash) || + (this._options.active && this._findLinkByHref(this._options.active)) || + Selector.select('a', this._menu)[0]; + + this._changeTab(activeMenuLink, this._options.triggerEventsOnLoad); + }, + + /** + * Changes to the desired tab + * + * @method _changeTab + * @param {DOMElement} link anchor linking to the content container + * @param {boolean} runCallbacks defines if the callbacks should be run or not + * @private + */ + _changeTab: function(link, runCallbacks){ + if(runCallbacks && typeof this._options.onBeforeChange !== 'undefined'){ + this._options.onBeforeChange(this); + } + + var selector = link.getAttribute('href'); + if (this._activeMenuTab) { + Css.removeClassName(this._activeMenuTab, 'active'); + Css.removeClassName(this._activeContentTab, 'active'); + Css.addClassName(this._activeContentTab, 'hide-all'); + } + + this._activeMenuLink = link; + this._activeMenuTab = this._activeMenuLink.parentNode; + this._activeContentTab = Selector.select(selector.substr(selector.indexOf('#')), this._element)[0]; + + if (!this._activeContentTab) { + this._activeMenuLink = this._activeMenuTab = this._activeContentTab = null; + return; + } + + Css.addClassName(this._activeMenuTab, 'active'); + Css.addClassName(this._activeContentTab, 'active'); + Css.removeClassName(this._activeContentTab, 'hide-all'); + + if(runCallbacks && typeof(this._options.onChange) !== 'undefined'){ + this._options.onChange(this); + } + }, + + /** + * Tab clicked handler + * + * @method _onTabClicked + * @param {Event} ev + * @private + */ + _onTabClicked: function(ev) { + Event.stop(ev); + + var target = Event.findElement(ev, 'A'); + if(!target || target.nodeName.toLowerCase() !== 'a') { + return; + } + + var href = target.getAttribute('href').substr(target.getAttribute('href').indexOf('#')); + + if (!href || Ink.i(href.replace(/^#/, '')) === null) { + return; + } + + if (this._options.preventUrlChange.toString() !== 'true') { + window.location.hash = href; + } + + if (target === this._activeMenuLink) { + return; + } + this.changeTab(target); + }, + + /** + * Disabled tab clicked handler + * + * @method _onDisabledTabClicked + * @param {Event} ev + * @private + */ + _onDisabledTabClicked: function(ev) { + Event.stop(ev); + }, + + /** + * Resize handler + * + * @method _onResize + * @private + */ + _onResize: function(){ + var currentLayout = Common.currentLayout(); + if(currentLayout === this._lastLayout){ + return; + } + + if(currentLayout === Common.Layouts.SMALL || currentLayout === Common.Layouts.MEDIUM){ + Css.removeClassName(this._menu, 'menu'); + Css.removeClassName(this._menu, 'horizontal'); + // Css.addClassName(this._menu, 'pills'); + } else { + Css.addClassName(this._menu, 'menu'); + Css.addClassName(this._menu, 'horizontal'); + // Css.removeClassName(this._menu, 'pills'); + } + this._lastLayout = currentLayout; + }, + + /***************** + * Aux Functions * + *****************/ + + /** + * Allows the hash to be passed with or without the cardinal sign + * + * @method _hashify + * @param {String} hash the string to be hashified + * @return {String} Resulting hash + * @private + */ + _hashify: function(hash){ + if(!hash){ + return ""; + } + return hash.indexOf('#') === 0? hash : '#' + hash; + }, + + /** + * Returns the anchor with the desired href + * + * @method _findLinkBuHref + * @param {String} href the href to be found on the returned link + * @return {String|undefined} [description] + * @private + */ + _findLinkByHref: function(href){ + href = this._hashify(href); + + // Find a link which has a href ending with... + return Selector.select('a[href$="' + href + '"]', this._menu)[0]; + }, + + /************** + * PUBLIC API * + **************/ + + /** + * Changes to the desired tag + * + * @method changeTab + * @param {String|DOMElement} selector the id of the desired tab or the link that links to it + * @public + */ + changeTab: function(selector) { + var element = (selector.nodeType === 1)? selector : this._findLinkByHref(this._hashify(selector)); + if(!element || Css.hasClassName(element, 'ink-disabled')){ + return; + } + this._changeTab(element, true); + }, + + /** + * Disables the desired tag + * + * @method disable + * @param {String|DOMElement} selector the id of the desired tab or the link that links to it + * @public + */ + disable: function(selector){ + var element = (selector.nodeType === 1)? selector : this._findLinkByHref(this._hashify(selector)); + if(!element){ + return; + } + Event.stopObserving(element, 'click', this._handlers.tabClicked); + Event.observe(element, 'click', this._handlers.disabledTabClicked); + Css.addClassName(element, 'ink-disabled'); + }, + + /** + * Enables the desired tag + * + * @method enable + * @param {String|DOMElement} selector the id of the desired tab or the link that links to it + * @public + */ + enable: function(selector){ + var element = (selector.nodeType === 1)? selector : this._findLinkByHref(this._hashify(selector)); + if(!element){ + return; + } + Event.stopObserving(element, 'click', this._handlers.disabledTabClicked); + Event.observe(element, 'click', this._handlers.tabClicked); + Css.removeClassName(element, 'ink-disabled'); + }, + + /*********** + * Getters * + ***********/ + + /** + * Returns the active tab id + * + * @method activeTab + * @return {String} ID of the active tab. + * @public + */ + activeTab: function(){ + return this._activeContentTab.getAttribute('id'); + }, + + /** + * Returns the current active Menu LI + * + * @method activeMenuTab + * @return {DOMElement} Active menu LI. + * @public + */ + activeMenuTab: function(){ + return this._activeMenuTab; + }, + + /** + * Returns the current active Menu anchorChanges to the desired tag + * + * @method activeMenuLink + * @return {DOMElement} Active menu link + * @public + */ + activeMenuLink: function(){ + return this._activeMenuLink; + }, + + /** + * Returns the current active Content Tab + * + * @method activeContentTab + * @return {DOMElement} Active Content Tab + * @public + */ + activeContentTab: function(){ + return this._activeContentTab; + }, + + /** + * Unregisters the component and removes its markup from the DOM + * + * @method destroy + * @public + */ + destroy: Common.destroyComponent + }; + + return Tabs; + +}); + +/* + * @module Ink.UI.TagField_1 + * @author inkdev AT sapo.pt + * @version 1 + */ +Ink.createModule("Ink.UI.TagField","1",["Ink.Dom.Element_1", "Ink.Dom.Event_1", "Ink.Dom.Css_1", "Ink.Dom.Browser_1", "Ink.UI.Droppable_1", "Ink.Util.Array_1", "Ink.Dom.Selector_1", "Ink.UI.Common_1"],function( InkElement, InkEvent, Css, Browser, Droppable, InkArray, Selector, Common) { + 'use strict'; + + var enterKey = 13; + var backspaceKey = 8; + var isTruthy = function (val) {return !!val;}; + + /** + * Use this class to have a field where a user can input several tags into a single text field. A good example is allowing the user to describe a blog post or a picture through tags, for later searching. + * + * The markup is as follows: + * + * + * + * By applying this UI class to the above input, you get a tag field with the tags "initial" and "value". The class preserves the original input element. It remains hidden and is updated with new tag information dynamically, so regular HTML form logic still applies. + * + * Below "input" refers to the current value of the input tag (updated as the user enters text, of course), and "output" refers to the value which this class writes back to said input tag. + * + * @class Ink.UI.TagField + * @version 1 + * @constructor + * @param {String|InputElement} element Selector or DOM Input Element. + * @param {Object} [options] + * @param {String|Array} [options.tags] initial tags in the input + * @param {Boolean} [options.allowRepeated=true] allow user to input several tags + * @param {RegExp} [options.separator=/[,;(space)]+/g] Split the input by this RegExp. The default splits by spaces, commas and semicolons + * @param {String} [options.outSeparator=','] Use this string to separate each tag from the next in the output. + * @param {Boolean} [options.autoSplit=true] + * @param {Integer} [options.maxTags=-1] Maximum amount of tags the user can write. + * @example + */ + function TagField(element, options) { + this.init(element, options); + } + + TagField.prototype = { + /** + * Init function called by the constructor + * + * @method _init + * @private + */ + init: function(element, options) { + element = this._element = Common.elOrSelector(element, 'Ink.UI.TagField'); + var o = this._options = Common.options('Ink.UI.TagField', { + tags: ['String', []], + tagQuery: ['Object', null], + tagQueryAsync: ['Object', null], + allowRepeated: ['Boolean', false], + maxTags: ['Integer', -1], + outSeparator: ['String', ','], + separator: ['String', /[,; ]+/g], + autoSplit: ['Boolean', true] + }, options || {}, this._element); + + if (typeof o.separator === 'string') { + o.separator = new RegExp(o.separator, 'g'); + } + + if (typeof o.tags === 'string') { + // coerce to array using the separator + o.tags = this._readInput(o.tags); + } + + Css.addClassName(this._element, 'hide-all'); + + this._viewElm = InkElement.create('div', { + className: 'ink-tagfield', + insertAfter: this._element + }); + + this._input = InkElement.create('input', { + type: 'text', + className: 'new-tag-input', + insertBottom: this._viewElm + }); + + var tags = [].concat(o.tags, this._tagsFromMarkup(this._element)); + + this._tags = []; + + InkArray.each(tags, Ink.bindMethod(this, '_addTag')); + + InkEvent.observe(this._input, 'keyup', Ink.bindEvent(this._onKeyUp, this)); + InkEvent.observe(this._input, 'change', Ink.bindEvent(this._onKeyUp, this)); + InkEvent.observe(this._input, 'keydown', Ink.bindEvent(this._onKeyDown, this)); + InkEvent.observe(this._input, 'blur', Ink.bindEvent(this._onBlur, this)); + InkEvent.observe(this._viewElm, 'click', Ink.bindEvent(this._refocus, this)); + }, + + destroy: function () { + InkElement.remove(this._viewElm); + Css.removeClassName(this._element, 'hide-all'); + }, + + _tagsFromMarkup: function (element) { + var tagname = element.tagName.toLowerCase(); + if (tagname === 'input') { + return this._readInput(element.value); + } else if (tagname === 'select') { + return InkArray.map(element.getElementsByTagName('option'), function (option) { + return InkElement.textContent(option); + }); + } else { + throw new Error('Cannot read tags from a ' + tagname + ' tag. Unknown tag'); + } + }, + + _tagsToMarkup: function (tags, element) { + var tagname = element.tagName.toLowerCase(); + if (tagname === 'input') { + if (this._options.separator) { + element.value = tags.join(this._options.outSeparator); + } + } else if (tagname === 'select') { + element.innerHTML = ''; + InkArray.each(tags, function (tag) { + var opt = InkElement.create('option', {selected: 'selected'}); + InkElement.setTextContent(opt, tag); + element.appendChild(opt); + }); + } else { + throw new Error('TagField: Cannot read tags from a ' + tagname + ' tag. Unknown tag'); + } + }, + + _addTag: function (tag) { + if (this._options.maxTags !== -1 && + this._tags.length >= this._options.maxTags) { + return; + } + if ((!this._options.allowRepeated && + InkArray.inArray(tag, this._tags, tag)) || !tag) { + return false; + } + var elm = InkElement.create('span', { + className: 'ink-tag', + setTextContent: tag + ' ' + }); + + var remove = InkElement.create('span', { + className: 'remove icon icon-remove icon-times', // fontawesome 3 changed icon-remove's name to icon-times + insertBottom: elm + }); + InkEvent.observe(remove, 'click', Ink.bindEvent(this._removeTag, this, null)); + + var spc = document.createTextNode(' '); + + this._tags.push(tag); + this._viewElm.insertBefore(elm, this._input); + this._viewElm.insertBefore(spc, this._input); + this._tagsToMarkup(this._tags, this._element); + }, + + _readInput: function (text) { + if (this._options.separator) { + return InkArray.filter(text.split(this._options.separator), isTruthy); + } else { + return [text]; + } + }, + + _onKeyUp: function () { // TODO control input box size + if (!this._options.autoSplit) { + return; + } + var split = this._input.value.split(this._options.separator); + if (split.length <= 1) { + return; + } + var last = split[split.length - 1]; + split = split.splice(0, split.length - 1); + split = InkArray.filter(split, isTruthy); + + InkArray.each(split, Ink.bind(this._addTag, this)); + this._input.value = last; + }, + + _onKeyDown: function (event) { + if (event.which === enterKey) { + return this._onEnterKeyDown(event); + } else if (event.which === backspaceKey) { + return this._onBackspaceKeyDown(); + } else if (this._removeConfirm) { + // user pressed another key, cancel removal from a backspace key + this._unsetRemovingVisual(this._tags.length - 1); + } + }, + + /** + * When the user presses backspace twice on the empty input, we delete the last tag on the field. + * @method onBackspaceKeyDown + * @private + */ + _onBackspaceKeyDown: function () { + if (this._input.value) { return; } + + if (this._removeConfirm) { + this._unsetRemovingVisual(this._tags.length - 1); + this._removeTag(this._tags.length - 1); + this._removeConfirm = null; + } else { + this._setRemovingVisual(this._tags.length - 1); + } + }, + + _onEnterKeyDown: function (event) { + var tag = this._input.value; + if (tag) { + this._addTag(tag); + this._input.value = ''; + } + InkEvent.stopDefault(event); + }, + + _onBlur: function () { + this._addTag(this._input.value); + this._input.value = ''; + }, + + /* For when the user presses backspace. + * Set the style of the tag so that it seems like it's going to be removed + * if they press backspace again. */ + _setRemovingVisual: function (tagIndex) { + var elm = this._viewElm.children[tagIndex]; + Css.addClassName(elm, 'tag-deleting'); + + this._removeRemovingVisualTimeout = setTimeout(Ink.bindMethod(this, '_unsetRemovingVisual', tagIndex), 4000); + InkEvent.observe(this._input, 'blur', Ink.bindMethod(this, '_unsetRemovingVisual', tagIndex)); + this._removeConfirm = true; + }, + _unsetRemovingVisual: function (tagIndex) { + var elm = this._viewElm.children[tagIndex]; + if (elm) { + Css.removeClassName(elm, 'tag-deleting'); + clearTimeout(this._removeRemovingVisualTimeout); + } + this._removeConfirm = null; + }, + + _removeTag: function (event) { + var index; + if (typeof event === 'object') { // click event on close button + var elm = InkEvent.element(event).parentNode; + index = InkElement.parentIndexOf(this._viewElm, elm); + } else if (typeof event === 'number') { // manual removal + index = event; + } + this._tags = InkArray.remove(this._tags, index, 1); + InkElement.remove(this._viewElm.children[index]); + this._tagsToMarkup(this._tags, this._element); + }, + + _refocus: function (event) { + this._input.focus(); + InkEvent.stop(event); + return false; + } + }; + return TagField; +}); + +/** + * @module Ink.UI.Toggle_1 + * @author inkdev AT sapo.pt + * @version 1 + */ +Ink.createModule('Ink.UI.Toggle', '1', ['Ink.UI.Common_1','Ink.Dom.Event_1','Ink.Dom.Css_1','Ink.Dom.Element_1','Ink.Dom.Selector_1','Ink.Util.Array_1'], function(Common, InkEvent, Css, InkElement, Selector, InkArray ) { + 'use strict'; + + /** + * Toggle component + * + * @class Ink.UI.Toggle + * @constructor + * @version 1 + * @param {String|DOMElement} selector + * @param {Object} [options] Options + * @param {String} options.target CSS Selector that specifies the elements that this component will toggle + * @param {String} [options.classNameOn='show-all'] className when toggle is On + * @param {String} [options.classNameOff='hide-all'] className when toggle is Off. + * @param {String} [options.triggerEvent='click'] Event that will trigger the toggling. + * @param {Boolean} [options.closeOnClick=true] When this is on, if the user clicks outside of the toggled content, the target is toggled off. + * @param {Selector} [options.closeOnInsideClick='a[href]'] Toggle off when an element matching this selector is clicked. Set to null to deactivate the check. Default: 'a[href]' (finds links) + * @param {Boolean} [options.initialState=null] Whether to start toggled off, on, or as found in the markup. (false: off, true: on, null: markup) + * @param {Function} [options.onChangeState=null] Callback to be called when the toggle state changes. Return `false` to cancel the event. + * + * @example + *
      + * + * + *
      + * + */ + var Toggle = function( selector, options ){ + this._rootElement = Common.elOrSelector(selector, '[Ink.UI.Toggle root element]:'); + + this._options = Ink.extendObj({ + target : undefined, + triggerEvent: 'click', + closeOnClick: true, + isAccordion: false, + initialState: null, + classNameOn: 'show-all', + classNameOff: 'hide-all', + togglesDisplay: null, + closeOnInsideClick: 'a[href]', // closes the toggle when a target is clicked and it is a link + onChangeState: null + }, options || {}, InkElement.data(this._rootElement)); + + this._targets = Common.elsOrSelector(this._options.target, 'Ink.UI.Toggle target option'); + + // Boolean option handling + this._options.closeOnClick = this._options.closeOnClick.toString() === 'true'; + // Actually a throolean + if (this._options.initialState !== null){ + this._options.initialState = this._options.initialState.toString() === 'true'; + } else { + this._options.initialState = Css.getStyle(this._targets[0], 'display') !== 'none'; + } + + if (this._options.classNameOn !== 'show-all' || this._options.classNameOff !== 'hide-all') { + for (var i = 0, len = this._targets.length; i < len; i++) { + Css.removeClassName(this._targets[i], 'show-all'); + Css.removeClassName(this._targets[i], 'hide-all'); + } + } + + this._init(); + }; + + Toggle.prototype = { + + /** + * Init function called by the constructor + * + * @method _init + * @private + */ + _init: function(){ + this._accordion = ( Css.hasClassName(this._rootElement.parentNode,'accordion') || Css.hasClassName(this._targets[0].parentNode,'accordion') ); + + this._firstTime = true; + + this._bindEvents(); + + if (this._options.initialState !== null) { + this.setState(this._options.initialState, true); + } else { + // Add initial classes matching the current "display" of the object. + var state = Css.getStyle(this._targets[0], 'display') !== 'none'; + this.setState(state, true); + } + // Aditionally, remove any inline "display" style. + for (var i = 0, len = this._targets.length; i < len; i++) { + if (this._targets[i].style.display) { + this._targets[i].style.display = ''; // becomes default + } + } + }, + + /** + * @method _bindEvents + * @private + */ + _bindEvents: function () { + if ( this._options.triggerEvent ) { + InkEvent.observe( + this._rootElement, + this._options.triggerEvent, + Ink.bind(this._onTriggerEvent, this)); + } + if( this._options.closeOnClick ){ + InkEvent.observe( document, 'click', Ink.bind(this._onOutsideClick, this)); + } + if( this._options.closeOnInsideClick ) { + var sel = this._options.closeOnInsideClick; + if (sel.toString() === 'true') { + sel = '*'; + } + InkEvent.observeMulti(this._targets, 'click', Ink.bind(function (e) { + if ( InkElement.findUpwardsBySelector(InkEvent.element(e), sel) ) { + this.setState(false, true); + } + }, this)); + } + }, + + /** + * Event handler. It's responsible for handling the `triggerEvent` as defined in the options. + * + * This will trigger the toggle. + * + * @method _onTriggerEvent + * @param {Event} event + * @private + */ + _onTriggerEvent: function( event ){ + // When the togglee is a child of the toggler, we get the togglee's events here. We have to check that this event is for us. + var target = InkEvent.element(event); + + var isAncestorOfClickedElement = InkArray.some(this._targets, function (thisOne) { + return thisOne === target || InkElement.isAncestorOf(thisOne, target); + }); + + if (isAncestorOfClickedElement) { + return; + } + + if (this._accordion) { + this._updateAccordion(); + } + + var has = this.getState(); + this.setState(!has, true); + if (!has && this._firstTime) { + this._firstTime = false; + } + + InkEvent.stopDefault(event); + }, + + /** + * Be compatible with accordions + * + * @method _updateAccordion + **/ + _updateAccordion: function () { + var elms, accordionElement; + if( Css.hasClassName(this._targets[0].parentNode,'accordion') ){ + accordionElement = this._targets[0].parentNode; + } else { + accordionElement = this._targets[0].parentNode.parentNode; + } + elms = Selector.select('.toggle, .ink-toggle',accordionElement); + for(var i=0; i 0) && (targetElm[0] !== this._targets[0]) ){ + targetElm[0].style.display = 'none'; + } + } + }, + + /** + * Click handler. Will handle clicks outside the toggle component. + * + * @method _onOutsideClick + * @param {Event} event + * @private + */ + _onOutsideClick: function( event ){ + var tgtEl = InkEvent.element(event), + shades; + + var ancestorOfTargets = InkArray.some(this._targets, function (target) { + return InkElement.isAncestorOf(target, tgtEl) || target === tgtEl; + }); + + if( (this._rootElement === tgtEl) || InkElement.isAncestorOf(this._rootElement, tgtEl) || ancestorOfTargets /*|| this._firstTime (I forgot what this last check was for) */) { + return; + } else if( (shades = Ink.ss('.ink-shade')).length ) { + var shadesLength = shades.length; + + for( var i = 0; i < shadesLength; i++ ){ + if( InkElement.isAncestorOf(shades[i],tgtEl) && InkElement.isAncestorOf(shades[i],this._rootElement) ){ + return; + } + } + } + + this.setState(false, true); // dismiss + }, + + /** + * Sets the state of the toggle. (on/off) + * + * @param on {Boolean} New state (on/off) + * + * @method setState + */ + setState: function (on, callHandler) { + if (on === this.getState()) { return; } + if (callHandler && typeof this._options.onChangeState === 'function') { + var ret = this._options.onChangeState(on); + if (ret === false) { return false; } // Canceled by the event handler + } + for (var i = 0, len = this._targets.length; i < len; i++) { + Css.addRemoveClassName(this._targets[i], this._options.classNameOn, on); + Css.addRemoveClassName(this._targets[i], this._options.classNameOff, !on); + } + Css.addRemoveClassName(this._rootElement, 'active', on); + }, + + /** + * Gets the state of the toggle. (on/off) + * + * @method getState + * + * @return {Boolean} whether the toggle is toggled on. + */ + getState: function () { + return Css.hasClassName(this._rootElement, 'active'); + } + }; + + return Toggle; +}); + + +/** + * @module Ink.UI.Tooltip_1 + * @author inkdev AT sapo.pt + */ +Ink.createModule('Ink.UI.Tooltip', '1', ['Ink.UI.Common_1', 'Ink.Dom.Event_1', 'Ink.Dom.Element_1', 'Ink.Dom.Selector_1', 'Ink.Util.Array_1', 'Ink.Dom.Css_1', 'Ink.Dom.Browser_1'], function (Common, InkEvent, InkElement, Selector, InkArray, Css) { + 'use strict'; + + /** + * @class Ink.UI.Tooltip + * @constructor + * + * @param {DOMElement|String} target Target element or selector of elements, to display the tooltips on. + * @param {Object} [options] + * @param [options.text=''] Text content for the tooltip. + * @param [options.html=''] HTML for the tooltip. Same as above, but won't escape HTML. + * @param [options.where='up'] Positioning for the tooltip. Options: + * @param options.where.up/down/left/right Place above, below, to the left of, or to the right of, the target. Show an arrow. + * @param options.where.mousemove Place the tooltip to the bottom and to the right of the mouse when it hovers the element, and follow the mouse as it moves. + * @param options.where.mousefix Place the tooltip to the bottom and to the right of the mouse when it hovers the element, keep the tooltip there motionless. + * + * @param [options.color=''] Color of the tooltip. Options are red, orange, blue, green and black. Default is white. + * @param [options.fade=0.3] Fade time; Duration of the fade in/out effect. + * @param [options.forever=0] Set to 1/true to prevent the tooltip from being erased when the mouse hovers away from the target + * @param [options.timeout=0] Time for the tooltip to live. Useful together with [options.forever]. + * @param [options.delay] Time the tooltip waits until it is displayed. Useful to avoid getting the attention of the user unnecessarily + * @param [options.template=null] Element or selector containing HTML to be cloned into the tooltips. Can be a hidden element, because CSS `display` is set to `block`. + * @param [options.templatefield=null] Selector within the template element to choose where the text is inserted into the tooltip. Useful when a wrapper DIV is required. + * + * @param [options.left,top=10] (Nitty-gritty) Spacing from the target to the tooltip, when `where` is `mousemove` or `mousefix` + * @param [options.spacing=8] (Nitty-gritty) Spacing between the tooltip and the target element, when `where` is `up`, `down`, `left`, or `right` + * + * @example + *
        + *
      • New
      • + *
      • Quit
      • + *
      • Save
      • + *
      + * + * [...] + * + * + */ + function Tooltip(element, options) { + this._init(element, options || {}); + } + + function EachTooltip(root, elm) { + this._init(root, elm); + } + + var transitionDurationName, + transitionPropertyName, + transitionTimingFunctionName; + (function () { // Feature detection + var test = document.createElement('DIV'); + var names = ['transition', 'oTransition', 'msTransition', 'mozTransition', + 'webkitTransition']; + for (var i = 0; i < names.length; i++) { + if (typeof test.style[names[i] + 'Duration'] !== 'undefined') { + transitionDurationName = names[i] + 'Duration'; + transitionPropertyName = names[i] + 'Property'; + transitionTimingFunctionName = names[i] + 'TimingFunction'; + break; + } + } + }()); + + // Body or documentElement + var bodies = document.getElementsByTagName('body'); + var body = bodies.length ? bodies[0] : document.documentElement; + + Tooltip.prototype = { + _init: function(element, options) { + var elements; + + this.options = Ink.extendObj({ + where: 'up', + zIndex: 10000, + left: 10, + top: 10, + spacing: 8, + forever: 0, + color: '', + timeout: 0, + delay: 0, + template: null, + templatefield: null, + fade: 0.3, + text: '' + }, options || {}); + + if (typeof element === 'string') { + elements = Selector.select(element); + } else if (typeof element === 'object') { + elements = [element]; + } else { + throw 'Element expected'; + } + + this.tooltips = []; + + for (var i = 0, len = elements.length; i < len; i++) { + this.tooltips[i] = new EachTooltip(this, elements[i]); + } + }, + /** + * Destroys the tooltips created by this instance + * + * @method destroy + */ + destroy: function () { + InkArray.each(this.tooltips, function (tooltip) { + tooltip._destroy(); + }); + this.tooltips = null; + this.options = null; + } + }; + + EachTooltip.prototype = { + _oppositeDirections: { + left: 'right', + right: 'left', + up: 'down', + down: 'up' + }, + _init: function(root, elm) { + InkEvent.observe(elm, 'mouseover', Ink.bindEvent(this._onMouseOver, this)); + InkEvent.observe(elm, 'mouseout', Ink.bindEvent(this._onMouseOut, this)); + InkEvent.observe(elm, 'mousemove', Ink.bindEvent(this._onMouseMove, this)); + + this.root = root; + this.element = elm; + this._delayTimeout = null; + this.tooltip = null; + }, + _makeTooltip: function (mousePosition) { + if (!this._getOpt('text') && + !this._getOpt('html') && + !InkElement.hasAttribute(this.element, 'title')) { + return false; + } + + var tooltip = this._createTooltipElement(); + + if (this.tooltip) { + this._removeTooltip(); + } + + this.tooltip = tooltip; + + this._fadeInTooltipElement(tooltip); + this._placeTooltipElement(tooltip, mousePosition); + + InkEvent.observe(tooltip, 'mouseover', Ink.bindEvent(this._onTooltipMouseOver, this)); + + var timeout = this._getFloatOpt('timeout'); + if (timeout) { + setTimeout(Ink.bind(function () { + if (this.tooltip === tooltip) { + this._removeTooltip(); + } + }, this), timeout * 1000); + } + }, + _createTooltipElement: function () { + var template = this._getOpt('template'), // User template instead of our HTML + templatefield = this._getOpt('templatefield'), + + tooltip, // The element we float + field; // Element where we write our message. Child or same as the above + + if (template) { // The user told us of a template to use. We copy it. + var temp = document.createElement('DIV'); + temp.innerHTML = Common.elOrSelector(template, 'options.template').outerHTML; + tooltip = temp.firstChild; + + if (templatefield) { + field = Selector.select(templatefield, tooltip); + if (field) { + field = field[0]; + } else { + throw 'options.templatefield must be a valid selector within options.template'; + } + } else { + field = tooltip; // Assume same element if user did not specify a field + } + } else { // We create the default structure + tooltip = document.createElement('DIV'); + Css.addClassName(tooltip, 'ink-tooltip'); + Css.addClassName(tooltip, this._getOpt('color')); + + field = document.createElement('DIV'); + Css.addClassName(field, 'content'); + + tooltip.appendChild(field); + } + + if (this._getOpt('html')) { + field.innerHTML = this._getOpt('html'); + } else if (this._getOpt('text')) { + InkElement.setTextContent(field, this._getOpt('text')); + } else { + InkElement.setTextContent(field, this.element.getAttribute('title')); + } + tooltip.style.display = 'block'; + tooltip.style.position = 'absolute'; + tooltip.style.zIndex = this._getIntOpt('zIndex'); + + return tooltip; + }, + _fadeInTooltipElement: function (tooltip) { + var fadeTime = this._getFloatOpt('fade'); + if (transitionDurationName && fadeTime) { + tooltip.style.opacity = '0'; + tooltip.style[transitionDurationName] = fadeTime + 's'; + tooltip.style[transitionPropertyName] = 'opacity'; + tooltip.style[transitionTimingFunctionName] = 'ease-in-out'; + setTimeout(function () { + tooltip.style.opacity = '1'; + }, 0); // Wait a tick + } + }, + _placeTooltipElement: function (tooltip, mousePosition) { + var where = this._getOpt('where'); + + if (where === 'mousemove' || where === 'mousefix') { + var mPos = mousePosition; + this._setPos(mPos[0], mPos[1]); + body.appendChild(tooltip); + } else if (where.match(/(up|down|left|right)/)) { + body.appendChild(tooltip); + var targetElementPos = InkElement.offset(this.element); + var tleft = targetElementPos[0], + ttop = targetElementPos[1]; + + var centerh = (InkElement.elementWidth(this.element) / 2) - (InkElement.elementWidth(tooltip) / 2), + centerv = (InkElement.elementHeight(this.element) / 2) - (InkElement.elementHeight(tooltip) / 2); + var spacing = this._getIntOpt('spacing'); + + var tooltipDims = InkElement.elementDimensions(tooltip); + var elementDims = InkElement.elementDimensions(this.element); + + var maxX = InkElement.scrollWidth() + InkElement.viewportWidth(); + var maxY = InkElement.scrollHeight() + InkElement.viewportHeight(); + + where = this._getWhereValueInsideViewport(where, { + left: tleft - tooltipDims[0], + right: tleft + tooltipDims[0], + top: ttop + tooltipDims[1], + bottom: ttop + tooltipDims[1] + }, { + right: maxX, + bottom: maxY + }); + + if (where === 'up') { + ttop -= tooltipDims[1]; + ttop -= spacing; + tleft += centerh; + } else if (where === 'down') { + ttop += elementDims[1]; + ttop += spacing; + tleft += centerh; + } else if (where === 'left') { + tleft -= tooltipDims[0]; + tleft -= spacing; + ttop += centerv; + } else if (where === 'right') { + tleft += elementDims[0]; + tleft += spacing; + ttop += centerv; + } + + var arrow = null; + if (where.match(/(up|down|left|right)/)) { + arrow = document.createElement('SPAN'); + Css.addClassName(arrow, 'arrow'); + Css.addClassName(arrow, this._oppositeDirections[where]); + tooltip.appendChild(arrow); + } + + var tooltipLeft = tleft; + var tooltipTop = ttop; + + var toBottom = (tooltipTop + tooltipDims[1]) - maxY; + var toRight = (tooltipLeft + tooltipDims[0]) - maxX; + var toLeft = 0 - tooltipLeft; + var toTop = 0 - tooltipTop; + + if (toBottom > 0) { + if (arrow) { arrow.style.top = (tooltipDims[1] / 2) + toBottom + 'px'; } + tooltipTop -= toBottom; + } else if (toTop > 0) { + if (arrow) { arrow.style.top = (tooltipDims[1] / 2) - toTop + 'px'; } + tooltipTop += toTop; + } else if (toRight > 0) { + if (arrow) { arrow.style.left = (tooltipDims[0] / 2) + toRight + 'px'; } + tooltipLeft -= toRight; + } else if (toLeft > 0) { + if (arrow) { arrow.style.left = (tooltipDims[0] / 2) - toLeft + 'px'; } + tooltipLeft += toLeft; + } + + tooltip.style.left = tooltipLeft + 'px'; + tooltip.style.top = tooltipTop + 'px'; + } + }, + + /** + * Get a value for "where" (left/right/up/down) which doesn't put the + * tooltip off the screen + * + * @method _getWhereValueInsideViewport + * @param where {String} "where" value which was given by the user and we might change + * @param bbox {BoundingBox} A bounding box like what you get from getBoundingClientRect ({top, bottom, left, right}) with pixel positions from the top left corner of the viewport. + * @param viewport {BoundingBox} Bounding box for the viewport. "top" and "left" are omitted because these coordinates are relative to the top-left corner of the viewport so they are zero. + * + * @note: we can't use getBoundingClientRect in this case because it returns {0,0,0,0} on our uncreated tooltip. + */ + _getWhereValueInsideViewport: function (where, bbox, viewport) { + if (where === 'left' && bbox.left < 0) { + return 'right'; + } else if (where === 'right' && bbox.right > viewport.right) { + return 'left'; + } else if (where === 'up' && bbox.top < 0) { + return 'down'; + } else if (where === 'down' && bbox.bottom > viewport.bottom) { + return 'up'; + } + + return where; + }, + _removeTooltip: function() { + var tooltip = this.tooltip; + if (!tooltip) {return;} + + var remove = Ink.bind(InkElement.remove, {}, tooltip); + + if (this._getOpt('where') !== 'mousemove' && transitionDurationName) { + tooltip.style.opacity = 0; + // remove() will operate on correct tooltip, although this.tooltip === null then + setTimeout(remove, this._getFloatOpt('fade') * 1000); + } else { + remove(); + } + this.tooltip = null; + }, + _getOpt: function (option) { + var dataAttrVal = InkElement.data(this.element)[InkElement._camelCase('tip-' + option)]; + if (dataAttrVal /* either null or "" may signify the absense of this attribute*/) { + return dataAttrVal; + } + var instanceOption = this.root.options[option]; + if (typeof instanceOption !== 'undefined') { + return instanceOption; + } + }, + _getIntOpt: function (option) { + return parseInt(this._getOpt(option), 10); + }, + _getFloatOpt: function (option) { + return parseFloat(this._getOpt(option), 10); + }, + _destroy: function () { + if (this.tooltip) { + InkElement.remove(this.tooltip); + } + this.root = null; // Cyclic reference = memory leaks + this.element = null; + this.tooltip = null; + }, + _onMouseOver: function(e) { + // on IE < 10 you can't access the mouse event not even a tick after it fired + var mousePosition = this._getMousePosition(e); + var delay = this._getFloatOpt('delay'); + if (delay) { + this._delayTimeout = setTimeout(Ink.bind(function () { + if (!this.tooltip) { + this._makeTooltip(mousePosition); + } + this._delayTimeout = null; + }, this), delay * 1000); + } else { + this._makeTooltip(mousePosition); + } + }, + _onMouseMove: function(e) { + if (this._getOpt('where') === 'mousemove' && this.tooltip) { + var mPos = this._getMousePosition(e); + this._setPos(mPos[0], mPos[1]); + } + }, + _onMouseOut: function () { + if (!this._getIntOpt('forever')) { + this._removeTooltip(); + } + if (this._delayTimeout) { + clearTimeout(this._delayTimeout); + this._delayTimeout = null; + } + }, + _onTooltipMouseOver: function () { + if (this.tooltip) { // If tooltip is already being removed, this has no effect + this._removeTooltip(); + } + }, + _setPos: function(left, top) { + left += this._getIntOpt('left'); + top += this._getIntOpt('top'); + var pageDims = this._getPageXY(); + if (this.tooltip) { + var elmDims = [InkElement.elementWidth(this.tooltip), InkElement.elementHeight(this.tooltip)]; + var scrollDim = this._getScroll(); + + if((elmDims[0] + left - scrollDim[0]) >= (pageDims[0] - 20)) { + left = (left - elmDims[0] - this._getIntOpt('left') - 10); + } + if((elmDims[1] + top - scrollDim[1]) >= (pageDims[1] - 20)) { + top = (top - elmDims[1] - this._getIntOpt('top') - 10); + } + + this.tooltip.style.left = left + 'px'; + this.tooltip.style.top = top + 'px'; + } + }, + _getPageXY: function() { + var cWidth = 0; + var cHeight = 0; + if( typeof( window.innerWidth ) === 'number' ) { + cWidth = window.innerWidth; + cHeight = window.innerHeight; + } else if( document.documentElement && ( document.documentElement.clientWidth || document.documentElement.clientHeight ) ) { + cWidth = document.documentElement.clientWidth; + cHeight = document.documentElement.clientHeight; + } else if( document.body && ( document.body.clientWidth || document.body.clientHeight ) ) { + cWidth = document.body.clientWidth; + cHeight = document.body.clientHeight; + } + return [parseInt(cWidth, 10), parseInt(cHeight, 10)]; + }, + _getScroll: function() { + var dd = document.documentElement, db = document.body; + if (dd && (dd.scrollLeft || dd.scrollTop)) { + return [dd.scrollLeft, dd.scrollTop]; + } else if (db) { + return [db.scrollLeft, db.scrollTop]; + } else { + return [0, 0]; + } + }, + _getMousePosition: function(e) { + return [parseInt(InkEvent.pointerX(e), 10), parseInt(InkEvent.pointerY(e), 10)]; + } + }; + + return Tooltip; +}); + +/** + * @module Ink.UI.TreeView_1 + * @author inkdev AT sapo.pt + * @version 1 + */ +Ink.createModule('Ink.UI.TreeView', '1', ['Ink.UI.Common_1','Ink.Dom.Event_1','Ink.Dom.Css_1','Ink.Dom.Element_1','Ink.Dom.Selector_1','Ink.Util.Array_1'], function(Common, Event, Css, Element, Selector, InkArray ) { + 'use strict'; + + /** + * Shows elements in a tree-like hierarchical structure. + * + * @class Ink.UI.TreeView + * @constructor + * @version 1 + * @param {String|DOMElement} selector + * @param {String} [options.node='li'] Selector to define which elements are seen as nodes. + * @param {String} [options.children='ul'] Selector to define which elements are represented as children. + * @param {String} [options.parentClass='parent'] Classes to be added to the parent node. + * @param {String} [options.openClass='icon icon-minus-circle'] Classes to be added to the icon when a parent is open. + * @param {String} [options.closedClass='icon icon-plus-circle'] Classes to be added to the icon when a parent is closed. + * @param {String} [options.hideClass='hide-all'] Class to toggle visibility of the children. + * @param {String} [options.iconTag='i'] The name of icon tag. The component tries to find a tag with that name as a direct child of the node. If it doesn't find it, it creates it. + * @param {Boolean} [options.stopDefault=true] Stops the default behavior of the click handler. + * @example + * + * + */ + var TreeView = function(selector, options){ + this._element = Common.elOrSelector(selector, '[Ink.UI.TreeView_1]'); + + this._options = Common.options('Treeview', { + 'node': ['String', 'li'], + // [3.0.1] Deprecate this terrible, terrible name + 'child': ['String','ul'], + 'children': ['String','ul'], + 'parentClass': ['String','parent'], + // [3.0.0] use these classes because you'll have font-awesome 4 + // 'openClass': ['String','fa fa-minus-circle'], + // 'closedClass': ['String','fa fa-plus-circle'], + 'openNodeClass': ['String', 'open'], + 'openClass': ['String','icon-minus-sign'], + 'closedClass': ['String','icon-plus-sign'], + 'hideClass': ['String','hide-all'], + 'iconTag': ['String', 'i'], + 'stopDefault' : ['Boolean', true] + }, options || {}, this._element); + + if (this._options.child) { + Ink.warn('Ink.UI.TreeView: options.child is being renamed to options.children.'); + this._options.children = this._options.child; + } + + this._init(); + }; + + TreeView.prototype = { + + /** + * Init function called by the constructor. Sets the necessary event handlers. + * + * @method _init + * @private + */ + _init: function(){ + this._handlers = { + click: Ink.bindEvent(this._onClick,this) + }; + + Event.on(this._element, 'click', this._options.node, this._handlers.click); + + InkArray.each(Ink.ss(this._options.node, this._element), Ink.bind(function(item){ + if( this.isParent(item) ) { + Css.addClassName(item, this._options.parentClass); + + var isOpen = this.isOpen(item); + if( !this._getIcon(item) ){ + Element.create(this._options.iconTag, { insertTop: item }); + } + + this._setNodeOpen(item, isOpen); + } + },this)); + }, + + _getIcon: function (node) { + return Ink.s('> ' + this._options.iconTag, node); + }, + + isOpen: function (node) { + if (!this._getChild(node)) { + throw new Error('not a node!'); + } + + return Element.data(node).open === 'true' || + Css.hasClassName(node, this._options.openNodeClass); + }, + + isParent: function (node) { + return Css.hasClassName(node, this._options.parentClass) || + this._getChild(node) != null; + }, + + _setNodeOpen: function (node, beOpen) { + var child = this._getChild(node); + if (child) { + Css.setClassName(child, this._options.hideClass, !beOpen); + var icon = this._getIcon(node); + + node.setAttribute('data-open', beOpen); + + Css.setClassName(icon, this._options.openClass, beOpen); + Css.setClassName(icon, this._options.closedClass, !beOpen); + Css.setClassName(node, this._options.openNodeClass, beOpen); + } else { + Ink.error('Ink.UI.TreeView: node', node, 'is not a node!'); + } + }, + + open: function (node) { + this._setNodeOpen(node, true); + }, + + close: function (node) { + this._setNodeOpen(node, false); + }, + + toggle: function (node) { + if (this.isOpen(node)) { + this.close(node); + } else { + this.open(node); + } + }, + + _getChild: function (node) { + return Selector.select(this._options.child, node)[0] || null; + }, + + /** + * Handles the click event (as specified in the _init function). + * + * @method _onClick + * @param {Event} event + * @private + */ + _onClick: function(ev){ + /** + * Summary: + * If the clicked element is a "node" as defined in the options, will check if it has any "child". + * If so, will toggle its state and stop the event's default behavior if the stopDefault option is true. + **/ + + if (!this.isParent(ev.currentTarget) || + Selector.matchesSelector(ev.target, this._options.node) || + Selector.matchesSelector(ev.target, this._options.child)) { + return; + } + + if (this._options.stopDefault){ + ev.preventDefault(); + } + + this.toggle(ev.currentTarget); + } + }; + + return TreeView; +}); + +Ink.createModule('Ink.UI.Upload', '1', [ + 'Ink.Dom.Event_1', + 'Ink.Dom.Element_1', + 'Ink.Dom.Browser_1', + 'Ink.UI.Common_1' +], function(Event, Element, Browser, Common) { + 'use strict'; + + var DirectoryReader = function(options) { + this.init(options); + }; + + DirectoryReader.prototype = { + init: function(options) { + this.options = Ink.extendObj({ + entry: undefined, + maxDepth: 10 + }, options || {}); + + try { + this._read(); + } catch(e) { + Ink.error(e); + } + }, + + + _read: function() { + if(!this.options.entry) { + throw("The entry specify you must"); + } + + try { + this._readDirectories(); + } catch(e) { + Ink.error(e); + } + }, + + + _readDirectories: function() { + var entries = [], + running = false, + maxDepth = 0; + + /* TODO return as tree because much better well */ + var _readEntries = Ink.bind(function(currentEntry) { + var dir = currentEntry.createReader(); + running = true; + + dir.readEntries(Ink.bind(function(res) { + if(res.length > 0) { + for(var i = 0, len = res.length; i=0; i--) { + if(typeof(arr[i]) === 'undefined' || arr[i] === null || arr[i] === '') { + arr.splice(i, 1); + } + } + return arr; + } + }; + + var Queue = { + lists: [], + items: [], + + + /** + * @function {Public} ? Create new queue list + * @param {String} list name + * @param {Function} function to iterate on items + * @return {Object} list id + */ + create: function(name) { + var id; + name = String(name); + this.lists.push({name: name}); + id = this.lists.length - 1; + return id; + }, + + + getItems: function(parentId) { + if(!parentId) { + return this.items; + } + var items = []; + for(var i = 0, len = this.items.length; i=0; i--) { + if(this.items[i] && id === this.items[i].parentId) { + this.remove(this.items[i].parentId, this.items[i].pid); + } + } + if(!keepList) { + this.lists.splice(id, 1); + } + return true; + } catch(e) { + Ink.error('Purge: invalid id'); + return false; + } + }, + + + /** + * @function {Public} ? add an item to a list + * @param {String} name + * @param {Object} item + * @return {Number} pid + */ + add: function(parentId, item, priority) { + if(!this.lists[parentId]) { + return false; + } + if(typeof(item) !== 'object') { + item = String(item); + } + + var pid = parseInt(Math.round(Math.random() * 100000) + "" + Math.round(Math.random() * 100000), 10); + priority = priority || 0; + + this.items.push({parentId: parentId, item: item, priority: priority || 0, pid: pid}); + return pid; + }, + + + /** + * @function {Public} ? view list + * @param {Number} list id + * @param {Number} process id + * @return {Object} item + */ + view: function(parentId, pid) { + var id = this._searchByPid(parentId, pid); + if(id === false) { + return false; + } + return this.items[id]; + }, + + + /** + * @function {Public} ? remove an item + * @param {Object} item + * @return {Object|Boolean} removed item or false if not found + */ + remove: function(parentId, pid) { + try { + var id = this._searchByPid(parentId, pid); + if(id === false) { + return false; + } + this.items.splice(id, 1); + return true; + } catch(e) { + Ink.error('Remove: invalid id'); + return false; + } + }, + + _searchByPid: function(parentId, pid) { + if(!parentId && typeof(parentId) === 'boolean' || !pid) { + return false; + } + + parentId = parseInt(parentId, 10); + pid = parseInt(pid, 10); + + if(isNaN(parentId) || isNaN(pid)) { + return false; + } + + for(var i = 0, len = this.items.length; i this.options.minSizeToUseChunks; + }, + + + _dropEventHandler: function(ev) { + if(ev && ev.stopPropagation) { + ev.stopPropagation(); + } + if(ev && ev.preventDefault) { + ev.preventDefault(); + } + if(ev) { + ev.returnValue = false; + } + + this.publish('DropComplete', ev.dataTransfer); + + var data = ev.dataTransfer; + + if(!data || !data.files || !data.files.length) { + return false; + } + + this._files = data.files; + this._files = Array.prototype.slice.call(this._files || [], 0); + + // check if webkitGetAsEntry exists on first item + if(data.items && data.items[0] && data.items[0].webkitGetAsEntry) { + if(!this.options.foldersEnabled) { + return setTimeout(Ink.bind(this._addFilesToQueue, this, this._files), 0); + } + var entry, folders = []; + for(var i = ev.dataTransfer.items.length-1; i>=0; i--) { + entry = ev.dataTransfer.items[i].webkitGetAsEntry(); + if(entry && entry.isDirectory) { + folders.push(entry); + this._files[i].isDirectory = true; + this._files.splice(i, 1); + } + } + // starting callback hell + this._addFolderToQueue(folders, Ink.bind(function() { + setTimeout(Ink.bind(this._addFilesToQueue, this, this._files), 0); + }, this)); + } else { + setTimeout(Ink.bind(this._addFilesToQueue, this, this._files), 0); + } + + return true; + }, + + + _addFolderToQueue: function(folders, cb) { + var files = [], invalidFolders = {}; + + if(!folders || !folders.length) { + cb(); + return files; + } + + var getFiles = function(entries) { + var files = []; + for(var i = 0, len = entries.length; i this.options.maxFilesize) { + this.publish('MaxSizeFailure', file, this.options.maxFilesize); + continue; + } + + fileID = parseInt(Math.round(Math.random() * 100000) + "" + Math.round(Math.random() * 100000), 10); + o = { id: i, data: file, fileID: fileID, directory: file.isDirectory }; + Queue.add(this._queueId, o); + + this.publish('FileAddedToQueue', o); + } + this._processQueue(true); + this._files = []; + }, + + + _processQueue: function(internalUpload) { + if(this._queueRunning) { + return false; + } + + this.running = 0; + var max = 1, i = 0, items, + queueLen = Queue.items.length; + this._queueRunning = true; + + this.interval = setInterval(Ink.bind(function() { + if(Queue.items.length === i && this.running === 0) { + Queue.purge(this._queueId, true); + this._queueRunning = false; + clearInterval(this.interval); + this.publish('QueueEnd', this._queueId, queueLen); + } + + items = Queue.getItems(this._queueId); + + if(this.running < max && items[i]) { + if(!items[i].canceled) { + _doRequest.call(this, items[i].pid, items[i].item.data, items[i].item.fileID, items[i].item.directory, internalUpload); + this.running++; + i++; + } else { + var j = i; + while(items[j] && items[j].canceled) { + i++; + j++; + } + } + return true; + } + return false; + }, this), 100); + + + var _doRequest = function(pid, data, fileID, directory, internalUpload) { + var o = { + file: data, + fileID: fileID, + cb: Ink.bind(function() { + this.running--; + }, this) + }; + if(internalUpload) { + if(directory) { + // do magic + o.cb(); + } else { + this._upload(o); + } + } + }; + + return true; + }, + + + _upload: function(o) { + var file = o.file, + xhr = new XMLHttpRequest(), + fileID = o.fileID; + + this.publish('BeforeUpload', file, this.options.extraData, fileID, xhr, this._supportChunks(file.size)); + + var forceAbort = function(showError) { + if(o.cb && typeof(o.cb === 'function')) { + o.cb(); + } + + this.publish('OnProgress', { + length: file.size, + lengthComputable: true, + loaded: file.size, + total: file.size + }, file, fileID); + this.publish('EndUpload', file, fileID, (showError ? { error: true } : true)); + this.publish('InvalidFile', file, 'name'); + xhr.abort(); + }; + + if(this.options.INVALID_FILE_NAME && this.options.INVALID_FILE_NAME instanceof RegExp) { + if(this.options.INVALID_FILE_NAME.test(o.file.name)) { + forceAbort.call(this); + return; + } + } + + // If file was renamed, abort it + // FU OPERA: Opera always return lastModified date as null + if(!file.lastModifiedDate && !Ink.Dom.Browser.OPERA) { + forceAbort.call(this, true); + return; + } + + xhr.upload.onprogress = Ink.bind(this.publish, this, 'OnProgress', file, fileID); + + var endpoint, method; + if(this._supportChunks(file.size)) { + if(file.size <= file.chunk_offset) { + endpoint = this.options.endpointChunkCommit; + method = 'POST'; + } else { + endpoint = this.options.endpointChunk; + if(file.chunk_upload_id) { + endpoint += '?upload_id=' + file.chunk_upload_id; + } + if(file.chunk_offset) { + endpoint += '&offset=' + file.chunk_offset; + } + method = 'PUT'; + } + } else { + endpoint = this.options.endpoint; + method = 'POST'; + } + + xhr.open(method, endpoint, true); + xhr.withCredentials = true; + xhr.setRequestHeader("x-requested-with", "XMLHttpRequest"); + if(this._supportChunks(file.size)) { + xhr.setRequestHeader('Content-type', 'application/x-www-form-urlencoded'); + } + + var fd = new FormData(), + blob; + + if("Blob" in window && typeof Blob === 'function') { + blob = new Blob([file], { type: file.type }); + if(this._supportChunks(file.size)) { + file.chunk_offset = file.chunk_offset || 0; + blob = blob.slice(file.chunk_offset, file.chunk_offset + this.options.chunkSize); + } else { + fd.append(this.options.fileFormName, blob, file.name); + } + } else { + fd.append(this.options.fileFormName, file); + } + + if(!this._supportChunks(file.size)) { + for(var k in this.options.extraData) { + if(this.options.extraData.hasOwnProperty(k)) { + fd.append(k, this.options.extraData[k]); + } + } + } else { + fd.append('upload_id', file.chunk_upload_id); + fd.append('path', file.upload_path); + } + + if(!file.hasParent) { + if(!this._supportChunks(file.size)) { + xhr.send(fd); + } else { + if(file.size <= file.chunk_offset) { + xhr.send('upload_id=' + file.chunk_upload_id + '&path=' + file.upload_path + '/' + file.name); + } else { + xhr.send(blob); + } + } + } else { + this.publish('cbCreateFolder', file.parentID, file.fullPath, this.options.extraData, this._folders, file.rootPath, Ink.bind(function() { + if(!this._supportChunks(file.size)) { + xhr.send(fd); + } else { + if(file.size <= file.chunk_offset) { + xhr.send('upload_id=' + file.chunk_upload_id + '&path=' + file.upload_path + '/' + file.name); + } else { + xhr.send(blob); + } + } + }, this)); + } + + + xhr.onload = Ink.bindEvent(function() { + /* jshint boss:true */ + if(this._supportChunks(file.size) && file.size > file.chunk_offset) { + if(xhr.response) { + var response = JSON.parse(xhr.response); + + // check expected offset + var invalidOffset = file.chunk_offset && response.offset !== (file.chunk_offset + this.options.chunkSize) && file.size !== response.offset; + if(invalidOffset) { + if(o.cb) { + o.cb(); + } + this.publish('ErrorUpload', file, fileID); + } else { + file.chunk_upload_id = response.upload_id; + file.chunk_offset = response.offset; + file.chunk_expires = response.expires; + this._upload(o); + } + } else { + if(o.cb) { + o.cb(); + } + this.publish('ErrorUpload', file, fileID); + } + return (xhr = null); + } + + if(o.cb) { + o.cb(); + } + + if(xhr.responseText && xhr['status'] < 400) { + this.publish('EndUpload', file, fileID, xhr.responseText); + } else { + this.publish('ErrorUpload', file, fileID); + } + return (xhr = null); + }, this); + + + xhr.onerror = Ink.bindEvent(function() { + if(o.cb) { + o.cb(); + } + this.publish('ErrorUpload', file, fileID); + }, this); + + xhr.onabort = Ink.bindEvent(function() { + if(o.cb) { + o.cb(); + } + this.publish('AbortUpload', file, fileID, { + abortAll: Ink.bind(this.abortAll, this), + abortOne: Ink.bind(this.abortOne, this) + }); + }, this); + }, + + + abortAll: function() { + if(!this._queueRunning) { + return false; + } + clearInterval(this.interval); + this._queueRunning = false; + Queue.purge(this._queueId, true); + return true; + }, + + abortOne: function(id, cb) { + var items = Queue.getItems(0), + o; + for(var i = 0, len = items.length; i","dir"," ","+","~","preFilter","excess","unquoted","pattern","operator","result","what","last","simple","forward","ofType","outerCache","nodeIndex","start","useCache","pseudo","setFilters","matched","not","input","matcher","unmatched","lang","elemLang","focus","activeElement","hasFocus","tabIndex","enabled","disabled","selectedIndex","empty","header","eq","even","odd","lt","gt","radio","checkbox","file","password","image","submit","reset","parseOnly","tokens","soFar","preFilters","cached","addCombinator","combinator","checkNonElements","doneName","dirkey","elementMatcher","matchers","condense","newUnmatched","mapped","setMatcher","postFilter","postFinder","postSelector","temp","preMap","postMap","preexisting","elems","multipleContexts","matcherIn","matcherOut","matcherFromTokens","checkContext","leadingRelative","implicitRelative","matchContext","matchAnyContext","matcherFromGroupMatchers","elementMatchers","setMatchers","matcherCachedRuns","bySet","byElement","superMatcher","expandContext","setMatched","matchedCount","outermost","contextBackup","dirrunsUnique","group","contexts","token","filters","Common","animationPrefix","animationEndEventName","animation","oAnimation","msAnimation","webkitAnimation","Animate","elOrSelector","_element","_options","trigger","duration","removeClass","onEnd","animate","_animationPrefix","animationSupported","onAnimationEnd","animationName","Pagination","limitRange","min","max","requestAnimationFrame","mozRequestAnimationFrame","webkitRequestAnimationFrame","Carousel","_handlers","paginationChange","windowResize","autoAdvance","axis","initialPage","hideLast","center","keyboardSupport","pagination","onChange","swipe","_isY","ulEl","_ulEl","refit","whiteSpace","_setUpPagination","_setUpAutoAdvance","_setUpHider","size","perpendicular","_liEls","numSlides","contRect","_ctnLength","_elLength","_slidesPerPage","floor","numPages","ceil","numPagesChanged","_numPages","_deltaLength","_center","_updateHider","_IE7","_pagination","setSize","setPage","getPage","isDOMElement","setCurrent","_currentPage","nextPage","hiderEl","_hiderEl","gap","pad","padding","slides","stl","_onTouchStart","_swipeData","lastUlPos","ulRect","inUlX","inUlY","setTransitionProperty","_touchMoveIsFirstTouchMove","_onTouchMove","deltaY","abs","deltaX","_scrolling","_onAnimationFrame","pointerPos","swipeData","elRect","newPos","_onTouchEnd","snapToNext","progress","curPage","estimatedPage","round","_onPaginationChange","pgn","_setPage","getCurrent","page","previousPage","newTransition","transitionProperty","oTransitionProperty","msTransitionProperty","mozTransitionProperty","webkitTransitionProperty","Close","Url","instances","lastIdNum","nothing","obj","Layouts","SMALL","MEDIUM","LARGE","isInteger","fieldName","elsOrSelector","required","fieldId","defaults","overrides","out","dataAttrs","fromDataAttrs","lType","defaultVal","invalidStr","quote","invalidThrow","invalid","optionValue","_coerce_funcs","_coerce_from_string","_options_validate","paramName","_options_validate_types","number","boolean","string","function","integer","isFinite","stringify","childIndex","ajaxJSON","endpoint","currentLayout","detectorEl","resultCount","hashSet","hashParams","getAnchorString","genQueryString","cleanChildren","storeIdAndClasses","fromEl","inObj","_id","classes","_classes","restoreIdAndClasses","toEl","_instanceId","registerInstance","inst","optionalPrefix","skipRegister","dataInst","unregisterInstance","getInstance","instanceIdOrElement","ids","getInstanceFromSelector","getInstanceIds","getInstances","destroyComponent","InkArray","InkDate","strRepeat","clamp","dateishFromYMDString","YMD","dateishFromYMD","year","month","day","_year","_month","_day","dateishFromDate","date","getFullYear","getMonth","getDate","DatePicker","autoOpen","cleanText","closeText","containerElement","cssClass","dateRange","displayInSelect","dayField","monthField","yearField","format","instance","nextLinkText","ofText","onFocus","onMonthSelected","onSetDate","onYearSelected","prevLinkText","showClean","showClose","shy","startDate","startWeekDay","validDayFn","validMonthFn","validYearFn","nextValidDateFn","prevValidDateFn","yearRange",1,2,3,4,5,6,7,8,9,10,11,12,"wDay","_dateParsers","_hoverPicker","_picker","pickerField","_setMinMax","setDate","today","_init","_lang","_render","_listenToContainerObjectEvents","_containerObject","_renderSuperTopBar","calendarTop","_monthDescContainer","_monthPrev","_monthNext","_monthContainer","_monthSelector","_renderMonthSelector","_yearSelector","_appendDatePickerToDom","_renderMonth","_monthChanger","_ofText","_yearChanger","inline","_addOpenCloseEvents","_addDateChangeHandlersToInputs","fields","_updateDate","_showDefaultView","_inline","_hide","opener","cannotBe","ulSelector","mon","_renderMonthButton","liMonth","aMonth","appendTarget","_wrapper","_wrapperIsControl","_superTopBar","_onClick","_onRelativeChangerClick","_onAbsoluteChangerClick","_showMonthSelector","_showYearSelector","_clean","_updateDescription","changeYear","change_year_next","change_year_prev","changeMonth","change_month_next","change_month_prev","_updateCal","elemData","calDay","calMonth","calYear","_changeYear","blur","noMinLimit","MAX_VALUE","noMaxLimit","noLimits","_min","_max","dates","rDate","each","noLim","lim","_daysInMonth","valid","_dateCmp","_fitDateToRange","_isValidDate","_dateWithinRange","_dateAboveMax","_dateBelowMin","oth","_dateCmpUntil","depth","_getPrevMonth","_getNextMonth","dataParsed","_parseDate","inc","_incrementViewingYear","firstYear","thisYear","_getYearButtonHtml","_acceptableYear","_addMonthClassNames","dateStr","set","yearRegExp","validOneOrTwo","_isDate","_acceptableDay","_acceptableDateComponent","_acceptableMonth","userCb","_callUserCallbackBool","_writeDateInFormat","dateString","auxDate","_setDate","objClicked","dt","_updateMonth","_y","_m","exceptions","incValue","_tryLeap","_getPrevYear","_getNextYear","atomName","directionName","advancer","maxOrMin","boundary","leapUserCb","_callUserCallbackDate","_getNextDecade","decade","_getCurrentDecade","_getPrevDecade","_callUserCallbackBase","yyyy-mm-dd","yyyy/mm/dd","yy-mm-dd","yy/mm/dd","dd-mm-yyyy","dd/mm/yyyy","dd-mm-yy","dd/mm/yy","mm/dd/yyyy","mm-dd-yyyy","wDayFirst","getDay","_getMonthCalendarHeaderHtml","counter","emptyHtml","empties","_getDayButtonsHtml","daysInMonth","_getDayButtonHtml","forEach","_addMonthButtonClassNames","btn","toDisable","showMonth","isMonthRendered","between","Draggable","constraint","constraintElm","handle","revert","zindex","dragClass","onStart","onDrag","droppableProxy","mouseAnchor","skipChildren","fps","elmStartPosition","active","dragged","prevCoords","placeholder","firstDrag","deltaMs","lastRunAt","_onStart","dragFacade","_onDragFacade","drag","_onDrag","end","_onEnd","selectStart","_getCoords","ps","_cloneStyle","dst","borderWidth","width","height","tgtEl","originalPosition","marginTop","marginBottom","marginLeft","marginRight","visibility","delta2","ad","applyDelta","dragHandlerName","proxy","fs","zIndex","backgroundColor","firstEl","mouseCoords","mPosX","mPosY","newX","newY","draggableSize","constTop","constBottom","constLeft","constRight","Droppable","updateAll","mouseCoords2","action","pt","Toggle","Dropdown","hoverOpen","dismissOnInsideClick","dismissOnOutsideClick","dismissAfter","onInsideClick","onOutsideClick","onOpen","onDismiss","_toggle","closeOnInsideClick","closeOnClick","onChangeState","newState","_openOrDismiss","_onMouseOver","getState","_openTimeout","_dismissTimeout","_onMouseOut","_onInsideClick","_handlerCall","dismiss","_onOutsideClick","foundElem","needle","foundTarget","callHandler","doNotInformToggle","_doNotInformToggle","setState","hAddClassName","hRemoveClassName","_droppables","_draggables","opt","hoverClass","hoverclass","accept","onHover","onDrop","onDropOut","cleanStyle","draggable","namedEventHandlers","move","droppable","copy","cloneNode","_findDraggable","originalParent","elementData","_update","_findData","elms","update","coords","InkValidator","elementsWithSameName","FormValidator","_flagMap","ink-fv-required","ink-fv-email","ink-fv-url","ink-fv-number","ink-fv-phone_pt","ink-fv-phone_cv","ink-fv-phone_mz","ink-fv-phone_ao","ink-fv-date","ink-fv-confirm","ink-fv-custom","confirmElms","hasConfirm","_errorClassName","_errorValidationClassName","_errorTypeWarningClassName","_errorTypeErrorClassName","validate","_free","onError","customFlag","confirmGroup","fail","_validateElements","_showError","_clearError","_clearCache","_getElements","formElms","curElm","totalElm","flag","flag2","oGroups","_makeConfirmGroups","errors","customErrors","inArray","_isValid","_isCustomValid","_validateConfirmGroups","curGroup","totalG","curFlag","tCustom","fieldType","inputType","_trim","aFormRadios","isChecked","totalRadio","mail","isPTPhone","isCVPhone","isAOPhone","isMZPhone","Element","validFormat","validValues","isDate","formElm","aFail","tFail","_showAnErrorOnElement","controlGroupElm","controlElm","errorClasses","_errorTypeClassName","errorMsg","aErrorLabel","control","aErrorLabel2","I18n","validationFunctions","min_length","minSize","max_length","maxSize","exact_length","exactSize","email","fullCheck","ip","ipType","isIP","phone","phoneType","countryCode","credit_card","cardType","isCreditCard","alpha","supportSpaces","ascii","singleLineWhitespace","punctuation","unicode","unicodePunctuation","latin","latin1","latin1Punctuation","alpha_numeric","numbers","alpha_dash","dash","underscore","digit","positive","negative","decimalPlaces","decimal","decimalSeparator","leftDigits","decimalSep","maxDigits","numeric","minValue","maxValue","multipleOf","color","isColor","fieldToCompare","getFormElements","getValue","validationMessages","en_US","formvalidator.required","formvalidator.min_length","formvalidator.max_length","formvalidator.exact_length","formvalidator.email","formvalidator.url","formvalidator.ip","formvalidator.phone","formvalidator.credit_card","formvalidator.date","formvalidator.alpha","formvalidator.text","formvalidator.latin","formvalidator.alpha_numeric","formvalidator.alpha_dashes","formvalidator.digit","formvalidator.integer","formvalidator.decimal","formvalidator.numeric","formvalidator.range","formvalidator.color","formvalidator.matches","formvalidator.validation_function_not_found","pt_PT","FormElement","_errors","_rules","_value","label","_getLabel","controlGroup","_parseRules","rulesLength","paramStartPos","_addError","paramObj","field","i18nKey","getErrors","getElement","_formElements","_rootElement","_errorMessages","_markedErrorElements","eventTrigger","neverSubmit","searchFor","beforeValidation","setRule","errorMessage","getKey","langObj","dictObj","append","getI18n","setI18n","i18n","appendI18n","setLanguage","getRules","getElements","formElements","errorElement","errorElements","cancelEventOnSuccess","formElement","controlGroupElement","controlElement","paragraph","errorArr","ImageQuery","queries","onLoad","lastIndexOf","_filename","sortMulti","reverse","_onLoad","_onResize","_findCurrentQuery","devicePixelRatio","retina","query","opacitySupported","upName","dimension","firstCharacter","maxName","openModals","Modal","shadeClass","modalClass","triggerEvent","autoDisplay","markup","onShow","closeOnEscape","responsive","disableScroll","click","_onShadeClick","keyDown","_onKeyDown","resize","_wasDismissed","_markupMode","_modalDiv","_modalDivStyle","_modalShadow","_modalShadowStyle","_contentContainer","setContentMarkup","triggerElement","_reposition","runNow","_timeoutResizeFunction","_resizeTimeout","isPercentage","currentViewport","originalStatus","_resizeContainer","_shadeElement","alertsInTheModal","alertsLength","_contentElement","overflow","overflowX","overflowY","containerHeight","_modalHeader","_modalFooter","_disableScroll","htmlEl","_oldHtmlOverflows","compatMode","_waitForFade","keyValue","transitionEndEventNames","classicName","evName","fadeChecker","getContentElement","contentMarkup","tempHeader","tempFooter","toAdd","genAEl","inner","aEl","totalItemCount","itemsPerPage","firstLabel","lastLabel","previousLabel","nextLabel","previousPageLabel","nextPageLabel","hashParameter","parentTag","childTag","wrapperClass","paginationClass","activeClass","disabledClass","hideClass","previousClass","previousPageClass","nextClass","nextPageClass","numberFormatter","_size","RangeError","setOnChange","_current","_itemLiEls","_generateMarkup","_updateItems","_observe","liEls","isSimpleToggle","liEl","_nextEl","pi","pf","_pageStart","_pageEnd","_page","_prevPageEl","hasPreviousPage","_nextPageEl","hasNextPage","_firstEl","isFirst","_lastEl","isLast","_prevEl","hasPrevious","hasNext","hasUlAlready","firstClass","lastClass","isPrev","isNext","isPrevPage","isNextPage","aElem","nr","_onChange","sz","setSizeInItems","totalItems","pageNumber","isRelative","getSize","ProgressBar","startValue","_elementBar","setValue","newValue","cancelAnimationFrame","SmoothScroller","speed","getTop","interval","onDone","render","_elm","pathname","onClick","hashIndex","activeLiSelector","activeLi","Events","hasTouch","maxTouchPoints","msMaxTouchPoints","SortableList","placeholderClass","draggedClass","draggingClass","dragSelector","dragObject","handleSelector","moveSelector","swap","cancelMouseOut","down","_onDown","_onMove","up","_onUp","_isMoving","_down","_move","_up","stopMoving","_placeholder","_movePlaceholder","_addMovingClasses","validateMove","_removeMovingClasses","target_position","placeholder_position","from_top","from_left","spyTargets","targetIndex","addSpied","spied","observingOnScroll","observeOnScroll","onScroll","onScrollForTarget","activeEl","findActiveElement","toDeactivate","menuLinkSelector","toActivate","closest","Infinity","closestIndex","bBox","Spy","InkUICommon","Stacker","_rootElm","column","item","customBreakPoints","largeMax","largeMin","mediumMax","mediumMin","smallMax","smallMin","largeCols","mediumCols","smallCols","isOrdered","onRunCallback","onResizeCallback","onAPIReloadCallback","_aList","_curLayout","_runFirstTime","_getPageItemsToList","_canApplyLayoutChange","_applyLayoutChange","_addEvents","addItem","reloadItems","_removeDomItems","_setCurLayout","customBreakpoints","_getColumnsToShow","cols","curLayout","_aColumn","totalCols","aItems","aNewList","ii","countCol","Sticky","offsetBottom","topElement","stickyClass","inlineDimensions","inlinePosition","bottomElement","activateInLayouts","_dims","scrollTarget","_onScroll","_isDisabledInLayout","_getDims","unstick","_unstick","bottomOfSticky","maxBottomOfSticky","_stickTo","_inlineDimensions","_getBottomOffset","bottomOfViewport","toBottomOfDocument","oldPosition","oldWidth","dimensionsInStatic","Swipe","onMove","minDist","maxDist","minDuration","maxDuration","storeGesture","stopEvents","_supported","db","_isOn","_isMeOrParent","_pushGesture","_gesture","_time","changedTouches","_target","_t0","_p0","t1","gesture","p1","dr","dist","sqrt","time","overallMovement","overallTime","InkUrl","InkString","Json","rNumber","maybeTurnIntoNumber","cmp","numberishEnabledCmp","aValue","bValue","sameSame","Table","pageSize","createEndpointUrl","getDataFromEndPoint","processJSONRows","processJSONRow","processJSONField","processJSONHeaders","processJSONTotalRows","totalRows","getSortKey","allowResetSorting","visibleFields","tdClassNames","paginationOptions","_thead","tHead","createTHead","_headers","thClick","_originalFields","_sortableFields","_originalData","_data","_totalRows","_resetSortOrder","_addHeadersClasses","_setPagination","_getData","headerLabel","classNames","_onThClick","paginated","sortable","_invertSortOrder","_setSortOrderOfColumn","_paginate","sortAndReverse","isAscending","_sort","caretHtml","order","firstIndex","lastIndex","_registerFieldNames","_fieldIsVisible","keyFunction","trA","trB","elementA","elementB","userKey","columnIndex","columnName","_createHeadersFromJson","tr","insertRow","th","_createSingleHeaderFromJson","_createRowsFromJSON","rows","row","trIndex","_createSingleRowFromJson","rowIndex","_createFieldFromJson","fieldData","processor","_elOrFieldData","processed","isNumber","setEndpoint","currentPage","paginationEl","pageNo","_getSortOrder","_getDataViaAjax","_getUrl","urlCreator","parseUrl","sortField","endpointUri","success","JSONData","_onAjaxSuccess","getDataFromEndpoint","jsonResponse","_rowLength","Tabs","preventUrlChange","onBeforeChange","triggerEventsOnLoad","tabClicked","_onTabClicked","disabledTabClicked","_onDisabledTabClicked","_menu","_menuTabs","_contentTabs","_initializeDom","_setFirstActive","link","disable","enable","activeMenuLink","_findLinkByHref","_changeTab","runCallbacks","_activeMenuTab","_activeContentTab","_activeMenuLink","changeTab","_lastLayout","_hashify","activeTab","activeMenuTab","activeContentTab","enterKey","backspaceKey","isTruthy","TagField","tags","tagQuery","tagQueryAsync","allowRepeated","maxTags","outSeparator","separator","autoSplit","_readInput","_viewElm","_input","_tagsFromMarkup","_tags","_onKeyUp","_onBlur","_refocus","tagname","option","_tagsToMarkup","_addTag","_removeTag","spc","_onEnterKeyDown","_onBackspaceKeyDown","_removeConfirm","_unsetRemovingVisual","_setRemovingVisual","tagIndex","_removeRemovingVisualTimeout","isAccordion","initialState","classNameOn","classNameOff","togglesDisplay","_targets","_accordion","_firstTime","_bindEvents","state","_onTriggerEvent","isAncestorOfClickedElement","some","thisOne","_updateAccordion","accordionElement","shades","ancestorOfTargets","shadesLength","Tooltip","EachTooltip","transitionDurationName","transitionPropertyName","transitionTimingFunctionName","bodies","spacing","forever","template","templatefield","fade","tooltips","tooltip","_destroy","_oppositeDirections","_onMouseMove","_delayTimeout","_makeTooltip","mousePosition","_getOpt","_createTooltipElement","_removeTooltip","_fadeInTooltipElement","_placeTooltipElement","_onTooltipMouseOver","_getFloatOpt","outerHTML","_getIntOpt","fadeTime","mPos","_setPos","targetElementPos","tleft","ttop","centerh","centerv","tooltipDims","elementDims","maxX","maxY","_getWhereValueInsideViewport","arrow","tooltipLeft","tooltipTop","toBottom","toRight","toLeft","toTop","viewport","dataAttrVal","instanceOption","_getMousePosition","pageDims","_getPageXY","elmDims","scrollDim","_getScroll","cWidth","cHeight","dd","TreeView","parentClass","openNodeClass","openClass","closedClass","iconTag","isParent","isOpen","_getIcon","_setNodeOpen","_getChild","beOpen","icon","close","DirectoryReader","maxDepth","_read","_readDirectories","running","_readEntries","currentEntry","createReader","readEntries","isDirectory","clearArray","fullPath","_stopActivityTimeout","readError","activity","checkActivity","clearInterval","readComplete","setInterval","Queue","lists","items","getItems","parentId","purge","keepList","pid","priority","view","_searchByPid","UI","Upload","_fileButton","fileButton","_dropzone","dropzone","_setDropEvent","_setFileButton","dropzones","ondrop","_dropEventHandler","ondragleave","_onDragLeave","ondragend","_onDragEndEventHandler","ondragenter","_onDragEnterHandler","ondragover","_onDragOverHandler","publish","btns","_fileChangeHandler","files","FormData","_addFilesToQueue","_events","extraData","fileFormName","endpointChunk","endpointChunkCommit","maxFilesize","chunkSize","minSizeToUseChunks","INVALID_FILE_NAME","foldersEnabled","useChunks","directoryMaxDepth","_queueId","_queueRunning","_folders","_supportChunks","Blob","dataTransfer","_files","webkitGetAsEntry","folders","_addFolderToQueue","invalidFolders","getFiles","isFile","convertToFile","constructor","hasParent","getSubDirs","created","fileID","directory","_processQueue","internalUpload","queueLen","canceled","_doRequest","_upload","xhr","forceAbort","showError","lengthComputable","loaded","lastModifiedDate","upload","onprogress","chunk_offset","chunk_upload_id","fd","blob","upload_path","parentID","rootPath","invalidOffset","upload_id","chunk_expires","expires","onabort","abortAll","abortOne","subscribe","arrayProto","aKeys","shuffle","tmp1","rnd","filtered","intersect","arr1","arr2","shared","J","convert","insert","rLen","output","iLen","Packer","fit","blocks","block","findNode","splitNode","used","GrowingPacker","growNode","canGrowDown","canGrowRight","shouldGrowRight","shouldGrowDown","growRight","growDown","sorts","area","msort","maxside","criteria","BinPack","binPack","bl","packer","sorter","dims2","fitted","unfitted","filled","Cookie","cookie","_Cookie","aCookie","aItem","decodeURIComponent","domain","secure","sName","sExpires","sPath","sDomain","sSecure","oDate","sDate","valueOf","nDate","expiresString","toGMTString","portClean","cookieName","expiresDate","_months","_iMonth","janeiro","jan","fevereiro","fev","março","mar","abril","abr","maio","mai","junho","jun","julho","jul","agosto","ago","setembro","outubro","novembro","nov","dezembro","dez","_wDays","_d","_iWeek","week","segunda","seg","terça","ter","quarta","qua","quinta","qui","sexta","sex","sábado","sáb","domingo","dom","nDays","_date","iFormat","escapeChar","jsDate","jsFirstDay","jsThisDay","jsHour","jsDay","suffixes","suffix","UTC","jsYearStart","days","jsMonth","getYear","jsYear","getHours","jsMinute","getMinutes","jsSecond","getSeconds","getTimezoneOffset","jsMinZone","jsMinutes","jsDayName","jsMonthName","str_date","mList","objIndex","dayY","dayW","hour","hourD","sec","msec","ampm","diffM","diffH","pattr","_haveDatetime","_haveYear","_haveYDay","_haveDay","_haveMonth","_haveMonthDay","_haveOnlyDay","_haveWDay","_haveWeek","_haveWeekWDay","_haveOnlyWDay","_validDate","_noDate","_haveHour12","_haveHour24","_haveHour","_haveMin","_haveSec","_haveMSec","_haveMoreM","_haveMoreS","_haveDiffM","_haveDiffH","dList","gmt","aux","Dumper","_tab","_formatParam","param","formated","_outputFormat","_getTabs","numberOfTabs","tabs","_i","dim","_typeof","printDump","write","returnDump","alertDump","windowDump","dumperwindow","pattrText","funcOrVal","dict","testMode","_dicts","_dict","_testMode","_gLang","bool","gLang","_gDict","pars","isObj","$2","$3","ntext","strSin","strPlur","count","ordinal","num","lastDig","ordDict","byLastDigit","alias","_gDicts","function_call","cx","twoDigits","dateToISOString","toISOString","getUTCFullYear","getUTCMonth","getUTCDate","getUTCHours","getUTCMinutes","getUTCSeconds","getUTCMilliseconds","toFixed","InkJson","_nativeJSON","_convertToUnicode","_escape","theString","\b","\t","\n","\f","\r","\"","\\","charCodeAt","_toUnicode","unicodeString","inInt","theUnicode","_stringifyValue","toJSON","arrayString","objectString","convertToUnicode","reviver","walk","holder","SyntaxError","InkUtilString","_chars","_entities","_accentedChars","_accentedRemovedChars","_htmlUnsafeChars","<","&","'","ucFirst","firstWordOnly","replacer","stripTags","allowed","aAllowed","aNewAllowed","cleanedTag","strAllowed","reAllowed","aFoundTags","htmlEntitiesEncode","htmlEntitiesDecode","$0","utf8Encode","utfstring","shortString","words","resultstr","truncateString","utf8Decode","c2","c3","removeAccentedChars","newString","substrCount","haystack","htmlEscapeUnsafe","chars","normalizeWhitespace","toUnicode","unescape","es","hexNum","escapeText","txt","whiteList","txt2","C","escapedCharRegex","unescapeText","strcmp","str1","str2","packetize","maxLen","_keyStr","getUrl","getQueryString","aParams","queryStr","aQueryStr","pairVar","getAnchor","anchor","anchorStr","aAnchorStr","aURL","scheme","re1","re2","re3","regPort","tmpHost1","port","tmpHost2","tmpUserPass","user","urlObj","frag","hostname","currentScriptElement","aScripts","curScript","_debug","Validator","_countryCodes","_internacionalPT","_indicativosPT",21,22,231,232,233,234,235,236,238,239,241,242,243,244,245,249,251,252,253,254,255,256,258,259,261,262,263,265,266,268,269,271,272,273,274,275,276,277,278,279,281,282,283,284,285,286,289,291,292,295,296,91,93,96,92,707,760,800,808,30,"_internacionalCV","_indicativosCV",95,97,98,99,"_internacionalAO","_indicativosAO","_internacionalMZ","_indicativosMZ",82,84,"_internacionalTL","_indicativosTL","_characterGroups","asciiAlpha","latin1Alpha","unicodeAlpha","space","nicknamePunctuation","newline","asciiPunctuation","createRegExp","checkCharacterGroups","numb","inOptions","thousandSep","returnNumber","maxExcl","minExcl","_isLeapYear","parser","emailValido","full","reHTTP","reUrl","aInd","strInd","re351","reSpecialChars","reInt","reValid","isPortuguesePhone","re238","re244","re258","isTLPhone","re670","isPhone","codPostal","cp1","cp2","returnBothResults","cPostalSep","cPostal4","cPostal3","parserCPostal","cPostal","yearIndex","monthIndex","dayIndex","dateParser","keyword","hexa","rgba","hsl","hsla","_creditCardSpecs","default","luhn","american express","diners club","discover","jcb","maestro","mastercard","visa","_luhn","checksum","dbl","creditCardType","ccLength"],"mappings":"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","sourceRoot":"../../src/js"} \ No newline at end of file diff --git a/ajax/libs/ink/2.3.1/js/ink-all.min.js b/ajax/libs/ink/2.3.1/js/ink-all.min.js new file mode 100644 index 000000000..cb666ea16 --- /dev/null +++ b/ajax/libs/ink/2.3.1/js/ink-all.min.js @@ -0,0 +1,10 @@ +!function(a,b){"use strict";if(!("Ink"in a)){var c={},d={},e=[],f={},g=[],h={},i=Function.prototype.apply,j=function(a){if("object"!=typeof a)return!1;for(var b in a)if(a.hasOwnProperty(b))return!1;return!0};a.Ink={_checkPendingRequireModules:function(){var a,b,c,e,f,h,i=[];for(a=0,b=g.length;b>a;++a)if(c=g[a]){for(e in c.left)c.left.hasOwnProperty(e)&&(f=d[e],f&&(c.args[c.left[e]]=f,delete c.left[e],--c.remaining));if(c.remaining>0)i.push(c);else{if(h=c.cb,!h)continue;delete c.cb,h.apply(!1,c.args)}}g=i,g.length>0&&setTimeout(function(){Ink._checkPendingRequireModules()},0)},getPath:function(a,b){var d=a.split(/[._]/g),e,f,g,h;for(f=d.length;f>=0;f-=1)if(e=d.slice(0,f+1).join("."),c[e]){g=e;break}return h=c[g||"Ink"],/\/$/.test(h)||(h+="/"),f0&&f[0].appendChild(e)},_loadLater:function(a){setTimeout(function(){d[a]||f[a]||h[a]||(f[a]=!0,Ink.loadScript(a))},0)},namespace:function(b,c){if(!b||!b.length)return null;for(var d=b.split("."),e=a,f,g=0,h=d.length;h>g;++g)e[d[g]]=e[d[g]]||{},f=e,e=e[d[g]];return c?[f,d[g-1]]:e},getModule:function(a,b){var c=b?[a,"_",b].join(""):a;return d[c]},createModule:function(b,c,g,i){if("string"!=typeof b)throw new Error("module name must be a string!");if(!("number"==typeof c||"string"==typeof c&&c.length>0))throw new Error("version number missing!");var k=[b,"_",c].join("");h[k]=!0;var l=function(){if(!d[k]){delete f[k],delete f[b];var g=Array.prototype.slice.call(arguments),l=i.apply(a,g);e.push(k),"object"==typeof l?l._version=c:"function"==typeof l&&(l.prototype._version=c,l._version=c);var m=0===b.indexOf("Ink."),n;m&&(n=Ink.namespace(b,!0)),d[k]=l,delete h[k],m&&(n[0][n[1]+"_"+c]=l),d[b]=l,m&&j(n[0][n[1]])&&(n[0][n[1]]=l),this&&Ink._checkPendingRequireModules()}};this.requireModules(g,l)},requireModules:function(a,b){var c,e,h,i,j;if(e=a.length,h={args:new Array(e),left:{},remaining:e,cb:b},"object"!=typeof a||void 0===a.length)throw new Error("Dependency list should be an array!");if("function"!=typeof b)throw new Error("Callback should be a function!");for(c=0;e>c;++c)Ink._moduleRenames[a[c]]?(Ink.warn(a[c]+" was renamed to "+Ink._moduleRenames[a[c]]),i=Ink._moduleRenames[a[c]]):i=a[c],j=d[i],j?(h.args[c]=j,--h.remaining):(f[i]||Ink._loadLater(i),h.left[i]=c);h.remaining>0?g.push(h):b.apply(!0,h.args)},_moduleRenames:{"Ink.UI.Aux_1":"Ink.UI.Common_1"},getModulesLoadOrder:function(){return e.slice()},getModuleScripts:function(){var a=this.getModulesLoadOrder();return a.unshift("Ink_1"),a=a.map(function(a){return[""].join("")}),a.join("\n")},createExt:function(a,b,c,d){return Ink.createModule("Ink.Ext."+a,b,c,d)},bind:function(a,b){var c=Array.prototype.slice.call(arguments,2);return function(){var d=Array.prototype.slice.call(arguments),e=c.concat(d);return a.apply(b===!1?this:b,e)}},bindMethod:function(a,b){return Ink.bind.apply(Ink,[a[b],a].concat([].slice.call(arguments,2)))},bindEvent:function(b,c){var d=Array.prototype.slice.call(arguments,2);return function(e){var f=d.slice();return f.unshift(e||a.event),b.apply(c===!1?this:c,f)}},i:function(a){if(!a)throw new Error("Ink.i => id or element must be passed");return"string"==typeof a?b.getElementById(a):a},s:function(a,c){if("undefined"==typeof Ink.Dom||"undefined"==typeof Ink.Dom.Selector)throw new Error("This method requires Ink.Dom.Selector");return Ink.Dom.Selector.select(a,c||b)[0]||null},ss:function(a,c){if("undefined"==typeof Ink.Dom||"undefined"==typeof Ink.Dom.Selector)throw new Error("This method requires Ink.Dom.Selector");return Ink.Dom.Selector.select(a,c||b)},extendObj:function(a,b){if(arguments.length>2&&(b=Ink.extendObj.apply(this,[].slice.call(arguments,1))),b)for(var c in b)Object.prototype.hasOwnProperty.call(b,c)&&(a[c]=b[c]);return a},log:function(){var b=a.console;b&&b.log&&i.call(b.log,b,arguments)},warn:function(){var b=a.console;b&&b.warn&&i.call(b.warn,b,arguments)},error:function(){var b=a.console;b&&b.error&&i.call(b.error,b,arguments)}},Ink.setPath("Ink","INK_PATH"in a?a.INK_PATH:a.location.protocol+"//js.ink.sapo.pt/Ink/")}}(window,document),Ink.createModule("Ink.Net.Ajax","1",[],function(){"use strict";var Ajax=function(a,b){this.init(a,b)};Ajax.globalOptions={parameters:{},requestHeaders:{}};var xMLHttpRequestWithCredentials="XMLHttpRequest"in window&&"withCredentials"in new XMLHttpRequest;return Ajax.prototype={init:function(a,b){if(!a)throw new Error("WRONG_ARGUMENTS_ERR");var c=Ink.extendObj({asynchronous:!0,method:"POST",parameters:null,timeout:0,delay:0,postBody:"",contentType:"application/x-www-form-urlencoded",requestHeaders:null,onComplete:null,onSuccess:null,onFailure:null,onException:null,onHeaders:null,onCreate:null,onInit:null,onTimeout:null,sanitizeJSON:!1,evalJS:!0,xhrProxy:"",cors:!1,debug:!1,useCredentials:!1,signRequest:!1},Ajax.globalOptions);if(b&&"object"==typeof b){if(c=Ink.extendObj(c,b),"object"==typeof b.parameters)c.parameters=Ink.extendObj(Ink.extendObj({},Ajax.globalOptions.parameters),b.parameters);else if(null!==b.parameters){var d=this.paramsObjToStr(Ajax.globalOptions.parameters);d&&(c.parameters=b.parameters+"&"+d)}c.requestHeaders=Ink.extendObj({},Ajax.globalOptions.requestHeaders),c.requestHeaders=Ink.extendObj(c.requestHeaders,b.requestHeaders)}this.options=c,this.safeCall("onInit"),this.url=a;var e=this._locationFromURL(a);this.isHTTP=this._locationIsHTTP(e),this.isCrossDomain=this._locationIsCrossDomain(e,location),this.requestHasBody=c.method.search(/^get|head$/i)<0,this.options.cors&&(this.isCrossDomain=!1),this.transport=this.getTransport(),this.request()},_locationFromURL:function(a){var b=document.createElementNS?document.createElementNS("http://www.w3.org/1999/xhtml","a"):document.createElement("a");return b.href=a,b},_locationIsHTTP:function(a){return a.protocol.match(/^https?:/i)?!0:!1},_locationIsCrossDomain:function(a,b){return b=b||window.location,Ajax.prototype._locationIsHTTP(a)&&"widget:"!==b.protocol&&"object"!=typeof window.widget?b.protocol!==a.protocol||b.host.split(":")[0]!==a.host.split(":")[0]:!1},getTransport:function(){if(!xMLHttpRequestWithCredentials&&this.options.cors&&"XDomainRequest"in window)return this.usingXDomainReq=!0,new XDomainRequest;if("undefined"!=typeof XMLHttpRequest)return new XMLHttpRequest;if("undefined"==typeof ActiveXObject)return null;try{return new ActiveXObject("Msxml2.XMLHTTP")}catch(a){return new ActiveXObject("Microsoft.XMLHTTP")}},setHeaders:function(){if(this.transport)try{var a={Accept:"text/javascript,text/xml,application/xml,application/xhtml+xml,text/html,application/json;q=0.9,text/plain;q=0.8,video/x-mng,image/png,image/jpeg,image/gif;q=0.2,*/*;q=0.1","Accept-Language":navigator.language,"X-Requested-With":"XMLHttpRequest","X-Ink-Version":"2"};if(this.options.cors&&(this.options.signRequest||delete a["X-Requested-With"],delete a["X-Ink-Version"]),this.options.requestHeaders&&"object"==typeof this.options.requestHeaders)for(var b in this.options.requestHeaders)this.options.requestHeaders.hasOwnProperty(b)&&(a[b]=this.options.requestHeaders[b]);this.transport.overrideMimeType&&(navigator.userAgent.match(/Gecko\/(\d{4})/)||[0,2005])[1]<2005&&(a.Connection="close");for(var c in a)a.hasOwnProperty(c)&&this.transport.setRequestHeader(c,a[c])}catch(d){}},paramsObjToStr:function(a){var b,c,d,e,f=[];if("object"!=typeof a)return a;for(d in a)if(a.hasOwnProperty(d))if(e=a[d],"[object Array]"!==Object.prototype.toString.call(e)||isNaN(e.length))f=f.concat([encodeURIComponent(d),"=",encodeURIComponent(e),"&"]);else for(b=0,c=e.length;c>b;b++)f=f.concat([encodeURIComponent(d),"[]","=",encodeURIComponent(e[b]),"&"]);return f.length>0&&f.pop(),f.join("")},setParams:function(){var a=null,b=this.options.parameters;a="object"==typeof b?this.paramsObjToStr(b):""+b,a&&(this.url=this.url.indexOf("?")>-1?this.url.split("#")[0]+"&"+a:this.url.split("#")[0]+"?"+a)},getHeader:function(a){if(this.usingXDomainReq&&"Content-Type"===a)return this.transport.contentType;try{return this.transport.getResponseHeader(a)}catch(b){return null}},getAllHeaders:function(){try{return this.transport.getAllResponseHeaders()}catch(a){return null}},getResponse:function(){var a=this.transport,b={headerJSON:null,responseJSON:null,getHeader:this.getHeader,getAllHeaders:this.getAllHeaders,request:this,transport:a,timeTaken:new Date-this.startTime,requestedUrl:this.url};b.readyState=a.readyState;try{b.responseText=a.responseText}catch(c){}try{b.responseXML=a.responseXML}catch(c){}try{b.status=a.status}catch(c){b.status=0}try{b.statusText=a.statusText}catch(c){b.statusText=""}return b},abort:function(){if(this.transport){clearTimeout(this.delayTimeout),clearTimeout(this.stoTimeout);try{this.transport.abort()}catch(a){}this.finish()}},runStateChange:function(){var a=this.transport.readyState;if(3===a)this.isHTTP&&this.safeCall("onHeaders");else if(4===a||this.usingXDomainReq){if(this.options.asynchronous&&this.options.delay&&this.startTime+this.options.delay>(new Date).getTime())return void(this.delayTimeout=setTimeout(Ink.bind(this.runStateChange,this),this.options.delay+this.startTime-(new Date).getTime()));var b,c=this.transport.responseText,d=this.getResponse(),e=this.transport.status;this.isHTTP&&!this.options.asynchronous&&this.safeCall("onHeaders"),clearTimeout(this.stoTimeout),0===e?this.isHTTP?this.safeCall("onException",this.makeError(18,"NETWORK_ERR")):e=c?200:404:304===e&&(e=200);var f=this.usingXDomainReq||e>=200&&300>e,g=this.getHeader("Content-Type")||"";if(this.options.evalJS&&(g.indexOf("application/json")>=0||"force"===this.options.evalJS))try{b=this.evalJSON(c,this.sanitizeJSON),b&&(c=d.responseJSON=b)}catch(h){f&&this.safeCall("onException",h)}if(this.usingXDomainReq&&-1!==g.indexOf("xml")&&"DOMParser"in window){var i;switch(g){case"application/xml":case"application/xhtml+xml":case"image/svg+xml":i=g;break;default:i="text/xml"}var j=(new DOMParser).parseFromString(this.transport.responseText,i);this.transport.responseXML=j,d.responseXML=j}null!==this.transport.responseXML&&null===d.responseJSON&&""!==this.transport.responseXML.xml&&(c=this.transport.responseXML),(e||this.usingXDomainReq)&&(f?this.safeCall("onSuccess",d,c):this.safeCall("onFailure",d,c),this.safeCall("on"+e,d,c)),this.finish(d,c)}},finish:function(a,b){if(a&&this.safeCall("onComplete",a,b),clearTimeout(this.stoTimeout),this.transport){try{this.transport.onreadystatechange=null}catch(c){}"function"==typeof this.transport.destroy&&this.transport.destroy(),this.transport=null}},safeCall:function(a,b){function c(a){setTimeout(function(){throw a.message&&(a.message+="\n"+(a.stacktrace||a.stack||"")),a},1)}if("function"==typeof this.options[a])try{this.options[a].apply(this,[].slice.call(arguments,1))}catch(d){c(d)}else b&&window.Error&&b instanceof Error&&c(b)},setRequestHeader:function(a,b){this.options.requestHeaders||(this.options.requestHeaders={}),this.options.requestHeaders[a]=b},request:function(){if(this.transport){var a=null;this.requestHasBody?(null!==this.options.postBody&&""!==this.options.postBody?(a=this.options.postBody,this.setParams()):null!==this.options.parameters&&""!==this.options.parameters&&(a=this.options.parameters),"object"!=typeof a||a.nodeType?"object"!=typeof a&&null!==a&&(a=""+a):a=this.paramsObjToStr(a),this.options.contentType&&this.setRequestHeader("Content-Type",this.options.contentType)):this.setParams();var b=this.url,c=this.options.method,d=this.isCrossDomain;d&&this.options.xhrProxy&&(this.setRequestHeader("X-Url",b),b=this.options.xhrProxy+encodeURIComponent(b),d=!1);try{this.transport.open(c,b,this.options.asynchronous)}catch(e){return this.safeCall("onException",e),this.finish(this.getResponse(),null)}this.setHeaders(),this.safeCall("onCreate"),this.options.timeout&&!isNaN(this.options.timeout)&&(this.stoTimeout=setTimeout(Ink.bind(function(){this.options.onTimeout&&(this.safeCall("onTimeout"),this.abort())},this),1e3*this.options.timeout)),this.options.useCredentials&&!this.usingXDomainReq&&(this.transport.withCredentials=!0),this.options.asynchronous&&!this.usingXDomainReq?this.transport.onreadystatechange=Ink.bind(this.runStateChange,this):this.usingXDomainReq&&(this.transport.onload=Ink.bind(this.runStateChange,this));try{if(d)throw this.makeError(18,"NETWORK_ERR");this.startTime=(new Date).getTime(),this.transport.send(a)}catch(e){return this.safeCall("onException",e),this.finish(this.getResponse(),null)}this.options.asynchronous||this.runStateChange()}},makeError:function(a,b){if("function"!=typeof Error)return{code:a,message:b};var c=new Error(b);return c.code=a,c},isJSON:function(a){return"string"==typeof a&&a?(a=a.replace(/\\./g,"@").replace(/"[^"\\\n\r]*"/g,""),/^[,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]*$/.test(a)):!1},evalJSON:function(strJSON,sanitize){if(strJSON&&(!sanitize||this.isJSON(strJSON)))try{return"undefined"!=typeof JSON&&"undefined"!=typeof JSON.parse?JSON.parse(strJSON):eval("("+strJSON+")")}catch(e){throw new Error("ERROR: Bad JSON string...")}return null}},Ajax.load=function(a,b){return new Ajax(a,{method:"GET",onSuccess:function(a){b(a.responseJSON||a.responseText,a)}})},Ajax.ping=function(a,b){return new Ajax(a,{method:"HEAD",onSuccess:function(a){"function"==typeof b&&b(a)}})},Ajax}),Ink.createModule("Ink.Net.JsonP","1",[],function(){"use strict";var a=function(a,b){this.init(a,b)};return a.prototype={init:function(a,b){if(this.options=Ink.extendObj({onSuccess:void 0,onFailure:void 0,failureObj:{},timeout:10,params:{},callbackParam:"jsoncallback",internalCallback:"_cb",randVar:!1},b||{}),this.randVar=this.options.randVar!==!1?this.options.randVar:parseInt(1e5*Math.random(),10),this.options.internalCallback+=this.randVar,this.uri=a,"function"==typeof this.options.onComplete&&(this.options.onSuccess=this.options.onComplete),"string"!=typeof this.uri)throw"Please define an URI";if("function"!=typeof this.options.onSuccess)throw"please define a callback function on option onSuccess!";Ink.Net.JsonP[this.options.internalCallback]=Ink.bind(function(){window.clearTimeout(this.timeout),delete window.Ink.Net.JsonP[this.options.internalCallback],this._removeScriptTag(),this.options.onSuccess(arguments[0])},this),this._addScriptTag()},_addParamsToGet:function(a,b){var c=-1!==a.indexOf("?"),d,e,f,g=[a];for(e in b)b.hasOwnProperty(e)&&(c?d="&":(d="?",c=!0),f=b[e],"number"==typeof f||f||(f=""),g=g.concat([d,e,"=",encodeURIComponent(f)]));return g.join("")},_getScriptContainer:function(){var a=document.getElementsByTagName("head");if(0===a.length){var b=document.getElementsByTagName("script");return b[0]}return a[0]},_addScriptTag:function(){this.options.params[this.options.callbackParam]="Ink.Net.JsonP."+this.options.internalCallback,this.options.params.rnd_seed=this.randVar,this.uri=this._addParamsToGet(this.uri,this.options.params);var a=document.createElement("script");a.type="text/javascript",a.src=this.uri;var b=this._getScriptContainer();b.appendChild(a),this.timeout=setTimeout(Ink.bind(this._requestFailed,this),1e3*this.options.timeout)},_requestFailed:function(){delete Ink.Net.JsonP[this.options.internalCallback],this._removeScriptTag(),"function"==typeof this.options.onFailure&&this.options.onFailure(this.options.failureObj)},_removeScriptTag:function(){for(var a,b=document.getElementsByTagName("script"),c,d=0,e=b.length;e>d;++d)if(a=b[d],c=a.getAttribute("src")||a.src,null!==c&&c===this.uri)return void a.parentNode.removeChild(a)}},a}),Ink.createModule("Ink.Dom.Browser","1",[],function(){"use strict";var a={IE:!1,GECKO:!1,OPERA:!1,SAFARI:!1,KONQUEROR:!1,CHROME:!1,model:!1,version:!1,userAgent:!1,init:function(){this.detectBrowser(),this.setDimensions(),this.setReferrer()},setDimensions:function(){var a=0,b=0;"number"==typeof window.innerWidth?(a=window.innerWidth,b=window.innerHeight):document.documentElement&&(document.documentElement.clientWidth||document.documentElement.clientHeight)?(a=document.documentElement.clientWidth,b=document.documentElement.clientHeight):document.body&&(document.body.clientWidth||document.body.clientHeight)&&(a=document.body.clientWidth,b=document.body.clientHeight),this.windowWidth=a,this.windowHeight=b},setReferrer:function(){this.referrer=document.referrer&&document.referrer.length?window.escape(document.referrer):!1},detectBrowser:function(){this._sniffUserAgent(navigator.userAgent)},_sniffUserAgent:function(a){if(this.userAgent=a,a=a.toLowerCase(),/applewebkit\//.test(a))if(this.cssPrefix="-webkit-",this.domPrefix="Webkit",/(chrome|crios)\//.test(a))this.CHROME=!0,this.model="chrome",this.version=a.replace(/(.*)chrome\/([^\s]+)(.*)/,"$2");else{this.SAFARI=!0,this.model="safari";var b=/version\/([^) ]+)/;this.version=b.test(a)?a.match(b)[1]:a.replace(/(.*)applewebkit\/([^\s]+)(.*)/,"$2")}else if(/opera/.test(a))this.OPERA=!0,this.model="opera",this.version=a.replace(/(.*)opera.([^\s$]+)(.*)/,"$2"),this.cssPrefix="-o-",this.domPrefix="O";else if(/konqueror/.test(a))this.KONQUEROR=!0,this.model="konqueror",this.version=a.replace(/(.*)konqueror\/([^;]+);(.*)/,"$2"),this.cssPrefix="-khtml-",this.domPrefix="Khtml";else if(/(msie|trident)/i.test(a))this.IE=!0,this.model="ie",this.version=/rv:((?:\d|\.)+)/.test(a)?a.match(/rv:((?:\d|\.)+)/)[1]:a.replace(/(.*)\smsie\s([^;]+);(.*)/,"$2"),this.cssPrefix="-ms-",this.domPrefix="ms";else if(/gecko/.test(a)){this.cssPrefix="-moz-",this.domPrefix="Moz",this.GECKO=!0;var c=/(camino|chimera|epiphany|minefield|firefox|firebird|phoenix|galeon|iceweasel|k\-meleon|seamonkey|netscape|songbird|sylera)/;if(c.test(a))this.model=a.match(c)[1],this.version=a.replace(new RegExp("(.*)"+this.model+"/([^;\\s$]+)(.*)"),"$2");else{this.model="mozilla";var d=/(.*)rv:([^)]+)(.*)/;d.test(a)&&(this.version=a.replace(d,"$2"))}}},debug:function(){var a="known browsers: (ie, gecko, opera, safari, konqueror) \n";a+=[this.IE,this.GECKO,this.OPERA,this.SAFARI,this.KONQUEROR]+"\n",a+="model -> "+this.model+"\n",a+="version -> "+this.version+"\n",a+="\n",a+="original UA -> "+this.userAgent,alert(a)}};return a.init(),a}),Ink.createModule("Ink.Dom.Css",1,[],function(){"use strict";var a="defaultView"in document&&"getComputedStyle"in document.defaultView?document.defaultView.getComputedStyle:window.getComputedStyle,b={addRemoveClassName:function(a,b,c){return c?this.addClassName(a,b):void this.removeClassName(a,b)},addClassName:function(a,c){if(a=Ink.i(a),!a||!c)return null;c=(""+c).split(/[, ]+/);for(var d=0,e=c.length;e>d;d++)"undefined"!=typeof a.classList?a.classList.add(c[d]):b.hasClassName(a,c[d])||(a.className+=(a.className?" ":"")+c[d])},removeClassName:function(a,b){if(a=Ink.i(a),!a||!b)return null;b=(""+b).split(/[, ]+/);var c=0,d=b.length;if("undefined"!=typeof a.classList)for(;d>c;c++)a.classList.remove(b[c]);else{for(var e=a.className||"",f;d>c;c++)f=new RegExp("(^|\\s+)"+b[c]+"(\\s+|$)"),e=e.replace(f," ");a.className=e.replace(/^\s+/,"").replace(/\s+$/,"")}},setClassName:function(a,b,c){this.addRemoveClassName(a,b,c||!1)},hasClassName:function(a,b,c){if(a=Ink.i(a),!a||!b)return!1;b=(""+b).split(/[, ]+/);for(var d=0,e=b.length,f,g;e>d;d++){if("undefined"!=typeof a.classList)f=a.classList.contains(b[d]);else{var h=a.className;h===b[d]?f=!0:(g=new RegExp("(^|\\s)"+b[d]+"(\\s|$)"),f=g.test(h))}if(f&&!c)return!0;if(!f&&c)return!1}return c?!0:!1},blinkClass:function(a,c,d,e){a=Ink.i(a),b.addRemoveClassName(a,c,!e),setTimeout(function(){b.addRemoveClassName(a,c,e)},Number(d)||100)},toggleClassName:function(a,c,d){return a&&c&&"undefined"!=typeof a.classList&&!/[, ]/.test(c)?(a=Ink.i(a),null!==a&&a.classList.toggle(c),!0):void("undefined"!=typeof d?d===!0?b.addClassName(a,c):d===!1&&b.removeClassName(a,c):b.hasClassName(a,c)?b.removeClassName(a,c):b.addClassName(a,c))},setOpacity:function(a,b){if(a=Ink.i(a),null!==a){var c=1;isNaN(Number(b))||(c=0>=b?0:1>=b?b:100>=b?b/100:1),"undefined"!=typeof a.style.opacity?a.style.opacity=c:a.style.filter="alpha(opacity:"+(100*c|0)+")"}},_camelCase:function(a){return a?a.replace(/-(\w)/g,function(a,b){return b.toUpperCase()}):a},getStyle:function(b,c){if(b=Ink.i(b),null!==b){c="float"===c?"cssFloat":this._camelCase(c);var d=b.style[c];if(!a||d&&"auto"!==d)!d&&b.currentStyle&&(d=b.currentStyle[c],"auto"!==d||"width"!==c&&"height"!==c||(d=b["offset"+c.charAt(0).toUpperCase()+c.slice(1)]+"px"));else{var e=a(b,null);d=e?e[c]:null}if("opacity"===c)return d?parseFloat(d,10):1;if("borderTopWidth"===c||"borderBottomWidth"===c||"borderRightWidth"===c||"borderLeftWidth"===c){if("thin"===d)return"1px";if("medium"===d)return"3px";if("thick"===d)return"5px"}return"auto"===d?null:d}},setStyle:function(a,b){if(a=Ink.i(a),null!==a)if("string"==typeof b)a.style.cssText+="; "+b,-1!==b.indexOf("opacity")&&this.setOpacity(a,b.match(/opacity:\s*(\d?\.?\d*)/)[1]);else for(var c in b)b.hasOwnProperty(c)&&("opacity"===c?this.setOpacity(a,b[c]):"float"===c||"cssFloat"===c?"undefined"==typeof a.style.styleFloat?a.style.cssFloat=b[c]:a.style.styleFloat=b[c]:a.style[c]=b[c])},show:function(a,b){a=Ink.i(a),null!==a&&(a.style.display=b?b:"")},hide:function(a){a=Ink.i(a),null!==a&&(a.style.display="none")},showHide:function(a,b){a=Ink.i(a),a&&(a.style.display=b?"":"none")},toggle:function(a,b){a=Ink.i(a),null!==a&&("undefined"!=typeof b?b===!0?this.show(a):this.hide(a):"none"===this.getStyle(a,"display").toLowerCase()?this.show(a):this.hide(a))},_getRefTag:function(a){if(a.firstElementChild)return a.firstElementChild;for(var b=a.firstChild;b;b=b.nextSibling)if(1===b.nodeType)return b;return null},appendStyleTag:function(a,b,c){c=Ink.extendObj({type:"text/css",force:!1},c||{});var d=document.getElementsByTagName("style"),e=!1,f=!0,g,h;for(g=0,h=d.length;h>g;g++)e=d[g].innerHTML,e.indexOf(a)>=0&&(f=!1);if(f){var i=document.createElement("style"),j=document.getElementsByTagName("head")[0],k=!1,l="";i.type=c.type,l+=a+" {",l+=b,l+="} ","undefined"!=typeof i.styleSheet?i.styleSheet.cssText=l:i.appendChild(document.createTextNode(l)),c.force?j.appendChild(i):(k=this._getRefTag(j),k&&j.insertBefore(i,k))}},appendStylesheet:function(a,b){b=Ink.extendObj({media:"screen",type:"text/css",force:!1},b||{});var c,d=document.createElement("link"),e=document.getElementsByTagName("head")[0];d.media=b.media,d.type=b.type,d.href=a,d.rel="Stylesheet",b.force?e.appendChild(d):(c=this._getRefTag(e),c&&e.insertBefore(d,c))},_loadingCSSFiles:{},_loadedCSSFiles:{},appendStylesheetCb:function(a,b){if(!a)return b(a);if(this._loadedCSSFiles[a])return b(a);var c=this._loadingCSSFiles[a];if(c)return c.push(b);this._loadingCSSFiles[a]=[b];var d=document.createElement("link");d.type="text/css",d.rel="stylesheet",d.href=a;var e=document.getElementsByTagName("head")[0];e.appendChild(d);var f=document.createElement("img");f.onerror=Ink.bindEvent(function(a,b){var c=b;this._loadedCSSFiles[c]=!0;for(var d=this._loadingCSSFiles[c],e=0,f=d.length;f>e;++e)d[e](c);delete this._loadingCSSFiles[c]},this,a),f.src=a},decToHex:function(a){var b=function(a){return 1===a.length&&(a="0"+a),a=a.toUpperCase()};if("object"==typeof a){var c=b(parseInt(a.r,10).toString(16)),d=b(parseInt(a.g,10).toString(16)),e=b(parseInt(a.b,10).toString(16));return c+d+e}a+="";var f=a.match(/\((\d+),\s?(\d+),\s?(\d+)\)/);return null!==f?b(parseInt(f[1],10).toString(16))+b(parseInt(f[2],10).toString(16))+b(parseInt(f[3],10).toString(16)):b(parseInt(a,10).toString(16))},hexToDec:function(a){return 0===a.indexOf("#")&&(a=a.substr(1)),6===a.length?{r:parseInt(a.substr(0,2),16),g:parseInt(a.substr(2,2),16),b:parseInt(a.substr(4,2),16)}:3===a.length?{r:parseInt(a.charAt(0)+a.charAt(0),16),g:parseInt(a.charAt(1)+a.charAt(1),16),b:parseInt(a.charAt(2)+a.charAt(2),16)}:a.length<=2?parseInt(a,16):void 0},getPropertyFromStylesheet:function(a,b){var c=this.getRuleFromStylesheet(a);return c?c.style[b]:null},getPropertyFromStylesheet2:function(a,b){for(var c=this.getRulesFromStylesheet(a),d,e=0,f=c.length;f>e;e++)if(d=c[e].style[b],null!==d&&void 0!==d)return d;return null},getRuleFromStylesheet:function(a){var b,c,d,e,f,g=document.styleSheets;if(!g)return null;for(var h=0,i=document.styleSheets.length;i>h;++h){if(b=document.styleSheets[h],c=b.rules?b.rules:b.cssRules,!c)return null;for(d=0,e=c.length;e>d;++d)if(f=c[d],f.selectorText&&f.selectorText===a)return f}return null},getRulesFromStylesheet:function(a){var b=[],c,d,e,f,g,h=document.styleSheets;if(!h)return b;for(var i=0,j=document.styleSheets.length;j>i;++i){if(c=document.styleSheets[i],d=c.rules?c.rules:c.cssRules,!d)return null;for(e=0,f=d.length;f>e;++e)g=d[e],g.selectorText&&g.selectorText===a&&b.push(g)}return b},getPropertiesFromRule:function(a){var b=this.getRuleFromStylesheet(a),c={},d,e,f;b=b.style.cssText;var g=b.split(";"),h,i,j,k;for(e=0,f=g.length;f>e;++e)" "===g[e].charAt(0)&&(g[e]=g[e].substring(1)),h=g[e].split(":"),d=this._camelCase(h[0].toLowerCase()),i=h[1],i&&(i=i.substring(1),"padding"===d||"margin"===d||"borderWidth"===d?("borderWidth"===d?(j="border",k="Width"):(j=d,k=""),-1!==i.indexOf(" ")?(i=i.split(" "),c[j+"Top"+k]=i[0],c[j+"Bottom"+k]=i[0],c[j+"Left"+k]=i[1],c[j+"Right"+k]=i[1]):(c[j+"Top"+k]=i,c[j+"Bottom"+k]=i,c[j+"Left"+k]=i,c[j+"Right"+k]=i)):"borderRadius"===d?-1!==i.indexOf(" ")?(i=i.split(" "),c.borderTopLeftRadius=i[0],c.borderBottomRightRadius=i[0],c.borderTopRightRadius=i[1],c.borderBottomLeftRadius=i[1]):(c.borderTopLeftRadius=i,c.borderTopRightRadius=i,c.borderBottomLeftRadius=i,c.borderBottomRightRadius=i):c[d]=i);return c},changeFontSize:function(a,b,c,d,e){var f=this;Ink.requireModules(["Ink.Dom.Selector_1"],function(g){var h;if("string"!=typeof a?h="1st argument must be a CSS selector rule.":"number"!=typeof b?h="2nd argument must be a number.":void 0!==c&&"+"!==c&&"*"!==c?h='3rd argument must be one of "+", "*".':void 0!==d&&("number"!=typeof d||0>=d)?h="4th argument must be a positive number.":void 0!==e&&("number"!=typeof e||e>e)&&(h="5th argument must be a positive number greater than minValue."),h)throw new TypeError(h);var i,j,k=g.select(a);void 0===d&&(d=1),c="*"===c?function(a,b){return a*b}:function(a,b){return a+b};for(var l=0,m=k.length;m>l;++l)j=k[l],i=parseFloat(f.getStyle(j,"fontSize")),i=c(i,b),d>i||"number"==typeof e&&i>e||(j.style.fontSize=i+"px")})}};return b}),Ink.createModule("Ink.Dom.Element",1,[],function(){"use strict";var a="function"==typeof document.createRange&&"function"==typeof window.Range.prototype.createContextualFragment,b="Ink.Dom.Element tbody: "+Math.random(),c=function(){var a=document.createElement("div");return a.innerHTML="",0!==a.getElementsByTagName("tbody").length}();function d(a){var b={};try{b=a.getBoundingClientRect()}catch(c){b={top:a.offsetTop,left:a.offsetLeft}}return b}var e={get:function(a){return"undefined"!=typeof a?"string"==typeof a?document.getElementById(a):a:null},create:function(a,b){var c=document.createElement(a);for(var d in b)b.hasOwnProperty(d)&&(d in e?e[d](c,b[d]):"className"===d||"class"===d?c.className=b.className||b["class"]:c.setAttribute(d,b[d]));return c},remove:function(a){var b;a&&(b=a.parentNode)&&b.removeChild(a)},scrollTo:function(a){if(a=e.get(a)){if(a.scrollIntoView)return a.scrollIntoView();var b={},c=0,d=0;do c+=a.offsetTop||0,d+=a.offsetLeft||0,a=a.offsetParent;while(a);b={x:d,y:c},window.scrollTo(b.x,b.y)}},offsetTop:function(a){return e.offset(a)[1]},offsetLeft:function(a){return e.offset(a)[0]},positionedOffset:function(a){var b=0,c=0;a=e.get(a);do if(b+=a.offsetTop||0,c+=a.offsetLeft||0,a=a.offsetParent){if("body"===a.tagName.toLowerCase())break;var d=a.style.position;if(!d&&a.currentStyle&&(d=a.currentStyle.position),(!d||"auto"===d)&&"undefined"!=typeof getComputedStyle){var f=getComputedStyle(a,null);d=f?f.position:null}if("relative"===d||"absolute"===d)break}while(a);return[c,b]},offset:function(a){a=Ink.i(a);var b=[0,0],c=a.ownerDocument,e=c.documentElement,f=d(a),g=c.body,h=e.clientTop||g.clientTop||0,i=e.clientLeft||g.clientLeft||0,j=c.pageYOffset||e.scrollTop||g.scrollTop,k=c.pageXOffset||e.scrollLeft||g.scrollLeft,l=f.top+j-h,m=f.left+k-i;return b=[m,l]},scroll:function(a){return a=a?Ink.i(a):document.body,[window.pageXOffset?window.pageXOffset:a.scrollLeft,window.pageYOffset?window.pageYOffset:a.scrollTop]},_getPropPx:function(a,b){var c,d,e=a.getPropertyValue?a.getPropertyValue(b):a[b];return e?(d=e.indexOf("px"),c=-1===d?0:parseFloat(e,10)):c=0,c},offset2:function(a){return e.offset(a)},hasAttribute:function(a,b){return a.hasAttribute?a.hasAttribute(b):!!a.getAttribute(b)},insertAfter:function(a,b){(b=e.get(b))&&(null!==b.nextSibling?b.parentNode.insertBefore(a,b.nextSibling):b.parentNode.appendChild(a))},insertBefore:function(a,b){(b=e.get(b))&&b.parentNode.insertBefore(a,b)},insertTop:function(a,b){(b=e.get(b))&&(b.firstChild?b.insertBefore(a,b.firstChild):b.appendChild(a))},insertBottom:function(a,b){b.appendChild(a)},textContent:function(a){a=Ink.i(a);var b,c,d,f;switch(a&&a.nodeType){case 9:return e.textContent(a.documentElement||a.body&&a.body.parentNode||a.body);case 1:if(b=a.innerText,"undefined"!=typeof b)return b;case 11:if(b=a.textContent,"undefined"!=typeof b)return b;if(a.firstChild===a.lastChild)return e.textContent(a.firstChild);for(b=[],d=a.childNodes,c=0,f=d.length;f>c;++c)b.push(e.textContent(d[c]));return b.join("");case 3:case 4:return a.nodeValue}return""},setTextContent:function(a,b){switch(a=Ink.i(a),a&&a.nodeType){case 1:if("innerText"in a){a.innerText=b;break}case 11:if("textContent"in a){a.textContent=b;break}case 9:for(;a.firstChild;)a.removeChild(a.firstChild);if(""!==b){var c=a.ownerDocument||a;a.appendChild(c.createTextNode(b))}break;case 3:case 4:a.nodeValue=b}},isLink:function(a){var b=a&&1===a.nodeType&&(/^a|area$/i.test(a.tagName)||a.hasAttributeNS&&a.hasAttributeNS("http://www.w3.org/1999/xlink","href"));return!!b},isAncestorOf:function(a,b){if(!b||!a)return!1;if(b.compareDocumentPosition)return 0!==(16&a.compareDocumentPosition(b));for(;b=b.parentNode;)if(b===a)return!0;return!1},descendantOf:function(a,b){return a!==b&&e.isAncestorOf(a,b)},firstElementChild:function(a){if(!a)return null;if("firstElementChild"in a)return a.firstElementChild;for(var b=a.firstChild;b&&1!==b.nodeType;)b=b.nextSibling;return b},lastElementChild:function(a){if(!a)return null;if("lastElementChild"in a)return a.lastElementChild;for(var b=a.lastChild;b&&1!==b.nodeType;)b=b.previousSibling;return b},nextElementSibling:function(a){var b=null;if(!a)return b;if("nextElementSibling"in a)return a.nextElementSibling;for(b=a.nextSibling;b&&1!==b.nodeType;)b=b.nextSibling;return b},previousElementSibling:function(a){var b=null;if(!a)return b;if("previousElementSibling"in a)return a.previousElementSibling;for(b=a.previousSibling;b&&1!==b.nodeType;)b=b.previousSibling;return b},elementWidth:function(a){return"string"==typeof a&&(a=document.getElementById(a)),a.offsetWidth},elementHeight:function(a){return"string"==typeof a&&(a=document.getElementById(a)),a.offsetHeight},elementLeft:function(a){return"string"==typeof a&&(a=document.getElementById(a)),a.offsetLeft},elementTop:function(a){return"string"==typeof a&&(a=document.getElementById(a)),a.offsetTop},elementDimensions:function(a){return a=Ink.i(a),[a.offsetWidth,a.offsetHeight]},outerDimensions:function(a){var b=d(a),c=Ink.getModule("Ink.Dom.Css_1"),e=Ink.bindMethod(c,"getStyle",a);return[b.right-b.left+parseFloat(e("marginLeft")||0)+parseFloat(e("marginRight")||0),b.bottom-b.top+parseFloat(e("marginTop")||0)+parseFloat(e("marginBottom")||0)]},inViewport:function(a,b){var c=d(Ink.i(a));return b?c.bottom>0&&c.left0:c.top>0&&c.right0 +},isHidden:function(a){var b=a.offsetWidth,c=a.offsetHeight,d="tr"===a.tagName.toLowerCase(),e=Ink.getModule("Ink.Dom.Css_1");return 0!==b||0!==c||d?0===b||0===c||d?"none"===e.getStyle(a,"display").toLowerCase():!1:!0},isVisible:function(a){return!this.isHidden(a)},clonePosition:function(a,b){var c=e.offset(b);return a.style.left=c[0]+"px",a.style.top=c[1]+"px",a},ellipsizeText:function(a,b){if(a=Ink.i(a))for(;a&&a.scrollHeight>a.offsetHeight+8;)a.textContent=a.textContent.replace(/(\s+\S+)\s*$/,b||"…")},findUpwardsHaving:function(a,b){for(;a&&1===a.nodeType;){if(b(a))return a;a=a.parentNode}return!1},findUpwardsByClass:function(a,b){var c=new RegExp("(^|\\s)"+b+"(\\s|$)"),d=function(a){var b=a.className;return b&&c.test(b)};return e.findUpwardsHaving(a,d)},findUpwardsByTag:function(a,b){b=b.toUpperCase();var c=function(a){return a.nodeName&&a.nodeName.toUpperCase()===b};return e.findUpwardsHaving(a,c)},findUpwardsById:function(a,b){var c=function(a){return a.id===b};return e.findUpwardsHaving(a,c)},findUpwardsBySelector:function(a,b){var c=Ink.getModule("Ink.Dom.Selector");if(!c)throw new Error("This method requires Ink.Dom.Selector");var d=function(a){return c.matchesSelector(a,b)};return e.findUpwardsHaving(a,d)},getChildrenText:function(a,b){var c,d,f,g=a.childNodes,h=g.length,i="";if(!a)return i;for(d=0;h>d;++d)c=g[d],c&&3===c.nodeType&&(f=e._trimString(String(c.data)),f.length>0?(i+=f,b&&a.removeChild(c)):a.removeChild(c));return i},_trimString:function(a){return String.prototype.trim?a.trim():a.replace(/^\s*/,"").replace(/\s*$/,"")},getSelectValues:function(a){for(var b=Ink.i(a),c=[],d=0;dd;++d)b=a[d],b instanceof Array?1===b.length&&b.push(b[0]):b=[b,b],c.push(b);return c},fillSelect:function(a,b,c,d){var f=Ink.i(a);if(f){f.innerHTML="";var g,h;c||(h=document.createElement("option"),h.setAttribute("value",""),f.appendChild(h)),b=e._normalizeData(b);for(var i=0,j=b.length;j>i;++i)g=b[i],h=document.createElement("option"),h.setAttribute("value",g[0]),g.length>2&&h.setAttribute("extra",g[2]),h.appendChild(document.createTextNode(g[1])),g[0]===d&&h.setAttribute("selected","selected"),f.appendChild(h)}},fillSelect2:function(a,b){a=Ink.i(a),a.innerHTML="";var c={skipEmpty:!1,skipCreate:!1,emptyLabel:"none",createLabel:"create",optionsGroupLabel:"groups",emptyOptionsGroupLabel:"none exist",defaultValue:""};if(!b)throw"param opts is a requirement!";if(!b.data)throw"opts.data is a requirement!";b=Ink.extendObj(c,b);var d,f,g=document.createElement("optgroup");g.setAttribute("label",b.optionsGroupLabel),b.data=e._normalizeData(b.data),b.skipCreate||b.data.unshift(["$create$",b.createLabel]),b.skipEmpty||b.data.unshift(["",b.emptyLabel]);for(var h=0,i=b.data.length;i>h;++h)f=b.data[h],d=document.createElement("option"),d.setAttribute("value",f[0]),d.appendChild(document.createTextNode(f[1])),f[0]===b.defaultValue&&d.setAttribute("selected","selected"),""===f[0]||"$create$"===f[0]?a.appendChild(d):g.appendChild(d);var j=function(a){var b=a[a.length-1][0];return""===b||"$create$"===b};j(b.data)&&(d=document.createElement("option"),d.setAttribute("value","$dummy$"),d.setAttribute("disabled","disabled"),d.appendChild(document.createTextNode(b.emptyOptionsGroupLabel)),g.appendChild(d)),a.appendChild(g);var k=function(b,c){var d=a.options[a.options.length-1];d.getAttribute("disabled")&&d.parentNode.removeChild(d),d=document.createElement("option"),d.setAttribute("value",b),d.appendChild(document.createTextNode(c)),g.appendChild(d),a.options[a.options.length-1].setAttribute("selected",!0)};b.skipCreate||(a.onchange=function(){"$create$"===a.value&&"function"==typeof b.onCreate&&b.onCreate(a,k)})},fillRadios:function(a,b,c,d,f,g){var h=Ink.i(a);for(h=h.nextSibling;h&&1!==h.nodeType;)h=h.nextSibling;var i=document.createElement("span");h?h.parentNode.insertBefore(i,h):Ink.i(a).appendChild(i),c=e._normalizeData(c),"]"!==b.substring(b.length-1)&&(b+="[]");var j,k;d||(k=document.createElement("input"),k.setAttribute("type","radio"),k.setAttribute("name",b),k.setAttribute("value",""),i.appendChild(k),g&&i.appendChild(document.createElement(g)));for(var l=0;le;++e)if(c=a.childNodes[e],1===c.nodeType){if(c===b)return d;++d}return-1},nextSiblings:function(a){if("string"==typeof a&&(a=document.getElementById(a)),"object"==typeof a&&null!==a&&a.nodeType&&1===a.nodeType){for(var b=[],c=a.parentNode.children,d=e.parentIndexOf(a.parentNode,a),f=++d,g=c.length;g>f;f++)b.push(c[f]);return b}return[]},previousSiblings:function(a){if("string"==typeof a&&(a=document.getElementById(a)),"object"==typeof a&&null!==a&&a.nodeType&&1===a.nodeType){for(var b=[],c=a.parentNode.children,d=e.parentIndexOf(a.parentNode,a),f=0,g=d;g>f;f++)b.push(c[f]);return b}return[]},siblings:function(a){if("string"==typeof a&&(a=document.getElementById(a)),"object"==typeof a&&null!==a&&a.nodeType&&1===a.nodeType){for(var b=[],c=a.parentNode.children,d=0,e=c.length;e>d;d++)a!==c[d]&&b.push(c[d]);return b}return[]},childElementCount:function(a){return a=Ink.i(a),"childElementCount"in a?a.childElementCount:a?e.siblings(a).length+1:0},_wrapElements:{TABLE:function(a,d){return a.innerHTML=c?"
      "+d+"
      "+b+"
      ":""+d+"
      ",a.firstChild},TBODY:function(a,b){return a.innerHTML=""+b+"
      ",a.firstChild.getElementsByTagName("tbody")[0]},THEAD:function(a,b){return a.innerHTML=""+b+"
      ",a.firstChild.getElementsByTagName("thead")[0]},TFOOT:function(a,b){return a.innerHTML=""+b+"
      ",a.firstChild.getElementsByTagName("tfoot")[0]},TR:function(a,b){return a.innerHTML=""+b+"
      ",a.firstChild.firstChild.firstChild}},_getWrapper:function(a,d){var f=a.nodeName&&a.nodeName.toUpperCase(),g=document.createElement("div"),h=e._wrapElements[f];if(!h)return g.innerHTML=d,g;if(g=h(g,d),c&&"TABLE"===f)for(var i=g.getElementsByTagName("td"),j=0,k=i.length;k>j;j++)if(i[j].innerHTML===b){var l=i[j].parentNode.parentNode;l.parentNode.removeChild(l)}return g},appendHTML:function(a,b){for(var c=e._getWrapper(a,b);c.firstChild;)a.appendChild(c.firstChild)},prependHTML:function(a,b){for(var c=e._getWrapper(a,b);c.lastChild;)a.insertBefore(c.lastChild,a.firstChild)},setHTML:function(a,b){try{a.innerHTML=b}catch(c){for(;a.firstChild;)a.removeChild(a.firstChild);e.appendHTML(a,b)}},wrap:function(a,b){a=Ink.i(a),b=Ink.i(b);var c=a.nextSibling,d=a.parentNode;return b.appendChild(a),null!==c?d.insertBefore(b,c):d.appendChild(b),b},unwrap:function(a,b){a=Ink.i(a);var c;c=b?e.findUpwardsBySelector(a,b):a.parentNode,c&&c.parentNode&&e.insertBefore(a,c)},replace:function(a,b){e.insertBefore(b,a),e.remove(a)},removeTextNodeChildren:function(a){var b,c,d=a;for(a=a.firstChild;a;)c=3===a.nodeType,b=a,a=a.nextSibling,c&&d.removeChild(b)},htmlToFragment:a?function(a){var b;return"string"!=typeof a?document.createDocumentFragment():(b=document.createRange(),b.selectNode(document.body),b.createContextualFragment(a))}:function(a){var b=document.createDocumentFragment(),c,d;if("string"!=typeof a)return b;for(c=document.createElement("div"),c.innerHTML=a;d=c.firstChild;)b.appendChild(d);return b},_camelCase:function(a){return a?a.replace(/-(\w)/g,function(a,b){return b.toUpperCase()}):a},data:function(a){var b;if("object"!=typeof a&&"string"!=typeof a)throw"[Ink.Dom.Element.data] :: Invalid selector defined";if("object"==typeof a)b=a;else{var c=Ink.getModule("Ink.Dom.Selector",1);if(!c)throw"[Ink.Dom.Element.data] :: this method requires Ink.Dom.Selector - v1";if(b=c.select(a),b.length<=0)throw"[Ink.Dom.Element.data] :: Can't find any element with the specified selector";b=b[0]}var d={},f=b.attributes||[],g,h,i;if(f)for(var j=0,k=f.length;k>j;++j)g=f[j],h=g.name,i=g.value,h&&0===h.indexOf("data-")&&(d[e._camelCase(h.replace("data-",""))]=i);return d},moveCursorTo:function(a,b){if(a.setSelectionRange)a.setSelectionRange(b,b);else{var c=a.createTextRange();c.collapse(!0),c.moveEnd("character",b),c.moveStart("character",b),c.select()}},pageWidth:function(){var a;a=window.innerWidth&&window.scrollMaxX?window.innerWidth+window.scrollMaxX:document.body.scrollWidth>document.body.offsetWidth?document.body.scrollWidth:document.body.offsetWidth;var b;return window.self.innerWidth?b=document.documentElement.clientWidth?document.documentElement.clientWidth:window.self.innerWidth:document.documentElement&&document.documentElement.clientWidth?b=document.documentElement.clientWidth:document.body&&(b=document.body.clientWidth),b>a?a:b},pageHeight:function(){var a;a=window.innerHeight&&window.scrollMaxY?window.innerHeight+window.scrollMaxY:document.body.scrollHeight>document.body.offsetHeight?document.body.scrollHeight:document.body.offsetHeight;var b;return window.self.innerHeight?b=window.self.innerHeight:document.documentElement&&document.documentElement.clientHeight?b=document.documentElement.clientHeight:document.body&&(b=document.body.clientHeight),b>a?b:a},viewportWidth:function(){return"undefined"!=typeof window.innerWidth?window.innerWidth:document.documentElement&&"undefined"!=typeof document.documentElement.offsetWidth?document.documentElement.offsetWidth:void 0},viewportHeight:function(){return"undefined"!=typeof window.innerHeight?window.innerHeight:document.documentElement&&"undefined"!=typeof document.documentElement.offsetHeight?document.documentElement.offsetHeight:void 0},scrollWidth:function(){return"undefined"!=typeof window.self.pageXOffset?window.self.pageXOffset:"undefined"!=typeof document.documentElement&&"undefined"!=typeof document.documentElement.scrollLeft?document.documentElement.scrollLeft:document.body.scrollLeft},scrollHeight:function(){return"undefined"!=typeof window.self.pageYOffset?window.self.pageYOffset:"undefined"!=typeof document.documentElement&&"undefined"!=typeof document.documentElement.scrollTop?document.documentElement.scrollTop:document.body.scrollTop}};return e}),Ink.createModule("Ink.Dom.Event",1,[],function(){var a=function(a,b,c){return c()}("bean",this,function(a,b){a=a||"bean",b=b||this;var c=window,d=b[a],e=/[^\.]*(?=\..*)\.|.*/,f=/\..*/,g="addEventListener",h="removeEventListener",i=document||{},j=i.documentElement||{},k=j[g],l=k?g:"attachEvent",m={},n=Array.prototype.slice,o=function(a,b){return a.split(b||" ")},p=function(a){return"string"==typeof a},q=function(a){return"function"==typeof a},r="click dblclick mouseup mousedown contextmenu mousewheel mousemultiwheel DOMMouseScroll mouseover mouseout mousemove selectstart selectend keydown keypress keyup orientationchange focus blur change reset select submit load unload beforeunload resize move DOMContentLoaded readystatechange message error abort scroll ",s="show input invalid touchstart touchmove touchend touchcancel gesturestart gesturechange gestureend textinputreadystatechange pageshow pagehide popstate hashchange offline online afterprint beforeprint dragstart dragenter dragover dragleave drag drop dragend loadstart progress suspend emptied stalled loadmetadata loadeddata canplay canplaythrough playing waiting seeking seeked ended durationchange timeupdate play pause ratechange volumechange cuechange checking noupdate downloading cached updateready obsolete ",t=function(a,b,c){for(c=0;cg;g++)if(m[g].reg.test(e)){n[e]=k=m[g].fix;break}for(j=k(a,this,e),g=j.length;g--;)!((i=j[g])in this)&&i in a&&(this[i]=a[i])}}};return p.prototype.preventDefault=function(){this.originalEvent.preventDefault?this.originalEvent.preventDefault():this.originalEvent.returnValue=!1},p.prototype.stopPropagation=function(){this.originalEvent.stopPropagation?this.originalEvent.stopPropagation():this.originalEvent.cancelBubble=!0},p.prototype.stop=function(){this.preventDefault(),this.stopPropagation(),this.stopped=!0},p.prototype.stopImmediatePropagation=function(){this.originalEvent.stopImmediatePropagation&&this.originalEvent.stopImmediatePropagation(),this.isImmediatePropagationStopped=function(){return!0}},p.prototype.isImmediatePropagationStopped=function(){return this.originalEvent.isImmediatePropagationStopped&&this.originalEvent.isImmediatePropagationStopped()},p.prototype.clone=function(a){var b=new p(this,this.element,this.isNative);return b.currentTarget=a,b},p}(),w=function(a,b){return k||b||a!==i&&a!==c?a:j},x=function(){var a=function(a,b,c,d){var e=function(c,e){return b.apply(a,d?n.call(e,c?0:1).concat(d):e)},f=function(c,d){return b.__beanDel?b.__beanDel.ft(c.target,a):d},g=c?function(a){var b=f(a,this);return c.apply(b,arguments)?(a&&(a.currentTarget=b),e(a,arguments)):void 0}:function(a){return b.__beanDel&&(a=a.clone(f(a))),e(a,arguments)};return g.__beanDel=b.__beanDel,g},b=function(b,c,d,e,f,g,h){var i=u[c],j;"unload"==c&&(d=D(E,b,c,d,e)),i&&(i.condition&&(d=a(b,d,i.condition,g)),c=i.base||c),this.isNative=j=t[c]&&!!b[l],this.customType=!k&&!j&&c,this.element=b,this.type=c,this.original=e,this.namespaces=f,this.eventType=k||j?c:"propertychange",this.target=w(b,j),this[l]=!!this.target[l],this.root=h,this.handler=a(b,d,null,g)};return b.prototype.inNamespaces=function(a){var b,c,d=0;if(!a)return!0;if(!this.namespaces)return!1;for(b=a.length;b--;)for(c=this.namespaces.length;c--;)a[b]==this.namespaces[c]&&d++;return a.length===d},b.prototype.matches=function(a,b,c){return!(this.element!==a||b&&this.original!==b||c&&this.handler!==c)},b}(),y=function(){var a={},b=function(c,d,e,f,g,h){var i=g?"r":"$";if(d&&"*"!=d){var j=0,k,l=a[i+d],m="*"==c;if(!l)return;for(k=l.length;k>j;j++)if((m||l[j].matches(c,e,f))&&!h(l[j],l,j,d))return}else for(var n in a)n.charAt(0)==i&&b(c,n.substr(1),e,f,g,h)},c=function(b,c,d,e){var f,g=a[(e?"r":"$")+c];if(g)for(f=g.length;f--;)if(!g[f].root&&g[f].matches(b,d,null))return!0;return!1},d=function(a,c,d,e){var f=[];return b(a,c,d,null,e,function(a){return f.push(a)}),f},e=function(b){var c=!b.root&&!this.has(b.element,b.type,null,!1),d=(b.root?"r":"$")+b.type;return(a[d]||(a[d]=[])).push(b),c},f=function(c){b(c.element,c.type,null,c.handler,c.root,function(b,c,d){return c.splice(d,1),b.removed=!0,0===c.length&&delete a[(b.root?"r":"$")+b.type],!1})},g=function(){var b,c=[];for(b in a)"$"==b.charAt(0)&&(c=c.concat(a[b]));return c};return{has:c,get:d,put:e,del:f,entries:g}}(),z,A=function(a){z=arguments.length?a:i.querySelectorAll?function(a,b){return b.querySelectorAll(a)}:function(){throw new Error("Bean: No selector engine installed")}},B=function(a,b){if(k||!b||!a||a.propertyName=="_on"+b){var c=y.get(this,b||a.type,null,!1),d=c.length,e=0;for(a=new v(a,this,!0),b&&(a.type=b);d>e&&!a.isImmediatePropagationStopped();e++)c[e].removed||c[e].handler.call(this,a)}},C=k?function(a,b,c){a[c?g:h](b,B,!1)}:function(a,b,c,d){var e;c?(y.put(e=new x(a,d||b,function(b){B.call(a,b,d)},B,null,null,!0)),d&&null==a["_on"+d]&&(a["_on"+d]=0),e.target.attachEvent("on"+e.eventType,e.handler)):(e=y.get(a,d||b,B,!0)[0],e&&(e.target.detachEvent("on"+e.eventType,e.handler),y.del(e)))},D=function(a,b,c,d,e){return function(){d.apply(this,arguments),a(b,c,e)}},E=function(a,b,c,d){var e=b&&b.replace(f,""),g=y.get(a,e,null,!1),h={},i,j;for(i=0,j=g.length;j>i;i++)c&&g[i].original!==c||!g[i].inNamespaces(d)||(y.del(g[i]),!h[g[i].eventType]&&g[i][l]&&(h[g[i].eventType]={t:g[i].eventType,c:g[i].type}));for(i in h)y.has(a,h[i].t,null,!1)||C(a,h[i].t,!1,h[i].c)},F=function(a,b){var c=function(b,c){for(var d,e=p(a)?z(a,c):a;b&&b!==c;b=b.parentNode)for(d=e.length;d--;)if(e[d]===b)return b},d=function(a){var d=c(a.target,this);d&&b.apply(d,arguments)};return d.__beanDel={ft:c,selector:a},d},G=k?function(a,b,d){var e=i.createEvent(a?"HTMLEvents":"UIEvents");e[a?"initEvent":"initUIEvent"](b,!0,!0,c,1),d.dispatchEvent(e)}:function(a,b,c){c=w(c,a),a?c.fireEvent("on"+b,i.createEventObject()):c["_on"+b]++},H=function(a,b,c){var d=p(b),g,h,i,j;if(d&&b.indexOf(" ")>0){for(b=o(b),j=b.length;j--;)H(a,b[j],c);return a}if(h=d&&b.replace(f,""),h&&u[h]&&(h=u[h].base),!b||d)(i=d&&b.replace(e,""))&&(i=o(i,".")),E(a,h,c,i);else if(q(b))E(a,null,b);else for(g in b)b.hasOwnProperty(g)&&H(a,g,b[g]);return a},I=function(a,b,c,d){var g,h,i,j,k,p,r;{if(void 0!==c||"object"!=typeof b){for(q(c)?(k=n.call(arguments,3),d=g=c):(g=d,k=n.call(arguments,4),d=F(c,g,z)),i=o(b),this===m&&(d=D(H,a,b,d,g)),j=i.length;j--;)r=y.put(p=new x(a,i[j].replace(f,""),d,g,o(i[j].replace(e,""),"."),k,!1)),p[l]&&r&&C(a,p.eventType,!0,p.customType);return a}for(h in b)b.hasOwnProperty(h)&&I.call(this,a,h,b[h])}},J=function(a,b,c,d){return I.apply(null,p(c)?[a,c,b,d].concat(arguments.length>3?n.call(arguments,5):[]):n.call(arguments))},K=function(){return I.apply(m,arguments)},L=function(a,b,c){var d=o(b),g,h,i,j,k;for(g=d.length;g--;)if(b=d[g].replace(f,""),(j=d[g].replace(e,""))&&(j=o(j,".")),j||c||!a[l])for(k=y.get(a,b,null,!1),c=[!1].concat(c),h=0,i=k.length;i>h;h++)k[h].inNamespaces(j)&&k[h].handler.apply(a,c);else G(t[b],b,a);return a},M=function(a,b,c){for(var d=y.get(b,c,null,!1),e=d.length,f=0,g,h;e>f;f++)d[f].original&&(g=[a,d[f].type],(h=d[f].handler.__beanDel)&&g.push(h.selector),g.push(d[f].original),I.apply(null,g));return a},N={on:I,add:J,one:K,off:H,remove:H,clone:M,fire:L,Event:v,setSelectorEngine:A,noConflict:function(){return b[a]=d,this}};if(c.attachEvent){var O=function(){var a,b=y.entries();for(a in b)b[a].type&&"unload"!==b[a].type&&H(b[a].element,b[a].type);c.detachEvent("onunload",O),c.CollectGarbage&&c.CollectGarbage()};c.attachEvent("onunload",O)}return A(Ink.ss),N}),b={KEY_BACKSPACE:8,KEY_TAB:9,KEY_RETURN:13,KEY_ESC:27,KEY_LEFT:37,KEY_UP:38,KEY_RIGHT:39,KEY_DOWN:40,KEY_DELETE:46,KEY_HOME:36,KEY_END:35,KEY_PAGEUP:33,KEY_PAGEDOWN:34,KEY_INSERT:45,throttle:function(a,b){b=b||0;var c=0,d,e=function(){var f=+new Date,g=f-c;if(g>=b)return c=f,a.apply(this,[].slice.call(arguments));var h=this,i=[].slice.call(arguments);d||(d=setTimeout(function(){return d=null,e.apply(h,i)},b-g))};return e},element:function(a){var b=a.delegationTarget||a.target||"mouseout"===a.type&&a.fromElement||"mouseleave"===a.type&&a.fromElement||"mouseover"===a.type&&a.toElement||"mouseenter"===a.type&&a.toElement||a.srcElement||null;return!b||3!==b.nodeType&&4!==b.nodeType?b:b.parentNode},relatedTarget:function(a){var b=a.relatedTarget||"mouseout"===a.type&&a.toElement||"mouseleave"===a.type&&a.toElement||"mouseover"===a.type&&a.fromElement||"mouseenter"===a.type&&a.fromElement||null;return!b||3!==b.nodeType&&4!==b.nodeType?b:b.parentNode},findElement:function(a,b,c){for(var d=this.element(a);;){if(d.nodeName.toLowerCase()===b.toLowerCase())return d;if(d=d.parentNode,!d)return c?!1:document;if(!d.parentNode)return c?!1:document}},observe:function(a,b,c,d){return a=Ink.i(a),a?(a.addEventListener?a.addEventListener(b,c,!!d):a.attachEvent("on"+b,c=Ink.bind(c,a)),c):void 0},observeOnce:function(a,c,d,e){var f=function(){return b.stopObserving(a,c,f),d()};return b.observe(a,c,f,e)},observeMulti:function(a,b,c,d){if("string"==typeof a?a=Ink.ss(a):a&&1===a.nodeType&&(a=[a]),!a[0])return!1;for(var e=0,f=a.length;f>e;e++)this.observe(a[e],b,c,d);return c},observeDelegated:function(a,c,d,e){return b.observe(a,c,function(c){var f=b.element(c);if(f&&f!==a)for(var g=f;g!==a&&g!==document&&g;){if(Ink.Dom.Selector_1.matchesSelector(g,d))return c.delegationTarget=g,e(c);g=g.parentNode}})},stopObserving:function(a,b,c,d){a=Ink.i(a),a&&(a.removeEventListener?a.removeEventListener(b,c,!!d):a.detachEvent("on"+b,c))},stop:function(a){null!==a.cancelBubble&&(a.cancelBubble=!0),a.stopPropagation&&a.stopPropagation(),a.preventDefault&&a.preventDefault(),window.attachEvent&&(a.returnValue=!1),null!==a.cancel&&(a.cancel=!0)},stopPropagation:function(a){null!==a.cancelBubble&&(a.cancelBubble=!0),a.stopPropagation&&a.stopPropagation()},stopDefault:function(a){a.preventDefault&&a.preventDefault(),window.attachEvent&&(a.returnValue=!1),null!==a.cancel&&(a.cancel=!0)},pointer:function(a){return{x:this.pointerX(a),y:this.pointerY(a)}},pointerX:function(a){return a.touches&&a.touches[0]&&a.touches[0].pageX||a.pageX||a.clientX+(document.documentElement.scrollLeft||document.body.scrollLeft)},pointerY:function(a){return a.touches&&a.touches[0]&&a.touches[0].pageY||a.pageY||a.clientY+(document.documentElement.scrollTop||document.body.scrollTop)},isLeftClick:function(a){if(window.addEventListener){if(0===a.button)return!0;if("touchend"===a.type&&null===a.button)return!0}else if(1===a.button)return!0;return!1},isRightClick:function(a){return 2===a.button},isMiddleClick:function(a){return window.addEventListener?1===a.button:4===a.button;return!1},getCharFromKeyboardEvent:function(a,b){var c=a.keyCode,d=String.fromCharCode(c),e=a.shiftKey;if(c>=65&&90>=c)return"boolean"==typeof b&&(e=b),e?d:d.toLowerCase();if(c>=96&&105>=c)return String.fromCharCode(48+(c-96));switch(c){case 109:case 189:return"-";case 107:case 187:return"+"}return d},debug:function(){}};return Ink.extendObj(b,a)}),Ink.createModule("Ink.Dom.FormSerialize",1,[],function(){"use strict";var a={serialize:function(a){a=Ink.i(a);var b=this._getFieldNameInputsMap(a),c={};for(var d in b)if(b.hasOwnProperty(d))if(null!==d){var e=d.replace(/\[\]$/,"");c[e]=this._getValuesOfField(b[d])}else c[d]=this._getValuesOfField(b[d]);return delete c["null"],c},fillIn:function(a,b){a=Ink.i(a);var c=this._getFieldNameInputsMap(a);delete c["null"];for(var d in b)b.hasOwnProperty(d)&&this._setValuesOfField(c[d],b[d])},_getFieldNameInputsMap:function(a){for(var b,c,d,e={},f=0,g=a.elements.length;g>f;++f)d=a.elements[f],b=d.getAttribute("name"),c=d.nodeName.toLowerCase(),"fieldset"!==c&&(void 0===e[b]?e[b]=[d]:e[b].push(d));return e},_getValuesOfField:function(a){var b=a[0].nodeName.toLowerCase(),c=a[0].getAttribute("type"),d=a[0].value,e,f,g,h,i,j,k=[];switch(b){case"select":for(e=0,f=a.length;f>e;++e)for(k[e]=[],j=a[e].getAttribute("multiple"),g=0,h=a[e].options.length;h>g;++g)if(i=a[e].options[g],i.selected){if(!j){k[e]=i.value;break}k[e].push(i.value)}return a.length>0&&/\[[^\]]*\]$/.test(a[0].getAttribute("name"))?k:k[0];case"textarea":case"input":if("checkbox"===c||"radio"===c){for(e=0,f=a.length;f>e;++e)i=a[e],i.checked&&k.push(i.value);return"checkbox"===c?a.length>1?k:!!k.length:a.length>1?k[0]:!!k.length}if(a.length>0&&/\[[^\]]*\]$/.test(a[0].getAttribute("name"))){var l=[];for(e=0,f=a.length;f>e;++e)l.push(a[e].value);return l}return d;break;default:return void 0}},_valInArray:function(a,b){for(var c=0,d=b.length;d>c;++c)if(b[c]===a)return!0;return!1},_setValuesOfField:function(a,b){if(a){var c=a[0].nodeName.toLowerCase(),d=a[0].getAttribute("type"),e,f,g;switch(c){case"select":if(a.length>1)throw"Got multiple select elements with same name!";for(e=0,f=a[0].options.length;f>e;++e)g=a[0].options[e],g.selected=b instanceof Array?this._valInArray(g.value,b):g.value===b;break;case"textarea":case"input":if("checkbox"===d||"radio"===d)for(e=0,f=a.length;f>e;++e)g=a[e],g.checked=b instanceof Array?this._valInArray(g.value,b):a.length>1?g.value===b:!!b;else{if(a.length>1)throw"Got multiple input elements with same name!";"file"!==d&&(a[0].value=b)}break;default:throw'Unsupported element: "'+c+'"!'}}}};return a}),Ink.createModule("Ink.Dom.Loaded",1,[],function(){"use strict";var a={_contexts:[],run:function(a,b){b||(b=a,a=window);for(var c,d=0,e=this._contexts.length;e>d;d++)if(this._contexts[d][0]===a){c=this._contexts[d][1];break}c||(c={cbQueue:[],win:a,doc:a.document,root:a.document.documentElement,done:!1,top:!0},c.handlers={checkState:Ink.bindEvent(this._checkState,this,c),poll:Ink.bind(this._poll,this,c)},this._contexts.push([a,c]));var f=c.doc.addEventListener;c.add=f?"addEventListener":"attachEvent",c.rem=f?"removeEventListener":"detachEvent",c.pre=f?"":"on",c.det=f?"DOMContentLoaded":"onreadystatechange",c.wet=c.pre+"load";var g=c.handlers.checkState,h="complete"===c.doc.readyState&&"about:blank"!==c.win.location.toString();if(h)setTimeout(Ink.bind(function(){b.call(c.win,"lazy")},this),0);else{c.cbQueue.push(b),c.doc[c.add](c.det,g),c.win[c.add](c.wet,g);var i=1;try{i=c.win.frameElement}catch(j){}if(!f&&c.root&&c.root.doScroll){try{c.top=!i}catch(j){}c.top&&this._poll(c)}}},_checkState:function(a,b){if(a&&("readystatechange"!==a.type||"complete"===b.doc.readyState)){var c="load"===a.type?b.win:b.doc;c[b.rem](b.pre+a.type,b.handlers.checkState,!1),this._ready(b)}},_poll:function(a){try{a.root.doScroll("left")}catch(b){return setTimeout(a.handlers.poll,50)}this._ready(a)},_ready:function(a){if(!a.done){a.done=!0;for(var b=0;bb;b++)if(this[b]===a)return b;return-1},J="[\\x20\\t\\r\\n\\f]",K="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",L=K.replace("w","w#"),M="([*^$|!~]?=)",N="\\["+J+"*("+K+")"+J+"*(?:"+M+J+"*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|("+L+")|)|)"+J+"*\\]",O=":("+K+")(?:\\(((['\"])((?:\\\\.|[^\\\\])*?)\\3|((?:\\\\.|[^\\\\()[\\]]|"+N.replace(3,8)+")*)|.*)\\)|)",P=new RegExp("^"+J+"+|((?:^|[^\\\\])(?:\\\\.)*)"+J+"+$","g"),Q=new RegExp("^"+J+"*,"+J+"*"),R=new RegExp("^"+J+"*([\\x20\\t\\r\\n\\f>+~])"+J+"*"),S=new RegExp(O),T=new RegExp("^"+L+"$"),U={ID:new RegExp("^#("+K+")"),CLASS:new RegExp("^\\.("+K+")"),NAME:new RegExp("^\\[name=['\"]?("+K+")['\"]?\\]"),TAG:new RegExp("^("+K.replace("w","w*")+")"),ATTR:new RegExp("^"+N),PSEUDO:new RegExp("^"+O),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+J+"*(even|odd|(([+-]|)(\\d*)n|)"+J+"*(?:([+-]|)"+J+"*(\\d+)|))"+J+"*\\)|)","i"),needsContext:new RegExp("^"+J+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+J+"*((?:-\\d)?\\d*)"+J+"*\\)|)(?=[^-]|$)","i")},V=/[\x20\t\r\n\f]*[+~]/,W=/^[^{]+\{\s*\[native code/,X=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,Y=/^(?:input|select|textarea|button)$/i,Z=/^h\d$/i,$=/'|\\/g,_=/\=[\x20\t\r\n\f]*([^'"\]]*)[\x20\t\r\n\f]*\]/g,ab=/\\([\da-fA-F]{1,6}[\x20\t\r\n\f]?|.)/g,bb=function(a,b){var c="0x"+b-65536;return c!==c?b:0>c?String.fromCharCode(c+65536):String.fromCharCode(c>>10|55296,1023&c|56320)};try{G.apply(D=H.call(s.childNodes),s.childNodes),D[s.childNodes.length].nodeType}catch(cb){G={apply:D.length?function(a,b){F.apply(a,H.call(b))}:function(a,b){for(var c=a.length,d=0;a[c++]=b[d++];);a.length=c-1}}}function db(a){return W.test(a+"")}function eb(){var a,b=[];return a=function(d,e){return b.push(d+=" ")>c.cacheLength&&delete a[b.shift()],a[d]=e}}function fb(a){return a[r]=!0,a}function gb(a){var b=k.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b=null}}function hb(a,b,c,d){var e,f,g,h,i,l,o,p,u,v;if((b?b.ownerDocument||b:s)!==k&&j(b),b=b||k,c=c||[],!a||"string"!=typeof a)return c;if(1!==(h=b.nodeType)&&9!==h)return[];if(m&&!d){if(e=X.exec(a))if(g=e[1]){if(9===h){if(f=b.getElementById(g),!f||!f.parentNode)return c;if(f.id===g)return c.push(f),c}else if(b.ownerDocument&&(f=b.ownerDocument.getElementById(g))&&q(b,f)&&f.id===g)return c.push(f),c}else{if(e[2])return G.apply(c,b.getElementsByTagName(a)),c;if((g=e[3])&&t.getElementsByClassName&&b.getElementsByClassName)return G.apply(c,b.getElementsByClassName(g)),c}if(t.qsa&&!n.test(a)){if(o=!0,p=r,u=b,v=9===h&&a,1===h&&"object"!==b.nodeName.toLowerCase()){for(l=mb(a),(o=b.getAttribute("id"))?p=o.replace($,"\\$&"):b.setAttribute("id",p),p="[id='"+p+"'] ",i=l.length;i--;)l[i]=p+nb(l[i]);u=V.test(a)&&b.parentNode||b,v=l.join(",")}if(v)try{return G.apply(c,u.querySelectorAll(v)),c}catch(w){}finally{o||b.removeAttribute("id")}}}return vb(a.replace(P,"$1"),b,c,d)}e=hb.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},j=hb.setDocument=function(a){var b=a?a.ownerDocument||a:s;return b!==k&&9===b.nodeType&&b.documentElement?(k=b,l=b.documentElement,m=!e(b),t.getElementsByTagName=gb(function(a){return a.appendChild(b.createComment("")),!a.getElementsByTagName("*").length}),t.attributes=gb(function(a){a.innerHTML="";var b=typeof a.lastChild.getAttribute("multiple");return"boolean"!==b&&"string"!==b}),t.getElementsByClassName=gb(function(a){return a.innerHTML="",a.getElementsByClassName&&a.getElementsByClassName("e").length?(a.lastChild.className="e",2===a.getElementsByClassName("e").length):!1}),t.getByName=gb(function(a){a.id=r+0,a.appendChild(k.createElement("a")).setAttribute("name",r),a.appendChild(k.createElement("i")).setAttribute("name",r),l.appendChild(a);var c=b.getElementsByName&&b.getElementsByName(r).length===2+b.getElementsByName(r+0).length; +return l.removeChild(a),c}),t.sortDetached=gb(function(a){return a.compareDocumentPosition&&1&a.compareDocumentPosition(k.createElement("div"))}),c.attrHandle=gb(function(a){return a.innerHTML="",a.firstChild&&typeof a.firstChild.getAttribute!==B&&"#"===a.firstChild.getAttribute("href")})?{}:{href:function(a){return a.getAttribute("href",2)},type:function(a){return a.getAttribute("type")}},t.getByName?(c.find.ID=function(a,b){if(typeof b.getElementById!==B&&m){var c=b.getElementById(a);return c&&c.parentNode?[c]:[]}},c.filter.ID=function(a){var b=a.replace(ab,bb);return function(a){return a.getAttribute("id")===b}}):(c.find.ID=function(a,b){if(typeof b.getElementById!==B&&m){var c=b.getElementById(a);return c?c.id===a||typeof c.getAttributeNode!==B&&c.getAttributeNode("id").value===a?[c]:void 0:[]}},c.filter.ID=function(a){var b=a.replace(ab,bb);return function(a){var c=typeof a.getAttributeNode!==B&&a.getAttributeNode("id");return c&&c.value===b}}),c.find.TAG=t.getElementsByTagName?function(a,b){return typeof b.getElementsByTagName!==B?b.getElementsByTagName(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){for(;c=f[e++];)1===c.nodeType&&d.push(c);return d}return f},c.find.NAME=t.getByName&&function(a,b){return typeof b.getElementsByName!==B?b.getElementsByName(name):void 0},c.find.CLASS=t.getElementsByClassName&&function(a,b){return typeof b.getElementsByClassName!==B&&m?b.getElementsByClassName(a):void 0},o=[],n=[":focus"],(t.qsa=db(b.querySelectorAll))&&(gb(function(a){a.innerHTML="",a.querySelectorAll("[selected]").length||n.push("\\["+J+"*(?:checked|disabled|ismap|multiple|readonly|selected|value)"),a.querySelectorAll(":checked").length||n.push(":checked")}),gb(function(a){a.innerHTML="",a.querySelectorAll("[i^='']").length&&n.push("[*^$]="+J+"*(?:\"\"|'')"),a.querySelectorAll(":enabled").length||n.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),n.push(",.*:")})),(t.matchesSelector=db(p=l.matchesSelector||l.mozMatchesSelector||l.webkitMatchesSelector||l.oMatchesSelector||l.msMatchesSelector))&&gb(function(a){t.disconnectedMatch=p.call(a,"div"),p.call(a,"[s!='']:x"),o.push("!=",O)}),n=new RegExp(n.join("|")),o=o.length&&new RegExp(o.join("|")),q=db(l.contains)||l.compareDocumentPosition?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)for(;b=b.parentNode;)if(b===a)return!0;return!1},A=l.compareDocumentPosition?function(a,c){if(a===c)return z=!0,0;var d=c.compareDocumentPosition&&a.compareDocumentPosition&&a.compareDocumentPosition(c);return d?1&d||h&&c.compareDocumentPosition(a)===d?a===b||q(s,a)?-1:c===b||q(s,c)?1:i?I.call(i,a)-I.call(i,c):0:4&d?-1:1:a.compareDocumentPosition?-1:1}:function(a,c){var d,e=0,f=a.parentNode,g=c.parentNode,h=[a],i=[c];if(a===c)return z=!0,0;if(!f||!g)return a===b?-1:c===b?1:f?-1:g?1:0;if(f===g)return ib(a,c);for(d=a;d=d.parentNode;)h.unshift(d);for(d=c;d=d.parentNode;)i.unshift(d);for(;h[e]===i[e];)e++;return e?ib(h[e],i[e]):h[e]===s?-1:i[e]===s?1:0},k):k},hb.matches=function(a,b){return hb(a,null,null,b)},hb.matchesSelector=function(a,b){if((a.ownerDocument||a)!==k&&j(a),b=b.replace(_,"='$1']"),t.matchesSelector&&m&&(!o||!o.test(b))&&!n.test(b))try{var c=p.call(a,b);if(c||t.disconnectedMatch||a.document&&11!==a.document.nodeType)return c}catch(d){}return hb(b,k,null,[a]).length>0},hb.contains=function(a,b){return(a.ownerDocument||a)!==k&&j(a),q(a,b)},hb.attr=function(a,b){var d;return(a.ownerDocument||a)!==k&&j(a),m&&(b=b.toLowerCase()),(d=c.attrHandle[b])?d(a):!m||t.attributes?a.getAttribute(b):((d=a.getAttributeNode(b))||a.getAttribute(b))&&a[b]===!0?b:d&&d.specified?d.value:null},hb.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},hb.uniqueSort=function(a){var b,c=[],d=0,e=0;if(z=!t.detectDuplicates,h=!t.sortDetached,i=!t.sortStable&&a.slice(0),a.sort(A),z){for(;b=a[e++];)b===a[e]&&(d=c.push(e));for(;d--;)a.splice(c[d],1)}return a};function ib(a,b){var c=b&&a,d=c&&(~b.sourceIndex||C)-(~a.sourceIndex||C);if(d)return d;if(c)for(;c=c.nextSibling;)if(c===b)return-1;return a?1:-1}function jb(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function kb(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function lb(a){return fb(function(b){return b=+b,fb(function(c,d){for(var e,f=a([],c.length,b),g=f.length;g--;)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}d=hb.getText=function(a){var b,c="",e=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=d(a)}else if(3===f||4===f)return a.nodeValue}else for(;b=a[e];e++)c+=d(b);return c},c=hb.selectors={cacheLength:50,createPseudo:fb,match:U,find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(ab,bb),a[3]=(a[4]||a[5]||"").replace(ab,bb),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||hb.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&hb.error(a[0]),a},PSEUDO:function(a){var b,c=!a[5]&&a[2];return U.CHILD.test(a[0])?null:(a[4]?a[2]=a[4]:c&&S.test(c)&&(b=mb(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){return"*"===a?function(){return!0}:(a=a.replace(ab,bb).toLowerCase(),function(b){return b.nodeName&&b.nodeName.toLowerCase()===a})},CLASS:function(a){var b=w[a+" "];return b||(b=new RegExp("(^|"+J+")"+a+"("+J+"|$)"))&&w(a,function(a){return b.test(a.className||typeof a.getAttribute!==B&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=hb.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,s=h&&b.nodeName.toLowerCase(),t=!i&&!h;if(q){if(f){for(;p;){for(l=b;l=l[p];)if(h?l.nodeName.toLowerCase()===s:1===l.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&t){for(k=q[r]||(q[r]={}),j=k[a]||[],n=j[0]===u&&j[1],m=j[0]===u&&j[2],l=n&&q.childNodes[n];l=++n&&l&&l[p]||(m=n=0)||o.pop();)if(1===l.nodeType&&++m&&l===b){k[a]=[u,n,m];break}}else if(t&&(j=(b[r]||(b[r]={}))[a])&&j[0]===u)m=j[1];else for(;(l=++n&&l&&l[p]||(m=n=0)||o.pop())&&((h?l.nodeName.toLowerCase()!==s:1!==l.nodeType)||!++m||(t&&((l[r]||(l[r]={}))[a]=[u,m]),l!==b)););return m-=e,m===d||m%d===0&&m/d>=0}}},PSEUDO:function(a,b){var d,e=c.pseudos[a]||c.setFilters[a.toLowerCase()]||hb.error("unsupported pseudo: "+a);return e[r]?e(b):e.length>1?(d=[a,a,"",b],c.setFilters.hasOwnProperty(a.toLowerCase())?fb(function(a,c){for(var d,f=e(a,b),g=f.length;g--;)d=I.call(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,d)}):e}},pseudos:{not:fb(function(a){var b=[],c=[],d=f(a.replace(P,"$1"));return d[r]?fb(function(a,b,c,e){for(var f,g=d(a,null,e,[]),h=a.length;h--;)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),!c.pop()}}),has:fb(function(a){return function(b){return hb(a,b).length>0}}),contains:fb(function(a){return function(b){return(b.textContent||b.innerText||d(b)).indexOf(a)>-1}}),lang:fb(function(a){return T.test(a||"")||hb.error("unsupported lang: "+a),a=a.replace(ab,bb).toLowerCase(),function(b){var c;do if(c=m?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(a){var b=window.location&&window.location.hash;return b&&b.slice(1)===a.id},root:function(a){return a===l},focus:function(a){return a===k.activeElement&&(!k.hasFocus||k.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeName>"@"||3===a.nodeType||4===a.nodeType)return!1;return!0},parent:function(a){return!c.pseudos.empty(a)},header:function(a){return Z.test(a.nodeName)},input:function(a){return Y.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||b.toLowerCase()===a.type)},first:lb(function(){return[0]}),last:lb(function(a,b){return[b-1]}),eq:lb(function(a,b,c){return[0>c?c+b:c]}),even:lb(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:lb(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:lb(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:lb(function(a,b,c){for(var d=0>c?c+b:c;++db;b++)d+=a[b].value;return d}function ob(a,c,d){var e=c.dir,f=d&&"parentNode"===e,g=v++;return c.first?function(b,c,d){for(;b=b[e];)if(1===b.nodeType||f)return a(b,c,d)}:function(c,d,h){var i,j,k,l=u+" "+g;if(h){for(;c=c[e];)if((1===c.nodeType||f)&&a(c,d,h))return!0}else for(;c=c[e];)if(1===c.nodeType||f)if(k=c[r]||(c[r]={}),(j=k[e])&&j[0]===l){if((i=j[1])===!0||i===b)return i===!0}else if(j=k[e]=[l],j[1]=a(c,d,h)||b,j[1]===!0)return!0}}function pb(a){return a.length>1?function(b,c,d){for(var e=a.length;e--;)if(!a[e](b,c,d))return!1;return!0}:a[0]}function qb(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(!c||c(f,d,e))&&(g.push(f),j&&b.push(h));return g}function rb(a,b,c,d,e,f){return d&&!d[r]&&(d=rb(d)),e&&!e[r]&&(e=rb(e,f)),fb(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||ub(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:qb(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d)for(j=qb(r,n),d(j,[],h,i),k=j.length;k--;)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l));if(f){if(e||a){if(e){for(j=[],k=r.length;k--;)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}for(k=r.length;k--;)(l=r[k])&&(j=e?I.call(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=qb(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):G.apply(g,r)})}function sb(a){for(var b,d,e,f=a.length,h=c.relative[a[0].type],i=h||c.relative[" "],j=h?1:0,k=ob(function(a){return a===b},i,!0),l=ob(function(a){return I.call(b,a)>-1},i,!0),m=[function(a,c,d){return!h&&(d||c!==g)||((b=c).nodeType?k(a,c,d):l(a,c,d))}];f>j;j++)if(d=c.relative[a[j].type])m=[ob(pb(m),d)];else{if(d=c.filter[a[j].type].apply(null,a[j].matches),d[r]){for(e=++j;f>e&&!c.relative[a[e].type];e++);return rb(j>1&&pb(m),j>1&&nb(a.slice(0,j-1)).replace(P,"$1"),d,e>j&&sb(a.slice(j,e)),f>e&&sb(a=a.slice(e)),f>e&&nb(a))}m.push(d)}return pb(m)}function tb(a,d){var e=0,f=d.length>0,h=a.length>0,i=function(i,j,l,m,n){var o,p,q,r=[],s=0,t="0",v=i&&[],w=null!=n,x=g,y=i||h&&c.find.TAG("*",n&&j.parentNode||j),z=u+=null==x?1:Math.random()||.1;for(w&&(g=j!==k&&j,b=e);null!=(o=y[t]);t++){if(h&&o){for(p=0;q=a[p++];)if(q(o,j,l)){m.push(o);break}w&&(u=z,b=++e)}f&&((o=!q&&o)&&s--,i&&v.push(o))}if(s+=t,f&&t!==s){for(p=0;q=d[p++];)q(v,r,j,l);if(i){if(s>0)for(;t--;)v[t]||r[t]||(r[t]=E.call(m));r=qb(r)}G.apply(m,r),w&&!i&&r.length>0&&s+d.length>1&&hb.uniqueSort(m)}return w&&(u=z,g=x),v};return f?fb(i):i}f=hb.compile=function(a,b){var c,d=[],e=[],f=y[a+" "];if(!f){for(b||(b=mb(a)),c=b.length;c--;)f=sb(b[c]),f[r]?d.push(f):e.push(f);f=y(a,tb(e,d))}return f};function ub(a,b,c){for(var d=0,e=b.length;e>d;d++)hb(a,b[d],c);return c}function vb(a,b,d,e){var g,h,i,j,k,l=mb(a);if(!e&&1===l.length){if(h=l[0]=l[0].slice(0),h.length>2&&"ID"===(i=h[0]).type&&9===b.nodeType&&m&&c.relative[h[1].type]){if(b=(c.find.ID(i.matches[0].replace(ab,bb),b)||[])[0],!b)return d;a=a.slice(h.shift().value.length)}for(g=U.needsContext.test(a)?0:h.length;g--&&(i=h[g],!c.relative[j=i.type]);)if((k=c.find[j])&&(e=k(i.matches[0].replace(ab,bb),V.test(h[0].type)&&b.parentNode||b))){if(h.splice(g,1),a=e.length&&nb(h),!a)return G.apply(d,e),d;break}}return f(a,l)(e,b,!m,d,V.test(a)),d}c.pseudos.nth=c.pseudos.eq;function wb(){}return wb.prototype=c.filters=c.pseudos,c.setFilters=new wb,t.sortStable=r.split("").sort(A).join("")===r,j(),[0,0].sort(A),t.detectDuplicates=z,{select:hb,matches:hb.matches,matchesSelector:hb.matchesSelector}}),Ink.createModule("Ink.UI.Animate",1,["Ink.UI.Common_1","Ink.Dom.Event_1","Ink.Dom.Css_1"],function(a,b,c){"use strict";var d=function(a){return"animationName"in a.style?"animation":"oAnimationName"in a.style?"oAnimation":"msAnimationName"in a.style?"msAnimation":"webkitAnimationName"in a.style?"webkitAnimation":null}(document.createElement("div")),e={animation:"animationend",oAnimation:"oanimationend",msAnimation:"MSAnimationEnd",webkitAnimation:"webkitAnimationEnd"}[d];function f(c,d){this._element=a.elOrSelector(c),this._options=a.options({trigger:["Element",null],duration:["String","slow"],animation:["String"],removeClass:["Boolean",!0],onEnd:["Function",function(){}]},d||{},this._element),isNaN(parseInt(this._options.duration,10))||(this._options.duration=parseInt(this._options.duration,10)),this._options.trigger?b.observe(this._options.trigger,"click",Ink.bind(function(){this.animate()},this)):this.animate()}return f.prototype.animate=function(){f.animate(this._element,this._options.animation,this._options)},Ink.extendObj(f,{_animationPrefix:d,animationSupported:!!d,animationEndEventName:e,animate:function(b,g,h){if(b=a.elOrSelector(b),("number"==typeof h||"string"==typeof h)&&(h={duration:h}),"function"==typeof arguments[3]&&(h.onEnd=arguments[3]),"number"!=typeof h.duration&&"string"!=typeof h.duration&&(h.duration=400),!f.animationSupported)return void(h.onEnd&&setTimeout(function(){h.onEnd(null)},0));"number"==typeof h.duration?b.style[d+"Duration"]=h.duration+"ms":"string"==typeof h.duration&&c.addClassName(b,h.duration),c.addClassName(b,["animated",g]);function i(a){a.target===b&&a.animationName===g&&(h.onEnd&&h.onEnd(a),h.removeClass&&c.removeClassName(b,g),"string"==typeof h.duration&&c.removeClassName(b,h.duration),b.removeEventListener(e,i,!1))}b.addEventListener(e,i,!1)}}),f}),Ink.createModule("Ink.UI.Carousel","1",["Ink.UI.Common_1","Ink.Dom.Event_1","Ink.Dom.Css_1","Ink.Dom.Element_1","Ink.UI.Pagination_1","Ink.Dom.Browser_1","Ink.Dom.Selector_1"],function(a,b,c,d,e,f){"use strict";function g(a,b,c){return Math.min(c,Math.max(b,a))}var h=window.requestAnimationFrame||window.mozRequestAnimationFrame||window.webkitRequestAnimationFrame||function(a){return setTimeout(a,1e3/30)},i=function(c,e){this._handlers={paginationChange:Ink.bindMethod(this,"_onPaginationChange"),windowResize:b.throttle(Ink.bindMethod(this,"refit"),200)},b.observe(window,"resize",this._handlers.windowResize);var f=this._element=a.elOrSelector(c,"1st argument"),g=this._options=a.options({autoAdvance:["Integer",0],axis:["String","x"],initialPage:["Integer",0],hideLast:["Boolean",!1],center:["Boolean",!1],keyboardSupport:["Boolean",!1],pagination:["String",null],onChange:["Function",null],swipe:["Boolean",!0]},e||{},f,this);this._isY="y"===g.axis;var h=Ink.s("ul.stage",f);this._ulEl=h,d.removeTextNodeChildren(h),this.refit(),this._isY&&(this._ulEl.style.whiteSpace="normal"),g.swipe&&(b.observe(f,"touchstart",Ink.bindMethod(this,"_onTouchStart")),b.observe(f,"touchmove",Ink.bindMethod(this,"_onTouchMove")),b.observe(f,"touchend",Ink.bindMethod(this,"_onTouchEnd"))),this._setUpPagination(),this._setUpAutoAdvance(),this._setUpHider()};i.prototype={refit:function(){var a=this._isY,b=function(b,c){return c?d.outerDimensions(b)[a?0:1]:d.outerDimensions(b)[a?1:0]};this._liEls=Ink.ss("li.slide",this._ulEl);var c=this._liEls.length,e=this._ulEl.getBoundingClientRect();this._ctnLength=a?e.bottom-e.top:e.right-e.left,this._elLength=b(this._liEls[0]),this._slidesPerPage=Math.floor(this._ctnLength/this._elLength)||1;var f=Math.ceil(c/this._slidesPerPage),h=this._numPages!==f;this._numPages=f,this._deltaLength=this._slidesPerPage*this._elLength,this._center(),this._updateHider(),this._IE7(),this._pagination&&h&&this._pagination.setSize(this._numPages),this.setPage(g(this.getPage(),1,this._numPages))},_setUpPagination:function(){this._options.pagination?(a.isDOMElement(this._options.pagination)||"string"==typeof this._options.pagination?this._pagination=new e(this._options.pagination,{size:this._numPages,onChange:this._handlers.paginationChange}):(this._pagination=this._options.pagination,this._pagination._options.onChange=this._handlers.paginationChange,this._pagination.setSize(this._numPages)),this._pagination.setCurrent(this._options.initialPage||0)):this._currentPage=this._options.initialPage||0},_setUpAutoAdvance:function(){if(this._options.autoAdvance){var a=this;setTimeout(function b(){a.nextPage(!0),setTimeout(b,a._options.autoAdvance)},this._options.autoAdvance)}},_setUpHider:function(){if(this._options.hideLast){var a=d.create("div",{className:"hider",insertBottom:this._element});a.style.position="absolute",a.style[this._isY?"left":"top"]="0",a.style[this._isY?"right":"bottom"]="0",a.style[this._isY?"bottom":"right"]="0",this._hiderEl=a}},_center:function(){if(this._options.center){var a=Math.floor((this._ctnLength-this._elLength*this._slidesPerPage)/2),b;b=this._isY?[a,"px 0"]:["0 ",a,"px"],this._ulEl.style.padding=b.join("")}},_updateHider:function(){if(this._hiderEl)if(0===this.getPage()){var a=Math.floor(this._ctnLength-this._elLength*this._slidesPerPage);this._options.center&&(a/=2),this._hiderEl.style[this._isY?"height":"width"]=a+"px"}else this._hiderEl.style[this._isY?"height":"width"]="0px"},_IE7:function(){if(f.IE&&""+f.version.split(".")[0]=="7")for(var a=Ink.ss("li.slide",this._ulEl),b=function(b,d){a[c].style[b]=d},c=0,d=a.length;d>c;c++)b("position","absolute"),b(this._isY?"top":"left",c*this._elLength+"px")},_onTouchStart:function(a){if(!(a.touches.length>1)){this._swipeData={x:b.pointerX(a),y:b.pointerY(a),lastUlPos:null};var c=this._ulEl.getBoundingClientRect();this._swipeData.inUlX=this._swipeData.x-c.left,this._swipeData.inUlY=this._swipeData.y-c.top,j(this._ulEl,"none"),this._touchMoveIsFirstTouchMove=!0,a.stopPropagation()}},_onTouchMove:function(a){if(!(a.touches.length>1)){var c=b.pointerX(a),d=b.pointerY(a),e=Math.abs(d-this._swipeData.y),f=Math.abs(c-this._swipeData.x);this._touchMoveIsFirstTouchMove&&(this._touchMoveIsFirstTouchMove=void 0,this._scrolling=this._isY?f>e:e>f,this._scrolling||this._onAnimationFrame()),!this._scrolling&&this._swipeData&&(a.preventDefault(),this._swipeData.pointerPos=this._isY?d:c),a.stopPropagation()}},_onAnimationFrame:function(){var a=this._swipeData;if(a&&!this._scrolling&&!this._touchMoveIsFirstTouchMove){var b=this._element.getBoundingClientRect(),c;c=this._isY?a.pointerPos-a.inUlY-b.top:a.pointerPos-a.inUlX-b.left,this._ulEl.style[this._isY?"top":"left"]=c+"px",a.lastUlPos=c,h(Ink.bindMethod(this,"_onAnimationFrame"))}},_onTouchEnd:function(a){if(this._swipeData&&this._swipeData.pointerPos&&!this._scrolling&&!this._touchMoveIsFirstTouchMove){var b=.1,c=-this._swipeData.lastUlPos,d=this.getPage(),e=c/this._elLength/this._slidesPerPage;if(Math.round(e)===d){var f=e-d;Math.abs(f)>b&&(f=f>0?1:-1,d+=f)}else d=Math.round(e);this.setPage(d),a.stopPropagation()}j(this._ulEl,null),this._swipeData=null,this._touchMoveIsFirstTouchMove=void 0,this._scrolling=void 0},_onPaginationChange:function(a){this._setPage(a.getCurrent())},getPage:function(){return this._pagination?this._pagination.getCurrent():this._currentPage},setPage:function(a,b){b&&(a%=this._numPages,0>a&&(a=this._numPages-a)),a=g(a,0,this._numPages-1),this._pagination?this._pagination.setCurrent(a):this._setPage(a)},_setPage:function(a){this._ulEl.style[this._isY?"top":"left"]=["-",a*this._deltaLength,"px"].join(""),this._options.onChange&&this._options.onChange.call(this,a),this._currentPage=a,this._updateHider()},nextPage:function(a){this.setPage(this.getPage()+1,a)},previousPage:function(a){this.setPage(this.getPage()-1,a)}};function j(a,b){a.style.transitionProperty=a.style.oTransitionProperty=a.style.msTransitionProperty=a.style.mozTransitionProperty=a.style.webkitTransitionProperty=b}return i}),Ink.createModule("Ink.UI.Close","1",["Ink.Dom.Event_1","Ink.Dom.Element_1"],function(a,b){"use strict";var c=function(){a.observe(document.body,"click",function(c){var d=a.element(c);if(d=b.findUpwardsByClass(d,"ink-close")||b.findUpwardsByClass(d,"ink-dismiss")){var e=d;e=b.findUpwardsByClass(d,"ink-alert")||b.findUpwardsByClass(d,"ink-alert-block"),e&&(a.stop(c),b.remove(e))}})};return c}),Ink.createModule("Ink.UI.Common","1",["Ink.Dom.Element_1","Ink.Net.Ajax_1","Ink.Dom.Css_1","Ink.Dom.Selector_1","Ink.Util.Url_1"],function(a,b,c,d,e){"use strict";var f={},g=0,h={},i=Object.keys||function(a){var b=[];for(var c in a)a.hasOwnProperty(c)&&b.push(c);return b},j={Layouts:{SMALL:"small",MEDIUM:"medium",LARGE:"large"},isDOMElement:function(a){return a&&"object"==typeof a&&"nodeType"in a&&1===a.nodeType},isInteger:function(a){return"number"==typeof a&&a%1===0},elOrSelector:function(a,b){if(!this.isDOMElement(a)){var c=d.select(a);if(0===c.length)throw new TypeError(b+" must either be a DOM Element or a selector expression!\nThe script element must also be after the DOM Element itself.");return c[0]}return a},elsOrSelector:function(a,b,c){var e;if("string"==typeof a?e=d.select(a):j.isDOMElement(a)?e=[a]:a&&"object"==typeof a&&"number"==typeof a.length&&(e=a),e&&e.length)return e;if(c||2===arguments.length)throw new TypeError(b+" must either be a DOM Element, an Array of elements, or a selector expression!\nThe script element must also be after the DOM Element itself.");return[]},options:function(b,c,d,e){"string"!=typeof b&&(e=d,d=c,c=b,b=""),d=d||{};var f={},g=e?a.data(e):{},k,l,m,n,o=function(a){return b&&(a=b+': "'+(""+a).replace(/"/,'\\"')+'"'),a},p=function(a){return'"'+(""+a).replace(/"/,'\\"')+'"'},q=function(a){throw new Error(o(a))},r=function(a){Ink.error(o(a)+". Ignoring option.")};function s(a){return l=c[a][0],m=l.toLowerCase(),n=2===c[a].length?c[a][1]:h,l||q("Ink.UI.Common.options: Always specify a type!"),m in j._coerce_funcs||q("Ink.UI.Common.options: "+c[a][0]+" is not a valid type. Use one of "+i(j._coerce_funcs).join(", ")),(!c[a].length||c[a].length>2)&&q('the "defaults" argument must be an object mapping option names to [typestring, optional] arrays.'),k=a in g?j._coerce_from_string(m,g[a],a,b):h,k!==h?j._options_validate(k,m)?k:(r("("+a+" option) Invalid "+m+" "+p(k)),n):a in d?d[a]:n!==h?n:void q("Option "+a+" is required!")}for(var t in c)c.hasOwnProperty(t)&&(f[t]=s(t));return f},_coerce_from_string:function(a,b,c,d){return a in j._coerce_funcs?j._coerce_funcs[a](b,c,d):b},_options_validate:function(a,b){return b in j._options_validate_types?j._options_validate_types[b].call(j,a):!1},_coerce_funcs:function(){var a={element:function(a){return j.elOrSelector(a,"")},elements:function(a){return j.elsOrSelector(a,"",!1)},object:function(a){return a},number:function(a){return parseFloat(a)},"boolean":function(a){return!("false"===a||""===a||null===a)},string:function(a){return a},"function":function(a,b,c){return Ink.error(c+': You cannot specify the option "'+b+"\" through data-attributes because it's a function"),h}};return a["float"]=a.integer=a.number,a}(),_options_validate_types:function(){var a={string:function(a){return"string"==typeof a},number:function(a){return"number"==typeof a&&!isNaN(a)&&isFinite(a)},integer:function(a){return a===Math.round(a)},element:function(a){return j.isDOMElement(a)},elements:function(a){return a&&"object"==typeof a&&"number"==typeof a.length&&a.length},"boolean":function(a){return"boolean"==typeof a}};return a["float"]=a.number,a}(),clone:function(a){try{return JSON.parse(JSON.stringify(a))}catch(b){throw new Error("Given object cannot have loops!")}},childIndex:function(a){if(j.isDOMElement(a))for(var b=d.select("> *",a.parentNode),c=0,e=b.length;e>c;++c)if(b[c]===a)return c;throw"not found!"},ajaxJSON:function(a,c,d){new b(a,{evalJS:"force",method:"POST",parameters:c,onSuccess:function(a){try{if(a=a.responseJSON,"ok"!==a.status)throw"server error: "+a.message;d(null,a)}catch(b){d(b)}},onFailure:function(){d("communication failure")}})},currentLayout:function(){var a,b,e,f,g,h=d.select("#ink-layout-detector")[0];if(!h){h=document.createElement("div"),h.id="ink-layout-detector";for(e in this.Layouts)this.Layouts.hasOwnProperty(e)&&(f=this.Layouts[e],g=document.createElement("div"),g.className="show-"+f+" hide-all",g.setAttribute("data-ink-layout",f),h.appendChild(g));document.body.appendChild(h)}var i="",j=0;for(a=0,b=h.childNodes.length;b>a;++a)g=h.childNodes[a],"block"===c.getStyle(g,"display")&&(i=g.getAttribute("data-ink-layout"),j+=1);return 1===j?i:"large"},hashSet:function(a){if("object"!=typeof a)throw new TypeError("o should be an object!");var b=e.getAnchorString();b=Ink.extendObj(b,a),window.location.hash=e.genQueryString("",b).substring(1)},cleanChildren:function(a){if(!j.isDOMElement(a))throw"Please provide a valid DOMElement";for(var b,c=a.lastChild;c;)b=c.previousSibling,a.removeChild(c),c=b},storeIdAndClasses:function(a,b){if(!j.isDOMElement(a))throw"Please provide a valid DOMElement as first parameter";var c=a.id;c&&(b._id=c);var d=a.className;d&&(b._classes=d)},restoreIdAndClasses:function(a,b){if(!j.isDOMElement(a))throw"Please provide a valid DOMElement as first parameter";b._id&&a.id!==b._id&&(a.id=b._id),b._classes&&-1===a.className.indexOf(b._classes)&&(a.className?a.className+=" "+b._classes:a.className=b._classes),b._instanceId&&!a.getAttribute("data-instance")&&a.setAttribute("data-instance",b._instanceId)},registerInstance:function(a,b,c){if(!a._instanceId){if("object"!=typeof a)throw new TypeError("1st argument must be a JavaScript object!");if(!a._options||!a._options.skipRegister){if(!this.isDOMElement(b))throw new TypeError("2nd argument must be a DOM element!");if(void 0!==c&&"string"!=typeof c)throw new TypeError("3rd argument must be a string!");var d=(c||"instance")+ ++g;f[d]=a,a._instanceId=d;var e=b.getAttribute("data-instance");e=null!==e?[e,d].join(" "):d,b.setAttribute("data-instance",e)}}},unregisterInstance:function(a){delete f[a]},getInstance:function(a){var b;if(this.isDOMElement(a)){if(b=a.getAttribute("data-instance"),null===b)throw new Error("argument is not a DOM instance element!")}else b=a;b=b.split(" ");var c,d,e,g=b.length,h=[];for(e=0;g>e;++e){if(d=b[e],!d)throw new Error("Element is not a JS instance!");if(c=f[d],!c)throw new Error('Instance "'+d+'" not found!');h.push(c)}return 1===g?h[0]:h},getInstanceFromSelector:function(a){var b=d.select(a)[0];if(!b)throw new Error("Element not found!");return this.getInstance(b)},getInstanceIds:function(){var a=[];for(var b in f)f.hasOwnProperty(b)&&a.push(b);return a},getInstances:function(){var a=[];for(var b in f)f.hasOwnProperty(b)&&a.push(f[b]);return a},destroyComponent:function(){j.unregisterInstance(this._instanceId),this._element.parentNode.removeChild(this._element)}};return j}),Ink.createModule("Ink.UI.DatePicker","1",["Ink.UI.Common_1","Ink.Dom.Event_1","Ink.Dom.Css_1","Ink.Dom.Element_1","Ink.Dom.Selector_1","Ink.Util.Array_1","Ink.Util.Date_1","Ink.Dom.Browser_1"],function(a,b,c,d,e,f,g){"use strict";function h(a,b){for(var c="",d=0;a>d;d++)c+=b;return c}function i(a,b,c){return a>c&&(a=c),b>a&&(a=b),a}function j(a){var b=a.split("-");return k(+b[0],+b[1]-1,+b[2])}function k(a,b,c){return{_year:a,_month:b,_day:c}}function l(a){return{_year:a.getFullYear(),_month:a.getMonth(),_day:a.getDate()}}var m=function(b,c){if(this._element=b&&a.elOrSelector(b,"[Ink.UI.DatePicker_1]: selector argument"),this._options=a.options("Ink.UI.DatePicker_1",{autoOpen:["Boolean",!1],cleanText:["String","Clear"],closeText:["String","Close"],containerElement:["Element",null],cssClass:["String","ink-calendar bottom"],dateRange:["String",null],displayInSelect:["Boolean",!1],dayField:["Element",null],monthField:["Element",null],yearField:["Element",null],format:["String","yyyy-mm-dd"],instance:["String","scdp_"+Math.round(99999*Math.random())],nextLinkText:["String","»"],ofText:["String"," of "],onFocus:["Boolean",!0],onMonthSelected:["Function",null],onSetDate:["Function",null],onYearSelected:["Function",null],position:["String","right"],prevLinkText:["String","«"],showClean:["Boolean",!0],showClose:["Boolean",!0],shy:["Boolean",!0],startDate:["String",null],startWeekDay:["Number",1],validDayFn:["Function",null],validMonthFn:["Function",null],validYearFn:["Function",null],nextValidDateFn:["Function",null],prevValidDateFn:["Function",null],yearRange:["String",null],month:["Object",{1:"January",2:"February",3:"March",4:"April",5:"May",6:"June",7:"July",8:"August",9:"September",10:"October",11:"November",12:"December"}],wDay:["Object",{0:"Sunday",1:"Monday",2:"Tuesday",3:"Wednesday",4:"Thursday",5:"Friday",6:"Saturday"}]},c||{},this._element),this._options.format=this._dateParsers[this._options.format]||this._options.format,this._hoverPicker=!1,this._picker=this._options.pickerField&&a.elOrSelector(this._options.pickerField,"pickerField"),this._setMinMax(this._options.dateRange||this._options.yearRange),this._options.startDate)this.setDate(this._options.startDate);else if(this._element&&this._element.value)this.setDate(this._element.value);else{var d=new Date;this._day=d.getDate(),this._month=d.getMonth(),this._year=d.getFullYear()}if(this._options.displayInSelect&&!(this._options.dayField&&this._options.monthField&&this._options.yearField))throw new Error("Ink.UI.DatePicker: displayInSelect option enabled.Please specify dayField, monthField and yearField selectors.");this._init()};return m.prototype={version:"0.1",_init:function(){Ink.extendObj(this._options,this._lang||{}),this._render(),this._listenToContainerObjectEvents(),a.registerInstance(this,this._containerObject,"datePicker")},_render:function(){this._containerObject=document.createElement("div"),this._containerObject.id=this._options.instance,this._containerObject.className=this._options.cssClass+" ink-datepicker-calendar hide-all",this._renderSuperTopBar();var b=document.createElement("div");b.className="ink-calendar-top",this._monthDescContainer=document.createElement("div"),this._monthDescContainer.className="ink-calendar-month_desc",this._monthPrev=document.createElement("div"),this._monthPrev.className="ink-calendar-prev",this._monthPrev.innerHTML=''+this._options.prevLinkText+"",this._monthNext=document.createElement("div"),this._monthNext.className="ink-calendar-next",this._monthNext.innerHTML=''+this._options.nextLinkText+"",b.appendChild(this._monthPrev),b.appendChild(this._monthDescContainer),b.appendChild(this._monthNext),this._monthContainer=document.createElement("div"),this._monthContainer.className="ink-calendar-month",this._containerObject.appendChild(b),this._containerObject.appendChild(this._monthContainer),this._monthSelector=this._renderMonthSelector(),this._containerObject.appendChild(this._monthSelector),this._yearSelector=document.createElement("ul"),this._yearSelector.className="ink-calendar-year-selector",this._containerObject.appendChild(this._yearSelector),(!this._options.onFocus||this._options.displayInSelect)&&(this._options.pickerField?this._picker=a.elOrSelector(this._options.pickerField,"pickerField"):(this._picker=document.createElement("a"),this._picker.href="#open_cal",this._picker.innerHTML="open",this._element.parentNode.appendChild(this._picker),this._picker.className="ink-datepicker-picker-field")),this._appendDatePickerToDom(),this._renderMonth(),this._monthChanger=document.createElement("a"),this._monthChanger.href="#monthchanger",this._monthChanger.className="ink-calendar-link-month",this._monthChanger.innerHTML=this._options.month[this._month+1],this._ofText=document.createElement("span"),this._ofText.innerHTML=this._options.ofText,this._yearChanger=document.createElement("a"),this._yearChanger.href="#yearchanger",this._yearChanger.className="ink-calendar-link-year",this._yearChanger.innerHTML=this._year,this._monthDescContainer.innerHTML="",this._monthDescContainer.appendChild(this._monthChanger),this._monthDescContainer.appendChild(this._ofText),this._monthDescContainer.appendChild(this._yearChanger),this._options.inline?this.show():this._addOpenCloseEvents(),this._addDateChangeHandlersToInputs() +},_addDateChangeHandlersToInputs:function(){var a=this._element;this._options.displayInSelect&&(a=[this._options.dayField,this._options.monthField,this._options.yearField]),b.observeMulti(a,"change",Ink.bindEvent(function(){this._updateDate(),this._showDefaultView(),this.setDate(),this._inline||this._hoverPicker||this._hide(!0)},this))},show:function(){this._updateDate(),this._renderMonth(),c.removeClassName(this._containerObject,"hide-all")},_addOpenCloseEvents:function(){var a=this._picker||this._element;b.observe(a,"click",Ink.bindEvent(function(a){b.stop(a),this.show()},this)),this._options.autoOpen&&this.show(),this._options.displayInSelect||b.observe(a,"blur",Ink.bindEvent(function(){this._hoverPicker||this._hide(!0)},this)),this._options.shy&&b.observe(document,"click",Ink.bindEvent(function(a){for(var c=b.element(a),e=[this._options.dayField,this._options.monthField,this._options.yearField,this._picker,this._element],f=0,g=e.length;g>f;f++)if(e[f]&&d.descendantOf(e[f],c))return;this._hide(!0)},this))},_renderMonthSelector:function(){var a=document.createElement("ul");a.className="ink-calendar-month-selector";for(var b=document.createElement("ul"),c=1;12>=c;c++)b.appendChild(this._renderMonthButton(c)),c%4===0&&(a.appendChild(b),b=document.createElement("ul"));return a},_renderMonthButton:function(a){var b=document.createElement("li"),c=document.createElement("a");return c.setAttribute("data-cal-month",a),c.innerHTML=this._options.month[a].substring(0,3),b.appendChild(c),b},_appendDatePickerToDom:function(){if(this._options.containerElement){var b=Ink.i(this._options.containerElement)||a.elOrSelector(this._options.containerElement);b.appendChild(this._containerObject)}d.findUpwardsBySelector(this._element,".ink-form .control-group .control")===this._element.parentNode?(this._wrapper=this._element.parentNode,this._wrapperIsControl=!0):(this._wrapper=d.create("div",{className:"ink-datepicker-wrapper"}),d.wrap(this._element,this._wrapper)),d.insertAfter(this._containerObject,this._element)},_renderSuperTopBar:function(){this._options.showClose&&this._options.showClean&&(this._superTopBar=document.createElement("div"),this._superTopBar.className="ink-calendar-top-options",this._options.showClean&&this._superTopBar.appendChild(d.create("a",{className:"clean",setHTML:this._options.cleanText})),this._options.showClose&&this._superTopBar.appendChild(d.create("a",{className:"close",setHTML:this._options.closeText})),this._containerObject.appendChild(this._superTopBar))},_listenToContainerObjectEvents:function(){b.observe(this._containerObject,"mouseover",Ink.bindEvent(function(a){b.stop(a),this._hoverPicker=!0},this)),b.observe(this._containerObject,"mouseout",Ink.bindEvent(function(a){b.stop(a),this._hoverPicker=!1},this)),b.observe(this._containerObject,"click",Ink.bindEvent(this._onClick,this))},_onClick:function(a){var d=b.element(a);return c.hasClassName(d,"ink-calendar-off")?(b.stopDefault(a),null):(b.stop(a),this._onRelativeChangerClick(d),this._onAbsoluteChangerClick(d),c.hasClassName(d,"ink-calendar-link-month")?this._showMonthSelector():c.hasClassName(d,"ink-calendar-link-year")?this._showYearSelector():c.hasClassName(d,"clean")?this._clean():c.hasClassName(d,"close")&&this._hide(!1),void this._updateDescription())},_onRelativeChangerClick:function(a){var b={change_year_next:1,change_year_prev:-1},c={change_month_next:1,change_month_prev:-1};a.className in c?this._updateCal(c[a.className]):a.className in b&&this._showYearSelector(b[a.className])},_onAbsoluteChangerClick:function(a){var b=d.data(a);Number(b.calDay)?(this.setDate([this._year,this._month+1,b.calDay].join("-")),this._hide()):Number(b.calMonth)?(this._month=Number(b.calMonth)-1,this._showDefaultView(),this._updateCal()):Number(b.calYear)&&this._changeYear(Number(b.calYear))},_changeYear:function(a){a=+a,a&&(this._year=a,"function"==typeof this._options.onYearSelected&&this._options.onYearSelected(this,{year:this._year}),this._showMonthSelector())},_clean:function(){this._options.displayInSelect?(this._options.yearField.selectedIndex=0,this._options.monthField.selectedIndex=0,this._options.dayField.selectedIndex=0):this._element.value=""},_hide:function(a){a=void 0===a?!0:a,(a===!1||a&&this._options.shy)&&c.addClassName(this._containerObject,"hide-all")},_setMinMax:function(a){var b=this,c={_year:-Number.MAX_VALUE,_month:0,_day:1},d={_year:Number.MAX_VALUE,_month:11,_day:31};function e(){b._min=c,b._max=d}if(!a)return e();var g=a.split(":"),h=/^(\d{4})((\-)(\d{1,2})((\-)(\d{1,2}))?)?$/;f.each([{name:"_min",date:g[0],noLim:c},{name:"_max",date:g[1],noLim:d}],Ink.bind(function(a){var b=a.noLim;if("NOW"===a.date.toUpperCase()){var c=new Date;b=l(c)}else"EVER"===a.date.toUpperCase()?b=a.noLim:h.test(a.date)&&(b=j(a.date),b._month=i(b._month,0,11),b._day=i(b._day,1,this._daysInMonth(b._year,b._month)));this[a.name]=b},this));var k=-1!==this._dateCmp(this._max,this._min);k||e()},_fitDateToRange:function(a){return this._isValidDate(a)||(a=l(new Date)),-1===this._dateCmp(a,this._min)?Ink.extendObj({},this._min):1===this._dateCmp(a,this._max)?Ink.extendObj({},this._max):Ink.extendObj({},a)},_dateWithinRange:function(a){return arguments.length||(a=this),!this._dateAboveMax(a)&&!this._dateBelowMin(a)},_dateAboveMax:function(a){return 1===this._dateCmp(a,this._max)},_dateBelowMin:function(a){return-1===this._dateCmp(a,this._min)},_dateCmp:function(a,b){return this._dateCmpUntil(a,b,"_day")},_dateCmpUntil:function(a,b,c){var d=["_year","_month","_day"],e=-1;do{if(e++,a[d[e]]>b[d[e]])return 1;if(a[d[e]]",this._yearSelector.innerHTML=d,this._monthPrev.childNodes[0].className="action_inactive",this._monthNext.childNodes[0].className="action_inactive",this._monthSelector.style.display="none",this._monthContainer.style.display="none",this._yearSelector.style.display="block"},_incrementViewingYear:function(a){if(a){var b=+this._year+10*a;b-=b%10,b>this._max._year||b+9"+a+""}return'
    • '+a+"
    • "},_showMonthSelector:function(){this._yearSelector.style.display="none",this._monthContainer.style.display="none",this._monthPrev.childNodes[0].className="action_inactive",this._monthNext.childNodes[0].className="action_inactive",this._addMonthClassNames(),this._monthSelector.style.display="block"},_parseDate:function(a){var b=g.set(this._options.format,a);return b?l(b):null},_isValidDate:function(a){var b=/^\d{4}$/,c=/^\d{1,2}$/;return b.test(a._year)&&c.test(a._month)&&c.test(a._day)&&+a._month+1>=1&&+a._month+1<=12&&+a._day>=1&&+a._day<=this._daysInMonth(a._year,a._month+1)},_isDate:function(a,b){try{if("undefined"==typeof a)return!1;var c=g.set(a,b);if(c&&this._isValidDate(l(c)))return!0}catch(d){}return!1},_acceptableDay:function(a){return this._acceptableDateComponent(a,"validDayFn")},_acceptableMonth:function(a){return this._acceptableDateComponent(a,"validMonthFn")},_acceptableYear:function(a){return this._acceptableDateComponent(a,"validYearFn")},_acceptableDateComponent:function(a,b){return this._options[b]?this._callUserCallbackBool(this._options[b],a):this._dateWithinRange(a)},_writeDateInFormat:function(){return g.get(this._options.format,this.getDate())},setDate:function(a){if(/\d{4}-\d{1,2}-\d{1,2}/.test(a)){var b=a.split("-");this._year=+b[0],this._month=+b[1]-1,this._day=+b[2]}this._setDate()},getDate:function(){if(!this._day)throw"Ink.UI.DatePicker: Still picking a date. Cannot getDate now!";return new Date(this._year,this._month,this._day)},_setDate:function(a){if(a){var b=d.data(a);this._day=+b.calDay||this._day}var c=this._fitDateToRange(this);this._year=c._year,this._month=c._month,this._day=c._day,this._options.displayInSelect?(this._options.dayField.value=this._day,this._options.monthField.value=this._month+1,this._options.yearField.value=this._year):this._element.value=this._writeDateInFormat(),this._options.onSetDate&&this._options.onSetDate(this,{date:this.getDate()})},_updateCal:function(a){"function"==typeof this._options.onMonthSelected&&this._options.onMonthSelected(this,{year:this._year,month:this._month}),a&&null===this._updateMonth(a)||this._renderMonth()},_daysInMonth:function(a,b){var c={2:a%400===0||a%4===0&&a%100!==0?29:28,4:30,6:30,9:30,11:30};return c[b]||31},_updateMonth:function(a){var b;return a>0?b=this._getNextMonth():0>a&&(b=this._getPrevMonth()),b?(this._year=b._year,this._month=b._month,void(this._day=b._day)):null},_getNextMonth:function(a){return this._tryLeap(a,"Month","next",function(a){return a._month+=1,a._month>11&&(a._month=0,a._year+=1),a})},_getPrevMonth:function(a){return this._tryLeap(a,"Month","prev",function(a){return a._month-=1,a._month<0&&(a._month=11,a._year-=1),a})},_getPrevYear:function(a){return this._tryLeap(a,"Year","prev",function(a){return a._year-=1,a})},_getNextYear:function(a){return this._tryLeap(a,"Year","next",function(a){return a._year+=1,a})},_tryLeap:function(a,b,c,d){a=a||{_year:this._year,_month:this._month,_day:this._day};var e="prev"===c?"_min":"_max",f=this[e];if(0===this._dateCmpUntil(a,f,b))return null;var g=this._options[c+"ValidDateFn"];return g?this._callUserCallbackDate(g,a):(a=d(a),a=this._fitDateToRange(a),this["_acceptable"+b](a)?a:null)},_getNextDecade:function(a){a=a||{_year:this._year,_month:this._month,_day:this._day};var b=this._getCurrentDecade(a);return b+10>this._max._year?null:b+10},_getPrevDecade:function(a){a=a||{_year:this._year,_month:this._month,_day:this._day};var b=this._getCurrentDecade(a);return b-10c?c=7+d-c:c+=d;var e="";e+=this._getMonthCalendarHeaderHtml(d);var f=0;e+="
        ";var g='
      •  
      • ';if(0!==c){var i=c-d-1;f+=i,e+=h(i,g)}e+=this._getDayButtonsHtml(f,b,a),e+="
      ",this._monthContainer.innerHTML=e},_getDayButtonsHtml:function(a,b,c){for(var d=this._daysInMonth(b,c),e="",f=1;d>=f;f++)7===a&&(a=0,e+="
        "),e+=this._getDayButtonHtml(b,c,f),a++,7===a&&(e+="
      ");return e},_getDayButtonHtml:function(a,b,c){var d=" ",e=k(a,b,c);return d+=this._acceptableDay(e)?'data-cal-day="'+c+'"':'class="ink-calendar-off"',this._day&&0===this._dateCmp(e,this)&&(d+='class="ink-calendar-on" data-cal-day="'+c+'"'),'
    • "+c+"
    • "},_getMonthCalendarHeaderHtml:function(a){for(var b='
        ',c,d=0;7>d;d++)c=(a+d)%7,b+="
      • "+this._options.wDay[c].substring(0,1)+"
      • ";return b+"
      "},_addMonthClassNames:function(a){f.forEach((a||this._monthSelector).getElementsByTagName("a"),Ink.bindMethod(this,"_addMonthButtonClassNames"))},_addMonthButtonClassNames:function(a){var b=d.data(a);if(!b.calMonth)throw"not a calendar month button!";var e=+b.calMonth-1;if(e===this._month)c.addClassName(a,"ink-calendar-on"),c.removeClassName(a,"ink-calendar-off");else{c.removeClassName(a,"ink-calendar-on");var f=!this._acceptableMonth({_year:this._year,_month:e});c.addRemoveClassName(a,"ink-calendar-off",f)}},lang:function(a){this._lang=a},showMonth:function(){this._renderMonth()},isMonthRendered:function(){var a=e.select(".ink-calendar-header",this._containerObject)[0];return"none"!==c.getStyle(a.parentNode,"display")&&"none"!==c.getStyle(a.parentNode.parentNode,"display")},destroy:function(){d.unwrap(this._element),d.remove(this._wrapper),d.remove(this._containerObject),a.unregisterInstance.call(this)}},m}),Ink.createModule("Ink.UI.Draggable","1",["Ink.Dom.Element_1","Ink.Dom.Event_1","Ink.Dom.Css_1","Ink.Dom.Browser_1","Ink.Dom.Selector_1","Ink.UI.Common_1"],function(a,b,c,d,e,f){"use strict";var g=0,h=1;function i(a,b,c){return a=Math.min(a,c),a=Math.max(a,b)}var j=function(a,b){this.init(a,b)};return j.prototype={init:function(c,e){var g=Ink.extendObj({constraint:!1,constraintElm:!1,top:!1,right:!1,bottom:!1,left:!1,handle:e.handler||!1,revert:!1,cursor:"move",zindex:e.zindex||9999,dragClass:"drag",onStart:!1,onEnd:!1,onDrag:!1,onChange:!1,droppableProxy:!1,mouseAnchor:void 0,skipChildren:!0,fps:100,debug:!1},e||{},a.data(c));this.options=g,this.element=f.elOrSelector(c),this.constraintElm=g.constraintElm&&f.elOrSelector(g.constraintElm),this.handle=!1,this.elmStartPosition=!1,this.active=!1,this.dragged=!1,this.prevCoords=!1,this.placeholder=!1,this.position=!1,this.zindex=!1,this.firstDrag=!0,g.fps&&(this.deltaMs=1e3/g.fps,this.lastRunAt=0),this.handlers={},this.handlers.start=Ink.bindEvent(this._onStart,this),this.handlers.dragFacade=Ink.bindEvent(this._onDragFacade,this),this.handlers.drag=Ink.bindEvent(this._onDrag,this),this.handlers.end=Ink.bindEvent(this._onEnd,this),this.handlers.selectStart=function(a){return b.stop(a),!1},this.handle=this.options.handle?f.elOrSelector(this.options.handle):this.element,this.handle.style.cursor=g.cursor,b.observe(this.handle,"touchstart",this.handlers.start),b.observe(this.handle,"mousedown",this.handlers.start),d.IE&&b.observe(this.element,"selectstart",this.handlers.selectStart)},destroy:function(){b.stopObserving(this.handle,"touchstart",this.handlers.start),b.stopObserving(this.handle,"mousedown",this.handlers.start),d.IE&&b.stopObserving(this.element,"selectstart",this.handlers.selectStart)},_getCoords:function(b){var c=[a.scrollWidth(),a.scrollHeight()];return{x:(b.touches?b.touches[0].clientX:b.clientX)+c[g],y:(b.touches?b.touches[0].clientY:b.clientY)+c[h]}},_cloneStyle:function(b,d){d.className=b.className,d.style.borderWidth="0",d.style.padding="0",d.style.position="absolute",d.style.width=a.elementWidth(b)+"px",d.style.height=a.elementHeight(b)+"px",d.style.left=a.elementLeft(b)+"px",d.style.top=a.elementTop(b)+"px",d.style.cssFloat=c.getStyle(b,"float"),d.style.display=c.getStyle(b,"display")},_onStart:function(d){if(!this.active&&b.isLeftClick(d)||"undefined"==typeof d.button){var e=b.element(d);if(this.options.skipChildren&&e!==this.handle)return;b.stop(d),c.addClassName(this.element,this.options.dragClass),this.elmStartPosition=[a.elementLeft(this.element),a.elementTop(this.element)];var f=[parseInt(c.getStyle(this.element,"left"),10),parseInt(c.getStyle(this.element,"top"),10)],i=a.elementDimensions(this.element);this.originalPosition=[f[g]?f[g]:null,f[h]?f[h]:null],this.delta=this._getCoords(d),this.active=!0,this.position=c.getStyle(this.element,"position"),this.zindex=c.getStyle(this.element,"zIndex");var j=document.createElement("div");if(j.style.position=this.position,j.style.width=i[g]+"px",j.style.height=i[h]+"px",j.style.marginTop=c.getStyle(this.element,"margin-top"),j.style.marginBottom=c.getStyle(this.element,"margin-bottom"),j.style.marginLeft=c.getStyle(this.element,"margin-left"),j.style.marginRight=c.getStyle(this.element,"margin-right"),j.style.borderWidth="0",j.style.padding="0",j.style.cssFloat=c.getStyle(this.element,"float"),j.style.display=c.getStyle(this.element,"display"),j.style.visibility="hidden",this.delta2=[this.delta.x-this.elmStartPosition[g],this.delta.y-this.elmStartPosition[h]],this.options.mouseAnchor){var k=this.options.mouseAnchor.split(" "),l=[i[g],i[h]];"left"===k[0]?l[g]=0:"center"===k[0]&&(l[g]=parseInt(l[g]/2,10)),"top"===k[1]?l[h]=0:"center"===k[1]&&(l[h]=parseInt(l[h]/2,10)),this.applyDelta=[this.delta2[g]-l[g],this.delta2[h]-l[h]]}var m=this.options.fps?"dragFacade":"drag";if(this.placeholder=j,this.options.onStart&&this.options.onStart(this.element,d),this.options.droppableProxy){this.proxy=document.createElement("div"),i=[window.innerWidth||document.documentElement.clientWidth||document.body.clientWidth,window.innerHeight||document.documentElement.clientHeight||document.body.clientHeight];var n=this.proxy.style;n.width=i[g]+"px",n.height=i[h]+"px",n.position="fixed",n.left="0",n.top="0",n.zIndex=this.options.zindex+1,n.backgroundColor="#FF0000",c.setOpacity(this.proxy,0);for(var o=document.body.firstChild;o&&1!==o.nodeType;)o=o.nextSibling;document.body.insertBefore(this.proxy,o),b.observe(this.proxy,"mousemove",this.handlers[m]),b.observe(this.proxy,"touchmove",this.handlers[m])}else b.observe(document,"mousemove",this.handlers[m]);return this.element.style.position="absolute",this.element.style.zIndex=this.options.zindex,this.element.parentNode.insertBefore(this.placeholder,this.element),this._onDrag(d),b.observe(document,"mouseup",this.handlers.end),b.observe(document,"touchend",this.handlers.end),!1}},_onDragFacade:function(a){var b=+new Date;(!this.lastRunAt||b>this.lastRunAt+this.deltaMs)&&(this.lastRunAt=b,this._onDrag(a))},_onDrag:function(c){if(this.active){b.stop(c),this.dragged=!0;var d=this._getCoords(c),e=d.x,f=d.y,j=this.options,k=!1,l=!1;if(this.prevCoords&&e!==this.prevCoords.x||f!==this.prevCoords.y){j.onDrag&&j.onDrag(this.element,c),this.prevCoords=d,k=this.elmStartPosition[g]+e-this.delta.x,l=this.elmStartPosition[h]+f-this.delta.y;var m=a.elementDimensions(this.element);if(this.constraintElm){var n=a.offset(this.constraintElm),o=a.elementDimensions(this.constraintElm),p=n[h]+(j.top||0),q=n[h]+o[h]-(j.bottom||0),r=n[g]+(j.left||0),s=n[g]+o[g]-(j.right||0);l=i(l,p,q-m[h]),k=i(k,r,s-m[g])}else if(j.constraint){var t=j.right===!1?a.pageWidth()-m[g]:j.right,u=j.left===!1?0:j.left,v=j.top===!1?0:j.top,w=j.bottom===!1?a.pageHeight()-m[h]:j.bottom;("horizontal"===j.constraint||"both"===j.constraint)&&(k=i(k,u,t)),("vertical"===j.constraint||"both"===j.constraint)&&(l=i(l,v,w))}var x=Ink.getModule("Ink.UI.Droppable_1");if(this.firstDrag&&(x&&x.updateAll(),this.firstDrag=!1),k&&(this.element.style.left=k+"px"),l&&(this.element.style.top=l+"px"),x){var y=this.options.mouseAnchor?{x:e-this.applyDelta[g],y:f-this.applyDelta[h]}:d;x.action(y,"drag",c,this.element)}j.onChange&&j.onChange(this)}}},_onEnd:function(d){if(b.stopObserving(document,"mousemove",this.handlers.drag),b.stopObserving(document,"touchmove",this.handlers.drag),this.options.fps&&this._onDrag(d),c.removeClassName(this.element,this.options.dragClass),this.active&&this.dragged){this.options.droppableProxy&&document.body.removeChild(this.proxy),this.pt&&(a.remove(this.pt),this.pt=void 0),this.placeholder&&a.remove(this.placeholder),this.options.revert&&(this.element.style.position=this.position,this.element.style.zIndex=null!==this.zindex?this.zindex:"auto",this.element.style.left=this.originalPosition[g]?this.originalPosition[g]+"px":"",this.element.style.top=this.originalPosition[h]?this.originalPosition[h]+"px":""),this.options.onEnd&&this.options.onEnd(this.element,d);var e=Ink.getModule("Ink.UI.Droppable_1");e&&e.action(this._getCoords(d),"drop",d,this.element),this.position=!1,this.zindex=!1,this.firstDrag=!0}this.active=!1,this.dragged=!1}},j}),Ink.createModule("Ink.UI.Dropdown","1",["Ink.UI.Common_1","Ink.UI.Toggle_1","Ink.Dom.Event_1","Ink.Dom.Element_1"],function(a,b,c,d){"use strict";function e(a,b){this._init(a,b)}return e.prototype={_init:function(d,e){this._element=a.elOrSelector(d),this._options=a.options("Ink.UI.Dropdown_1",{target:["Element"],hoverOpen:["Number",null],dismissOnInsideClick:["Boolean",!1],dismissOnOutsideClick:["Boolean",!0],dismissAfter:["Number",null],onInsideClick:["Function",null],onOutsideClick:["Function",null],onOpen:["Function",null],onDismiss:["Function",null]},e||{},this._element),this._toggle=new b(this._element,{target:this._options.target,closeOnInsideClick:null,closeOnClick:!1,onChangeState:Ink.bind(function(a){return this._openOrDismiss(a,!0,!0)},this)}),c.observeMulti([this._options.target,this._element],"mouseout",Ink.bindMethod(this,"_onMouseOut")),c.observeMulti([this._options.target,this._element],"mouseover",Ink.bindMethod(this,"_onMouseOver")),c.observe(this._options.target,"click",Ink.bindMethod(this,"_onInsideClick")),c.observe(document,"click",Ink.bindMethod(this,"_onOutsideClick"))},_onMouseOver:function(){"number"==typeof this._options.hoverOpen&&this._toggle.getState()===!1&&(clearTimeout(this._openTimeout),this._openTimeout=setTimeout(Ink.bindMethod(this,"open",!0),1e3*this._options.hoverOpen)),"number"==typeof this._options.dismissAfter&&clearTimeout(this._dismissTimeout)},_onMouseOut:function(){"number"==typeof this._options.dismissAfter&&this._toggle.getState()===!0&&(clearTimeout(this._dismissTimeout),this._dismissTimeout=setTimeout(Ink.bindMethod(this,"dismiss",!0),1e3*this._options.dismissAfter)),"number"==typeof this._options.hoverOpen&&clearTimeout(this._openTimeout)},_onInsideClick:function(a){var b=this._handlerCall("onInsideClick",c.element(a));return b===!1?!1:(this._options.dismissOnInsideClick&&this.dismiss(!0),void c.stop(a))},_onOutsideClick:function(a){var b=c.element(a),e=d.findUpwardsHaving(b,Ink.bind(function(a){return a===this._element},this)),f=d.findUpwardsHaving(b,Ink.bind(function(a){return a===this._options.target},this));if(!e&&!f){var g=this._handlerCall("onOutsideClick",b);if(g===!1)return!1;this._options.dismissOnOutsideClick&&this.dismiss(!0),c.stop(a)}},dismiss:function(a,b){this._openOrDismiss(!1,a,b)},open:function(a,b){this._openOrDismiss(!0,a,b)},_openOrDismiss:function(a,b,c){if(!this._toggle||this._toggle.getState()!==a){if(b&&this._handlerCall(a?"onOpen":"onDismiss")===!1)return!1;c||this._toggle.setState(a),clearTimeout(this._dismissTimeout),clearTimeout(this._openTimeout)}},_handlerCall:function(a){return this._options[a]?this._options[a].call(this,[].slice.call(arguments,1)):void 0}},e}),Ink.createModule("Ink.UI.Droppable","1",["Ink.Dom.Element_1","Ink.Dom.Event_1","Ink.Dom.Css_1","Ink.UI.Common_1","Ink.Util.Array_1","Ink.Dom.Selector_1"],function(a,b,c,d,e,f){"use strict";var g=function(a){return function(b){return c.addClassName(a,b)}},h=function(a){return function(b){return c.removeClassName(a,b)}},i={debug:!1,_droppables:[],_draggables:[],add:function(b,c){b=d.elOrSelector(b,"Droppable.add target element");var e=Ink.extendObj({hoverClass:c.hoverclass||!1,accept:!1,onHover:!1,onDrop:!1,onDropOut:!1},c||{},a.data(b));"string"==typeof e.hoverClass&&(e.hoverClass=e.hoverClass.split(/\s+/));function f(a){a.style.position="inherit"}var g=this,h={move:function(a,b){f(a),b.appendChild(a)},copy:function(a,b){f(a),b.appendChild(a.cloneNode)},revert:function(a){g._findDraggable(a).originalParent.appendChild(a),f(a)}},i;if("string"==typeof e.onHover&&(i=e.onHover,e.onHover=h[i],void 0===e.onHover))throw new Error("Unknown hover event handler: "+i);if("string"==typeof e.onDrop&&(i=e.onDrop,e.onDrop=h[i],void 0===e.onDrop))throw new Error("Unknown drop event handler: "+i);if("string"==typeof e.onDropOut&&(i=e.onDropOut,e.onDropOut=h[i],void 0===e.onDropOut))throw new Error("Unknown dropOut event handler: "+i);var j={element:b,data:{},options:e};this._droppables.push(j),this._update(j)},_findData:function(a){for(var b=this._droppables,c=0,d=b.length;d>c;c++)if(b[c].element===a)return b[c]},_findDraggable:function(a){for(var b=this._draggables,c=0,d=b.length;d>c;c++)if(b[c].element===a)return b[c]},updateAll:function(){e.each(this._droppables,i._update)},update:function(a){this._update(this._findData(a))},_update:function(b){var c=b.data,d=b.element;c.left=a.offsetLeft(d),c.top=a.offsetTop(d),c.right=c.left+a.elementWidth(d),c.bottom=c.top+a.elementHeight(d)},remove:function(a){a=d.elOrSelector(a);for(var b=this._droppables.length,c=0;b>c;c++)if(this._droppables[c].element===a){this._droppables.splice(c,1);break}return b!==this._droppables.length},action:function(a,b,c,d){e.each(this._droppables,Ink.bind(function(i){var j=i.data,k=i.options,l=i.element;(!k.accept||f.matches(k.accept,[d]).length)&&("drag"!==b||this._findDraggable(d)||this._draggables.push({element:d,originalParent:d.parentNode}),a.x>=j.left&&a.x<=j.right&&a.y>=j.top&&a.y<=j.bottom?"drag"===b?(k.hoverClass&&e.each(k.hoverClass,g(l)),k.onHover&&k.onHover(d,l)):"drop"===b&&(k.hoverClass&&e.each(k.hoverClass,h(l)),k.onDrop&&k.onDrop(d,l,c)):"drag"===b&&k.hoverClass?e.each(k.hoverClass,h(l)):"drop"===b&&k.onDropOut&&k.onDropOut(d,l,c))},this))}};return i}),Ink.createModule("Ink.UI.FormValidator","1",["Ink.Dom.Element_1","Ink.Dom.Css_1","Ink.Util.Validator_1","Ink.Dom.Selector_1"],function(a,b,c,d){"use strict";function e(a){if(!a.name)return[];if(!a.form)return d.select('name="'+a.name+'"');var b=a.form[a.name];return"undefined"==typeof b.length&&(b=[b]),b}var f={version:"1",_flagMap:{"ink-fv-required":{msg:"Required field"},"ink-fv-email":{msg:"Invalid e-mail address"},"ink-fv-url":{msg:"Invalid URL"},"ink-fv-number":{msg:"Invalid number"},"ink-fv-phone_pt":{msg:"Invalid phone number"},"ink-fv-phone_cv":{msg:"Invalid phone number"},"ink-fv-phone_mz":{msg:"Invalid phone number"},"ink-fv-phone_ao":{msg:"Invalid phone number"},"ink-fv-date":{msg:"Invalid date"},"ink-fv-confirm":{msg:"Confirmation does not match"},"ink-fv-custom":{msg:""}},elements:{},confirmElms:{},hasConfirm:{},_errorClassName:"tip error",_errorValidationClassName:"validaton",_errorTypeWarningClassName:"warning",_errorTypeErrorClassName:"error",validate:function(a,b){if(this._free(),b=Ink.extendObj({onSuccess:!1,onError:!1,customFlag:!1,confirmGroup:[]},b||{}),"string"==typeof a&&(a=document.getElementById(a)),null===a)return!1;this.element=a,("undefined"==typeof this.element.id||null===this.element.id||""===this.element.id)&&(this.element.id="ink-fv_randomid_"+Math.round(99999*Math.random())),this.custom=b.customFlag,this.confirmGroup=b.confirmGroup;var c=this._validateElements();return c.length>0?(b.onError?b.onError(c):this._showError(a,c),!1):(b.onError||this._clearError(a),this._clearCache(),b.onSuccess&&b.onSuccess(),!0)},reset:function(){this._clearError(),this._clearCache()},_free:function(){this.element=null,this.custom=!1,this.confirmGroup=!1},_clearCache:function(){this.element=null,this.elements=[],this.custom=!1,this.confirmGroup=!1},_getElements:function(){var a=this.elements[this.element.id]=[];this.confirmElms[this.element.id]=[];for(var c=d.select(":input",this.element),e=!1,f=0,g=c.length;g>f;f++){e=c[f];var h=(e.getAttribute("type")+"").toLowerCase();if("radio"===h||"checkbox"===h){if(0===a.length||e.getAttribute("type")!==a[a.length-1].getAttribute("type")&&e.getAttribute("name")!==a[a.length-1].getAttribute("name"))for(var i in this._flagMap)if(b.hasClassName(e,i)){a.push(e);break}}else{for(var j in this._flagMap)if(b.hasClassName(e,j)&&"ink-fv-confirm"!==j){a.push(e);break}b.hasClassName(e,"ink-fv-confirm")&&(this.confirmElms[this.element.id].push(e),this.hasConfirm[this.element.id]=!0)}}},_validateElements:function(){var a;this._getElements(),this.hasConfirm[this.element.id]===!0&&(a=this._makeConfirmGroups());for(var c=[],d=!1,e=!1,f,g=0,h=this.elements[this.element.id].length;h>g;g++)if(f=!1,d=this.elements[this.element.id][g],!d.disabled)for(var i in this._flagMap)if(b.hasClassName(d,i))if("ink-fv-custom"!==i&&"ink-fv-confirm"!==i)this._isValid(d,i)||(f?c[c.length-1].errors.push(i):(c.push({elm:d,errors:[i]}),f=!0));else if("ink-fv-confirm"!==i)e=this._isCustomValid(d),e.length>0&&c.push({elm:d,errors:[i],custom:e});else if("ink-fv-confirm"===i)continue;return c=this._validateConfirmGroups(a,c)},_validateConfirmGroups:function(a,b){var c=!1;for(var d in a)a.hasOwnProperty(d)&&(c=a[d],2===c.length&&c[0].value!==c[1].value&&b.push({elm:c[1],errors:["ink-fv-confirm"]}));return b},_makeConfirmGroups:function(){var a;if(this.confirmGroup&&this.confirmGroup.length>0){a={};for(var c=!1,d=!1,e=0,f=this.confirmElms[this.element.id].length;f>e;e++){c=this.confirmElms[this.element.id][e];for(var g=0,h=this.confirmGroup.length;h>g;g++)d=this.confirmGroup[g],b.hasClassName(c,d)&&("undefined"==typeof a[d]?a[d]=[c]:a[d].push(c))}return a}return 2===this.confirmElms[this.element.id].length&&(a={"ink-fv-confirm":[this.confirmElms[this.element.id][0],this.confirmElms[this.element.id][1]]}),a;return!1},_isCustomValid:function(a){for(var c=[],d=!1,e=0,f=this.custom.length;f>e;e++)d=this.custom[e],b.hasClassName(a,d.flag)&&(d.callback(a,d.msg)||c.push({flag:d.flag,msg:d.msg}));return c},_isValid:function(a,d){var f=a.nodeName.toLowerCase(),g=(a.getAttribute("type")||"").toLowerCase(),h=this._trim(a.value);if("ink-fv-required"!==d&&"checkbox"!==g&&"radio"!==g&&""===h)return!b.hasClassName(a,"ink-fv-required");switch(d){case"ink-fv-required":if("select"===f)return a.selectedIndex>0?!0:!1;if("checkbox"!==g&&"radio"!==g&&""!==h)return!0;if("checkbox"===g||"radio"===g){for(var i=e(a),j=!1,k=0,l=i.length;l>k;k++)if(i[k].checked===!0){j=!0;break}return j}return!1;case"ink-fv-email":return c.mail(a.value);case"ink-fv-url":return c.url(a.value);case"ink-fv-number":return!isNaN(Number(a.value))&&isFinite(Number(a.value));case"ink-fv-phone_pt":return c.isPTPhone(a.value);case"ink-fv-phone_cv":return c.isCVPhone(a.value);case"ink-fv-phone_ao":return c.isAOPhone(a.value);case"ink-fv-phone_mz":return c.isMZPhone(a.value);case"ink-fv-date":var m=Ink.getModule("Ink.Dom.Element",1),n=m.data(a),o="yyyy-mm-dd";if(b.hasClassName(a,"ink-datepicker")&&"format"in n?o=n.format:"validFormat"in n&&(o=n.validFormat),!(o in c._dateParsers)){var p=[];for(var q in c._dateParsers)c._dateParsers.hasOwnProperty(q)&&p.push(q);throw new Error("The attribute data-valid-format must be one of the following values: "+p.join(", "))}return c.isDate(o,a.value);case"ink-fv-custom":}return!1},_showError:function(a,b){this._clearError(a);for(var c=!1,d=0,e=b.length;e>d;d++)c=b[d].elm,c&&this._showAnErrorOnElement(c,b[d])},_showAnErrorOnElement:function(c,d){var e=a.findUpwardsByClass(c,"control-group"),f=a.findUpwardsByClass(c,"control"),g=[this._errorClassName,this._errorTypeClassName].join(" "),h=a.create("p",{className:g});h.innerHTML="ink-fv-custom"!==d.errors[0]?this._flagMap[d.errors[0]].msg:d.custom[0].msg; +var i=f||e;i?i.appendChild(h):a.insertAfter(h,c),f&&("ink-fv-required"===d.errors[0]?b.addClassName(e,"validation error"):b.addClassName(e,"validation warning"))},_clearError:function(c){for(var d=c.getElementsByTagName("p"),e,f,g=d.length-1;g>=0;g--)e=d[g],b.hasClassName(e,this._errorClassName)&&(f=a.findUpwardsBySelector(e,".control-group"),f&&b.removeClassName(f,["validation","error","warning"]),b.hasClassName(e,this._errorClassName,!0)&&a.remove(e));var h=c.getElementsByTagName("ul");for(g=h.length-1;g>=0;g--)e=h[g],b.hasClassName(e,"control-group")&&b.removeClassName(e,"validation error")},_trim:function(a){return"string"==typeof a?a.replace(/^\s+|\s+$|\n+$/g,""):void 0}};return f}),Ink.createModule("Ink.UI.FormValidator","2",["Ink.UI.Common_1","Ink.Dom.Element_1","Ink.Dom.Event_1","Ink.Dom.Selector_1","Ink.Dom.Css_1","Ink.Util.Array_1","Ink.Util.I18n_1","Ink.Util.Validator_1"],function(a,b,c,d,e,f,g,h){"use strict";var i={required:function(a){return"undefined"!=typeof a&&!/^\s*$/.test(a)},min_length:function(a,b){return"string"==typeof a&&a.length>=parseInt(b,10)},max_length:function(a,b){return"string"==typeof a&&a.length<=parseInt(b,10)},exact_length:function(a,b){return"string"==typeof a&&a.length===parseInt(b,10)},email:function(a){return"string"==typeof a&&h.mail(a)},url:function(a,b){return b=b||!1,"string"==typeof a&&h.url(a,b)},ip:function(a,b){return"string"!=typeof a?!1:h.isIP(a,b)},phone:function(a,b){if("string"!=typeof a)return!1;var c=b?b.toUpperCase():"";return h["is"+c+"Phone"](a)},credit_card:function(a,b){return"string"!=typeof a?!1:h.isCreditCard(a,b||"default")},date:function(a,b){return"string"==typeof a&&h.isDate(b,a)},alpha:function(a,b){return h.ascii(a,{singleLineWhitespace:b})},text:function(a,b,c){return h.unicode(a,{singleLineWhitespace:b,unicodePunctuation:c})},latin:function(a,b,c){return"string"!=typeof a?!1:h.latin1(a,{latin1Punctuation:b,singleLineWhitespace:c})},alpha_numeric:function(a){return h.ascii(a,{numbers:!0})},alpha_dash:function(a){return h.ascii(a,{dash:!0,underscore:!0})},digit:function(a){return"string"==typeof a&&/^[0-9]{1}$/.test(a)},integer:function(a,b){return h.number(a,{negative:!b,decimalPlaces:0})},decimal:function(a,b,c,d){return h.number(a,{decimalSep:b||".",decimalPlaces:+c||null,maxDigits:+d})},numeric:function(a,b,c,d){return b=b||".",-1!==a.indexOf(b)?i.decimal(a,b,c,d):i.integer(a)},range:function(a,b,c,d){return a=+a,b=+b,c=+c,isNaN(a)||isNaN(b)||isNaN(c)?!1:b>a||a>c?!1:d?(a-b)%d===0:!0},color:function(a){return h.isColor(a)},matches:function(a,b){return a===this.getFormElements()[b][0].getValue()}},j=new g({en_US:{"formvalidator.required":"The {field} filling is mandatory","formvalidator.min_length":"The {field} must have a minimum size of {param1} characters","formvalidator.max_length":"The {field} must have a maximum size of {param1} characters","formvalidator.exact_length":"The {field} must have an exact size of {param1} characters","formvalidator.email":"The {field} must have a valid e-mail address","formvalidator.url":"The {field} must have a valid URL","formvalidator.ip":"The {field} does not contain a valid {param1} IP address","formvalidator.phone":"The {field} does not contain a valid {param1} phone number","formvalidator.credit_card":"The {field} does not contain a valid {param1} credit card","formvalidator.date":"The {field} should contain a date in the {param1} format","formvalidator.alpha":"The {field} should only contain letters","formvalidator.text":"The {field} should only contain alphabetic characters","formvalidator.latin":"The {field} should only contain alphabetic characters","formvalidator.alpha_numeric":"The {field} should only contain letters or numbers","formvalidator.alpha_dashes":"The {field} should only contain letters or dashes","formvalidator.digit":"The {field} should only contain a digit","formvalidator.integer":"The {field} should only contain an integer","formvalidator.decimal":"The {field} should contain a valid decimal number","formvalidator.numeric":"The {field} should contain a number","formvalidator.range":"The {field} should contain a number between {param1} and {param2}","formvalidator.color":"The {field} should contain a valid color","formvalidator.matches":"The {field} should match the field {param1}","formvalidator.validation_function_not_found":"The rule {rule} has not been defined"},pt_PT:{"formvalidator.required":"Preencher {field} é obrigatório","formvalidator.min_length":"{field} deve ter no mínimo {param1} caracteres","formvalidator.max_length":"{field} tem um tamanho máximo de {param1} caracteres","formvalidator.exact_length":"{field} devia ter exactamente {param1} caracteres","formvalidator.email":"{field} deve ser um e-mail válido","formvalidator.url":"O {field} deve ser um URL válido","formvalidator.ip":"{field} não tem um endereço IP {param1} válido","formvalidator.phone":"{field} deve ser preenchido com um número de telefone {param1} válido.","formvalidator.credit_card":"{field} não tem um cartão de crédito {param1} válido","formvalidator.date":"{field} deve conter uma data no formato {param1}","formvalidator.alpha":"O campo {field} deve conter apenas caracteres alfabéticos","formvalidator.text":"O campo {field} deve conter apenas caracteres alfabéticos","formvalidator.latin":"O campo {field} deve conter apenas caracteres alfabéticos","formvalidator.alpha_numeric":"{field} deve conter apenas letras e números","formvalidator.alpha_dashes":"{field} deve conter apenas letras e traços","formvalidator.digit":"{field} destina-se a ser preenchido com apenas um dígito","formvalidator.integer":"{field} deve conter um número inteiro","formvalidator.decimal":"{field} deve conter um número válido","formvalidator.numeric":"{field} deve conter um número válido","formvalidator.range":"{field} deve conter um número entre {param1} e {param2}","formvalidator.color":"{field} deve conter uma cor válida","formvalidator.matches":"{field} deve corresponder ao campo {param1}","formvalidator.validation_function_not_found":"[A regra {rule} não foi definida]"}},"en_US"),k=function(c,d){this._element=a.elOrSelector(c,"Invalid FormElement"),this._errors={},this._rules={},this._value=null,this._options=Ink.extendObj({label:this._getLabel()},b.data(this._element)),this._options=Ink.extendObj(this._options,d||{})};k.prototype={_getLabel:function(){var a=b.findUpwardsByClass(this._element,"control-group"),c=Ink.s("label",a);return c=c?b.textContent(c):this._element.name||this._element.id||""},_parseRules:function(a){this._rules={},a=a.split("|");var b,c=a.length,d,e,f;if(c>0)for(b=0;c>b;b++)if(d=a[b])if(-1!==(f=d.indexOf("["))){e=d.substr(f+1),e=e.split("]"),e=e[0],e=e.split(",");for(var g=0,h=e.length;h>g;g++)e[g]="true"===e[g]?!0:"false"===e[g]?!1:e[g];e.splice(0,0,this.getValue()),d=d.substr(0,f),this._rules[d]=e}else this._rules[d]=[this.getValue()]},_addError:function(a){for(var b=this._rules[a]||[],c={field:this._options.label,value:this.getValue()},d=1;d"),this._errorMessages.push(f)},this)),!1)}},l}),Ink.createModule("Ink.UI.ImageQuery","1",["Ink.UI.Common_1","Ink.Dom.Event_1","Ink.Dom.Element_1","Ink.Util.Array_1"],function(a,b,c,d){"use strict";var e=function(b,d){this._element=a.elsOrSelector(b,"Ink.UI.ImageQuery",!0);for(var f=1;f1&&"retina"in this._options&&(b=a.retina||this._options.retina),a.file=this._filename,"function"==typeof b&&(b=b.apply(this,[this._element,a]),"string"!=typeof b))throw'[ImageQuery] :: "src" callback does not return a string';b=b.replace(/{:(.*?)}/g,function(b,c){return a[c]}),this._element.src=b,delete a.file}},500),_findCurrentQuery:function(){for(var a=window.innerWidth||document.documentElement.clientWidth||document.body.clientWidth,b=this._options.queries,c=b.length-1,d=0;c>d;d+=1)if(b[d].width<=a)return b[d];return b[c]},_onLoad:function(){this._options.onLoad.call(this)}},e}),Ink.createModule("Ink.UI.Modal","1",["Ink.UI.Common_1","Ink.Dom.Event_1","Ink.Dom.Css_1","Ink.Dom.Element_1","Ink.Dom.Selector_1","Ink.Util.Array_1"],function(a,b,c,d,e,f){"use strict";var g=function(a){return a.style.opacity="invalid","invalid"!==a.style.opacity}(d.create("div",{style:"opacity: 1"}));function h(a){var b=a.match(/^./)[0];return b.toUpperCase()+a.replace(/^./,"")}function i(a){return"max"+h(a)}var j=[],k=function(f,g){if(this._element=f?a.elOrSelector(f,"Ink.UI.Modal markup"):null,this._options={width:void 0,height:void 0,shadeClass:void 0,modalClass:void 0,trigger:void 0,triggerEvent:"click",autoDisplay:!0,markup:void 0,onShow:void 0,onDismiss:void 0,closeOnClick:!1,closeOnEscape:!0,responsive:!0,disableScroll:!0},this._handlers={click:Ink.bindEvent(this._onShadeClick,this),keyDown:Ink.bindEvent(this._onKeyDown,this),resize:Ink.bindEvent(this._onResize,this)},this._wasDismissed=!1,this._markupMode=this._element?c.hasClassName(this._element,"ink-modal"):!1,this._markupMode){if(this._modalDiv=this._element,this._modalDivStyle=this._modalDiv.style,this._modalShadow=this._modalDiv.parentNode,this._modalShadowStyle=this._modalShadow.style,this._contentContainer=e.select(".modal-body",this._modalDiv)[0],!this._contentContainer)throw new Error('Ink.UI.Modal: Missing div with class "modal-body"');this._options.markup=this._contentContainer.innerHTML,this._options=Ink.extendObj(this._options,d.data(this._element))}else this._modalShadow=document.createElement("div"),this._modalShadowStyle=this._modalShadow.style,this._modalDiv=document.createElement("div"),this._modalDivStyle=this._modalDiv.style,this._element&&(this._options.markup=this._element.innerHTML),c.addClassName(this._modalShadow,"ink-shade"),c.addClassName(this._modalDiv,"ink-modal ink-space"),this._modalShadow.appendChild(this._modalDiv),document.body.appendChild(this._modalShadow);if(this._options=Ink.extendObj(this._options,g||{}),this._markupMode||this.setContentMarkup(this._options.markup),"string"==typeof this._options.shadeClass&&c.addClassName(this._modalShadow,this._options.shadeClass),"string"==typeof this._options.modalClass&&c.addClassName(this._modalDiv,this._options.modalClass),"trigger"in this._options&&"undefined"!=typeof this._options.trigger){var h;"string"==typeof this._options.trigger&&(h=e.select(this._options.trigger),b.observeMulti(h,this._options.triggerEvent,Ink.bindEvent(this.open,this)))}else"true"===this._options.autoDisplay.toString()&&this.open()};return k.prototype={_reposition:function(){this._modalDivStyle.marginTop=-d.elementHeight(this._modalDiv)/2+"px",this._modalDivStyle.marginLeft=-d.elementWidth(this._modalDiv)/2+"px"},_onResize:function(a){"boolean"==typeof a?this._timeoutResizeFunction.call(this):!this._resizeTimeout&&a&&"object"==typeof a&&(this._resizeTimeout=setTimeout(Ink.bind(this._timeoutResizeFunction,this),250))},_timeoutResizeFunction:function(){var a={width:-1!==(""+this._options.width).indexOf("%"),height:-1!==(""+this._options.height).indexOf("%")},b={height:d.viewportHeight(),width:d.viewportWidth()};f.forEach(["height","width"],Ink.bind(function(c){a[c]||(this._modalDivStyle[c]=b[c]>this.originalStatus[c]?this._modalDivStyle[i(c)]:Math.round(.9*b[c])+"px")},this)),this._resizeContainer(),this._reposition(),this._resizeTimeout=void 0},_onShadeClick:function(a){var f=b.element(a);if(c.hasClassName(f,"ink-close")||c.hasClassName(f,"ink-dismiss")||d.findUpwardsBySelector(f,".ink-close,.ink-dismiss")||this._options.closeOnClick&&(!d.descendantOf(this._shadeElement,f)||f===this._shadeElement)){for(var g=e.select(".ink-alert",this._shadeElement),h=g.length,i=0;h>i;i++)if(d.descendantOf(g[i],f))return;this.dismiss(),this._wasDismissed&&b.stop(a)}},_onKeyDown:function(a){27!==a.keyCode||this._wasDismissed||"true"===this._options.closeOnEscape.toString()&&j[j.length-1]===this&&(this.dismiss(),this._wasDismissed&&b.stop(a))},_resizeContainer:function(){this._contentElement.style.overflow=this._contentElement.style.overflowX=this._contentElement.style.overflowY="hidden";var a=d.elementHeight(this._modalDiv);this._modalHeader=e.select(".modal-header",this._modalDiv)[0],this._modalHeader&&(a-=d.elementHeight(this._modalHeader)),this._modalFooter=e.select(".modal-footer",this._modalDiv)[0],this._modalFooter&&(a-=d.elementHeight(this._modalFooter)),this._contentContainer.style.height=a+"px",a!==d.elementHeight(this._contentContainer)&&(this._contentContainer.style.height=~~(a-(d.elementHeight(this._contentContainer)-a))+"px"),this._markupMode||(this._contentContainer.style.overflow=this._contentContainer.style.overflowX="hidden",this._contentContainer.style.overflowY="auto",this._contentElement.style.overflow=this._contentElement.style.overflowX=this._contentElement.style.overflowY="visible")},_disableScroll:function(){var a=document.documentElement;this._oldHtmlOverflows=[a.style.overflowX,a.style.overflowY],a.style.overflowX=a.style.overflowY="hidden"},open:function(e){e&&b.stop(e);var g="CSS1Compat"===document.compatMode?document.documentElement:document.body;this._resizeTimeout=null,c.addClassName(this._modalShadow,"ink-shade"),this._modalShadowStyle.display=this._modalDivStyle.display="block",setTimeout(Ink.bind(function(){c.addClassName(this._modalShadow,"visible"),c.addClassName(this._modalDiv,"visible")},this),100),this._contentElement=this._modalDiv,this._shadeElement=this._modalShadow,this._markupMode||this.setContentMarkup(this._options.markup);var k={width:-1!==(""+this._options.width).indexOf("%"),height:-1!==(""+this._options.height).indexOf("%")};f.forEach(["width","height"],Ink.bind(function(a){void 0!==this._options[a]?(this._modalDivStyle[a]=this._options[a],k[a]||(this._modalDivStyle[i(a)]=d["element"+h(a)](this._modalDiv)+"px")):this._modalDivStyle[i(a)]=d["element"+h(a)](this._modalDiv)+"px",k[a]&&parseInt(g["client"+i(a)],10)<=parseInt(this._modalDivStyle[a],10)&&(this._modalDivStyle[a]=Math.round(.9*parseInt(g["client"+i(a)],10))+"px")},this)),this.originalStatus={viewportHeight:d.elementHeight(g),viewportWidth:d.elementWidth(g),height:d.elementHeight(this._modalDiv),width:d.elementWidth(this._modalDiv)},"true"===this._options.responsive.toString()?(this._onResize(!0),b.observe(window,"resize",this._handlers.resize)):(this._resizeContainer(),this._reposition()),this._options.onShow&&this._options.onShow(this),"true"===this._options.disableScroll.toString()&&this._disableScroll(),b.observe(this._shadeElement,"click",this._handlers.click),"true"===this._options.closeOnEscape.toString()&&b.observe(document,"keydown",this._handlers.keyDown),a.registerInstance(this,this._shadeElement,"modal"),this._wasDismissed=!1,j.push(this),c.addClassName(document.documentElement,"ink-modal-is-open")},dismiss:function(){if(!this._wasDismissed){if(this._options.onDismiss){var a=this._options.onDismiss(this);if(a===!1)return}if(this._wasDismissed=!0,this._options.responsive&&b.stopObserving(window,"resize",this._handlers.resize),this._markupMode?(c.removeClassName(this._modalDiv,"visible"),c.removeClassName(this._modalShadow,"visible"),this._waitForFade(this._modalShadow,Ink.bind(function(){this._modalShadowStyle.display="none"},this))):(this._modalShadow.parentNode.removeChild(this._modalShadow),this.destroy()),j=f.remove(j,f.keyValue(this,j),1),0===j.length){var d=document.documentElement;this._options.disableScroll&&(d.style.overflowX=this._oldHtmlOverflows[0],d.style.overflowY=this._oldHtmlOverflows[1]),c.removeClassName(d,"ink-modal-is-open")}}},_waitForFade:function(a,d){if(!g)return d();for(var e=["transitionEnd","oTransitionEnd","webkitTransitionEnd"],f,h,i=0,j=e.length;j>i;i++)if(h=e[i],f="on"+h.toLowerCase(),f in a)return void b.observeOnce(a,h,d);var k=function(){+c.getStyle(a,"opacity")>0?setTimeout(k,250):d()};setTimeout(k,500)},destroy:function(){a.unregisterInstance(this._instanceId)},getContentElement:function(){return this._contentContainer},setContentMarkup:function(a){if(this._markupMode)this._contentContainer.innerHTML=a;else{if(this._modalDiv.innerHTML=[a].join(""),this._contentContainer=e.select(".modal-body",this._modalDiv),!this._contentContainer.length){var b=e.select(".modal-header",this._modalDiv),g=e.select(".modal-footer",this._modalDiv);f.each(b,d.remove),f.each(g,d.remove);var h=document.createElement("div");c.addClassName(h,"modal-body"),h.innerHTML=this._modalDiv.innerHTML,this._modalDiv.innerHTML="";var i=b.concat([h]).concat(g);f.each(i,Ink.bindMethod(this._modalDiv,"appendChild")),this._contentContainer=e.select(".modal-body",this._modalDiv)}this._contentContainer=this._contentContainer[0]}this._contentElement=this._modalDiv,this._resizeContainer()}},k}),Ink.createModule("Ink.UI.Pagination","1",["Ink.UI.Common_1","Ink.Dom.Event_1","Ink.Dom.Css_1","Ink.Dom.Element_1","Ink.Dom.Selector_1"],function(a,b,c,d,e){"use strict";var f=function(a,b){var c=document.createElement("a");return c.setAttribute("href","#"),void 0!==b&&c.setAttribute("data-index",b),c.innerHTML=a,c},g=function(b,c){if(this._element=a.elOrSelector(b,"Ink.UI.Pagination element"),this._options=a.options("Ink.UI.Pagination_1",{size:["Integer",null],totalItemCount:["Integer",null],itemsPerPage:["Integer",null],maxSize:["Integer",null],start:["Integer",1],firstLabel:["String","First"],lastLabel:["String","Last"],previousLabel:["String","Previous"],nextLabel:["String","Next"],previousPageLabel:["String",null],nextPageLabel:["String",null],onChange:["Function",void 0],hashParameter:["String","page"],parentTag:["String","ul"],childTag:["String","li"],wrapperClass:["String","ink-navigation"],paginationClass:["String","pagination"],activeClass:["String","active"],disabledClass:["String","disabled"],hideClass:["String","hide-all"],previousClass:["String","previous"],previousPageClass:["String","previousPage"],nextClass:["String","next"],nextPageClass:["String","nextPage"],numberFormatter:["Function",function(a){return a+1}]},c||{},this._element),this._options.previousPageLabel||(this._options.previousPageLabel=this._options.previousLabel+" "+this._options.maxSize),this._options.nextPageLabel||(this._options.nextPageLabel=this._options.nextLabel+" "+this._options.maxSize),this._handlers={click:Ink.bindEvent(this._onClick,this)},a.isInteger(this._options.totalItemCount)&&a.isInteger(this._options.itemsPerPage))this._size=Math.ceil(this._options.totalItemCount/this._options.itemsPerPage);else{if(!a.isInteger(this._options.size))throw new TypeError("Ink.UI.Pagination: Please supply a size option or totalItemCount and itemsPerPage options.");this._size=this._options.size}if(!a.isInteger(this._options.start)&&this._options.start>0&&this._options.start<=this._size)throw new TypeError("start option is a required integer between 1 and size!");if(this._options.maxSize&&!a.isInteger(this._options.maxSize)&&this._options.maxSize>0)throw new TypeError("maxSize option is a positive integer!");if(this._size<0)throw new RangeError("size option must be equal or more than 0!");this.setOnChange(this._options.onChange),this._current=this._options.start-1,this._itemLiEls=[],this._init()};return g.prototype={_init:function(){this._generateMarkup(this._element),this._updateItems(),this._observe(),a.registerInstance(this,this._element,"pagination")},_observe:function(){b.observeDelegated(this._element,"click","."+this._options.paginationClass+" > "+this._options.childTag,this._handlers.click)},_updateItems:function(){var a=this._itemLiEls,b=this._size===a.length,d,e,g;if(b)for(d=0,e=this._size;e>d;++d)c.setClassName(a[d],this._options.activeClass,d===this._current);else{for(d=a.length-1;d>=0;--d)this._ulEl.removeChild(a[d]);for(a=[],d=0,e=this._size;e>d;++d)g=document.createElement(this._options.childTag),g.appendChild(f(this._options.numberFormatter(d),d)),c.setClassName(g,this._options.activeClass,d===this._current),this._ulEl.insertBefore(g,this._nextEl),a.push(g);this._itemLiEls=a}if(this._options.maxSize){var h=Math.floor(this._current/this._options.maxSize),i=this._options.maxSize*h,j=i+this._options.maxSize-1;for(d=0,e=this._size;e>d;++d)g=a[d],c.setClassName(g,this._options.hideClass,i>d||d>j);this._pageStart=i,this._pageEnd=j,this._page=h,c.setClassName(this._prevPageEl,this._options.disabledClass,!this.hasPreviousPage()),c.setClassName(this._nextPageEl,this._options.disabledClass,!this.hasNextPage()),c.setClassName(this._firstEl,this._options.disabledClass,this.isFirst()),c.setClassName(this._lastEl,this._options.disabledClass,this.isLast())}c.setClassName(this._prevEl,this._options.disabledClass,!this.hasPrevious()),c.setClassName(this._nextEl,this._options.disabledClass,!this.hasNext())},_generateMarkup:function(a){c.addClassName(a,"ink-navigation");var b,d,g=!1;(b=e.select("."+this._options.paginationClass,a)).length<1?(b=document.createElement(this._options.parentTag),c.addClassName(b,this._options.paginationClass)):(g=!0,b=b[0]),this._options.maxSize&&(d=document.createElement(this._options.childTag),d.appendChild(f(this._options.firstLabel)),this._firstEl=d,c.addClassName(d,this._options.firstClass),b.appendChild(d),d=document.createElement(this._options.childTag),d.appendChild(f(this._options.previousPageLabel)),this._prevPageEl=d,c.addClassName(d,this._options.previousPageClass),b.appendChild(d)),d=document.createElement(this._options.childTag),d.appendChild(f(this._options.previousLabel)),this._prevEl=d,c.addClassName(d,this._options.previousClass),b.appendChild(d),d=document.createElement(this._options.childTag),d.appendChild(f(this._options.nextLabel)),this._nextEl=d,c.addClassName(d,this._options.nextClass),b.appendChild(d),this._options.maxSize&&(d=document.createElement(this._options.childTag),d.appendChild(f(this._options.nextPageLabel)),this._nextPageEl=d,c.addClassName(d,this._options.nextPageClass),b.appendChild(d),d=document.createElement(this._options.childTag),d.appendChild(f(this._options.lastLabel)),this._lastEl=d,c.addClassName(d,this._options.lastClass),b.appendChild(d)),g||a.appendChild(b),this._ulEl=b},_onClick:function(a){b.stop(a);var d=b.element(a);if(!c.hasClassName(d,this._options.activeClass)&&!c.hasClassName(d,this._options.disabledClass)){var e=c.hasClassName(d,this._options.previousClass),f=c.hasClassName(d,this._options.nextClass),g=c.hasClassName(d,this._options.previousPageClass),h=c.hasClassName(d,this._options.nextPageClass),i=c.hasClassName(d,this._options.firstClass),j=c.hasClassName(d,this._options.lastClass);if(i)this.setCurrent(0);else if(j)this.setCurrent(this._size-1);else if(g||h)this.setCurrent((g?-1:1)*this._options.maxSize,!0);else if(e||f)this.setCurrent(e?-1:1,!0);else{var k=Ink.s("[data-index]",d),l=parseInt(k.getAttribute("data-index"),10);this.setCurrent(l)}}},setOnChange:function(a){if(void 0!==a&&"function"!=typeof a)throw new TypeError("onChange option must be a function!");this._onChange=a},setSize:function(b){if(!a.isInteger(b))throw new TypeError("1st argument must be an integer number!");this._size=b,this._updateItems(),this._current=0},setSizeInItems:function(a,b){var c=Math.ceil(a/b);this.setSize(c)},setCurrent:function(b,c){if(!a.isInteger(b))throw new TypeError("1st argument must be an integer number!");c&&(b+=this._current),b>this._size-1&&(b=this._size-1),0>b&&(b=0),this._current=b,this._updateItems(),this._onChange&&this._onChange(this,b)},getSize:function(){return this._size},getCurrent:function(){return this._current},isFirst:function(){return 0===this._current},isLast:function(){return this._current===this._size-1},hasPrevious:function(){return this._current>0},hasNext:function(){return this._currentthis._options.maxSize-1},hasNextPage:function(){return this._options.maxSize&&this._size-this._current>=this._options.maxSize+1},destroy:a.destroyComponent},g}),Ink.createModule("Ink.UI.ProgressBar","1",["Ink.Dom.Selector_1","Ink.Dom.Element_1"],function(a,b){"use strict";var c=function(c,d){if("object"!=typeof c){if("string"!=typeof c)throw"[Ink.UI.ProgressBar] :: Invalid selector";if(this._element=a.select(c),this._element.length<1)throw"[Ink.UI.ProgressBar] :: Selector didn't find any elements";this._element=this._element[0]}else this._element=c;this._options=Ink.extendObj({startValue:0,onStart:function(){},onEnd:function(){}},b.data(this._element)),this._options=Ink.extendObj(this._options,d||{}),this._value=this._options.startValue,this._init()};return c.prototype={_init:function(){if(this._elementBar=a.select(".bar",this._element),this._elementBar.length<1)throw"[Ink.UI.ProgressBar] :: Bar element not found";this._elementBar=this._elementBar[0],this._options.onStart=Ink.bind(this._options.onStart,this),this._options.onEnd=Ink.bind(this._options.onEnd,this),this.setValue(this._options.startValue)},setValue:function(a){this._options.onStart(this._value),a=parseInt(a,10),isNaN(a)||0>a?a=0:a>100&&(a=100),this._value=a,this._elementBar.style.width=this._value+"%",this._options.onEnd(this._value)}},c}),Ink.createModule("Ink.UI.SmoothScroller","1",["Ink.Dom.Event_1","Ink.Dom.Selector_1","Ink.Dom.Loaded_1"],function(a,b,c){"use strict";var d=window.requestAnimationFrame||function(a){return setTimeout(a,10)},e=window.cancelAnimationFrame||function(a){clearTimeout(a)},f={speed:10,getTop:function(a){return Math.round(f.scrollTop()+a.getBoundingClientRect().top)},scrollTop:function(){var a=document.body,b=document.documentElement;return a&&a.scrollTop?a.scrollTop:b&&b.scrollTop?b.scrollTop:window.pageYOffset?window.pageYOffset:0},add:function(b,c,d){a.observe(b,c,d)},end:function(b){a.stopDefault(b)},scroll:function(a){var b=f.scrollTop();b+=a>b?Math.ceil((a-b)/f.speed):(a-b)/f.speed,window.scrollTo(0,b),e(f.interval),b!==a&&f.offsetTop!==b?f.interval=d(Ink.bindMethod(f,"scroll",a),document.body):f.onDone(),f.offsetTop=b},init:function(a){c.run(Ink.bindMethod(f,"render",a))},render:function(c){for(var d=b.select(c||"a.scrollableLink,a.ink-smooth-scroll"),e=0;e li.active > "+h,h='a[name="'+e+'"],#'+e,i=b.select(h)[0],j=b.select(g)[0];j=j&&j.parentNode,"undefined"!=typeof i&&(-1===c.parentNode.className.indexOf("active")&&(j&&(j.className=j.className.replace(/(^|\s+)active($|\s+)/g,"")),c.parentNode.className+=" active"),f.hash=e,f.scroll(f.getTop(i)))}},onDone:function(){window.location.hash=f.hash}};return f}),Ink.createModule("Ink.UI.SortableList","1",["Ink.UI.Common_1","Ink.Dom.Css_1","Ink.Dom.Event_1","Ink.Dom.Element_1","Ink.Dom.Selector_1"],function(a,b,c,d,e){"use strict";var f="ontouchstart"in window||navigator.maxTouchPoints>0||navigator.msMaxTouchPoints>0,g=function(b,c){this._element=a.elOrSelector(b,"Ink.UI.SortableList"),this._options=a.options("Sortable",{placeholderClass:["String","placeholder"],draggedClass:["String","hide-all"],draggingClass:["String","dragging"],dragSelector:["String","li"],dragObject:["String",null],handleSelector:["String",null],moveSelector:["String",!1],swap:["Boolean",!1],cancelMouseOut:["Boolean",!1]},c||{},this._element),null!=this._options.dragObject&&(Ink.warn("Ink.UI.SortableList: options.dragObject is now deprecated. Please use options.handleSelector instead."),this._options.handleSelector=this._options.handleSelector||this._options.dragObject),this._handlers={down:Ink.bind(this._onDown,this),move:Ink.bind(this._onMove,this),up:Ink.bind(this._onUp,this)},this._isMoving=!1,this._init() +};return g.prototype={_init:function(){this._down=f?"touchstart mousedown":"mousedown",this._move=f?"touchmove mousemove":"mousemove",this._up=f?"touchend mouseup":"mouseup",this._observe(),a.registerInstance(this,this._element,"sortableList")},_observe:function(){c.on(this._element,this._down,this._options.dragSelector,this._handlers.down),c.on(this._element,this._move,this._options.dragSelector,this._handlers.move),this._options.cancelMouseOut&&c.on(this._element,"mouseleave",Ink.bind(this.stopMoving,this)),c.on(document.documentElement,this._up,this._handlers.up)},_onDown:function(a){if(!(this._isMoving||this._placeholder||this._options.handleSelector&&!e.matchesSelector(a.target,this._options.handleSelector))){var b=a.currentTarget;return this._isMoving=b,this._placeholder=b.cloneNode(!0),this._movePlaceholder(b),this._addMovingClasses(),!1}},_onMove:function(a){return this.validateMove(a.currentTarget),!1},_onUp:function(a){return this._isMoving&&this._placeholder&&a.currentTarget!==this._isMoving&&a.currentTarget!==this._placeholder?(d.insertBefore(this._isMoving,this._placeholder),this.stopMoving(),!1):void 0},_addMovingClasses:function(){b.addClassName(this._placeholder,this._options.placeholderClass),b.addClassName(this._isMoving,this._options.draggedClass),b.addClassName(document.documentElement,this._options.draggingClass)},_removeMovingClasses:function(){this._isMoving&&b.removeClassName(this._isMoving,this._options.draggedClass),this._placeholder&&b.removeClassName(this._placeholder,this._options.placeholderClass),b.removeClassName(document.documentElement,this._options.draggingClass)},_movePlaceholder:function(a){var b=this._placeholder,c,e,f,g;b?this._options.swap?(d.insertAfter(b,a),d.insertBefore(a,this._isMoving),d.insertBefore(this._isMoving,b)):(c=d.offset(a),e=d.offset(this._placeholder),f=c[1]>e[1],g=c[0]>e[0],f&&g||!f&&!g?d.insertBefore(b,a):d.insertAfter(b,a),d.insertBefore(this._isMoving,b)):d.insertAfter(b,a)},destroy:a.destroyComponent,stopMoving:function(){this._removeMovingClasses(),d.remove(this._placeholder),this._placeholder=!1,this._isMoving=!1},validateMove:function(a){this._isMoving&&this._placeholder&&a!==this._placeholder&&a!==this._isMoving&&(!this._options.moveSelector||e.matchesSelector(a,this._options.moveSelector)?this._movePlaceholder(a):this.stopMoving())}},g}),Ink.createModule("Ink.UI.Spy","1",["Ink.UI.Common_1","Ink.Dom.Event_1","Ink.Dom.Css_1","Ink.Dom.Element_1","Ink.Dom.Selector_1"],function(a,b,c,d,e){"use strict";var f=[];function g(a){for(var b=0,c=f.length;c>b;b++)if(f[b][0]===a)return b;return null}function h(a,b){var c=g(b);null===c?f.push([b,[a]]):f[c][1].push(a)}var i=!1;function j(){i||(i=!0,b.observe(document,"scroll",b.throttle(k,300)))}function k(){for(var a=0,b=f.length;b>a;a++)l(f[a][0],f[a][1])}function l(a,b){for(var f=m(b),g=e.select("li.active",a),h=0,i=g.length;i>h;h++)c.removeClassName(g[h],"active");if(null!==f){var j='a[href$="#'+(f.name||f.id)+'"]',k=e.select(j,a);for(h=0,i=k.length;i>h;h++)c.addClassName(d.findUpwardsByTag(k[h],"li"),"active")}}function m(a){for(var b=-1/0,c,d,e=0,f=a.length;f>e;e++)d=a[e].getBoundingClientRect(),d.top<=0&&d.top>b&&(b=d.top,c=e);return void 0===c?null:a[c]}var n=function(b,c){this._rootElement=a.elOrSelector(b,"1st argument"),this._options=Ink.extendObj({target:void 0,activeClass:"active"},d.data(this._rootElement)),this._options=Ink.extendObj(this._options,c||{}),this._options.target=a.elOrSelector(this._options.target,"Target"),this._init()};return n.prototype={_init:function(){h(this._rootElement,this._options.target),j(),k()}},n}),Ink.createModule("Ink.UI.Stacker",1,["Ink.UI.Common_1","Ink.Dom.Event_1","Ink.Dom.Element_1"],function(a,b,c){"use strict";function d(a,b){this._init(a,b)}return d.prototype={_init:function(b,c){this._rootElm=a.elsOrSelector(b,"Ink.UI.Stacker root element")[0]||null,null===this._rootElm&&"undefined"!=typeof console&&console.warn("Ink.UI.Stacker: No root element"),this._options=a.options({column:["String",".stacker-column"],item:["String",".stacker-item"],customBreakPoints:["Object",null],largeMax:["Number",Number.MAX_VALUE],largeMin:["Number",961],mediumMax:["Number",960],mediumMin:["Number",651],smallMax:["Number",650],smallMin:["Number",0],largeCols:["Integer",3],mediumCols:["Integer",2],smallCols:["Integer",1],isOrdered:["Boolean",!0],onRunCallback:["Function",null],onResizeCallback:["Function",null],onAPIReloadCallback:["Function",null]},c||{},this._rootElm),this._aList=[],this._curLayout="large",this._runFirstTime=!1,this._getPageItemsToList(),(this._canApplyLayoutChange()||!this._runFirstTime)&&(this._runFirstTime=!0,this._applyLayoutChange(),"function"==typeof this._options.onRunCallback&&this._options.onRunCallback(this._curLayout)),this._addEvents()},addItem:function(a){this._aList.push(a)},reloadItems:function(){this._applyLayoutChange(),"function"==typeof this._options.onAPIReloadCallback&&this._options.onAPIReloadCallback(this._curLayout)},_addEvents:function(){b.observe(window,"resize",Ink.bindEvent(this._onResize,this))},_onResize:function(){this._canApplyLayoutChange()&&(this._removeDomItems(),this._applyLayoutChange(),"function"==typeof this._options.onResizeCallback&&this._options.onResizeCallback(this._curLayout))},_setCurLayout:function(){var a=c.viewportWidth();if(this._options.customBreakpoints&&"object"==typeof this._options.customBreakPoints){for(var b in this._options.customBreakPoints)if(this._options.customBreakPoints.hasOwnProperty(b)&&a>=Number(this._options.customBreakPoints[b].min)&&a<=Number(this._options.customBreakPoints[b].max)&&this._curLayout!==b)return void(this._curLayout=b)}else a<=Number(this._options.largeMax)&&a>=Number(this._options.largeMin)&&"large"!==this._curLayout?this._curLayout="large":a>=Number(this._options.mediumMin)&&a<=Number(this._options.mediumMax)&&"medium"!==this._curLayout?this._curLayout="medium":a>=Number(this._options.smallMin)&&a<=Number(this._options.smallMax)&&"small"!==this._curLayout&&(this._curLayout="small")},_getColumnsToShow:function(){return Number(this._options.customBreakPoints&&"object"==typeof this._options.customBreakPoints?this._options.customBreakPoints[this._curLayout].cols:this._options[this._curLayout+"Cols"])},_canApplyLayoutChange:function(){var a=this._curLayout;return this._setCurLayout(),a!==this._curLayout?!0:!1},_getPageItemsToList:function(){this._aColumn=Ink.ss(this._options.column,this._rootElm);var a=this._aColumn.length,b=0;if(a>0){for(var c=0;c0&&this._options.isOrdered){for(var f=[],g=0;g0)for(var b=0;a>b;b++)for(var c=Ink.ss(this._options.item,this._aColumn[b]),d=c.length-1;d>=0;d--)c[d].parentNode.removeChild(c[d])},_applyLayoutChange:function(){var a=this._getColumnsToShow(),b=this._aList.length,c=0,d=0;if(a>0)for(;a>d;){if(this._aColumn[d].appendChild(this._aList[c]),c++,d++,c===b)return;d===a&&(d=0)}}},d}),Ink.createModule("Ink.UI.Sticky","1",["Ink.UI.Common_1","Ink.Dom.Event_1","Ink.Dom.Element_1","Ink.Dom.Css_1"],function(a,b,c,d){"use strict";var e=function(b,d){this._rootElement=a.elOrSelector(b,"Ink.UI.Sticky_1"),this._options=a.options({offsetBottom:["Integer",0],offsetTop:["Integer",0],topElement:["Element",null],wrapperClass:["String","ink-sticky-wrapper"],stickyClass:["String","ink-sticky-stuck"],inlineDimensions:["Boolean",!0],inlinePosition:["Boolean",!0],bottomElement:["Element",null],activateInLayouts:["String","medium,large"]},d||{},this._rootElement),this._options.activateInLayouts=this._options.activateInLayouts.toString(),this._dims=null,this._options.offsetTop=parseInt(this._options.offsetTop,10)||0,this._options.offsetBottom=parseInt(this._options.offsetBottom,10)||0,this._options.topElement&&(this._options.topElement=a.elOrSelector(this._options.topElement,"Top Element")),this._options.bottomElement&&(this._options.bottomElement=a.elOrSelector(this._options.bottomElement,"Sticky bottom Element")),this._wrapper=c.create("div",{className:this._options.wrapperClass}),c.wrap(this._rootElement,this._wrapper),this._init()};return e.prototype={_init:function(){var a=document.addEventListener?document:window;this._onScroll=Ink.bind(b.throttle(this._onScroll,33),this),b.observe(a,"scroll",this._onScroll),b.observe(window,"resize",Ink.bindEvent(b.throttle(this._onResize,100),this)),this._onScroll()},_isDisabledInLayout:function(){var b=a.currentLayout();return b?-1===this._options.activateInLayouts.indexOf(b):!1},_onScroll:function(){var a=this._getDims(),b=c.scrollHeight(),d=this._isDisabledInLayout()||b<=a.top-this._options.offsetTop||this._options.topElement&&this._options.topElement.getBoundingClientRect().bottom+this._options.offsetTop>0;if(d)return void this._unstick();var e=this._options.offsetTop+a.height+c.scrollHeight(),f=document.body.scrollHeight;this._options.bottomElement&&(f=this._options.bottomElement.getBoundingClientRect().top+c.scrollHeight()),f-=this._options.offsetBottom,this._stickTo(f>e?"screen":"bottom")},_stickTo:function(a){var b=this._rootElement.style,e=this._getDims();if(d.addClassName(this._rootElement,this._options.stickyClass),this._wrapper.style.height=e.height+"px",this._inlineDimensions(e.height+"px",e.width+"px"),this._options.inlinePosition!==!1)if(b.left=e.left+"px","screen"===a)b.bottom=null,b.top=this._options.offsetTop+"px";else if("bottom"===a){var f=this._getBottomOffset(),g=c.scrollHeight()+c.viewportHeight(),h=c.pageHeight()-g;b.bottom=f-h+"px",b.top="auto"}},_unstick:function(){d.removeClassName(this._rootElement,this._options.stickyClass),this._inlineDimensions(null,null),this._options.inlinePosition&&(this._rootElement.style.left=null,this._rootElement.style.top=null,this._rootElement.style.bottom=null),this._wrapper.style.height=null,this._wrapper.style.width=null,this._dims=null},_onResize:function(){this._dims=null,this._onScroll()},_getDims:function(){if(null!==this._dims)return this._dims;var a=this._rootElement.style,b=a.position,d=a.width;a.position="static",a.width=null;var e=c.outerDimensions(this._rootElement),f=this._wrapper.getBoundingClientRect();return this._dims={height:e[1],width:e[0],left:f.left+c.scrollWidth(),top:f.top+c.scrollHeight()},a.position=b,a.width=d,this._dims},_inlineDimensions:function(a,b){this._options.inlineDimensions&&(this._rootElement.style.height=a,this._rootElement.style.width=b)},_getBottomOffset:function(){var a=this._options.offsetBottom;return this._options.bottomElement&&(a+=c.pageHeight()-c.offsetTop(this._options.bottomElement)),a}},e}),Ink.createModule("Ink.UI.Swipe","1",["Ink.Dom.Event_1","Ink.Dom.Element_1","Ink.UI.Common_1"],function(a,b,c){"use strict";function d(a,d){a=c.elOrSelector(a,"Swipe target"),this._options=Ink.extendObj({onEnd:void 0,onStart:void 0,onMove:void 0,minDist:void 0,maxDist:void 0,minDuration:void 0,maxDuration:void 0,axis:void 0,storeGesture:!1,stopEvents:!0},b.data(a),d||{}),"function"==typeof d&&(this._options.onEnd=d),this._handlers={down:Ink.bindEvent(this._onDown,this),move:Ink.bindEvent(this._onMove,this),up:Ink.bindEvent(this._onUp,this)},this._element=a,this._init()}return d.prototype={version:"0.1",_supported:"ontouchstart"in document.documentElement,_init:function(){var b=document.body;a.observe(b,"touchstart",this._handlers.down),(this._options.storeGesture||this._options.onMove)&&a.observe(b,"touchmove",this._handlers.move),a.observe(b,"touchend",this._handlers.up),this._isOn=!1},_isMeOrParent:function(a,b){if(a){do{if(a===b)return!0;a=a.parentNode}while(a);return!1}},_pushGesture:function(a,b){this._options.storeGesture&&(this._gesture.push(a),this._time.push(b))},_onDown:function(b){1===b.changedTouches.length&&this._isMeOrParent(b.target,this._element)&&(this._options.stopEvents===!0&&a.stop(b),b=b.changedTouches[0],this._isOn=!0,this._target=b.target,this._t0=+new Date,this._p0=[b.pageX,b.pageY],this._options.storeGesture&&(this._gesture=[],this._time=[]),this._pushGesture(this._p0,0),this._options.onStart&&this._options.onStart({event:b,element:this._element,instance:this,position:this._p0,dt:0}))},_onMove:function(b){if(this._isOn&&1===b.changedTouches.length){this._options.stopEvents===!0&&a.stop(b),b=b.changedTouches[0];var c=+new Date,d=c-this._t0,e=[b.pageX,b.pageY];this._pushGesture(e,d),this._options.onMove&&this._options.onMove({event:b,element:this._element,instance:this,position:e,dt:d})}},_onUp:function(b){if(this._isOn&&1===b.changedTouches.length){this._options.stopEvents===!0&&a.stop(b),b=b.changedTouches[0],this._isOn=!1;var c=+new Date,d=[b.pageX,b.pageY],e=c-this._t0,f=[d[0]-this._p0[0],d[1]-this._p0[1]],g=Math.sqrt(f[0]*f[0]+f[1]*f[1]),h=Math.abs(f[0])>Math.abs(f[1])?"x":"y",i=this._options;i.minDist&&gi.maxDist||i.minDuration&&ei.maxDuration||i.axis&&h!==i.axis||this._options.onEnd&&this._options.onEnd({event:b,element:this._element,instance:this,gesture:this._gesture,time:this._time,axis:h,overallMovement:f,overallTime:e})}}},d}),Ink.createModule("Ink.UI.Table","1",["Ink.Util.Url_1","Ink.UI.Pagination_1","Ink.Net.Ajax_1","Ink.UI.Common_1","Ink.Dom.Event_1","Ink.Dom.Css_1","Ink.Dom.Element_1","Ink.Dom.Selector_1","Ink.Util.Array_1","Ink.Util.String_1","Ink.Util.Json_1"],function(a,b,c,d,e,f,g,h,i,j,k){"use strict";var l=/\d/g;function m(a){return!isNaN(a)&&l.test(a)?parseInt(a,10):isNaN(a)?a:parseFloat(a)}function n(a,b){return a===b?0:a>b?1:-1}function o(a,b){var c=m(g.textContent(a)),d=m(g.textContent(b));return n(c,d)}function p(a){if("undefined"!=typeof Object.keys)return Object.keys(a);var b=[];for(var c in a)a.hasOwnProperty(c)&&b.push(c);return b}function q(a){return a}var r=function(a,b){if(this._rootElement=d.elOrSelector(a,"Ink.UI.Table :"),"table"!==this._rootElement.nodeName.toLowerCase())throw new Error("[Ink.UI.Table] :: The element is not a table");this._options=d.options({pageSize:["Integer",null],endpoint:["String",null],createEndpointUrl:["Function",null],getDataFromEndPoint:["Function",null],processJSONRows:["Function",q],processJSONRow:["Function",q],processJSONField:["Function",q],processJSONHeaders:["Function",function(a){return a.fields}],processJSONTotalRows:["Function",function(a){return a.length||a.totalRows}],getSortKey:["Function",null],pagination:["Element",null],allowResetSorting:["Boolean",!1],visibleFields:["String",null],tdClassNames:["Object",{}],paginationOptions:["Object",null]},b||{},this._rootElement),this._markupMode=!this._options.endpoint,this._options.visibleFields&&(this._options.visibleFields=this._options.visibleFields.toString().split(/[, ]+/g)),this._thead=this._rootElement.tHead||this._rootElement.createTHead(),this._headers=h.select("th",this._thead),this._handlers={thClick:null},this._originalFields=[],this._sortableFields={},this._originalData=this._data=[],this._pagination=null,this._totalRows=0,this._handlers.thClick=e.observeDelegated(this._rootElement,"click",'thead th[data-sortable="true"]',Ink.bindMethod(this,"_onThClick")),this._init()};return r.prototype={_init:function(){this._markupMode?(this._resetSortOrder(),this._addHeadersClasses(),this._data=h.select("tbody tr",this._rootElement),this._originalData=this._data.slice(0),this._totalRows=this._data.length,this._setPagination()):this._getData()},_addHeadersClasses:function(){for(var a,b,c=0,d=this._headers.length;d>c;c++)a=g.textContent(this._headers[c]),b=this._options.tdClassNames[a],b&&f.addClassName(this._headers[c],b)},_onThClick:function(a){var b=e.element(a),c=void 0!==this._options.pageSize;e.stop(a);var f=i.keyValue(b,this._headers,!0),g=f!==!1&&void 0!==this._sortableFields[f];if(g)if(!this._markupMode&&c)this._invertSortOrder(f,!1);else{"desc"===this._sortableFields[f]&&this._options.allowResetSorting?(this._setSortOrderOfColumn(f,null),this._data=this._originalData.slice(0)):this._invertSortOrder(f,!0);var j=h.select("tbody",this._rootElement)[0];d.cleanChildren(j),i.each(this._data,Ink.bindMethod(j,"appendChild")),this._pagination&&(this._pagination.setCurrent(0),this._paginate(1))}},_invertSortOrder:function(a,b){for(var c="asc"===this._sortableFields[a],d=0,e=this._headers.length;e>d;d++)this._setSortOrderOfColumn(d,null);b&&(this._sort(a),c&&this._data.reverse()),this._setSortOrderOfColumn(a,!c)},_setSortOrderOfColumn:function(a,b){var c=this._headers[a],d="",e="none";b===!0?(d='',e="asc"):b===!1&&(d='',e="desc"),this._sortableFields[a]=e,c.innerHTML=g.textContent(c)+d},_paginate:function(a){if(this._pagination){var b=this._options.pageSize,c=(a-1)*b,d=c+b;i.each(this._data,function(a,b){b>=c&&d>b?f.removeClassName(a,"hide-all"):f.addClassName(a,"hide-all")})}},_registerFieldNames:function(a){this._originalFields=[],i.forEach(a,Ink.bind(function(a){this._fieldIsVisible(a)&&this._originalFields.push(a)},this))},_fieldIsVisible:function(a){return!this._options.visibleFields||-1!==this._options.visibleFields.indexOf(a)},_sort:function(a){var b=g.textContent(this._headers[a]),c=this._options.getSortKey;c&&(c="function"==typeof c[b]?c[b]:"function"==typeof c?c:null);var d=this;this._data.sort(function(b,d){var f=Ink.ss("td",b)[a],g=Ink.ss("td",d)[a];return c?n(e(f),e(g)):o(f,g,a)});function e(e){return c.call(d,{columnIndex:a,columnName:b,data:g.textContent(e),element:e})}},_createHeadersFromJson:function(a){if(this._registerFieldNames(p(a)),!this._thead.children.length)for(var b=this._thead.insertRow(0),c,d=0,e=a.length;e>d;d++)this._fieldIsVisible(a[d])&&(c=g.create("th"),c=this._createSingleHeaderFromJson(a[d],c),b.appendChild(c),this._headers.push(c))},_createSingleHeaderFromJson:function(a,b){return a.sortable&&b.setAttribute("data-sortable","true"),a.label&&g.setTextContent(b,a.label),b},_resetSortOrder:function(){for(var a=0,b=this._headers.length;b>a;a++){var c=g.data(this._headers[a]);c.sortable&&"true"===c.sortable.toString()&&(this._sortableFields[a]="none")}},_createRowsFromJSON:function(a){var b=h.select("tbody",this._rootElement)[0];b?g.setHTML(b,""):(b=document.createElement("tbody"),this._rootElement.appendChild(b)),this._data=[];var c;for(var d in a)a.hasOwnProperty(d)&&(c=this._options.processJSONRow(a[d]),this._createSingleRowFromJson(b,c,d));this._originalData=this._data.slice(0)},_createSingleRowFromJson:function(a,b,c){var d=document.createElement("tr");a.appendChild(d);for(var e in b)b.hasOwnProperty(e)&&this._createFieldFromJson(d,b[e],e,c);this._data.push(d)},_createFieldFromJson:function(a,b,c,d){if(this._fieldIsVisible(c)){var e=this._options.processJSONField[c]||this._options.processJSONField,g;g="function"==typeof e?e(b,c,d):b;var h=this._elOrFieldData(g),i=this._options.tdClassNames[c];i&&f.addClassName(h,i),a.appendChild(h)}},_elOrFieldData:function(a){if(d.isDOMElement(a))return a;var b="string"==typeof a,c="number"==typeof a,e=g.create("td");if(b&&/^\s*?=this._options.maxTags)){if(!this._options.allowRepeated&&f.inArray(c,this._tags,c)||!c)return!1;var d=a.create("span",{className:"ink-tag",setTextContent:c+" "}),e=a.create("span",{className:"remove icon icon-remove icon-times",insertBottom:d});b.observe(e,"click",Ink.bindEvent(this._removeTag,this,null));var g=document.createTextNode(" ");this._tags.push(c),this._viewElm.insertBefore(d,this._input),this._viewElm.insertBefore(g,this._input),this._tagsToMarkup(this._tags,this._element)}},_readInput:function(a){return this._options.separator?f.filter(a.split(this._options.separator),k):[a]},_onKeyUp:function(){if(this._options.autoSplit){var a=this._input.value.split(this._options.separator);if(!(a.length<=1)){var b=a[a.length-1];a=a.splice(0,a.length-1),a=f.filter(a,k),f.each(a,Ink.bind(this._addTag,this)),this._input.value=b}}},_onKeyDown:function(a){return a.which===i?this._onEnterKeyDown(a):a.which===j?this._onBackspaceKeyDown():void(this._removeConfirm&&this._unsetRemovingVisual(this._tags.length-1))},_onBackspaceKeyDown:function(){this._input.value||(this._removeConfirm?(this._unsetRemovingVisual(this._tags.length-1),this._removeTag(this._tags.length-1),this._removeConfirm=null):this._setRemovingVisual(this._tags.length-1))},_onEnterKeyDown:function(a){var c=this._input.value;c&&(this._addTag(c),this._input.value=""),b.stopDefault(a)},_onBlur:function(){this._addTag(this._input.value),this._input.value=""},_setRemovingVisual:function(a){var d=this._viewElm.children[a];c.addClassName(d,"tag-deleting"),this._removeRemovingVisualTimeout=setTimeout(Ink.bindMethod(this,"_unsetRemovingVisual",a),4e3),b.observe(this._input,"blur",Ink.bindMethod(this,"_unsetRemovingVisual",a)),this._removeConfirm=!0},_unsetRemovingVisual:function(a){var b=this._viewElm.children[a];b&&(c.removeClassName(b,"tag-deleting"),clearTimeout(this._removeRemovingVisualTimeout)),this._removeConfirm=null},_removeTag:function(c){var d;if("object"==typeof c){var e=b.element(c).parentNode;d=a.parentIndexOf(this._viewElm,e)}else"number"==typeof c&&(d=c);this._tags=f.remove(this._tags,d,1),a.remove(this._viewElm.children[d]),this._tagsToMarkup(this._tags,this._element)},_refocus:function(a){return this._input.focus(),b.stop(a),!1}},l}),Ink.createModule("Ink.UI.Toggle","1",["Ink.UI.Common_1","Ink.Dom.Event_1","Ink.Dom.Css_1","Ink.Dom.Element_1","Ink.Dom.Selector_1","Ink.Util.Array_1"],function(a,b,c,d,e,f){"use strict";var g=function(b,e){if(this._rootElement=a.elOrSelector(b,"[Ink.UI.Toggle root element]:"),this._options=Ink.extendObj({target:void 0,triggerEvent:"click",closeOnClick:!0,isAccordion:!1,initialState:null,classNameOn:"show-all",classNameOff:"hide-all",togglesDisplay:null,closeOnInsideClick:"a[href]",onChangeState:null},e||{},d.data(this._rootElement)),this._targets=a.elsOrSelector(this._options.target,"Ink.UI.Toggle target option"),this._options.closeOnClick="true"===this._options.closeOnClick.toString(),this._options.initialState=null!==this._options.initialState?"true"===this._options.initialState.toString():"none"!==c.getStyle(this._targets[0],"display"),"show-all"!==this._options.classNameOn||"hide-all"!==this._options.classNameOff)for(var f=0,g=this._targets.length;g>f;f++)c.removeClassName(this._targets[f],"show-all"),c.removeClassName(this._targets[f],"hide-all");this._init()};return g.prototype={_init:function(){if(this._accordion=c.hasClassName(this._rootElement.parentNode,"accordion")||c.hasClassName(this._targets[0].parentNode,"accordion"),this._firstTime=!0,this._bindEvents(),null!==this._options.initialState)this.setState(this._options.initialState,!0);else{var a="none"!==c.getStyle(this._targets[0],"display");this.setState(a,!0)}for(var b=0,d=this._targets.length;d>b;b++)this._targets[b].style.display&&(this._targets[b].style.display="")},_bindEvents:function(){if(this._options.triggerEvent&&b.observe(this._rootElement,this._options.triggerEvent,Ink.bind(this._onTriggerEvent,this)),this._options.closeOnClick&&b.observe(document,"click",Ink.bind(this._onOutsideClick,this)),this._options.closeOnInsideClick){var a=this._options.closeOnInsideClick; +"true"===a.toString()&&(a="*"),b.observeMulti(this._targets,"click",Ink.bind(function(c){d.findUpwardsBySelector(b.element(c),a)&&this.setState(!1,!0)},this))}},_onTriggerEvent:function(a){var c=b.element(a),e=f.some(this._targets,function(a){return a===c||d.isAncestorOf(a,c)});if(!e){this._accordion&&this._updateAccordion();var g=this.getState();this.setState(!g,!0),!g&&this._firstTime&&(this._firstTime=!1),b.stopDefault(a)}},_updateAccordion:function(){var a,b;b=c.hasClassName(this._targets[0].parentNode,"accordion")?this._targets[0].parentNode:this._targets[0].parentNode.parentNode,a=e.select(".toggle, .ink-toggle",b);for(var f=0;f0&&h[0]!==this._targets[0]&&(h[0].style.display="none")}},_onOutsideClick:function(a){var c=b.element(a),e,g=f.some(this._targets,function(a){return d.isAncestorOf(a,c)||a===c});if(this._rootElement!==c&&!d.isAncestorOf(this._rootElement,c)&&!g){if((e=Ink.ss(".ink-shade")).length)for(var h=e.length,i=0;h>i;i++)if(d.isAncestorOf(e[i],c)&&d.isAncestorOf(e[i],this._rootElement))return;this.setState(!1,!0)}},setState:function(a,b){if(a!==this.getState()){if(b&&"function"==typeof this._options.onChangeState){var d=this._options.onChangeState(a);if(d===!1)return!1}for(var e=0,f=this._targets.length;f>e;e++)c.addRemoveClassName(this._targets[e],this._options.classNameOn,a),c.addRemoveClassName(this._targets[e],this._options.classNameOff,!a);c.addRemoveClassName(this._rootElement,"active",a)}},getState:function(){return c.hasClassName(this._rootElement,"active")}},g}),Ink.createModule("Ink.UI.Tooltip","1",["Ink.UI.Common_1","Ink.Dom.Event_1","Ink.Dom.Element_1","Ink.Dom.Selector_1","Ink.Util.Array_1","Ink.Dom.Css_1","Ink.Dom.Browser_1"],function(a,b,c,d,e,f){"use strict";function g(a,b){this._init(a,b||{})}function h(a,b){this._init(a,b)}var i,j,k;!function(){for(var a=document.createElement("DIV"),b=["transition","oTransition","msTransition","mozTransition","webkitTransition"],c=0;ce;e++)this.tooltips[e]=new h(this,c[e])},destroy:function(){e.each(this.tooltips,function(a){a._destroy()}),this.tooltips=null,this.options=null}},h.prototype={_oppositeDirections:{left:"right",right:"left",up:"down",down:"up"},_init:function(a,c){b.observe(c,"mouseover",Ink.bindEvent(this._onMouseOver,this)),b.observe(c,"mouseout",Ink.bindEvent(this._onMouseOut,this)),b.observe(c,"mousemove",Ink.bindEvent(this._onMouseMove,this)),this.root=a,this.element=c,this._delayTimeout=null,this.tooltip=null},_makeTooltip:function(a){if(!this._getOpt("text")&&!this._getOpt("html")&&!c.hasAttribute(this.element,"title"))return!1;var d=this._createTooltipElement();this.tooltip&&this._removeTooltip(),this.tooltip=d,this._fadeInTooltipElement(d),this._placeTooltipElement(d,a),b.observe(d,"mouseover",Ink.bindEvent(this._onTooltipMouseOver,this));var e=this._getFloatOpt("timeout");e&&setTimeout(Ink.bind(function(){this.tooltip===d&&this._removeTooltip()},this),1e3*e)},_createTooltipElement:function(){var b=this._getOpt("template"),e=this._getOpt("templatefield"),g,h;if(b){var i=document.createElement("DIV");if(i.innerHTML=a.elOrSelector(b,"options.template").outerHTML,g=i.firstChild,e){if(h=d.select(e,g),!h)throw"options.templatefield must be a valid selector within options.template";h=h[0]}else h=g}else g=document.createElement("DIV"),f.addClassName(g,"ink-tooltip"),f.addClassName(g,this._getOpt("color")),h=document.createElement("DIV"),f.addClassName(h,"content"),g.appendChild(h);return this._getOpt("html")?h.innerHTML=this._getOpt("html"):this._getOpt("text")?c.setTextContent(h,this._getOpt("text")):c.setTextContent(h,this.element.getAttribute("title")),g.style.display="block",g.style.position="absolute",g.style.zIndex=this._getIntOpt("zIndex"),g},_fadeInTooltipElement:function(a){var b=this._getFloatOpt("fade");i&&b&&(a.style.opacity="0",a.style[i]=b+"s",a.style[j]="opacity",a.style[k]="ease-in-out",setTimeout(function(){a.style.opacity="1"},0))},_placeTooltipElement:function(a,b){var d=this._getOpt("where");if("mousemove"===d||"mousefix"===d){var e=b;this._setPos(e[0],e[1]),m.appendChild(a)}else if(d.match(/(up|down|left|right)/)){m.appendChild(a);var g=c.offset(this.element),h=g[0],i=g[1],j=c.elementWidth(this.element)/2-c.elementWidth(a)/2,k=c.elementHeight(this.element)/2-c.elementHeight(a)/2,l=this._getIntOpt("spacing"),n=c.elementDimensions(a),o=c.elementDimensions(this.element),p=c.scrollWidth()+c.viewportWidth(),q=c.scrollHeight()+c.viewportHeight();d=this._getWhereValueInsideViewport(d,{left:h-n[0],right:h+n[0],top:i+n[1],bottom:i+n[1]},{right:p,bottom:q}),"up"===d?(i-=n[1],i-=l,h+=j):"down"===d?(i+=o[1],i+=l,h+=j):"left"===d?(h-=n[0],h-=l,i+=k):"right"===d&&(h+=o[0],h+=l,i+=k);var r=null;d.match(/(up|down|left|right)/)&&(r=document.createElement("SPAN"),f.addClassName(r,"arrow"),f.addClassName(r,this._oppositeDirections[d]),a.appendChild(r));var s=h,t=i,u=t+n[1]-q,v=s+n[0]-p,w=0-s,x=0-t;u>0?(r&&(r.style.top=n[1]/2+u+"px"),t-=u):x>0?(r&&(r.style.top=n[1]/2-x+"px"),t+=x):v>0?(r&&(r.style.left=n[0]/2+v+"px"),s-=v):w>0&&(r&&(r.style.left=n[0]/2-w+"px"),s+=w),a.style.left=s+"px",a.style.top=t+"px"}},_getWhereValueInsideViewport:function(a,b,c){return"left"===a&&b.left<0?"right":"right"===a&&b.right>c.right?"left":"up"===a&&b.top<0?"down":"down"===a&&b.bottom>c.bottom?"up":a},_removeTooltip:function(){var a=this.tooltip;if(a){var b=Ink.bind(c.remove,{},a);"mousemove"!==this._getOpt("where")&&i?(a.style.opacity=0,setTimeout(b,1e3*this._getFloatOpt("fade"))):b(),this.tooltip=null}},_getOpt:function(a){var b=c.data(this.element)[c._camelCase("tip-"+a)];if(b)return b;var d=this.root.options[a];return"undefined"!=typeof d?d:void 0},_getIntOpt:function(a){return parseInt(this._getOpt(a),10)},_getFloatOpt:function(a){return parseFloat(this._getOpt(a),10)},_destroy:function(){this.tooltip&&c.remove(this.tooltip),this.root=null,this.element=null,this.tooltip=null},_onMouseOver:function(a){var b=this._getMousePosition(a),c=this._getFloatOpt("delay");c?this._delayTimeout=setTimeout(Ink.bind(function(){this.tooltip||this._makeTooltip(b),this._delayTimeout=null},this),1e3*c):this._makeTooltip(b)},_onMouseMove:function(a){if("mousemove"===this._getOpt("where")&&this.tooltip){var b=this._getMousePosition(a);this._setPos(b[0],b[1])}},_onMouseOut:function(){this._getIntOpt("forever")||this._removeTooltip(),this._delayTimeout&&(clearTimeout(this._delayTimeout),this._delayTimeout=null)},_onTooltipMouseOver:function(){this.tooltip&&this._removeTooltip()},_setPos:function(a,b){a+=this._getIntOpt("left"),b+=this._getIntOpt("top");var d=this._getPageXY();if(this.tooltip){var e=[c.elementWidth(this.tooltip),c.elementHeight(this.tooltip)],f=this._getScroll();e[0]+a-f[0]>=d[0]-20&&(a=a-e[0]-this._getIntOpt("left")-10),e[1]+b-f[1]>=d[1]-20&&(b=b-e[1]-this._getIntOpt("top")-10),this.tooltip.style.left=a+"px",this.tooltip.style.top=b+"px"}},_getPageXY:function(){var a=0,b=0;return"number"==typeof window.innerWidth?(a=window.innerWidth,b=window.innerHeight):document.documentElement&&(document.documentElement.clientWidth||document.documentElement.clientHeight)?(a=document.documentElement.clientWidth,b=document.documentElement.clientHeight):document.body&&(document.body.clientWidth||document.body.clientHeight)&&(a=document.body.clientWidth,b=document.body.clientHeight),[parseInt(a,10),parseInt(b,10)]},_getScroll:function(){var a=document.documentElement,b=document.body;return a&&(a.scrollLeft||a.scrollTop)?[a.scrollLeft,a.scrollTop]:b?[b.scrollLeft,b.scrollTop]:[0,0]},_getMousePosition:function(a){return[parseInt(b.pointerX(a),10),parseInt(b.pointerY(a),10)]}},g}),Ink.createModule("Ink.UI.TreeView","1",["Ink.UI.Common_1","Ink.Dom.Event_1","Ink.Dom.Css_1","Ink.Dom.Element_1","Ink.Dom.Selector_1","Ink.Util.Array_1"],function(a,b,c,d,e,f){"use strict";var g=function(b,c){this._element=a.elOrSelector(b,"[Ink.UI.TreeView_1]"),this._options=a.options("Treeview",{node:["String","li"],child:["String","ul"],children:["String","ul"],parentClass:["String","parent"],openNodeClass:["String","open"],openClass:["String","icon-minus-sign"],closedClass:["String","icon-plus-sign"],hideClass:["String","hide-all"],iconTag:["String","i"],stopDefault:["Boolean",!0]},c||{},this._element),this._options.child&&(Ink.warn("Ink.UI.TreeView: options.child is being renamed to options.children."),this._options.children=this._options.child),this._init()};return g.prototype={_init:function(){this._handlers={click:Ink.bindEvent(this._onClick,this)},b.on(this._element,"click",this._options.node,this._handlers.click),f.each(Ink.ss(this._options.node,this._element),Ink.bind(function(a){if(this.isParent(a)){c.addClassName(a,this._options.parentClass);var b=this.isOpen(a);this._getIcon(a)||d.create(this._options.iconTag,{insertTop:a}),this._setNodeOpen(a,b)}},this))},_getIcon:function(a){return Ink.s("> "+this._options.iconTag,a)},isOpen:function(a){if(!this._getChild(a))throw new Error("not a node!");return"true"===d.data(a).open||c.hasClassName(a,this._options.openNodeClass)},isParent:function(a){return c.hasClassName(a,this._options.parentClass)||null!=this._getChild(a)},_setNodeOpen:function(a,b){var d=this._getChild(a);if(d){c.setClassName(d,this._options.hideClass,!b);var e=this._getIcon(a);a.setAttribute("data-open",b),c.setClassName(e,this._options.openClass,b),c.setClassName(e,this._options.closedClass,!b),c.setClassName(a,this._options.openNodeClass,b)}else Ink.error("Ink.UI.TreeView: node",a,"is not a node!")},open:function(a){this._setNodeOpen(a,!0)},close:function(a){this._setNodeOpen(a,!1)},toggle:function(a){this.isOpen(a)?this.close(a):this.open(a)},_getChild:function(a){return e.select(this._options.child,a)[0]||null},_onClick:function(a){!this.isParent(a.currentTarget)||e.matchesSelector(a.target,this._options.node)||e.matchesSelector(a.target,this._options.child)||(this._options.stopDefault&&a.preventDefault(),this.toggle(a.currentTarget))}},g}),Ink.createModule("Ink.UI.Upload","1",["Ink.Dom.Event_1","Ink.Dom.Element_1","Ink.Dom.Browser_1","Ink.UI.Common_1"],function(a,b,c,d){"use strict";var e=function(a){this.init(a)};e.prototype={init:function(a){this.options=Ink.extendObj({entry:void 0,maxDepth:10},a||{});try{this._read()}catch(b){Ink.error(b)}},_read:function(){if(!this.options.entry)throw"The entry specify you must";try{this._readDirectories()}catch(a){Ink.error(a)}},_readDirectories:function(){var a=[],b=!1,c=0,d=Ink.bind(function(e){var f=e.createReader();b=!0,f.readEntries(Ink.bind(function(e){if(e.length>0){for(var f=0,g=e.length;g>f;f++)a.push(e[f]),e[f].isDirectory&&(c=this.clearArray(e[f].fullPath.split("/")),c.shift(),c=c.length,c<=this.options.maxDepth&&d(e[f]));this._stopActivityTimeout&&clearTimeout(this._stopActivityTimeout),this._stopActivityTimeout=setTimeout(function(){b=!1},250)}e.length||(b=!1)},this),Ink.bind(function(a){this.options.readError(a,e)},this))},this);d(this.options.entry);var e,f=function(){return b?!1:(clearInterval(e),this.options.readComplete&&"function"==typeof this.options.readComplete&&this.options.readComplete(a),!0)};e=setInterval(Ink.bind(f,this),250)},clearArray:function(a){for(var b=a.length-1;b>=0;b--)("undefined"==typeof a[b]||null===a[b]||""===a[b])&&a.splice(b,1);return a}};var f={lists:[],items:[],create:function(a){var b;return a=String(a),this.lists.push({name:a}),b=this.lists.length-1},getItems:function(a){if(!a)return this.items;for(var b=[],c=0,d=this.items.length;d>c;c++)this.items[c].parentId===a&&b.push(this.items[c]);return b},purge:function(a,b){if("number"!=typeof a||isNaN(Number(a)))return!1;try{for(var c=this.items.length;c>=0;c--)this.items[c]&&a===this.items[c].parentId&&this.remove(this.items[c].parentId,this.items[c].pid);return b||this.lists.splice(a,1),!0}catch(d){return Ink.error("Purge: invalid id"),!1}},add:function(a,b,c){if(!this.lists[a])return!1;"object"!=typeof b&&(b=String(b));var d=parseInt(Math.round(1e5*Math.random())+""+Math.round(1e5*Math.random()),10);return c=c||0,this.items.push({parentId:a,item:b,priority:c||0,pid:d}),d},view:function(a,b){var c=this._searchByPid(a,b);return c===!1?!1:this.items[c]},remove:function(a,b){try{var c=this._searchByPid(a,b);return c===!1?!1:(this.items.splice(c,1),!0)}catch(d){return Ink.error("Remove: invalid id"),!1}},_searchByPid:function(a,b){if(!a&&"boolean"==typeof a||!b)return!1;if(a=parseInt(a,10),b=parseInt(b,10),isNaN(a)||isNaN(b))return!1;for(var c=0,d=this.items.length;d>c;c++)if(this.items[c].parentId===a&&this.items[c].pid===b)return c;return!1}},g=function(a){this.Upload=a,this.init()};g.prototype={init:function(){this._fileButton=this.Upload.options.fileButton,this._dropzone=this.Upload.options.dropzone,this._setDropEvent(),this._setFileButton()},_setDropEvent:function(){for(var a=this._dropzone,b=0,c=a.length;c>b;b++)a[b].ondrop=Ink.bindEvent(this.Upload._dropEventHandler,this.Upload),a[b].ondragleave=Ink.bindEvent(this._onDragLeave,this),a[b].ondragend=Ink.bindEvent(this._onDragEndEventHandler,this),a[b].ondragenter=Ink.bindEvent(this._onDragEnterHandler,this),a[b].ondragover=Ink.bindEvent(this._onDragOverHandler,this)},_onDragEnterHandler:function(a){return a&&a.stopPropagation&&a.stopPropagation(),a&&a.preventDefault&&a.preventDefault(),a&&(a.returnValue=!1),this.Upload.publish("DragEnter",a),!1},_onDragOverHandler:function(a){return a?(a.preventDefault(),a.stopPropagation(),a.returnValue=!1,!0):!1},_onDragLeave:function(a){return this.Upload.publish("DragLeave",a)},_onDragEndEventHandler:function(a){return this.Upload.publish("DragEnd",a)},_setFileButton:function(){var b=this._fileButton;a.observeMulti(b,"change",Ink.bindEvent(this._fileChangeHandler,this))},_fileChangeHandler:function(c){var d=a.element(c),e=d.files,f=b.findUpwardsByTag(d,"form");return e&&window.FormData&&"withCredentials"in new XMLHttpRequest?(this.Upload._addFilesToQueue(e),void(d.value="")):(f.parentNode.submit(),!1)}};var h=function(a){this.Queue=f,this.init(a),this._events={}};return h.prototype={init:function(a){if("string"==typeof a&&(a=b.data(d.elOrSelector(a,"1st argument"))),this.options=Ink.extendObj({extraData:{},fileFormName:"Ink_Filelist",dropzone:void 0,fileButton:void 0,endpoint:"",endpointChunk:"",endpointChunkCommit:"",maxFilesize:300<<20,chunkSize:4194304,minSizeToUseChunks:20971520,INVALID_FILE_NAME:void 0,foldersEnabled:!0,useChunks:!0,directoryMaxDepth:10},a||{}),this._queueId=f.create("Ink_UPLOAD"),this._queueRunning=!1,this._folders={},this.options.dropzone&&d.elOrSelector(this.options.dropzone,"Upload - dropzone"),this.options.fileButton&&d.elOrSelector(this.options.fileButton,"Upload - fileButton"),!this.options.dropzone&&!this.options.fileButton)throw new TypeError("A file button or dropzone, specify you must, my young padawan");this.options.dropzone=Ink.ss(this.options.dropzone),this.options.fileButton=Ink.ss(this.options.fileButton),new g(this)},_supportChunks:function(a){return this.options.useChunks&&"Blob"in window&&(new Blob).slice&&a>this.options.minSizeToUseChunks},_dropEventHandler:function(a){a&&a.stopPropagation&&a.stopPropagation(),a&&a.preventDefault&&a.preventDefault(),a&&(a.returnValue=!1),this.publish("DropComplete",a.dataTransfer);var b=a.dataTransfer;if(!b||!b.files||!b.files.length)return!1;if(this._files=b.files,this._files=Array.prototype.slice.call(this._files||[],0),b.items&&b.items[0]&&b.items[0].webkitGetAsEntry){if(!this.options.foldersEnabled)return setTimeout(Ink.bind(this._addFilesToQueue,this,this._files),0);for(var c,d=[],e=a.dataTransfer.items.length-1;e>=0;e--)c=a.dataTransfer.items[e].webkitGetAsEntry(),c&&c.isDirectory&&(d.push(c),this._files[e].isDirectory=!0,this._files.splice(e,1));this._addFolderToQueue(d,Ink.bind(function(){setTimeout(Ink.bind(this._addFilesToQueue,this,this._files),0)},this))}else setTimeout(Ink.bind(this._addFilesToQueue,this,this._files),0);return!0},_addFolderToQueue:function(a,b){var c=[],d={};if(!a||!a.length)return b(),c;var f=function(a){for(var b=[],c=0,d=a.length;d>c;c++)a[c].isFile&&b.push(a[c]);return b},g=function(a,b){var d;return b=b||0,this._files[b]?"fileentry"!==this._files[b].constructor.name.toLowerCase()?g.apply(this,[a,++b]):void this._files[b].file(Ink.bind(function(c){d=this._files[b].fullPath,this._files[b]=c,this._files[b].hasParent=!0,this._files[b].fullPath||(this._files[b].fullPath=d),g.apply(this,[a,++b])},this),Ink.bind(function(){this._files.splice(b,1),g.apply(this,[a,b])},this)):(a(),c)},h=Ink.bind(function(i){return a[i]?void new e({entry:a[i],maxDepth:this.options.directoryMaxDepth,readComplete:Ink.bind(function(b){if(c=c.concat(f(b)),a[i]&&!(a[i].fullPath in this._folders)){this._folders[a[i].fullPath]={items:b,files:c,length:b.length,created:!1,root:!0};for(var e=0,g=b.length;g>e;e++)b[e].isFile||(b[e].fullPath in d?delete d[b[e].fullPath]:this._folders[b[e].fullPath]={created:!1,root:!1});h(++i)}},this),readError:Ink.bind(function(a,b){d[b.fullPath]={},d[b.fullPath].error=a},this)}):(this._files=this._files.concat(c),g.call(this,b),!1)},this);return h(0),c},_addFilesToQueue:function(a){for(var b,d,e,g=0,h=a.length;h>g;g++)b=a[g],b.isDirectory||null!==b&&(b.type||b.size%4096!==0||c.CHROME&&this.options.foldersEnabled)?b.size>this.options.maxFilesize?this.publish("MaxSizeFailure",b,this.options.maxFilesize):(d=parseInt(Math.round(1e5*Math.random())+""+Math.round(1e5*Math.random()),10),e={id:g,data:b,fileID:d,directory:b.isDirectory},f.add(this._queueId,e),this.publish("FileAddedToQueue",e)):this.publish("InvalidFile",b,"size");this._processQueue(!0),this._files=[]},_processQueue:function(a){if(this._queueRunning)return!1;this.running=0;var b=1,c=0,d,e=f.items.length;this._queueRunning=!0,this.interval=setInterval(Ink.bind(function(){if(f.items.length===c&&0===this.running&&(f.purge(this._queueId,!0),this._queueRunning=!1,clearInterval(this.interval),this.publish("QueueEnd",this._queueId,e)),d=f.getItems(this._queueId),this.runningb.chunk_offset){if(c.response){var e=JSON.parse(c.response),f=b.chunk_offset&&e.offset!==b.chunk_offset+this.options.chunkSize&&b.size!==e.offset;f?(a.cb&&a.cb(),this.publish("ErrorUpload",b,d)):(b.chunk_upload_id=e.upload_id,b.chunk_offset=e.offset,b.chunk_expires=e.expires,this._upload(a))}else a.cb&&a.cb(),this.publish("ErrorUpload",b,d);return c=null}return a.cb&&a.cb(),c.responseText&&c.status<400?this.publish("EndUpload",b,d,c.responseText):this.publish("ErrorUpload",b,d),c=null},this),c.onerror=Ink.bindEvent(function(){a.cb&&a.cb(),this.publish("ErrorUpload",b,d)},this),c.onabort=Ink.bindEvent(function(){a.cb&&a.cb(),this.publish("AbortUpload",b,d,{abortAll:Ink.bind(this.abortAll,this),abortOne:Ink.bind(this.abortOne,this)})},this)},abortAll:function(){return this._queueRunning?(clearInterval(this.interval),this._queueRunning=!1,f.purge(this._queueId,!0),!0):!1},abortOne:function(a,b){for(var c=f.getItems(0),d,e=0,g=c.length;g>e;e++)if(c[e].item.fileID===a)return d={id:c[e].item.fileID,name:c[e].item.data.name,size:c[e].item.data.size,hasParent:c[e].item.data.hasParent},f.remove(0,c[e].pid),b&&b(d),!0;return!1},subscribe:function(a,b){return this._events[a]||(this._events[a]=[]),this._events[a].push(b),this._events[a]},publish:function(a){var b=this._events[a],c=Array.prototype.slice.call(arguments||[],0);if(b)for(var d=0,e=b.length;e>d;d++)try{b[d].apply(this,c.splice(1,c.length))}catch(f){Ink.error(a+": "+f)}}},h}),Ink.createModule("Ink.Util.Array","1",[],function(){"use strict";var a=Array.prototype,b={inArray:function(a,b){if("object"==typeof b)for(var c=0,d=b.length;d>c;++c)if(b[c]===a)return!0;return!1},sortMulti:function(a,b){if("undefined"==typeof a||a.constructor!==Array)return!1;if("string"!=typeof b)return a.sort();if(a.length>0){if("undefined"==typeof a[0][b])return!1;a.sort(function(a,c){var d=a[b],e=c[b];return e>d?-1:d>e?1:0})}return a},keyValue:function(a,b,c){if("undefined"!=typeof a&&"object"==typeof b&&this.inArray(a,b)){for(var d=[],e=0,f=b.length;f>e;++e)if(b[e]===a){if("undefined"!=typeof c&&c===!0)return e;d.push(e)}return d}return!1},shuffle:function(a){if("undefined"!=typeof a&&a.constructor!==Array)return!1;for(var b=a.length,c=!1,d=!1;b--;)d=Math.floor(Math.random()*(b+1)),c=a[b],a[b]=a[d],a[d]=c;return a},forEach:function(b,c,d){if(a.forEach)return a.forEach.call(b,c,d);for(var e=0,f=b.length>>>0;f>e;e++)c.call(d,b[e],e,b)},each:function(){b.forEach.apply(b,[].slice.call(arguments))},map:function(b,c,d){if(a.map)return a.map.call(b,c,d);for(var e=new Array(g),f=0,g=b.length>>>0;g>f;f++)e[f]=c.call(d,b[f],f,b);return e},filter:function(b,c,d){if(a.filter)return a.filter.call(b,c,d);for(var e=[],f=null,g=0,h=b.length;h>g;g++)f=b[g],c.call(d,f,g,b)&&e.push(f);return e},some:function(a,b,c){if(null===a)throw new TypeError("First argument is invalid.");var d=Object(a),e=d.length>>>0;if("function"!=typeof b)throw new TypeError("Second argument must be a function.");for(var f=0;e>f;f++)if(f in d&&b.call(c,d[f],f,d))return!0;return!1},intersect:function(a,b){if(!a||!b||a instanceof Array==!1||b instanceof Array==!1)return[];for(var c=[],d=0,e=a.length;e>d;++d)for(var f=0,g=b.length;g>f;++f)a[d]===b[f]&&c.push(a[d]);return c},convert:function(b){return a.slice.call(b||[],0)},insert:function(a,b,c){a.splice(b,0,c)},remove:function(a,b,c){for(var d=[],e=0,f=a.length;f>e;e++)e>=b&&b+c>e||d.push(a[e]);return d}};return b}),Ink.createModule("Ink.Util.BinPack","1",[],function(){"use strict";var a=function(a,b){this.init(a,b)};a.prototype={init:function(a,b){this.root={x:0,y:0,w:a,h:b}},fit:function(a){var b,c,d;for(b=0;b0?a[0].w:0,g=e>0?a[0].h:0;for(this.root={x:0,y:0,w:f,h:g},b=0;e>b;b++)d=a[b],d.fit=(c=this.findNode(this.root,d.w,d.h))?this.splitNode(c,d.w,d.h):this.growNode(d.w,d.h)},findNode:function(a,b,c){return a.used?this.findNode(a.right,b,c)||this.findNode(a.down,b,c):b<=a.w&&c<=a.h?a:null},splitNode:function(a,b,c){return a.used=!0,a.down={x:a.x,y:a.y+c,w:a.w,h:a.h-c},a.right={x:a.x+b,y:a.y,w:a.w-b,h:c},a},growNode:function(a,b){var c=a<=this.root.w,d=b<=this.root.h,e=d&&this.root.h>=this.root.w+a,f=c&&this.root.w>=this.root.h+b;return e?this.growRight(a,b):f?this.growDown(a,b):d?this.growRight(a,b):c?this.growDown(a,b):null},growRight:function(a,b){this.root={used:!0,x:0,y:0,w:this.root.w+a,h:this.root.h,down:this.root,right:{x:this.root.w,y:0,w:a,h:this.root.h}};var c;return(c=this.findNode(this.root,a,b))?this.splitNode(c,a,b):null},growDown:function(a,b){this.root={used:!0,x:0,y:0,w:this.root.w,h:this.root.h+b,down:{x:0,y:this.root.h,w:this.root.w,h:b},right:this.root};var c;return(c=this.findNode(this.root,a,b))?this.splitNode(c,a,b):null}};var c={random:function(){return Math.random()-.5},w:function(a,b){return b.w-a.w},h:function(a,b){return b.h-a.h},a:function(a,b){return b.area-a.area},max:function(a,b){return Math.max(b.w,b.h)-Math.max(a.w,a.h)},min:function(a,b){return Math.min(b.w,b.h)-Math.min(a.w,a.h)},height:function(a,b){return c.msort(a,b,["h","w"])},width:function(a,b){return c.msort(a,b,["w","h"])},area:function(a,b){return c.msort(a,b,["a","h","w"])},maxside:function(a,b){return c.msort(a,b,["max","min","h","w"])},msort:function(a,b,d){var e,f;for(f=0;ff;++f)h=e.blocks[f],"area"in h||(h.area=h.w*h.h);var i=e.dimensions?new a(e.dimensions[0],e.dimensions[1]):new b;e.sorter||(e.sorter="maxside"),e.blocks.sort(c[e.sorter]),i.fit(e.blocks);var j=[i.root.w,i.root.h],k=[],l=[];for(f=0,g=e.blocks.length;g>f;++f)h=e.blocks[f],h.fit?k.push(h):(h.toString=d,l.push(h));var m=j[0]*j[1],n=0;for(f=0,g=k.length;g>f;++f)h=k[f],n+=h.area;return{dimensions:j,filled:n/m,blocks:e.blocks,fitted:k,unfitted:l}}};return e}),Ink.createModule("Ink.Util.Cookie","1",[],function(){"use strict";var a={get:function(a){var b=document.cookie||!1,c={};if(b){b=b.replace(new RegExp("; ","g"),";");var d=b.split(";"),e=[];if(d.length>0)for(var f=0;f1?k:"0"+k;break;case"D":d[j]=this._wDays(f.getDay()).substring(0,3);break;case"j":d[j]=f.getDate();break;case"l":d[j]=this._wDays(f.getDay());break;case"N":d[j]=f.getDay()||7;break;case"S":var l=f.getDate(),m=["st","nd","rd"],n="";d[j]=l>=11&&13>=l?"th":(n=m[String(l).substr(-1)-1])?n:"th";break;case"w":d[j]=f.getDay();break;case"z":g=Date.UTC(f.getFullYear(),0,0),h=Date.UTC(f.getFullYear(),f.getMonth(),f.getDate()),d[j]=Math.floor((h-g)/864e5);break;case"W":var o=new Date(f.getFullYear(),0,1);g=o.getDay()||7;var p=Math.floor((f-o)/864e5+1);d[j]=Math.ceil((p-(8-g))/7)+1;break;case"F":d[j]=this._months(f.getMonth());break;case"m":var q=String(f.getMonth()+1);d[j]=q.length>1?q:"0"+q;break;case"M":d[j]=this._months(f.getMonth()).substring(0,3);break;case"n":d[j]=f.getMonth()+1;break;case"t":d[j]=this._daysInMonth(f.getMonth()+1,f.getYear());break;case"L":var r=f.getFullYear();d[j]=r%4?!1:r%100?!0:r%400?!1:!0;break;case"o":throw'"o" not implemented!';case"Y":d[j]=f.getFullYear();break;case"y":d[j]=String(f.getFullYear()).substring(2);break;case"a":d[j]=f.getHours()<12?"am":"pm";break;case"A":d[j]=f.getHours<12?"AM":"PM";break;case"B":throw'"B" not implemented!';case"g":i=f.getHours(),d[j]=12>=i?i:i-12;break;case"G":d[j]=String(f.getHours());break;case"h":i=String(f.getHours()),i=12>=i?i:i-12,d[j]=i.length>1?i:"0"+i;break;case"H":i=String(f.getHours()),d[j]=i.length>1?i:"0"+i;break;case"i":var s=String(f.getMinutes());d[j]=s.length>1?s:"0"+s;break;case"s":var t=String(f.getSeconds());d[j]=t.length>1?t:"0"+t;break;case"u":throw'"u" not implemented!';case"e":throw'"e" not implemented!';case"I":g=new Date(f.getFullYear(),0,1),d[j]=f.getTimezoneOffset()!==g.getTimezoneOffset()?1:0;break;case"O":var u=f.getTimezoneOffset(),v=u%60;i=String((u-v)/60*-1),"-"!==i.charAt(0)&&(i="+"+i),i=3===i.length?i:i.replace(/([+\-])(\d)/,"$10$2"),d[j]=i+v+"0";break;case"P":throw'"P" not implemented!';case"T":throw'"T" not implemented!';case"Z":d[j]=60*f.getTimezoneOffset();break;case"c":throw'"c" not implemented!';case"r":var w=this._wDays(f.getDay()).substr(0,3),x=this._months(f.getMonth()).substr(0,3);d[j]=w+", "+f.getDate()+" "+x+this.get(" Y H:i:s O",f);break;case"U":d[j]=Math.floor(f.getTime()/1e3);break;default:d[j]=c[j]}return d.join("")},set:function(a,b){if("undefined"!=typeof b){("undefined"==typeof a||""===a)&&(a="Y-m-d"); +for(var c=a.split(""),d=new Array(c.length),e="\\",f,g={year:void 0,month:void 0,day:void 0,dayY:void 0,dayW:void 0,week:void 0,hour:void 0,hourD:void 0,min:void 0,sec:void 0,msec:void 0,ampm:void 0,diffM:void 0,diffH:void 0,date:void 0},h=0,i=0;i=S.slice(2)?0:1)+M)}else M=L.getFullYear();if(n)N=0,O=f[g.dayY.match+1];else if(o)N=p?this._iMonth(f[g.month.match+1]):L.getMonth(),O=f[g.day.match+1];else{N=0;var T;T=t?f[g.week.match+1]:this.get("W",L),O=7*(T-2)+(8-(new Date(M,0,1).getDay()||7))+this._iWeek(f[g.week.match+1])}if(0===N&&O>31){var U=new Date(M,N,O);N=U.getMonth(),O=U.getDate()}}else M=L.getFullYear(),N=L.getMonth(),O=L.getDate();return I=y?+f[g.hourD.match+1]+("pm"===f[g.ampm.match+1]?12:0):z?f[g.hour.match+1]:x?L.getHours():"00",J=B?f[g.min.match+1]:E?"00":L.getMinutes(),P=C?f[g.sec.match+1]:F?"00":L.getSeconds(),Q=D?f[g.msec.match+1]:"000",R=H?f[g.diffH.match+1]:G?String(-1*f[g.diffM.match+1]/60*100).replace(/^(\d)/,"+$1").replace(/(^[\-+])(\d{3}$)/,"$10$2"):"+0000",new Date(M,N,O,I,J,P)}}}};return a}),Ink.createModule("Ink.Util.Dumper","1",[],function(){"use strict";var a={_tab:"    ",_formatParam:function(a){var b="";switch(typeof a){case"string":b="(string) "+a;break;case"number":b="(number) "+a;break;case"boolean":b="(boolean) "+a;break;case"object":b=null!==a?a.constructor===Array?"Array \n{\n"+this._outputFormat(a,0)+"\n}":"Object \n{\n"+this._outputFormat(a,0)+"\n}":"null";break;default:b=!1}return b},_getTabs:function(a){for(var b="",c=0;a>c;c++)b+=this._tab;return b},_outputFormat:function(a,b){var c="",d=!1;for(var e in a)if(null!==a[e])if("object"!=typeof a[e]||a[e].constructor!==Array&&a[e].constructor!==Object){if(a[e].constructor===Function)continue;c=c+this._tab+this._getTabs(b)+"["+e+"] => "+a[e]+"\n"}else a[e].constructor===Array?d="Array":a[e].constructor===Object&&(d="Object"),c+=this._tab+this._getTabs(b)+"["+e+"] => "+d+"\n",c+=this._tab+this._getTabs(b)+"{\n",c+=this._outputFormat(a[e],b+1)+this._tab+this._getTabs(b)+"}\n";else c=c+this._tab+this._getTabs(b)+"["+e+"] => null \n";return c},printDump:function(a,b){if(b&&"undefined"!=typeof b)if("string"==typeof b)document.getElementById(b).innerHTML="
      "+this._formatParam(a)+"
      ";else{if("object"!=typeof b)throw"TARGET must be an element or an element ID";b.innerHTML="
      "+this._formatParam(a)+"
      "}else document.write("
      "+this._formatParam(a)+"
      ")},returnDump:function(a){return this._formatParam(a)},alertDump:function(a){window.alert(this._formatParam(a).replace(/()(Array|Object)(<\/b>)/g,"$2"))},windowDump:function(a){var b="dumperwindow_"+1e4*Math.random(),c=window.open("",b,"width=400,height=300,left=50,top=50,status,menubar,scrollbars,resizable");c.document.open(),c.document.write("
      "+this._formatParam(a)+"
      "),c.document.close(),c.focus()}};return a}),Ink.createModule("Ink.Util.I18n","1",[],function(){"use strict";var a=/\{(?:(\{.*?})|(?:%s:)?(\d+)|(?:%s)?|([\w-]+))}/g,b=function(a,b){return"function"==typeof a?a.apply(this,b):void 0!==typeof a?a:""},c=function(a,b,d){return this instanceof c?void this.reset().lang(b).testMode(d).append(a||{},b):new c(a,b,d)};return c.prototype={reset:function(){return this._dicts=[],this._dict={},this._testMode=!1,this._lang=this._gLang,this},append:function(a){return this._dicts.push(a),this._dict=Ink.extendObj(this._dict,a[this._lang]),this},lang:function(a){if(!arguments.length)return this._lang;if(a&&this._lang!==a){this._lang=a,this._dict={};for(var b=0,c=this._dicts.length;c>b;b++)this._dict=Ink.extendObj(this._dict,this._dicts[b][a]||{})}return this},testMode:function(a){return arguments.length?(void 0!==a&&(this._testMode=!!a),this):!!this._testMode},getKey:function(a){var b,d=this._gLang,e=this._lang;return a in this._dict?b=this._dict[a]:(c.lang(e),b=this._gDict[a],c.lang(d)),b},text:function(c){if("string"==typeof c){var d=Array.prototype.slice.call(arguments,1),e=0,f="object"==typeof d[0],g=this.getKey(c);return void 0===g&&(g=this._testMode?"["+c+"]":c),"number"==typeof g&&(g+=""),"string"==typeof g?g=g.replace(a,function(a,c,g,h){var i=c?c:g?d[g-(f?0:1)]:h?d[0][h]||"":d[e++ +(f?1:0)];return b(i,[e].concat(d))}):"function"==typeof g?g.apply(this,d):g instanceof Array?b(g[d[0]],d):"object"==typeof g?b(g[d[0]],d):""}},ntext:function(a,b,c){var d=Array.prototype.slice.apply(arguments),e;if(2===d.length&&"number"==typeof b){if(e=this.getKey(a),!(e instanceof Array))return"";d.splice(0,1),e=e[1===b?0:1]}else d.splice(0,2),e=1===c?a:b;return this.text.apply(this,[e].concat(d))},ordinal:function(a){if(void 0===a)return"";var c=+a.toString().slice(-1),d=this.getKey("_ordinals");if(void 0===d)return"";if("string"==typeof d)return d;var e;return"function"==typeof d&&(e=d(a,c),"string"==typeof e)?e:"exceptions"in d&&(e="function"==typeof d.exceptions?d.exceptions(a,c):a in d.exceptions?b(d.exceptions[a],[a,c]):void 0,"string"==typeof e)?e:"byLastDigit"in d&&(e="function"==typeof d.byLastDigit?d.byLastDigit(c,a):c in d.byLastDigit?b(d.byLastDigit[c],[c,a]):void 0,"string"==typeof e)?e:"default"in d&&(e=b(d["default"],[a,c]),"string"==typeof e)?e:""},alias:function(){var a=Ink.bind(c.prototype.text,this);return a.ntext=Ink.bind(c.prototype.ntext,this),a.append=Ink.bind(c.prototype.append,this),a.ordinal=Ink.bind(c.prototype.ordinal,this),a.testMode=Ink.bind(c.prototype.testMode,this),a}},c.reset=function(){c.prototype._gDicts=[],c.prototype._gDict={},c.prototype._gLang="pt_PT"},c.reset(),c.append=function(a,b){if(b){if(!(b in a)){var d={};d[b]=a,a=d}b!==c.prototype._gLang&&c.lang(b)}c.prototype._gDicts.push(a),Ink.extendObj(c.prototype._gDict,a[c.prototype._gLang])},c.lang=function(a){if(!arguments.length)return c.prototype._gLang;if(a&&c.prototype._gLang!==a){c.prototype._gLang=a,c.prototype._gDict={};for(var b=0,d=c.prototype._gDicts.length;d>b;b++)Ink.extendObj(c.prototype._gDict,c.prototype._gDicts[b][a]||{})}},c}),Ink.createModule("Ink.Util.Json","1",[],function(){"use strict";var function_call=Function.prototype.call,cx=/[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g;function twoDigits(a){var b=""+a;return 1===b.length?"0"+b:b}var dateToISOString=Date.prototype.toISOString?Ink.bind(function_call,Date.prototype.toISOString):function(a){return a.getUTCFullYear()+"-"+twoDigits(a.getUTCMonth()+1)+"-"+twoDigits(a.getUTCDate())+"T"+twoDigits(a.getUTCHours())+":"+twoDigits(a.getUTCMinutes())+":"+twoDigits(a.getUTCSeconds())+"."+String((a.getUTCMilliseconds()/1e3).toFixed(3)).slice(2,5)+"Z"},InkJson={_nativeJSON:window.JSON||null,_convertToUnicode:!1,_escape:function(a){var b={"\b":"\\b"," ":"\\t","\n":"\\n","\f":"\\f","\r":"\\r",'"':'\\"',"\\":"\\\\"};return/["\\\x00-\x1f]/.test(a)&&(a=a.replace(/([\x00-\x1f\\"])/g,function(a,c){var d=b[c];return d?d:(d=c.charCodeAt(),"\\u00"+Math.floor(d/16).toString(16)+(d%16).toString(16))})),a},_toUnicode:function(a){if(this._convertToUnicode){for(var b="",c=!1,d=!1,e=0,f=a.length;f>e;){if(c=a.charCodeAt(e),c>=32&&126>=c||8===c||9===c||10===c||12===c||13===c||32===c||34===c||47===c||58===c||92===c)d=34===c||92===c||47===c?"\\"+a.charAt(e):8===c?"\\b":9===c?"\\t":10===c?"\\n":12===c?"\\f":13===c?"\\r":a.charAt(e);else if(this._convertToUnicode){for(d=a.charCodeAt(e).toString(16)+"".toUpperCase();d.length<4;)d="0"+d;d="\\u"+d}else d=a.charAt(e);b+=d,e++}return b}return this._escape(a)},_stringifyValue:function(a){if("string"==typeof a)return'"'+this._toUnicode(a)+'"';if("number"!=typeof a||!isNaN(a)&&isFinite(a)){if("undefined"==typeof a||null===a)return"null";if("function"==typeof a.toJSON){var b=a.toJSON();return"string"==typeof b?'"'+this._escape(b)+'"':this._escape(b.toString())}if("number"==typeof a||"boolean"==typeof a)return""+a;if("function"==typeof a)return"null";if(a.constructor===Date)return'"'+this._escape(dateToISOString(a))+'"';if(a.constructor===Array){for(var c="",d=0,e=a.length;e>d;d++)d>0&&(c+=","),c+=this._stringifyValue(a[d]);return"["+c+"]"}var f="";for(var g in a)({}).hasOwnProperty.call(a,g)&&(""!==f&&(f+=","),f+='"'+this._escape(g)+'": '+this._stringifyValue(a[g]));return"{"+f+"}"}return"null"},stringify:function(a,b){return this._convertToUnicode=!!b,!this._convertToUnicode&&this._nativeJSON?this._nativeJSON.stringify(a):this._stringifyValue(a)},parse:function(text,reviver){var j;function walk(a,b){var c,d,e=a[b];if(e&&"object"==typeof e)for(c in e)Object.prototype.hasOwnProperty.call(e,c)&&(d=walk(e,c),void 0!==d?e[c]=d:delete e[c]);return reviver.call(a,b,e)}if(text=String(text),cx.lastIndex=0,cx.test(text)&&(text=text.replace(cx,function(a){return"\\u"+("0000"+a.charCodeAt(0).toString(16)).slice(-4)})),/^[\],:{}\s]*$/.test(text.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,"@").replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,"]").replace(/(?:^|:|,)(?:\s*\[)+/g,"")))return j=eval("("+text+")"),"function"==typeof reviver?walk({"":j},""):j;throw new SyntaxError("JSON.parse")}};return InkJson}),Ink.createModule("Ink.Util.String","1",[],function(){"use strict";var InkUtilString={_chars:["&","à","á","â","ã","ä","å","æ","ç","è","é","ê","ë","ì","í","î","ï","ð","ñ","ò","ó","ô","õ","ö","ø","ù","ú","û","ü","ý","þ","ÿ","À","Á","Â","Ã","Ä","Å","Æ","Ç","È","É","Ê","Ë","Ì","Í","Î","Ï","Ð","Ñ","Ò","Ó","Ô","Õ","Ö","Ø","Ù","Ú","Û","Ü","Ý","Þ","€",'"',"ß","<",">","¢","£","¤","¥","¦","§","¨","©","ª","«","¬","­","®","¯","°","±","²","³","´","µ","¶","·","¸","¹","º","»","¼","½","¾"],_entities:["amp","agrave","aacute","acirc","atilde","auml","aring","aelig","ccedil","egrave","eacute","ecirc","euml","igrave","iacute","icirc","iuml","eth","ntilde","ograve","oacute","ocirc","otilde","ouml","oslash","ugrave","uacute","ucirc","uuml","yacute","thorn","yuml","Agrave","Aacute","Acirc","Atilde","Auml","Aring","AElig","Ccedil","Egrave","Eacute","Ecirc","Euml","Igrave","Iacute","Icirc","Iuml","ETH","Ntilde","Ograve","Oacute","Ocirc","Otilde","Ouml","Oslash","Ugrave","Uacute","Ucirc","Uuml","Yacute","THORN","euro","quot","szlig","lt","gt","cent","pound","curren","yen","brvbar","sect","uml","copy","ordf","laquo","not","shy","reg","macr","deg","plusmn","sup2","sup3","acute","micro","para","middot","cedil","sup1","ordm","raquo","frac14","frac12","frac34"],_accentedChars:["à","á","â","ã","ä","å","è","é","ê","ë","ì","í","î","ï","ò","ó","ô","õ","ö","ù","ú","û","ü","ç","ñ","À","Á","Â","Ã","Ä","Å","È","É","Ê","Ë","Ì","Í","Î","Ï","Ò","Ó","Ô","Õ","Ö","Ù","Ú","Û","Ü","Ç","Ñ"],_accentedRemovedChars:["a","a","a","a","a","a","e","e","e","e","i","i","i","i","o","o","o","o","o","u","u","u","u","c","n","A","A","A","A","A","A","E","E","E","E","I","I","I","I","O","O","O","O","O","U","U","U","U","C","N"],_htmlUnsafeChars:{"<":"<",">":">","&":"&",'"':""","'":"'"},ucFirst:function(a,b){var c=b?/(^|\s)(\w)(\S{2,})/:/(^|\s)(\w)(\S{2,})/g;return a?String(a).replace(c,function(a,b,c,d){return b+c.toUpperCase()+d.toLowerCase()}):a},trim:function(a){return"string"==typeof a?a.replace(/^\s+|\s+$|\n+$/g,""):a},stripTags:function(a,b){if(b&&"string"==typeof b){for(var c=InkUtilString.trim(b).split(","),d=[],e=!1,f=0;f)/g,"").replace(/\s/,"")),d.push("(<"+e+"\\s[^>]+>|<(\\s|\\/)?(\\s|\\/)?"+e+">)"));for(var g=d.join("|"),h=new RegExp(g,"i"),i=a.match(new RegExp("<[^>]*>","g")),j=0;j]+\>/g,"")},htmlEntitiesEncode:function(a){if(a&&a.replace)for(var b=!1,c=0;cd?b+=String.fromCharCode(d):d>127&&2048>d?(b+=String.fromCharCode(d>>6|192),b+=String.fromCharCode(63&d|128)):(b+=String.fromCharCode(d>>12|224),b+=String.fromCharCode(d>>6&63|128),b+=String.fromCharCode(63&d|128))}return b},shortString:function(a,b){for(var c=a.split(" "),d="",e=0;e=b){d+="…";break}d+=c[e]+" "}return d},truncateString:function(a,b){return a.length-1>b?a.substr(0,b-1)+"…":a},utf8Decode:function(a){for(var b="",c=0,d=0,e=0,f=0;cd?(b+=String.fromCharCode(d),c++):d>191&&224>d?(e=a.charCodeAt(c+1),b+=String.fromCharCode((31&d)<<6|63&e),c+=2):(e=a.charCodeAt(c+1),f=a.charCodeAt(c+2),b+=String.fromCharCode((15&d)<<12|(63&e)<<6|63&f),c+=3);return b},removeAccentedChars:function(a){for(var b=a,c=!1,d=0;d&'"]/g,function(a){return b[a]}):a},normalizeWhitespace:function(a){return null!==a?InkUtilString.trim(String(a).replace(/\s+/g," ")):a},toUnicode:function(a){if("string"==typeof a){for(var b="",c=!1,d=!1,e=a.length,f=0;e>f;){if(c=a.charCodeAt(f),c>=32&&126>=c||8===c||9===c||10===c||12===c||13===c||32===c||34===c||47===c||58===c||92===c)d=8===c?"\\b":9===c?"\\t":10===c?"\\n":12===c?"\\f":13===c?"\\r":a.charAt(f);else{for(d=a.charCodeAt(f).toString(16)+"".toUpperCase();d.length<4;)d="0"+d;d="\\u"+d}b+=d,f++}return b}},escape:function(a){var b=a.charCodeAt(0).toString(16).split("");if(b.length<3){for(;b.length<2;)b.unshift("0");b.unshift("x")}else{for(;b.length<4;)b.unshift("0");b.unshift("u")}return b.unshift("\\"),b.join("")},unescape:function(a){var b=a.lastIndexOf("0");b=-1===b?2:Math.min(b,2);var c=a.substring(b),d=parseInt(c,16);return String.fromCharCode(d)},escapeText:function(a,b){void 0===b&&(b=["[","]","'",","]);for(var c=[],d,e,f=0,g=a.length;g>f;++f)d=a[f],e=d.charCodeAt(0),(32>e||e>126&&-1===b.indexOf(d))&&(d=InkUtilString.escape(d)),c.push(d);return c.join("")},escapedCharRegex:/(\\x[0-9a-fA-F]{2})|(\\u[0-9a-fA-F]{4})/g,unescapeText:function(a){for(var b;b=InkUtilString.escapedCharRegex.exec(a);)b=b[0],a=a.replace(b,InkUtilString.unescape(b)),InkUtilString.escapedCharRegex.lastIndex=0;return a},strcmp:function(a,b){return a===b?0:a>b?1:-1},packetize:function(a,b){for(var c=a.length,d=new Array(Math.ceil(c/b)),e=a.split(""),f,g=0;c;)f=Math.min(b,c),d[g++]=e.splice(0,f).join(""),c-=f;return d}};return InkUtilString}),Ink.createModule("Ink.Util.Url","1",[],function(){"use strict";var a={_keyStr:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",getUrl:function(){return window.location.href},genQueryString:function(a,b){var c=-1!==a.indexOf("?"),d,e,f,g=[a];for(e in b)b.hasOwnProperty(e)&&(c?d="&":(d="?",c=!0),f=b[e],"number"==typeof f||f||(f=""),g=g.concat([d,encodeURIComponent(e),"=",encodeURIComponent(f)]));return g.join("")},getQueryString:function(a){var b;b=a&&"undefined"!=typeof a?a:this.getUrl();var c={};if(b.match(/\?(.+)/i)){var d=b.replace(/^(.*)\?([^\#]+)(\#(.*))?/g,"$2");if(d.length>0)for(var e=d.split(/[;&]/),f=0;f0)for(var e=d.split(/[;&]/),f=0;f0?b[b.length-1]:!1;for(var c=!1,d=new RegExp(""+a,"i"),e=0,f=b.length;f>e;e++)if(c=b[e],d.test(c.src))return c;return!1},_debug:function(){}};return a}),Ink.createModule("Ink.Util.Validator","1",[],function(){"use strict";var a={_countryCodes:["AO","CV","MZ","PT"],_internacionalPT:351,_indicativosPT:{21:"lisboa",22:"porto",231:"mealhada",232:"viseu",233:"figueira da foz",234:"aveiro",235:"arganil",236:"pombal",238:"seia",239:"coimbra",241:"abrantes",242:"ponte de sôr",243:"santarém",244:"leiria",245:"portalegre",249:"torres novas",251:"valença",252:"vila nova de famalicão",253:"braga",254:"peso da régua",255:"penafiel",256:"são joão da madeira",258:"viana do castelo",259:"vila real",261:"torres vedras",262:"caldas da raínha",263:"vila franca de xira",265:"setúbal",266:"évora",268:"estremoz",269:"santiago do cacém",271:"guarda",272:"castelo branco",273:"bragança",274:"proença-a-nova",275:"covilhã",276:"chaves",277:"idanha-a-nova",278:"mirandela",279:"moncorvo",281:"tavira",282:"portimão",283:"odemira",284:"beja",285:"moura",286:"castro verde",289:"faro",291:"funchal, porto santo",292:"corvo, faial, flores, horta, pico",295:"angra do heroísmo, graciosa, são jorge, terceira",296:"ponta delgada, são miguel, santa maria",91:"rede móvel 91 (Vodafone / Yorn)",93:"rede móvel 93 (Optimus)",96:"rede móvel 96 (TMN)",92:"rede móvel 92 (TODOS)",707:"número único",760:"número único",800:"número grátis",808:"chamada local",30:"voip"},_internacionalCV:238,_indicativosCV:{2:"fixo",91:"móvel 91",95:"móvel 95",97:"móvel 97",98:"móvel 98",99:"móvel 99"},_internacionalAO:244,_indicativosAO:{2:"fixo",91:"móvel 91",92:"móvel 92"},_internacionalMZ:258,_indicativosMZ:{2:"fixo",82:"móvel 82",84:"móvel 84"},_internacionalTL:670,_indicativosTL:{3:"fixo",7:"móvel 7"},_characterGroups:{numbers:["0-9"],asciiAlpha:["a-zA-Z"],latin1Alpha:["a-zA-Z","À-ÿ"],unicodeAlpha:["a-zA-Z","À-ÿ","Ā-῿","Ⰰ-퟿"],space:[" "],dash:["-"],underscore:["_"],nicknamePunctuation:["_.-"],singleLineWhitespace:[" "],newline:["\n"],whitespace:[" \n \f\r  "],asciiPunctuation:["!-/",":-@","[-`","{-~"],latin1Punctuation:["!-/",":-@","[-`","{-~","¡-¿","×","÷"],unicodePunctuation:["!-/",":-@","[-`","{-~","¡-¿","×","÷"," -","⸀-⹿"," -〿"]},createRegExp:function(b){var c="^[";for(var d in b)if(b.hasOwnProperty(d)){if(!(d in a._characterGroups))throw new Error("group "+d+" is not a valid character group");b[d]&&(c+=a._characterGroups[d].join(""))}return new RegExp(c+"]*?$")},checkCharacterGroups:function(b,c){return a.createRegExp(c).test(b)},unicode:function(b,c){return a.checkCharacterGroups(b,Ink.extendObj({unicodeAlpha:!0},c))},latin1:function(b,c){return a.checkCharacterGroups(b,Ink.extendObj({latin1Alpha:!0},c))},ascii:function(b,c){return a.checkCharacterGroups(b,Ink.extendObj({asciiAlpha:!0},c))},number:function(b,c){b+="";var d=Ink.extendObj({decimalSep:".",thousandSep:"",negative:!0,decimalPlaces:null,maxDigits:null,max:null,min:null,returnNumber:!1},c||{});if(d.thousandSep)return b=b.replace(new RegExp("\\"+d.thousandSep,"g"),""),d.thousandSep="",a.number(b,d);if(d.negative===!1)return d.min=0,d.negative=!0,a.number(b,d);if("."!==d.decimalSep&&(b=b.replace(new RegExp("\\"+d.decimalSep,"g"),".")),!/^(-)?(\d+)?(\.\d+)?$/.test(b)||""===b)return!1;var e;if(d.decimalSep&&-1!==b.indexOf(d.decimalSep)){if(e=b.split(d.decimalSep),null!==d.decimalPlaces&&e[1].length>d.decimalPlaces)return!1}else e=[""+b,""];if(null!==d.maxDigits&&e[0].replace(/-/g,"").length>d.maxDigits)return e;var f=parseFloat(b);return null!==d.maxExcl&&f>=d.maxExcl||null!==d.minExcl&&f<=d.minExcl?!1:null!==d.max&&f>d.max||null!==d.min&&f=1&&12>=b&&c>=1&&this._daysInMonth(b,a)>=c?!0:!1},email:function(a){var b=new RegExp("^[_a-z0-9-]+((\\.|\\+)[_a-z0-9-]+)*@([\\w]*-?[\\w]*\\.)+[a-z]{2,4}$","i");return b.test(a)?!0:!1},mail:function(b){return a.email(b)},url:function(a,b){if("undefined"==typeof b||b===!1){var c=new RegExp("(^(http\\:\\/\\/|https\\:\\/\\/)(.+))","i");c.test(a)===!1&&(a="http://"+a)}var d=new RegExp("^(http:\\/\\/|https:\\/\\/)([\\w]*(-?[\\w]*)*\\.)+[a-z]{2,4}","i");return d.test(a)===!1?!1:!0},isPTPhone:function(a){a=a.toString();var b=[];for(var c in this._indicativosPT)"string"==typeof this._indicativosPT[c]&&b.push(c);var d=b.join("|"),e=/^(00351|\+351)/;e.test(a)&&(a=a.replace(e,""));var f=/(\s|\-|\.)+/g;a=a.replace(f,"");var g=/[\d]{9}/i;if(9===a.length&&g.test(a)){var h=new RegExp("^("+d+")");if(h.test(a))return!0}return!1},isPortuguesePhone:function(a){return this.isPTPhone(a)},isCVPhone:function(a){a=a.toString();var b=[];for(var c in this._indicativosCV)"string"==typeof this._indicativosCV[c]&&b.push(c);var d=b.join("|"),e=/^(00238|\+238)/;e.test(a)&&(a=a.replace(e,""));var f=/(\s|\-|\.)+/g;a=a.replace(f,"");var g=/[\d]{7}/i;if(7===a.length&&g.test(a)){var h=new RegExp("^("+d+")");if(h.test(a))return!0}return!1},isAOPhone:function(a){a=a.toString();var b=[];for(var c in this._indicativosAO)"string"==typeof this._indicativosAO[c]&&b.push(c);var d=b.join("|"),e=/^(00244|\+244)/;e.test(a)&&(a=a.replace(e,""));var f=/(\s|\-|\.)+/g;a=a.replace(f,"");var g=/[\d]{9}/i;if(9===a.length&&g.test(a)){var h=new RegExp("^("+d+")");if(h.test(a))return!0}return!1},isMZPhone:function(a){a=a.toString();var b=[];for(var c in this._indicativosMZ)"string"==typeof this._indicativosMZ[c]&&b.push(c);var d=b.join("|"),e=/^(00258|\+258)/;e.test(a)&&(a=a.replace(e,""));var f=/(\s|\-|\.)+/g;a=a.replace(f,"");var g=/[\d]{8,9}/i;if((9===a.length||8===a.length)&&g.test(a)){var h=new RegExp("^("+d+")");if(h.test(a)){if(0===a.indexOf("2")&&8===a.length)return!0;if(0===a.indexOf("8")&&9===a.length)return!0}}return!1},isTLPhone:function(a){a=a.toString();var b=[];for(var c in this._indicativosTL)"string"==typeof this._indicativosTL[c]&&b.push(c);var d=b.join("|"),e=/^(00670|\+670)/;e.test(a)&&(a=a.replace(e,""));var f=/(\s|\-|\.)+/g;a=a.replace(f,"");var g=/[\d]{7}/i;if(7===a.length&&g.test(a)){var h=new RegExp("^("+d+")");if(h.test(a))return!0}return!1},isPhone:function(){var a;if(0===arguments.length)return!1;var b=arguments[0];if(arguments.length>1){if(arguments[1].constructor!==Array){if("function"==typeof this["is"+arguments[1].toUpperCase()+"Phone"])return this["is"+arguments[1].toUpperCase()+"Phone"](b);throw"Invalid Country Code!"}var c;for(a=0;a=0&&b[j-1]<=100))return!1;c=!0}if(1===j||3===j||5===j&&("undefined"==typeof b[j+1]||""===b[j+1])){if(!("undefined"!=typeof b[j]&&b[j]>=0&&b[j]<=255))return!1;c=!0}}if(null!==(b=h.exec(a))||null!==(b=i.exec(a)))for(j=b.length;j--;){if(3===j||5===j){if(!("undefined"!=typeof b[j-1]&&"undefined"!=typeof b[j]&&""!==b[j]&&b[j-1]>=0&&b[j-1]<=100))return!1;c=!0}if(1===j){if(!("undefined"!=typeof b[j]&&b[j]>=0&&b[j]<=360))return!1;c=!0}}return c},isIP:function(a,b){if("string"!=typeof a)return!1;switch(b=(b||"ipv4").toLowerCase()){case"ipv4":return/^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/.test(a);case"ipv6":return/^\s*((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))(%.+)?\s*$/.test(a); +default:return!1}},_creditCardSpecs:{"default":{length:"13,14,15,16,17,18,19",prefix:/^.+/,luhn:!0},"american express":{length:"15",prefix:/^3[47]/,luhn:!0},"diners club":{length:"14,16",prefix:/^36|55|30[0-5]/,luhn:!0},discover:{length:"16",prefix:/^6(?:5|011)/,luhn:!0},jcb:{length:"15,16",prefix:/^3|1800|2131/,luhn:!0},maestro:{length:"16,18",prefix:/^50(?:20|38)|6(?:304|759)/,luhn:!0},mastercard:{length:"16",prefix:/^5[1-5]/,luhn:!0},visa:{length:"13,16",prefix:/^4/,luhn:!0}},_luhn:function(a){if(a=parseInt(a,10),"number"!=typeof a&&a%1!==0)return!1;a+="";var b=a.length,c,d=0;for(c=b-1;c>=0;c-=2)d+=parseInt(a.substr(c,1),10);for(c=b-2;c>=0;c-=2){var e=parseInt(2*a.substr(c,1),10);d+=e>=10?e-9:e}return d%10===0},isCreditCard:function(a,b){if(/\d+/.test(a)===!1)return!1;if("undefined"==typeof b)b="default";else if(b instanceof Array){var c,d=b.length;for(c=0;d>c;c++)if(this.isCreditCard(a,b[c]))return!0;return!1}if(b=b.toLowerCase(),"undefined"==typeof this._creditCardSpecs[b])return!1;var e=a.length+"";return-1===this._creditCardSpecs[b].length.split(",").indexOf(e)?!1:this._creditCardSpecs[b].prefix.test(a)?this._creditCardSpecs[b].luhn===!1?!0:this._luhn(a):!1}};return a}); +//# sourceMappingURL=ink-all.js.map \ No newline at end of file diff --git a/ajax/libs/ink/2.3.1/js/ink-ui.js b/ajax/libs/ink/2.3.1/js/ink-ui.js new file mode 100644 index 000000000..4743c79c6 --- /dev/null +++ b/ajax/libs/ink/2.3.1/js/ink-ui.js @@ -0,0 +1,11525 @@ +/** + * @module Ink.UI.Animate_1 + * @author inkdev AT sapo.pt + * @version 1 + */ + +Ink.createModule('Ink.UI.Animate', 1, ['Ink.UI.Common_1', 'Ink.Dom.Event_1', 'Ink.Dom.Css_1'], function (Common, InkEvent, Css) { + 'use strict'; + + var animationPrefix = (function (el) { + return ('animationName' in el.style) ? 'animation' : + ('oAnimationName' in el.style) ? 'oAnimation' : + ('msAnimationName' in el.style) ? 'msAnimation' : + ('webkitAnimationName' in el.style) ? 'webkitAnimation' : null; + }(document.createElement('div'))); + + var animationEndEventName = { + animation: 'animationend', + oAnimation: 'oanimationend', + msAnimation: 'MSAnimationEnd', + webkitAnimation: 'webkitAnimationEnd' + }[animationPrefix]; + + /** + * @class Ink.UI.Animate_1 + * @constructor + * + * @param element {DOMElement} animated element + * @param options {Object} options object + * @param options.animation {String} animation name + * @param [options.duration=medium] {String|Number} duration name (fast|medium|slow) or duration in ms + * @param [options.removeClass=true] {Boolean} Whether to remove the `animation` class when finished animating + * @param [options.onEnd=null] {Function} callback for animation end + * + * @example + * + * + * Hi! + * + * + * + **/ + function Animate(elOrSelector, options) { + this._element = Common.elOrSelector(elOrSelector); + this._options = Common.options({ + trigger: ['Element', null], + duration: ['String', 'slow'], // Actually a string with a duration name, or a number of ms + animation: ['String'], + removeClass: ['Boolean', true], + onEnd: ['Function', function () {}] + }, options || {}, this._element); + + if (!isNaN(parseInt(this._options.duration, 10))) { + this._options.duration = parseInt(this._options.duration, 10); + } + + if (this._options.trigger) { + InkEvent.observe(this._options.trigger, 'click', Ink.bind(function () { + this.animate(); + }, this)); // later + } else { + this.animate(); + } + } + + Animate.prototype.animate = function () { + Animate.animate(this._element, this._options.animation, this._options); + }; + + Ink.extendObj(Animate, { + /** + * Prefix for CSS animation-related properties in this browser. + * + * @property _animationPrefix + * @private + **/ + _animationPrefix: animationPrefix, + + /** + * Whether CSS3 animation is supported in this browser. + * + * @property {Boolean} animationSupported + **/ + animationSupported: !!animationPrefix, + + /** + * The correct event for the animationend event in this browser, with the correct prefix + * + * @property {String} animationEndEventName + **/ + animationEndEventName: animationEndEventName, + + /** + * Animate a div using one of the animate.css classes + * + * **Note: This is a utility method inside the `Animate` class, which you can access through `Animate.animate()`. Do not mix these up.** + * + * @example + * + * Animate.animate(myDiv, 'shake', { + * onEnd: function () { + * alert('Finished shaking!'); + * } + * }); + * + * @static + * @method animate + * @param element {DOMElement} animated element + * @param animation {String} animation name + * @param [options] {Object} + * @param [options.onEnd=null] {Function} callback for animation end + * @param [options.removeClass=false] {Boolean} whether to remove the Css class when finished + * @param [options.duration=medium] {String|Number} duration name (fast|medium|slow) or duration in ms + **/ + animate: function (element, animation, options) { + element = Common.elOrSelector(element); + + if (typeof options === 'number' || typeof options === 'string') { + options = { duration: options }; + } + + if (typeof arguments[3] === 'function') { + options.onEnd = arguments[3]; + } + + if (typeof options.duration !== 'number' && typeof options.duration !== 'string') { + options.duration = 400; + } + + if (!Animate.animationSupported) { + if (options.onEnd) { + setTimeout(function () { + options.onEnd(null); + }, 0); + } + return; + } + + if (typeof options.duration === 'number') { + element.style[animationPrefix + 'Duration'] = options.duration + 'ms'; + } else if (typeof options.duration === 'string') { + Css.addClassName(element, options.duration); + } + + Css.addClassName(element, ['animated', animation]); + + function onAnimationEnd(event) { + if (event.target !== element) { return; } + if (event.animationName !== animation) { return; } + if (options.onEnd) { options.onEnd(event); } + if (options.removeClass) { + Css.removeClassName(element, animation); + } + if (typeof options.duration === 'string') { + Css.removeClassName(element, options.duration); + } + element.removeEventListener(animationEndEventName, onAnimationEnd, false); + } + + element.addEventListener(animationEndEventName, onAnimationEnd, false); + } + }); + + return Animate; +}); + + +/** + * @module Ink.UI.Carousel_1 + * @author inkdev AT sapo.pt + * @version 1 + */ +Ink.createModule('Ink.UI.Carousel', '1', + ['Ink.UI.Common_1', 'Ink.Dom.Event_1', 'Ink.Dom.Css_1', 'Ink.Dom.Element_1', 'Ink.UI.Pagination_1', 'Ink.Dom.Browser_1', 'Ink.Dom.Selector_1'], + function(Common, InkEvent, Css, InkElement, Pagination, Browser/*, Selector*/) { + 'use strict'; + + /* + * TODO: + * keyboardSupport + */ + + function limitRange(n, min, max) { + return Math.min(max, Math.max(min, n)); + } + + var requestAnimationFrame = window.requestAnimationFrame || + window.mozRequestAnimationFrame || + window.webkitRequestAnimationFrame || + function (cb) {return setTimeout(cb, 1000 / 30); }; + + /** + * @class Ink.UI.Carousel_1 + * @constructor + * + * @param {String|DOMElement} selector + * @param {Object} [options] + * @param {Integer} [autoAdvance=0] The number of milliseconds to wait between auto-advancing pages. Set to 0 to disable auto-advance. + * @param {String} [options.axis='x'] Can be `'x'` or `'y'`, for a horizontal or vertical carousel + * @param {Boolean} [options.center=false] Center the carousel. + * @param {Number} [options.initialPage=0] When initialized, set the page to this. + * @TODO @param {Boolean} [options.keyboardSupport=false] Enable keyboard support + * @param {Boolean} [options.swipe=true] Enable swipe support where available + * @param {String|DOMElement|Ink.UI.Pagination_1} [options.pagination] Either an `
        ` element to add pagination markup to, or an `Ink.UI.Pagination` instance to use. + * @param {Function} [options.onChange] Callback for when the page is changed. + */ + var Carousel = function(selector, options) { + this._handlers = { + paginationChange: Ink.bindMethod(this, '_onPaginationChange'), + windowResize: InkEvent.throttle(Ink.bindMethod(this, 'refit'), 200) + }; + + InkEvent.observe(window, 'resize', this._handlers.windowResize); + + var element = this._element = Common.elOrSelector(selector, '1st argument'); + + var opts = this._options = Common.options({ + autoAdvance: ['Integer', 0], + axis: ['String', 'x'], + initialPage: ['Integer', 0], + hideLast: ['Boolean', false], + center: ['Boolean', false], + keyboardSupport:['Boolean', false], + pagination: ['String', null], + onChange: ['Function', null], + swipe: ['Boolean', true] + // TODO exponential swipe + // TODO specify break point for next page when moving finger + }, options || {}, element, this); + + this._isY = (opts.axis === 'y'); + + var ulEl = Ink.s('ul.stage', element); + this._ulEl = ulEl; + + InkElement.removeTextNodeChildren(ulEl); + + this.refit(); // recalculate this._numPages + + if (this._isY) { + // Override white-space: no-wrap which is only necessary to make sure horizontal stuff stays horizontal, but breaks stuff intended to be vertical. + this._ulEl.style.whiteSpace = 'normal'; + } + + if (opts.swipe) { + InkEvent.observe(element, 'touchstart', Ink.bindMethod(this, '_onTouchStart')); + InkEvent.observe(element, 'touchmove', Ink.bindMethod(this, '_onTouchMove')); + InkEvent.observe(element, 'touchend', Ink.bindMethod(this, '_onTouchEnd')); + } + + this._setUpPagination(); + this._setUpAutoAdvance(); + this._setUpHider(); + }; + + Carousel.prototype = { + /** + * Measure the carousel once again, adjusting the involved elements' + * sizes. Called automatically when the window resizes, in order to + * cater for changes from responsive media queries, for instance. + * + * @method refit + * @public + */ + refit: function() { + var _isY = this._isY; + + var size = function (elm, perpendicular) { + if (!perpendicular) { + return InkElement.outerDimensions(elm)[_isY ? 1 : 0]; + } else { + return InkElement.outerDimensions(elm)[_isY ? 0 : 1]; + } + }; + + this._liEls = Ink.ss('li.slide', this._ulEl); + var numSlides = this._liEls.length; + + var contRect = this._ulEl.getBoundingClientRect(); + this._ctnLength = _isY ? contRect.bottom - contRect.top : contRect.right - contRect.left; + this._elLength = size(this._liEls[0]); + this._slidesPerPage = Math.floor( this._ctnLength / this._elLength ) || 1; + + var numPages = Math.ceil( numSlides / this._slidesPerPage ); + var numPagesChanged = this._numPages !== numPages; + this._numPages = numPages; + this._deltaLength = this._slidesPerPage * this._elLength; + + this._center(); + this._updateHider(); + this._IE7(); + + if (this._pagination && numPagesChanged) { + this._pagination.setSize(this._numPages); + } + this.setPage(limitRange(this.getPage(), 1, this._numPages)); + }, + + _setUpPagination: function () { + if (this._options.pagination) { + if (Common.isDOMElement(this._options.pagination) || + typeof this._options.pagination === 'string') { + // if dom element or css selector string... + this._pagination = new Pagination(this._options.pagination, { + size: this._numPages, + onChange: this._handlers.paginationChange + }); + } else { + // assumes instantiated pagination + this._pagination = this._options.pagination; + this._pagination._options.onChange = this._handlers.paginationChange; + this._pagination.setSize(this._numPages); + } + this._pagination.setCurrent(this._options.initialPage || 0); + } else { + this._currentPage = this._options.initialPage || 0; + } + }, + + _setUpAutoAdvance: function () { + if (!this._options.autoAdvance) { return; } + var self = this; + + setTimeout(function autoAdvance() { + self.nextPage(true /* wrap */); + setTimeout(autoAdvance, self._options.autoAdvance); + }, this._options.autoAdvance); + }, + + _setUpHider: function () { + if (this._options.hideLast) { + var hiderEl = InkElement.create('div', { + className: 'hider', + insertBottom: this._element + }); + hiderEl.style.position = 'absolute'; + hiderEl.style[ this._isY ? 'left' : 'top' ] = '0'; // fix to top.. + hiderEl.style[ this._isY ? 'right' : 'bottom' ] = '0'; // and bottom... + hiderEl.style[ this._isY ? 'bottom' : 'right' ] = '0'; // and move to the end. + this._hiderEl = hiderEl; + } + }, + + _center: function() { + if (!this._options.center) { return; } + var gap = Math.floor( (this._ctnLength - (this._elLength * this._slidesPerPage) ) / 2 ); + + var pad; + if (this._isY) { + pad = [gap, 'px 0']; + } else { + pad = ['0 ', gap, 'px']; + } + + this._ulEl.style.padding = pad.join(''); + }, + + _updateHider: function() { + if (!this._hiderEl) { return; } + if (this.getPage() === 0) { + var gap = Math.floor( this._ctnLength - (this._elLength * this._slidesPerPage) ); + if (this._options.center) { + gap /= 2; + } + this._hiderEl.style[ this._isY ? 'height' : 'width' ] = gap + 'px'; + } else { + this._hiderEl.style[ this._isY ? 'height' : 'width' ] = '0px'; + } + }, + + /** + * Refit stuff for IE7 because it won't support inline-block. + * + * @method _IE7 + * @private + */ + _IE7: function () { + if (Browser.IE && '' + Browser.version.split('.')[0] === '7') { + // var numPages = this._numPages; + var slides = Ink.ss('li.slide', this._ulEl); + var stl = function (prop, val) {slides[i].style[prop] = val; }; + for (var i = 0, len = slides.length; i < len; i++) { + stl('position', 'absolute'); + stl(this._isY ? 'top' : 'left', (i * this._elLength) + 'px'); + } + } + }, + + _onTouchStart: function (event) { + if (event.touches.length > 1) { return; } + + this._swipeData = { + x: InkEvent.pointerX(event), + y: InkEvent.pointerY(event), + lastUlPos: null + }; + + var ulRect = this._ulEl.getBoundingClientRect(); + + this._swipeData.inUlX = this._swipeData.x - ulRect.left; + this._swipeData.inUlY = this._swipeData.y - ulRect.top; + + setTransitionProperty(this._ulEl, 'none'); + + this._touchMoveIsFirstTouchMove = true; + + // event.preventDefault(); + event.stopPropagation(); + }, + + _onTouchMove: function (event) { + if (event.touches.length > 1) { return; /* multitouch event, not my problem. */ } + + var pointerX = InkEvent.pointerX(event); + var pointerY = InkEvent.pointerY(event); + + var deltaY = Math.abs(pointerY - this._swipeData.y); + var deltaX = Math.abs(pointerX - this._swipeData.x); + + if (this._touchMoveIsFirstTouchMove) { + this._touchMoveIsFirstTouchMove = undefined; + this._scrolling = this._isY ? + deltaX > deltaY : + deltaY > deltaX ; + + if (!this._scrolling) { + this._onAnimationFrame(); + } + } + + if (!this._scrolling && this._swipeData) { + event.preventDefault(); + + this._swipeData.pointerPos = this._isY ? pointerY : pointerX; + } + + event.stopPropagation(); + }, + + _onAnimationFrame: function () { + var swipeData = this._swipeData; + + if (!swipeData || this._scrolling || this._touchMoveIsFirstTouchMove) { return; } + + var elRect = this._element.getBoundingClientRect(); + + var newPos; + + if (!this._isY) { + newPos = swipeData.pointerPos - swipeData.inUlX - elRect.left; + } else { + newPos = swipeData.pointerPos - swipeData.inUlY - elRect.top; + } + + this._ulEl.style[this._isY ? 'top' : 'left'] = newPos + 'px'; + + swipeData.lastUlPos = newPos; + + requestAnimationFrame(Ink.bindMethod(this, '_onAnimationFrame')); + }, + + _onTouchEnd: function (event) { + if (this._swipeData && this._swipeData.pointerPos && !this._scrolling && !this._touchMoveIsFirstTouchMove) { + var snapToNext = 0.1; // swipe 10% of the way to change page + var progress = - this._swipeData.lastUlPos; + + var curPage = this.getPage(); + var estimatedPage = progress / this._elLength / this._slidesPerPage; + + if (Math.round(estimatedPage) === curPage) { + var diff = estimatedPage - curPage; + if (Math.abs(diff) > snapToNext) { + diff = diff > 0 ? 1 : -1; + curPage += diff; + } + } else { + curPage = Math.round(estimatedPage); + } + + this.setPage(curPage); + + event.stopPropagation(); + // event.preventDefault(); + } + + setTransitionProperty(this._ulEl, null /* transition: left, top */); + this._swipeData = null; + this._touchMoveIsFirstTouchMove = undefined; + this._scrolling = undefined; + }, + + _onPaginationChange: function(pgn) { + this._setPage(pgn.getCurrent()); + }, + + /** + * Get the currently displayed page. + * @method getPage + **/ + getPage: function () { + if (this._pagination) { + return this._pagination.getCurrent(); + } else { + return this._currentPage; + } + }, + + /** + * Set the current page to `page` + * @method setPage + * @param page + * @param [wrap=false] Wrap over the first and last pages. (For example, going to the 5th page when there are only 4 pages goes to the 1st page) + **/ + setPage: function (page, wrap) { + if (wrap) { + // Pages outside the range [0..this._numPages] are wrapped. + page = page % this._numPages; + if (page < 0) { page = this._numPages - page; } + } + page = limitRange(page, 0, this._numPages - 1); + + if (this._pagination) { + this._pagination.setCurrent(page); + } else { + this._setPage(page); + } + }, + + _setPage: function (page) { + this._ulEl.style[ this._isY ? 'top' : 'left'] = + ['-', page * this._deltaLength, 'px'].join(''); + + if (this._options.onChange) { + this._options.onChange.call(this, page); + } + + this._currentPage = page; + + this._updateHider(); + }, + + /** + * Change to the next page + * @method nextPage + * @param {Boolean} [wrap=false] If true, going to the page after the last page takes you to the first page. + **/ + nextPage: function (wrap) { + this.setPage(this.getPage() + 1, wrap); + }, + + /** + * Change to the previous page + * @method previousPage + * @param {Boolean} [wrap=false] If true, going to the page after the last page takes you to the first page. + **/ + previousPage: function (wrap) { this.setPage(this.getPage() - 1, wrap); } + }; + + function setTransitionProperty(el, newTransition) { + el.style.transitionProperty = + el.style.oTransitionProperty = + el.style.msTransitionProperty = + el.style.mozTransitionProperty = + el.style.webkitTransitionProperty = newTransition; + } + + return Carousel; + +}); + +/** + * @module Ink.UI.Close_1 + * @author inkdev AT sapo.pt + */ +Ink.createModule('Ink.UI.Close', '1', ['Ink.Dom.Event_1','Ink.Dom.Element_1'], function(InkEvent, InkElement) { + 'use strict'; + + /** + * Subscribes clicks on the document.body. If and only if you clicked on an element + * having class "ink-close" or "ink-dismiss", will go up the DOM hierarchy looking for an element with any + * of the following classes: "ink-alert", "ink-alert-block". + * If it is found, it is removed from the DOM. + * + * One should call close once per page (full page refresh). + * + * @class Ink.UI.Close + * @constructor + * @example + * + */ + var Close = function() { + InkEvent.observe(document.body, 'click', function(ev) { + var el = InkEvent.element(ev); + + el = InkElement.findUpwardsByClass(el, 'ink-close') || + InkElement.findUpwardsByClass(el, 'ink-dismiss'); + + if (!el) { + return; // ink-close or ink-dismiss class not found + } + + var toRemove = el; + toRemove = InkElement.findUpwardsByClass(el, 'ink-alert') || + InkElement.findUpwardsByClass(el, 'ink-alert-block'); + + if (toRemove) { + InkEvent.stop(ev); + InkElement.remove(toRemove); + } + }); + }; + + return Close; + +}); + +/** + * @module Ink.UI.Common_1 + * @author inkdev AT sapo.pt + * @version 1 + */ +Ink.createModule('Ink.UI.Common', '1', ['Ink.Dom.Element_1', 'Ink.Net.Ajax_1','Ink.Dom.Css_1','Ink.Dom.Selector_1','Ink.Util.Url_1'], function(InkElement, Ajax,Css,Selector,Url) { + + 'use strict'; + + var instances = {}; + var lastIdNum = 0; + var nothing = {} /* a marker, for reference comparison. */; + + var keys = Object.keys || function (obj) { + var ret = []; + for (var k in obj) if (obj.hasOwnProperty(k)) { + ret.push(k); + } + return ret; + }; + + /** + * The Common class provides auxiliar methods to ease some of the most common/repetitive UI tasks. + * + * @class Ink.UI.Common + * @version 1 + * @static + */ + var Common = { + + /** + * Supported Ink Layouts + * + * @property Layouts + * @type Object + * @readOnly + */ + Layouts: { + SMALL: 'small', + MEDIUM: 'medium', + LARGE: 'large' + }, + + /** + * Method to check if an item is a valid DOM Element. + * + * @method isDOMElement + * @static + * @param {Mixed} o The object to be checked. + * @return {Boolean} True if it's a valid DOM Element. + * @example + * var el = Ink.s('#element'); + * if( Ink.UI.Common.isDOMElement( el ) === true ){ + * // It is a DOM Element. + * } else { + * // It is NOT a DOM Element. + * } + */ + isDOMElement: function(o) { + return o && typeof o === 'object' && 'nodeType' in o && o.nodeType === 1; + }, + + /** + * Method to check if an item is a valid integer. + * + * @method isInteger + * @static + * @param {Mixed} n The value to be checked. + * @return {Boolean} True if 'n' is a valid integer. + * @example + * var value = 1; + * if( Ink.UI.Common.isInteger( value ) === true ){ + * // It is an integer. + * } else { + * // It is NOT an integer. + * } + */ + isInteger: function(n) { + return (typeof n === 'number' && n % 1 === 0); + }, + + /** + * Method to get a DOM Element. The first parameter should be either a DOM Element or a valid CSS Selector. + * If not, then it will throw an exception. Otherwise, it returns a DOM Element. + * + * @method elOrSelector + * @static + * @param {DOMElement|String} elOrSelector DOM Element or CSS Selector + * @param {String} fieldName This field is used in the thrown Exception to identify the parameter. + * @return {DOMElement} Returns the DOMElement passed or the first result of the CSS Selector. Otherwise it throws an exception. + * @example + * // In case there are several .myInput, it will retrieve the first found + * var el = Ink.UI.Common.elOrSelector('.myInput','My Input'); + */ + elOrSelector: function(elOrSelector, fieldName) { + if (!this.isDOMElement(elOrSelector)) { + var t = Selector.select(elOrSelector); + if (t.length === 0) { throw new TypeError(fieldName + ' must either be a DOM Element or a selector expression!\nThe script element must also be after the DOM Element itself.'); } + return t[0]; + } + return elOrSelector; + }, + + /** + * Does the same as `elOrSelector` but returns an array of elements. + * + * see elOrSelector + * + * @method elsOrSelector + * + * @static + * + * @param ... (See elOrSelector's params) + * @param {Boolean} required If true, accept an empty array as output. + * @return {Array} The selected DOM Elements. + * @example + * var elements = Ink.UI.Common.elsOrSelector('input.my-inputs', 'My Input'); + */ + elsOrSelector: function(elsOrSelector, fieldName, required) { + var ret; + if (typeof elsOrSelector === 'string') { + ret = Selector.select(elsOrSelector); + } else if (Common.isDOMElement(elsOrSelector)) { + ret = [elsOrSelector]; + } else if (elsOrSelector && typeof elsOrSelector === 'object' && typeof elsOrSelector.length === 'number') { + ret = elsOrSelector; + } + + if (ret && ret.length) { + return ret; + } else { + if (required || arguments.length === 2) { + throw new TypeError(fieldName + ' must either be a DOM Element, an Array of elements, or a selector expression!\nThe script element must also be after the DOM Element itself.'); + } else { + return []; + } + } + }, + + /** + * Get options from an "options" object and the Element's data attributes. + * + * The element's data attributes take precedence. + * + * Values from the element's data-atrributes are coerced into the required type. + * + * Mainly for Ink UI.* modules + * + * @method options + * + * @param {Object} [fieldId=''] Tag used in thrown exceptions: ": ..." + * @param {Object} defaults Object with arrays of option defaults + * @param {Object} overrides Object containing options given from user through JavaScript + * @param {DOMElement} [element] Element with data-attributes + * + * @example + * + * this._options = Ink.UI.Common.options('MyComponent', { + * 'anobject': ['Object', null], // Defaults to null + * 'target': ['Element', null], + * 'stuff': ['Number', 0.1], + * 'stuff2': ['Integer', 0], + * 'doKickFlip': ['Boolean', false], + * 'targets': ['Elements'], // Required option since no default was given + * 'onClick': ['Function', null] + * }, options || {}, elm) + * + * @example + * + * ### Note about booleans + * + * Here is how options are read from the markup + * data-attributes, for several values`data-a-boolean`. + * + * Options considered true: + * + * - `data-a-boolean="true"` + * - (Every other value which is not on the list below.) + * + * Options considered false: + * + * - `data-a-boolean="false"` + * - `data-a-boolean=""` + * - `data-a-boolean` + * + * Options which go to default: + * + * - (no attribute). When `data-a-boolean` is ommitted, the + * option is not considered true nor false, and as such + * defaults to what is in the `defaults` argument. + * + **/ + options: function (fieldId, defaults, overrides, element) { + if (typeof fieldId !== 'string') { + element = overrides; + overrides = defaults; + defaults = fieldId; + fieldId = ''; + } + overrides = overrides || {}; + var out = {}; + var dataAttrs = element ? InkElement.data(element) : {}; + var fromDataAttrs; + var type; + var lType; + var defaultVal; + + var invalidStr = function (str) { + if (fieldId) { str = fieldId + ': "' + ('' + str).replace(/"/, '\\"') + '"'; } + return str; + }; + + var quote = function (str) { + return '"' + ('' + str).replace(/"/, '\\"') + '"'; + }; + + var invalidThrow = function (str) { + throw new Error(invalidStr(str)); + }; + + var invalid = function (str) { + Ink.error(invalidStr(str) + '. Ignoring option.'); + }; + + function optionValue(key) { + type = defaults[key][0]; + lType = type.toLowerCase(); + defaultVal = defaults[key].length === 2 ? defaults[key][1] : nothing; + + if (!type) { + invalidThrow('Ink.UI.Common.options: Always specify a type!'); + } + if (!(lType in Common._coerce_funcs)) { + invalidThrow('Ink.UI.Common.options: ' + defaults[key][0] + ' is not a valid type. Use one of ' + keys(Common._coerce_funcs).join(', ')); + + } + if (!defaults[key].length || defaults[key].length > 2) { + invalidThrow('the "defaults" argument must be an object mapping option names to [typestring, optional] arrays.'); + } + + if (key in dataAttrs) { + fromDataAttrs = Common._coerce_from_string(lType, dataAttrs[key], key, fieldId); + // (above can return `nothing`) + } else { + fromDataAttrs = nothing; + } + + if (fromDataAttrs !== nothing) { + if (!Common._options_validate(fromDataAttrs, lType)) { + invalid('(' + key + ' option) Invalid ' + lType + ' ' + quote(fromDataAttrs)); + return defaultVal; + } else { + return fromDataAttrs; + } + } else if (key in overrides) { + return overrides[key]; + } else if (defaultVal !== nothing) { + return defaultVal; + } else { + invalidThrow('Option ' + key + ' is required!'); + } + } + + for (var key in defaults) { + if (defaults.hasOwnProperty(key)) { + out[key] = optionValue(key); + } + } + + return out; + }, + + _coerce_from_string: function (type, val, paramName, fieldId) { + if (type in Common._coerce_funcs) { + return Common._coerce_funcs[type](val, paramName, fieldId); + } else { + return val; + } + }, + + _options_validate: function (val, type) { + if (type in Common._options_validate_types) { + return Common._options_validate_types[type].call(Common, val); + } else { + // 'object' options cannot be passed through data-attributes. + // Json you say? Not any good to embed in HTML. + return false; + } + }, + + _coerce_funcs: (function () { + var ret = { + element: function (val) { + return Common.elOrSelector(val, ''); + }, + elements: function (val) { + return Common.elsOrSelector(val, '', false /*not required, so don't throw an exception now*/); + }, + object: function (val) { return val; }, + number: function (val) { return parseFloat(val); }, + 'boolean': function (val) { + return !(val === 'false' || val === '' || val === null); + }, + string: function (val) { return val; }, + 'function': function (val, paramName, fieldId) { + Ink.error(fieldId + ': You cannot specify the option "' + paramName + '" through data-attributes because it\'s a function'); + return nothing; + } + }; + ret['float'] = ret.integer = ret.number; + return ret; + }()), + + _options_validate_types: (function () { + var types = { + string: function (val) { + return typeof val === 'string'; + }, + number: function (val) { + return typeof val === 'number' && !isNaN(val) && isFinite(val); + }, + integer: function (val) { + return val === Math.round(val); + }, + element: function (val) { + return Common.isDOMElement(val); + }, + elements: function (val) { + return val && typeof val === 'object' && typeof val.length === 'number' && val.length; + }, + 'boolean': function (val) { + return typeof val === 'boolean'; + } + }; + types['float'] = types.number; + return types; + }()), + + /** + * Method to make a deep copy (clone) of an object. + * Note: The object cannot have loops. + * + * @method clone + * @static + * @param {Object} o The object to be cloned/copied. + * @return {Object} Returns the result of the clone/copy. + * @example + * var originalObj = { + * key1: 'value1', + * key2: 'value2', + * key3: 'value3' + * }; + * var cloneObj = Ink.UI.Common.clone( originalObj ); + */ + clone: function(o) { + try { + return JSON.parse( JSON.stringify(o) ); + } catch (ex) { + throw new Error('Given object cannot have loops!'); + } + }, + + + /** + * Method to return the 'nth' position that an element occupies relatively to its parent. + * + * @method childIndex + * @static + * @param {DOMElement} childEl Valid DOM Element. + * @return {Number} Numerical position of an element relatively to its parent. + * @example + * + *
          + *
        • One
        • + *
        • Two
        • + *
        • Three
        • + *
        • Four
        • + *
        + * + * + */ + childIndex: function(childEl) { + if( Common.isDOMElement(childEl) ){ + var els = Selector.select('> *', childEl.parentNode); + for (var i = 0, f = els.length; i < f; ++i) { + if (els[i] === childEl) { + return i; + } + } + } + throw 'not found!'; + }, + + + /** + * This method provides a more convenient way to do an async AJAX request and expect a JSON response. + * It offers a callback option, as third paramenter, for a better async handling. + * + * @method ajaxJSON + * @static + * @async + * @param {String} endpoint Valid URL to be used as target by the request. + * @param {Object} params This field is used in the thrown Exception to identify the parameter. + * @example + * // In case there are several .myInput, it will retrieve the first found + * var el = Ink.UI.Common.elOrSelector('.myInput','My Input'); + */ + ajaxJSON: function(endpoint, params, cb) { + new Ajax( + endpoint, + { + evalJS: 'force', + method: 'POST', + parameters: params, + + onSuccess: function( r) { + try { + r = r.responseJSON; + if (r.status !== 'ok') { + throw 'server error: ' + r.message; + } + cb(null, r); + } catch (ex) { + cb(ex); + } + }, + + onFailure: function() { + cb('communication failure'); + } + } + ); + }, + + + /** + * Method to get the current Ink layout applied. + * + * @method currentLayout + * @static + * @return {String} 'small', 'medium' or 'large' + * @example + * var inkLayout = Ink.UI.Common.currentLayout(); + * if (inkLayout === 'small') { + * // ... + * } + */ + currentLayout: function() { + var i, f, k, v, el, detectorEl = Selector.select('#ink-layout-detector')[0]; + if (!detectorEl) { + detectorEl = document.createElement('div'); + detectorEl.id = 'ink-layout-detector'; + for (k in this.Layouts) { + if (this.Layouts.hasOwnProperty(k)) { + v = this.Layouts[k]; + el = document.createElement('div'); + el.className = 'show-' + v + ' hide-all'; + el.setAttribute('data-ink-layout', v); + detectorEl.appendChild(el); + } + } + document.body.appendChild(detectorEl); + } + + var result = ''; + var resultCount = 0; + for (i = 0, f = detectorEl.childNodes.length; i < f; ++i) { + el = detectorEl.childNodes[i]; + if (Css.getStyle(el, 'display') === 'block') { + result = el.getAttribute('data-ink-layout'); + resultCount += 1; + } + } + + if (resultCount === 1) { + return result; + } else { + return 'large'; + } + }, + + + /** + * Method to set the location's hash (window.location.hash). + * + * @method hashSet + * @static + * @param {Object} o Object with the info to be placed in the location's hash. + * @example + * // It will set the location's hash like: #key1=value1&key2=value2&key3=value3 + * Ink.UI.Common.hashSet({ + * key1: 'value1', + * key2: 'value2', + * key3: 'value3' + * }); + */ + hashSet: function(o) { + if (typeof o !== 'object') { throw new TypeError('o should be an object!'); } + var hashParams = Url.getAnchorString(); + hashParams = Ink.extendObj(hashParams, o); + window.location.hash = Url.genQueryString('', hashParams).substring(1); + }, + + /** + * Method to remove children nodes from a given object. + * This method was initially created to help solve a problem in Internet Explorer(s) that occurred when trying + * to set the innerHTML of some specific elements like 'table'. + * + * @method cleanChildren + * @static + * @param {DOMElement} parentEl Valid DOM Element + * @example + * + *
          + *
        • One
        • + *
        • Two
        • + *
        • Three
        • + *
        • Four
        • + *
        + * + * + * + * + *
          + */ + cleanChildren: function(parentEl) { + if( !Common.isDOMElement(parentEl) ){ + throw 'Please provide a valid DOMElement'; + } + var prevEl, el = parentEl.lastChild; + while (el) { + prevEl = el.previousSibling; + parentEl.removeChild(el); + el = prevEl; + } + }, + + /** + * This method stores the id and/or the classes of a given element in a given object. + * + * @method storeIdAndClasses + * @static + * @param {DOMElement} fromEl Valid DOM Element to get the id and classes from. + * @param {Object} inObj Object where the id and classes will be saved. + * @example + *
          + * + * + */ + storeIdAndClasses: function(fromEl, inObj) { + if( !Common.isDOMElement(fromEl) ){ + throw 'Please provide a valid DOMElement as first parameter'; + } + + var id = fromEl.id; + if (id) { + inObj._id = id; + } + + var classes = fromEl.className; + if (classes) { + inObj._classes = classes; + } + }, + + /** + * This method sets the id and className properties of a given DOM Element based on a given similar object + * resultant of the previous function 'storeIdAndClasses'. + * + * @method restoreIdAndClasses + * @static + * @param {DOMElement} toEl Valid DOM Element to set the id and classes on. + * @param {Object} inObj Object where the id and classes to be set are. + * @example + *
          + * + * + * + * + *
          + */ + restoreIdAndClasses: function(toEl, inObj) { + + if( !Common.isDOMElement(toEl) ){ + throw 'Please provide a valid DOMElement as first parameter'; + } + + if (inObj._id && toEl.id !== inObj._id) { + toEl.id = inObj._id; + } + + if (inObj._classes && toEl.className.indexOf(inObj._classes) === -1) { + if (toEl.className) { toEl.className += ' ' + inObj._classes; } + else { toEl.className = inObj._classes; } + } + + if (inObj._instanceId && !toEl.getAttribute('data-instance')) { + toEl.setAttribute('data-instance', inObj._instanceId); + } + }, + + /** + * This method saves a component's instance reference for later retrieval. + * + * @method registerInstance + * @static + * @param {Object} inst Object that holds the instance. + * @param {DOMElement} el DOM Element to associate with the object. + * @param {Object} [optionalPrefix] Defaults to 'instance' + */ + registerInstance: function(inst, el, optionalPrefix) { + if (inst._instanceId) { return; } + + if (typeof inst !== 'object') { throw new TypeError('1st argument must be a JavaScript object!'); } + + if (inst._options && inst._options.skipRegister) { return; } + + if (!this.isDOMElement(el)) { throw new TypeError('2nd argument must be a DOM element!'); } + if (optionalPrefix !== undefined && typeof optionalPrefix !== 'string') { throw new TypeError('3rd argument must be a string!'); } + var id = (optionalPrefix || 'instance') + (++lastIdNum); + instances[id] = inst; + inst._instanceId = id; + var dataInst = el.getAttribute('data-instance'); + dataInst = (dataInst !== null) ? [dataInst, id].join(' ') : id; + el.setAttribute('data-instance', dataInst); + }, + + /** + * This method deletes/destroy an instance with a given id. + * + * @method unregisterInstance + * @static + * @param {String} id Id of the instance to be destroyed. + */ + unregisterInstance: function(id) { + delete instances[id]; + }, + + /** + * This method retrieves the registered instance(s) of a given element or instance id. + * + * @method getInstance + * @static + * @param {String|DOMElement} instanceIdOrElement Instance's id or DOM Element from which we want the instances. + * @return {Object|Object[]} Returns an instance or a collection of instances. + */ + getInstance: function(instanceIdOrElement) { + var ids; + if (this.isDOMElement(instanceIdOrElement)) { + ids = instanceIdOrElement.getAttribute('data-instance'); + if (ids === null) { throw new Error('argument is not a DOM instance element!'); } + } + else { + ids = instanceIdOrElement; + } + + ids = ids.split(' '); + var inst, id, i, l = ids.length; + + var res = []; + for (i = 0; i < l; ++i) { + id = ids[i]; + if (!id) { throw new Error('Element is not a JS instance!'); } + inst = instances[id]; + if (!inst) { throw new Error('Instance "' + id + '" not found!'); } + res.push(inst); + } + + return (l === 1) ? res[0] : res; + }, + + /** + * This method retrieves the registered instance(s) of an element based on the given selector. + * + * @method getInstanceFromSelector + * @static + * @param {String} selector CSS selector to define the element from which it'll get the instance(s). + * @return {Object|Object[]} Returns an instance or a collection of instances. + */ + getInstanceFromSelector: function(selector) { + var el = Selector.select(selector)[0]; + if (!el) { throw new Error('Element not found!'); } + return this.getInstance(el); + }, + + /** + * This method retrieves the registered instances' ids of all instances. + * + * @method getInstanceIds + * @static + * @return {String[]} Id or collection of ids of all existing instances. + */ + getInstanceIds: function() { + var res = []; + for (var id in instances) { + if (instances.hasOwnProperty(id)) { + res.push( id ); + } + } + return res; + }, + + /** + * This method retrieves all existing instances. + * + * @method getInstances + * @static + * @return {Object[]} Collection of existing instances. + */ + getInstances: function() { + var res = []; + for (var id in instances) { + if (instances.hasOwnProperty(id)) { + res.push( instances[id] ); + } + } + return res; + }, + + /** + * This method is not to supposed to be invoked by the Common component. + * Components should copy this method as its destroy method. + * + * @method destroyComponent + * @static + */ + destroyComponent: function() { + Common.unregisterInstance(this._instanceId); + this._element.parentNode.removeChild(this._element); + } + + }; + + return Common; + +}); + +/** + * @module Ink.UI.DatePicker_1 + * @author inkdev AT sapo.pt + * @version 1 + */ +Ink.createModule('Ink.UI.DatePicker', '1', ['Ink.UI.Common_1','Ink.Dom.Event_1','Ink.Dom.Css_1','Ink.Dom.Element_1','Ink.Dom.Selector_1','Ink.Util.Array_1','Ink.Util.Date_1', 'Ink.Dom.Browser_1'], function(Common, Event, Css, InkElement, Selector, InkArray, InkDate ) { + 'use strict'; + + // Repeat a string. Long version of (new Array(n)).join(str); + function strRepeat(n, str) { + var ret = ''; + for (var i = 0; i < n; i++) { + ret += str; + } + return ret; + } + + // Clamp a number into a min/max limit + function clamp(n, min, max) { + if (n > max) { n = max; } + if (n < min) { n = min; } + + return n; + } + + function dateishFromYMDString(YMD) { + var split = YMD.split('-'); + return dateishFromYMD(+split[0], +split[1] - 1, +split[2]); + } + + function dateishFromYMD(year, month, day) { + return {_year: year, _month: month, _day: day}; + } + + function dateishFromDate(date) { + return {_year: date.getFullYear(), _month: date.getMonth(), _day: date.getDate()}; + } + + /** + * @class Ink.UI.DatePicker + * @constructor + * @version 1 + * + * @param {String|DOMElement} selector + * @param {Object} [options] Options + * @param {Boolean} [options.autoOpen=false] set to `true` to automatically open the datepicker. + * @param {String} [options.cleanText] text to display on clean button. defaults to 'Limpar' + * @param {String} [options.closeText] text to display on close button. defaults to 'Fechar' + * @param {String} [options.cssClass] CSS class to be applied to the datepicker + * @param {String} [options.dateRange] enforce limits to year, month and day for the Date, ex: '1990-08-25:2020-11' + * @param {Boolean} [options.displayInSelect] whether to display the component in a select. defaults to false. + * @param {String|DOMElement} [options.dayField] (if using options.displayInSelect) `` field with months. + * @param {String|DOMElement} [options.yearField] (if using options.displayInSelect) ` + * + */ + var DatePicker = function(selector, options) { + this._element = selector && + Common.elOrSelector(selector, '[Ink.UI.DatePicker_1]: selector argument'); + + this._options = Common.options('Ink.UI.DatePicker_1', { + autoOpen: ['Boolean', false], + cleanText: ['String', 'Clear'], + closeText: ['String', 'Close'], + containerElement:['Element', null], + cssClass: ['String', 'ink-calendar bottom'], + dateRange: ['String', null], + + // use this in a must be a direct child of .control, and if not, remove this block. + this._wrapper = this._element.parentNode; + this._wrapperIsControl = true; + } else { + this._wrapper = InkElement.create('div', { className: 'ink-datepicker-wrapper' }); + InkElement.wrap(this._element, this._wrapper); + } + InkElement.insertAfter(this._containerObject, this._element); + }, + + /** + * Render the topmost bar with the "close" and "clear" buttons. + */ + _renderSuperTopBar: function () { + if((!this._options.showClose) || (!this._options.showClean)){ return; } + + this._superTopBar = document.createElement("div"); + this._superTopBar.className = 'ink-calendar-top-options'; + if(this._options.showClean){ + this._superTopBar.appendChild(InkElement.create('a', { + className: 'clean', + setHTML: this._options.cleanText + })); + } + if(this._options.showClose){ + this._superTopBar.appendChild(InkElement.create('a', { + className: 'close', + setHTML: this._options.closeText + })); + } + this._containerObject.appendChild(this._superTopBar); + }, + + _listenToContainerObjectEvents: function () { + Event.observe(this._containerObject,'mouseover',Ink.bindEvent(function(e){ + Event.stop( e ); + this._hoverPicker = true; + },this)); + + Event.observe(this._containerObject,'mouseout',Ink.bindEvent(function(e){ + Event.stop( e ); + this._hoverPicker = false; + },this)); + + Event.observe(this._containerObject,'click',Ink.bindEvent(this._onClick, this)); + }, + + _onClick: function(e){ + var elem = Event.element(e); + + if (Css.hasClassName(elem, 'ink-calendar-off')) { + Event.stopDefault(e); + return null; + } + + Event.stop(e); + + // Relative changers + this._onRelativeChangerClick(elem); + + // Absolute changers + this._onAbsoluteChangerClick(elem); + + // Mode changers + if (Css.hasClassName(elem, 'ink-calendar-link-month')) { + this._showMonthSelector(); + } else if (Css.hasClassName(elem, 'ink-calendar-link-year')) { + this._showYearSelector(); + } else if(Css.hasClassName(elem, 'clean')){ + this._clean(); + } else if(Css.hasClassName(elem, 'close')){ + this._hide(false); + } + + this._updateDescription(); + }, + + /** + * Handle click events on a changer (« ») for next/prev year/month + * @method _onChangerClick + * @private + **/ + _onRelativeChangerClick: function (elem) { + var changeYear = { + change_year_next: 1, + change_year_prev: -1 + }; + var changeMonth = { + change_month_next: 1, + change_month_prev: -1 + }; + + if( elem.className in changeMonth ) { + this._updateCal(changeMonth[elem.className]); + } else if( elem.className in changeYear ) { + this._showYearSelector(changeYear[elem.className]); + } + }, + + /** + * Handle click events on an atom-changer (day button, month button, year button) + * + * @method _onAbsoluteChangerClick + * @private + */ + _onAbsoluteChangerClick: function (elem) { + var elemData = InkElement.data(elem); + + if( Number(elemData.calDay) ){ + this.setDate( [this._year, this._month + 1, elemData.calDay].join('-') ); + this._hide(); + } else if( Number(elemData.calMonth) ) { + this._month = Number(elemData.calMonth) - 1; + this._showDefaultView(); + this._updateCal(); + } else if( Number(elemData.calYear) ){ + this._changeYear(Number(elemData.calYear)); + } + }, + + _changeYear: function (year) { + year = +year; + if(year){ + this._year = year; + if( typeof this._options.onYearSelected === 'function' ){ + this._options.onYearSelected(this, { + 'year': this._year + }); + } + this._showMonthSelector(); + } + }, + + _clean: function () { + if(this._options.displayInSelect){ + this._options.yearField.selectedIndex = 0; + this._options.monthField.selectedIndex = 0; + this._options.dayField.selectedIndex = 0; + } else { + this._element.value = ''; + } + }, + + /** + * Hides the DatePicker. If the component is shy (options.shy), behaves differently. + * + * @method _hide + * @param [blur=true] Set to false to indicate this is not just a blur and force hiding even if the component is shy. + */ + _hide: function(blur) { + blur = blur === undefined ? true : blur; + if (blur === false || (blur && this._options.shy)) { + Css.addClassName(this._containerObject, 'hide-all'); + } + }, + + /** + * Sets the range of dates allowed to be selected in the Date Picker + * + * @method _setMinMax + * @param {String} dateRange Two dates separated by a ':'. Example: 2013-01-01:2013-12-12 + * @private + */ + _setMinMax: function( dateRange ) { + var self = this; + + var noMinLimit = { + _year: -Number.MAX_VALUE, + _month: 0, + _day: 1 + }; + + var noMaxLimit = { + _year: Number.MAX_VALUE, + _month: 11, + _day: 31 + }; + + function noLimits() { + self._min = noMinLimit; + self._max = noMaxLimit; + } + + if (!dateRange) { return noLimits(); } + + var dates = dateRange.split( ':' ); + var rDate = /^(\d{4})((\-)(\d{1,2})((\-)(\d{1,2}))?)?$/; + + InkArray.each([ + {name: '_min', date: dates[0], noLim: noMinLimit}, + {name: '_max', date: dates[1], noLim: noMaxLimit} + ], Ink.bind(function (data) { + + var lim = data.noLim; + + if ( data.date.toUpperCase() === 'NOW' ) { + var now = new Date(); + lim = dateishFromDate(now); + } else if (data.date.toUpperCase() === 'EVER') { + lim = data.noLim; + } else if ( rDate.test( data.date ) ) { + lim = dateishFromYMDString(data.date); + + lim._month = clamp(lim._month, 0, 11); + lim._day = clamp(lim._day, 1, this._daysInMonth( lim._year, lim._month )); + } + + this[data.name] = lim; + }, this)); + + // Should be equal, or min should be smaller + var valid = this._dateCmp(this._max, this._min) !== -1; + + if (!valid) { + noLimits(); + } + }, + + /** + * Checks if a date is between the valid range. + * Starts by checking if the date passed is valid. If not, will fallback to the 'today' date. + * Then checks if the all params are inside of the date range specified. If not, it will fallback to the nearest valid date (either Min or Max). + * + * @method _fitDateToRange + * @param {Number} year Year with 4 digits (yyyy) + * @param {Number} month Month + * @param {Number} day Day + * @return {Array} Array with the final processed date. + * @private + */ + _fitDateToRange: function( date ) { + if ( !this._isValidDate( date ) ) { + date = dateishFromDate(new Date()); + } + + if (this._dateCmp(date, this._min) === -1) { + return Ink.extendObj({}, this._min); + } else if (this._dateCmp(date, this._max) === 1) { + return Ink.extendObj({}, this._max); + } + + return Ink.extendObj({}, date); // date is okay already, just copy it. + }, + + /** + * Checks whether a date is within the valid date range + * @method _dateWithinRange + * @param year + * @param month + * @param day + * @return {Boolean} + * @private + */ + _dateWithinRange: function (date) { + if (!arguments.length) { + date = this; + } + + return (!this._dateAboveMax(date) && + (!this._dateBelowMin(date))); + }, + + _dateAboveMax: function (date) { + return this._dateCmp(date, this._max) === 1; + }, + + _dateBelowMin: function (date) { + return this._dateCmp(date, this._min) === -1; + }, + + _dateCmp: function (self, oth) { + return this._dateCmpUntil(self, oth, '_day'); + }, + + /** + * _dateCmp with varied precision. You can compare down to the day field, or, just to the month. + * // the following two dates are considered equal because we asked + * // _dateCmpUntil to just check up to the years. + * + * _dateCmpUntil({_year: 2000, _month: 10}, {_year: 2000, _month: 11}, '_year') === 0 + */ + _dateCmpUntil: function (self, oth, depth) { + var props = ['_year', '_month', '_day']; + var i = -1; + + do { + i++; + if (self[props[i]] > oth[props[i]]) { return 1; } + else if (self[props[i]] < oth[props[i]]) { return -1; } + } while (props[i] !== depth && + self[props[i + 1]] !== undefined && oth[props[i + 1]] !== undefined); + + return 0; + }, + + /** + * Sets the markup in the default view mode (showing the days). + * Also disables the previous and next buttons in case they don't meet the range requirements. + * + * @method _showDefaultView + * @private + */ + _showDefaultView: function(){ + this._yearSelector.style.display = 'none'; + this._monthSelector.style.display = 'none'; + this._monthPrev.childNodes[0].className = 'change_month_prev'; + this._monthNext.childNodes[0].className = 'change_month_next'; + + if ( !this._getPrevMonth() ) { + this._monthPrev.childNodes[0].className = 'action_inactive'; + } + + if ( !this._getNextMonth() ) { + this._monthNext.childNodes[0].className = 'action_inactive'; + } + + this._monthContainer.style.display = 'block'; + }, + + /** + * Updates the date shown on the datepicker + * + * @method _updateDate + * @private + */ + _updateDate: function(){ + var dataParsed; + if(!this._options.displayInSelect && this._element.value){ + dataParsed = this._parseDate(this._element.value); + } else if (this._options.displayInSelect) { + dataParsed = { + _year: this._options.yearField[this._options.yearField.selectedIndex].value, + _month: this._options.monthField[this._options.monthField.selectedIndex].value - 1, + _day: this._options.dayField[this._options.dayField.selectedIndex].value + }; + } + + if (dataParsed) { + dataParsed = this._fitDateToRange(dataParsed); + this._year = dataParsed._year; + this._month = dataParsed._month; + this._day = dataParsed._day; + } + this.setDate(); + this._updateDescription(); + this._renderMonth(); + }, + + /** + * Updates the date description shown at the top of the datepicker + * + * EG "12 de November" + * + * @method _updateDescription + * @private + */ + _updateDescription: function(){ + this._monthChanger.innerHTML = this._options.month[ this._month + 1 ]; + this._ofText.innerHTML = this._options.ofText; + this._yearChanger.innerHTML = this._year; + }, + + /** + * Renders the year selector view of the datepicker + * + * @method _showYearSelector + * @private + */ + _showYearSelector: function(inc){ + this._incrementViewingYear(inc); + + var firstYear = this._year - (this._year % 10); + var thisYear = firstYear - 1; + var str = "
          • "; + + if (thisYear > this._min._year) { + str += '
          • ' + this._options.prevLinkText + '
          • '; + } else { + str += '
          •  
          • '; + } + + for (var i=1; i < 11; i++){ + if (i % 4 === 0){ + str+='
            '; + } + + thisYear = firstYear + i - 1; + + str += this._getYearButtonHtml(thisYear); + } + + if( thisYear < this._max._year){ + str += '
          • ' + this._options.nextLinkText + '
          • '; + } else { + str += '
          •  
          • '; + } + + str += "
        • "; + + this._yearSelector.innerHTML = str; + this._monthPrev.childNodes[0].className = 'action_inactive'; + this._monthNext.childNodes[0].className = 'action_inactive'; + this._monthSelector.style.display = 'none'; + this._monthContainer.style.display = 'none'; + this._yearSelector.style.display = 'block'; + }, + + /** + * For the year selector. + * + * Update this._year, to find the next decade or use nextValidDateFn to find it. + */ + _incrementViewingYear: function (inc) { + if (!inc) { return; } + + var year = +this._year + inc*10; + year = year - year % 10; + if ( year > this._max._year || year + 9 < this._min._year){ + return; + } + this._year = +this._year + inc*10; + }, + + _getYearButtonHtml: function (thisYear) { + if ( this._acceptableYear({_year: thisYear}) ){ + var className = (thisYear === this._year) ? ' class="ink-calendar-on"' : ''; + return '
        • ' + thisYear +'
        • '; + } else { + return '
        • ' + thisYear +'
        • '; + + } + }, + + /** + * Show the month selector (happens when you click a year, or the "month" link. + * @method _showMonthSelector + * @private + */ + _showMonthSelector: function () { + this._yearSelector.style.display = 'none'; + this._monthContainer.style.display = 'none'; + this._monthPrev.childNodes[0].className = 'action_inactive'; + this._monthNext.childNodes[0].className = 'action_inactive'; + this._addMonthClassNames(); + this._monthSelector.style.display = 'block'; + }, + + /** + * This function returns the given date in the dateish format + * + * @method _parseDate + * @param {String} dateStr A date on a string. + * @private + */ + _parseDate: function(dateStr){ + var date = InkDate.set( this._options.format , dateStr ); + if (date) { + return dateishFromDate(date); + } + return null; + }, + + /** + * Checks if a date is valid + * + * @method _isValidDate + * @param {Dateish} date + * @private + * @return {Boolean} True if the date is valid, false otherwise + */ + _isValidDate: function(date){ + var yearRegExp = /^\d{4}$/; + var validOneOrTwo = /^\d{1,2}$/; + return ( + yearRegExp.test(date._year) && + validOneOrTwo.test(date._month) && + validOneOrTwo.test(date._day) && + +date._month + 1 >= 1 && + +date._month + 1 <= 12 && + +date._day >= 1 && + +date._day <= this._daysInMonth(date._year, date._month + 1) + ); + }, + + /** + * Checks if a given date is an valid format. + * + * @method _isDate + * @param {String} format A date format. + * @param {String} dateStr A date on a string. + * @private + * @return {Boolean} True if the given date is valid according to the given format + */ + _isDate: function(format, dateStr){ + try { + if (typeof format === 'undefined'){ + return false; + } + var date = InkDate.set( format , dateStr ); + if( date && this._isValidDate( dateishFromDate(date) )) { + return true; + } + } catch (ex) {} + + return false; + }, + + _acceptableDay: function (date) { + return this._acceptableDateComponent(date, 'validDayFn'); + }, + + _acceptableMonth: function (date) { + return this._acceptableDateComponent(date, 'validMonthFn'); + }, + + _acceptableYear: function (date) { + return this._acceptableDateComponent(date, 'validYearFn'); + }, + + /** DRY base for the above 2 functions */ + _acceptableDateComponent: function (date, userCb) { + if (this._options[userCb]) { + return this._callUserCallbackBool(this._options[userCb], date); + } else { + return this._dateWithinRange(date); + } + }, + + /** + * This method returns the date written with the format specified on the options + * + * @method _writeDateInFormat + * @private + * @return {String} Returns the current date of the object in the specified format + */ + _writeDateInFormat:function(){ + return InkDate.get( this._options.format , this.getDate()); + }, + + /** + * This method allows the user to set the DatePicker's date on run-time. + * + * @method setDate + * @param {String} dateString A date string in yyyy-mm-dd format. + * @public + */ + setDate: function( dateString ) { + if ( /\d{4}-\d{1,2}-\d{1,2}/.test( dateString ) ) { + var auxDate = dateString.split( '-' ); + this._year = +auxDate[ 0 ]; + this._month = +auxDate[ 1 ] - 1; + this._day = +auxDate[ 2 ]; + } + + this._setDate( ); + }, + + /** + * Get the current date as a JavaScript date. + * + * @method getDate + */ + getDate: function () { + if (!this._day) { + throw 'Ink.UI.DatePicker: Still picking a date. Cannot getDate now!'; + } + return new Date(this._year, this._month, this._day); + }, + + /** + * Sets the chosen date on the target input field + * + * @method _setDate + * @param {DOMElement} objClicked Clicked object inside the DatePicker's calendar. + * @private + */ + _setDate : function( objClicked ) { + if (objClicked) { + var data = InkElement.data(objClicked); + this._day = (+data.calDay) || this._day; + } + + var dt = this._fitDateToRange(this); + + this._year = dt._year; + this._month = dt._month; + this._day = dt._day; + + if(!this._options.displayInSelect){ + this._element.value = this._writeDateInFormat(); + } else { + this._options.dayField.value = this._day; + this._options.monthField.value = this._month + 1; + this._options.yearField.value = this._year; + } + + if(this._options.onSetDate) { + this._options.onSetDate( this , { date : this.getDate() } ); + } + }, + + /** + * Makes the necessary work to update the calendar + * when choosing a different month + * + * @method _updateCal + * @param {Number} inc Indicates previous or next month + * @private + */ + _updateCal: function(inc){ + if( typeof this._options.onMonthSelected === 'function' ){ + this._options.onMonthSelected(this, { + 'year': this._year, + 'month' : this._month + }); + } + if (inc && this._updateMonth(inc) === null) { + return; + } + this._renderMonth(); + }, + + /** + * Function that returns the number of days on a given month on a given year + * + * @method _daysInMonth + * @param {Number} _y - year + * @param {Number} _m - month + * @private + * @return {Number} The number of days on a given month on a given year + */ + _daysInMonth: function(_y,_m){ + var exceptions = { + 2: ((_y % 400 === 0) || (_y % 4 === 0 && _y % 100 !== 0)) ? 29 : 28, + 4: 30, + 6: 30, + 9: 30, + 11: 30 + }; + + return exceptions[_m] || 31; + }, + + + /** + * Updates the calendar when a different month is chosen + * + * @method _updateMonth + * @param {Number} incValue - indicates previous or next month + * @private + */ + _updateMonth: function(incValue){ + var date; + if (incValue > 0) { + date = this._getNextMonth(); + } else if (incValue < 0) { + date = this._getPrevMonth(); + } + if (!date) { return null; } + this._year = date._year; + this._month = date._month; + this._day = date._day; + }, + + /** + * Get the next month we can show. + */ + _getNextMonth: function (date) { + return this._tryLeap( date, 'Month', 'next', function (d) { + d._month += 1; + if (d._month > 11) { + d._month = 0; + d._year += 1; + } + return d; + }); + }, + + /** + * Get the previous month we can show. + */ + _getPrevMonth: function (date) { + return this._tryLeap( date, 'Month', 'prev', function (d) { + d._month -= 1; + if (d._month < 0) { + d._month = 11; + d._year -= 1; + } + return d; + }); + }, + + /** + * Get the next year we can show. + */ + _getPrevYear: function (date) { + return this._tryLeap( date, 'Year', 'prev', function (d) { + d._year -= 1; + return d; + }); + }, + + /** + * Get the next year we can show. + */ + _getNextYear: function (date) { + return this._tryLeap( date, 'Year', 'next', function (d) { + d._year += 1; + return d; + }); + }, + + /** + * DRY base for a function which tries to get the next or previous valid year or month. + * + * It checks if we can go forward by using _dateCmp with atomic + * precision (this means, {_year} for leaping years, and + * {_year, month} for leaping months), then it tries to get the + * result from the user-supplied callback (nextDateFn or prevDateFn), + * and when this is not present, advance the date forward using the + * `advancer` callback. + */ + _tryLeap: function (date, atomName, directionName, advancer) { + date = date || { _year: this._year, _month: this._month, _day: this._day }; + + var maxOrMin = directionName === 'prev' ? '_min' : '_max'; + var boundary = this[maxOrMin]; + + // Check if we're by the boundary of min/max year/month + if (this._dateCmpUntil(date, boundary, atomName) === 0) { + return null; // We're already at the boundary. Bail. + } + + var leapUserCb = this._options[directionName + 'ValidDateFn']; + if (leapUserCb) { + return this._callUserCallbackDate(leapUserCb, date); + } else { + date = advancer(date); + } + + date = this._fitDateToRange(date); + + return this['_acceptable' + atomName](date) ? date : null; + }, + + _getNextDecade: function (date) { + date = date || { _year: this._year, _month: this._month, _day: this._day }; + var decade = this._getCurrentDecade(date); + if (decade + 10 > this._max._year) { return null; } + return decade + 10; + }, + + _getPrevDecade: function (date) { + date = date || { _year: this._year, _month: this._month, _day: this._day }; + var decade = this._getCurrentDecade(date); + if (decade - 10 < this._min._year) { return null; } + return decade - 10; + }, + + /** Returns the decade given a date or year*/ + _getCurrentDecade: function (year) { + year = year ? (year._year || year) : this._year; + return Math.floor(year / 10) * 10; // Round to first place + }, + + _callUserCallbackBase: function (cb, date) { + return cb.call(this, date._year, date._month + 1, date._day); + }, + + _callUserCallbackBool: function (cb, date) { + return !!this._callUserCallbackBase(cb, date); + }, + + _callUserCallbackDate: function (cb, date) { + var ret = this._callUserCallbackBase(cb, date); + return ret ? dateishFromDate(ret) : null; + }, + + /** + * Key-value object that (for a given key) points to the correct parsing format for the DatePicker + * @property _dateParsers + * @type {Object} + * @readOnly + */ + _dateParsers: { + 'yyyy-mm-dd' : 'Y-m-d' , + 'yyyy/mm/dd' : 'Y/m/d' , + 'yy-mm-dd' : 'y-m-d' , + 'yy/mm/dd' : 'y/m/d' , + 'dd-mm-yyyy' : 'd-m-Y' , + 'dd/mm/yyyy' : 'd/m/Y' , + 'dd-mm-yy' : 'd-m-y' , + 'dd/mm/yy' : 'd/m/y' , + 'mm/dd/yyyy' : 'm/d/Y' , + 'mm-dd-yyyy' : 'm-d-Y' + }, + + /** + * Renders the current month + * + * @method _renderMonth + * @private + */ + _renderMonth: function(){ + var month = this._month; + var year = this._year; + + // Week day of the first day in the month + var wDayFirst = (new Date( year , month , 1 )).getDay(); + + var startWeekDay = this._options.startWeekDay || 0; + + this._showDefaultView(); + + if(startWeekDay > wDayFirst) { + wDayFirst = 7 + startWeekDay - wDayFirst; + } else { + wDayFirst += startWeekDay; + } + + var html = ''; + + html += this._getMonthCalendarHeaderHtml(startWeekDay); + + var counter = 0; + html+='
            '; + + var emptyHtml = '
          •  
          • '; + + // Add padding if the first day of the month is not monday. + if(wDayFirst !== 0) { + var empties = wDayFirst - startWeekDay - 1; + counter += empties; + html += strRepeat(empties, emptyHtml); + } + + html += this._getDayButtonsHtml(counter, year, month); + + html += '
          '; + + this._monthContainer.innerHTML = html; + }, + + _getDayButtonsHtml: function (counter, year, month) { + var daysInMonth = this._daysInMonth(year, month); + var ret = ''; + for (var day = 1; day <= daysInMonth; day++) { + if (counter === 7){ // new week + counter=0; + ret += '
            '; + } + + ret += this._getDayButtonHtml(year, month, day); + + counter++; + if(counter === 7){ + ret += '
          '; + } + } + return ret; + }, + + /** + * Get the HTML markup for a single day in month view, given year, month, day. + * + * @method _getDayButtonHtml + * @private + */ + _getDayButtonHtml: function (year, month, day) { + var attrs = ' '; + var date = dateishFromYMD(year, month, day); + if (!this._acceptableDay(date)) { + attrs += 'class="ink-calendar-off"'; + } else { + attrs += 'data-cal-day="' + day + '"'; + } + + if (this._day && this._dateCmp(date, this) === 0) { + attrs += 'class="ink-calendar-on" data-cal-day="' + day + '"'; + } + + return '
        • ' + day + '
        • '; + }, + + /** Write the top bar of the calendar (M T W T F S S) */ + _getMonthCalendarHeaderHtml: function (startWeekDay) { + var ret = '
            '; + var wDay; + for(var i=0; i<7; i++){ + wDay = (startWeekDay + i) % 7; + ret += '
          • ' + + this._options.wDay[wDay].substring(0,1) + + '
          • '; + } + return ret + '
          '; + }, + + /** + * This method adds class names to month buttons, to visually distinguish. + * + * @method _addMonthClassNames + * @param {DOMElement} parent DOMElement where all the months are. + * @private + */ + _addMonthClassNames: function(parent){ + InkArray.forEach( + (parent || this._monthSelector).getElementsByTagName('a'), + Ink.bindMethod(this, '_addMonthButtonClassNames')); + }, + + /** + * Add the ink-calendar-on className if the given button is the current month, + * otherwise add the ink-calendar-off className if the given button refers to + * an unacceptable month (given dateRange and validMonthFn) + */ + _addMonthButtonClassNames: function (btn) { + var data = InkElement.data(btn); + if (!data.calMonth) { throw 'not a calendar month button!'; } + + var month = +data.calMonth - 1; + + if ( month === this._month ) { + Css.addClassName( btn, 'ink-calendar-on' ); // This month + Css.removeClassName( btn, 'ink-calendar-off' ); + } else { + Css.removeClassName( btn, 'ink-calendar-on' ); // Not this month + + var toDisable = !this._acceptableMonth({_year: this._year, _month: month}); + Css.addRemoveClassName( btn, 'ink-calendar-off', toDisable); + } + }, + + /** + * Prototype's method to allow the 'i18n files' to change all objects' language at once. + * @param {Object} options Object with the texts' configuration. + * @param {String} closeText Text of the close anchor + * @param {String} cleanText Text of the clean text anchor + * @param {String} prevLinkText "Previous" link's text + * @param {String} nextLinkText "Next" link's text + * @param {String} ofText The text "of", present in 'May of 2013' + * @param {Object} month An object with keys from 1 to 12 that have the full months' names + * @param {Object} wDay An object with keys from 0 to 6 that have the full weekdays' names + * @public + */ + lang: function( options ){ + this._lang = options; + }, + + /** + * This calls the rendering of the selected month. (Deprecated: use show() instead) + * + * @method showMonth + * @public + */ + showMonth: function(){ + this._renderMonth(); + }, + + /** + * Returns true if the calendar sceen is in 'select day' mode + * + * @return {Boolean} True if the calendar sceen is in 'select day' mode + * @public + */ + isMonthRendered: function(){ + var header = Selector.select('.ink-calendar-header', this._containerObject)[0]; + + return ((Css.getStyle(header.parentNode,'display') !== 'none') && + (Css.getStyle(header.parentNode.parentNode,'display') !== 'none') ); + }, + + /** + * Destroys this datepicker, removing it from the page. + * + * @public + **/ + destroy: function () { + InkElement.unwrap(this._element); + InkElement.remove(this._wrapper); + InkElement.remove(this._containerObject); + Common.unregisterInstance.call(this); + } + }; + + return DatePicker; +}); + +/* + * @module Ink.UI.Draggable_1 + * @author inkdev AT sapo.pt + * @version 1 + */ +Ink.createModule("Ink.UI.Draggable","1",["Ink.Dom.Element_1", "Ink.Dom.Event_1", "Ink.Dom.Css_1", "Ink.Dom.Browser_1", "Ink.Dom.Selector_1", "Ink.UI.Common_1"],function( InkElement, InkEvent, Css, Browser, Selector, Common) { + 'use strict'; + + var x = 0, + y = 1; // For accessing coords in [x, y] arrays + + // Get a value between two boundaries + function between (val, min, max) { + val = Math.min(val, max); + val = Math.max(val, min); + return val; + } + + /** + * @class Ink.UI.Draggable + * @version 1 + * @constructor + * @param {String|DOMElement} target Target element. + * @param {Object} [options] Optional object for configuring the component + * @param {String} [options.constraint] Movement constraint. None by default. Can be `vertical`, `horizontal`, or `both`. + * @param {String|DomElement} [options.constraintElm] Constrain dragging to be within this element. None by default. + * @param {Number} [options.top,left,right,bottom] Limits for constraining draggable movement. + * @param {String|DOMElement} [options.handle] if specified, this element will be used as a handle for dragging. + * @param {Boolean} [options.revert] if true, reverts the draggable to the original position when dragging stops + * @param {String} [options.cursor] cursor type (CSS `cursor` value) used when the mouse is over the draggable object + * @param {Number} [options.zIndex] zindex applied to the draggable element while dragged + * @param {Number} [options.fps] if defined, on drag will run every n frames per second only + * @param {DomElement} [options.droppableProxy] if set, a shallow copy of the droppableProxy will be put on document.body with transparent bg + * @param {String} [options.mouseAnchor] defaults to mouse cursor. can be 'left|center|right top|center|bottom' + * @param {String} [options.dragClass='drag'] class to add when the draggable is being dragged. + * @param {Function} [options.onStart] callback called when dragging starts + * @param {Function} [options.onEnd] callback called when dragging stops + * @param {Function} [options.onDrag] callback called while dragging, prior to position updates + * @param {Function} [options.onChange] callback called while dragging, after position updates + * @example + * Ink.requireModules( ['Ink.UI.Draggable_1'], function( Draggable ){ + * new Draggable( '#myElementId' ); + * }); + */ + var Draggable = function(element, options) { + this.init(element, options); + }; + + Draggable.prototype = { + + /** + * Init function called by the constructor + * + * @method _init + * @param {String|DOMElement} element ID of the element or DOM Element. + * @param {Object} [options] Options object for configuration of the module. + * @private + */ + init: function(element, options) { + var o = Ink.extendObj( { + constraint: false, + constraintElm: false, + top: false, + right: false, + bottom: false, + left: false, + handle: options.handler /* old option name */ || false, + revert: false, + cursor: 'move', + zindex: options.zindex /* old option name */ || 9999, + dragClass: 'drag', + onStart: false, + onEnd: false, + onDrag: false, + onChange: false, + droppableProxy: false, + mouseAnchor: undefined, + skipChildren: true, + fps: 100, + debug: false + }, options || {}, InkElement.data(element)); + + this.options = o; + this.element = Common.elOrSelector(element); + this.constraintElm = o.constraintElm && Common.elOrSelector(o.constraintElm); + + this.handle = false; + this.elmStartPosition = false; + this.active = false; + this.dragged = false; + this.prevCoords = false; + this.placeholder = false; + + this.position = false; + this.zindex = false; + this.firstDrag = true; + + if (o.fps) { + this.deltaMs = 1000 / o.fps; + this.lastRunAt = 0; + } + + this.handlers = {}; + this.handlers.start = Ink.bindEvent(this._onStart,this); + this.handlers.dragFacade = Ink.bindEvent(this._onDragFacade,this); + this.handlers.drag = Ink.bindEvent(this._onDrag,this); + this.handlers.end = Ink.bindEvent(this._onEnd,this); + this.handlers.selectStart = function(event) { InkEvent.stop(event); return false; }; + + // set handle + this.handle = (this.options.handle) ? + Common.elOrSelector(this.options.handle) : this.element; + this.handle.style.cursor = o.cursor; + + InkEvent.observe(this.handle, 'touchstart', this.handlers.start); + InkEvent.observe(this.handle, 'mousedown', this.handlers.start); + + if (Browser.IE) { + InkEvent.observe(this.element, 'selectstart', this.handlers.selectStart); + } + }, + + /** + * Removes the ability of the element of being dragged + * + * @method destroy + * @public + */ + destroy: function() { + InkEvent.stopObserving(this.handle, 'touchstart', this.handlers.start); + InkEvent.stopObserving(this.handle, 'mousedown', this.handlers.start); + + if (Browser.IE) { + InkEvent.stopObserving(this.element, 'selectstart', this.handlers.selectStart); + } + }, + + /** + * Gets coordinates for a given event (with added page scroll) + * + * @method _getCoords + * @param {Object} e window.event object. + * @return {Array} Array where the first position is the x coordinate, the second is the y coordinate + * @private + */ + _getCoords: function(e) { + var ps = [InkElement.scrollWidth(), InkElement.scrollHeight()]; + return { + x: (e.touches ? e.touches[0].clientX : e.clientX) + ps[x], + y: (e.touches ? e.touches[0].clientY : e.clientY) + ps[y] + }; + }, + + /** + * Clones src element's relevant properties to dst + * + * @method _cloneStyle + * @param {DOMElement} src Element from where we're getting the styles + * @param {DOMElement} dst Element where we're placing the styles. + * @private + */ + _cloneStyle: function(src, dst) { + dst.className = src.className; + dst.style.borderWidth = '0'; + dst.style.padding = '0'; + dst.style.position = 'absolute'; + dst.style.width = InkElement.elementWidth(src) + 'px'; + dst.style.height = InkElement.elementHeight(src) + 'px'; + dst.style.left = InkElement.elementLeft(src) + 'px'; + dst.style.top = InkElement.elementTop(src) + 'px'; + dst.style.cssFloat = Css.getStyle(src, 'float'); + dst.style.display = Css.getStyle(src, 'display'); + }, + + /** + * onStart event handler + * + * @method _onStart + * @param {Object} e window.event object + * @return {Boolean|void} In some cases return false. Otherwise is void + * @private + */ + _onStart: function(e) { + if (!this.active && InkEvent.isLeftClick(e) || typeof e.button === 'undefined') { + + var tgtEl = InkEvent.element(e); + if (this.options.skipChildren && tgtEl !== this.handle) { return; } + + InkEvent.stop(e); + + Css.addClassName(this.element, this.options.dragClass); + + this.elmStartPosition = [ + InkElement.elementLeft(this.element), + InkElement.elementTop( this.element) + ]; + + var pos = [ + parseInt(Css.getStyle(this.element, 'left'), 10), + parseInt(Css.getStyle(this.element, 'top'), 10) + ]; + + var dims = InkElement.elementDimensions(this.element); + + this.originalPosition = [ pos[x] ? pos[x]: null, pos[y] ? pos[y] : null ]; + this.delta = this._getCoords(e); // mouse coords at beginning of drag + + this.active = true; + this.position = Css.getStyle(this.element, 'position'); + this.zindex = Css.getStyle(this.element, 'zIndex'); + + var div = document.createElement('div'); + div.style.position = this.position; + div.style.width = dims[x] + 'px'; + div.style.height = dims[y] + 'px'; + div.style.marginTop = Css.getStyle(this.element, 'margin-top'); + div.style.marginBottom = Css.getStyle(this.element, 'margin-bottom'); + div.style.marginLeft = Css.getStyle(this.element, 'margin-left'); + div.style.marginRight = Css.getStyle(this.element, 'margin-right'); + div.style.borderWidth = '0'; + div.style.padding = '0'; + div.style.cssFloat = Css.getStyle(this.element, 'float'); + div.style.display = Css.getStyle(this.element, 'display'); + div.style.visibility = 'hidden'; + + this.delta2 = [ this.delta.x - this.elmStartPosition[x], this.delta.y - this.elmStartPosition[y] ]; // diff between top-left corner of obj and mouse + if (this.options.mouseAnchor) { + var parts = this.options.mouseAnchor.split(' '); + var ad = [dims[x], dims[y]]; // starts with 'right bottom' + if (parts[0] === 'left') { ad[x] = 0; } else if(parts[0] === 'center') { ad[x] = parseInt(ad[x]/2, 10); } + if (parts[1] === 'top') { ad[y] = 0; } else if(parts[1] === 'center') { ad[y] = parseInt(ad[y]/2, 10); } + this.applyDelta = [this.delta2[x] - ad[x], this.delta2[y] - ad[y]]; + } + + var dragHandlerName = this.options.fps ? 'dragFacade' : 'drag'; + + this.placeholder = div; + + if (this.options.onStart) { this.options.onStart(this.element, e); } + + if (this.options.droppableProxy) { // create new transparent div to optimize DOM traversal during drag + this.proxy = document.createElement('div'); + dims = [ + window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth, + window.innerHeight || document.documentElement.clientHeight || document.body.clientHeight + ]; + var fs = this.proxy.style; + fs.width = dims[x] + 'px'; + fs.height = dims[y] + 'px'; + fs.position = 'fixed'; + fs.left = '0'; + fs.top = '0'; + fs.zIndex = this.options.zindex + 1; + fs.backgroundColor = '#FF0000'; + Css.setOpacity(this.proxy, 0); + + var firstEl = document.body.firstChild; + while (firstEl && firstEl.nodeType !== 1) { firstEl = firstEl.nextSibling; } + document.body.insertBefore(this.proxy, firstEl); + + + InkEvent.observe(this.proxy, 'mousemove', this.handlers[dragHandlerName]); + InkEvent.observe(this.proxy, 'touchmove', this.handlers[dragHandlerName]); + } + else { + InkEvent.observe(document, 'mousemove', this.handlers[dragHandlerName]); + } + + this.element.style.position = 'absolute'; + this.element.style.zIndex = this.options.zindex; + this.element.parentNode.insertBefore(this.placeholder, this.element); + + this._onDrag(e); + + InkEvent.observe(document, 'mouseup', this.handlers.end); + InkEvent.observe(document, 'touchend', this.handlers.end); + + return false; + } + }, + + /** + * Function that gets the timestamp of the current run from time to time. (FPS) + * + * @method _onDragFacade + * @param {Object} window.event object. + * @private + */ + _onDragFacade: function(e) { + var now = +new Date(); + if (!this.lastRunAt || now > this.lastRunAt + this.deltaMs) { + this.lastRunAt = now; + this._onDrag(e); + } + }, + + /** + * Function that handles the dragging movement + * + * @method _onDrag + * @param {Object} window.event object. + * @private + */ + _onDrag: function(e) { + if (this.active) { + InkEvent.stop(e); + this.dragged = true; + var mouseCoords = this._getCoords(e), + mPosX = mouseCoords.x, + mPosY = mouseCoords.y, + o = this.options, + newX = false, + newY = false; + + if (this.prevCoords && mPosX !== this.prevCoords.x || mPosY !== this.prevCoords.y) { + if (o.onDrag) { o.onDrag(this.element, e); } + this.prevCoords = mouseCoords; + + newX = this.elmStartPosition[x] + mPosX - this.delta.x; + newY = this.elmStartPosition[y] + mPosY - this.delta.y; + + var draggableSize = InkElement.elementDimensions(this.element); + + if (this.constraintElm) { + var offset = InkElement.offset(this.constraintElm); + var size = InkElement.elementDimensions(this.constraintElm); + var constTop = offset[y] + (o.top || 0), + constBottom = offset[y] + size[y] - (o.bottom || 0), + constLeft = offset[x] + (o.left || 0), + constRight = offset[x] + size[x] - (o.right || 0); + + newY = between(newY, constTop, constBottom - draggableSize[y]); + newX = between(newX, constLeft, constRight - draggableSize[x]); + } else if (o.constraint) { + var right = o.right === false ? InkElement.pageWidth() - draggableSize[x] : o.right, + left = o.left === false ? 0 : o.left, + top = o.top === false ? 0 : o.top, + bottom = o.bottom === false ? InkElement.pageHeight() - draggableSize[y] : o.bottom; + if (o.constraint === 'horizontal' || o.constraint === 'both') { + newX = between(newX, left, right); + } + if (o.constraint === 'vertical' || o.constraint === 'both') { + newY = between(newY, top, bottom); + } + } + + var Droppable = Ink.getModule('Ink.UI.Droppable_1'); + if (this.firstDrag) { + if (Droppable) { Droppable.updateAll(); } + /*this.element.style.position = 'absolute'; + this.element.style.zIndex = this.options.zindex; + this.element.parentNode.insertBefore(this.placeholder, this.element);*/ + this.firstDrag = false; + } + + if (newX) { this.element.style.left = newX + 'px'; } + if (newY) { this.element.style.top = newY + 'px'; } + + if (Droppable) { + // apply applyDelta defined on drag init + var mouseCoords2 = this.options.mouseAnchor ? + {x: mPosX - this.applyDelta[x], y: mPosY - this.applyDelta[y]} : + mouseCoords; + Droppable.action(mouseCoords2, 'drag', e, this.element); + } + if (o.onChange) { o.onChange(this); } + } + } + }, + + /** + * Function that handles the end of the dragging process + * + * @method _onEnd + * @param {Object} window.event object. + * @private + */ + _onEnd: function(e) { + InkEvent.stopObserving(document, 'mousemove', this.handlers.drag); + InkEvent.stopObserving(document, 'touchmove', this.handlers.drag); + + if (this.options.fps) { + this._onDrag(e); + } + + Css.removeClassName(this.element, this.options.dragClass); + + if (this.active && this.dragged) { + + if (this.options.droppableProxy) { // remove transparent div... + document.body.removeChild(this.proxy); + } + + if (this.pt) { // remove debugging element... + InkElement.remove(this.pt); + this.pt = undefined; + } + + /*if (this.options.revert) { + this.placeholder.parentNode.removeChild(this.placeholder); + }*/ + + if(this.placeholder) { + InkElement.remove(this.placeholder); + } + + if (this.options.revert) { + this.element.style.position = this.position; + if (this.zindex !== null) { + this.element.style.zIndex = this.zindex; + } + else { + this.element.style.zIndex = 'auto'; + } // restore default zindex of it had none + + this.element.style.left = (this.originalPosition[x]) ? this.originalPosition[x] + 'px' : ''; + this.element.style.top = (this.originalPosition[y]) ? this.originalPosition[y] + 'px' : ''; + } + + if (this.options.onEnd) { + this.options.onEnd(this.element, e); + } + + var Droppable = Ink.getModule('Ink.UI.Droppable_1'); + if (Droppable) { + Droppable.action(this._getCoords(e), 'drop', e, this.element); + } + + this.position = false; + this.zindex = false; + this.firstDrag = true; + } + + this.active = false; + this.dragged = false; + } + }; + + return Draggable; + +}); + +/** + * @module Ink.UI.Dropdown_1 + * + * @author inkdev AT sapo.pt + * @version 1 + */ +Ink.createModule('Ink.UI.Dropdown', '1', ['Ink.UI.Common_1', 'Ink.UI.Toggle_1', 'Ink.Dom.Event_1', 'Ink.Dom.Element_1'], function(Common, Toggle, InkEvent, InkElement) { + 'use strict'; + + function Dropdown(trigger, options) { + this._init(trigger, options); + } + + Dropdown.prototype = { + /** + * Use this UI module to achieve a dropdown menu. + * + * @class Ink.UI.Dropdown + * + * @constructor + * @param {DOMElement|String} trigger + * @param {Object} options + * @param {DOMElement|String} options.target Target of the dropdown action. + */ + _init: function(trigger, options) { + this._element = Common.elOrSelector(trigger); + this._options = Common.options('Ink.UI.Dropdown_1', { + 'target': ['Element'], + 'hoverOpen': ['Number', null], + 'dismissOnInsideClick': ['Boolean', false], + 'dismissOnOutsideClick': ['Boolean', true], + 'dismissAfter': ['Number', null], + 'onInsideClick': ['Function', null], + 'onOutsideClick': ['Function', null], + 'onOpen': ['Function', null], + 'onDismiss': ['Function', null] + }, options || {}, this._element); + + this._toggle = new Toggle(this._element, { + target: this._options.target, + closeOnInsideClick: null, + closeOnClick: false, + onChangeState: Ink.bind(function (newState) { + return this._openOrDismiss(newState, true, true); + }, this) + }); + + // Event where we set this._dismissTimeout and clear this._openTimeout + InkEvent.observeMulti([this._options.target, this._element], + 'mouseout', Ink.bindMethod(this, '_onMouseOut')); + + // Events to keep clearing this._dismissTimeout and set this._openTimeout + InkEvent.observeMulti([this._options.target, this._element], + 'mouseover', Ink.bindMethod(this, '_onMouseOver')); + + // to call dismissOnInsideClick and onInsideClick + InkEvent.observe(this._options.target, 'click', Ink.bindMethod(this, '_onInsideClick')); + // to call dismissOnOutsideClick and onOutsideClick + InkEvent.observe(document, 'click', Ink.bindMethod(this, '_onOutsideClick')); + }, + + /** + * Called when the mouse is over the toggler, or the dropdown. + * + * Deals with "hoverOpen" by setting the dropdown to open later. Also cancels "dismissAfter". + * @method _onMouseOver + * @private + **/ + _onMouseOver: function () { + if (typeof this._options.hoverOpen === 'number' && this._toggle.getState() === false) { + clearTimeout(this._openTimeout); + this._openTimeout = setTimeout( + Ink.bindMethod(this, 'open', true), + this._options.hoverOpen * 1000); + } + if (typeof this._options.dismissAfter === 'number') { + clearTimeout(this._dismissTimeout); + } + }, + + /** + * Called when the mouse leaves either the toggler, or the dropdown. + * + * Deals with "dismissAfter" by setting the dropdown to be dismissed later. Also cancels "hoverOpen". + * @method _onMouseOut + * @private + **/ + _onMouseOut: function () { + if (typeof this._options.dismissAfter === 'number' && this._toggle.getState() === true) { + clearTimeout(this._dismissTimeout); + this._dismissTimeout = setTimeout( + Ink.bindMethod(this, 'dismiss', true), + this._options.dismissAfter * 1000); + } + if (typeof this._options.hoverOpen === 'number') { + clearTimeout(this._openTimeout); + } + }, + + /** + * Handle clicks on the dropdown. + * @method _onInsideClick + * @private + */ + _onInsideClick: function (event) { + var ret = this._handlerCall('onInsideClick', InkEvent.element(event)); + if (ret === false) { return false; } + if (this._options.dismissOnInsideClick) { + this.dismiss(true); + } + InkEvent.stop(event); + }, + + /** + * Handle clicks outside the dropdown. + * @method _onInsideClick + * @private + */ + _onOutsideClick: function (event) { + var target = InkEvent.element(event); + var foundElem = InkElement.findUpwardsHaving(target, Ink.bind(function (needle) { + return needle === this._element; + }, this)); + var foundTarget = InkElement.findUpwardsHaving(target, Ink.bind(function (needle) { + return needle === this._options.target; + }, this)); + + if (!foundElem && !foundTarget) { + var ret = this._handlerCall('onOutsideClick', target); + if (ret === false) { return false; } + if (this._options.dismissOnOutsideClick) { + this.dismiss(true); + } + InkEvent.stop(event); + } + }, + + /** + * Dismiss the dropdown. + * + * @method dismiss + * @param [callHandler=false] call onDismiss handler + */ + dismiss: function (callHandler, doNotInformToggle) { + this._openOrDismiss(false, callHandler, doNotInformToggle); + }, + + /** + * Open the dropdown + * + * @method open + * @param [callHandler=false] call onOpen handler + */ + open: function (callHandler, _doNotInformToggle) { + this._openOrDismiss(true, callHandler, _doNotInformToggle); + }, + + /** + * DRY'ing up open() and dismiss() + * + * @method _openOrDismiss + * @param [newState=false] + * @param [callHandler=false] + * @private + */ + _openOrDismiss: function (newState, callHandler, _doNotInformToggle) { + if (this._toggle && this._toggle.getState() === newState) { return; } + if (callHandler) { + if (this._handlerCall(newState ? 'onOpen' : 'onDismiss') === false) { + return false; // canceled by event handler + } + } + if (!_doNotInformToggle) { + this._toggle.setState(newState); + } + clearTimeout(this._dismissTimeout); + clearTimeout(this._openTimeout); + }, + + /** + * call a method given by the user through the options + * + * @method _handlerCall + * @params handler {String} The handler name in this._options + * @params ... Arguments to pass to function + */ + _handlerCall: function (handler/*, ... */) { + if (this._options[handler]) { + return this._options[handler].call(this, [].slice.call(arguments, 1)); + } + } + }; + + return Dropdown; +}); + + +/** + * @module Ink.UI.Droppable_1 + * @author inkdev AT sapo.pt + * @version 1 + */ +Ink.createModule("Ink.UI.Droppable","1",["Ink.Dom.Element_1", "Ink.Dom.Event_1", "Ink.Dom.Css_1", "Ink.UI.Common_1", "Ink.Util.Array_1", "Ink.Dom.Selector_1"], function( InkElement, InkEvent, Css, Common, InkArray, Selector) { + 'use strict'; + + // Higher order functions + var hAddClassName = function (element) { + return function (className) {return Css.addClassName(element, className);}; + }; + var hRemoveClassName = function (element) { + return function (className) {return Css.removeClassName(element, className);}; + }; + + /** + * @class Ink.UI.Droppable + * @version 1 + * @static + */ + var Droppable = { + /** + * Flag that determines if it's in debug mode or not + * + * @property debug + * @type {Boolean} + * @private + */ + debug: false, + + /** + * Array with the data of each element (`{element: ..., data: ..., options: ...}`) + * + * @property _droppables + * @type {Array} + * @private + */ + _droppables: [], + + /** + * Array of data for each draggable. (`{element: ..., data: ...}`) + * + * @property _draggables + * @type {Array} + * @private + */ + _draggables: [], + + /** + * Makes an element droppable and adds it to the stack of droppable elements. + * Can consider it a constructor of droppable elements, but where no Droppable object is returned. + * + * In the following arguments, any events/callbacks you may pass, can be either functions or strings. If the 'move' or 'copy' strings are passed, the draggable gets moved into this droppable. If 'revert' is passed, an acceptable droppable is moved back to the element it came from. + + * + * @method add + * @param {String|DOMElement} element Target element + * @param {Object} [options] options object + * @param {String} [options.hoverClass] Classname(s) applied when an acceptable draggable element is hovering the element + * @param {String} [options.accept] Selector for choosing draggables which can be dropped in this droppable. + * @param {Function} [options.onHover] callback called when an acceptable draggable element is hovering the droppable. Gets the draggable and the droppable element as parameters. + * @param {Function|String} [options.onDrop] callback called when an acceptable draggable element is dropped. Gets the draggable, the droppable and the event as parameters. + * @param {Function|String} [options.onDropOut] callback called when a droppable is dropped outside this droppable. Gets the draggable, the droppable and the event as parameters. (see above for string options). + * @public + * + * @example + * + * + *
            + *
          • Draggable 1
          • + *
          • Draggable 2
          • + *
          • Draggable 3
          • + *
          + *
            + *
          + * + * + */ + add: function(element, options) { + element = Common.elOrSelector(element, 'Droppable.add target element'); + + var opt = Ink.extendObj( { + hoverClass: options.hoverclass /* old name */ || false, + accept: false, + onHover: false, + onDrop: false, + onDropOut: false + }, options || {}, InkElement.data(element)); + + if (typeof opt.hoverClass === 'string') { + opt.hoverClass = opt.hoverClass.split(/\s+/); + } + + function cleanStyle(draggable) { + draggable.style.position = 'inherit'; + } + var that = this; + var namedEventHandlers = { + move: function (draggable, droppable/*, event*/) { + cleanStyle(draggable); + droppable.appendChild(draggable); + }, + copy: function (draggable, droppable/*, event*/) { + cleanStyle(draggable); + droppable.appendChild(draggable.cloneNode); + }, + revert: function (draggable/*, droppable, event*/) { + that._findDraggable(draggable).originalParent.appendChild(draggable); + cleanStyle(draggable); + } + }; + var name; + + if (typeof opt.onHover === 'string') { + name = opt.onHover; + opt.onHover = namedEventHandlers[name]; + if (opt.onHover === undefined) { + throw new Error('Unknown hover event handler: ' + name); + } + } + if (typeof opt.onDrop === 'string') { + name = opt.onDrop; + opt.onDrop = namedEventHandlers[name]; + if (opt.onDrop === undefined) { + throw new Error('Unknown drop event handler: ' + name); + } + } + if (typeof opt.onDropOut === 'string') { + name = opt.onDropOut; + opt.onDropOut = namedEventHandlers[name]; + if (opt.onDropOut === undefined) { + throw new Error('Unknown dropOut event handler: ' + name); + } + } + + var elementData = { + element: element, + data: {}, + options: opt + }; + this._droppables.push(elementData); + this._update(elementData); + }, + + /** + * find droppable data about `element`. this data is added in `.add` + * + * @method _findData + * @param {DOMElement} element Needle + * @return {object} Droppable data of the element + * @private + */ + _findData: function (element) { + var elms = this._droppables; + for (var i = 0, len = elms.length; i < len; i++) { + if (elms[i].element === element) { + return elms[i]; + } + } + }, + /** + * Find draggable data about `element` + * + * @method _findDraggable + * @param {DOMElement} element Needle + * @return {Object} Draggable data queried + * @private + */ + _findDraggable: function (element) { + var elms = this._draggables; + for (var i = 0, len = elms.length; i < len; i++) { + if (elms[i].element === element) { + return elms[i]; + } + } + }, + + /** + * Invoke every time a drag starts + * + * @method updateAll + * @private + */ + updateAll: function() { + InkArray.each(this._droppables, Droppable._update); + }, + + /** + * Updates location and size of droppable element + * + * @method update * @param {String|DOMElement} element - target element + * @private + */ + update: function(element) { + this._update(this._findData(element)); + }, + + _update: function(elementData) { + var data = elementData.data; + var element = elementData.element; + data.left = InkElement.offsetLeft(element); + data.top = InkElement.offsetTop( element); + data.right = data.left + InkElement.elementWidth( element); + data.bottom = data.top + InkElement.elementHeight(element); + }, + + /** + * Removes an element from the droppable stack and removes the droppable behavior + * + * @method remove + * @param {String|DOMElement} elOrSelector Droppable element to disable. + * @return {Boolean} Whether the object was found and deleted + * @public + */ + remove: function(el) { + el = Common.elOrSelector(el); + var len = this._droppables.length; + for (var i = 0; i < len; i++) { + if (this._droppables[i].element === el) { + this._droppables.splice(i, 1); + break; + } + } + return len !== this._droppables.length; + }, + + /** + * Method called by a draggable to execute an action on a droppable + * + * @method action + * @param {Object} coords coordinates where the action happened + * @param {String} type type of action. drag or drop. + * @param {Object} ev Event object + * @param {Object} draggable draggable element + * @private + */ + action: function(coords, type, ev, draggable) { + // check all droppable elements + InkArray.each(this._droppables, Ink.bind(function(elementData) { + var data = elementData.data; + var opt = elementData.options; + var element = elementData.element; + + if (opt.accept && !Selector.matches(opt.accept, [draggable]).length) { + return; + } + + if (type === 'drag' && !this._findDraggable(draggable)) { + this._draggables.push({ + element: draggable, + originalParent: draggable.parentNode + }); + } + + // check if our draggable is over our droppable + if (coords.x >= data.left && coords.x <= data.right && + coords.y >= data.top && coords.y <= data.bottom) { + // INSIDE + if (type === 'drag') { + if (opt.hoverClass) { + InkArray.each(opt.hoverClass, + hAddClassName(element)); + } + if (opt.onHover) { + opt.onHover(draggable, element); + } + } else if (type === 'drop') { + if (opt.hoverClass) { + InkArray.each(opt.hoverClass, + hRemoveClassName(element)); + } + if (opt.onDrop) { + opt.onDrop(draggable, element, ev); + } + } + } else { + // OUTSIDE + + if (type === 'drag' && opt.hoverClass) { + InkArray.each(opt.hoverClass, hRemoveClassName(element)); + } else if (type === 'drop') { + if(opt.onDropOut){ + opt.onDropOut(draggable, element, ev); + } + } + } + }, this)); + } + }; + + return Droppable; +}); + +/** + * @module Ink.UI.FormValidator_1 + * @author inkdev AT sapo.pt + * @version 1 + **/ +Ink.createModule('Ink.UI.FormValidator', '1', ['Ink.Dom.Element_1', 'Ink.Dom.Css_1','Ink.Util.Validator_1','Ink.Dom.Selector_1'], function( InkElement, Css, InkValidator , Selector) { + 'use strict'; + + function elementsWithSameName(elm) { + if (!elm.name) { return []; } + if (!elm.form) { + return Selector.select('name="' + elm.name + '"'); + } + var ret = elm.form[elm.name]; + if(typeof(ret.length) === 'undefined') { + ret = [ret]; + } + return ret; + } + /** + * @class Ink.UI.FormValidator + * @version 1 + */ + var FormValidator = { + + /** + * Specifies the version of the component + * + * @property version + * @type {String} + * @readOnly + * @public + */ + version: '1', + + /** + * Available flags to use in the validation process. + * The keys are the 'rules', and their values are objects with the key 'msg', determining + * what is the error message. + * + * @property _flagMap + * @type {Object} + * @readOnly + * @private + */ + _flagMap: { + //'ink-fv-required': {msg: 'Campo obrigatório'}, + 'ink-fv-required': {msg: 'Required field'}, + //'ink-fv-email': {msg: 'E-mail inválido'}, + 'ink-fv-email': {msg: 'Invalid e-mail address'}, + //'ink-fv-url': {msg: 'URL inválido'}, + 'ink-fv-url': {msg: 'Invalid URL'}, + //'ink-fv-number': {msg: 'Número inválido'}, + 'ink-fv-number': {msg: 'Invalid number'}, + //'ink-fv-phone_pt': {msg: 'Número de telefone inválido'}, + 'ink-fv-phone_pt': {msg: 'Invalid phone number'}, + //'ink-fv-phone_cv': {msg: 'Número de telefone inválido'}, + 'ink-fv-phone_cv': {msg: 'Invalid phone number'}, + //'ink-fv-phone_mz': {msg: 'Número de telefone inválido'}, + 'ink-fv-phone_mz': {msg: 'Invalid phone number'}, + //'ink-fv-phone_ao': {msg: 'Número de telefone inválido'}, + 'ink-fv-phone_ao': {msg: 'Invalid phone number'}, + //'ink-fv-date': {msg: 'Data inválida'}, + 'ink-fv-date': {msg: 'Invalid date'}, + //'ink-fv-confirm': {msg: 'Confirmação inválida'}, + 'ink-fv-confirm': {msg: 'Confirmation does not match'}, + 'ink-fv-custom': {msg: ''} + }, + + /** + * This property holds all form elements for later validation + * + * @property elements + * @type {Object} + * @public + */ + elements: {}, + + /** + * This property holds the objects needed to cross-check for the 'confirm' rule + * + * @property confirmElms + * @type {Object} + * @public + */ + confirmElms: {}, + + /** + * This property holds the previous elements in the confirmElms property, but with a + * true/false specifying if it has the class ink-fv-confirm. + * + * @property hasConfirm + * @type {Object} + */ + hasConfirm: {}, + + /** + * Defined class name to use in error messages label + * + * @property _errorClassName + * @type {String} + * @readOnly + * @private + */ + _errorClassName: 'tip error', + + /** + * @property _errorValidationClassName + * @type {String} + * @readOnly + * @private + */ + _errorValidationClassName: 'validaton', + + /** + * @property _errorTypeWarningClassName + * @type {String} + * @readOnly + * @private + */ + _errorTypeWarningClassName: 'warning', + + /** + * @property _errorTypeErrorClassName + * @type {String} + * @readOnly + * @private + */ + _errorTypeErrorClassName: 'error', + + /** + * Check if a form is valid or not + * + * @method validate + * @param {DOMElement|String} elm DOM form element or form id + * @param {Object} options Options for + * @param {Function} [options.onSuccess] function to run when form is valid + * @param {Function} [options.onError] function to run when form is not valid + * @param {Array} [options.customFlag] custom flags to use to validate form fields + * @public + * @return {Boolean} Whether the form is deemed valid or not. + * + * @example + * + * ## What markup do I need? + * + * Besides the markup structure you can see in + * , you need to add + * the `ink-fv-*` classes to your inputs, which correspond to validation + * rules in this component. Available classes are: + * + * - `ink-fv-required` : Required field + * - `ink-fv-email` : Valid e-mail + * - `ink-fv-url` : Valid URL address + * - `ink-fv-number` : Valid number + * - `ink-fv-phone_pt`, `ink-fv-phone_cv`, `ink-fv-phone_mz`, `ink-fv-phone_ao` : Valid telephone number in Portugal, Cape Verde, Mozambique or Angola. + * - `ink-fv-date` : Valid date + * - `ink-fv-confirm` : Make the user type the same thing twice. Common rule for confirming passwords. + * - `ink-fv-custom` : Custom rule (see below example "Custom rule") + * + * E-mail field:
          + * Phone number field:
          + * Website field (optional): + * + * ## Simple usage + * + * So you have a form and would like to validate it? This example shows + * how to validate a form and stop it from being submitted when invalid. + * To use this, add the several ink-fv-* classes to your input elements. + * + * The validate() function will also add "invalid" classes to each of + * your elements so the user gets a color feedback and an error message + * below each element (control-group, really). + * + * var myForm = Ink.i('my-form'); + * InkEvent.observe(myForm, 'submit', function (ev) { + * var formIsValid = FormValidator.validate(myForm); + * if (!formIsValid) { + * InkEvent.stop(ev); // Cancel submission of form. + * } + * }); + * + * @example + * + * ## Custom rule. + * + * The following code validates using a custom rule named `minthree`, + * which fails if the input string has less than three characters. + * To do this, you must add the `ink-fv-custom` and `minthree` classes + * to the input elements you want to validate, and pass the `customFlag` + * option to this function, like so: + * + * var isValid = FormValidator.validate(myForm, { + * customFlag: [ + * { + * flag: 'minthree', // The name of this rule (add this class to your s + * msg: 'Please input at least three characters', // Error message when rule fails + * callback: function (el) { + * return el.value.length >= 3 // Return true when okay, false when not + * } + * } + * ] + * }); + */ + validate: function(elm, options) { + this._free(); + + options = Ink.extendObj({ + onSuccess: false, + onError: false, + customFlag: false, + confirmGroup: [] + }, options || {}); + + if(typeof(elm) === 'string') { + elm = document.getElementById(elm); + } + if(elm === null){ + return false; + } + this.element = elm; + + if(typeof(this.element.id) === 'undefined' || this.element.id === null || this.element.id === '') { + // generate a random ID + // TODO ugly and potentially problematic, and you know Murphy's law. + this.element.id = 'ink-fv_randomid_'+(Math.round(Math.random() * 99999)); + } + + this.custom = options.customFlag; + + this.confirmGroup = options.confirmGroup; + + var fail = this._validateElements(); + + if(fail.length > 0) { + if(options.onError) { + options.onError(fail); + } else { + this._showError(elm, fail); + } + return false; + } else { + if(!options.onError) { + this._clearError(elm); + } + this._clearCache(); + if(options.onSuccess) { + options.onSuccess(); + } + return true; + } + + }, + + /** + * Reset previously generated validation errors + * + * @method reset + * @public + */ + reset: function() + { + this._clearError(); + this._clearCache(); + }, + + /** + * Cleans the object + * + * @method _free + * @private + */ + _free: function() + { + this.element = null; + //this.elements = []; + this.custom = false; + this.confirmGroup = false; + }, + + /** + * Cleans the properties responsible for caching + * + * @method _clearCache + * @private + */ + _clearCache: function() + { + this.element = null; + this.elements = []; + this.custom = false; + this.confirmGroup = false; + }, + + /** + * Gets the form elements and stores them in the caching properties + * + * @method _getElements + * @private + */ + _getElements: function() + { + //this.elements = []; + // if(typeof(this.elements[this.element.id]) !== 'undefined') { + // return; + // } + + var elements = this.elements[this.element.id] = []; + this.confirmElms[this.element.id] = []; + //console.log(this.element); + //console.log(this.element.elements); + var formElms = Selector.select(':input', this.element); + var curElm = false; + for(var i=0, totalElm = formElms.length; i < totalElm; i++) { + curElm = formElms[i]; + var type = (curElm.getAttribute('type') + '').toLowerCase(); + + if (type === 'radio' || type === 'checkbox') { + if(elements.length === 0 || + ( + curElm.getAttribute('type') !== elements[elements.length - 1].getAttribute('type') && + curElm.getAttribute('name') !== elements[elements.length - 1].getAttribute('name') + )) { + for(var flag in this._flagMap) { + if(Css.hasClassName(curElm, flag)) { + elements.push(curElm); + break; + } + } + } + } else { + for(var flag2 in this._flagMap) { + if(Css.hasClassName(curElm, flag2) && flag2 !== 'ink-fv-confirm') { + /*if(flag2 == 'ink-fv-confirm') { + this.confirmElms[this.element.id].push(curElm); + this.hasConfirm[this.element.id] = true; + }*/ + elements.push(curElm); + break; + } + } + + if(Css.hasClassName(curElm, 'ink-fv-confirm')) { + this.confirmElms[this.element.id].push(curElm); + this.hasConfirm[this.element.id] = true; + } + + } + } + }, + + /** + * Runs the validation for each element + * + * @method _validateElements + * @private + */ + _validateElements: function() { + var oGroups; + this._getElements(); + if(this.hasConfirm[this.element.id] === true) { + oGroups = this._makeConfirmGroups(); + } + + var errors = []; + + var curElm = false; + var customErrors = false; + var inArray; + for(var i=0, totalElm = this.elements[this.element.id].length; i < totalElm; i++) { + inArray = false; + curElm = this.elements[this.element.id][i]; + + if(!curElm.disabled) { + for(var flag in this._flagMap) { + if(Css.hasClassName(curElm, flag)) { + if(flag !== 'ink-fv-custom' && flag !== 'ink-fv-confirm') { + if(!this._isValid(curElm, flag)) { + if(!inArray) { + errors.push({elm: curElm, errors:[flag]}); + inArray = true; + } else { + errors[(errors.length - 1)].errors.push(flag); + } + } + } else if(flag !== 'ink-fv-confirm'){ + customErrors = this._isCustomValid(curElm); + if(customErrors.length > 0) { + errors.push({elm: curElm, errors:[flag], custom: customErrors}); + } + } else if(flag === 'ink-fv-confirm'){ + continue; + } + } + } + } + } + errors = this._validateConfirmGroups(oGroups, errors); + //console.log(InkDumper.returnDump(errors)); + return errors; + }, + + /** + * Runs the 'confirm' validation for each group of elements + * + * @method _validateConfirmGroups + * @param {Array} oGroups Array/Object that contains the group of confirm objects + * @param {Array} errors Array that will store the errors + * @private + * @return {Array} Array of errors that was passed as 2nd parameter (either changed, or not, depending if errors were found). + */ + _validateConfirmGroups: function(oGroups, errors) { + //console.log(oGroups); + var curGroup = false; + for(var i in oGroups) if (oGroups.hasOwnProperty(i)) { + curGroup = oGroups[i]; + if(curGroup.length === 2) { + if(curGroup[0].value !== curGroup[1].value) { + errors.push({elm:curGroup[1], errors:['ink-fv-confirm']}); + } + } + } + return errors; + }, + + /** + * Creates the groups of 'confirm' objects + * + * @method _makeConfirmGroups + * @private + * @return {Array|Boolean} Returns the array of confirm elements or false on error. + */ + _makeConfirmGroups: function() + { + var oGroups; + if(this.confirmGroup && this.confirmGroup.length > 0) { + oGroups = {}; + var curElm = false; + var curGroup = false; + //this.confirmElms[this.element.id]; + for(var i=0, total=this.confirmElms[this.element.id].length; i < total; i++) { + curElm = this.confirmElms[this.element.id][i]; + for(var j=0, totalG=this.confirmGroup.length; j < totalG; j++) { + curGroup = this.confirmGroup[j]; + if(Css.hasClassName(curElm, curGroup)) { + if(typeof(oGroups[curGroup]) === 'undefined') { + oGroups[curGroup] = [curElm]; + } else { + oGroups[curGroup].push(curElm); + } + } + } + } + return oGroups; + } else { + if(this.confirmElms[this.element.id].length === 2) { + oGroups = { + "ink-fv-confirm": [ + this.confirmElms[this.element.id][0], + this.confirmElms[this.element.id][1] + ] + }; + } + return oGroups; + } + return false; + }, + + /** + * Validates an element with a custom validation + * + * @method _isCustomValid + * @param {DOMElemenmt} elm Element to be validated + * @private + * @return {Array} Array of errors. If no errors are found, results in an empty array. + */ + _isCustomValid: function(elm) + { + var customErrors = []; + var curFlag = false; + for(var i=0, tCustom = this.custom.length; i < tCustom; i++) { + curFlag = this.custom[i]; + if(Css.hasClassName(elm, curFlag.flag)) { + if(!curFlag.callback(elm, curFlag.msg)) { + customErrors.push({flag: curFlag.flag, msg: curFlag.msg}); + } + } + } + return customErrors; + }, + + /** + * Runs the normal validation functions for a specific element + * + * @method _isValid + * @param {DOMElement} elm DOMElement that will be validated + * @param {String} fieldType Rule to be validated. This must be one of the keys present in the _flagMap property. + * @private + * @return {Boolean} The result of the validation. + */ + _isValid: function(elm, fieldType) { + var nodeName = elm.nodeName.toLowerCase(); + var inputType = (elm.getAttribute('type') || '').toLowerCase(); + var value = this._trim(elm.value); + + // When we're analyzing emails, telephones, etc, and the field is + // empty, we check if it is required. If not required, it's valid. + if (fieldType !== 'ink-fv-required' && + inputType !== 'checkbox' && inputType !== 'radio' && + value === '') { + return !Css.hasClassName(elm, 'ink-fv-required'); + } + + switch(fieldType) { + case 'ink-fv-required': + if(nodeName === 'select') { + if(elm.selectedIndex > 0) { + return true; + } else { + return false; + } + } + if(inputType !== 'checkbox' && inputType !== 'radio' && + value !== '') { + return true; // A input type=text,email,etc. + } else if(inputType === 'checkbox' || inputType === 'radio') { + var aFormRadios = elementsWithSameName(elm); + var isChecked = false; + // check if any input of the radio is checked + for(var i=0, totalRadio = aFormRadios.length; i < totalRadio; i++) { + if(aFormRadios[i].checked === true) { + isChecked = true; + break; + } + } + return isChecked; + } + return false; + + case 'ink-fv-email': + return InkValidator.mail(elm.value); + + case 'ink-fv-url': + return InkValidator.url(elm.value); + + case 'ink-fv-number': + return !isNaN(Number(elm.value)) && isFinite(Number(elm.value)); + + case 'ink-fv-phone_pt': + return InkValidator.isPTPhone(elm.value); + + case 'ink-fv-phone_cv': + return InkValidator.isCVPhone(elm.value); + + case 'ink-fv-phone_ao': + return InkValidator.isAOPhone(elm.value); + + case 'ink-fv-phone_mz': + return InkValidator.isMZPhone(elm.value); + + case 'ink-fv-date': + var Element = Ink.getModule('Ink.Dom.Element',1); + var dataset = Element.data( elm ); + var validFormat = 'yyyy-mm-dd'; + + if( Css.hasClassName(elm, 'ink-datepicker') && ('format' in dataset) ){ + validFormat = dataset.format; + } else if( ('validFormat' in dataset) ){ + validFormat = dataset.validFormat; + } + + if( !(validFormat in InkValidator._dateParsers ) ){ + var validValues = []; + for( var val in InkValidator._dateParsers ){ + if (InkValidator._dateParsers.hasOwnProperty(val)) { + validValues.push(val); + } + } + throw new Error( + 'The attribute data-valid-format must be one of ' + + 'the following values: ' + validValues.join(', ')); + } + + return InkValidator.isDate( validFormat, elm.value ); + case 'ink-fv-custom': + break; + } + + return false; + }, + + /** + * Makes the necessary changes to the markup to show the errors of a given element + * + * @method _showError + * @param {DOMElement} formElm The form element to be changed to show the errors + * @param {Array} aFail An array with the errors found. + * @private + */ + _showError: function(formElm, aFail) { + this._clearError(formElm); + + //ink-warning-field + + //console.log(aFail); + var curElm = false; + for(var i=0, tFail = aFail.length; i < tFail; i++) { + curElm = aFail[i].elm; + if (curElm) { + this._showAnErrorOnElement(curElm, aFail[i]); + } + } + }, + + _showAnErrorOnElement: function (curElm, error) { + /* jshint noempty:false */ + + var controlGroupElm = InkElement.findUpwardsByClass( + curElm, 'control-group'); + var controlElm = InkElement.findUpwardsByClass( + curElm, 'control'); + + var errorClasses = [ + this._errorClassName, + this._errorTypeClassName].join(' '); + + var errorMsg = InkElement.create('p', { + className: errorClasses + }); + + if(error.errors[0] !== 'ink-fv-custom') { + errorMsg.innerHTML = this._flagMap[error.errors[0]].msg; + } else { + errorMsg.innerHTML = error.custom[0].msg; + } + + var target = (controlElm || controlGroupElm); + if (target) { + target.appendChild(errorMsg); + } else { + InkElement.insertAfter(errorMsg, curElm); + } + + if (controlElm) { + if(error.errors[0] === 'ink-fv-required') { + Css.addClassName(controlGroupElm, 'validation error'); + } else { + Css.addClassName(controlGroupElm, 'validation warning'); + } + } + }, + + /** + * Clears the error of a given element. Normally executed before any validation, for all elements, as a reset. + * + * @method _clearErrors + * @param {DOMElement} formElm Form element to be cleared. + * @private + */ + _clearError: function(formElm) { + //return; + var aErrorLabel = formElm.getElementsByTagName('p'); + + var curElm; + var control; + + for(var i = (aErrorLabel.length - 1); i >= 0; i--) { + curElm = aErrorLabel[i]; + if(Css.hasClassName(curElm, this._errorClassName)) { + control = InkElement.findUpwardsBySelector(curElm, '.control-group'); + if (control) { + Css.removeClassName(control, ['validation', 'error', 'warning']); + } + + if(Css.hasClassName(curElm, this._errorClassName, true /*both*/)) { + InkElement.remove(curElm); + } + } + } + + var aErrorLabel2 = formElm.getElementsByTagName('ul'); + for(i = (aErrorLabel2.length - 1); i >= 0; i--) { + curElm = aErrorLabel2[i]; + if(Css.hasClassName(curElm, 'control-group')) { + Css.removeClassName(curElm, 'validation error'); + } + } + }, + + /** + * Removes unnecessary spaces to the left or right of a string + * + * @method _trim + * @param {String} stri String to be trimmed + * @private + * @return {String|undefined} String trimmed. + */ + _trim: function(str) + { + if(typeof(str) === 'string') + { + return str.replace(/^\s+|\s+$|\n+$/g, ''); + } + } + }; + + return FormValidator; + +}); +/** + * @module Ink.UI.FormValidator_2 + * @author inkdev AT sapo.pt + * @version 2 + */ +Ink.createModule('Ink.UI.FormValidator', '2', [ 'Ink.UI.Common_1','Ink.Dom.Element_1','Ink.Dom.Event_1','Ink.Dom.Selector_1','Ink.Dom.Css_1','Ink.Util.Array_1','Ink.Util.I18n_1','Ink.Util.Validator_1'], function( Common, Element, Event, Selector, Css, InkArray, I18n, InkValidator ) { + 'use strict'; + + /** + * Validation Functions to be used + * Some functions are a port from PHP, others are the 'best' solutions available + * + * @type {Object} + * @private + * @static + */ + var validationFunctions = { + + /** + * Checks if the value is actually defined and is not empty + * + * @method validationFunctions.required + * @param {String} value Value to be checked + * @return {Boolean} True case is defined, false if it's empty or not defined. + */ + 'required': function( value ){ + return ( (typeof value !== 'undefined') && ( !(/^\s*$/).test(value) ) ); + }, + + /** + * Checks if the value has a minimum length + * + * @method validationFunctions.min_length + * @param {String} value Value to be checked + * @param {String|Number} minSize Number of characters that the value at least must have. + * @return {Boolean} True if the length of value is equal or bigger than the minimum chars defined. False if not. + */ + 'min_length': function( value, minSize ){ + return ( (typeof value === 'string') && ( value.length >= parseInt(minSize,10) ) ); + }, + + /** + * Checks if the value has a maximum length + * + * @method validationFunctions.max_length + * @param {String} value Value to be checked + * @param {String|Number} maxSize Number of characters that the value at maximum can have. + * @return {Boolean} True if the length of value is equal or smaller than the maximum chars defined. False if not. + */ + 'max_length': function( value, maxSize ){ + return ( (typeof value === 'string') && ( value.length <= parseInt(maxSize,10) ) ); + }, + + /** + * Checks if the value has an exact length + * + * @method validationFunctions.exact_length + * @param {String} value Value to be checked + * @param {String|Number} exactSize Number of characters that the value must have. + * @return {Boolean} True if the length of value is equal to the size defined. False if not. + */ + 'exact_length': function( value, exactSize ){ + return ( (typeof value === 'string') && ( value.length === parseInt(exactSize,10) ) ); + }, + + /** + * Checks if the value has a valid e-mail address + * + * @method validationFunctions.email + * @param {String} value Value to be checked + * @return {Boolean} True if the value is a valid e-mail address. False if not. + */ + 'email': function( value ){ + return ( ( typeof value === 'string' ) && InkValidator.mail( value ) ); + }, + + /** + * Checks if the value has a valid URL + * + * @method validationFunctions.url + * @param {String} value Value to be checked + * @param {Boolean} fullCheck Flag that specifies if the value must be validated as a full url (with the protocol) or not. + * @return {Boolean} True if the URL is considered valid. False if not. + */ + 'url': function( value, fullCheck ){ + fullCheck = fullCheck || false; + return ( (typeof value === 'string') && InkValidator.url( value, fullCheck ) ); + }, + + /** + * Checks if the value is a valid IP. Supports ipv4 and ipv6 + * + * @method validationFunctions.ip + * @param {String} value Value to be checked + * @param {String} ipType Type of IP to be validated. The values are: ipv4, ipv6. By default is ipv4. + * @return {Boolean} True if the value is a valid IP address. False if not. + */ + 'ip': function( value, ipType ){ + if( typeof value !== 'string' ){ + return false; + } + + return InkValidator.isIP(value, ipType); + }, + + /** + * Checks if the value is a valid phone number. Supports several countries, based in the Ink.Util.Validator class. + * + * @method validationFunctions.phone + * @param {String} value Value to be checked + * @param {String} phoneType Country's initials to specify the type of phone number to be validated. Ex: 'AO'. + * @return {Boolean} True if it's a valid phone number. False if not. + */ + 'phone': function( value, phoneType ){ + if( typeof value !== 'string' ){ + return false; + } + + var countryCode = phoneType ? phoneType.toUpperCase() : ''; + + return InkValidator['is' + countryCode + 'Phone'](value); + }, + + /** + * Checks if it's a valid credit card. + * + * @method validationFunctions.credit_card + * @param {String} value Value to be checked + * @param {String} cardType Type of credit card to be validated. The card types available are in the Ink.Util.Validator class. + * @return {Boolean} True if the value is a valid credit card number. False if not. + */ + 'credit_card': function( value, cardType ){ + if( typeof value !== 'string' ){ + return false; + } + + return InkValidator.isCreditCard( value, cardType || 'default' ); + }, + + /** + * Checks if the value is a valid date. + * + * @method validationFunctions.date + * @param {String} value Value to be checked + * @param {String} format Specific format of the date. + * @return {Boolean} True if the value is a valid date. False if not. + */ + 'date': function( value, format ){ + return ( (typeof value === 'string' ) && InkValidator.isDate(format, value) ); + }, + + /** + * Checks if the value only contains alphabetical values. + * + * @method validationFunctions.alpha + * @param {String} value Value to be checked + * @param {Boolean} supportSpaces Allow whitespace + * @return {Boolean} True if the value is alphabetical-only. False if not. + */ + 'alpha': function( value, supportSpaces ){ + return InkValidator.ascii(value, {singleLineWhitespace: supportSpaces}); + }, + + /* + * Check that the value contains only printable unicode text characters + * from the Basic Multilingual plane (BMP) + * Optionally allow punctuation and whitespace + * + * @method validationFunctions.text + * @param {String} value Value to be checked + * @return {Boolean} Whether the value only contains printable text characters + **/ + 'text': function (value, whitespace, punctuation) { + return InkValidator.unicode(value, { + singleLineWhitespace: whitespace, + unicodePunctuation: punctuation}); + }, + + /* + * Check that the value contains only printable text characters + * available in the latin-1 encoding. + * + * Optionally allow punctuation and whitespace + * + * @method validationFunctions.text + * @param {String} value Value to be checked + * @return {Boolean} Whether the value only contains printable text characters + **/ + 'latin': function (value, punctuation, whitespace) { + if ( typeof value !== 'string') { return false; } + return InkValidator.latin1(value, {latin1Punctuation: punctuation, singleLineWhitespace: whitespace}); + }, + + /** + * Checks if the value only contains alphabetical and numerical characters. + * + * @method validationFunctions.alpha_numeric + * @param {String} value Value to be checked + * @return {Boolean} True if the value is a valid alphanumerical. False if not. + */ + 'alpha_numeric': function( value ){ + return InkValidator.ascii(value, {numbers: true}); + }, + + /** + * Checks if the value only contains alphabetical, dash or underscore characteres. + * + * @method validationFunctions.alpha_dashes + * @param {String} value Value to be checked + * @return {Boolean} True if the value is a valid. False if not. + */ + 'alpha_dash': function( value ){ + return InkValidator.ascii(value, {dash: true, underscore: true}); + }, + + /** + * Checks if the value is a digit (an integer of length = 1). + * + * @method validationFunctions.digit + * @param {String} value Value to be checked + * @return {Boolean} True if the value is a valid digit. False if not. + */ + 'digit': function( value ){ + return ((typeof value === 'string') && /^[0-9]{1}$/.test(value)); + }, + + /** + * Checks if the value is a valid integer. + * + * @method validationFunctions.integer + * @param {String} value Value to be checked + * @param {String} positive Flag that specifies if the integer is must be positive (unsigned). + * @return {Boolean} True if the value is a valid integer. False if not. + */ + 'integer': function( value, positive ){ + return InkValidator.number(value, { + negative: !positive, + decimalPlaces: 0 + }); + }, + + /** + * Checks if the value is a valid decimal number. + * + * @method validationFunctions.decimal + * @param {String} value Value to be checked + * @param {String} decimalSeparator Character that splits the integer part from the decimal one. By default is '.'. + * @param {String} [decimalPlaces] Maximum number of digits that the decimal part must have. + * @param {String} [leftDigits] Maximum number of digits that the integer part must have, when provided. + * @return {Boolean} True if the value is a valid decimal number. False if not. + */ + 'decimal': function( value, decimalSeparator, decimalPlaces, leftDigits ){ + return InkValidator.number(value, { + decimalSep: decimalSeparator || '.', + decimalPlaces: +decimalPlaces || null, + maxDigits: +leftDigits + }); + }, + + /** + * Checks if it is a numeric value. + * + * @method validationFunctions.numeric + * @param {String} value Value to be checked + * @param {String} decimalSeparator Verifies if it's a valid decimal. Otherwise checks if it's a valid integer. + * @param {String} [decimalPlaces] (when the number is decimal) Maximum number of digits that the decimal part must have. + * @param {String} [leftDigits] (when the number is decimal) Maximum number of digits that the integer part must have, when provided. + * @return {Boolean} True if the value is numeric. False if not. + */ + 'numeric': function( value, decimalSeparator, decimalPlaces, leftDigits ){ + decimalSeparator = decimalSeparator || '.'; + if( value.indexOf(decimalSeparator) !== -1 ){ + return validationFunctions.decimal( value, decimalSeparator, decimalPlaces, leftDigits ); + } else { + return validationFunctions.integer( value ); + } + }, + + /** + * Checks if the value is in a specific range of values. The parameters after the first one are used for specifying the range, and are similar in function to python's range() function. + * + * @method validationFunctions.range + * @param {String} value Value to be checked + * @param {String} minValue Left limit of the range. + * @param {String} maxValue Right limit of the range. + * @param {String} [multipleOf] In case you want numbers that are only multiples of another number. + * @return {Boolean} True if the value is within the range. False if not. + */ + 'range': function( value, minValue, maxValue, multipleOf ){ + value = +value; + minValue = +minValue; + maxValue = +maxValue; + + if (isNaN(value) || isNaN(minValue) || isNaN(maxValue)) { + return false; + } + + if( value < minValue || value > maxValue ){ + return false; + } + + if (multipleOf) { + return (value - minValue) % multipleOf === 0; + } else { + return true; + } + }, + + /** + * Checks if the value is a valid color. + * + * @method validationFunctions.color + * @param {String} value Value to be checked + * @return {Boolean} True if the value is a valid color. False if not. + */ + 'color': function( value ){ + return InkValidator.isColor(value); + }, + + /** + * Checks if the value matches the value of a different field. + * + * @method validationFunctions.matches + * @param {String} value Value to be checked + * @param {String} fieldToCompare Name or ID of the field to compare. + * @return {Boolean} True if the values match. False if not. + */ + 'matches': function( value, fieldToCompare ){ + return ( value === this.getFormElements()[fieldToCompare][0].getValue() ); + } + + }; + + /** + * Error messages for the validation functions above + * @type {Object} + * @private + * @static + */ + var validationMessages = new I18n({ + en_US: { + 'formvalidator.required' : 'The {field} filling is mandatory', + 'formvalidator.min_length': 'The {field} must have a minimum size of {param1} characters', + 'formvalidator.max_length': 'The {field} must have a maximum size of {param1} characters', + 'formvalidator.exact_length': 'The {field} must have an exact size of {param1} characters', + 'formvalidator.email': 'The {field} must have a valid e-mail address', + 'formvalidator.url': 'The {field} must have a valid URL', + 'formvalidator.ip': 'The {field} does not contain a valid {param1} IP address', + 'formvalidator.phone': 'The {field} does not contain a valid {param1} phone number', + 'formvalidator.credit_card': 'The {field} does not contain a valid {param1} credit card', + 'formvalidator.date': 'The {field} should contain a date in the {param1} format', + 'formvalidator.alpha': 'The {field} should only contain letters', + 'formvalidator.text': 'The {field} should only contain alphabetic characters', + 'formvalidator.latin': 'The {field} should only contain alphabetic characters', + 'formvalidator.alpha_numeric': 'The {field} should only contain letters or numbers', + 'formvalidator.alpha_dashes': 'The {field} should only contain letters or dashes', + 'formvalidator.digit': 'The {field} should only contain a digit', + 'formvalidator.integer': 'The {field} should only contain an integer', + 'formvalidator.decimal': 'The {field} should contain a valid decimal number', + 'formvalidator.numeric': 'The {field} should contain a number', + 'formvalidator.range': 'The {field} should contain a number between {param1} and {param2}', + 'formvalidator.color': 'The {field} should contain a valid color', + 'formvalidator.matches': 'The {field} should match the field {param1}', + 'formvalidator.validation_function_not_found': 'The rule {rule} has not been defined' + }, + pt_PT: { + 'formvalidator.required' : 'Preencher {field} é obrigatório', + 'formvalidator.min_length': '{field} deve ter no mínimo {param1} caracteres', + 'formvalidator.max_length': '{field} tem um tamanho máximo de {param1} caracteres', + 'formvalidator.exact_length': '{field} devia ter exactamente {param1} caracteres', + 'formvalidator.email': '{field} deve ser um e-mail válido', + 'formvalidator.url': 'O {field} deve ser um URL válido', + 'formvalidator.ip': '{field} não tem um endereço IP {param1} válido', + 'formvalidator.phone': '{field} deve ser preenchido com um número de telefone {param1} válido.', + 'formvalidator.credit_card': '{field} não tem um cartão de crédito {param1} válido', + 'formvalidator.date': '{field} deve conter uma data no formato {param1}', + 'formvalidator.alpha': 'O campo {field} deve conter apenas caracteres alfabéticos', + 'formvalidator.text': 'O campo {field} deve conter apenas caracteres alfabéticos', + 'formvalidator.latin': 'O campo {field} deve conter apenas caracteres alfabéticos', + 'formvalidator.alpha_numeric': '{field} deve conter apenas letras e números', + 'formvalidator.alpha_dashes': '{field} deve conter apenas letras e traços', + 'formvalidator.digit': '{field} destina-se a ser preenchido com apenas um dígito', + 'formvalidator.integer': '{field} deve conter um número inteiro', + 'formvalidator.decimal': '{field} deve conter um número válido', + 'formvalidator.numeric': '{field} deve conter um número válido', + 'formvalidator.range': '{field} deve conter um número entre {param1} e {param2}', + 'formvalidator.color': '{field} deve conter uma cor válida', + 'formvalidator.matches': '{field} deve corresponder ao campo {param1}', + 'formvalidator.validation_function_not_found': '[A regra {rule} não foi definida]' + } + }, 'en_US'); + + /** + * Constructor of a FormElement. + * This type of object has particular methods to parse rules and validate them in a specific DOM Element. + * + * @param {DOMElement} element DOM Element + * @param {Object} options Object with configuration options + * @return {FormElement} FormElement object + */ + var FormElement = function( element, options ){ + this._element = Common.elOrSelector( element, 'Invalid FormElement' ); + this._errors = {}; + this._rules = {}; + this._value = null; + + this._options = Ink.extendObj( { + label: this._getLabel() + }, Element.data(this._element) ); + + this._options = Ink.extendObj( this._options, options || {} ); + + }; + + /** + * FormElement's prototype + */ + FormElement.prototype = { + + /** + * Function to get the label that identifies the field. + * If it can't find one, it will use the name or the id + * (depending on what is defined) + * + * @method _getLabel + * @return {String} Label to be used in the error messages + * @private + */ + _getLabel: function(){ + + var controlGroup = Element.findUpwardsByClass(this._element,'control-group'); + var label = Ink.s('label',controlGroup); + if( label ){ + label = Element.textContent(label); + } else { + label = this._element.name || this._element.id || ''; + } + + return label; + }, + + /** + * Function to parse a rules' string. + * Ex: required|number|max_length[30] + * + * @method _parseRules + * @param {String} rules String with the rules + * @private + */ + _parseRules: function( rules ){ + this._rules = {}; + rules = rules.split("|"); + var i, rulesLength = rules.length, rule, params, paramStartPos ; + if( rulesLength > 0 ){ + for( i = 0; i < rulesLength; i++ ){ + rule = rules[i]; + if( !rule ){ + continue; + } + + if( ( paramStartPos = rule.indexOf('[') ) !== -1 ){ + params = rule.substr( paramStartPos+1 ); + params = params.split(']'); + params = params[0]; + params = params.split(','); + for (var p = 0, len = params.length; p < len; p++) { + params[p] = + params[p] === 'true' ? true : + params[p] === 'false' ? false : + params[p]; + } + params.splice(0,0,this.getValue()); + + rule = rule.substr(0,paramStartPos); + + this._rules[rule] = params; + } else { + this._rules[rule] = [this.getValue()]; + } + } + } + }, + + /** + * Function to add an error to the FormElement's 'errors' object. + * It basically receives the rule where the error occurred, the parameters passed to it (if any) + * and the error message. + * Then it replaces some tokens in the message for a more 'custom' reading + * + * @method _addError + * @param {String|null} rule Rule that failed, or null if no rule was found. + * @private + * @static + */ + _addError: function(rule){ + var params = this._rules[rule] || []; + + var paramObj = { + field: this._options.label, + value: this.getValue() + }; + + for( var i = 1; i < params.length; i++ ){ + paramObj['param' + i] = params[i]; + } + + var i18nKey = 'formvalidator.' + rule; + + this._errors[rule] = validationMessages.text(i18nKey, paramObj); + + if (this._errors[rule] === i18nKey) { + this._errors[rule] = 'Validation message not found'; + } + }, + + /** + * Function to retrieve the element's value + * + * @method getValue + * @return {mixed} The DOM Element's value + * @public + */ + getValue: function(){ + + switch(this._element.nodeName.toLowerCase()){ + case 'select': + return Ink.s('option:selected',this._element).value; + case 'textarea': + return this._element.innerHTML; + case 'input': + if( "type" in this._element ){ + if( (this._element.type === 'radio') && (this._element.type === 'checkbox') ){ + if( this._element.checked ){ + return this._element.value; + } + } else if( this._element.type !== 'file' ){ + return this._element.value; + } + } else { + return this._element.value; + } + return; + default: + return this._element.innerHTML; + } + }, + + /** + * Function that returns the constructed errors object. + * + * @method getErrors + * @return {Object} Errors' object + * @public + */ + getErrors: function(){ + return this._errors; + }, + + /** + * Function that returns the DOM element related to it. + * + * @method getElement + * @return {Object} DOM Element + * @public + */ + getElement: function(){ + return this._element; + }, + + /** + * Get other elements in the same form. + * + * @method getFormElements + * @return {Object} A mapping of keys to other elements in this form. + * @public + */ + getFormElements: function () { + return this._options.form._formElements; + }, + + /** + * Function used to validate the element based on the rules defined. + * It parses the rules defined in the _options.rules property. + * + * @method validate + * @return {Boolean} True if every rule was valid. False if one fails. + * @public + */ + validate: function(){ + this._errors = {}; + + if( "rules" in this._options || 1){ + this._parseRules( this._options.rules ); + } + + if( ("required" in this._rules) || (this.getValue() !== '') ){ + for(var rule in this._rules) { + if (this._rules.hasOwnProperty(rule)) { + if( (typeof validationFunctions[rule] === 'function') ){ + if( validationFunctions[rule].apply(this, this._rules[rule] ) === false ){ + + this._addError( rule ); + return false; + + } + + } else { + + this._addError( null ); + return false; + } + } + } + } + + return true; + + } + }; + + + + /** + * @class Ink.UI.FormValidator_2 + * @version 2 + * @constructor + * @param {String|DOMElement} selector Either a CSS Selector string, or the form's DOMElement + * @param {String} [options.eventTrigger='submit'] What event do we listen for. + * @param {Boolean} [options.neverSubmit=false] Always cancel the event? Use this to avoid submitting the form. + * @param {Selector} [options.searchFor='input, select, textarea, .control-group'] Look in these inputs for validation data-attributes. + * @param {Function} [options.beforeValidation] Callback to be executed before validating the form + * @param {Function} [options.onError] Validation error callback + * @param {Function} [options.onSuccess] Validation success callback + * + * @example + * Ink.requireModules( ['Ink.UI.FormValidator_2'], function( FormValidator ){ + * var myValidator = new FormValidator( '#my-form' ); + * }); + */ + var FormValidator = function( selector, options ){ + + /** + * DOMElement of the being validated + * + * @property _rootElement + * @type {DOMElement} + */ + this._rootElement = Common.elOrSelector( selector ); + + /** + * Object that will gather the form elements by name + * + * @property _formElements + * @type {Object} + */ + this._formElements = {}; + + /** + * Error message DOMElements + * + * @property _errorMessages + */ + this._errorMessages = []; + + /** + * Array of elements marked with validation errors + * + * @property _markedErrorElements + */ + this._markedErrorElements = []; + + /** + * Configuration options. Fetches the data attributes first, then the ones passed when executing the constructor. + * By doing that, the latter will be the one with highest priority. + * + * @property _options + * @type {Object} + */ + this._options = Ink.extendObj({ + eventTrigger: 'submit', + neverSubmit: 'false', + searchFor: 'input, select, textarea, .control-group', + beforeValidation: undefined, + onError: undefined, + onSuccess: undefined + },Element.data(this._rootElement)); + + this._options = Ink.extendObj( this._options, options || {} ); + + // Sets an event listener for a specific event in the form, if defined. + // By default is the 'submit' event. + if( typeof this._options.eventTrigger === 'string' ){ + Event.observe( this._rootElement,this._options.eventTrigger, Ink.bindEvent(this.validate,this) ); + } + + this._init(); + }; + + /** + * Method used to set validation functions (either custom or ovewrite the existent ones) + * + * @method setRule + * @param {String} name Name of the function. E.g. 'required' + * @param {String} errorMessage Error message to be displayed in case of returning false. E.g. 'Oops, you passed {param1} as parameter1, lorem ipsum dolor...' + * @param {Function} cb Function to be executed when calling this rule + * @public + * @static + */ + FormValidator.setRule = function( name, errorMessage, cb ){ + validationFunctions[ name ] = cb; + if (validationMessages.getKey('formvalidator.' + name) !== errorMessage) { + var langObj = {}; langObj['formvalidator.' + name] = errorMessage; + var dictObj = {}; dictObj[validationMessages.lang()] = langObj; + validationMessages.append(dictObj); + } + }; + + /** + * Get the i18n object in charge of the error messages + * + * @method getI18n + * @return {Ink.Util.I18n} The i18n object the FormValidator is using. + */ + FormValidator.getI18n = function () { + return validationMessages; + }; + + /** + * Sets the I18n object for validation error messages + * + * @method setI18n + * @param {Ink.Util.I18n} i18n The I18n object. + */ + FormValidator.setI18n = function (i18n) { + validationMessages = i18n; + }; + + /** + * Add to the I18n dictionary. See `Ink.Util.I18n.append()` documentation. + * + * @method AppendI18n + */ + FormValidator.appendI18n = function () { + validationMessages.append.apply(validationMessages, [].slice.call(arguments)); + }; + + /** + * Sets the language of the error messages. pt_PT and en_US are available, but you can add new languages by using append() + * + * See the `Ink.Util.I18n.lang()` setter + * + * @method setLanguage + * @param language The language to set i18n to. + */ + FormValidator.setLanguage = function (language) { + validationMessages.lang(language); + }; + + /** + * Method used to get the existing defined validation functions + * + * @method getRules + * @return {Object} Object with the rules defined + * @public + * @static + */ + FormValidator.getRules = function(){ + return validationFunctions; + }; + + FormValidator.prototype = { + _init: function(){ + + }, + + /** + * Function that searches for the elements of the form, based in the + * this._options.searchFor configuration. + * + * @method getElements + * @return {Object} An object with the elements in the form, indexed by name/id + * @public + */ + getElements: function(){ + this._formElements = {}; + var formElements = Selector.select( this._options.searchFor, this._rootElement ); + if( formElements.length ){ + var i, element; + for( i=0; i'); + this._errorMessages.push(paragraph); + }, this)); + return false; + } + } + }; + + /** + * Returns the FormValidator's Object + */ + return FormValidator; + +}); + +/** + * @module Ink.UI.ImageQuery_1 + * @author inkdev AT sapo.pt + * @version 1 + */ +Ink.createModule('Ink.UI.ImageQuery', '1', ['Ink.UI.Common_1','Ink.Dom.Event_1','Ink.Dom.Element_1','Ink.Util.Array_1'], function(Common, Event, Element, InkArray ) { + 'use strict'; + + /** + * @class Ink.UI.ImageQuery + * @constructor + * @version 1 + * + * @param {String|DOMElement} selector + * @param {Object} [options] Options + * @param {String|Function} [options.src] String or Callback function (that returns a string) with the path to be used to get the images. + * @param {String|Function} [options.retina] String or Callback function (that returns a string) with the path to be used to get RETINA specific images. + * @param {Array} [options.queries] Array of queries + * @param {String} [options.queries.label] Label of the query. Ex. 'small' + * @param {Number} [options.queries.width] Min-width to use this query + * @param {Function} [options.onLoad] Date format string + * + * @example + *
          + * + *
          + * + */ + var ImageQuery = function(selector, options){ + + /** + * Get elements, create more ImageQueries if selector finds more than one + * + * [improvement] This is a useful pattern. More UI modules could use it. + */ + this._element = Common.elsOrSelector(selector, 'Ink.UI.ImageQuery', /*required=*/true); + + // In case we have several elements + for (var i = 1 /* start from second element*/; i < this._element.length; i++) { + new ImageQuery(this._element[i], options); + } + + this._element = this._element[0]; + + /** + * Default options, overriden by data-attributes if any. + * The parameters are: + * @param {array} queries Array of objects that determine the label/name and its min-width to be applied. + * @param {boolean} allowFirstLoad Boolean flag to allow the loading of the first element. + */ + this._options = Ink.extendObj({ + queries:[], + onLoad: null + }, options || {}, Element.data(this._element)); + + /** + * Determining the original basename (with the querystring) of the file. + */ + var pos; + if( (pos=this._element.src.lastIndexOf('?')) !== -1 ){ + var search = this._element.src.substr(pos); + this._filename = this._element.src.replace(search,'').split('/').pop()+search; + } else { + this._filename = this._element.src.split('/').pop(); + } + + this._init(); + }; + + ImageQuery.prototype = { + + /** + * Init function called by the constructor + * + * @method _init + * @private + */ + _init: function(){ + // Sort queries by width, in descendant order. + this._options.queries = InkArray.sortMulti(this._options.queries, 'width').reverse(); + + if( typeof this._options.onLoad === 'function' ){ + Event.observe(this._element, 'onload', Ink.bindEvent(this._onLoad, this)); + } + + Event.observe(window, 'resize', Ink.bindEvent(this._onResize, this)); + + // Imediate call to apply the right images based on the current viewport + this._onResize(); + }, + + /** + * Handles the resize event (as specified in the _init function) + * + * @method _onResize + * @private + */ + _onResize: Event.throttle(function(){ + if( !this._options.queries.length ){ + return; + } + + var current = this._findCurrentQuery(); + + /** + * Choosing the right src. The rule is: + * + * "If there is specifically defined in the query object, use that. Otherwise uses the global src." + * + * The above rule applies to a retina src. + */ + var src = current.src || this._options.src; + if ( window.devicePixelRatio > 1 && ('retina' in this._options ) ) { + src = current.retina || this._options.retina; + } + + /** + * Injects the file variable for usage in the 'templating system' below + */ + current.file = this._filename; + + /** + * Since we allow the src to be a callback, let's run it and get the results. + * For the inside, we're passing the element (img) being processed and the object of the selected + * query. + */ + if( typeof src === 'function' ){ + src = src.apply(this,[this._element,current]); + if( typeof src !== 'string' ){ + throw '[ImageQuery] :: "src" callback does not return a string'; + } + } + + /** + * Replace the values of the existing properties on the query object (except src and retina) in the + * defined src and/or retina. + */ + src = src.replace(/{:(.*?)}/g, function(_, prop) { + return current[prop]; + }); + + this._element.src = src; + + // Removes the injected file property + delete current.file; + }, 500), + + /** + * Queries are in a descendant order. We want to find the query with the highest width that fits + * the viewport, therefore the first one. + */ + _findCurrentQuery: function () { + /** + * Gets viewport width + */ + var viewportWidth = window.innerWidth || + document.documentElement.clientWidth || + document.body.clientWidth; + + var queries = this._options.queries; + var last = queries.length - 1; + + for( var query=0; query < last; query+=1 ){ + if (queries[query].width <= viewportWidth){ + return queries[query]; + } + } + + return queries[last]; + }, + + /** + * Handles the element loading (img onload) event + * + * @method _onLoad + * @private + */ + _onLoad: function(){ + + /** + * Since we allow a callback for this let's run it. + */ + this._options.onLoad.call(this); + } + + }; + + return ImageQuery; + +}); + +/** + * @module Ink.UI.Modal_1 + * @author inkdev AT sapo.pt + * @version 1 + */ +Ink.createModule('Ink.UI.Modal', '1', ['Ink.UI.Common_1','Ink.Dom.Event_1','Ink.Dom.Css_1','Ink.Dom.Element_1','Ink.Dom.Selector_1','Ink.Util.Array_1'], function(Common, Event, Css, InkElement, Selector, InkArray ) { + 'use strict'; + + var opacitySupported = (function (div) { + div.style.opacity = 'invalid'; + return div.style.opacity !== 'invalid'; + }(InkElement.create('div', {style: 'opacity: 1'}))); + + /** + * @class Ink.UI.Modal + * @constructor + * @version 1 + * @param {String|DOMElement} selector + * @param {Object} [options] Options + * @param {String} [options.width] Default/Initial width. Ex: '600px' + * @param {String} [options.height] Default/Initial height. Ex: '400px' + * @param {String} [options.shadeClass] Custom class to be added to the div.ink-shade + * @param {String} [options.modalClass] Custom class to be added to the div.ink-modal + * @param {String} [options.trigger] CSS Selector to target elements that will trigger the Modal. + * @param {String} [options.triggerEvent] Trigger's event to be listened. 'click' is the default value. Ex: 'mouseover', 'touchstart'... + * @param {Boolean} [options.autoDisplay=true] Display the Modal automatically when constructed. + * @param {String} [options.markup] Markup to be placed in the Modal when created + * @param {Function} [options.onShow] Callback function to run when the Modal is opened. + * @param {Function} [options.onDismiss] Callback function to run when the Modal is closed. Return `false` to cancel dismissing the Modal. + * @param {Boolean} [options.closeOnClick=false] Determines if the Modal should close when clicked outside of it. + * @param {Boolean} [options.closeOnEscape=true] Determines if the Modal should close when "Esc" key is pressed. + * @param {Boolean} [options.responsive] Determines if the Modal should behave responsively (adapt to smaller viewports). + * @param {Boolean} [options.disableScroll] Determines if the Modal should 'disable' the page's scroll (not the Modal's body). + * + * @example + *
          + *
          + * + * + * + *
          + *
          + * Open modal + * + */ + + function upName(dimension) { + // omg IE + var firstCharacter = dimension.match(/^./)[0]; + return firstCharacter.toUpperCase() + dimension.replace(/^./, ''); + } + function maxName(dimension) { + return 'max' + upName(dimension); + } + + var openModals = []; + + var Modal = function(selector, options) { + if (!selector) { + this._element = null; + } else { + this._element = Common.elOrSelector(selector, 'Ink.UI.Modal markup'); + } + + this._options = { + /** + * Width, height and markup really optional, as they can be obtained by the element + */ + width: undefined, + height: undefined, + + /** + * To add extra classes + */ + shadeClass: undefined, + modalClass: undefined, + + /** + * Optional trigger properties + */ + trigger: undefined, + triggerEvent: 'click', + autoDisplay: true, + + /** + * Remaining options + */ + markup: undefined, + onShow: undefined, + onDismiss: undefined, + closeOnClick: false, + closeOnEscape: true, + responsive: true, + disableScroll: true + }; + + + this._handlers = { + click: Ink.bindEvent(this._onShadeClick, this), + keyDown: Ink.bindEvent(this._onKeyDown, this), + resize: Ink.bindEvent(this._onResize, this) + }; + + this._wasDismissed = false; + + /** + * Modal Markup + */ + if( this._element ){ + this._markupMode = Css.hasClassName(this._element,'ink-modal'); // Check if the full modal comes from the markup + } else { + this._markupMode = false; + } + + if( !this._markupMode ){ + this._modalShadow = document.createElement('div'); + this._modalShadowStyle = this._modalShadow.style; + + this._modalDiv = document.createElement('div'); + this._modalDivStyle = this._modalDiv.style; + + if( !!this._element ){ + this._options.markup = this._element.innerHTML; + } + + /** + * Not in full markup mode, let's set the classes and css configurations + */ + Css.addClassName( this._modalShadow,'ink-shade' ); + Css.addClassName( this._modalDiv,'ink-modal ink-space' ); + + /** + * Applying the main css styles + */ + // this._modalDivStyle.position = 'absolute'; + this._modalShadow.appendChild( this._modalDiv); + document.body.appendChild( this._modalShadow ); + } else { + this._modalDiv = this._element; + this._modalDivStyle = this._modalDiv.style; + this._modalShadow = this._modalDiv.parentNode; + this._modalShadowStyle = this._modalShadow.style; + + this._contentContainer = Selector.select(".modal-body", this._modalDiv)[0]; + if( !this._contentContainer){ + throw new Error('Ink.UI.Modal: Missing div with class "modal-body"'); + } + + this._options.markup = this._contentContainer.innerHTML; + + /** + * First, will handle the least important: The dataset + */ + this._options = Ink.extendObj(this._options,InkElement.data(this._element)); + + } + + /** + * Now, the most important, the initialization options + */ + this._options = Ink.extendObj(this._options,options || {}); + + if( !this._markupMode ){ + this.setContentMarkup(this._options.markup); + } + + if( typeof this._options.shadeClass === 'string' ){ + Css.addClassName(this._modalShadow, this._options.shadeClass); + } + + if( typeof this._options.modalClass === 'string' ){ + Css.addClassName(this._modalDiv, this._options.modalClass); + } + + if( ("trigger" in this._options) && ( typeof this._options.trigger !== 'undefined' ) ){ + var triggerElement; + if( typeof this._options.trigger === 'string' ){ + triggerElement = Selector.select( this._options.trigger ); + Event.observeMulti(triggerElement, this._options.triggerEvent, Ink.bindEvent(this.open, this)); + } + } else if ( this._options.autoDisplay.toString() === "true" ) { + this.open(); + } + }; + + Modal.prototype = { + + /** + * Responsible for repositioning the modal + * + * @method _reposition + * @private + */ + _reposition: function(){ + this._modalDivStyle.marginTop = (-InkElement.elementHeight(this._modalDiv)/2) + 'px'; + this._modalDivStyle.marginLeft = (-InkElement.elementWidth(this._modalDiv)/2) + 'px'; + }, + + /** + * Responsible for resizing the modal + * + * @method _onResize + * @param {Boolean|Event} runNow Its executed in the begining to resize/reposition accordingly to the viewport. But usually it's an event object. + * @private + */ + _onResize: function( runNow ){ + if( typeof runNow === 'boolean' ){ + this._timeoutResizeFunction.call(this); + } else if( !this._resizeTimeout && (runNow && typeof runNow === 'object') ){ + this._resizeTimeout = setTimeout(Ink.bind(this._timeoutResizeFunction, this),250); + } + }, + + /** + * Timeout Resize Function + * + * @method _timeoutResizeFunction + * @private + */ + _timeoutResizeFunction: function(){ + /** + * Getting the current viewport size + */ + var isPercentage = { + width: ('' + this._options.width).indexOf('%') !== -1, + height: ('' + this._options.height).indexOf('%') !== -1 + }; + var currentViewport = { + height: InkElement.viewportHeight(), + width: InkElement.viewportWidth() + }; + + InkArray.forEach(['height', 'width'], Ink.bind(function (dimension) { + // Not used for percentage measurements + if (isPercentage[dimension]) { return; } + + if (currentViewport[dimension] > this.originalStatus[dimension]) { + this._modalDivStyle[dimension] = this._modalDivStyle[maxName(dimension)]; + } else { + this._modalDivStyle[dimension] = Math.round(currentViewport[dimension] * 0.9) + 'px'; + } + }, this)); + + this._resizeContainer(); + this._reposition(); + this._resizeTimeout = undefined; + }, + + /** + * Handle clicks on the shade element. + * + * @method _onShadeClick + * @param {Event} ev + * @private + */ + _onShadeClick: function(ev) { + var tgtEl = Event.element(ev); + + if (Css.hasClassName(tgtEl, 'ink-close') || Css.hasClassName(tgtEl, 'ink-dismiss') || + InkElement.findUpwardsBySelector(tgtEl, '.ink-close,.ink-dismiss') || + ( + this._options.closeOnClick && + (!InkElement.descendantOf(this._shadeElement, tgtEl) || (tgtEl === this._shadeElement)) + ) + ) { + var alertsInTheModal = Selector.select('.ink-alert', this._shadeElement), + alertsLength = alertsInTheModal.length; + for( var i = 0; i < alertsLength; i++ ){ + if( InkElement.descendantOf(alertsInTheModal[i], tgtEl) ){ + return; + } + } + + this.dismiss(); + + // Only stop the event if this dismisses this modal + if (this._wasDismissed) { + Event.stop(ev); + } + } + }, + + /** + * Responsible for handling the escape key pressing. + * + * @method _onKeyDown + * @param {Event} ev + * @private + */ + _onKeyDown: function(ev) { + if (ev.keyCode !== 27 || this._wasDismissed) { return; } + if (this._options.closeOnEscape.toString() === 'true' && + openModals[openModals.length - 1] === this) { + this.dismiss(); + if (this._wasDismissed) { + Event.stop(ev); + } + } + }, + + /** + * Responsible for setting the size of the modal (and position) based on the viewport. + * + * @method _resizeContainer + * @private + */ + _resizeContainer: function() { + // [3.0.0] drop this because everyone should have the new CSS now, which has this rule already with .ink-modal-is-open. + this._contentElement.style.overflow = this._contentElement.style.overflowX = this._contentElement.style.overflowY = 'hidden'; + var containerHeight = InkElement.elementHeight(this._modalDiv); + + this._modalHeader = Selector.select('.modal-header',this._modalDiv)[0]; + if( this._modalHeader ){ + containerHeight -= InkElement.elementHeight(this._modalHeader); + } + + this._modalFooter = Selector.select('.modal-footer',this._modalDiv)[0]; + if( this._modalFooter ){ + containerHeight -= InkElement.elementHeight(this._modalFooter); + } + + this._contentContainer.style.height = containerHeight + 'px'; + if( containerHeight !== InkElement.elementHeight(this._contentContainer) ){ + this._contentContainer.style.height = ~~(containerHeight - (InkElement.elementHeight(this._contentContainer) - containerHeight)) + 'px'; + } + + if( this._markupMode ){ return; } + + this._contentContainer.style.overflow = this._contentContainer.style.overflowX = 'hidden'; + this._contentContainer.style.overflowY = 'auto'; + this._contentElement.style.overflow = this._contentElement.style.overflowX = this._contentElement.style.overflowY = 'visible'; + }, + + /** + * Responsible for 'disabling' the page scroll + * + * @method _disableScroll + * @private + */ + _disableScroll: function() { + var htmlEl = document.documentElement; + this._oldHtmlOverflows = [ htmlEl.style.overflowX, + htmlEl.style.overflowY ]; + htmlEl.style.overflowX = htmlEl.style.overflowY = 'hidden'; + }, + + /************** + * PUBLIC API * + **************/ + + /** + * Display this Modal. Useful if you have initialized the modal + * @method open + * @param {Event} [event] (internal) In case its fired by the internal trigger. + */ + open: function(event) { + + if( event ){ Event.stop(event); } + + var elem = (document.compatMode === "CSS1Compat") ? document.documentElement : document.body; + + this._resizeTimeout = null; + + Css.addClassName( this._modalShadow,'ink-shade' ); + this._modalShadowStyle.display = this._modalDivStyle.display = 'block'; + setTimeout(Ink.bind(function() { + Css.addClassName( this._modalShadow, 'visible' ); + Css.addClassName( this._modalDiv, 'visible' ); + }, this), 100); + + /** + * Fallback to the old one + */ + this._contentElement = this._modalDiv; + this._shadeElement = this._modalShadow; + + if( !this._markupMode ){ + /** + * Setting the content of the modal + */ + this.setContentMarkup( this._options.markup ); + } + + /** + * If any size has been user-defined, let's set them as max-width and max-height + */ + + var isPercentage = { + width: ('' + this._options.width).indexOf('%') !== -1, + height: ('' + this._options.height).indexOf('%') !== -1 + }; + + InkArray.forEach(['width', 'height'], Ink.bind(function (dimension) { + if (this._options[dimension] !== undefined) { + this._modalDivStyle[dimension] = this._options[dimension]; + if (!isPercentage[dimension]) { + this._modalDivStyle[maxName(dimension)] = + InkElement['element' + upName(dimension)](this._modalDiv) + 'px'; + } + } else { + this._modalDivStyle[maxName(dimension)] = InkElement['element' + upName(dimension)](this._modalDiv) + 'px'; + } + + if (isPercentage[dimension] && parseInt(elem['client' + maxName(dimension)], 10) <= parseInt(this._modalDivStyle[dimension], 10) ) { + this._modalDivStyle[dimension] = Math.round(parseInt(elem['client' + maxName(dimension)], 10) * 0.9) + 'px'; + } + }, this)); + + this.originalStatus = { + viewportHeight: InkElement.elementHeight(elem), + viewportWidth: InkElement.elementWidth(elem), + height: InkElement.elementHeight(this._modalDiv), + width: InkElement.elementWidth(this._modalDiv) + }; + + /** + * Let's 'resize' it: + */ + if( this._options.responsive.toString() === 'true' ) { + this._onResize(true); + Event.observe( window,'resize',this._handlers.resize ); + } else { + this._resizeContainer(); + this._reposition(); + } + + if (this._options.onShow) { + this._options.onShow(this); + } + + if(this._options.disableScroll.toString() === 'true') { + this._disableScroll(); + } + + // subscribe events + Event.observe(this._shadeElement, 'click', this._handlers.click); + if (this._options.closeOnEscape.toString() === 'true') { + Event.observe(document, 'keydown', this._handlers.keyDown); + } + + Common.registerInstance(this, this._shadeElement, 'modal'); + + this._wasDismissed = false; + openModals.push(this); + + Css.addClassName(document.documentElement, 'ink-modal-is-open'); + }, + + /** + * Dismisses the modal + * + * @method dismiss + * @public + */ + dismiss: function() { + if (this._wasDismissed) { /* Already dismissed. WTF IE. */ return; } + + if (this._options.onDismiss) { + var ret = this._options.onDismiss(this); + if (ret === false) { return; } + } + + this._wasDismissed = true; + + if( this._options.responsive ){ + Event.stopObserving(window, 'resize', this._handlers.resize); + } + + // this._modalShadow.parentNode.removeChild(this._modalShadow); + + if( !this._markupMode ){ + this._modalShadow.parentNode.removeChild(this._modalShadow); + this.destroy(); + } else { + Css.removeClassName( this._modalDiv, 'visible' ); + Css.removeClassName( this._modalShadow, 'visible' ); + + this._waitForFade(this._modalShadow, Ink.bind(function () { + this._modalShadowStyle.display = 'none'; + }, this)); + } + + openModals = InkArray.remove(openModals, InkArray.keyValue(this, openModals), 1); + + if (openModals.length === 0) { // Document level stuff now there are no modals in play. + var htmlEl = document.documentElement; + + // Reenable scroll + if(this._options.disableScroll) { + htmlEl.style.overflowX = this._oldHtmlOverflows[0]; + htmlEl.style.overflowY = this._oldHtmlOverflows[1]; + } + + // Remove the class from the HTML element. + Css.removeClassName(htmlEl, 'ink-modal-is-open'); + } + }, + + /** + * Utility function to listen to the onTransmissionEnd event, or wait using setTimeouts + * + * Specific to this._element + */ + _waitForFade: function (elem, callback) { + if (!opacitySupported) { return callback(); } + + var transitionEndEventNames = [ + 'transitionEnd', 'oTransitionEnd', 'webkitTransitionEnd']; + var classicName; + var evName; + for (var i = 0, len = transitionEndEventNames.length; i < len; i++) { + evName = transitionEndEventNames[i]; + classicName = 'on' + evName.toLowerCase(); + if (classicName in elem) { + Event.observeOnce(elem, evName, callback); + return; + } + } + var fadeChecker = function () { + if( +Css.getStyle(elem, 'opacity') > 0 ){ + setTimeout(fadeChecker, 250); + } else { + callback(); + } + }; + setTimeout(fadeChecker, 500); + }, + + /** + * Removes the modal from the DOM + * + * @method destroy + * @public + */ + destroy: function() { + Common.unregisterInstance(this._instanceId); + }, + + /** + * Returns the content DOM element + * + * @method getContentElement + * @return {DOMElement} Modal main cointainer. + * @public + */ + getContentElement: function() { + return this._contentContainer; + }, + + /** + * Replaces the content markup + * + * @method setContentMarkup + * @param {String} contentMarkup + * @public + */ + setContentMarkup: function(contentMarkup) { + if( !this._markupMode ){ + this._modalDiv.innerHTML = [contentMarkup].join(''); + this._contentContainer = Selector.select(".modal-body",this._modalDiv); + if( !this._contentContainer.length ){ + // throw 'Missing div with class "modal-body"'; + var tempHeader = Selector.select(".modal-header",this._modalDiv); + var tempFooter = Selector.select(".modal-footer",this._modalDiv); + + InkArray.each(tempHeader, InkElement.remove); + InkArray.each(tempFooter, InkElement.remove); + + var body = document.createElement('div'); + Css.addClassName(body,'modal-body'); + body.innerHTML = this._modalDiv.innerHTML; + this._modalDiv.innerHTML = ''; + + var toAdd = tempHeader.concat([body]).concat(tempFooter); + InkArray.each(toAdd, Ink.bindMethod(this._modalDiv, 'appendChild')); + + // InkArray.each(tempHeader,Ink.bind(function( element ){ this._modalDiv.appendChild(element); },this)); + // this._modalDiv.appendChild(body); + // InkArray.each(tempFooter,Ink.bind(function( element ){ this._modalDiv.appendChild(element); },this)); + + this._contentContainer = Selector.select(".modal-body",this._modalDiv); + } + this._contentContainer = this._contentContainer[0]; + } else { + this._contentContainer.innerHTML = contentMarkup; + } + this._contentElement = this._modalDiv; + this._resizeContainer(); + } + + }; + + return Modal; + +}); + +/** + * @module Ink.UI.Pagination_1 + * @author inkdev AT sapo.pt + * @version 1 + */ +Ink.createModule('Ink.UI.Pagination', '1', + ['Ink.UI.Common_1','Ink.Dom.Event_1','Ink.Dom.Css_1','Ink.Dom.Element_1','Ink.Dom.Selector_1'], + function(Common, Event, Css, Element, Selector ) { + 'use strict'; + + /** + * Function to create the pagination anchors + * + * @method genAel + * @param {String} inner HTML to be placed inside the anchor. + * @return {DOMElement} Anchor created + */ + var genAEl = function(inner, index) { + var aEl = document.createElement('a'); + aEl.setAttribute('href', '#'); + if (index !== undefined) { + aEl.setAttribute('data-index', index); + } + aEl.innerHTML = inner; + return aEl; + }; + + /** + * @class Ink.UI.Pagination + * @constructor + * @version 1 + * @param {String|DOMElement} selector + * @param {Object} options Options + * @param {Number} [options.size] number of pages. + * @param {Number} [options.totalItemCount] Total numeber of items to display + * @param {Number} [options.itemsPerPage] number of items per page. + * @param {Number} [options.maxSize] If passed, only shows at most maxSize items. displays also first|prev page and next page|last buttons + * @param {Number} [options.start] start page. defaults to 1 + * @param {String} [options.firstLabel] label to display on first page button + * @param {String} [options.lastLabel] label to display on last page button + * @param {String} [options.previousLabel] label to display on previous button + * @param {String} [options.nextLabel] label to display on next button + * @param {String} [options.previousPageLabel] label to display on previous page button + * @param {String} [options.nextPageLabel] label to display on next page button + * @param {Function} [options.onChange] optional callback. Called with `(thisPaginator, newPageNumber)`. + * @param {String} [options.hashParameter] parameter to use on setHash. by default uses 'page' + * @param {String} [options.parentTag] HTML Tag used as the parent node. + * @param {String} [options.childTag] HTML Tag used as the child nodes. + * @param {String} [options.wrapperClass] CSS Class used in the wrapper element + * @param {String} [options.paginationClass] CSS Class used in the pagination element + * @param {String} [options.activeClass] CSS Class used to mark page as active + * @param {String} [options.disabledClass] CSS Class used to mark page as disabled + * @param {String} [options.hideClass] CSS Class used to hide elements + * @param {String} [options.previousClass] CSS Class used in the previous element + * @param {String} [options.previousPageClass] CSS Class used in the previous page element + * @param {String} [options.nextClass] CSS Class used in the next element + * @param {String} [options.nextPageClass] CSS Class used in the next page element + * @param {Function} [options.numberFormatter] optional function which takes and 0-indexed number and returns the string which appears on a numbered button + */ + var Pagination = function(selector, options) { + + this._element = Common.elOrSelector(selector, 'Ink.UI.Pagination element'); + + this._options = Common.options('Ink.UI.Pagination_1', { + size: ['Integer', null], + totalItemCount: ['Integer', null], + itemsPerPage: ['Integer', null], + maxSize: ['Integer', null], + start: ['Integer', 1], + firstLabel: ['String', 'First'], + lastLabel: ['String', 'Last'], + previousLabel: ['String', 'Previous'], + nextLabel: ['String', 'Next'], + previousPageLabel: ['String', null], + nextPageLabel: ['String', null], + onChange: ['Function', undefined], + hashParameter: ['String', 'page'], + parentTag: ['String', 'ul'], + childTag: ['String', 'li'], + wrapperClass: ['String', 'ink-navigation'], + paginationClass: ['String', 'pagination'], + activeClass: ['String', 'active'], + disabledClass: ['String', 'disabled'], + hideClass: ['String', 'hide-all'], + previousClass: ['String', 'previous'], + previousPageClass: ['String', 'previousPage'], + nextClass: ['String', 'next'], + nextPageClass: ['String', 'nextPage'], + + numberFormatter: ['Function', function(i) { return i + 1; }] + }, options || {}, this._element); + + if (!this._options.previousPageLabel) { + this._options.previousPageLabel = this._options.previousLabel + ' ' + this._options.maxSize; + } + + if (!this._options.nextPageLabel) { + this._options.nextPageLabel = this._options.nextLabel + ' ' + this._options.maxSize; + } + + this._handlers = { + click: Ink.bindEvent(this._onClick,this) + }; + + if (Common.isInteger(this._options.totalItemCount) && Common.isInteger(this._options.itemsPerPage)) { + this._size = Math.ceil(this._options.totalItemCount / this._options.itemsPerPage); + } else if (Common.isInteger(this._options.size)) { + this._size = this._options.size; + } else { + throw new TypeError('Ink.UI.Pagination: Please supply a size option or totalItemCount and itemsPerPage options.'); + } + + if (!Common.isInteger(this._options.start) && this._options.start > 0 && this._options.start <= this._size) { + throw new TypeError('start option is a required integer between 1 and size!'); + } + + if (this._options.maxSize && !Common.isInteger(this._options.maxSize) && this._options.maxSize > 0) { + throw new TypeError('maxSize option is a positive integer!'); + } + + else if (this._size < 0) { + throw new RangeError('size option must be equal or more than 0!'); + } + + this.setOnChange(this._options.onChange); + + this._current = this._options.start - 1; + this._itemLiEls = []; + + this._init(); + }; + + Pagination.prototype = { + + /** + * Init function called by the constructor + * + * @method _init + * @private + */ + _init: function() { + // generate and apply DOM + this._generateMarkup(this._element); + + this._updateItems(); + + // subscribe events + this._observe(); + + Common.registerInstance(this, this._element, 'pagination'); + }, + + /** + * Responsible for setting listener in the 'click' event of the Pagination element. + * + * @method _observe + * @private + */ + _observe: function() { + Event.observeDelegated(this._element, 'click', '.' + this._options.paginationClass + ' > ' + this._options.childTag, this._handlers.click); + }, + + /** + * Updates the markup everytime there's a change in the Pagination object. + * + * @method _updateItems + * @private + */ + _updateItems: function() { + var liEls = this._itemLiEls; + + var isSimpleToggle = this._size === liEls.length; + + var i, f, liEl; + + if (isSimpleToggle) { + // just toggle active class + for (i = 0, f = this._size; i < f; ++i) { + Css.setClassName(liEls[i], this._options.activeClass, i === this._current); + } + } + else { + // remove old items + for (i = liEls.length - 1; i >= 0; --i) { + this._ulEl.removeChild(liEls[i]); + } + + // add new items + liEls = []; + for (i = 0, f = this._size; i < f; ++i) { + liEl = document.createElement(this._options.childTag); + liEl.appendChild( genAEl( this._options.numberFormatter(i), i) ); + Css.setClassName(liEl, this._options.activeClass, i === this._current); + this._ulEl.insertBefore(liEl, this._nextEl); + liEls.push(liEl); + } + this._itemLiEls = liEls; + } + + if (this._options.maxSize) { + // toggle visible items + var page = Math.floor( this._current / this._options.maxSize ); + var pi = this._options.maxSize * page; + var pf = pi + this._options.maxSize - 1; + + for (i = 0, f = this._size; i < f; ++i) { + liEl = liEls[i]; + Css.setClassName(liEl, this._options.hideClass, i < pi || i > pf); + } + + this._pageStart = pi; + this._pageEnd = pf; + this._page = page; + + Css.setClassName(this._prevPageEl, this._options.disabledClass, !this.hasPreviousPage()); + Css.setClassName(this._nextPageEl, this._options.disabledClass, !this.hasNextPage()); + + Css.setClassName(this._firstEl, this._options.disabledClass, this.isFirst()); + Css.setClassName(this._lastEl, this._options.disabledClass, this.isLast()); + } + + // update prev and next + Css.setClassName(this._prevEl, this._options.disabledClass, !this.hasPrevious()); + Css.setClassName(this._nextEl, this._options.disabledClass, !this.hasNext()); + }, + + /** + * Returns the top element for the gallery DOM representation + * + * @method _generateMarkup + * @param {DOMElement} el + * @private + */ + _generateMarkup: function(el) { + Css.addClassName(el, 'ink-navigation'); + + var ulEl,liEl, + hasUlAlready = false; + if( ( ulEl = Selector.select('.' + this._options.paginationClass,el)).length < 1 ){ + ulEl = document.createElement(this._options.parentTag); + Css.addClassName(ulEl, this._options.paginationClass); + } else { + hasUlAlready = true; + ulEl = ulEl[0]; + } + + if (this._options.maxSize) { + liEl = document.createElement(this._options.childTag); + liEl.appendChild( genAEl(this._options.firstLabel) ); + this._firstEl = liEl; + Css.addClassName(liEl, this._options.firstClass); + ulEl.appendChild(liEl); + + liEl = document.createElement(this._options.childTag); + liEl.appendChild( genAEl(this._options.previousPageLabel) ); + this._prevPageEl = liEl; + Css.addClassName(liEl, this._options.previousPageClass); + ulEl.appendChild(liEl); + } + + liEl = document.createElement(this._options.childTag); + liEl.appendChild( genAEl(this._options.previousLabel) ); + this._prevEl = liEl; + Css.addClassName(liEl, this._options.previousClass); + ulEl.appendChild(liEl); + + liEl = document.createElement(this._options.childTag); + liEl.appendChild( genAEl(this._options.nextLabel) ); + this._nextEl = liEl; + Css.addClassName(liEl, this._options.nextClass); + ulEl.appendChild(liEl); + + if (this._options.maxSize) { + liEl = document.createElement(this._options.childTag); + liEl.appendChild( genAEl(this._options.nextPageLabel) ); + this._nextPageEl = liEl; + Css.addClassName(liEl, this._options.nextPageClass); + ulEl.appendChild(liEl); + + liEl = document.createElement(this._options.childTag); + liEl.appendChild( genAEl(this._options.lastLabel) ); + this._lastEl = liEl; + Css.addClassName(liEl, this._options.lastClass); + ulEl.appendChild(liEl); + } + + if( !hasUlAlready ){ + el.appendChild(ulEl); + } + + this._ulEl = ulEl; + }, + + /** + * Click handler + * + * @method _onClick + * @param {Event} ev + * @private + */ + _onClick: function(ev) { + Event.stop(ev); + + var liEl = Event.element(ev); + if ( Css.hasClassName(liEl, this._options.activeClass) || + Css.hasClassName(liEl, this._options.disabledClass) ) { return; } + + var isPrev = Css.hasClassName(liEl, this._options.previousClass); + var isNext = Css.hasClassName(liEl, this._options.nextClass); + var isPrevPage = Css.hasClassName(liEl, this._options.previousPageClass); + var isNextPage = Css.hasClassName(liEl, this._options.nextPageClass); + var isFirst = Css.hasClassName(liEl, this._options.firstClass); + var isLast = Css.hasClassName(liEl, this._options.lastClass); + + if (isFirst) { + this.setCurrent(0); + } + else if (isLast) { + this.setCurrent(this._size - 1); + } + else if (isPrevPage || isNextPage) { + this.setCurrent( (isPrevPage ? -1 : 1) * this._options.maxSize, true); + } + else if (isPrev || isNext) { + this.setCurrent(isPrev ? -1 : 1, true); + } + else { + var aElem = Ink.s('[data-index]', liEl); + var nr = parseInt( aElem.getAttribute('data-index'), 10); + this.setCurrent(nr); + } + }, + + + /** + * Allows you to subscribe to the onChange event + * + * @method setOnChange + * @param cb {Function} Callback called with `(thisPaginator, newPageNumber)`. + */ + setOnChange: function (onChange) { + if (onChange !== undefined && typeof onChange !== 'function') { + throw new TypeError('onChange option must be a function!'); + } + this._onChange = onChange; + }, + + /************** + * PUBLIC API * + **************/ + + /** + * Sets the number of pages + * + * @method setSize + * @param {Number} sz number of pages + * @public + */ + setSize: function(sz) { + if (!Common.isInteger(sz)) { + throw new TypeError('1st argument must be an integer number!'); + } + + this._size = sz; + this._updateItems(); + this._current = 0; + }, + + /** + * Calculate the number of pages, then call setSize(). + * + * @param setSizeInItems + * @param {Number} totalItems + * @param {Number} itemsPerPage + */ + setSizeInItems: function (totalItems, itemsPerPage) { + var pageNumber = Math.ceil(totalItems / itemsPerPage); + this.setSize(pageNumber); + }, + + /** + * Sets the current page + * + * @method setCurrent + * @param {Number} nr sets the current page to given number + * @param {Boolean} isRelative trueish to set relative change instead of absolute (default) + * @public + */ + setCurrent: function(nr, isRelative) { + if (!Common.isInteger(nr)) { + throw new TypeError('1st argument must be an integer number!'); + } + + if (isRelative) { + nr += this._current; + } + + if (nr > this._size - 1) { + nr = this._size - 1; + } + + if (nr < 0) { + nr = 0; + } + + this._current = nr; + this._updateItems(); + + if (this._onChange) { + this._onChange(this, nr); + } + + /*if (this._options.setHash) { + var o = {}; + o[this._options.hashParameter] = nr; + Common.setHash(o); + }*/ // undocumented option, removing + }, + + /** + * Returns the number of pages + * + * @method getSize + * @return {Number} Number of pages + * @public + */ + getSize: function() { + return this._size; + }, + + /** + * Returns current page + * + * @method getCurrent + * @return {Number} Current page + * @public + */ + getCurrent: function() { + return this._current; + }, + + /** + * Returns true iif at first page + * + * @method isFirst + * @return {Boolean} True if at first page + * @public + */ + isFirst: function() { + return this._current === 0; + }, + + /** + * Returns true iif at last page + * + * @method isLast + * @return {Boolean} True if at last page + * @public + */ + isLast: function() { + return this._current === this._size - 1; + }, + + /** + * Returns true iif has prior pages + * + * @method hasPrevious + * @return {Boolean} True if has prior pages + * @public + */ + hasPrevious: function() { + return this._current > 0; + }, + + /** + * Returns true iif has pages ahead + * + * @method hasNext + * @return {Boolean} True if has pages ahead + * @public + */ + hasNext: function() { + return this._current < this._size - 1; + }, + + /** + * Returns true iif has prior set of page(s) + * + * @method hasPreviousPage + * @return {Boolean} Returns true iif has prior set of page(s) + * @public + */ + hasPreviousPage: function() { + return this._options.maxSize && this._current > this._options.maxSize - 1; + }, + + /** + * Returns true iif has set of page(s) ahead + * + * @method hasNextPage + * @return {Boolean} Returns true iif has set of page(s) ahead + * @public + */ + hasNextPage: function() { + return this._options.maxSize && this._size - this._current >= this._options.maxSize + 1; + }, + + /** + * Unregisters the component and removes its markup from the DOM + * + * @method destroy + * @public + */ + destroy: Common.destroyComponent + }; + + return Pagination; + +}); + +/** + * @module Ink.UI.ProgressBar_1 + * @author inkdev AT sapo.pt + * @version 1 + */ +Ink.createModule('Ink.UI.ProgressBar', '1', ['Ink.Dom.Selector_1','Ink.Dom.Element_1'], function( Selector, Element ) { + 'use strict'; + + /** + * Associated to a .ink-progress-bar element, it provides the necessary + * method - setValue() - for the user to change the element's value. + * + * @class Ink.UI.ProgressBar + * @constructor + * @version 1 + * @param {String|DOMElement} selector + * @param {Object} [options] Options + * @param {Number} [options.startValue] Percentage of the bar that is filled. Range between 0 and 100. Default: 0 + * @param {Function} [options.onStart] Callback that is called when a change of value is started + * @param {Function} [options.onEnd] Callback that is called when a change of value ends + * + * @example + *
          + * I am a grey progress bar + *
          + *
          + * + */ + var ProgressBar = function( selector, options ){ + + if( typeof selector !== 'object' ){ + if( typeof selector !== 'string' ){ + throw '[Ink.UI.ProgressBar] :: Invalid selector'; + } else { + this._element = Selector.select(selector); + if( this._element.length < 1 ){ + throw "[Ink.UI.ProgressBar] :: Selector didn't find any elements"; + } + this._element = this._element[0]; + } + } else { + this._element = selector; + } + + + this._options = Ink.extendObj({ + 'startValue': 0, + 'onStart': function(){}, + 'onEnd': function(){} + },Element.data(this._element)); + + this._options = Ink.extendObj( this._options, options || {}); + this._value = this._options.startValue; + + this._init(); + }; + + ProgressBar.prototype = { + + /** + * Init function called by the constructor + * + * @method _init + * @private + */ + _init: function(){ + this._elementBar = Selector.select('.bar',this._element); + if( this._elementBar.length < 1 ){ + throw '[Ink.UI.ProgressBar] :: Bar element not found'; + } + this._elementBar = this._elementBar[0]; + + this._options.onStart = Ink.bind(this._options.onStart,this); + this._options.onEnd = Ink.bind(this._options.onEnd,this); + this.setValue( this._options.startValue ); + }, + + /** + * Sets the value of the Progressbar + * + * @method setValue + * @param {Number} newValue Numeric value, between 0 and 100, that represents the percentage of the bar. + * @public + */ + setValue: function( newValue ){ + this._options.onStart( this._value); + + newValue = parseInt(newValue,10); + if( isNaN(newValue) || (newValue < 0) ){ + newValue = 0; + } else if( newValue>100 ){ + newValue = 100; + } + this._value = newValue; + this._elementBar.style.width = this._value + '%'; + + this._options.onEnd( this._value ); + } + }; + + return ProgressBar; + +}); + +/** + * @module Ink.UI.SmoothScroller_1 + * @author inkdev AT sapo.pt + * @version 1 + */ +Ink.createModule('Ink.UI.SmoothScroller', '1', ['Ink.Dom.Event_1','Ink.Dom.Selector_1','Ink.Dom.Loaded_1'], function(Event, Selector, Loaded) { + 'use strict'; + + var requestAnimationFrame = + window.requestAnimationFrame || + function (cb) { return setTimeout(cb, 10); }; + + var cancelAnimationFrame = + window.cancelAnimationFrame || + function (id) { clearTimeout(id); }; + + /** + * @class Ink.UI.SmoothScroller + * @version 1 + * @static + * + * @example + * + * go to Part 1 + * + * [lots and lots of content...] + * + *

          Part 1

          + * + * + */ + var SmoothScroller = { + + /** + * Sets the speed of the scrolling + * + * @property speed + * @type {Number} + * @readOnly + * @static + */ + speed: 10, + + /** + * Returns the Y position of an element, relative to the document + * + * @method getTop + * @param {DOMElement} d DOMElement to get the Y position from + * @return {Number} Y position of div 'd' + * @public + * @static + */ + getTop: function(d) { + return Math.round( + SmoothScroller.scrollTop() + d.getBoundingClientRect().top); + }, + + + /** + * Returns the current scroll position + * + * @method scrollTop + * @return {Number} Current scroll position + * @public + * @static + */ + scrollTop: function() { + var body = document.body, + d = document.documentElement; + if (body && body.scrollTop){ + return body.scrollTop; + } + if (d && d.scrollTop){ + return d.scrollTop; + } + if (window.pageYOffset){ + return window.pageYOffset; + } + return 0; + }, + + /** + * Attaches an event for an element + * + * @method add + * @param {DOMElement} el DOMElement to make the listening of the event + * @param {String} event Event name to be listened + * @param {DOMElement} fn Callback function to run when the event is triggered. + * @public + * @static + */ + add: function(el, event, fn) { + Event.observe(el,event,fn); + }, + + + /** + * Kill an event of an element + * + * @method end + * @param {String} e Event to be killed/stopped + * @public + * @static + */ + // kill an event of an element + end: function(e) { + Event.stopDefault(e); + }, + + + /** + * Moves the scrollbar to the target element. This is the function + * which animates the scroll position bit by bit. It calls itself in + * the end through requestAnimationFrame + * + * @method scroll + * @param {Number} d Y coordinate value to stop + * @public + * @static + */ + scroll: function(d) { + var a = SmoothScroller.scrollTop(); + if (d > a) { + a += Math.ceil((d - a) / SmoothScroller.speed); + } else { + a = a + (d - a) / SmoothScroller.speed; + } + + window.scrollTo(0, a); + + cancelAnimationFrame(SmoothScroller.interval); + + if (!((a) === d || SmoothScroller.offsetTop === a)) { + SmoothScroller.interval = requestAnimationFrame( + Ink.bindMethod(SmoothScroller, 'scroll', d), document.body); + } else { + SmoothScroller.onDone(); + } + SmoothScroller.offsetTop = a; + }, + + + /** + * Has smooth scrolling applied to relevant elements upon page load. + * + * @method init + * @param [selector='a.scrollableLink,a.ink-smooth-scroll'] Selector string for finding links with smooth scrolling enabled. + * @public + * @static + */ + init: function(selector) { + Loaded.run(Ink.bindMethod(SmoothScroller, 'render', selector)); + }, + + /** + * This method extracts all the anchors and validates them as # and attaches the events + * + * @method render + * @public + * @static + */ + render: function(selector) { + var a = Selector.select(selector || 'a.scrollableLink,a.ink-smooth-scroll'); + + for (var i = 0; i < a.length; i++) { + var _elm = a[i]; + if (_elm.href && _elm.href.indexOf('#') !== -1 && ((_elm.pathname === location.pathname) || ('/' + _elm.pathname === location.pathname))) { + Event.observe(_elm,'click', Ink.bindEvent(SmoothScroller.onClick, this, _elm)); + } + } + }, + + + /** + * Click handler + * + * @method onClick + * @public + * @static + */ + onClick: function(event, _elm) { + SmoothScroller.end(event); + if(_elm !== null && _elm.getAttribute('href') !== null) { + var hashIndex = _elm.href.indexOf('#'); + if (hashIndex === -1) { + return; + } + var hash = _elm.href.substr((hashIndex + 1)); + var activeLiSelector = 'ul > li.active > ' + selector; + + var selector = 'a[name="' + hash + '"],#' + hash; + var elm = Selector.select(selector)[0]; + var activeLi = Selector.select(activeLiSelector)[0]; + activeLi = activeLi && activeLi.parentNode; + + if (typeof(elm) !== 'undefined') { + if (_elm.parentNode.className.indexOf('active') === -1) { + if (activeLi) { + activeLi.className = activeLi.className.replace(/(^|\s+)active($|\s+)/g, ''); + } + _elm.parentNode.className += " active"; + } + SmoothScroller.hash = hash; + SmoothScroller.scroll(SmoothScroller.getTop(elm)); + } + } + }, + + /** + * Called when the scroll movement is done. Updates browser address. + */ + onDone: function () { + window.location.hash = SmoothScroller.hash; + } + }; + + return SmoothScroller; + +}); + +/** + * @module Ink.UI.SortableList_1 + * @author inkdev AT sapo.pt + * @version 1 + */ +Ink.createModule('Ink.UI.SortableList', '1', ['Ink.UI.Common_1','Ink.Dom.Css_1','Ink.Dom.Event_1','Ink.Dom.Element_1','Ink.Dom.Selector_1'], function( Common, Css, Events, Element, Selector ) { + 'use strict'; + var hasTouch = (('ontouchstart' in window) || // html5 browsers + (navigator.maxTouchPoints > 0) || // future IE + (navigator.msMaxTouchPoints > 0)); + + /** + * Adds sortable behaviour to any list! + * + * @class Ink.UI.SortableList + * @constructor + * @version 1 + * @param {String|DOMElement} selector + * @param {String} [options.placeholderClass='placeholder'] CSS class to be added to the "ghost" element being dragged around + * @param {String} [options.draggedClass='hide-all'] CSS class added to the original element. + * @param {String} [options.draggingClass='dragging'] CSS class added to the html element when the user is dragging. + * @param {String} [options.dragSelector='li'] CSS selector for the drag enabled nodes. + * @param {String} [options.handleSelector=null] CSS selector for the drag handle. If present, you can only drag nodes by this selector. + * @param {String} [options.moveSelector=null] CSS selector to validate a node move. If present, you can only move nodes into this selector. + * @param {Boolean} [options.swap=false] Flag to swap moving element with target element instead of changing its order. + * @param {Boolean} [options.cancelMouseOut=false] Flag to cancel moving if mouse leaves the container element. + + * @example + *
            + *
          • drag hereprimeiro
          • + *
          • drag heresegundo
          • + *
          • drag hereterceiro
          • + *
          + * + */ + var Spy = function( selector, options ){ + + this._rootElement = Common.elOrSelector(selector,'1st argument'); + + /** + * Setting default options and - if needed - overriding it with the data attributes + */ + this._options = Ink.extendObj({ + target: undefined, + activeClass: 'active' + }, Element.data( this._rootElement ) ); + + /** + * In case options have been defined when creating the instance, they've precedence + */ + this._options = Ink.extendObj(this._options,options || {}); + + this._options.target = Common.elOrSelector( this._options.target, 'Target' ); + + this._init(); + }; + + Spy.prototype = { + /** + * Init function called by the constructor + * + * @method _init + * @private + */ + _init: function() { + addSpied(this._rootElement, this._options.target); + observeOnScroll(); + onScroll(); + } + }; + + return Spy; + +}); + +/** + * @module Ink.UI.Stacker_1 + **/ +Ink.createModule('Ink.UI.Stacker', 1, ['Ink.UI.Common_1', 'Ink.Dom.Event_1', 'Ink.Dom.Element_1'], function(InkUICommon, InkEvent, InkElement) { + 'use strict'; + +function Stacker(selector, options) { + this._init(selector, options); +} + +Stacker.prototype = { + /** + * This module combines several stacks of items together, in smaller screen sizes. + * + * The purpose is to have several stacks of items which may have different heights and as such cannot be used because of `float: left` quirks. + * + * For example, when you have three different columns of information: + * + * [col. A: 1] [col. B: 1] [col. C: 1] + * [col. B: 2] [col. C: 2] [col. C: 2] + * + * and the screen resizes and you need a layout of 2 columns, Stacker reorders the stacks so that you get: + * + * [col. A: 1] [col. B: 1] + * [col. C: 1] [col. A: 2] + * [col. B: 2] [col. C: 2] + * + * Note: If you just want to use a different amount of columns for your items in several viewports, but these items are guaranteed to have a fixed height, don't use this module. Use the `small-*`, `medium-*` and `large-*` classes instead. + * + * @class Ink.UI.Stacker_1 + * + * @constructor + * @param [container] {DOMElement|String} Element which contains the stacks (identified by the options.column selector) + * @param [options] + * @param [options.column='.stacker-column'] {String} Select the columns inside the `container` + * @param [options.item='.stacker-item'] {String} Select items in your stack + * + * @param [options.customBreakPoints] {Object} options for each breakpoint name. Use this if you have more breakpoints than Ink by default (`large`, `medium`, `small`) + * @param [options.customBreakpoints.(breakpoint)] {Object} + * @param options.customBreakpoints.(breakpoint).max Maximum screen size as seen in your media query + * @param options.customBreakpoints.(breakpoint).min Minimum screen size as seen in your media query + * @param options.customBreakpoints.(breakpoint).cols Column count for this size. + * + * @param [options.largeMax] {Number} Upper bound of `large` breakpoint + * @param [options.largeMin=961] {Number} Lower bound of `large` breakpoint + * @param [options.mediumMax=960] {Number} Upper bound of `medium` breakpoint + * @param [options.mediumMin=651] {Number} Lower bound of `medium` breakpoint + * @param [options.smallMax=650] {Number} Upper bound of `small` breakpoint + * @param [options.smallMin] {Number} Lower bound of `small` breakpoint + * + * @param [options.largeCols=3] {Integer} Number of columns in the `large` viewport + * @param [options.mediumCols=2] {Integer} Number of columns in the `medium` viewport + * @param [options.smallCols=1] {Integer} Number of columns in the `small` viewport + * + * @param [options.isOrdered=true] {Boolean} When `false`, do not reorder stacks when combining them. + * @param [options.onRunCallback] {Function} Called when instantiated + * @param [options.onResizeCallback] {Function} Called when resized because the window resized. + * @param [options.onAPIReloadCallback] {Function} Called when you ask to reload stack items from the DOM. + * + * @example + * + * Html: + * + *
          + *
          + *
          a
          + *
          d
          + *
          g
          + *
          + *
          + *
          b
          + *
          e
          + *
          h
          + *
          + *
          + *
          c
          + *
          f
          + *
          i
          + *
          + *
          + * + * Javascript: + * + * Ink.requireModules(['Ink.UI.Stacker_1'], function (Stacker) { + * var stacker = new Stacker('#stacker-container'); + * // Keep the "stacker" variable around if you want to call addItem and reloadItems + * }); + **/ + _init: function(selector, options) { + /* globals console */ + this._rootElm = InkUICommon.elsOrSelector(selector, 'Ink.UI.Stacker root element')[0] || null; + if(this._rootElm === null) { + if(typeof console !== 'undefined') { + console.warn('Ink.UI.Stacker: No root element'); + } + } + + this._options = InkUICommon.options({ + column: ['String', '.stacker-column'], + item: ['String', '.stacker-item'], + + // [3.0.0] review this when we have info about our breakpoints from the CSS + customBreakPoints: ['Object', null], // Must be: {xlarge: {max: 9999, min: 1281, cols: 5}, large:{max:1280, min:1001, cols:4} medium:{max:1000, min:801,cols:3}, ...etc..} + largeMax: ['Number', Number.MAX_VALUE], + largeMin: ['Number', 961], + mediumMax: ['Number', 960], + mediumMin: ['Number', 651], + smallMax: ['Number', 650], + smallMin: ['Number', 0], + + largeCols: ['Integer', 3], + mediumCols: ['Integer', 2], + smallCols: ['Integer', 1], + + isOrdered: ['Boolean', true], + onRunCallback: ['Function', null], + onResizeCallback: ['Function', null], + onAPIReloadCallback: ['Function', null] + }, options || {}, this._rootElm); + + this._aList = []; + + this._curLayout = 'large'; + + // [todo] is this needed? + this._runFirstTime = false; + + this._getPageItemsToList(); + + if(this._canApplyLayoutChange() || !this._runFirstTime) { + this._runFirstTime = true; + this._applyLayoutChange(); + if(typeof(this._options.onRunCallback) === 'function') { + this._options.onRunCallback(this._curLayout); + } + } + this._addEvents(); + }, + + /** + * Add an item to the end of your stacks. Call `reloadItems()` when you are done adding items. + * @method addItem + * @param {DOMElement} item + **/ + addItem: function(item) { + this._aList.push(item); + }, + + /** + * Update the layout of your items. + * + * Call this when: + * + * - The width has changed, but not because of the window resizing. + * - You used addItem to add some items + * + * @method reloadItems + **/ + reloadItems: function() { + this._applyLayoutChange(); + if(typeof(this._options.onAPIReloadCallback) === 'function') { + this._options.onAPIReloadCallback(this._curLayout); + } + }, + + _addEvents: function() { + InkEvent.observe(window, 'resize', Ink.bindEvent(this._onResize, this)); + }, + + _onResize: function() { + if(this._canApplyLayoutChange()) { + this._removeDomItems(); + this._applyLayoutChange(); + if(typeof(this._options.onResizeCallback) === 'function') { + this._options.onResizeCallback(this._curLayout); + } + } + }, + + _setCurLayout: function() { + var viewportWidth = InkElement.viewportWidth(); + if(this._options.customBreakpoints && typeof(this._options.customBreakPoints) === 'object') { + for(var prop in this._options.customBreakPoints) { + if(this._options.customBreakPoints.hasOwnProperty(prop)) { + if(viewportWidth >= Number(this._options.customBreakPoints[prop].min) && viewportWidth <= Number(this._options.customBreakPoints[prop].max) && this._curLayout !== prop) { + this._curLayout = prop; + return; + } + } + } + } else { + if(viewportWidth <= Number(this._options.largeMax) && viewportWidth >= Number(this._options.largeMin) && this._curLayout !== 'large') { + this._curLayout = 'large'; + } else if(viewportWidth >= Number(this._options.mediumMin) && viewportWidth <= Number(this._options.mediumMax) && this._curLayout !== 'medium') { + this._curLayout = 'medium'; + } else if(viewportWidth >= Number(this._options.smallMin) && viewportWidth <= Number(this._options.smallMax) && this._curLayout !== 'small') { + this._curLayout = 'small'; + } + } + }, + + _getColumnsToShow: function() { + if(this._options.customBreakPoints && typeof(this._options.customBreakPoints) === 'object') { + return Number(this._options.customBreakPoints[this._curLayout].cols); + } else { + return Number(this._options[this._curLayout+'Cols']); + } + }, + + _canApplyLayoutChange: function() { + var curLayout = this._curLayout; + this._setCurLayout(); + if(curLayout !== this._curLayout) { + return true; + } + return false; + }, + + _getPageItemsToList: function() { + this._aColumn = Ink.ss(this._options.column, this._rootElm); + var totalCols = this._aColumn.length; + var index = 0; + if(totalCols > 0) { + for(var i=0; i < this._aColumn.length; i++) { + var aItems = Ink.ss(this._options.item, this._aColumn[i]); + for(var j=0; j < aItems.length; j++) { + if(this._options.isOrdered) { + index = i + (j * totalCols); + } + this._aList[index] = aItems[j]; + if(!this._options.isOrdered) { + index++; + } + //aItems[j].style.height = (100 + (Math.random() * 100))+'px'; + aItems[j].parentNode.removeChild(aItems[j]); + } + } + if(this._aList.length > 0 && this._options.isOrdered) { + var aNewList = []; + for(var ii=0; ii < this._aList.length; ii++) { + if(typeof(this._aList[ii]) !== 'undefined') { + aNewList.push(this._aList[ii]); + } + } + this._aList = aNewList; + } + } + }, + + _removeDomItems: function() { + var totalCols = this._aColumn.length; + if(totalCols > 0) { + for(var i=0; i < totalCols; i++) { + var aItems = Ink.ss(this._options.item, this._aColumn[i]); + for(var j=aItems.length - 1; j >= 0; j--) { + aItems[j].parentNode.removeChild(aItems[j]); + } + } + } + }, + + _applyLayoutChange: function() { + var totalCols = this._getColumnsToShow(); + var totalItems = this._aList.length; + var index = 0; + var countCol = 0; + if(totalCols > 0) { + while(countCol < totalCols) { + this._aColumn[countCol].appendChild(this._aList[index]); + index++; + countCol++; + if(index === totalItems) { + return; + } + if(countCol === totalCols) { + countCol = 0; + } + } + } + } +}; + +return Stacker; + +}); + +/** + * @module Ink.UI.Sticky_1 + * @author inkdev AT sapo.pt + * @version 1 + */ +Ink.createModule('Ink.UI.Sticky', '1', ['Ink.UI.Common_1','Ink.Dom.Event_1','Ink.Dom.Element_1','Ink.Dom.Css_1'], function(Common, Event, Element, Css) { + 'use strict'; + + /** + * The Sticky component takes an element and transforms it's behavior in order to, when the user scrolls he sets its position + * to fixed and maintain it until the user scrolls back to the same place. + * + * @class Ink.UI.Sticky + * @constructor + * @version 1 + * @param {String|DOMElement} selector + * @param {Object} [options] Options + * @param {Number} [options.offsetBottom=0] Number of pixels of distance from the bottomElement. + * @param {Number} [options.offsetTop=0] Number of pixels of distance from the topElement. + * @param {Boolean} [options.inlineDimensions=true] Whether to set "style.height" and "style.width" in the stuck element. Turn this off when your `stickyClass` has its own height and width and you don't want this to be dealt with through javascript. + * @param {Boolean} [options.inlinePosition=true] Whether to set "style.left" in the stuck element. Turn this off when your `stickyClass` has its own "left" position and you don't want this to be dealt with through javascript. + * @param {String} [options.wrapperClass="ink-sticky-wrapper"] Css class for the wrapper element. + * @param {String} [options.stickyClass="ink-sticky-stuck"] Css class for sticking the sticky to the screen. Add your own "stuck" class to define your own sticky behaviour. + * @param {String} [options.topElement] CSS Selector that specifies a top element with which the component could collide. + * @param {String} [options.bottomElement] CSS Selector that specifies a bottom element with which the component could collide. + * @param {Array|String} [options.activateInLayouts='medium,large'] Layouts in which the sticky behaviour is present. Pass an array or comma-separated string. + * @example + * + */ + var Sticky = function( selector, options ){ + this._rootElement = Common.elOrSelector(selector, 'Ink.UI.Sticky_1'); + + this._options = Common.options({ + offsetBottom: ['Integer', 0], + offsetTop: ['Integer', 0], + topElement: ['Element', null], + wrapperClass: ['String', 'ink-sticky-wrapper'], + stickyClass: ['String', 'ink-sticky-stuck'], + inlineDimensions: ['Boolean', true], + inlinePosition: ['Boolean', true], + bottomElement: ['Element', null], + activateInLayouts: ['String', 'medium,large'] + }, options || {}, this._rootElement ); + + // Because String#indexOf is compatible with lt IE8 but not Array#indexOf + this._options.activateInLayouts = this._options.activateInLayouts.toString(); + + this._dims = null; // force a recalculation of the dimensions later + + this._options.offsetTop = parseInt(this._options.offsetTop, 10) || 0; + this._options.offsetBottom = parseInt(this._options.offsetBottom, 10) || 0; + + if (this._options.topElement) { + this._options.topElement = Common.elOrSelector(this._options.topElement, 'Top Element'); + } + if (this._options.bottomElement) { + this._options.bottomElement = Common.elOrSelector(this._options.bottomElement, 'Sticky bottom Element'); + } + + this._wrapper = Element.create('div', { className: this._options.wrapperClass }); + Element.wrap(this._rootElement, this._wrapper); + + this._init(); + }; + + Sticky.prototype = { + + /** + * Init function called by the constructor + * + * @method _init + * @private + */ + _init: function() { + var scrollTarget = document.addEventListener ? document : window; + this._onScroll = Ink.bind(Event.throttle(this._onScroll, 33), this); // Because this is called directly. + Event.observe( scrollTarget, 'scroll', this._onScroll ); + Event.observe( window, 'resize', Ink.bindEvent(Event.throttle(this._onResize, 100), this) ); + this._onScroll(); + }, + + /** + * Returns whether the sticky is disabled in the current view + * + * @method isDisabledInLayout + * @private + */ + _isDisabledInLayout: function () { + var currentLayout = Common.currentLayout(); + if (!currentLayout) { return false; } + return this._options.activateInLayouts.indexOf(currentLayout) === -1; + }, + + /** + * Scroll handler. + * + * @method _onScroll + * @private + */ + _onScroll: function(){ + var dims = this._getDims(); + var scrollHeight = Element.scrollHeight(); + + var unstick = this._isDisabledInLayout() || + scrollHeight <= dims.top - this._options.offsetTop || + (this._options.topElement && this._options.topElement.getBoundingClientRect().bottom + this._options.offsetTop > 0); + + if( unstick ) { + // We're on top, no sticking. position:static is the "normal" position. + this._unstick(); + return; + } + + // If we stick it now, what will be its boundingClientRect.bottom ? + var bottomOfSticky = this._options.offsetTop + dims.height + Element.scrollHeight(); + var maxBottomOfSticky = document.body.scrollHeight; + + if (this._options.bottomElement) { + maxBottomOfSticky = + this._options.bottomElement.getBoundingClientRect().top + + Element.scrollHeight(); + } + + maxBottomOfSticky -= this._options.offsetBottom; + + if ( bottomOfSticky < maxBottomOfSticky ) { + // Stick to screen! + this._stickTo('screen'); + } else { + // Stick to bottom + this._stickTo('bottom'); + } + }, + + /** + * Have the sticky stick nowhere, to the screen, or to the bottom. + * + * @method _stickTo + * @private + */ + _stickTo: function (where) { + var style = this._rootElement.style; + var dims = this._getDims(); + + Css.addClassName(this._rootElement, this._options.stickyClass); + this._wrapper.style.height = dims.height + 'px'; + + this._inlineDimensions(dims.height + 'px', dims.width + 'px'); + + if (this._options.inlinePosition === false) { + return; + } + + style.left = dims.left + 'px'; + + if (where === 'screen') { + style.bottom = null; + style.top = this._options.offsetTop + 'px'; + } else if (where === 'bottom') { + // Distance between bottom of sticky and bottom of document + var bottom = this._getBottomOffset(); + + // Distance between bottom of viewport and bottom of document + var bottomOfViewport = Element.scrollHeight() + Element.viewportHeight(); + var toBottomOfDocument = Element.pageHeight() - bottomOfViewport; + + style.bottom = bottom - toBottomOfDocument + 'px'; + style.top = 'auto'; + } + }, + + /** + * "unstick" the sticky from the screen or bottom of the document + * @method _unstick + * @private + */ + _unstick: function () { + Css.removeClassName(this._rootElement, this._options.stickyClass); + // deinline dimensions of our root element + this._inlineDimensions(null, null); + + // deinline the position of our root element + if (this._options.inlinePosition) { + this._rootElement.style.left = null; + this._rootElement.style.top = null; + this._rootElement.style.bottom = null; + } + + // deinline dimensions of wrapper + this._wrapper.style.height = null; + this._wrapper.style.width = null; + + // Break the "getDims" cache + this._dims = null; + }, + + /** + * Resize handler + * + * @method _onResize + * @private + */ + _onResize: function(){ + this._dims = null; // Blow the cache so _getDims recalculates + this._onScroll(); + }, + + /** + * Recalculate the "dims" cache, or get it. + * + * The "dims" cache is to be set to null when the element is liable to have changed dimensions + * + * (eg: on resize) + * + **/ + _getDims: function () { + if (this._dims !== null) { return this._dims; } + + var style = this._rootElement.style; + + // We unstick the sticky so we can measure. + var oldPosition = style.position; + var oldWidth = style.width; + + style.position = 'static'; // [todo] this should be a class toggle + style.width = null; + + var dimensionsInStatic = Element.outerDimensions(this._rootElement); + var rect = this._wrapper.getBoundingClientRect(); + this._dims = { + height: dimensionsInStatic[1], + width: dimensionsInStatic[0], + left: rect.left + Element.scrollWidth(), + top: rect.top + Element.scrollHeight() + }; + + style.position = oldPosition; + style.width = oldWidth; + + return this._dims; + }, + + /** + * Set style.height and style.width, but not if options.inlineDimensions === false + * + * @method _inlineDimensions + * @private + */ + _inlineDimensions: function (height, width) { + if (this._options.inlineDimensions) { + this._rootElement.style.height = height; + this._rootElement.style.width = width; + } + }, + + /** + * Get the distance between the bottom of the element and the bottom of the page + * + * @method _getBottomOffset + * @private + */ + _getBottomOffset: function () { + var bottom = this._options.offsetBottom; + if (this._options.bottomElement) { + bottom += Element.pageHeight() - + Element.offsetTop(this._options.bottomElement); + } + return bottom; + } + }; + + return Sticky; + +}); + +/** + * @module Ink.UI.Swipe + * @author ink AT sapo.pt + * @version 1 + */ +Ink.createModule('Ink.UI.Swipe', '1', ['Ink.Dom.Event_1', 'Ink.Dom.Element_1', 'Ink.UI.Common_1'], function(InkEvent, InkElement, Common) { + 'use strict'; + + /** + * Subscribe swipe gestures! + * + * Supports filtering swipes be any combination of the criteria supported in the options. + * + * @class Ink.UI.Swipe + * @constructor + * @param {String|DOMElement} el + * @param {Object} options + * @param {Function} [options.onEnd] callback function for the `touchend` event. Gets all the gesture information, and is filtered by min/max Dist and Duration options (see below) + * @param {Function} [options.onStart] callback function for `touchstart` event + * @param {Function} [options.onMove] callback function for every `touchmove` event. Gets current gesture information. + * @param {Number} [options.minDist] minimum allowed distance, in pixels + * @param {Number} [options.maxDist] maximum allowed distance, in pixels + * @param {Number} [options.minDuration] minimum allowed duration, in seconds + * @param {Number} [options.maxDuration] maximum allowed duration, in seconds + * @param {String} [options.axis] if either 'x' or 'y' is passed, only swipes where the dominant axis is the given one trigger the callback + * @param {String} [options.storeGesture=false] store gesture information and provide to the callback + * @param {String} [options.stopEvents=true] stop (default and propagation) of the received events + * + * ----- + * + * Arguments received by the callbacks + * ----------------------------------- + * + * `onStart`, `onMove`, and `onEnd` receive as argument an object containing: + * + * - `event`: the DOMEvent object + * - `element`: the target element + * - `Instance`: the `Ink.UI.Swipe_1` instance + * - `position`: `Array` with `[x, y]` coordinates of current position + * - `dt`: Time passed between now and the first event (onMove only) + * - `gesture`: an Array containing [x,y] coordinates of every touchmove event received (storeGesture only) (onEnd only) + * - `time`: an Array containing all the `dt` values for every touchmove event (onEnd only) + * - `overallMovement`: X and Y distance traveled by the touch movement (`[x, y]`) (onEnd only) + * - `overallTime`: total time passed (onEnd only) + * + */ + function Swipe(el, options) { + el = Common.elOrSelector(el, 'Swipe target'); + + this._options = Ink.extendObj({ + onEnd: undefined, + onStart: undefined, + onMove: undefined, + minDist: undefined, // in pixels + maxDist: undefined, + minDuration: undefined, // in seconds + maxDuration: undefined, + axis: undefined, // x | y + storeGesture: false, + stopEvents: true + }, InkElement.data(el), options || {}); + + if (typeof options === 'function') { + this._options.onEnd = options; + } + + this._handlers = { + down: Ink.bindEvent(this._onDown, this), + move: Ink.bindEvent(this._onMove, this), + up: Ink.bindEvent(this._onUp, this) + }; + + this._element = el; + + this._init(); + } + + Swipe.prototype = { + + version: '0.1', + + _supported: ('ontouchstart' in document.documentElement), + + _init: function() { + var db = document.body; + InkEvent.observe(db, 'touchstart', this._handlers.down); + if (this._options.storeGesture || this._options.onMove) { + InkEvent.observe(db, 'touchmove', this._handlers.move); + } + InkEvent.observe(db, 'touchend', this._handlers.up); + this._isOn = false; + }, + + _isMeOrParent: function(el, parentEl) { + if (!el) {return;} + do { + if (el === parentEl) { return true; } + el = el.parentNode; + } while (el); + return false; + }, + + _pushGesture: function (coords, dt) { + if (this._options.storeGesture) { + this._gesture.push(coords); + this._time.push(dt); + } + }, + + _onDown: function(event) { + if (event.changedTouches.length !== 1) { return; } + if (!this._isMeOrParent(event.target, this._element)) { return; } + + if( this._options.stopEvents === true ){ + InkEvent.stop(event); + } + event = event.changedTouches[0]; + this._isOn = true; + this._target = event.target; + + this._t0 = +new Date(); + this._p0 = [event.pageX, event.pageY]; + + if (this._options.storeGesture) { + this._gesture = []; + this._time = []; + } + + this._pushGesture(this._p0, 0); + + if (this._options.onStart) { + this._options.onStart({ + event: event, + element: this._element, + instance: this, + position: this._p0, + dt: 0 + }); + } + }, + + _onMove: function(event) { + if (!this._isOn || event.changedTouches.length !== 1) { return; } + if( this._options.stopEvents === true ) { + InkEvent.stop(event); + } + + event = event.changedTouches[0]; + var t1 = +new Date(); + var dt = (t1 - this._t0); + + var gesture = [event.pageX, event.pageY]; + + this._pushGesture(gesture, dt); + + if (this._options.onMove) { + this._options.onMove({ + event: event, + element: this._element, + instance: this, + position: gesture, + dt: dt + }); + } + }, + + _onUp: function(event) { + if (!this._isOn || event.changedTouches.length !== 1) { return; } + + if( this._options.stopEvents === true ){ + InkEvent.stop(event); + } + event = event.changedTouches[0]; // TODO SHOULD CHECK IT IS THE SAME TOUCH + this._isOn = false; + + var t1 = +new Date(); + var p1 = [event.pageX, event.pageY]; + var dt = (t1 - this._t0); + var dr = [ + p1[0] - this._p0[0], + p1[1] - this._p0[1] + ]; + var dist = Math.sqrt(dr[0]*dr[0] + dr[1]*dr[1]); + var axis = Math.abs(dr[0]) > Math.abs(dr[1]) ? 'x' : 'y'; + + var o = this._options; + if (o.minDist && dist < o.minDist) { return; } + if (o.maxDist && dist > o.maxDist) { return; } + if (o.minDuration && dt < o.minDuration) { return; } + if (o.maxDuration && dt > o.maxDuration) { return; } + if (o.axis && axis !== o.axis) { return; } + + if (this._options.onEnd) { + this._options.onEnd({ + event: event, + element: this._element, + instance: this, + gesture: this._gesture, + time: this._time, + axis: axis, + overallMovement: dr, + overallTime: dt + }); + } + } + }; + + return Swipe; +}); + +/** + * @module Ink.UI.Table_1 + * @author inkdev AT sapo.pt + * @version 1 + */ +Ink.createModule('Ink.UI.Table', '1', ['Ink.Util.Url_1','Ink.UI.Pagination_1','Ink.Net.Ajax_1','Ink.UI.Common_1','Ink.Dom.Event_1','Ink.Dom.Css_1','Ink.Dom.Element_1','Ink.Dom.Selector_1','Ink.Util.Array_1','Ink.Util.String_1', 'Ink.Util.Json_1'], function(InkUrl,Pagination, Ajax, Common, Event, Css, Element, Selector, InkArray, InkString, Json) { + 'use strict'; + + var rNumber = /\d/g; + // Turn into a number, if we can. For sorting data which could be numeric or not. + function maybeTurnIntoNumber(value) { + if( !isNaN(value) && rNumber.test(value) ){ + return parseInt(value, 10); + } else if( !isNaN(value) ){ + return parseFloat(value); + } + return value; + } + function cmp (a, b) { + if( a === b ){ + return 0; + } + return ( ( a > b ) ? 1 : -1 ); + } + // cmp function for comparing data which might be a number. + function numberishEnabledCmp (a, b) { + var aValue = maybeTurnIntoNumber(Element.textContent(a)); + var bValue = maybeTurnIntoNumber(Element.textContent(b)); + + return cmp(aValue, bValue); + } + // Object.keys polyfill + function keys(obj) { + if (typeof Object.keys !== 'undefined') { + return Object.keys(obj); + } + var ret = []; + for (var k in obj) if (obj.hasOwnProperty(k)) { + ret.push(k); + } + return ret; + } + + // Most processJSON* functions can just default to this. + function sameSame(obj) { return obj; } + /** + * The Table component transforms the native/DOM table element into a + * sortable, paginated component. + * + * @class Ink.UI.Table + * @constructor + * @version 1 + * @param {String|DOMElement} selector + * @param {Object} [options] Options + * @param {Number} [options.pageSize] + * Number of rows per page. Omit to avoid paginating. + * + * @param {String} [options.endpoint] + * Endpoint to get the records via AJAX. Omit if you don't want to do AJAX + * + * @param {Function} [options.createEndpointUrl] + * Callback to customise what URL the AJAX endpoint is at. Receives three + * arguments: base (the "endpoint" option), sort (`{ order: 'asc' or 'desc', field: fieldname }`) + * and page ({ page: page number, size: items per page }) + * + * @param {Function} [options.getDataFromEndPoint] + * Callback to allow the user to retrieve the data himself given an URL. + * Must accept two arguments: `url` and `callback`. This `callback` will + * take as a single argument a JavaScript object. + * + * @param {Function} [options.processJSONRows] + * Retrieve an array of rows from the data which came from AJAX. + * + * @param {Function} [options.processJSONHeaders] + * Get an object with all the headers' names as keys, and a { label, sortable } + * object as value. + * Example: `{col1: {label: "Column 1"}, col2: {label: "Column 2", sortable: true}`. + * Takes a single argument, the JSON response. + * + * @param {Function} [options.processJSONRow] + * Process a row object before it gets on the table. + * + * @param {Function} [options.processJSONField] + * Process the field data before putting it on the table. + * You can return HTML, a DOM element, or a string here. + * Arguments you receive: `(column, fieldData, rowIndex)`. + * + * @param {Function} [options.processJSONField.(field_name)] + * The same as processJSONField, but for a particular field. + * + * @param {Function} [options.processJSONTotalRows] + * A callback where you have a chance to say how many rows + * are in the dataset (not only on this page) you have on the + * collection. You get as an argument the JSON response. + * + * @param {Function} [options.getSortKey=null] + * A function taking a `{ columnIndex, columnName, data, element }` + * object and returning a value which serves as a sort key for the + * sorting operation. For example, if you want to sort by a + * `data-sort-key` atribute, set `getSortKey` to: + * + * function (cell) { + * return cell.element.getAttribute('data-sort-key'); + * } + * + * @param {Function} [options.getSortKey.(field_name)] + * Same as `options.getSortKey`, but for a particular field. + * + * @param {Object} [options.tdClassNames] + * An object mapping each field to what classes it gets. + * Example: `{ name: "large-10", isBoss: "hide-small" }` + * + * @param {String|DomElement|Ink.UI.Pagination} [options.pagination] + * Pagination instance or element. + * + * @param {Object} [options.paginationOptions] + * Override the options with which we instantiate the Ink.UI.Pagination. + * + * @param {Boolean} [options.allowResetSorting] + * Allow sort order to be set to "none" in addition to "ascending" and "descending" + * + * @param {String|Array} [options.visibleFields] + * Set of fields which get shown on the table + * @example + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
          PepperScoville Rating
          Trinidad Moruga Scorpion1500000
          Bhut Jolokia1000000
          Naga Viper1463700
          Red Savina Habanero580000
          Habanero350000
          Scotch Bonnet180000
          Malagueta50000
          Tabasco35000
          Serrano Chili27000
          Jalapeño8000
          Poblano1500
          Peperoncino500
          + * + * + */ + var Table = function( selector, options ){ + + /** + * Get the root element + */ + this._rootElement = Common.elOrSelector(selector, 'Ink.UI.Table :'); + + if( this._rootElement.nodeName.toLowerCase() !== 'table' ){ + throw new Error('[Ink.UI.Table] :: The element is not a table'); + } + + this._options = Common.options({ + pageSize: ['Integer', null], + endpoint: ['String', null], + createEndpointUrl: ['Function', null /* default func uses above option */], + getDataFromEndPoint: ['Function', null /* by default use plain ajax for JSON */], + processJSONRows: ['Function', sameSame], + processJSONRow: ['Function', sameSame], + processJSONField: ['Function', sameSame], + processJSONHeaders: ['Function', function (dt) { return dt.fields; }], + processJSONTotalRows: ['Function', function (dt) { return dt.length || dt.totalRows; }], + getSortKey: ['Function', null], + pagination: ['Element', null], + allowResetSorting: ['Boolean', false], + visibleFields: ['String', null], + tdClassNames: ['Object', {}], + paginationOptions: ['Object', null] + }, options || {}, this._rootElement); + + /** + * Checking if it's in markup mode or endpoint mode + */ + this._markupMode = !this._options.endpoint; + + if( this._options.visibleFields ){ + this._options.visibleFields = this._options.visibleFields.toString().split(/[, ]+/g); + } + + this._thead = this._rootElement.tHead || this._rootElement.createTHead(); + this._headers = Selector.select('th', this._thead); + + /** + * Initializing variables + */ + this._handlers = { + thClick: null + }; + this._originalFields = [ + // field headers from the DOM + ]; + this._sortableFields = { + // Identifies which columns are sorted and how. + // columnIndex: 'none'|'asc'|'desc' + }; + this._originalData = this._data = []; + this._pagination = null; + this._totalRows = 0; + + this._handlers.thClick = Event.observeDelegated(this._rootElement, 'click', + 'thead th[data-sortable="true"]', + Ink.bindMethod(this, '_onThClick')); + + this._init(); + }; + + Table.prototype = { + + /** + * Init function called by the constructor + * + * @method _init + * @private + */ + _init: function(){ + /** + * If not is in markup mode, we have to do the initial request + * to get the first data and the headers + */ + if( !this._markupMode ) { + /* Endpoint mode */ + this._getData( ); + } else /* Markup mode */ { + this._resetSortOrder(); + this._addHeadersClasses(); + + /** + * Getting the table's data + */ + this._data = Selector.select('tbody tr', this._rootElement); + this._originalData = this._data.slice(0); + + this._totalRows = this._data.length; + + /** + * Set pagination if options tell us to + */ + this._setPagination(); + } + }, + + /** + * Add the classes in this._options.tdClassNames to our table headers. + * @method _addHeadersClasses + * @private + */ + _addHeadersClasses: function () { + var headerLabel; + var classNames; + for (var i = 0, len = this._headers.length; i < len; i++) { + headerLabel = Element.textContent(this._headers[i]); + classNames = this._options.tdClassNames[headerLabel]; + // TODO do not find header labels this way. But how? + if (classNames) { + Css.addClassName(this._headers[i], classNames); + } + } + }, + + /** + * Click handler. This will mainly handle the sorting (when you click in the headers) + * + * @method _onThClick + * @param {Event} event Event obj + * @private + */ + _onThClick: function( event ){ + var tgtEl = Event.element(event), + paginated = this._options.pageSize !== undefined; + + Event.stop(event); + + var index = InkArray.keyValue(tgtEl, this._headers, true); + var sortable = index !== false && this._sortableFields[index] !== undefined; + + if( !sortable ){ + return; + } + + if( !this._markupMode && paginated ){ + this._invertSortOrder(index, false); + } else { + if ( (this._sortableFields[index] === 'desc') && this._options.allowResetSorting ) { + this._setSortOrderOfColumn(index, null); + this._data = this._originalData.slice(0); + } else { + this._invertSortOrder(index, true); + } + + var tbody = Selector.select('tbody',this._rootElement)[0]; + Common.cleanChildren(tbody); + InkArray.each(this._data, Ink.bindMethod(tbody, 'appendChild')); + + if (this._pagination) { + this._pagination.setCurrent(0); + this._paginate(1); + } + } + }, + + _invertSortOrder: function (index, sortAndReverse) { + var isAscending = this._sortableFields[index] === 'asc'; + + for (var i = 0, len = this._headers.length; i < len; i++) { + this._setSortOrderOfColumn(i, null); + } + + if (sortAndReverse) { + this._sort(index); + if (isAscending) { + this._data.reverse(); + } + } + + this._setSortOrderOfColumn(index, !isAscending); + }, + + _setSortOrderOfColumn: function(index, up) { + var header = this._headers[index]; + var caretHtml = ''; + var order = 'none'; + + if (up === true) { + caretHtml = ''; + order = 'asc'; + } else if (up === false) { + caretHtml = ''; + order = 'desc'; + } + + this._sortableFields[index] = order; + header.innerHTML = Element.textContent(header) + caretHtml; + }, + + /** + * Applies and/or changes the CSS classes in order to show the right columns + * + * @method _paginate + * @param {Number} page Current page + * @private + */ + _paginate: function( page ){ + if (!this._pagination) { return; } + + var pageSize = this._options.pageSize; + + // Hide everything except the items between these indices + var firstIndex = (page - 1) * pageSize; + var lastIndex = firstIndex + pageSize; + + InkArray.each(this._data, function(item, index){ + if (index >= firstIndex && index < lastIndex) { + Css.removeClassName(item,'hide-all'); + } else { + Css.addClassName(item,'hide-all'); + } + }); + + }, + + /* register fields into this._originalFields, whether they come from JSON or a table. + * @method _registerFieldNames + * @private + * @param [names] The field names in an array + **/ + _registerFieldNames: function (names) { + this._originalFields = []; + + InkArray.forEach(names, Ink.bind(function (field) { + if( !this._fieldIsVisible(field) ){ + return; // The user deems this not to be necessary to see. + } + this._originalFields.push(field); + }, this)); + }, + + _fieldIsVisible: function (field) { + return !this._options.visibleFields || + (this._options.visibleFields.indexOf(field) !== -1); + }, + + /** + * Sorts by a specific column. + * + * @method _sort + * @param {Number} index Column number (starting at 0) + * @private + */ + _sort: function( index ){ + // TODO this is THE worst way to declare field names. Incompatible with i18n and a lot of other things. + var fieldName = Element.textContent(this._headers[index]); + var keyFunction = this._options.getSortKey; + + if (keyFunction) { + keyFunction = + typeof keyFunction[fieldName] === 'function' ? + keyFunction[fieldName] : + typeof keyFunction === 'function' ? + keyFunction : + null; + } + + var self = this; + + this._data.sort(function (trA, trB) { + var elementA = Ink.ss('td', trA)[index]; + var elementB = Ink.ss('td', trB)[index]; + if (keyFunction) { + return cmp(userKey(elementA), userKey(elementB)); + } else { + return numberishEnabledCmp(elementA, elementB, index); + } + }); + + function userKey(element) { + return keyFunction.call(self, { + columnIndex: index, + columnName: fieldName, + data: Element.textContent(element), + element: element + }); + } + }, + + /** + * Assembles the headers markup + * + * @method _createHeadersFromJson + * @param {Object} headers Key-value object that contains the fields as keys, their configuration (label and sorting ability) as value + * @private + */ + _createHeadersFromJson: function( headers ){ + this._registerFieldNames(keys(headers)); + + if (this._thead.children.length) { return; } + + var tr = this._thead.insertRow(0); + var th; + + for (var i = 0, len = headers.length; i < len; i++) { + if (this._fieldIsVisible(headers[i])) { + th = Element.create('th'); + th = this._createSingleHeaderFromJson(headers[i], th); + tr.appendChild(th); + this._headers.push(th); + } + } + }, + + _createSingleHeaderFromJson: function (header, th) { + if (header.sortable) { + th.setAttribute('data-sortable','true'); + } + + if (header.label){ + Element.setTextContent(th, header.label); + } + + return th; + }, + + /** + * Reset the sort order as marked on the table headers to "none" + * + * @method _resetSortOrder + * @private + */ + _resetSortOrder: function(){ + /** + * Setting the sortable columns and its event listeners + */ + for (var i = 0, len = this._headers.length; i < len; i++) { + var dataset = Element.data( this._headers[i] ); + if (dataset.sortable && dataset.sortable.toString() === 'true') { + this._sortableFields[i] = 'none'; + } + } + }, + + /** + * This method gets the rows from AJAX and places them as and + * + * @method _createRowsFromJSON + * @param {Object} rows Array of objects with the data to be showed + * @private + */ + _createRowsFromJSON: function( rows ){ + var tbody = Selector.select('tbody',this._rootElement)[0]; + + if( !tbody ){ + tbody = document.createElement('tbody'); + this._rootElement.appendChild( tbody ); + } else { + Element.setHTML(tbody, ''); + } + + this._data = []; + var row; + + for (var trIndex in rows) { + if (rows.hasOwnProperty(trIndex)) { + row = this._options.processJSONRow(rows[trIndex]); + this._createSingleRowFromJson(tbody, row, trIndex); + } + } + + this._originalData = this._data.slice(0); + }, + + _createSingleRowFromJson: function (tbody, row, rowIndex) { + var tr = document.createElement('tr'); + tbody.appendChild( tr ); + for( var field in row ){ + if (row.hasOwnProperty(field)) { + this._createFieldFromJson(tr, row[field], field, rowIndex); + } + } + this._data.push(tr); + }, + + _createFieldFromJson: function (tr, fieldData, fieldName, rowIndex) { + if (!this._fieldIsVisible(fieldName)) { return; } + + var processor = + this._options.processJSONField[fieldName] || // per-field callback + this._options.processJSONField; // generic callback + + var result; + if (typeof processor === 'function') { + result = processor(fieldData, fieldName, rowIndex); + } else { + result = fieldData; + } + var elm = this._elOrFieldData(result); + + var className = this._options.tdClassNames[fieldName]; + if (className) { + Css.addClassName(elm, className); + } + + tr.appendChild(elm); + }, + + _elOrFieldData: function (processed) { + if (Common.isDOMElement(processed)) { + return processed; + } + + var isString = typeof processed === 'string'; + var isNumber = typeof processed === 'number'; + var elm = Element.create('td'); + + if (isString && /^\s*? + * + * + * + * + * + *

          Content

          + *

          Content

          + *

          Content

          + *

          Content

          + *

          Content

          + * + * + * + * + */ + var Tabs = function(selector, options) { + this._element = Common.elOrSelector(selector, 'Ink.UI.Tabs tab container'); + + this._options = Ink.extendObj({ + preventUrlChange: false, + active: undefined, + disabled: [], + onBeforeChange: undefined, + onChange: undefined, + triggerEventsOnLoad: true + }, options || {}, Element.data(this._element)); + + this._handlers = { + tabClicked: Ink.bindEvent(this._onTabClicked,this), + disabledTabClicked: Ink.bindEvent(this._onDisabledTabClicked,this), + resize: Ink.bindEvent(Event.throttle(this._onResize, 100),this) + }; + + this._init(); + }; + + Tabs.prototype = { + + /** + * Init function called by the constructor + * + * @method _init + * @private + */ + _init: function() { + this._menu = Selector.select('.tabs-nav', this._element)[0]; + this._menuTabs = this._menu.children; + this._contentTabs = Selector.select('.tabs-content', this._element); + + //initialization of the tabs, hides all content before setting the active tab + this._initializeDom(); + + // subscribe events + this._observe(); + + //sets the first active tab + this._setFirstActive(); + + this._handlers.resize(); + + Common.registerInstance(this, this._element, 'tabs'); + }, + + /** + * Initialization of the tabs, hides all content before setting the active tab + * + * @method _initializeDom + * @private + */ + _initializeDom: function(){ + for(var i = 0; i < this._contentTabs.length; i++){ + Css.addClassName(this._contentTabs[i], 'hide-all'); + } + }, + + /** + * Subscribe events + * + * @method _observe + * @private + */ + _observe: function() { + InkArray.each(this._menuTabs,Ink.bind(function(elem){ + var link = Selector.select('a', elem)[0]; + if(InkArray.inArray(link.getAttribute('href'), this._options.disabled)){ + this.disable(link); + } else { + this.enable(link); + } + },this)); + + Event.observe(window, 'resize', this._handlers.resize); + }, + + /** + * Run at instantiation, to determine which is the first active tab + * fallsback from window.location.href to options.active to the first not disabled tab + * + * @method _setFirstActive + * @private + */ + _setFirstActive: function() { + var hash = window.location.hash; + + var activeMenuLink = this._findLinkByHref(hash) || + (this._options.active && this._findLinkByHref(this._options.active)) || + Selector.select('a', this._menu)[0]; + + this._changeTab(activeMenuLink, this._options.triggerEventsOnLoad); + }, + + /** + * Changes to the desired tab + * + * @method _changeTab + * @param {DOMElement} link anchor linking to the content container + * @param {boolean} runCallbacks defines if the callbacks should be run or not + * @private + */ + _changeTab: function(link, runCallbacks){ + if(runCallbacks && typeof this._options.onBeforeChange !== 'undefined'){ + this._options.onBeforeChange(this); + } + + var selector = link.getAttribute('href'); + if (this._activeMenuTab) { + Css.removeClassName(this._activeMenuTab, 'active'); + Css.removeClassName(this._activeContentTab, 'active'); + Css.addClassName(this._activeContentTab, 'hide-all'); + } + + this._activeMenuLink = link; + this._activeMenuTab = this._activeMenuLink.parentNode; + this._activeContentTab = Selector.select(selector.substr(selector.indexOf('#')), this._element)[0]; + + if (!this._activeContentTab) { + this._activeMenuLink = this._activeMenuTab = this._activeContentTab = null; + return; + } + + Css.addClassName(this._activeMenuTab, 'active'); + Css.addClassName(this._activeContentTab, 'active'); + Css.removeClassName(this._activeContentTab, 'hide-all'); + + if(runCallbacks && typeof(this._options.onChange) !== 'undefined'){ + this._options.onChange(this); + } + }, + + /** + * Tab clicked handler + * + * @method _onTabClicked + * @param {Event} ev + * @private + */ + _onTabClicked: function(ev) { + Event.stop(ev); + + var target = Event.findElement(ev, 'A'); + if(!target || target.nodeName.toLowerCase() !== 'a') { + return; + } + + var href = target.getAttribute('href').substr(target.getAttribute('href').indexOf('#')); + + if (!href || Ink.i(href.replace(/^#/, '')) === null) { + return; + } + + if (this._options.preventUrlChange.toString() !== 'true') { + window.location.hash = href; + } + + if (target === this._activeMenuLink) { + return; + } + this.changeTab(target); + }, + + /** + * Disabled tab clicked handler + * + * @method _onDisabledTabClicked + * @param {Event} ev + * @private + */ + _onDisabledTabClicked: function(ev) { + Event.stop(ev); + }, + + /** + * Resize handler + * + * @method _onResize + * @private + */ + _onResize: function(){ + var currentLayout = Common.currentLayout(); + if(currentLayout === this._lastLayout){ + return; + } + + if(currentLayout === Common.Layouts.SMALL || currentLayout === Common.Layouts.MEDIUM){ + Css.removeClassName(this._menu, 'menu'); + Css.removeClassName(this._menu, 'horizontal'); + // Css.addClassName(this._menu, 'pills'); + } else { + Css.addClassName(this._menu, 'menu'); + Css.addClassName(this._menu, 'horizontal'); + // Css.removeClassName(this._menu, 'pills'); + } + this._lastLayout = currentLayout; + }, + + /***************** + * Aux Functions * + *****************/ + + /** + * Allows the hash to be passed with or without the cardinal sign + * + * @method _hashify + * @param {String} hash the string to be hashified + * @return {String} Resulting hash + * @private + */ + _hashify: function(hash){ + if(!hash){ + return ""; + } + return hash.indexOf('#') === 0? hash : '#' + hash; + }, + + /** + * Returns the anchor with the desired href + * + * @method _findLinkBuHref + * @param {String} href the href to be found on the returned link + * @return {String|undefined} [description] + * @private + */ + _findLinkByHref: function(href){ + href = this._hashify(href); + + // Find a link which has a href ending with... + return Selector.select('a[href$="' + href + '"]', this._menu)[0]; + }, + + /************** + * PUBLIC API * + **************/ + + /** + * Changes to the desired tag + * + * @method changeTab + * @param {String|DOMElement} selector the id of the desired tab or the link that links to it + * @public + */ + changeTab: function(selector) { + var element = (selector.nodeType === 1)? selector : this._findLinkByHref(this._hashify(selector)); + if(!element || Css.hasClassName(element, 'ink-disabled')){ + return; + } + this._changeTab(element, true); + }, + + /** + * Disables the desired tag + * + * @method disable + * @param {String|DOMElement} selector the id of the desired tab or the link that links to it + * @public + */ + disable: function(selector){ + var element = (selector.nodeType === 1)? selector : this._findLinkByHref(this._hashify(selector)); + if(!element){ + return; + } + Event.stopObserving(element, 'click', this._handlers.tabClicked); + Event.observe(element, 'click', this._handlers.disabledTabClicked); + Css.addClassName(element, 'ink-disabled'); + }, + + /** + * Enables the desired tag + * + * @method enable + * @param {String|DOMElement} selector the id of the desired tab or the link that links to it + * @public + */ + enable: function(selector){ + var element = (selector.nodeType === 1)? selector : this._findLinkByHref(this._hashify(selector)); + if(!element){ + return; + } + Event.stopObserving(element, 'click', this._handlers.disabledTabClicked); + Event.observe(element, 'click', this._handlers.tabClicked); + Css.removeClassName(element, 'ink-disabled'); + }, + + /*********** + * Getters * + ***********/ + + /** + * Returns the active tab id + * + * @method activeTab + * @return {String} ID of the active tab. + * @public + */ + activeTab: function(){ + return this._activeContentTab.getAttribute('id'); + }, + + /** + * Returns the current active Menu LI + * + * @method activeMenuTab + * @return {DOMElement} Active menu LI. + * @public + */ + activeMenuTab: function(){ + return this._activeMenuTab; + }, + + /** + * Returns the current active Menu anchorChanges to the desired tag + * + * @method activeMenuLink + * @return {DOMElement} Active menu link + * @public + */ + activeMenuLink: function(){ + return this._activeMenuLink; + }, + + /** + * Returns the current active Content Tab + * + * @method activeContentTab + * @return {DOMElement} Active Content Tab + * @public + */ + activeContentTab: function(){ + return this._activeContentTab; + }, + + /** + * Unregisters the component and removes its markup from the DOM + * + * @method destroy + * @public + */ + destroy: Common.destroyComponent + }; + + return Tabs; + +}); + +/* + * @module Ink.UI.TagField_1 + * @author inkdev AT sapo.pt + * @version 1 + */ +Ink.createModule("Ink.UI.TagField","1",["Ink.Dom.Element_1", "Ink.Dom.Event_1", "Ink.Dom.Css_1", "Ink.Dom.Browser_1", "Ink.UI.Droppable_1", "Ink.Util.Array_1", "Ink.Dom.Selector_1", "Ink.UI.Common_1"],function( InkElement, InkEvent, Css, Browser, Droppable, InkArray, Selector, Common) { + 'use strict'; + + var enterKey = 13; + var backspaceKey = 8; + var isTruthy = function (val) {return !!val;}; + + /** + * Use this class to have a field where a user can input several tags into a single text field. A good example is allowing the user to describe a blog post or a picture through tags, for later searching. + * + * The markup is as follows: + * + * + * + * By applying this UI class to the above input, you get a tag field with the tags "initial" and "value". The class preserves the original input element. It remains hidden and is updated with new tag information dynamically, so regular HTML form logic still applies. + * + * Below "input" refers to the current value of the input tag (updated as the user enters text, of course), and "output" refers to the value which this class writes back to said input tag. + * + * @class Ink.UI.TagField + * @version 1 + * @constructor + * @param {String|InputElement} element Selector or DOM Input Element. + * @param {Object} [options] + * @param {String|Array} [options.tags] initial tags in the input + * @param {Boolean} [options.allowRepeated=true] allow user to input several tags + * @param {RegExp} [options.separator=/[,;(space)]+/g] Split the input by this RegExp. The default splits by spaces, commas and semicolons + * @param {String} [options.outSeparator=','] Use this string to separate each tag from the next in the output. + * @param {Boolean} [options.autoSplit=true] + * @param {Integer} [options.maxTags=-1] Maximum amount of tags the user can write. + * @example + */ + function TagField(element, options) { + this.init(element, options); + } + + TagField.prototype = { + /** + * Init function called by the constructor + * + * @method _init + * @private + */ + init: function(element, options) { + element = this._element = Common.elOrSelector(element, 'Ink.UI.TagField'); + var o = this._options = Common.options('Ink.UI.TagField', { + tags: ['String', []], + tagQuery: ['Object', null], + tagQueryAsync: ['Object', null], + allowRepeated: ['Boolean', false], + maxTags: ['Integer', -1], + outSeparator: ['String', ','], + separator: ['String', /[,; ]+/g], + autoSplit: ['Boolean', true] + }, options || {}, this._element); + + if (typeof o.separator === 'string') { + o.separator = new RegExp(o.separator, 'g'); + } + + if (typeof o.tags === 'string') { + // coerce to array using the separator + o.tags = this._readInput(o.tags); + } + + Css.addClassName(this._element, 'hide-all'); + + this._viewElm = InkElement.create('div', { + className: 'ink-tagfield', + insertAfter: this._element + }); + + this._input = InkElement.create('input', { + type: 'text', + className: 'new-tag-input', + insertBottom: this._viewElm + }); + + var tags = [].concat(o.tags, this._tagsFromMarkup(this._element)); + + this._tags = []; + + InkArray.each(tags, Ink.bindMethod(this, '_addTag')); + + InkEvent.observe(this._input, 'keyup', Ink.bindEvent(this._onKeyUp, this)); + InkEvent.observe(this._input, 'change', Ink.bindEvent(this._onKeyUp, this)); + InkEvent.observe(this._input, 'keydown', Ink.bindEvent(this._onKeyDown, this)); + InkEvent.observe(this._input, 'blur', Ink.bindEvent(this._onBlur, this)); + InkEvent.observe(this._viewElm, 'click', Ink.bindEvent(this._refocus, this)); + }, + + destroy: function () { + InkElement.remove(this._viewElm); + Css.removeClassName(this._element, 'hide-all'); + }, + + _tagsFromMarkup: function (element) { + var tagname = element.tagName.toLowerCase(); + if (tagname === 'input') { + return this._readInput(element.value); + } else if (tagname === 'select') { + return InkArray.map(element.getElementsByTagName('option'), function (option) { + return InkElement.textContent(option); + }); + } else { + throw new Error('Cannot read tags from a ' + tagname + ' tag. Unknown tag'); + } + }, + + _tagsToMarkup: function (tags, element) { + var tagname = element.tagName.toLowerCase(); + if (tagname === 'input') { + if (this._options.separator) { + element.value = tags.join(this._options.outSeparator); + } + } else if (tagname === 'select') { + element.innerHTML = ''; + InkArray.each(tags, function (tag) { + var opt = InkElement.create('option', {selected: 'selected'}); + InkElement.setTextContent(opt, tag); + element.appendChild(opt); + }); + } else { + throw new Error('TagField: Cannot read tags from a ' + tagname + ' tag. Unknown tag'); + } + }, + + _addTag: function (tag) { + if (this._options.maxTags !== -1 && + this._tags.length >= this._options.maxTags) { + return; + } + if ((!this._options.allowRepeated && + InkArray.inArray(tag, this._tags, tag)) || !tag) { + return false; + } + var elm = InkElement.create('span', { + className: 'ink-tag', + setTextContent: tag + ' ' + }); + + var remove = InkElement.create('span', { + className: 'remove icon icon-remove icon-times', // fontawesome 3 changed icon-remove's name to icon-times + insertBottom: elm + }); + InkEvent.observe(remove, 'click', Ink.bindEvent(this._removeTag, this, null)); + + var spc = document.createTextNode(' '); + + this._tags.push(tag); + this._viewElm.insertBefore(elm, this._input); + this._viewElm.insertBefore(spc, this._input); + this._tagsToMarkup(this._tags, this._element); + }, + + _readInput: function (text) { + if (this._options.separator) { + return InkArray.filter(text.split(this._options.separator), isTruthy); + } else { + return [text]; + } + }, + + _onKeyUp: function () { // TODO control input box size + if (!this._options.autoSplit) { + return; + } + var split = this._input.value.split(this._options.separator); + if (split.length <= 1) { + return; + } + var last = split[split.length - 1]; + split = split.splice(0, split.length - 1); + split = InkArray.filter(split, isTruthy); + + InkArray.each(split, Ink.bind(this._addTag, this)); + this._input.value = last; + }, + + _onKeyDown: function (event) { + if (event.which === enterKey) { + return this._onEnterKeyDown(event); + } else if (event.which === backspaceKey) { + return this._onBackspaceKeyDown(); + } else if (this._removeConfirm) { + // user pressed another key, cancel removal from a backspace key + this._unsetRemovingVisual(this._tags.length - 1); + } + }, + + /** + * When the user presses backspace twice on the empty input, we delete the last tag on the field. + * @method onBackspaceKeyDown + * @private + */ + _onBackspaceKeyDown: function () { + if (this._input.value) { return; } + + if (this._removeConfirm) { + this._unsetRemovingVisual(this._tags.length - 1); + this._removeTag(this._tags.length - 1); + this._removeConfirm = null; + } else { + this._setRemovingVisual(this._tags.length - 1); + } + }, + + _onEnterKeyDown: function (event) { + var tag = this._input.value; + if (tag) { + this._addTag(tag); + this._input.value = ''; + } + InkEvent.stopDefault(event); + }, + + _onBlur: function () { + this._addTag(this._input.value); + this._input.value = ''; + }, + + /* For when the user presses backspace. + * Set the style of the tag so that it seems like it's going to be removed + * if they press backspace again. */ + _setRemovingVisual: function (tagIndex) { + var elm = this._viewElm.children[tagIndex]; + Css.addClassName(elm, 'tag-deleting'); + + this._removeRemovingVisualTimeout = setTimeout(Ink.bindMethod(this, '_unsetRemovingVisual', tagIndex), 4000); + InkEvent.observe(this._input, 'blur', Ink.bindMethod(this, '_unsetRemovingVisual', tagIndex)); + this._removeConfirm = true; + }, + _unsetRemovingVisual: function (tagIndex) { + var elm = this._viewElm.children[tagIndex]; + if (elm) { + Css.removeClassName(elm, 'tag-deleting'); + clearTimeout(this._removeRemovingVisualTimeout); + } + this._removeConfirm = null; + }, + + _removeTag: function (event) { + var index; + if (typeof event === 'object') { // click event on close button + var elm = InkEvent.element(event).parentNode; + index = InkElement.parentIndexOf(this._viewElm, elm); + } else if (typeof event === 'number') { // manual removal + index = event; + } + this._tags = InkArray.remove(this._tags, index, 1); + InkElement.remove(this._viewElm.children[index]); + this._tagsToMarkup(this._tags, this._element); + }, + + _refocus: function (event) { + this._input.focus(); + InkEvent.stop(event); + return false; + } + }; + return TagField; +}); + +/** + * @module Ink.UI.Toggle_1 + * @author inkdev AT sapo.pt + * @version 1 + */ +Ink.createModule('Ink.UI.Toggle', '1', ['Ink.UI.Common_1','Ink.Dom.Event_1','Ink.Dom.Css_1','Ink.Dom.Element_1','Ink.Dom.Selector_1','Ink.Util.Array_1'], function(Common, InkEvent, Css, InkElement, Selector, InkArray ) { + 'use strict'; + + /** + * Toggle component + * + * @class Ink.UI.Toggle + * @constructor + * @version 1 + * @param {String|DOMElement} selector + * @param {Object} [options] Options + * @param {String} options.target CSS Selector that specifies the elements that this component will toggle + * @param {String} [options.classNameOn='show-all'] className when toggle is On + * @param {String} [options.classNameOff='hide-all'] className when toggle is Off. + * @param {String} [options.triggerEvent='click'] Event that will trigger the toggling. + * @param {Boolean} [options.closeOnClick=true] When this is on, if the user clicks outside of the toggled content, the target is toggled off. + * @param {Selector} [options.closeOnInsideClick='a[href]'] Toggle off when an element matching this selector is clicked. Set to null to deactivate the check. Default: 'a[href]' (finds links) + * @param {Boolean} [options.initialState=null] Whether to start toggled off, on, or as found in the markup. (false: off, true: on, null: markup) + * @param {Function} [options.onChangeState=null] Callback to be called when the toggle state changes. Return `false` to cancel the event. + * + * @example + *
          + * + * + *
          + * + */ + var Toggle = function( selector, options ){ + this._rootElement = Common.elOrSelector(selector, '[Ink.UI.Toggle root element]:'); + + this._options = Ink.extendObj({ + target : undefined, + triggerEvent: 'click', + closeOnClick: true, + isAccordion: false, + initialState: null, + classNameOn: 'show-all', + classNameOff: 'hide-all', + togglesDisplay: null, + closeOnInsideClick: 'a[href]', // closes the toggle when a target is clicked and it is a link + onChangeState: null + }, options || {}, InkElement.data(this._rootElement)); + + this._targets = Common.elsOrSelector(this._options.target, 'Ink.UI.Toggle target option'); + + // Boolean option handling + this._options.closeOnClick = this._options.closeOnClick.toString() === 'true'; + // Actually a throolean + if (this._options.initialState !== null){ + this._options.initialState = this._options.initialState.toString() === 'true'; + } else { + this._options.initialState = Css.getStyle(this._targets[0], 'display') !== 'none'; + } + + if (this._options.classNameOn !== 'show-all' || this._options.classNameOff !== 'hide-all') { + for (var i = 0, len = this._targets.length; i < len; i++) { + Css.removeClassName(this._targets[i], 'show-all'); + Css.removeClassName(this._targets[i], 'hide-all'); + } + } + + this._init(); + }; + + Toggle.prototype = { + + /** + * Init function called by the constructor + * + * @method _init + * @private + */ + _init: function(){ + this._accordion = ( Css.hasClassName(this._rootElement.parentNode,'accordion') || Css.hasClassName(this._targets[0].parentNode,'accordion') ); + + this._firstTime = true; + + this._bindEvents(); + + if (this._options.initialState !== null) { + this.setState(this._options.initialState, true); + } else { + // Add initial classes matching the current "display" of the object. + var state = Css.getStyle(this._targets[0], 'display') !== 'none'; + this.setState(state, true); + } + // Aditionally, remove any inline "display" style. + for (var i = 0, len = this._targets.length; i < len; i++) { + if (this._targets[i].style.display) { + this._targets[i].style.display = ''; // becomes default + } + } + }, + + /** + * @method _bindEvents + * @private + */ + _bindEvents: function () { + if ( this._options.triggerEvent ) { + InkEvent.observe( + this._rootElement, + this._options.triggerEvent, + Ink.bind(this._onTriggerEvent, this)); + } + if( this._options.closeOnClick ){ + InkEvent.observe( document, 'click', Ink.bind(this._onOutsideClick, this)); + } + if( this._options.closeOnInsideClick ) { + var sel = this._options.closeOnInsideClick; + if (sel.toString() === 'true') { + sel = '*'; + } + InkEvent.observeMulti(this._targets, 'click', Ink.bind(function (e) { + if ( InkElement.findUpwardsBySelector(InkEvent.element(e), sel) ) { + this.setState(false, true); + } + }, this)); + } + }, + + /** + * Event handler. It's responsible for handling the `triggerEvent` as defined in the options. + * + * This will trigger the toggle. + * + * @method _onTriggerEvent + * @param {Event} event + * @private + */ + _onTriggerEvent: function( event ){ + // When the togglee is a child of the toggler, we get the togglee's events here. We have to check that this event is for us. + var target = InkEvent.element(event); + + var isAncestorOfClickedElement = InkArray.some(this._targets, function (thisOne) { + return thisOne === target || InkElement.isAncestorOf(thisOne, target); + }); + + if (isAncestorOfClickedElement) { + return; + } + + if (this._accordion) { + this._updateAccordion(); + } + + var has = this.getState(); + this.setState(!has, true); + if (!has && this._firstTime) { + this._firstTime = false; + } + + InkEvent.stopDefault(event); + }, + + /** + * Be compatible with accordions + * + * @method _updateAccordion + **/ + _updateAccordion: function () { + var elms, accordionElement; + if( Css.hasClassName(this._targets[0].parentNode,'accordion') ){ + accordionElement = this._targets[0].parentNode; + } else { + accordionElement = this._targets[0].parentNode.parentNode; + } + elms = Selector.select('.toggle, .ink-toggle',accordionElement); + for(var i=0; i 0) && (targetElm[0] !== this._targets[0]) ){ + targetElm[0].style.display = 'none'; + } + } + }, + + /** + * Click handler. Will handle clicks outside the toggle component. + * + * @method _onOutsideClick + * @param {Event} event + * @private + */ + _onOutsideClick: function( event ){ + var tgtEl = InkEvent.element(event), + shades; + + var ancestorOfTargets = InkArray.some(this._targets, function (target) { + return InkElement.isAncestorOf(target, tgtEl) || target === tgtEl; + }); + + if( (this._rootElement === tgtEl) || InkElement.isAncestorOf(this._rootElement, tgtEl) || ancestorOfTargets /*|| this._firstTime (I forgot what this last check was for) */) { + return; + } else if( (shades = Ink.ss('.ink-shade')).length ) { + var shadesLength = shades.length; + + for( var i = 0; i < shadesLength; i++ ){ + if( InkElement.isAncestorOf(shades[i],tgtEl) && InkElement.isAncestorOf(shades[i],this._rootElement) ){ + return; + } + } + } + + this.setState(false, true); // dismiss + }, + + /** + * Sets the state of the toggle. (on/off) + * + * @param on {Boolean} New state (on/off) + * + * @method setState + */ + setState: function (on, callHandler) { + if (on === this.getState()) { return; } + if (callHandler && typeof this._options.onChangeState === 'function') { + var ret = this._options.onChangeState(on); + if (ret === false) { return false; } // Canceled by the event handler + } + for (var i = 0, len = this._targets.length; i < len; i++) { + Css.addRemoveClassName(this._targets[i], this._options.classNameOn, on); + Css.addRemoveClassName(this._targets[i], this._options.classNameOff, !on); + } + Css.addRemoveClassName(this._rootElement, 'active', on); + }, + + /** + * Gets the state of the toggle. (on/off) + * + * @method getState + * + * @return {Boolean} whether the toggle is toggled on. + */ + getState: function () { + return Css.hasClassName(this._rootElement, 'active'); + } + }; + + return Toggle; +}); + + +/** + * @module Ink.UI.Tooltip_1 + * @author inkdev AT sapo.pt + */ +Ink.createModule('Ink.UI.Tooltip', '1', ['Ink.UI.Common_1', 'Ink.Dom.Event_1', 'Ink.Dom.Element_1', 'Ink.Dom.Selector_1', 'Ink.Util.Array_1', 'Ink.Dom.Css_1', 'Ink.Dom.Browser_1'], function (Common, InkEvent, InkElement, Selector, InkArray, Css) { + 'use strict'; + + /** + * @class Ink.UI.Tooltip + * @constructor + * + * @param {DOMElement|String} target Target element or selector of elements, to display the tooltips on. + * @param {Object} [options] + * @param [options.text=''] Text content for the tooltip. + * @param [options.html=''] HTML for the tooltip. Same as above, but won't escape HTML. + * @param [options.where='up'] Positioning for the tooltip. Options: + * @param options.where.up/down/left/right Place above, below, to the left of, or to the right of, the target. Show an arrow. + * @param options.where.mousemove Place the tooltip to the bottom and to the right of the mouse when it hovers the element, and follow the mouse as it moves. + * @param options.where.mousefix Place the tooltip to the bottom and to the right of the mouse when it hovers the element, keep the tooltip there motionless. + * + * @param [options.color=''] Color of the tooltip. Options are red, orange, blue, green and black. Default is white. + * @param [options.fade=0.3] Fade time; Duration of the fade in/out effect. + * @param [options.forever=0] Set to 1/true to prevent the tooltip from being erased when the mouse hovers away from the target + * @param [options.timeout=0] Time for the tooltip to live. Useful together with [options.forever]. + * @param [options.delay] Time the tooltip waits until it is displayed. Useful to avoid getting the attention of the user unnecessarily + * @param [options.template=null] Element or selector containing HTML to be cloned into the tooltips. Can be a hidden element, because CSS `display` is set to `block`. + * @param [options.templatefield=null] Selector within the template element to choose where the text is inserted into the tooltip. Useful when a wrapper DIV is required. + * + * @param [options.left,top=10] (Nitty-gritty) Spacing from the target to the tooltip, when `where` is `mousemove` or `mousefix` + * @param [options.spacing=8] (Nitty-gritty) Spacing between the tooltip and the target element, when `where` is `up`, `down`, `left`, or `right` + * + * @example + *
            + *
          • New
          • + *
          • Quit
          • + *
          • Save
          • + *
          + * + * [...] + * + * + */ + function Tooltip(element, options) { + this._init(element, options || {}); + } + + function EachTooltip(root, elm) { + this._init(root, elm); + } + + var transitionDurationName, + transitionPropertyName, + transitionTimingFunctionName; + (function () { // Feature detection + var test = document.createElement('DIV'); + var names = ['transition', 'oTransition', 'msTransition', 'mozTransition', + 'webkitTransition']; + for (var i = 0; i < names.length; i++) { + if (typeof test.style[names[i] + 'Duration'] !== 'undefined') { + transitionDurationName = names[i] + 'Duration'; + transitionPropertyName = names[i] + 'Property'; + transitionTimingFunctionName = names[i] + 'TimingFunction'; + break; + } + } + }()); + + // Body or documentElement + var bodies = document.getElementsByTagName('body'); + var body = bodies.length ? bodies[0] : document.documentElement; + + Tooltip.prototype = { + _init: function(element, options) { + var elements; + + this.options = Ink.extendObj({ + where: 'up', + zIndex: 10000, + left: 10, + top: 10, + spacing: 8, + forever: 0, + color: '', + timeout: 0, + delay: 0, + template: null, + templatefield: null, + fade: 0.3, + text: '' + }, options || {}); + + if (typeof element === 'string') { + elements = Selector.select(element); + } else if (typeof element === 'object') { + elements = [element]; + } else { + throw 'Element expected'; + } + + this.tooltips = []; + + for (var i = 0, len = elements.length; i < len; i++) { + this.tooltips[i] = new EachTooltip(this, elements[i]); + } + }, + /** + * Destroys the tooltips created by this instance + * + * @method destroy + */ + destroy: function () { + InkArray.each(this.tooltips, function (tooltip) { + tooltip._destroy(); + }); + this.tooltips = null; + this.options = null; + } + }; + + EachTooltip.prototype = { + _oppositeDirections: { + left: 'right', + right: 'left', + up: 'down', + down: 'up' + }, + _init: function(root, elm) { + InkEvent.observe(elm, 'mouseover', Ink.bindEvent(this._onMouseOver, this)); + InkEvent.observe(elm, 'mouseout', Ink.bindEvent(this._onMouseOut, this)); + InkEvent.observe(elm, 'mousemove', Ink.bindEvent(this._onMouseMove, this)); + + this.root = root; + this.element = elm; + this._delayTimeout = null; + this.tooltip = null; + }, + _makeTooltip: function (mousePosition) { + if (!this._getOpt('text') && + !this._getOpt('html') && + !InkElement.hasAttribute(this.element, 'title')) { + return false; + } + + var tooltip = this._createTooltipElement(); + + if (this.tooltip) { + this._removeTooltip(); + } + + this.tooltip = tooltip; + + this._fadeInTooltipElement(tooltip); + this._placeTooltipElement(tooltip, mousePosition); + + InkEvent.observe(tooltip, 'mouseover', Ink.bindEvent(this._onTooltipMouseOver, this)); + + var timeout = this._getFloatOpt('timeout'); + if (timeout) { + setTimeout(Ink.bind(function () { + if (this.tooltip === tooltip) { + this._removeTooltip(); + } + }, this), timeout * 1000); + } + }, + _createTooltipElement: function () { + var template = this._getOpt('template'), // User template instead of our HTML + templatefield = this._getOpt('templatefield'), + + tooltip, // The element we float + field; // Element where we write our message. Child or same as the above + + if (template) { // The user told us of a template to use. We copy it. + var temp = document.createElement('DIV'); + temp.innerHTML = Common.elOrSelector(template, 'options.template').outerHTML; + tooltip = temp.firstChild; + + if (templatefield) { + field = Selector.select(templatefield, tooltip); + if (field) { + field = field[0]; + } else { + throw 'options.templatefield must be a valid selector within options.template'; + } + } else { + field = tooltip; // Assume same element if user did not specify a field + } + } else { // We create the default structure + tooltip = document.createElement('DIV'); + Css.addClassName(tooltip, 'ink-tooltip'); + Css.addClassName(tooltip, this._getOpt('color')); + + field = document.createElement('DIV'); + Css.addClassName(field, 'content'); + + tooltip.appendChild(field); + } + + if (this._getOpt('html')) { + field.innerHTML = this._getOpt('html'); + } else if (this._getOpt('text')) { + InkElement.setTextContent(field, this._getOpt('text')); + } else { + InkElement.setTextContent(field, this.element.getAttribute('title')); + } + tooltip.style.display = 'block'; + tooltip.style.position = 'absolute'; + tooltip.style.zIndex = this._getIntOpt('zIndex'); + + return tooltip; + }, + _fadeInTooltipElement: function (tooltip) { + var fadeTime = this._getFloatOpt('fade'); + if (transitionDurationName && fadeTime) { + tooltip.style.opacity = '0'; + tooltip.style[transitionDurationName] = fadeTime + 's'; + tooltip.style[transitionPropertyName] = 'opacity'; + tooltip.style[transitionTimingFunctionName] = 'ease-in-out'; + setTimeout(function () { + tooltip.style.opacity = '1'; + }, 0); // Wait a tick + } + }, + _placeTooltipElement: function (tooltip, mousePosition) { + var where = this._getOpt('where'); + + if (where === 'mousemove' || where === 'mousefix') { + var mPos = mousePosition; + this._setPos(mPos[0], mPos[1]); + body.appendChild(tooltip); + } else if (where.match(/(up|down|left|right)/)) { + body.appendChild(tooltip); + var targetElementPos = InkElement.offset(this.element); + var tleft = targetElementPos[0], + ttop = targetElementPos[1]; + + var centerh = (InkElement.elementWidth(this.element) / 2) - (InkElement.elementWidth(tooltip) / 2), + centerv = (InkElement.elementHeight(this.element) / 2) - (InkElement.elementHeight(tooltip) / 2); + var spacing = this._getIntOpt('spacing'); + + var tooltipDims = InkElement.elementDimensions(tooltip); + var elementDims = InkElement.elementDimensions(this.element); + + var maxX = InkElement.scrollWidth() + InkElement.viewportWidth(); + var maxY = InkElement.scrollHeight() + InkElement.viewportHeight(); + + where = this._getWhereValueInsideViewport(where, { + left: tleft - tooltipDims[0], + right: tleft + tooltipDims[0], + top: ttop + tooltipDims[1], + bottom: ttop + tooltipDims[1] + }, { + right: maxX, + bottom: maxY + }); + + if (where === 'up') { + ttop -= tooltipDims[1]; + ttop -= spacing; + tleft += centerh; + } else if (where === 'down') { + ttop += elementDims[1]; + ttop += spacing; + tleft += centerh; + } else if (where === 'left') { + tleft -= tooltipDims[0]; + tleft -= spacing; + ttop += centerv; + } else if (where === 'right') { + tleft += elementDims[0]; + tleft += spacing; + ttop += centerv; + } + + var arrow = null; + if (where.match(/(up|down|left|right)/)) { + arrow = document.createElement('SPAN'); + Css.addClassName(arrow, 'arrow'); + Css.addClassName(arrow, this._oppositeDirections[where]); + tooltip.appendChild(arrow); + } + + var tooltipLeft = tleft; + var tooltipTop = ttop; + + var toBottom = (tooltipTop + tooltipDims[1]) - maxY; + var toRight = (tooltipLeft + tooltipDims[0]) - maxX; + var toLeft = 0 - tooltipLeft; + var toTop = 0 - tooltipTop; + + if (toBottom > 0) { + if (arrow) { arrow.style.top = (tooltipDims[1] / 2) + toBottom + 'px'; } + tooltipTop -= toBottom; + } else if (toTop > 0) { + if (arrow) { arrow.style.top = (tooltipDims[1] / 2) - toTop + 'px'; } + tooltipTop += toTop; + } else if (toRight > 0) { + if (arrow) { arrow.style.left = (tooltipDims[0] / 2) + toRight + 'px'; } + tooltipLeft -= toRight; + } else if (toLeft > 0) { + if (arrow) { arrow.style.left = (tooltipDims[0] / 2) - toLeft + 'px'; } + tooltipLeft += toLeft; + } + + tooltip.style.left = tooltipLeft + 'px'; + tooltip.style.top = tooltipTop + 'px'; + } + }, + + /** + * Get a value for "where" (left/right/up/down) which doesn't put the + * tooltip off the screen + * + * @method _getWhereValueInsideViewport + * @param where {String} "where" value which was given by the user and we might change + * @param bbox {BoundingBox} A bounding box like what you get from getBoundingClientRect ({top, bottom, left, right}) with pixel positions from the top left corner of the viewport. + * @param viewport {BoundingBox} Bounding box for the viewport. "top" and "left" are omitted because these coordinates are relative to the top-left corner of the viewport so they are zero. + * + * @note: we can't use getBoundingClientRect in this case because it returns {0,0,0,0} on our uncreated tooltip. + */ + _getWhereValueInsideViewport: function (where, bbox, viewport) { + if (where === 'left' && bbox.left < 0) { + return 'right'; + } else if (where === 'right' && bbox.right > viewport.right) { + return 'left'; + } else if (where === 'up' && bbox.top < 0) { + return 'down'; + } else if (where === 'down' && bbox.bottom > viewport.bottom) { + return 'up'; + } + + return where; + }, + _removeTooltip: function() { + var tooltip = this.tooltip; + if (!tooltip) {return;} + + var remove = Ink.bind(InkElement.remove, {}, tooltip); + + if (this._getOpt('where') !== 'mousemove' && transitionDurationName) { + tooltip.style.opacity = 0; + // remove() will operate on correct tooltip, although this.tooltip === null then + setTimeout(remove, this._getFloatOpt('fade') * 1000); + } else { + remove(); + } + this.tooltip = null; + }, + _getOpt: function (option) { + var dataAttrVal = InkElement.data(this.element)[InkElement._camelCase('tip-' + option)]; + if (dataAttrVal /* either null or "" may signify the absense of this attribute*/) { + return dataAttrVal; + } + var instanceOption = this.root.options[option]; + if (typeof instanceOption !== 'undefined') { + return instanceOption; + } + }, + _getIntOpt: function (option) { + return parseInt(this._getOpt(option), 10); + }, + _getFloatOpt: function (option) { + return parseFloat(this._getOpt(option), 10); + }, + _destroy: function () { + if (this.tooltip) { + InkElement.remove(this.tooltip); + } + this.root = null; // Cyclic reference = memory leaks + this.element = null; + this.tooltip = null; + }, + _onMouseOver: function(e) { + // on IE < 10 you can't access the mouse event not even a tick after it fired + var mousePosition = this._getMousePosition(e); + var delay = this._getFloatOpt('delay'); + if (delay) { + this._delayTimeout = setTimeout(Ink.bind(function () { + if (!this.tooltip) { + this._makeTooltip(mousePosition); + } + this._delayTimeout = null; + }, this), delay * 1000); + } else { + this._makeTooltip(mousePosition); + } + }, + _onMouseMove: function(e) { + if (this._getOpt('where') === 'mousemove' && this.tooltip) { + var mPos = this._getMousePosition(e); + this._setPos(mPos[0], mPos[1]); + } + }, + _onMouseOut: function () { + if (!this._getIntOpt('forever')) { + this._removeTooltip(); + } + if (this._delayTimeout) { + clearTimeout(this._delayTimeout); + this._delayTimeout = null; + } + }, + _onTooltipMouseOver: function () { + if (this.tooltip) { // If tooltip is already being removed, this has no effect + this._removeTooltip(); + } + }, + _setPos: function(left, top) { + left += this._getIntOpt('left'); + top += this._getIntOpt('top'); + var pageDims = this._getPageXY(); + if (this.tooltip) { + var elmDims = [InkElement.elementWidth(this.tooltip), InkElement.elementHeight(this.tooltip)]; + var scrollDim = this._getScroll(); + + if((elmDims[0] + left - scrollDim[0]) >= (pageDims[0] - 20)) { + left = (left - elmDims[0] - this._getIntOpt('left') - 10); + } + if((elmDims[1] + top - scrollDim[1]) >= (pageDims[1] - 20)) { + top = (top - elmDims[1] - this._getIntOpt('top') - 10); + } + + this.tooltip.style.left = left + 'px'; + this.tooltip.style.top = top + 'px'; + } + }, + _getPageXY: function() { + var cWidth = 0; + var cHeight = 0; + if( typeof( window.innerWidth ) === 'number' ) { + cWidth = window.innerWidth; + cHeight = window.innerHeight; + } else if( document.documentElement && ( document.documentElement.clientWidth || document.documentElement.clientHeight ) ) { + cWidth = document.documentElement.clientWidth; + cHeight = document.documentElement.clientHeight; + } else if( document.body && ( document.body.clientWidth || document.body.clientHeight ) ) { + cWidth = document.body.clientWidth; + cHeight = document.body.clientHeight; + } + return [parseInt(cWidth, 10), parseInt(cHeight, 10)]; + }, + _getScroll: function() { + var dd = document.documentElement, db = document.body; + if (dd && (dd.scrollLeft || dd.scrollTop)) { + return [dd.scrollLeft, dd.scrollTop]; + } else if (db) { + return [db.scrollLeft, db.scrollTop]; + } else { + return [0, 0]; + } + }, + _getMousePosition: function(e) { + return [parseInt(InkEvent.pointerX(e), 10), parseInt(InkEvent.pointerY(e), 10)]; + } + }; + + return Tooltip; +}); + +/** + * @module Ink.UI.TreeView_1 + * @author inkdev AT sapo.pt + * @version 1 + */ +Ink.createModule('Ink.UI.TreeView', '1', ['Ink.UI.Common_1','Ink.Dom.Event_1','Ink.Dom.Css_1','Ink.Dom.Element_1','Ink.Dom.Selector_1','Ink.Util.Array_1'], function(Common, Event, Css, Element, Selector, InkArray ) { + 'use strict'; + + /** + * Shows elements in a tree-like hierarchical structure. + * + * @class Ink.UI.TreeView + * @constructor + * @version 1 + * @param {String|DOMElement} selector + * @param {String} [options.node='li'] Selector to define which elements are seen as nodes. + * @param {String} [options.children='ul'] Selector to define which elements are represented as children. + * @param {String} [options.parentClass='parent'] Classes to be added to the parent node. + * @param {String} [options.openClass='icon icon-minus-circle'] Classes to be added to the icon when a parent is open. + * @param {String} [options.closedClass='icon icon-plus-circle'] Classes to be added to the icon when a parent is closed. + * @param {String} [options.hideClass='hide-all'] Class to toggle visibility of the children. + * @param {String} [options.iconTag='i'] The name of icon tag. The component tries to find a tag with that name as a direct child of the node. If it doesn't find it, it creates it. + * @param {Boolean} [options.stopDefault=true] Stops the default behavior of the click handler. + * @example + * + * + */ + var TreeView = function(selector, options){ + this._element = Common.elOrSelector(selector, '[Ink.UI.TreeView_1]'); + + this._options = Common.options('Treeview', { + 'node': ['String', 'li'], + // [3.0.1] Deprecate this terrible, terrible name + 'child': ['String','ul'], + 'children': ['String','ul'], + 'parentClass': ['String','parent'], + // [3.0.0] use these classes because you'll have font-awesome 4 + // 'openClass': ['String','fa fa-minus-circle'], + // 'closedClass': ['String','fa fa-plus-circle'], + 'openNodeClass': ['String', 'open'], + 'openClass': ['String','icon-minus-sign'], + 'closedClass': ['String','icon-plus-sign'], + 'hideClass': ['String','hide-all'], + 'iconTag': ['String', 'i'], + 'stopDefault' : ['Boolean', true] + }, options || {}, this._element); + + if (this._options.child) { + Ink.warn('Ink.UI.TreeView: options.child is being renamed to options.children.'); + this._options.children = this._options.child; + } + + this._init(); + }; + + TreeView.prototype = { + + /** + * Init function called by the constructor. Sets the necessary event handlers. + * + * @method _init + * @private + */ + _init: function(){ + this._handlers = { + click: Ink.bindEvent(this._onClick,this) + }; + + Event.on(this._element, 'click', this._options.node, this._handlers.click); + + InkArray.each(Ink.ss(this._options.node, this._element), Ink.bind(function(item){ + if( this.isParent(item) ) { + Css.addClassName(item, this._options.parentClass); + + var isOpen = this.isOpen(item); + if( !this._getIcon(item) ){ + Element.create(this._options.iconTag, { insertTop: item }); + } + + this._setNodeOpen(item, isOpen); + } + },this)); + }, + + _getIcon: function (node) { + return Ink.s('> ' + this._options.iconTag, node); + }, + + isOpen: function (node) { + if (!this._getChild(node)) { + throw new Error('not a node!'); + } + + return Element.data(node).open === 'true' || + Css.hasClassName(node, this._options.openNodeClass); + }, + + isParent: function (node) { + return Css.hasClassName(node, this._options.parentClass) || + this._getChild(node) != null; + }, + + _setNodeOpen: function (node, beOpen) { + var child = this._getChild(node); + if (child) { + Css.setClassName(child, this._options.hideClass, !beOpen); + var icon = this._getIcon(node); + + node.setAttribute('data-open', beOpen); + + Css.setClassName(icon, this._options.openClass, beOpen); + Css.setClassName(icon, this._options.closedClass, !beOpen); + Css.setClassName(node, this._options.openNodeClass, beOpen); + } else { + Ink.error('Ink.UI.TreeView: node', node, 'is not a node!'); + } + }, + + open: function (node) { + this._setNodeOpen(node, true); + }, + + close: function (node) { + this._setNodeOpen(node, false); + }, + + toggle: function (node) { + if (this.isOpen(node)) { + this.close(node); + } else { + this.open(node); + } + }, + + _getChild: function (node) { + return Selector.select(this._options.child, node)[0] || null; + }, + + /** + * Handles the click event (as specified in the _init function). + * + * @method _onClick + * @param {Event} event + * @private + */ + _onClick: function(ev){ + /** + * Summary: + * If the clicked element is a "node" as defined in the options, will check if it has any "child". + * If so, will toggle its state and stop the event's default behavior if the stopDefault option is true. + **/ + + if (!this.isParent(ev.currentTarget) || + Selector.matchesSelector(ev.target, this._options.node) || + Selector.matchesSelector(ev.target, this._options.child)) { + return; + } + + if (this._options.stopDefault){ + ev.preventDefault(); + } + + this.toggle(ev.currentTarget); + } + }; + + return TreeView; +}); + +Ink.createModule('Ink.UI.Upload', '1', [ + 'Ink.Dom.Event_1', + 'Ink.Dom.Element_1', + 'Ink.Dom.Browser_1', + 'Ink.UI.Common_1' +], function(Event, Element, Browser, Common) { + 'use strict'; + + var DirectoryReader = function(options) { + this.init(options); + }; + + DirectoryReader.prototype = { + init: function(options) { + this.options = Ink.extendObj({ + entry: undefined, + maxDepth: 10 + }, options || {}); + + try { + this._read(); + } catch(e) { + Ink.error(e); + } + }, + + + _read: function() { + if(!this.options.entry) { + throw("The entry specify you must"); + } + + try { + this._readDirectories(); + } catch(e) { + Ink.error(e); + } + }, + + + _readDirectories: function() { + var entries = [], + running = false, + maxDepth = 0; + + /* TODO return as tree because much better well */ + var _readEntries = Ink.bind(function(currentEntry) { + var dir = currentEntry.createReader(); + running = true; + + dir.readEntries(Ink.bind(function(res) { + if(res.length > 0) { + for(var i = 0, len = res.length; i=0; i--) { + if(typeof(arr[i]) === 'undefined' || arr[i] === null || arr[i] === '') { + arr.splice(i, 1); + } + } + return arr; + } + }; + + var Queue = { + lists: [], + items: [], + + + /** + * @function {Public} ? Create new queue list + * @param {String} list name + * @param {Function} function to iterate on items + * @return {Object} list id + */ + create: function(name) { + var id; + name = String(name); + this.lists.push({name: name}); + id = this.lists.length - 1; + return id; + }, + + + getItems: function(parentId) { + if(!parentId) { + return this.items; + } + var items = []; + for(var i = 0, len = this.items.length; i=0; i--) { + if(this.items[i] && id === this.items[i].parentId) { + this.remove(this.items[i].parentId, this.items[i].pid); + } + } + if(!keepList) { + this.lists.splice(id, 1); + } + return true; + } catch(e) { + Ink.error('Purge: invalid id'); + return false; + } + }, + + + /** + * @function {Public} ? add an item to a list + * @param {String} name + * @param {Object} item + * @return {Number} pid + */ + add: function(parentId, item, priority) { + if(!this.lists[parentId]) { + return false; + } + if(typeof(item) !== 'object') { + item = String(item); + } + + var pid = parseInt(Math.round(Math.random() * 100000) + "" + Math.round(Math.random() * 100000), 10); + priority = priority || 0; + + this.items.push({parentId: parentId, item: item, priority: priority || 0, pid: pid}); + return pid; + }, + + + /** + * @function {Public} ? view list + * @param {Number} list id + * @param {Number} process id + * @return {Object} item + */ + view: function(parentId, pid) { + var id = this._searchByPid(parentId, pid); + if(id === false) { + return false; + } + return this.items[id]; + }, + + + /** + * @function {Public} ? remove an item + * @param {Object} item + * @return {Object|Boolean} removed item or false if not found + */ + remove: function(parentId, pid) { + try { + var id = this._searchByPid(parentId, pid); + if(id === false) { + return false; + } + this.items.splice(id, 1); + return true; + } catch(e) { + Ink.error('Remove: invalid id'); + return false; + } + }, + + _searchByPid: function(parentId, pid) { + if(!parentId && typeof(parentId) === 'boolean' || !pid) { + return false; + } + + parentId = parseInt(parentId, 10); + pid = parseInt(pid, 10); + + if(isNaN(parentId) || isNaN(pid)) { + return false; + } + + for(var i = 0, len = this.items.length; i this.options.minSizeToUseChunks; + }, + + + _dropEventHandler: function(ev) { + if(ev && ev.stopPropagation) { + ev.stopPropagation(); + } + if(ev && ev.preventDefault) { + ev.preventDefault(); + } + if(ev) { + ev.returnValue = false; + } + + this.publish('DropComplete', ev.dataTransfer); + + var data = ev.dataTransfer; + + if(!data || !data.files || !data.files.length) { + return false; + } + + this._files = data.files; + this._files = Array.prototype.slice.call(this._files || [], 0); + + // check if webkitGetAsEntry exists on first item + if(data.items && data.items[0] && data.items[0].webkitGetAsEntry) { + if(!this.options.foldersEnabled) { + return setTimeout(Ink.bind(this._addFilesToQueue, this, this._files), 0); + } + var entry, folders = []; + for(var i = ev.dataTransfer.items.length-1; i>=0; i--) { + entry = ev.dataTransfer.items[i].webkitGetAsEntry(); + if(entry && entry.isDirectory) { + folders.push(entry); + this._files[i].isDirectory = true; + this._files.splice(i, 1); + } + } + // starting callback hell + this._addFolderToQueue(folders, Ink.bind(function() { + setTimeout(Ink.bind(this._addFilesToQueue, this, this._files), 0); + }, this)); + } else { + setTimeout(Ink.bind(this._addFilesToQueue, this, this._files), 0); + } + + return true; + }, + + + _addFolderToQueue: function(folders, cb) { + var files = [], invalidFolders = {}; + + if(!folders || !folders.length) { + cb(); + return files; + } + + var getFiles = function(entries) { + var files = []; + for(var i = 0, len = entries.length; i this.options.maxFilesize) { + this.publish('MaxSizeFailure', file, this.options.maxFilesize); + continue; + } + + fileID = parseInt(Math.round(Math.random() * 100000) + "" + Math.round(Math.random() * 100000), 10); + o = { id: i, data: file, fileID: fileID, directory: file.isDirectory }; + Queue.add(this._queueId, o); + + this.publish('FileAddedToQueue', o); + } + this._processQueue(true); + this._files = []; + }, + + + _processQueue: function(internalUpload) { + if(this._queueRunning) { + return false; + } + + this.running = 0; + var max = 1, i = 0, items, + queueLen = Queue.items.length; + this._queueRunning = true; + + this.interval = setInterval(Ink.bind(function() { + if(Queue.items.length === i && this.running === 0) { + Queue.purge(this._queueId, true); + this._queueRunning = false; + clearInterval(this.interval); + this.publish('QueueEnd', this._queueId, queueLen); + } + + items = Queue.getItems(this._queueId); + + if(this.running < max && items[i]) { + if(!items[i].canceled) { + _doRequest.call(this, items[i].pid, items[i].item.data, items[i].item.fileID, items[i].item.directory, internalUpload); + this.running++; + i++; + } else { + var j = i; + while(items[j] && items[j].canceled) { + i++; + j++; + } + } + return true; + } + return false; + }, this), 100); + + + var _doRequest = function(pid, data, fileID, directory, internalUpload) { + var o = { + file: data, + fileID: fileID, + cb: Ink.bind(function() { + this.running--; + }, this) + }; + if(internalUpload) { + if(directory) { + // do magic + o.cb(); + } else { + this._upload(o); + } + } + }; + + return true; + }, + + + _upload: function(o) { + var file = o.file, + xhr = new XMLHttpRequest(), + fileID = o.fileID; + + this.publish('BeforeUpload', file, this.options.extraData, fileID, xhr, this._supportChunks(file.size)); + + var forceAbort = function(showError) { + if(o.cb && typeof(o.cb === 'function')) { + o.cb(); + } + + this.publish('OnProgress', { + length: file.size, + lengthComputable: true, + loaded: file.size, + total: file.size + }, file, fileID); + this.publish('EndUpload', file, fileID, (showError ? { error: true } : true)); + this.publish('InvalidFile', file, 'name'); + xhr.abort(); + }; + + if(this.options.INVALID_FILE_NAME && this.options.INVALID_FILE_NAME instanceof RegExp) { + if(this.options.INVALID_FILE_NAME.test(o.file.name)) { + forceAbort.call(this); + return; + } + } + + // If file was renamed, abort it + // FU OPERA: Opera always return lastModified date as null + if(!file.lastModifiedDate && !Ink.Dom.Browser.OPERA) { + forceAbort.call(this, true); + return; + } + + xhr.upload.onprogress = Ink.bind(this.publish, this, 'OnProgress', file, fileID); + + var endpoint, method; + if(this._supportChunks(file.size)) { + if(file.size <= file.chunk_offset) { + endpoint = this.options.endpointChunkCommit; + method = 'POST'; + } else { + endpoint = this.options.endpointChunk; + if(file.chunk_upload_id) { + endpoint += '?upload_id=' + file.chunk_upload_id; + } + if(file.chunk_offset) { + endpoint += '&offset=' + file.chunk_offset; + } + method = 'PUT'; + } + } else { + endpoint = this.options.endpoint; + method = 'POST'; + } + + xhr.open(method, endpoint, true); + xhr.withCredentials = true; + xhr.setRequestHeader("x-requested-with", "XMLHttpRequest"); + if(this._supportChunks(file.size)) { + xhr.setRequestHeader('Content-type', 'application/x-www-form-urlencoded'); + } + + var fd = new FormData(), + blob; + + if("Blob" in window && typeof Blob === 'function') { + blob = new Blob([file], { type: file.type }); + if(this._supportChunks(file.size)) { + file.chunk_offset = file.chunk_offset || 0; + blob = blob.slice(file.chunk_offset, file.chunk_offset + this.options.chunkSize); + } else { + fd.append(this.options.fileFormName, blob, file.name); + } + } else { + fd.append(this.options.fileFormName, file); + } + + if(!this._supportChunks(file.size)) { + for(var k in this.options.extraData) { + if(this.options.extraData.hasOwnProperty(k)) { + fd.append(k, this.options.extraData[k]); + } + } + } else { + fd.append('upload_id', file.chunk_upload_id); + fd.append('path', file.upload_path); + } + + if(!file.hasParent) { + if(!this._supportChunks(file.size)) { + xhr.send(fd); + } else { + if(file.size <= file.chunk_offset) { + xhr.send('upload_id=' + file.chunk_upload_id + '&path=' + file.upload_path + '/' + file.name); + } else { + xhr.send(blob); + } + } + } else { + this.publish('cbCreateFolder', file.parentID, file.fullPath, this.options.extraData, this._folders, file.rootPath, Ink.bind(function() { + if(!this._supportChunks(file.size)) { + xhr.send(fd); + } else { + if(file.size <= file.chunk_offset) { + xhr.send('upload_id=' + file.chunk_upload_id + '&path=' + file.upload_path + '/' + file.name); + } else { + xhr.send(blob); + } + } + }, this)); + } + + + xhr.onload = Ink.bindEvent(function() { + /* jshint boss:true */ + if(this._supportChunks(file.size) && file.size > file.chunk_offset) { + if(xhr.response) { + var response = JSON.parse(xhr.response); + + // check expected offset + var invalidOffset = file.chunk_offset && response.offset !== (file.chunk_offset + this.options.chunkSize) && file.size !== response.offset; + if(invalidOffset) { + if(o.cb) { + o.cb(); + } + this.publish('ErrorUpload', file, fileID); + } else { + file.chunk_upload_id = response.upload_id; + file.chunk_offset = response.offset; + file.chunk_expires = response.expires; + this._upload(o); + } + } else { + if(o.cb) { + o.cb(); + } + this.publish('ErrorUpload', file, fileID); + } + return (xhr = null); + } + + if(o.cb) { + o.cb(); + } + + if(xhr.responseText && xhr['status'] < 400) { + this.publish('EndUpload', file, fileID, xhr.responseText); + } else { + this.publish('ErrorUpload', file, fileID); + } + return (xhr = null); + }, this); + + + xhr.onerror = Ink.bindEvent(function() { + if(o.cb) { + o.cb(); + } + this.publish('ErrorUpload', file, fileID); + }, this); + + xhr.onabort = Ink.bindEvent(function() { + if(o.cb) { + o.cb(); + } + this.publish('AbortUpload', file, fileID, { + abortAll: Ink.bind(this.abortAll, this), + abortOne: Ink.bind(this.abortOne, this) + }); + }, this); + }, + + + abortAll: function() { + if(!this._queueRunning) { + return false; + } + clearInterval(this.interval); + this._queueRunning = false; + Queue.purge(this._queueId, true); + return true; + }, + + abortOne: function(id, cb) { + var items = Queue.getItems(0), + o; + for(var i = 0, len = items.length; ic;c++)b("position","absolute"),b(this._isY?"top":"left",c*this._elLength+"px")},_onTouchStart:function(a){if(!(a.touches.length>1)){this._swipeData={x:b.pointerX(a),y:b.pointerY(a),lastUlPos:null};var c=this._ulEl.getBoundingClientRect();this._swipeData.inUlX=this._swipeData.x-c.left,this._swipeData.inUlY=this._swipeData.y-c.top,j(this._ulEl,"none"),this._touchMoveIsFirstTouchMove=!0,a.stopPropagation()}},_onTouchMove:function(a){if(!(a.touches.length>1)){var c=b.pointerX(a),d=b.pointerY(a),e=Math.abs(d-this._swipeData.y),f=Math.abs(c-this._swipeData.x);this._touchMoveIsFirstTouchMove&&(this._touchMoveIsFirstTouchMove=void 0,this._scrolling=this._isY?f>e:e>f,this._scrolling||this._onAnimationFrame()),!this._scrolling&&this._swipeData&&(a.preventDefault(),this._swipeData.pointerPos=this._isY?d:c),a.stopPropagation()}},_onAnimationFrame:function(){var a=this._swipeData;if(a&&!this._scrolling&&!this._touchMoveIsFirstTouchMove){var b=this._element.getBoundingClientRect(),c;c=this._isY?a.pointerPos-a.inUlY-b.top:a.pointerPos-a.inUlX-b.left,this._ulEl.style[this._isY?"top":"left"]=c+"px",a.lastUlPos=c,h(Ink.bindMethod(this,"_onAnimationFrame"))}},_onTouchEnd:function(a){if(this._swipeData&&this._swipeData.pointerPos&&!this._scrolling&&!this._touchMoveIsFirstTouchMove){var b=.1,c=-this._swipeData.lastUlPos,d=this.getPage(),e=c/this._elLength/this._slidesPerPage;if(Math.round(e)===d){var f=e-d;Math.abs(f)>b&&(f=f>0?1:-1,d+=f)}else d=Math.round(e);this.setPage(d),a.stopPropagation()}j(this._ulEl,null),this._swipeData=null,this._touchMoveIsFirstTouchMove=void 0,this._scrolling=void 0},_onPaginationChange:function(a){this._setPage(a.getCurrent())},getPage:function(){return this._pagination?this._pagination.getCurrent():this._currentPage},setPage:function(a,b){b&&(a%=this._numPages,0>a&&(a=this._numPages-a)),a=g(a,0,this._numPages-1),this._pagination?this._pagination.setCurrent(a):this._setPage(a)},_setPage:function(a){this._ulEl.style[this._isY?"top":"left"]=["-",a*this._deltaLength,"px"].join(""),this._options.onChange&&this._options.onChange.call(this,a),this._currentPage=a,this._updateHider()},nextPage:function(a){this.setPage(this.getPage()+1,a)},previousPage:function(a){this.setPage(this.getPage()-1,a)}};function j(a,b){a.style.transitionProperty=a.style.oTransitionProperty=a.style.msTransitionProperty=a.style.mozTransitionProperty=a.style.webkitTransitionProperty=b}return i}),Ink.createModule("Ink.UI.Close","1",["Ink.Dom.Event_1","Ink.Dom.Element_1"],function(a,b){"use strict";var c=function(){a.observe(document.body,"click",function(c){var d=a.element(c);if(d=b.findUpwardsByClass(d,"ink-close")||b.findUpwardsByClass(d,"ink-dismiss")){var e=d;e=b.findUpwardsByClass(d,"ink-alert")||b.findUpwardsByClass(d,"ink-alert-block"),e&&(a.stop(c),b.remove(e))}})};return c}),Ink.createModule("Ink.UI.Common","1",["Ink.Dom.Element_1","Ink.Net.Ajax_1","Ink.Dom.Css_1","Ink.Dom.Selector_1","Ink.Util.Url_1"],function(a,b,c,d,e){"use strict";var f={},g=0,h={},i=Object.keys||function(a){var b=[];for(var c in a)a.hasOwnProperty(c)&&b.push(c);return b},j={Layouts:{SMALL:"small",MEDIUM:"medium",LARGE:"large"},isDOMElement:function(a){return a&&"object"==typeof a&&"nodeType"in a&&1===a.nodeType},isInteger:function(a){return"number"==typeof a&&a%1===0},elOrSelector:function(a,b){if(!this.isDOMElement(a)){var c=d.select(a);if(0===c.length)throw new TypeError(b+" must either be a DOM Element or a selector expression!\nThe script element must also be after the DOM Element itself.");return c[0]}return a},elsOrSelector:function(a,b,c){var e;if("string"==typeof a?e=d.select(a):j.isDOMElement(a)?e=[a]:a&&"object"==typeof a&&"number"==typeof a.length&&(e=a),e&&e.length)return e;if(c||2===arguments.length)throw new TypeError(b+" must either be a DOM Element, an Array of elements, or a selector expression!\nThe script element must also be after the DOM Element itself.");return[]},options:function(b,c,d,e){"string"!=typeof b&&(e=d,d=c,c=b,b=""),d=d||{};var f={},g=e?a.data(e):{},k,l,m,n,o=function(a){return b&&(a=b+': "'+(""+a).replace(/"/,'\\"')+'"'),a},p=function(a){return'"'+(""+a).replace(/"/,'\\"')+'"'},q=function(a){throw new Error(o(a))},r=function(a){Ink.error(o(a)+". Ignoring option.")};function s(a){return l=c[a][0],m=l.toLowerCase(),n=2===c[a].length?c[a][1]:h,l||q("Ink.UI.Common.options: Always specify a type!"),m in j._coerce_funcs||q("Ink.UI.Common.options: "+c[a][0]+" is not a valid type. Use one of "+i(j._coerce_funcs).join(", ")),(!c[a].length||c[a].length>2)&&q('the "defaults" argument must be an object mapping option names to [typestring, optional] arrays.'),k=a in g?j._coerce_from_string(m,g[a],a,b):h,k!==h?j._options_validate(k,m)?k:(r("("+a+" option) Invalid "+m+" "+p(k)),n):a in d?d[a]:n!==h?n:void q("Option "+a+" is required!")}for(var t in c)c.hasOwnProperty(t)&&(f[t]=s(t));return f},_coerce_from_string:function(a,b,c,d){return a in j._coerce_funcs?j._coerce_funcs[a](b,c,d):b},_options_validate:function(a,b){return b in j._options_validate_types?j._options_validate_types[b].call(j,a):!1},_coerce_funcs:function(){var a={element:function(a){return j.elOrSelector(a,"")},elements:function(a){return j.elsOrSelector(a,"",!1)},object:function(a){return a},number:function(a){return parseFloat(a)},"boolean":function(a){return!("false"===a||""===a||null===a)},string:function(a){return a},"function":function(a,b,c){return Ink.error(c+': You cannot specify the option "'+b+"\" through data-attributes because it's a function"),h}};return a["float"]=a.integer=a.number,a}(),_options_validate_types:function(){var a={string:function(a){return"string"==typeof a},number:function(a){return"number"==typeof a&&!isNaN(a)&&isFinite(a)},integer:function(a){return a===Math.round(a)},element:function(a){return j.isDOMElement(a)},elements:function(a){return a&&"object"==typeof a&&"number"==typeof a.length&&a.length},"boolean":function(a){return"boolean"==typeof a}};return a["float"]=a.number,a}(),clone:function(a){try{return JSON.parse(JSON.stringify(a))}catch(b){throw new Error("Given object cannot have loops!")}},childIndex:function(a){if(j.isDOMElement(a))for(var b=d.select("> *",a.parentNode),c=0,e=b.length;e>c;++c)if(b[c]===a)return c;throw"not found!"},ajaxJSON:function(a,c,d){new b(a,{evalJS:"force",method:"POST",parameters:c,onSuccess:function(a){try{if(a=a.responseJSON,"ok"!==a.status)throw"server error: "+a.message;d(null,a)}catch(b){d(b)}},onFailure:function(){d("communication failure")}})},currentLayout:function(){var a,b,e,f,g,h=d.select("#ink-layout-detector")[0];if(!h){h=document.createElement("div"),h.id="ink-layout-detector";for(e in this.Layouts)this.Layouts.hasOwnProperty(e)&&(f=this.Layouts[e],g=document.createElement("div"),g.className="show-"+f+" hide-all",g.setAttribute("data-ink-layout",f),h.appendChild(g));document.body.appendChild(h)}var i="",j=0;for(a=0,b=h.childNodes.length;b>a;++a)g=h.childNodes[a],"block"===c.getStyle(g,"display")&&(i=g.getAttribute("data-ink-layout"),j+=1);return 1===j?i:"large"},hashSet:function(a){if("object"!=typeof a)throw new TypeError("o should be an object!");var b=e.getAnchorString();b=Ink.extendObj(b,a),window.location.hash=e.genQueryString("",b).substring(1)},cleanChildren:function(a){if(!j.isDOMElement(a))throw"Please provide a valid DOMElement";for(var b,c=a.lastChild;c;)b=c.previousSibling,a.removeChild(c),c=b},storeIdAndClasses:function(a,b){if(!j.isDOMElement(a))throw"Please provide a valid DOMElement as first parameter";var c=a.id;c&&(b._id=c);var d=a.className;d&&(b._classes=d)},restoreIdAndClasses:function(a,b){if(!j.isDOMElement(a))throw"Please provide a valid DOMElement as first parameter";b._id&&a.id!==b._id&&(a.id=b._id),b._classes&&-1===a.className.indexOf(b._classes)&&(a.className?a.className+=" "+b._classes:a.className=b._classes),b._instanceId&&!a.getAttribute("data-instance")&&a.setAttribute("data-instance",b._instanceId)},registerInstance:function(a,b,c){if(!a._instanceId){if("object"!=typeof a)throw new TypeError("1st argument must be a JavaScript object!");if(!a._options||!a._options.skipRegister){if(!this.isDOMElement(b))throw new TypeError("2nd argument must be a DOM element!");if(void 0!==c&&"string"!=typeof c)throw new TypeError("3rd argument must be a string!");var d=(c||"instance")+ ++g;f[d]=a,a._instanceId=d;var e=b.getAttribute("data-instance");e=null!==e?[e,d].join(" "):d,b.setAttribute("data-instance",e)}}},unregisterInstance:function(a){delete f[a]},getInstance:function(a){var b;if(this.isDOMElement(a)){if(b=a.getAttribute("data-instance"),null===b)throw new Error("argument is not a DOM instance element!")}else b=a;b=b.split(" ");var c,d,e,g=b.length,h=[];for(e=0;g>e;++e){if(d=b[e],!d)throw new Error("Element is not a JS instance!");if(c=f[d],!c)throw new Error('Instance "'+d+'" not found!');h.push(c)}return 1===g?h[0]:h},getInstanceFromSelector:function(a){var b=d.select(a)[0];if(!b)throw new Error("Element not found!");return this.getInstance(b)},getInstanceIds:function(){var a=[];for(var b in f)f.hasOwnProperty(b)&&a.push(b);return a},getInstances:function(){var a=[];for(var b in f)f.hasOwnProperty(b)&&a.push(f[b]);return a},destroyComponent:function(){j.unregisterInstance(this._instanceId),this._element.parentNode.removeChild(this._element)}};return j}),Ink.createModule("Ink.UI.DatePicker","1",["Ink.UI.Common_1","Ink.Dom.Event_1","Ink.Dom.Css_1","Ink.Dom.Element_1","Ink.Dom.Selector_1","Ink.Util.Array_1","Ink.Util.Date_1","Ink.Dom.Browser_1"],function(a,b,c,d,e,f,g){"use strict";function h(a,b){for(var c="",d=0;a>d;d++)c+=b;return c}function i(a,b,c){return a>c&&(a=c),b>a&&(a=b),a}function j(a){var b=a.split("-");return k(+b[0],+b[1]-1,+b[2])}function k(a,b,c){return{_year:a,_month:b,_day:c}}function l(a){return{_year:a.getFullYear(),_month:a.getMonth(),_day:a.getDate()}}var m=function(b,c){if(this._element=b&&a.elOrSelector(b,"[Ink.UI.DatePicker_1]: selector argument"),this._options=a.options("Ink.UI.DatePicker_1",{autoOpen:["Boolean",!1],cleanText:["String","Clear"],closeText:["String","Close"],containerElement:["Element",null],cssClass:["String","ink-calendar bottom"],dateRange:["String",null],displayInSelect:["Boolean",!1],dayField:["Element",null],monthField:["Element",null],yearField:["Element",null],format:["String","yyyy-mm-dd"],instance:["String","scdp_"+Math.round(99999*Math.random())],nextLinkText:["String","»"],ofText:["String"," of "],onFocus:["Boolean",!0],onMonthSelected:["Function",null],onSetDate:["Function",null],onYearSelected:["Function",null],position:["String","right"],prevLinkText:["String","«"],showClean:["Boolean",!0],showClose:["Boolean",!0],shy:["Boolean",!0],startDate:["String",null],startWeekDay:["Number",1],validDayFn:["Function",null],validMonthFn:["Function",null],validYearFn:["Function",null],nextValidDateFn:["Function",null],prevValidDateFn:["Function",null],yearRange:["String",null],month:["Object",{1:"January",2:"February",3:"March",4:"April",5:"May",6:"June",7:"July",8:"August",9:"September",10:"October",11:"November",12:"December"}],wDay:["Object",{0:"Sunday",1:"Monday",2:"Tuesday",3:"Wednesday",4:"Thursday",5:"Friday",6:"Saturday"}]},c||{},this._element),this._options.format=this._dateParsers[this._options.format]||this._options.format,this._hoverPicker=!1,this._picker=this._options.pickerField&&a.elOrSelector(this._options.pickerField,"pickerField"),this._setMinMax(this._options.dateRange||this._options.yearRange),this._options.startDate)this.setDate(this._options.startDate);else if(this._element&&this._element.value)this.setDate(this._element.value);else{var d=new Date;this._day=d.getDate(),this._month=d.getMonth(),this._year=d.getFullYear()}if(this._options.displayInSelect&&!(this._options.dayField&&this._options.monthField&&this._options.yearField))throw new Error("Ink.UI.DatePicker: displayInSelect option enabled.Please specify dayField, monthField and yearField selectors.");this._init()};return m.prototype={version:"0.1",_init:function(){Ink.extendObj(this._options,this._lang||{}),this._render(),this._listenToContainerObjectEvents(),a.registerInstance(this,this._containerObject,"datePicker")},_render:function(){this._containerObject=document.createElement("div"),this._containerObject.id=this._options.instance,this._containerObject.className=this._options.cssClass+" ink-datepicker-calendar hide-all",this._renderSuperTopBar();var b=document.createElement("div");b.className="ink-calendar-top",this._monthDescContainer=document.createElement("div"),this._monthDescContainer.className="ink-calendar-month_desc",this._monthPrev=document.createElement("div"),this._monthPrev.className="ink-calendar-prev",this._monthPrev.innerHTML=''+this._options.prevLinkText+"",this._monthNext=document.createElement("div"),this._monthNext.className="ink-calendar-next",this._monthNext.innerHTML=''+this._options.nextLinkText+"",b.appendChild(this._monthPrev),b.appendChild(this._monthDescContainer),b.appendChild(this._monthNext),this._monthContainer=document.createElement("div"),this._monthContainer.className="ink-calendar-month",this._containerObject.appendChild(b),this._containerObject.appendChild(this._monthContainer),this._monthSelector=this._renderMonthSelector(),this._containerObject.appendChild(this._monthSelector),this._yearSelector=document.createElement("ul"),this._yearSelector.className="ink-calendar-year-selector",this._containerObject.appendChild(this._yearSelector),(!this._options.onFocus||this._options.displayInSelect)&&(this._options.pickerField?this._picker=a.elOrSelector(this._options.pickerField,"pickerField"):(this._picker=document.createElement("a"),this._picker.href="#open_cal",this._picker.innerHTML="open",this._element.parentNode.appendChild(this._picker),this._picker.className="ink-datepicker-picker-field")),this._appendDatePickerToDom(),this._renderMonth(),this._monthChanger=document.createElement("a"),this._monthChanger.href="#monthchanger",this._monthChanger.className="ink-calendar-link-month",this._monthChanger.innerHTML=this._options.month[this._month+1],this._ofText=document.createElement("span"),this._ofText.innerHTML=this._options.ofText,this._yearChanger=document.createElement("a"),this._yearChanger.href="#yearchanger",this._yearChanger.className="ink-calendar-link-year",this._yearChanger.innerHTML=this._year,this._monthDescContainer.innerHTML="",this._monthDescContainer.appendChild(this._monthChanger),this._monthDescContainer.appendChild(this._ofText),this._monthDescContainer.appendChild(this._yearChanger),this._options.inline?this.show():this._addOpenCloseEvents(),this._addDateChangeHandlersToInputs()},_addDateChangeHandlersToInputs:function(){var a=this._element;this._options.displayInSelect&&(a=[this._options.dayField,this._options.monthField,this._options.yearField]),b.observeMulti(a,"change",Ink.bindEvent(function(){this._updateDate(),this._showDefaultView(),this.setDate(),this._inline||this._hoverPicker||this._hide(!0)},this))},show:function(){this._updateDate(),this._renderMonth(),c.removeClassName(this._containerObject,"hide-all")},_addOpenCloseEvents:function(){var a=this._picker||this._element;b.observe(a,"click",Ink.bindEvent(function(a){b.stop(a),this.show()},this)),this._options.autoOpen&&this.show(),this._options.displayInSelect||b.observe(a,"blur",Ink.bindEvent(function(){this._hoverPicker||this._hide(!0)},this)),this._options.shy&&b.observe(document,"click",Ink.bindEvent(function(a){for(var c=b.element(a),e=[this._options.dayField,this._options.monthField,this._options.yearField,this._picker,this._element],f=0,g=e.length;g>f;f++)if(e[f]&&d.descendantOf(e[f],c))return;this._hide(!0)},this))},_renderMonthSelector:function(){var a=document.createElement("ul");a.className="ink-calendar-month-selector";for(var b=document.createElement("ul"),c=1;12>=c;c++)b.appendChild(this._renderMonthButton(c)),c%4===0&&(a.appendChild(b),b=document.createElement("ul"));return a},_renderMonthButton:function(a){var b=document.createElement("li"),c=document.createElement("a");return c.setAttribute("data-cal-month",a),c.innerHTML=this._options.month[a].substring(0,3),b.appendChild(c),b},_appendDatePickerToDom:function(){if(this._options.containerElement){var b=Ink.i(this._options.containerElement)||a.elOrSelector(this._options.containerElement);b.appendChild(this._containerObject)}d.findUpwardsBySelector(this._element,".ink-form .control-group .control")===this._element.parentNode?(this._wrapper=this._element.parentNode,this._wrapperIsControl=!0):(this._wrapper=d.create("div",{className:"ink-datepicker-wrapper"}),d.wrap(this._element,this._wrapper)),d.insertAfter(this._containerObject,this._element)},_renderSuperTopBar:function(){this._options.showClose&&this._options.showClean&&(this._superTopBar=document.createElement("div"),this._superTopBar.className="ink-calendar-top-options",this._options.showClean&&this._superTopBar.appendChild(d.create("a",{className:"clean",setHTML:this._options.cleanText})),this._options.showClose&&this._superTopBar.appendChild(d.create("a",{className:"close",setHTML:this._options.closeText})),this._containerObject.appendChild(this._superTopBar))},_listenToContainerObjectEvents:function(){b.observe(this._containerObject,"mouseover",Ink.bindEvent(function(a){b.stop(a),this._hoverPicker=!0},this)),b.observe(this._containerObject,"mouseout",Ink.bindEvent(function(a){b.stop(a),this._hoverPicker=!1},this)),b.observe(this._containerObject,"click",Ink.bindEvent(this._onClick,this))},_onClick:function(a){var d=b.element(a);return c.hasClassName(d,"ink-calendar-off")?(b.stopDefault(a),null):(b.stop(a),this._onRelativeChangerClick(d),this._onAbsoluteChangerClick(d),c.hasClassName(d,"ink-calendar-link-month")?this._showMonthSelector():c.hasClassName(d,"ink-calendar-link-year")?this._showYearSelector():c.hasClassName(d,"clean")?this._clean():c.hasClassName(d,"close")&&this._hide(!1),void this._updateDescription())},_onRelativeChangerClick:function(a){var b={change_year_next:1,change_year_prev:-1},c={change_month_next:1,change_month_prev:-1};a.className in c?this._updateCal(c[a.className]):a.className in b&&this._showYearSelector(b[a.className])},_onAbsoluteChangerClick:function(a){var b=d.data(a);Number(b.calDay)?(this.setDate([this._year,this._month+1,b.calDay].join("-")),this._hide()):Number(b.calMonth)?(this._month=Number(b.calMonth)-1,this._showDefaultView(),this._updateCal()):Number(b.calYear)&&this._changeYear(Number(b.calYear))},_changeYear:function(a){a=+a,a&&(this._year=a,"function"==typeof this._options.onYearSelected&&this._options.onYearSelected(this,{year:this._year}),this._showMonthSelector())},_clean:function(){this._options.displayInSelect?(this._options.yearField.selectedIndex=0,this._options.monthField.selectedIndex=0,this._options.dayField.selectedIndex=0):this._element.value=""},_hide:function(a){a=void 0===a?!0:a,(a===!1||a&&this._options.shy)&&c.addClassName(this._containerObject,"hide-all")},_setMinMax:function(a){var b=this,c={_year:-Number.MAX_VALUE,_month:0,_day:1},d={_year:Number.MAX_VALUE,_month:11,_day:31};function e(){b._min=c,b._max=d}if(!a)return e();var g=a.split(":"),h=/^(\d{4})((\-)(\d{1,2})((\-)(\d{1,2}))?)?$/;f.each([{name:"_min",date:g[0],noLim:c},{name:"_max",date:g[1],noLim:d}],Ink.bind(function(a){var b=a.noLim;if("NOW"===a.date.toUpperCase()){var c=new Date;b=l(c)}else"EVER"===a.date.toUpperCase()?b=a.noLim:h.test(a.date)&&(b=j(a.date),b._month=i(b._month,0,11),b._day=i(b._day,1,this._daysInMonth(b._year,b._month)));this[a.name]=b},this));var k=-1!==this._dateCmp(this._max,this._min);k||e()},_fitDateToRange:function(a){return this._isValidDate(a)||(a=l(new Date)),-1===this._dateCmp(a,this._min)?Ink.extendObj({},this._min):1===this._dateCmp(a,this._max)?Ink.extendObj({},this._max):Ink.extendObj({},a)},_dateWithinRange:function(a){return arguments.length||(a=this),!this._dateAboveMax(a)&&!this._dateBelowMin(a)},_dateAboveMax:function(a){return 1===this._dateCmp(a,this._max)},_dateBelowMin:function(a){return-1===this._dateCmp(a,this._min)},_dateCmp:function(a,b){return this._dateCmpUntil(a,b,"_day")},_dateCmpUntil:function(a,b,c){var d=["_year","_month","_day"],e=-1;do{if(e++,a[d[e]]>b[d[e]])return 1;if(a[d[e]]",this._yearSelector.innerHTML=d,this._monthPrev.childNodes[0].className="action_inactive",this._monthNext.childNodes[0].className="action_inactive",this._monthSelector.style.display="none",this._monthContainer.style.display="none",this._yearSelector.style.display="block"},_incrementViewingYear:function(a){if(a){var b=+this._year+10*a;b-=b%10,b>this._max._year||b+9"+a+""}return'
        • '+a+"
        • "},_showMonthSelector:function(){this._yearSelector.style.display="none",this._monthContainer.style.display="none",this._monthPrev.childNodes[0].className="action_inactive",this._monthNext.childNodes[0].className="action_inactive",this._addMonthClassNames(),this._monthSelector.style.display="block"},_parseDate:function(a){var b=g.set(this._options.format,a);return b?l(b):null},_isValidDate:function(a){var b=/^\d{4}$/,c=/^\d{1,2}$/;return b.test(a._year)&&c.test(a._month)&&c.test(a._day)&&+a._month+1>=1&&+a._month+1<=12&&+a._day>=1&&+a._day<=this._daysInMonth(a._year,a._month+1)},_isDate:function(a,b){try{if("undefined"==typeof a)return!1;var c=g.set(a,b);if(c&&this._isValidDate(l(c)))return!0}catch(d){}return!1},_acceptableDay:function(a){return this._acceptableDateComponent(a,"validDayFn")},_acceptableMonth:function(a){return this._acceptableDateComponent(a,"validMonthFn")},_acceptableYear:function(a){return this._acceptableDateComponent(a,"validYearFn")},_acceptableDateComponent:function(a,b){return this._options[b]?this._callUserCallbackBool(this._options[b],a):this._dateWithinRange(a)},_writeDateInFormat:function(){return g.get(this._options.format,this.getDate())},setDate:function(a){if(/\d{4}-\d{1,2}-\d{1,2}/.test(a)){var b=a.split("-");this._year=+b[0],this._month=+b[1]-1,this._day=+b[2]}this._setDate()},getDate:function(){if(!this._day)throw"Ink.UI.DatePicker: Still picking a date. Cannot getDate now!";return new Date(this._year,this._month,this._day)},_setDate:function(a){if(a){var b=d.data(a);this._day=+b.calDay||this._day}var c=this._fitDateToRange(this);this._year=c._year,this._month=c._month,this._day=c._day,this._options.displayInSelect?(this._options.dayField.value=this._day,this._options.monthField.value=this._month+1,this._options.yearField.value=this._year):this._element.value=this._writeDateInFormat(),this._options.onSetDate&&this._options.onSetDate(this,{date:this.getDate()})},_updateCal:function(a){"function"==typeof this._options.onMonthSelected&&this._options.onMonthSelected(this,{year:this._year,month:this._month}),a&&null===this._updateMonth(a)||this._renderMonth()},_daysInMonth:function(a,b){var c={2:a%400===0||a%4===0&&a%100!==0?29:28,4:30,6:30,9:30,11:30};return c[b]||31},_updateMonth:function(a){var b;return a>0?b=this._getNextMonth():0>a&&(b=this._getPrevMonth()),b?(this._year=b._year,this._month=b._month,void(this._day=b._day)):null},_getNextMonth:function(a){return this._tryLeap(a,"Month","next",function(a){return a._month+=1,a._month>11&&(a._month=0,a._year+=1),a})},_getPrevMonth:function(a){return this._tryLeap(a,"Month","prev",function(a){return a._month-=1,a._month<0&&(a._month=11,a._year-=1),a})},_getPrevYear:function(a){return this._tryLeap(a,"Year","prev",function(a){return a._year-=1,a})},_getNextYear:function(a){return this._tryLeap(a,"Year","next",function(a){return a._year+=1,a})},_tryLeap:function(a,b,c,d){a=a||{_year:this._year,_month:this._month,_day:this._day};var e="prev"===c?"_min":"_max",f=this[e];if(0===this._dateCmpUntil(a,f,b))return null;var g=this._options[c+"ValidDateFn"];return g?this._callUserCallbackDate(g,a):(a=d(a),a=this._fitDateToRange(a),this["_acceptable"+b](a)?a:null)},_getNextDecade:function(a){a=a||{_year:this._year,_month:this._month,_day:this._day};var b=this._getCurrentDecade(a);return b+10>this._max._year?null:b+10},_getPrevDecade:function(a){a=a||{_year:this._year,_month:this._month,_day:this._day};var b=this._getCurrentDecade(a);return b-10c?c=7+d-c:c+=d;var e="";e+=this._getMonthCalendarHeaderHtml(d);var f=0;e+="
            ";var g='
          •  
          • ';if(0!==c){var i=c-d-1;f+=i,e+=h(i,g)}e+=this._getDayButtonsHtml(f,b,a),e+="
          ",this._monthContainer.innerHTML=e},_getDayButtonsHtml:function(a,b,c){for(var d=this._daysInMonth(b,c),e="",f=1;d>=f;f++)7===a&&(a=0,e+="
            "),e+=this._getDayButtonHtml(b,c,f),a++,7===a&&(e+="
          ");return e},_getDayButtonHtml:function(a,b,c){var d=" ",e=k(a,b,c);return d+=this._acceptableDay(e)?'data-cal-day="'+c+'"':'class="ink-calendar-off"',this._day&&0===this._dateCmp(e,this)&&(d+='class="ink-calendar-on" data-cal-day="'+c+'"'),'
        • "+c+"
        • "},_getMonthCalendarHeaderHtml:function(a){for(var b='
            ',c,d=0;7>d;d++)c=(a+d)%7,b+="
          • "+this._options.wDay[c].substring(0,1)+"
          • ";return b+"
          "},_addMonthClassNames:function(a){f.forEach((a||this._monthSelector).getElementsByTagName("a"),Ink.bindMethod(this,"_addMonthButtonClassNames"))},_addMonthButtonClassNames:function(a){var b=d.data(a);if(!b.calMonth)throw"not a calendar month button!";var e=+b.calMonth-1;if(e===this._month)c.addClassName(a,"ink-calendar-on"),c.removeClassName(a,"ink-calendar-off");else{c.removeClassName(a,"ink-calendar-on");var f=!this._acceptableMonth({_year:this._year,_month:e});c.addRemoveClassName(a,"ink-calendar-off",f)}},lang:function(a){this._lang=a},showMonth:function(){this._renderMonth()},isMonthRendered:function(){var a=e.select(".ink-calendar-header",this._containerObject)[0];return"none"!==c.getStyle(a.parentNode,"display")&&"none"!==c.getStyle(a.parentNode.parentNode,"display")},destroy:function(){d.unwrap(this._element),d.remove(this._wrapper),d.remove(this._containerObject),a.unregisterInstance.call(this)}},m}),Ink.createModule("Ink.UI.Draggable","1",["Ink.Dom.Element_1","Ink.Dom.Event_1","Ink.Dom.Css_1","Ink.Dom.Browser_1","Ink.Dom.Selector_1","Ink.UI.Common_1"],function(a,b,c,d,e,f){"use strict";var g=0,h=1;function i(a,b,c){return a=Math.min(a,c),a=Math.max(a,b)}var j=function(a,b){this.init(a,b)};return j.prototype={init:function(c,e){var g=Ink.extendObj({constraint:!1,constraintElm:!1,top:!1,right:!1,bottom:!1,left:!1,handle:e.handler||!1,revert:!1,cursor:"move",zindex:e.zindex||9999,dragClass:"drag",onStart:!1,onEnd:!1,onDrag:!1,onChange:!1,droppableProxy:!1,mouseAnchor:void 0,skipChildren:!0,fps:100,debug:!1},e||{},a.data(c));this.options=g,this.element=f.elOrSelector(c),this.constraintElm=g.constraintElm&&f.elOrSelector(g.constraintElm),this.handle=!1,this.elmStartPosition=!1,this.active=!1,this.dragged=!1,this.prevCoords=!1,this.placeholder=!1,this.position=!1,this.zindex=!1,this.firstDrag=!0,g.fps&&(this.deltaMs=1e3/g.fps,this.lastRunAt=0),this.handlers={},this.handlers.start=Ink.bindEvent(this._onStart,this),this.handlers.dragFacade=Ink.bindEvent(this._onDragFacade,this),this.handlers.drag=Ink.bindEvent(this._onDrag,this),this.handlers.end=Ink.bindEvent(this._onEnd,this),this.handlers.selectStart=function(a){return b.stop(a),!1},this.handle=this.options.handle?f.elOrSelector(this.options.handle):this.element,this.handle.style.cursor=g.cursor,b.observe(this.handle,"touchstart",this.handlers.start),b.observe(this.handle,"mousedown",this.handlers.start),d.IE&&b.observe(this.element,"selectstart",this.handlers.selectStart)},destroy:function(){b.stopObserving(this.handle,"touchstart",this.handlers.start),b.stopObserving(this.handle,"mousedown",this.handlers.start),d.IE&&b.stopObserving(this.element,"selectstart",this.handlers.selectStart)},_getCoords:function(b){var c=[a.scrollWidth(),a.scrollHeight()];return{x:(b.touches?b.touches[0].clientX:b.clientX)+c[g],y:(b.touches?b.touches[0].clientY:b.clientY)+c[h]}},_cloneStyle:function(b,d){d.className=b.className,d.style.borderWidth="0",d.style.padding="0",d.style.position="absolute",d.style.width=a.elementWidth(b)+"px",d.style.height=a.elementHeight(b)+"px",d.style.left=a.elementLeft(b)+"px",d.style.top=a.elementTop(b)+"px",d.style.cssFloat=c.getStyle(b,"float"),d.style.display=c.getStyle(b,"display")},_onStart:function(d){if(!this.active&&b.isLeftClick(d)||"undefined"==typeof d.button){var e=b.element(d);if(this.options.skipChildren&&e!==this.handle)return;b.stop(d),c.addClassName(this.element,this.options.dragClass),this.elmStartPosition=[a.elementLeft(this.element),a.elementTop(this.element)];var f=[parseInt(c.getStyle(this.element,"left"),10),parseInt(c.getStyle(this.element,"top"),10)],i=a.elementDimensions(this.element);this.originalPosition=[f[g]?f[g]:null,f[h]?f[h]:null],this.delta=this._getCoords(d),this.active=!0,this.position=c.getStyle(this.element,"position"),this.zindex=c.getStyle(this.element,"zIndex");var j=document.createElement("div");if(j.style.position=this.position,j.style.width=i[g]+"px",j.style.height=i[h]+"px",j.style.marginTop=c.getStyle(this.element,"margin-top"),j.style.marginBottom=c.getStyle(this.element,"margin-bottom"),j.style.marginLeft=c.getStyle(this.element,"margin-left"),j.style.marginRight=c.getStyle(this.element,"margin-right"),j.style.borderWidth="0",j.style.padding="0",j.style.cssFloat=c.getStyle(this.element,"float"),j.style.display=c.getStyle(this.element,"display"),j.style.visibility="hidden",this.delta2=[this.delta.x-this.elmStartPosition[g],this.delta.y-this.elmStartPosition[h]],this.options.mouseAnchor){var k=this.options.mouseAnchor.split(" "),l=[i[g],i[h]];"left"===k[0]?l[g]=0:"center"===k[0]&&(l[g]=parseInt(l[g]/2,10)),"top"===k[1]?l[h]=0:"center"===k[1]&&(l[h]=parseInt(l[h]/2,10)),this.applyDelta=[this.delta2[g]-l[g],this.delta2[h]-l[h]]}var m=this.options.fps?"dragFacade":"drag";if(this.placeholder=j,this.options.onStart&&this.options.onStart(this.element,d),this.options.droppableProxy){this.proxy=document.createElement("div"),i=[window.innerWidth||document.documentElement.clientWidth||document.body.clientWidth,window.innerHeight||document.documentElement.clientHeight||document.body.clientHeight];var n=this.proxy.style;n.width=i[g]+"px",n.height=i[h]+"px",n.position="fixed",n.left="0",n.top="0",n.zIndex=this.options.zindex+1,n.backgroundColor="#FF0000",c.setOpacity(this.proxy,0);for(var o=document.body.firstChild;o&&1!==o.nodeType;)o=o.nextSibling;document.body.insertBefore(this.proxy,o),b.observe(this.proxy,"mousemove",this.handlers[m]),b.observe(this.proxy,"touchmove",this.handlers[m])}else b.observe(document,"mousemove",this.handlers[m]);return this.element.style.position="absolute",this.element.style.zIndex=this.options.zindex,this.element.parentNode.insertBefore(this.placeholder,this.element),this._onDrag(d),b.observe(document,"mouseup",this.handlers.end),b.observe(document,"touchend",this.handlers.end),!1}},_onDragFacade:function(a){var b=+new Date;(!this.lastRunAt||b>this.lastRunAt+this.deltaMs)&&(this.lastRunAt=b,this._onDrag(a))},_onDrag:function(c){if(this.active){b.stop(c),this.dragged=!0;var d=this._getCoords(c),e=d.x,f=d.y,j=this.options,k=!1,l=!1;if(this.prevCoords&&e!==this.prevCoords.x||f!==this.prevCoords.y){j.onDrag&&j.onDrag(this.element,c),this.prevCoords=d,k=this.elmStartPosition[g]+e-this.delta.x,l=this.elmStartPosition[h]+f-this.delta.y;var m=a.elementDimensions(this.element);if(this.constraintElm){var n=a.offset(this.constraintElm),o=a.elementDimensions(this.constraintElm),p=n[h]+(j.top||0),q=n[h]+o[h]-(j.bottom||0),r=n[g]+(j.left||0),s=n[g]+o[g]-(j.right||0);l=i(l,p,q-m[h]),k=i(k,r,s-m[g])}else if(j.constraint){var t=j.right===!1?a.pageWidth()-m[g]:j.right,u=j.left===!1?0:j.left,v=j.top===!1?0:j.top,w=j.bottom===!1?a.pageHeight()-m[h]:j.bottom;("horizontal"===j.constraint||"both"===j.constraint)&&(k=i(k,u,t)),("vertical"===j.constraint||"both"===j.constraint)&&(l=i(l,v,w))}var x=Ink.getModule("Ink.UI.Droppable_1");if(this.firstDrag&&(x&&x.updateAll(),this.firstDrag=!1),k&&(this.element.style.left=k+"px"),l&&(this.element.style.top=l+"px"),x){var y=this.options.mouseAnchor?{x:e-this.applyDelta[g],y:f-this.applyDelta[h]}:d;x.action(y,"drag",c,this.element)}j.onChange&&j.onChange(this)}}},_onEnd:function(d){if(b.stopObserving(document,"mousemove",this.handlers.drag),b.stopObserving(document,"touchmove",this.handlers.drag),this.options.fps&&this._onDrag(d),c.removeClassName(this.element,this.options.dragClass),this.active&&this.dragged){this.options.droppableProxy&&document.body.removeChild(this.proxy),this.pt&&(a.remove(this.pt),this.pt=void 0),this.placeholder&&a.remove(this.placeholder),this.options.revert&&(this.element.style.position=this.position,this.element.style.zIndex=null!==this.zindex?this.zindex:"auto",this.element.style.left=this.originalPosition[g]?this.originalPosition[g]+"px":"",this.element.style.top=this.originalPosition[h]?this.originalPosition[h]+"px":""),this.options.onEnd&&this.options.onEnd(this.element,d);var e=Ink.getModule("Ink.UI.Droppable_1");e&&e.action(this._getCoords(d),"drop",d,this.element),this.position=!1,this.zindex=!1,this.firstDrag=!0}this.active=!1,this.dragged=!1}},j}),Ink.createModule("Ink.UI.Dropdown","1",["Ink.UI.Common_1","Ink.UI.Toggle_1","Ink.Dom.Event_1","Ink.Dom.Element_1"],function(a,b,c,d){"use strict";function e(a,b){this._init(a,b)}return e.prototype={_init:function(d,e){this._element=a.elOrSelector(d),this._options=a.options("Ink.UI.Dropdown_1",{target:["Element"],hoverOpen:["Number",null],dismissOnInsideClick:["Boolean",!1],dismissOnOutsideClick:["Boolean",!0],dismissAfter:["Number",null],onInsideClick:["Function",null],onOutsideClick:["Function",null],onOpen:["Function",null],onDismiss:["Function",null]},e||{},this._element),this._toggle=new b(this._element,{target:this._options.target,closeOnInsideClick:null,closeOnClick:!1,onChangeState:Ink.bind(function(a){return this._openOrDismiss(a,!0,!0)},this)}),c.observeMulti([this._options.target,this._element],"mouseout",Ink.bindMethod(this,"_onMouseOut")),c.observeMulti([this._options.target,this._element],"mouseover",Ink.bindMethod(this,"_onMouseOver")),c.observe(this._options.target,"click",Ink.bindMethod(this,"_onInsideClick")),c.observe(document,"click",Ink.bindMethod(this,"_onOutsideClick"))},_onMouseOver:function(){"number"==typeof this._options.hoverOpen&&this._toggle.getState()===!1&&(clearTimeout(this._openTimeout),this._openTimeout=setTimeout(Ink.bindMethod(this,"open",!0),1e3*this._options.hoverOpen)),"number"==typeof this._options.dismissAfter&&clearTimeout(this._dismissTimeout)},_onMouseOut:function(){"number"==typeof this._options.dismissAfter&&this._toggle.getState()===!0&&(clearTimeout(this._dismissTimeout),this._dismissTimeout=setTimeout(Ink.bindMethod(this,"dismiss",!0),1e3*this._options.dismissAfter)),"number"==typeof this._options.hoverOpen&&clearTimeout(this._openTimeout)},_onInsideClick:function(a){var b=this._handlerCall("onInsideClick",c.element(a));return b===!1?!1:(this._options.dismissOnInsideClick&&this.dismiss(!0),void c.stop(a))},_onOutsideClick:function(a){var b=c.element(a),e=d.findUpwardsHaving(b,Ink.bind(function(a){return a===this._element},this)),f=d.findUpwardsHaving(b,Ink.bind(function(a){return a===this._options.target},this));if(!e&&!f){var g=this._handlerCall("onOutsideClick",b);if(g===!1)return!1;this._options.dismissOnOutsideClick&&this.dismiss(!0),c.stop(a)}},dismiss:function(a,b){this._openOrDismiss(!1,a,b)},open:function(a,b){this._openOrDismiss(!0,a,b)},_openOrDismiss:function(a,b,c){if(!this._toggle||this._toggle.getState()!==a){if(b&&this._handlerCall(a?"onOpen":"onDismiss")===!1)return!1;c||this._toggle.setState(a),clearTimeout(this._dismissTimeout),clearTimeout(this._openTimeout)}},_handlerCall:function(a){return this._options[a]?this._options[a].call(this,[].slice.call(arguments,1)):void 0}},e}),Ink.createModule("Ink.UI.Droppable","1",["Ink.Dom.Element_1","Ink.Dom.Event_1","Ink.Dom.Css_1","Ink.UI.Common_1","Ink.Util.Array_1","Ink.Dom.Selector_1"],function(a,b,c,d,e,f){"use strict";var g=function(a){return function(b){return c.addClassName(a,b)}},h=function(a){return function(b){return c.removeClassName(a,b)}},i={debug:!1,_droppables:[],_draggables:[],add:function(b,c){b=d.elOrSelector(b,"Droppable.add target element");var e=Ink.extendObj({hoverClass:c.hoverclass||!1,accept:!1,onHover:!1,onDrop:!1,onDropOut:!1},c||{},a.data(b));"string"==typeof e.hoverClass&&(e.hoverClass=e.hoverClass.split(/\s+/));function f(a){a.style.position="inherit"}var g=this,h={move:function(a,b){f(a),b.appendChild(a)},copy:function(a,b){f(a),b.appendChild(a.cloneNode)},revert:function(a){g._findDraggable(a).originalParent.appendChild(a),f(a)}},i;if("string"==typeof e.onHover&&(i=e.onHover,e.onHover=h[i],void 0===e.onHover))throw new Error("Unknown hover event handler: "+i);if("string"==typeof e.onDrop&&(i=e.onDrop,e.onDrop=h[i],void 0===e.onDrop))throw new Error("Unknown drop event handler: "+i);if("string"==typeof e.onDropOut&&(i=e.onDropOut,e.onDropOut=h[i],void 0===e.onDropOut))throw new Error("Unknown dropOut event handler: "+i);var j={element:b,data:{},options:e};this._droppables.push(j),this._update(j)},_findData:function(a){for(var b=this._droppables,c=0,d=b.length;d>c;c++)if(b[c].element===a)return b[c]},_findDraggable:function(a){for(var b=this._draggables,c=0,d=b.length;d>c;c++)if(b[c].element===a)return b[c]},updateAll:function(){e.each(this._droppables,i._update)},update:function(a){this._update(this._findData(a))},_update:function(b){var c=b.data,d=b.element;c.left=a.offsetLeft(d),c.top=a.offsetTop(d),c.right=c.left+a.elementWidth(d),c.bottom=c.top+a.elementHeight(d)},remove:function(a){a=d.elOrSelector(a);for(var b=this._droppables.length,c=0;b>c;c++)if(this._droppables[c].element===a){this._droppables.splice(c,1);break}return b!==this._droppables.length},action:function(a,b,c,d){e.each(this._droppables,Ink.bind(function(i){var j=i.data,k=i.options,l=i.element;(!k.accept||f.matches(k.accept,[d]).length)&&("drag"!==b||this._findDraggable(d)||this._draggables.push({element:d,originalParent:d.parentNode}),a.x>=j.left&&a.x<=j.right&&a.y>=j.top&&a.y<=j.bottom?"drag"===b?(k.hoverClass&&e.each(k.hoverClass,g(l)),k.onHover&&k.onHover(d,l)):"drop"===b&&(k.hoverClass&&e.each(k.hoverClass,h(l)),k.onDrop&&k.onDrop(d,l,c)):"drag"===b&&k.hoverClass?e.each(k.hoverClass,h(l)):"drop"===b&&k.onDropOut&&k.onDropOut(d,l,c))},this))}};return i}),Ink.createModule("Ink.UI.FormValidator","1",["Ink.Dom.Element_1","Ink.Dom.Css_1","Ink.Util.Validator_1","Ink.Dom.Selector_1"],function(a,b,c,d){"use strict";function e(a){if(!a.name)return[];if(!a.form)return d.select('name="'+a.name+'"');var b=a.form[a.name];return"undefined"==typeof b.length&&(b=[b]),b}var f={version:"1",_flagMap:{"ink-fv-required":{msg:"Required field"},"ink-fv-email":{msg:"Invalid e-mail address"},"ink-fv-url":{msg:"Invalid URL"},"ink-fv-number":{msg:"Invalid number"},"ink-fv-phone_pt":{msg:"Invalid phone number"},"ink-fv-phone_cv":{msg:"Invalid phone number"},"ink-fv-phone_mz":{msg:"Invalid phone number"},"ink-fv-phone_ao":{msg:"Invalid phone number"},"ink-fv-date":{msg:"Invalid date"},"ink-fv-confirm":{msg:"Confirmation does not match"},"ink-fv-custom":{msg:""}},elements:{},confirmElms:{},hasConfirm:{},_errorClassName:"tip error",_errorValidationClassName:"validaton",_errorTypeWarningClassName:"warning",_errorTypeErrorClassName:"error",validate:function(a,b){if(this._free(),b=Ink.extendObj({onSuccess:!1,onError:!1,customFlag:!1,confirmGroup:[]},b||{}),"string"==typeof a&&(a=document.getElementById(a)),null===a)return!1;this.element=a,("undefined"==typeof this.element.id||null===this.element.id||""===this.element.id)&&(this.element.id="ink-fv_randomid_"+Math.round(99999*Math.random())),this.custom=b.customFlag,this.confirmGroup=b.confirmGroup;var c=this._validateElements();return c.length>0?(b.onError?b.onError(c):this._showError(a,c),!1):(b.onError||this._clearError(a),this._clearCache(),b.onSuccess&&b.onSuccess(),!0)},reset:function(){this._clearError(),this._clearCache()},_free:function(){this.element=null,this.custom=!1,this.confirmGroup=!1},_clearCache:function(){this.element=null,this.elements=[],this.custom=!1,this.confirmGroup=!1},_getElements:function(){var a=this.elements[this.element.id]=[];this.confirmElms[this.element.id]=[];for(var c=d.select(":input",this.element),e=!1,f=0,g=c.length;g>f;f++){e=c[f];var h=(e.getAttribute("type")+"").toLowerCase();if("radio"===h||"checkbox"===h){if(0===a.length||e.getAttribute("type")!==a[a.length-1].getAttribute("type")&&e.getAttribute("name")!==a[a.length-1].getAttribute("name"))for(var i in this._flagMap)if(b.hasClassName(e,i)){a.push(e);break}}else{for(var j in this._flagMap)if(b.hasClassName(e,j)&&"ink-fv-confirm"!==j){a.push(e);break}b.hasClassName(e,"ink-fv-confirm")&&(this.confirmElms[this.element.id].push(e),this.hasConfirm[this.element.id]=!0)}}},_validateElements:function(){var a;this._getElements(),this.hasConfirm[this.element.id]===!0&&(a=this._makeConfirmGroups());for(var c=[],d=!1,e=!1,f,g=0,h=this.elements[this.element.id].length;h>g;g++)if(f=!1,d=this.elements[this.element.id][g],!d.disabled)for(var i in this._flagMap)if(b.hasClassName(d,i))if("ink-fv-custom"!==i&&"ink-fv-confirm"!==i)this._isValid(d,i)||(f?c[c.length-1].errors.push(i):(c.push({elm:d,errors:[i]}),f=!0));else if("ink-fv-confirm"!==i)e=this._isCustomValid(d),e.length>0&&c.push({elm:d,errors:[i],custom:e});else if("ink-fv-confirm"===i)continue;return c=this._validateConfirmGroups(a,c)},_validateConfirmGroups:function(a,b){var c=!1;for(var d in a)a.hasOwnProperty(d)&&(c=a[d],2===c.length&&c[0].value!==c[1].value&&b.push({elm:c[1],errors:["ink-fv-confirm"]}));return b},_makeConfirmGroups:function(){var a;if(this.confirmGroup&&this.confirmGroup.length>0){a={};for(var c=!1,d=!1,e=0,f=this.confirmElms[this.element.id].length;f>e;e++){c=this.confirmElms[this.element.id][e];for(var g=0,h=this.confirmGroup.length;h>g;g++)d=this.confirmGroup[g],b.hasClassName(c,d)&&("undefined"==typeof a[d]?a[d]=[c]:a[d].push(c))}return a}return 2===this.confirmElms[this.element.id].length&&(a={"ink-fv-confirm":[this.confirmElms[this.element.id][0],this.confirmElms[this.element.id][1]]}),a;return!1},_isCustomValid:function(a){for(var c=[],d=!1,e=0,f=this.custom.length;f>e;e++)d=this.custom[e],b.hasClassName(a,d.flag)&&(d.callback(a,d.msg)||c.push({flag:d.flag,msg:d.msg}));return c},_isValid:function(a,d){var f=a.nodeName.toLowerCase(),g=(a.getAttribute("type")||"").toLowerCase(),h=this._trim(a.value);if("ink-fv-required"!==d&&"checkbox"!==g&&"radio"!==g&&""===h)return!b.hasClassName(a,"ink-fv-required");switch(d){case"ink-fv-required":if("select"===f)return a.selectedIndex>0?!0:!1;if("checkbox"!==g&&"radio"!==g&&""!==h)return!0;if("checkbox"===g||"radio"===g){for(var i=e(a),j=!1,k=0,l=i.length;l>k;k++)if(i[k].checked===!0){j=!0;break}return j}return!1;case"ink-fv-email":return c.mail(a.value);case"ink-fv-url":return c.url(a.value);case"ink-fv-number":return!isNaN(Number(a.value))&&isFinite(Number(a.value));case"ink-fv-phone_pt":return c.isPTPhone(a.value);case"ink-fv-phone_cv":return c.isCVPhone(a.value);case"ink-fv-phone_ao":return c.isAOPhone(a.value);case"ink-fv-phone_mz":return c.isMZPhone(a.value);case"ink-fv-date":var m=Ink.getModule("Ink.Dom.Element",1),n=m.data(a),o="yyyy-mm-dd";if(b.hasClassName(a,"ink-datepicker")&&"format"in n?o=n.format:"validFormat"in n&&(o=n.validFormat),!(o in c._dateParsers)){var p=[];for(var q in c._dateParsers)c._dateParsers.hasOwnProperty(q)&&p.push(q);throw new Error("The attribute data-valid-format must be one of the following values: "+p.join(", "))}return c.isDate(o,a.value);case"ink-fv-custom":}return!1},_showError:function(a,b){this._clearError(a);for(var c=!1,d=0,e=b.length;e>d;d++)c=b[d].elm,c&&this._showAnErrorOnElement(c,b[d])},_showAnErrorOnElement:function(c,d){var e=a.findUpwardsByClass(c,"control-group"),f=a.findUpwardsByClass(c,"control"),g=[this._errorClassName,this._errorTypeClassName].join(" "),h=a.create("p",{className:g});h.innerHTML="ink-fv-custom"!==d.errors[0]?this._flagMap[d.errors[0]].msg:d.custom[0].msg;var i=f||e;i?i.appendChild(h):a.insertAfter(h,c),f&&("ink-fv-required"===d.errors[0]?b.addClassName(e,"validation error"):b.addClassName(e,"validation warning"))},_clearError:function(c){for(var d=c.getElementsByTagName("p"),e,f,g=d.length-1;g>=0;g--)e=d[g],b.hasClassName(e,this._errorClassName)&&(f=a.findUpwardsBySelector(e,".control-group"),f&&b.removeClassName(f,["validation","error","warning"]),b.hasClassName(e,this._errorClassName,!0)&&a.remove(e));var h=c.getElementsByTagName("ul");for(g=h.length-1;g>=0;g--)e=h[g],b.hasClassName(e,"control-group")&&b.removeClassName(e,"validation error")},_trim:function(a){return"string"==typeof a?a.replace(/^\s+|\s+$|\n+$/g,""):void 0}};return f}),Ink.createModule("Ink.UI.FormValidator","2",["Ink.UI.Common_1","Ink.Dom.Element_1","Ink.Dom.Event_1","Ink.Dom.Selector_1","Ink.Dom.Css_1","Ink.Util.Array_1","Ink.Util.I18n_1","Ink.Util.Validator_1"],function(a,b,c,d,e,f,g,h){"use strict";var i={required:function(a){return"undefined"!=typeof a&&!/^\s*$/.test(a)},min_length:function(a,b){return"string"==typeof a&&a.length>=parseInt(b,10)},max_length:function(a,b){return"string"==typeof a&&a.length<=parseInt(b,10)},exact_length:function(a,b){return"string"==typeof a&&a.length===parseInt(b,10)},email:function(a){return"string"==typeof a&&h.mail(a)},url:function(a,b){return b=b||!1,"string"==typeof a&&h.url(a,b)},ip:function(a,b){return"string"!=typeof a?!1:h.isIP(a,b)},phone:function(a,b){if("string"!=typeof a)return!1;var c=b?b.toUpperCase():"";return h["is"+c+"Phone"](a)},credit_card:function(a,b){return"string"!=typeof a?!1:h.isCreditCard(a,b||"default")},date:function(a,b){return"string"==typeof a&&h.isDate(b,a)},alpha:function(a,b){return h.ascii(a,{singleLineWhitespace:b})},text:function(a,b,c){return h.unicode(a,{singleLineWhitespace:b,unicodePunctuation:c})},latin:function(a,b,c){return"string"!=typeof a?!1:h.latin1(a,{latin1Punctuation:b,singleLineWhitespace:c})},alpha_numeric:function(a){return h.ascii(a,{numbers:!0})},alpha_dash:function(a){return h.ascii(a,{dash:!0,underscore:!0})},digit:function(a){return"string"==typeof a&&/^[0-9]{1}$/.test(a)},integer:function(a,b){return h.number(a,{negative:!b,decimalPlaces:0})},decimal:function(a,b,c,d){return h.number(a,{decimalSep:b||".",decimalPlaces:+c||null,maxDigits:+d})},numeric:function(a,b,c,d){return b=b||".",-1!==a.indexOf(b)?i.decimal(a,b,c,d):i.integer(a)},range:function(a,b,c,d){return a=+a,b=+b,c=+c,isNaN(a)||isNaN(b)||isNaN(c)?!1:b>a||a>c?!1:d?(a-b)%d===0:!0},color:function(a){return h.isColor(a)},matches:function(a,b){return a===this.getFormElements()[b][0].getValue()}},j=new g({en_US:{"formvalidator.required":"The {field} filling is mandatory","formvalidator.min_length":"The {field} must have a minimum size of {param1} characters","formvalidator.max_length":"The {field} must have a maximum size of {param1} characters","formvalidator.exact_length":"The {field} must have an exact size of {param1} characters","formvalidator.email":"The {field} must have a valid e-mail address","formvalidator.url":"The {field} must have a valid URL","formvalidator.ip":"The {field} does not contain a valid {param1} IP address","formvalidator.phone":"The {field} does not contain a valid {param1} phone number","formvalidator.credit_card":"The {field} does not contain a valid {param1} credit card","formvalidator.date":"The {field} should contain a date in the {param1} format","formvalidator.alpha":"The {field} should only contain letters","formvalidator.text":"The {field} should only contain alphabetic characters","formvalidator.latin":"The {field} should only contain alphabetic characters","formvalidator.alpha_numeric":"The {field} should only contain letters or numbers","formvalidator.alpha_dashes":"The {field} should only contain letters or dashes","formvalidator.digit":"The {field} should only contain a digit","formvalidator.integer":"The {field} should only contain an integer","formvalidator.decimal":"The {field} should contain a valid decimal number","formvalidator.numeric":"The {field} should contain a number","formvalidator.range":"The {field} should contain a number between {param1} and {param2}","formvalidator.color":"The {field} should contain a valid color","formvalidator.matches":"The {field} should match the field {param1}","formvalidator.validation_function_not_found":"The rule {rule} has not been defined"},pt_PT:{"formvalidator.required":"Preencher {field} é obrigatório","formvalidator.min_length":"{field} deve ter no mínimo {param1} caracteres","formvalidator.max_length":"{field} tem um tamanho máximo de {param1} caracteres","formvalidator.exact_length":"{field} devia ter exactamente {param1} caracteres","formvalidator.email":"{field} deve ser um e-mail válido","formvalidator.url":"O {field} deve ser um URL válido","formvalidator.ip":"{field} não tem um endereço IP {param1} válido","formvalidator.phone":"{field} deve ser preenchido com um número de telefone {param1} válido.","formvalidator.credit_card":"{field} não tem um cartão de crédito {param1} válido","formvalidator.date":"{field} deve conter uma data no formato {param1}","formvalidator.alpha":"O campo {field} deve conter apenas caracteres alfabéticos","formvalidator.text":"O campo {field} deve conter apenas caracteres alfabéticos","formvalidator.latin":"O campo {field} deve conter apenas caracteres alfabéticos","formvalidator.alpha_numeric":"{field} deve conter apenas letras e números","formvalidator.alpha_dashes":"{field} deve conter apenas letras e traços","formvalidator.digit":"{field} destina-se a ser preenchido com apenas um dígito","formvalidator.integer":"{field} deve conter um número inteiro","formvalidator.decimal":"{field} deve conter um número válido","formvalidator.numeric":"{field} deve conter um número válido","formvalidator.range":"{field} deve conter um número entre {param1} e {param2}","formvalidator.color":"{field} deve conter uma cor válida","formvalidator.matches":"{field} deve corresponder ao campo {param1}","formvalidator.validation_function_not_found":"[A regra {rule} não foi definida]"}},"en_US"),k=function(c,d){this._element=a.elOrSelector(c,"Invalid FormElement"),this._errors={},this._rules={},this._value=null,this._options=Ink.extendObj({label:this._getLabel()},b.data(this._element)),this._options=Ink.extendObj(this._options,d||{})};k.prototype={_getLabel:function(){var a=b.findUpwardsByClass(this._element,"control-group"),c=Ink.s("label",a);return c=c?b.textContent(c):this._element.name||this._element.id||""},_parseRules:function(a){this._rules={},a=a.split("|");var b,c=a.length,d,e,f;if(c>0)for(b=0;c>b;b++)if(d=a[b])if(-1!==(f=d.indexOf("["))){e=d.substr(f+1),e=e.split("]"),e=e[0],e=e.split(",");for(var g=0,h=e.length;h>g;g++)e[g]="true"===e[g]?!0:"false"===e[g]?!1:e[g];e.splice(0,0,this.getValue()),d=d.substr(0,f),this._rules[d]=e}else this._rules[d]=[this.getValue()]},_addError:function(a){for(var b=this._rules[a]||[],c={field:this._options.label,value:this.getValue()},d=1;d"),this._errorMessages.push(f)},this)),!1)}},l}),Ink.createModule("Ink.UI.ImageQuery","1",["Ink.UI.Common_1","Ink.Dom.Event_1","Ink.Dom.Element_1","Ink.Util.Array_1"],function(a,b,c,d){"use strict";var e=function(b,d){this._element=a.elsOrSelector(b,"Ink.UI.ImageQuery",!0);for(var f=1;f1&&"retina"in this._options&&(b=a.retina||this._options.retina),a.file=this._filename,"function"==typeof b&&(b=b.apply(this,[this._element,a]),"string"!=typeof b))throw'[ImageQuery] :: "src" callback does not return a string'; +b=b.replace(/{:(.*?)}/g,function(b,c){return a[c]}),this._element.src=b,delete a.file}},500),_findCurrentQuery:function(){for(var a=window.innerWidth||document.documentElement.clientWidth||document.body.clientWidth,b=this._options.queries,c=b.length-1,d=0;c>d;d+=1)if(b[d].width<=a)return b[d];return b[c]},_onLoad:function(){this._options.onLoad.call(this)}},e}),Ink.createModule("Ink.UI.Modal","1",["Ink.UI.Common_1","Ink.Dom.Event_1","Ink.Dom.Css_1","Ink.Dom.Element_1","Ink.Dom.Selector_1","Ink.Util.Array_1"],function(a,b,c,d,e,f){"use strict";var g=function(a){return a.style.opacity="invalid","invalid"!==a.style.opacity}(d.create("div",{style:"opacity: 1"}));function h(a){var b=a.match(/^./)[0];return b.toUpperCase()+a.replace(/^./,"")}function i(a){return"max"+h(a)}var j=[],k=function(f,g){if(this._element=f?a.elOrSelector(f,"Ink.UI.Modal markup"):null,this._options={width:void 0,height:void 0,shadeClass:void 0,modalClass:void 0,trigger:void 0,triggerEvent:"click",autoDisplay:!0,markup:void 0,onShow:void 0,onDismiss:void 0,closeOnClick:!1,closeOnEscape:!0,responsive:!0,disableScroll:!0},this._handlers={click:Ink.bindEvent(this._onShadeClick,this),keyDown:Ink.bindEvent(this._onKeyDown,this),resize:Ink.bindEvent(this._onResize,this)},this._wasDismissed=!1,this._markupMode=this._element?c.hasClassName(this._element,"ink-modal"):!1,this._markupMode){if(this._modalDiv=this._element,this._modalDivStyle=this._modalDiv.style,this._modalShadow=this._modalDiv.parentNode,this._modalShadowStyle=this._modalShadow.style,this._contentContainer=e.select(".modal-body",this._modalDiv)[0],!this._contentContainer)throw new Error('Ink.UI.Modal: Missing div with class "modal-body"');this._options.markup=this._contentContainer.innerHTML,this._options=Ink.extendObj(this._options,d.data(this._element))}else this._modalShadow=document.createElement("div"),this._modalShadowStyle=this._modalShadow.style,this._modalDiv=document.createElement("div"),this._modalDivStyle=this._modalDiv.style,this._element&&(this._options.markup=this._element.innerHTML),c.addClassName(this._modalShadow,"ink-shade"),c.addClassName(this._modalDiv,"ink-modal ink-space"),this._modalShadow.appendChild(this._modalDiv),document.body.appendChild(this._modalShadow);if(this._options=Ink.extendObj(this._options,g||{}),this._markupMode||this.setContentMarkup(this._options.markup),"string"==typeof this._options.shadeClass&&c.addClassName(this._modalShadow,this._options.shadeClass),"string"==typeof this._options.modalClass&&c.addClassName(this._modalDiv,this._options.modalClass),"trigger"in this._options&&"undefined"!=typeof this._options.trigger){var h;"string"==typeof this._options.trigger&&(h=e.select(this._options.trigger),b.observeMulti(h,this._options.triggerEvent,Ink.bindEvent(this.open,this)))}else"true"===this._options.autoDisplay.toString()&&this.open()};return k.prototype={_reposition:function(){this._modalDivStyle.marginTop=-d.elementHeight(this._modalDiv)/2+"px",this._modalDivStyle.marginLeft=-d.elementWidth(this._modalDiv)/2+"px"},_onResize:function(a){"boolean"==typeof a?this._timeoutResizeFunction.call(this):!this._resizeTimeout&&a&&"object"==typeof a&&(this._resizeTimeout=setTimeout(Ink.bind(this._timeoutResizeFunction,this),250))},_timeoutResizeFunction:function(){var a={width:-1!==(""+this._options.width).indexOf("%"),height:-1!==(""+this._options.height).indexOf("%")},b={height:d.viewportHeight(),width:d.viewportWidth()};f.forEach(["height","width"],Ink.bind(function(c){a[c]||(this._modalDivStyle[c]=b[c]>this.originalStatus[c]?this._modalDivStyle[i(c)]:Math.round(.9*b[c])+"px")},this)),this._resizeContainer(),this._reposition(),this._resizeTimeout=void 0},_onShadeClick:function(a){var f=b.element(a);if(c.hasClassName(f,"ink-close")||c.hasClassName(f,"ink-dismiss")||d.findUpwardsBySelector(f,".ink-close,.ink-dismiss")||this._options.closeOnClick&&(!d.descendantOf(this._shadeElement,f)||f===this._shadeElement)){for(var g=e.select(".ink-alert",this._shadeElement),h=g.length,i=0;h>i;i++)if(d.descendantOf(g[i],f))return;this.dismiss(),this._wasDismissed&&b.stop(a)}},_onKeyDown:function(a){27!==a.keyCode||this._wasDismissed||"true"===this._options.closeOnEscape.toString()&&j[j.length-1]===this&&(this.dismiss(),this._wasDismissed&&b.stop(a))},_resizeContainer:function(){this._contentElement.style.overflow=this._contentElement.style.overflowX=this._contentElement.style.overflowY="hidden";var a=d.elementHeight(this._modalDiv);this._modalHeader=e.select(".modal-header",this._modalDiv)[0],this._modalHeader&&(a-=d.elementHeight(this._modalHeader)),this._modalFooter=e.select(".modal-footer",this._modalDiv)[0],this._modalFooter&&(a-=d.elementHeight(this._modalFooter)),this._contentContainer.style.height=a+"px",a!==d.elementHeight(this._contentContainer)&&(this._contentContainer.style.height=~~(a-(d.elementHeight(this._contentContainer)-a))+"px"),this._markupMode||(this._contentContainer.style.overflow=this._contentContainer.style.overflowX="hidden",this._contentContainer.style.overflowY="auto",this._contentElement.style.overflow=this._contentElement.style.overflowX=this._contentElement.style.overflowY="visible")},_disableScroll:function(){var a=document.documentElement;this._oldHtmlOverflows=[a.style.overflowX,a.style.overflowY],a.style.overflowX=a.style.overflowY="hidden"},open:function(e){e&&b.stop(e);var g="CSS1Compat"===document.compatMode?document.documentElement:document.body;this._resizeTimeout=null,c.addClassName(this._modalShadow,"ink-shade"),this._modalShadowStyle.display=this._modalDivStyle.display="block",setTimeout(Ink.bind(function(){c.addClassName(this._modalShadow,"visible"),c.addClassName(this._modalDiv,"visible")},this),100),this._contentElement=this._modalDiv,this._shadeElement=this._modalShadow,this._markupMode||this.setContentMarkup(this._options.markup);var k={width:-1!==(""+this._options.width).indexOf("%"),height:-1!==(""+this._options.height).indexOf("%")};f.forEach(["width","height"],Ink.bind(function(a){void 0!==this._options[a]?(this._modalDivStyle[a]=this._options[a],k[a]||(this._modalDivStyle[i(a)]=d["element"+h(a)](this._modalDiv)+"px")):this._modalDivStyle[i(a)]=d["element"+h(a)](this._modalDiv)+"px",k[a]&&parseInt(g["client"+i(a)],10)<=parseInt(this._modalDivStyle[a],10)&&(this._modalDivStyle[a]=Math.round(.9*parseInt(g["client"+i(a)],10))+"px")},this)),this.originalStatus={viewportHeight:d.elementHeight(g),viewportWidth:d.elementWidth(g),height:d.elementHeight(this._modalDiv),width:d.elementWidth(this._modalDiv)},"true"===this._options.responsive.toString()?(this._onResize(!0),b.observe(window,"resize",this._handlers.resize)):(this._resizeContainer(),this._reposition()),this._options.onShow&&this._options.onShow(this),"true"===this._options.disableScroll.toString()&&this._disableScroll(),b.observe(this._shadeElement,"click",this._handlers.click),"true"===this._options.closeOnEscape.toString()&&b.observe(document,"keydown",this._handlers.keyDown),a.registerInstance(this,this._shadeElement,"modal"),this._wasDismissed=!1,j.push(this),c.addClassName(document.documentElement,"ink-modal-is-open")},dismiss:function(){if(!this._wasDismissed){if(this._options.onDismiss){var a=this._options.onDismiss(this);if(a===!1)return}if(this._wasDismissed=!0,this._options.responsive&&b.stopObserving(window,"resize",this._handlers.resize),this._markupMode?(c.removeClassName(this._modalDiv,"visible"),c.removeClassName(this._modalShadow,"visible"),this._waitForFade(this._modalShadow,Ink.bind(function(){this._modalShadowStyle.display="none"},this))):(this._modalShadow.parentNode.removeChild(this._modalShadow),this.destroy()),j=f.remove(j,f.keyValue(this,j),1),0===j.length){var d=document.documentElement;this._options.disableScroll&&(d.style.overflowX=this._oldHtmlOverflows[0],d.style.overflowY=this._oldHtmlOverflows[1]),c.removeClassName(d,"ink-modal-is-open")}}},_waitForFade:function(a,d){if(!g)return d();for(var e=["transitionEnd","oTransitionEnd","webkitTransitionEnd"],f,h,i=0,j=e.length;j>i;i++)if(h=e[i],f="on"+h.toLowerCase(),f in a)return void b.observeOnce(a,h,d);var k=function(){+c.getStyle(a,"opacity")>0?setTimeout(k,250):d()};setTimeout(k,500)},destroy:function(){a.unregisterInstance(this._instanceId)},getContentElement:function(){return this._contentContainer},setContentMarkup:function(a){if(this._markupMode)this._contentContainer.innerHTML=a;else{if(this._modalDiv.innerHTML=[a].join(""),this._contentContainer=e.select(".modal-body",this._modalDiv),!this._contentContainer.length){var b=e.select(".modal-header",this._modalDiv),g=e.select(".modal-footer",this._modalDiv);f.each(b,d.remove),f.each(g,d.remove);var h=document.createElement("div");c.addClassName(h,"modal-body"),h.innerHTML=this._modalDiv.innerHTML,this._modalDiv.innerHTML="";var i=b.concat([h]).concat(g);f.each(i,Ink.bindMethod(this._modalDiv,"appendChild")),this._contentContainer=e.select(".modal-body",this._modalDiv)}this._contentContainer=this._contentContainer[0]}this._contentElement=this._modalDiv,this._resizeContainer()}},k}),Ink.createModule("Ink.UI.Pagination","1",["Ink.UI.Common_1","Ink.Dom.Event_1","Ink.Dom.Css_1","Ink.Dom.Element_1","Ink.Dom.Selector_1"],function(a,b,c,d,e){"use strict";var f=function(a,b){var c=document.createElement("a");return c.setAttribute("href","#"),void 0!==b&&c.setAttribute("data-index",b),c.innerHTML=a,c},g=function(b,c){if(this._element=a.elOrSelector(b,"Ink.UI.Pagination element"),this._options=a.options("Ink.UI.Pagination_1",{size:["Integer",null],totalItemCount:["Integer",null],itemsPerPage:["Integer",null],maxSize:["Integer",null],start:["Integer",1],firstLabel:["String","First"],lastLabel:["String","Last"],previousLabel:["String","Previous"],nextLabel:["String","Next"],previousPageLabel:["String",null],nextPageLabel:["String",null],onChange:["Function",void 0],hashParameter:["String","page"],parentTag:["String","ul"],childTag:["String","li"],wrapperClass:["String","ink-navigation"],paginationClass:["String","pagination"],activeClass:["String","active"],disabledClass:["String","disabled"],hideClass:["String","hide-all"],previousClass:["String","previous"],previousPageClass:["String","previousPage"],nextClass:["String","next"],nextPageClass:["String","nextPage"],numberFormatter:["Function",function(a){return a+1}]},c||{},this._element),this._options.previousPageLabel||(this._options.previousPageLabel=this._options.previousLabel+" "+this._options.maxSize),this._options.nextPageLabel||(this._options.nextPageLabel=this._options.nextLabel+" "+this._options.maxSize),this._handlers={click:Ink.bindEvent(this._onClick,this)},a.isInteger(this._options.totalItemCount)&&a.isInteger(this._options.itemsPerPage))this._size=Math.ceil(this._options.totalItemCount/this._options.itemsPerPage);else{if(!a.isInteger(this._options.size))throw new TypeError("Ink.UI.Pagination: Please supply a size option or totalItemCount and itemsPerPage options.");this._size=this._options.size}if(!a.isInteger(this._options.start)&&this._options.start>0&&this._options.start<=this._size)throw new TypeError("start option is a required integer between 1 and size!");if(this._options.maxSize&&!a.isInteger(this._options.maxSize)&&this._options.maxSize>0)throw new TypeError("maxSize option is a positive integer!");if(this._size<0)throw new RangeError("size option must be equal or more than 0!");this.setOnChange(this._options.onChange),this._current=this._options.start-1,this._itemLiEls=[],this._init()};return g.prototype={_init:function(){this._generateMarkup(this._element),this._updateItems(),this._observe(),a.registerInstance(this,this._element,"pagination")},_observe:function(){b.observeDelegated(this._element,"click","."+this._options.paginationClass+" > "+this._options.childTag,this._handlers.click)},_updateItems:function(){var a=this._itemLiEls,b=this._size===a.length,d,e,g;if(b)for(d=0,e=this._size;e>d;++d)c.setClassName(a[d],this._options.activeClass,d===this._current);else{for(d=a.length-1;d>=0;--d)this._ulEl.removeChild(a[d]);for(a=[],d=0,e=this._size;e>d;++d)g=document.createElement(this._options.childTag),g.appendChild(f(this._options.numberFormatter(d),d)),c.setClassName(g,this._options.activeClass,d===this._current),this._ulEl.insertBefore(g,this._nextEl),a.push(g);this._itemLiEls=a}if(this._options.maxSize){var h=Math.floor(this._current/this._options.maxSize),i=this._options.maxSize*h,j=i+this._options.maxSize-1;for(d=0,e=this._size;e>d;++d)g=a[d],c.setClassName(g,this._options.hideClass,i>d||d>j);this._pageStart=i,this._pageEnd=j,this._page=h,c.setClassName(this._prevPageEl,this._options.disabledClass,!this.hasPreviousPage()),c.setClassName(this._nextPageEl,this._options.disabledClass,!this.hasNextPage()),c.setClassName(this._firstEl,this._options.disabledClass,this.isFirst()),c.setClassName(this._lastEl,this._options.disabledClass,this.isLast())}c.setClassName(this._prevEl,this._options.disabledClass,!this.hasPrevious()),c.setClassName(this._nextEl,this._options.disabledClass,!this.hasNext())},_generateMarkup:function(a){c.addClassName(a,"ink-navigation");var b,d,g=!1;(b=e.select("."+this._options.paginationClass,a)).length<1?(b=document.createElement(this._options.parentTag),c.addClassName(b,this._options.paginationClass)):(g=!0,b=b[0]),this._options.maxSize&&(d=document.createElement(this._options.childTag),d.appendChild(f(this._options.firstLabel)),this._firstEl=d,c.addClassName(d,this._options.firstClass),b.appendChild(d),d=document.createElement(this._options.childTag),d.appendChild(f(this._options.previousPageLabel)),this._prevPageEl=d,c.addClassName(d,this._options.previousPageClass),b.appendChild(d)),d=document.createElement(this._options.childTag),d.appendChild(f(this._options.previousLabel)),this._prevEl=d,c.addClassName(d,this._options.previousClass),b.appendChild(d),d=document.createElement(this._options.childTag),d.appendChild(f(this._options.nextLabel)),this._nextEl=d,c.addClassName(d,this._options.nextClass),b.appendChild(d),this._options.maxSize&&(d=document.createElement(this._options.childTag),d.appendChild(f(this._options.nextPageLabel)),this._nextPageEl=d,c.addClassName(d,this._options.nextPageClass),b.appendChild(d),d=document.createElement(this._options.childTag),d.appendChild(f(this._options.lastLabel)),this._lastEl=d,c.addClassName(d,this._options.lastClass),b.appendChild(d)),g||a.appendChild(b),this._ulEl=b},_onClick:function(a){b.stop(a);var d=b.element(a);if(!c.hasClassName(d,this._options.activeClass)&&!c.hasClassName(d,this._options.disabledClass)){var e=c.hasClassName(d,this._options.previousClass),f=c.hasClassName(d,this._options.nextClass),g=c.hasClassName(d,this._options.previousPageClass),h=c.hasClassName(d,this._options.nextPageClass),i=c.hasClassName(d,this._options.firstClass),j=c.hasClassName(d,this._options.lastClass);if(i)this.setCurrent(0);else if(j)this.setCurrent(this._size-1);else if(g||h)this.setCurrent((g?-1:1)*this._options.maxSize,!0);else if(e||f)this.setCurrent(e?-1:1,!0);else{var k=Ink.s("[data-index]",d),l=parseInt(k.getAttribute("data-index"),10);this.setCurrent(l)}}},setOnChange:function(a){if(void 0!==a&&"function"!=typeof a)throw new TypeError("onChange option must be a function!");this._onChange=a},setSize:function(b){if(!a.isInteger(b))throw new TypeError("1st argument must be an integer number!");this._size=b,this._updateItems(),this._current=0},setSizeInItems:function(a,b){var c=Math.ceil(a/b);this.setSize(c)},setCurrent:function(b,c){if(!a.isInteger(b))throw new TypeError("1st argument must be an integer number!");c&&(b+=this._current),b>this._size-1&&(b=this._size-1),0>b&&(b=0),this._current=b,this._updateItems(),this._onChange&&this._onChange(this,b)},getSize:function(){return this._size},getCurrent:function(){return this._current},isFirst:function(){return 0===this._current},isLast:function(){return this._current===this._size-1},hasPrevious:function(){return this._current>0},hasNext:function(){return this._currentthis._options.maxSize-1},hasNextPage:function(){return this._options.maxSize&&this._size-this._current>=this._options.maxSize+1},destroy:a.destroyComponent},g}),Ink.createModule("Ink.UI.ProgressBar","1",["Ink.Dom.Selector_1","Ink.Dom.Element_1"],function(a,b){"use strict";var c=function(c,d){if("object"!=typeof c){if("string"!=typeof c)throw"[Ink.UI.ProgressBar] :: Invalid selector";if(this._element=a.select(c),this._element.length<1)throw"[Ink.UI.ProgressBar] :: Selector didn't find any elements";this._element=this._element[0]}else this._element=c;this._options=Ink.extendObj({startValue:0,onStart:function(){},onEnd:function(){}},b.data(this._element)),this._options=Ink.extendObj(this._options,d||{}),this._value=this._options.startValue,this._init()};return c.prototype={_init:function(){if(this._elementBar=a.select(".bar",this._element),this._elementBar.length<1)throw"[Ink.UI.ProgressBar] :: Bar element not found";this._elementBar=this._elementBar[0],this._options.onStart=Ink.bind(this._options.onStart,this),this._options.onEnd=Ink.bind(this._options.onEnd,this),this.setValue(this._options.startValue)},setValue:function(a){this._options.onStart(this._value),a=parseInt(a,10),isNaN(a)||0>a?a=0:a>100&&(a=100),this._value=a,this._elementBar.style.width=this._value+"%",this._options.onEnd(this._value)}},c}),Ink.createModule("Ink.UI.SmoothScroller","1",["Ink.Dom.Event_1","Ink.Dom.Selector_1","Ink.Dom.Loaded_1"],function(a,b,c){"use strict";var d=window.requestAnimationFrame||function(a){return setTimeout(a,10)},e=window.cancelAnimationFrame||function(a){clearTimeout(a)},f={speed:10,getTop:function(a){return Math.round(f.scrollTop()+a.getBoundingClientRect().top)},scrollTop:function(){var a=document.body,b=document.documentElement;return a&&a.scrollTop?a.scrollTop:b&&b.scrollTop?b.scrollTop:window.pageYOffset?window.pageYOffset:0},add:function(b,c,d){a.observe(b,c,d)},end:function(b){a.stopDefault(b)},scroll:function(a){var b=f.scrollTop();b+=a>b?Math.ceil((a-b)/f.speed):(a-b)/f.speed,window.scrollTo(0,b),e(f.interval),b!==a&&f.offsetTop!==b?f.interval=d(Ink.bindMethod(f,"scroll",a),document.body):f.onDone(),f.offsetTop=b},init:function(a){c.run(Ink.bindMethod(f,"render",a))},render:function(c){for(var d=b.select(c||"a.scrollableLink,a.ink-smooth-scroll"),e=0;e li.active > "+h,h='a[name="'+e+'"],#'+e,i=b.select(h)[0],j=b.select(g)[0];j=j&&j.parentNode,"undefined"!=typeof i&&(-1===c.parentNode.className.indexOf("active")&&(j&&(j.className=j.className.replace(/(^|\s+)active($|\s+)/g,"")),c.parentNode.className+=" active"),f.hash=e,f.scroll(f.getTop(i)))}},onDone:function(){window.location.hash=f.hash}};return f}),Ink.createModule("Ink.UI.SortableList","1",["Ink.UI.Common_1","Ink.Dom.Css_1","Ink.Dom.Event_1","Ink.Dom.Element_1","Ink.Dom.Selector_1"],function(a,b,c,d,e){"use strict";var f="ontouchstart"in window||navigator.maxTouchPoints>0||navigator.msMaxTouchPoints>0,g=function(b,c){this._element=a.elOrSelector(b,"Ink.UI.SortableList"),this._options=a.options("Sortable",{placeholderClass:["String","placeholder"],draggedClass:["String","hide-all"],draggingClass:["String","dragging"],dragSelector:["String","li"],dragObject:["String",null],handleSelector:["String",null],moveSelector:["String",!1],swap:["Boolean",!1],cancelMouseOut:["Boolean",!1]},c||{},this._element),null!=this._options.dragObject&&(Ink.warn("Ink.UI.SortableList: options.dragObject is now deprecated. Please use options.handleSelector instead."),this._options.handleSelector=this._options.handleSelector||this._options.dragObject),this._handlers={down:Ink.bind(this._onDown,this),move:Ink.bind(this._onMove,this),up:Ink.bind(this._onUp,this)},this._isMoving=!1,this._init()};return g.prototype={_init:function(){this._down=f?"touchstart mousedown":"mousedown",this._move=f?"touchmove mousemove":"mousemove",this._up=f?"touchend mouseup":"mouseup",this._observe(),a.registerInstance(this,this._element,"sortableList")},_observe:function(){c.on(this._element,this._down,this._options.dragSelector,this._handlers.down),c.on(this._element,this._move,this._options.dragSelector,this._handlers.move),this._options.cancelMouseOut&&c.on(this._element,"mouseleave",Ink.bind(this.stopMoving,this)),c.on(document.documentElement,this._up,this._handlers.up)},_onDown:function(a){if(!(this._isMoving||this._placeholder||this._options.handleSelector&&!e.matchesSelector(a.target,this._options.handleSelector))){var b=a.currentTarget;return this._isMoving=b,this._placeholder=b.cloneNode(!0),this._movePlaceholder(b),this._addMovingClasses(),!1}},_onMove:function(a){return this.validateMove(a.currentTarget),!1},_onUp:function(a){return this._isMoving&&this._placeholder&&a.currentTarget!==this._isMoving&&a.currentTarget!==this._placeholder?(d.insertBefore(this._isMoving,this._placeholder),this.stopMoving(),!1):void 0},_addMovingClasses:function(){b.addClassName(this._placeholder,this._options.placeholderClass),b.addClassName(this._isMoving,this._options.draggedClass),b.addClassName(document.documentElement,this._options.draggingClass)},_removeMovingClasses:function(){this._isMoving&&b.removeClassName(this._isMoving,this._options.draggedClass),this._placeholder&&b.removeClassName(this._placeholder,this._options.placeholderClass),b.removeClassName(document.documentElement,this._options.draggingClass)},_movePlaceholder:function(a){var b=this._placeholder,c,e,f,g;b?this._options.swap?(d.insertAfter(b,a),d.insertBefore(a,this._isMoving),d.insertBefore(this._isMoving,b)):(c=d.offset(a),e=d.offset(this._placeholder),f=c[1]>e[1],g=c[0]>e[0],f&&g||!f&&!g?d.insertBefore(b,a):d.insertAfter(b,a),d.insertBefore(this._isMoving,b)):d.insertAfter(b,a)},destroy:a.destroyComponent,stopMoving:function(){this._removeMovingClasses(),d.remove(this._placeholder),this._placeholder=!1,this._isMoving=!1},validateMove:function(a){this._isMoving&&this._placeholder&&a!==this._placeholder&&a!==this._isMoving&&(!this._options.moveSelector||e.matchesSelector(a,this._options.moveSelector)?this._movePlaceholder(a):this.stopMoving())}},g}),Ink.createModule("Ink.UI.Spy","1",["Ink.UI.Common_1","Ink.Dom.Event_1","Ink.Dom.Css_1","Ink.Dom.Element_1","Ink.Dom.Selector_1"],function(a,b,c,d,e){"use strict";var f=[];function g(a){for(var b=0,c=f.length;c>b;b++)if(f[b][0]===a)return b;return null}function h(a,b){var c=g(b);null===c?f.push([b,[a]]):f[c][1].push(a)}var i=!1;function j(){i||(i=!0,b.observe(document,"scroll",b.throttle(k,300)))}function k(){for(var a=0,b=f.length;b>a;a++)l(f[a][0],f[a][1])}function l(a,b){for(var f=m(b),g=e.select("li.active",a),h=0,i=g.length;i>h;h++)c.removeClassName(g[h],"active");if(null!==f){var j='a[href$="#'+(f.name||f.id)+'"]',k=e.select(j,a);for(h=0,i=k.length;i>h;h++)c.addClassName(d.findUpwardsByTag(k[h],"li"),"active")}}function m(a){for(var b=-1/0,c,d,e=0,f=a.length;f>e;e++)d=a[e].getBoundingClientRect(),d.top<=0&&d.top>b&&(b=d.top,c=e);return void 0===c?null:a[c]}var n=function(b,c){this._rootElement=a.elOrSelector(b,"1st argument"),this._options=Ink.extendObj({target:void 0,activeClass:"active"},d.data(this._rootElement)),this._options=Ink.extendObj(this._options,c||{}),this._options.target=a.elOrSelector(this._options.target,"Target"),this._init()};return n.prototype={_init:function(){h(this._rootElement,this._options.target),j(),k()}},n}),Ink.createModule("Ink.UI.Stacker",1,["Ink.UI.Common_1","Ink.Dom.Event_1","Ink.Dom.Element_1"],function(a,b,c){"use strict";function d(a,b){this._init(a,b)}return d.prototype={_init:function(b,c){this._rootElm=a.elsOrSelector(b,"Ink.UI.Stacker root element")[0]||null,null===this._rootElm&&"undefined"!=typeof console&&console.warn("Ink.UI.Stacker: No root element"),this._options=a.options({column:["String",".stacker-column"],item:["String",".stacker-item"],customBreakPoints:["Object",null],largeMax:["Number",Number.MAX_VALUE],largeMin:["Number",961],mediumMax:["Number",960],mediumMin:["Number",651],smallMax:["Number",650],smallMin:["Number",0],largeCols:["Integer",3],mediumCols:["Integer",2],smallCols:["Integer",1],isOrdered:["Boolean",!0],onRunCallback:["Function",null],onResizeCallback:["Function",null],onAPIReloadCallback:["Function",null]},c||{},this._rootElm),this._aList=[],this._curLayout="large",this._runFirstTime=!1,this._getPageItemsToList(),(this._canApplyLayoutChange()||!this._runFirstTime)&&(this._runFirstTime=!0,this._applyLayoutChange(),"function"==typeof this._options.onRunCallback&&this._options.onRunCallback(this._curLayout)),this._addEvents()},addItem:function(a){this._aList.push(a)},reloadItems:function(){this._applyLayoutChange(),"function"==typeof this._options.onAPIReloadCallback&&this._options.onAPIReloadCallback(this._curLayout)},_addEvents:function(){b.observe(window,"resize",Ink.bindEvent(this._onResize,this))},_onResize:function(){this._canApplyLayoutChange()&&(this._removeDomItems(),this._applyLayoutChange(),"function"==typeof this._options.onResizeCallback&&this._options.onResizeCallback(this._curLayout))},_setCurLayout:function(){var a=c.viewportWidth();if(this._options.customBreakpoints&&"object"==typeof this._options.customBreakPoints){for(var b in this._options.customBreakPoints)if(this._options.customBreakPoints.hasOwnProperty(b)&&a>=Number(this._options.customBreakPoints[b].min)&&a<=Number(this._options.customBreakPoints[b].max)&&this._curLayout!==b)return void(this._curLayout=b)}else a<=Number(this._options.largeMax)&&a>=Number(this._options.largeMin)&&"large"!==this._curLayout?this._curLayout="large":a>=Number(this._options.mediumMin)&&a<=Number(this._options.mediumMax)&&"medium"!==this._curLayout?this._curLayout="medium":a>=Number(this._options.smallMin)&&a<=Number(this._options.smallMax)&&"small"!==this._curLayout&&(this._curLayout="small")},_getColumnsToShow:function(){return Number(this._options.customBreakPoints&&"object"==typeof this._options.customBreakPoints?this._options.customBreakPoints[this._curLayout].cols:this._options[this._curLayout+"Cols"])},_canApplyLayoutChange:function(){var a=this._curLayout;return this._setCurLayout(),a!==this._curLayout?!0:!1},_getPageItemsToList:function(){this._aColumn=Ink.ss(this._options.column,this._rootElm);var a=this._aColumn.length,b=0;if(a>0){for(var c=0;c0&&this._options.isOrdered){for(var f=[],g=0;g0)for(var b=0;a>b;b++)for(var c=Ink.ss(this._options.item,this._aColumn[b]),d=c.length-1;d>=0;d--)c[d].parentNode.removeChild(c[d])},_applyLayoutChange:function(){var a=this._getColumnsToShow(),b=this._aList.length,c=0,d=0;if(a>0)for(;a>d;){if(this._aColumn[d].appendChild(this._aList[c]),c++,d++,c===b)return;d===a&&(d=0)}}},d}),Ink.createModule("Ink.UI.Sticky","1",["Ink.UI.Common_1","Ink.Dom.Event_1","Ink.Dom.Element_1","Ink.Dom.Css_1"],function(a,b,c,d){"use strict";var e=function(b,d){this._rootElement=a.elOrSelector(b,"Ink.UI.Sticky_1"),this._options=a.options({offsetBottom:["Integer",0],offsetTop:["Integer",0],topElement:["Element",null],wrapperClass:["String","ink-sticky-wrapper"],stickyClass:["String","ink-sticky-stuck"],inlineDimensions:["Boolean",!0],inlinePosition:["Boolean",!0],bottomElement:["Element",null],activateInLayouts:["String","medium,large"]},d||{},this._rootElement),this._options.activateInLayouts=this._options.activateInLayouts.toString(),this._dims=null,this._options.offsetTop=parseInt(this._options.offsetTop,10)||0,this._options.offsetBottom=parseInt(this._options.offsetBottom,10)||0,this._options.topElement&&(this._options.topElement=a.elOrSelector(this._options.topElement,"Top Element")),this._options.bottomElement&&(this._options.bottomElement=a.elOrSelector(this._options.bottomElement,"Sticky bottom Element")),this._wrapper=c.create("div",{className:this._options.wrapperClass}),c.wrap(this._rootElement,this._wrapper),this._init()};return e.prototype={_init:function(){var a=document.addEventListener?document:window;this._onScroll=Ink.bind(b.throttle(this._onScroll,33),this),b.observe(a,"scroll",this._onScroll),b.observe(window,"resize",Ink.bindEvent(b.throttle(this._onResize,100),this)),this._onScroll()},_isDisabledInLayout:function(){var b=a.currentLayout();return b?-1===this._options.activateInLayouts.indexOf(b):!1},_onScroll:function(){var a=this._getDims(),b=c.scrollHeight(),d=this._isDisabledInLayout()||b<=a.top-this._options.offsetTop||this._options.topElement&&this._options.topElement.getBoundingClientRect().bottom+this._options.offsetTop>0;if(d)return void this._unstick();var e=this._options.offsetTop+a.height+c.scrollHeight(),f=document.body.scrollHeight;this._options.bottomElement&&(f=this._options.bottomElement.getBoundingClientRect().top+c.scrollHeight()),f-=this._options.offsetBottom,this._stickTo(f>e?"screen":"bottom")},_stickTo:function(a){var b=this._rootElement.style,e=this._getDims();if(d.addClassName(this._rootElement,this._options.stickyClass),this._wrapper.style.height=e.height+"px",this._inlineDimensions(e.height+"px",e.width+"px"),this._options.inlinePosition!==!1)if(b.left=e.left+"px","screen"===a)b.bottom=null,b.top=this._options.offsetTop+"px";else if("bottom"===a){var f=this._getBottomOffset(),g=c.scrollHeight()+c.viewportHeight(),h=c.pageHeight()-g;b.bottom=f-h+"px",b.top="auto"}},_unstick:function(){d.removeClassName(this._rootElement,this._options.stickyClass),this._inlineDimensions(null,null),this._options.inlinePosition&&(this._rootElement.style.left=null,this._rootElement.style.top=null,this._rootElement.style.bottom=null),this._wrapper.style.height=null,this._wrapper.style.width=null,this._dims=null},_onResize:function(){this._dims=null,this._onScroll()},_getDims:function(){if(null!==this._dims)return this._dims;var a=this._rootElement.style,b=a.position,d=a.width;a.position="static",a.width=null;var e=c.outerDimensions(this._rootElement),f=this._wrapper.getBoundingClientRect();return this._dims={height:e[1],width:e[0],left:f.left+c.scrollWidth(),top:f.top+c.scrollHeight()},a.position=b,a.width=d,this._dims},_inlineDimensions:function(a,b){this._options.inlineDimensions&&(this._rootElement.style.height=a,this._rootElement.style.width=b)},_getBottomOffset:function(){var a=this._options.offsetBottom;return this._options.bottomElement&&(a+=c.pageHeight()-c.offsetTop(this._options.bottomElement)),a}},e}),Ink.createModule("Ink.UI.Swipe","1",["Ink.Dom.Event_1","Ink.Dom.Element_1","Ink.UI.Common_1"],function(a,b,c){"use strict";function d(a,d){a=c.elOrSelector(a,"Swipe target"),this._options=Ink.extendObj({onEnd:void 0,onStart:void 0,onMove:void 0,minDist:void 0,maxDist:void 0,minDuration:void 0,maxDuration:void 0,axis:void 0,storeGesture:!1,stopEvents:!0},b.data(a),d||{}),"function"==typeof d&&(this._options.onEnd=d),this._handlers={down:Ink.bindEvent(this._onDown,this),move:Ink.bindEvent(this._onMove,this),up:Ink.bindEvent(this._onUp,this)},this._element=a,this._init()}return d.prototype={version:"0.1",_supported:"ontouchstart"in document.documentElement,_init:function(){var b=document.body;a.observe(b,"touchstart",this._handlers.down),(this._options.storeGesture||this._options.onMove)&&a.observe(b,"touchmove",this._handlers.move),a.observe(b,"touchend",this._handlers.up),this._isOn=!1},_isMeOrParent:function(a,b){if(a){do{if(a===b)return!0;a=a.parentNode}while(a);return!1}},_pushGesture:function(a,b){this._options.storeGesture&&(this._gesture.push(a),this._time.push(b))},_onDown:function(b){1===b.changedTouches.length&&this._isMeOrParent(b.target,this._element)&&(this._options.stopEvents===!0&&a.stop(b),b=b.changedTouches[0],this._isOn=!0,this._target=b.target,this._t0=+new Date,this._p0=[b.pageX,b.pageY],this._options.storeGesture&&(this._gesture=[],this._time=[]),this._pushGesture(this._p0,0),this._options.onStart&&this._options.onStart({event:b,element:this._element,instance:this,position:this._p0,dt:0})) +},_onMove:function(b){if(this._isOn&&1===b.changedTouches.length){this._options.stopEvents===!0&&a.stop(b),b=b.changedTouches[0];var c=+new Date,d=c-this._t0,e=[b.pageX,b.pageY];this._pushGesture(e,d),this._options.onMove&&this._options.onMove({event:b,element:this._element,instance:this,position:e,dt:d})}},_onUp:function(b){if(this._isOn&&1===b.changedTouches.length){this._options.stopEvents===!0&&a.stop(b),b=b.changedTouches[0],this._isOn=!1;var c=+new Date,d=[b.pageX,b.pageY],e=c-this._t0,f=[d[0]-this._p0[0],d[1]-this._p0[1]],g=Math.sqrt(f[0]*f[0]+f[1]*f[1]),h=Math.abs(f[0])>Math.abs(f[1])?"x":"y",i=this._options;i.minDist&&gi.maxDist||i.minDuration&&ei.maxDuration||i.axis&&h!==i.axis||this._options.onEnd&&this._options.onEnd({event:b,element:this._element,instance:this,gesture:this._gesture,time:this._time,axis:h,overallMovement:f,overallTime:e})}}},d}),Ink.createModule("Ink.UI.Table","1",["Ink.Util.Url_1","Ink.UI.Pagination_1","Ink.Net.Ajax_1","Ink.UI.Common_1","Ink.Dom.Event_1","Ink.Dom.Css_1","Ink.Dom.Element_1","Ink.Dom.Selector_1","Ink.Util.Array_1","Ink.Util.String_1","Ink.Util.Json_1"],function(a,b,c,d,e,f,g,h,i,j,k){"use strict";var l=/\d/g;function m(a){return!isNaN(a)&&l.test(a)?parseInt(a,10):isNaN(a)?a:parseFloat(a)}function n(a,b){return a===b?0:a>b?1:-1}function o(a,b){var c=m(g.textContent(a)),d=m(g.textContent(b));return n(c,d)}function p(a){if("undefined"!=typeof Object.keys)return Object.keys(a);var b=[];for(var c in a)a.hasOwnProperty(c)&&b.push(c);return b}function q(a){return a}var r=function(a,b){if(this._rootElement=d.elOrSelector(a,"Ink.UI.Table :"),"table"!==this._rootElement.nodeName.toLowerCase())throw new Error("[Ink.UI.Table] :: The element is not a table");this._options=d.options({pageSize:["Integer",null],endpoint:["String",null],createEndpointUrl:["Function",null],getDataFromEndPoint:["Function",null],processJSONRows:["Function",q],processJSONRow:["Function",q],processJSONField:["Function",q],processJSONHeaders:["Function",function(a){return a.fields}],processJSONTotalRows:["Function",function(a){return a.length||a.totalRows}],getSortKey:["Function",null],pagination:["Element",null],allowResetSorting:["Boolean",!1],visibleFields:["String",null],tdClassNames:["Object",{}],paginationOptions:["Object",null]},b||{},this._rootElement),this._markupMode=!this._options.endpoint,this._options.visibleFields&&(this._options.visibleFields=this._options.visibleFields.toString().split(/[, ]+/g)),this._thead=this._rootElement.tHead||this._rootElement.createTHead(),this._headers=h.select("th",this._thead),this._handlers={thClick:null},this._originalFields=[],this._sortableFields={},this._originalData=this._data=[],this._pagination=null,this._totalRows=0,this._handlers.thClick=e.observeDelegated(this._rootElement,"click",'thead th[data-sortable="true"]',Ink.bindMethod(this,"_onThClick")),this._init()};return r.prototype={_init:function(){this._markupMode?(this._resetSortOrder(),this._addHeadersClasses(),this._data=h.select("tbody tr",this._rootElement),this._originalData=this._data.slice(0),this._totalRows=this._data.length,this._setPagination()):this._getData()},_addHeadersClasses:function(){for(var a,b,c=0,d=this._headers.length;d>c;c++)a=g.textContent(this._headers[c]),b=this._options.tdClassNames[a],b&&f.addClassName(this._headers[c],b)},_onThClick:function(a){var b=e.element(a),c=void 0!==this._options.pageSize;e.stop(a);var f=i.keyValue(b,this._headers,!0),g=f!==!1&&void 0!==this._sortableFields[f];if(g)if(!this._markupMode&&c)this._invertSortOrder(f,!1);else{"desc"===this._sortableFields[f]&&this._options.allowResetSorting?(this._setSortOrderOfColumn(f,null),this._data=this._originalData.slice(0)):this._invertSortOrder(f,!0);var j=h.select("tbody",this._rootElement)[0];d.cleanChildren(j),i.each(this._data,Ink.bindMethod(j,"appendChild")),this._pagination&&(this._pagination.setCurrent(0),this._paginate(1))}},_invertSortOrder:function(a,b){for(var c="asc"===this._sortableFields[a],d=0,e=this._headers.length;e>d;d++)this._setSortOrderOfColumn(d,null);b&&(this._sort(a),c&&this._data.reverse()),this._setSortOrderOfColumn(a,!c)},_setSortOrderOfColumn:function(a,b){var c=this._headers[a],d="",e="none";b===!0?(d='',e="asc"):b===!1&&(d='',e="desc"),this._sortableFields[a]=e,c.innerHTML=g.textContent(c)+d},_paginate:function(a){if(this._pagination){var b=this._options.pageSize,c=(a-1)*b,d=c+b;i.each(this._data,function(a,b){b>=c&&d>b?f.removeClassName(a,"hide-all"):f.addClassName(a,"hide-all")})}},_registerFieldNames:function(a){this._originalFields=[],i.forEach(a,Ink.bind(function(a){this._fieldIsVisible(a)&&this._originalFields.push(a)},this))},_fieldIsVisible:function(a){return!this._options.visibleFields||-1!==this._options.visibleFields.indexOf(a)},_sort:function(a){var b=g.textContent(this._headers[a]),c=this._options.getSortKey;c&&(c="function"==typeof c[b]?c[b]:"function"==typeof c?c:null);var d=this;this._data.sort(function(b,d){var f=Ink.ss("td",b)[a],g=Ink.ss("td",d)[a];return c?n(e(f),e(g)):o(f,g,a)});function e(e){return c.call(d,{columnIndex:a,columnName:b,data:g.textContent(e),element:e})}},_createHeadersFromJson:function(a){if(this._registerFieldNames(p(a)),!this._thead.children.length)for(var b=this._thead.insertRow(0),c,d=0,e=a.length;e>d;d++)this._fieldIsVisible(a[d])&&(c=g.create("th"),c=this._createSingleHeaderFromJson(a[d],c),b.appendChild(c),this._headers.push(c))},_createSingleHeaderFromJson:function(a,b){return a.sortable&&b.setAttribute("data-sortable","true"),a.label&&g.setTextContent(b,a.label),b},_resetSortOrder:function(){for(var a=0,b=this._headers.length;b>a;a++){var c=g.data(this._headers[a]);c.sortable&&"true"===c.sortable.toString()&&(this._sortableFields[a]="none")}},_createRowsFromJSON:function(a){var b=h.select("tbody",this._rootElement)[0];b?g.setHTML(b,""):(b=document.createElement("tbody"),this._rootElement.appendChild(b)),this._data=[];var c;for(var d in a)a.hasOwnProperty(d)&&(c=this._options.processJSONRow(a[d]),this._createSingleRowFromJson(b,c,d));this._originalData=this._data.slice(0)},_createSingleRowFromJson:function(a,b,c){var d=document.createElement("tr");a.appendChild(d);for(var e in b)b.hasOwnProperty(e)&&this._createFieldFromJson(d,b[e],e,c);this._data.push(d)},_createFieldFromJson:function(a,b,c,d){if(this._fieldIsVisible(c)){var e=this._options.processJSONField[c]||this._options.processJSONField,g;g="function"==typeof e?e(b,c,d):b;var h=this._elOrFieldData(g),i=this._options.tdClassNames[c];i&&f.addClassName(h,i),a.appendChild(h)}},_elOrFieldData:function(a){if(d.isDOMElement(a))return a;var b="string"==typeof a,c="number"==typeof a,e=g.create("td");if(b&&/^\s*?=this._options.maxTags)){if(!this._options.allowRepeated&&f.inArray(c,this._tags,c)||!c)return!1;var d=a.create("span",{className:"ink-tag",setTextContent:c+" "}),e=a.create("span",{className:"remove icon icon-remove icon-times",insertBottom:d});b.observe(e,"click",Ink.bindEvent(this._removeTag,this,null));var g=document.createTextNode(" ");this._tags.push(c),this._viewElm.insertBefore(d,this._input),this._viewElm.insertBefore(g,this._input),this._tagsToMarkup(this._tags,this._element)}},_readInput:function(a){return this._options.separator?f.filter(a.split(this._options.separator),k):[a]},_onKeyUp:function(){if(this._options.autoSplit){var a=this._input.value.split(this._options.separator);if(!(a.length<=1)){var b=a[a.length-1];a=a.splice(0,a.length-1),a=f.filter(a,k),f.each(a,Ink.bind(this._addTag,this)),this._input.value=b}}},_onKeyDown:function(a){return a.which===i?this._onEnterKeyDown(a):a.which===j?this._onBackspaceKeyDown():void(this._removeConfirm&&this._unsetRemovingVisual(this._tags.length-1))},_onBackspaceKeyDown:function(){this._input.value||(this._removeConfirm?(this._unsetRemovingVisual(this._tags.length-1),this._removeTag(this._tags.length-1),this._removeConfirm=null):this._setRemovingVisual(this._tags.length-1))},_onEnterKeyDown:function(a){var c=this._input.value;c&&(this._addTag(c),this._input.value=""),b.stopDefault(a)},_onBlur:function(){this._addTag(this._input.value),this._input.value=""},_setRemovingVisual:function(a){var d=this._viewElm.children[a];c.addClassName(d,"tag-deleting"),this._removeRemovingVisualTimeout=setTimeout(Ink.bindMethod(this,"_unsetRemovingVisual",a),4e3),b.observe(this._input,"blur",Ink.bindMethod(this,"_unsetRemovingVisual",a)),this._removeConfirm=!0},_unsetRemovingVisual:function(a){var b=this._viewElm.children[a];b&&(c.removeClassName(b,"tag-deleting"),clearTimeout(this._removeRemovingVisualTimeout)),this._removeConfirm=null},_removeTag:function(c){var d;if("object"==typeof c){var e=b.element(c).parentNode;d=a.parentIndexOf(this._viewElm,e)}else"number"==typeof c&&(d=c);this._tags=f.remove(this._tags,d,1),a.remove(this._viewElm.children[d]),this._tagsToMarkup(this._tags,this._element)},_refocus:function(a){return this._input.focus(),b.stop(a),!1}},l}),Ink.createModule("Ink.UI.Toggle","1",["Ink.UI.Common_1","Ink.Dom.Event_1","Ink.Dom.Css_1","Ink.Dom.Element_1","Ink.Dom.Selector_1","Ink.Util.Array_1"],function(a,b,c,d,e,f){"use strict";var g=function(b,e){if(this._rootElement=a.elOrSelector(b,"[Ink.UI.Toggle root element]:"),this._options=Ink.extendObj({target:void 0,triggerEvent:"click",closeOnClick:!0,isAccordion:!1,initialState:null,classNameOn:"show-all",classNameOff:"hide-all",togglesDisplay:null,closeOnInsideClick:"a[href]",onChangeState:null},e||{},d.data(this._rootElement)),this._targets=a.elsOrSelector(this._options.target,"Ink.UI.Toggle target option"),this._options.closeOnClick="true"===this._options.closeOnClick.toString(),this._options.initialState=null!==this._options.initialState?"true"===this._options.initialState.toString():"none"!==c.getStyle(this._targets[0],"display"),"show-all"!==this._options.classNameOn||"hide-all"!==this._options.classNameOff)for(var f=0,g=this._targets.length;g>f;f++)c.removeClassName(this._targets[f],"show-all"),c.removeClassName(this._targets[f],"hide-all");this._init()};return g.prototype={_init:function(){if(this._accordion=c.hasClassName(this._rootElement.parentNode,"accordion")||c.hasClassName(this._targets[0].parentNode,"accordion"),this._firstTime=!0,this._bindEvents(),null!==this._options.initialState)this.setState(this._options.initialState,!0);else{var a="none"!==c.getStyle(this._targets[0],"display");this.setState(a,!0)}for(var b=0,d=this._targets.length;d>b;b++)this._targets[b].style.display&&(this._targets[b].style.display="")},_bindEvents:function(){if(this._options.triggerEvent&&b.observe(this._rootElement,this._options.triggerEvent,Ink.bind(this._onTriggerEvent,this)),this._options.closeOnClick&&b.observe(document,"click",Ink.bind(this._onOutsideClick,this)),this._options.closeOnInsideClick){var a=this._options.closeOnInsideClick;"true"===a.toString()&&(a="*"),b.observeMulti(this._targets,"click",Ink.bind(function(c){d.findUpwardsBySelector(b.element(c),a)&&this.setState(!1,!0)},this))}},_onTriggerEvent:function(a){var c=b.element(a),e=f.some(this._targets,function(a){return a===c||d.isAncestorOf(a,c)});if(!e){this._accordion&&this._updateAccordion();var g=this.getState();this.setState(!g,!0),!g&&this._firstTime&&(this._firstTime=!1),b.stopDefault(a)}},_updateAccordion:function(){var a,b;b=c.hasClassName(this._targets[0].parentNode,"accordion")?this._targets[0].parentNode:this._targets[0].parentNode.parentNode,a=e.select(".toggle, .ink-toggle",b);for(var f=0;f0&&h[0]!==this._targets[0]&&(h[0].style.display="none")}},_onOutsideClick:function(a){var c=b.element(a),e,g=f.some(this._targets,function(a){return d.isAncestorOf(a,c)||a===c});if(this._rootElement!==c&&!d.isAncestorOf(this._rootElement,c)&&!g){if((e=Ink.ss(".ink-shade")).length)for(var h=e.length,i=0;h>i;i++)if(d.isAncestorOf(e[i],c)&&d.isAncestorOf(e[i],this._rootElement))return;this.setState(!1,!0)}},setState:function(a,b){if(a!==this.getState()){if(b&&"function"==typeof this._options.onChangeState){var d=this._options.onChangeState(a);if(d===!1)return!1}for(var e=0,f=this._targets.length;f>e;e++)c.addRemoveClassName(this._targets[e],this._options.classNameOn,a),c.addRemoveClassName(this._targets[e],this._options.classNameOff,!a);c.addRemoveClassName(this._rootElement,"active",a)}},getState:function(){return c.hasClassName(this._rootElement,"active")}},g}),Ink.createModule("Ink.UI.Tooltip","1",["Ink.UI.Common_1","Ink.Dom.Event_1","Ink.Dom.Element_1","Ink.Dom.Selector_1","Ink.Util.Array_1","Ink.Dom.Css_1","Ink.Dom.Browser_1"],function(a,b,c,d,e,f){"use strict";function g(a,b){this._init(a,b||{})}function h(a,b){this._init(a,b)}var i,j,k;!function(){for(var a=document.createElement("DIV"),b=["transition","oTransition","msTransition","mozTransition","webkitTransition"],c=0;ce;e++)this.tooltips[e]=new h(this,c[e])},destroy:function(){e.each(this.tooltips,function(a){a._destroy()}),this.tooltips=null,this.options=null}},h.prototype={_oppositeDirections:{left:"right",right:"left",up:"down",down:"up"},_init:function(a,c){b.observe(c,"mouseover",Ink.bindEvent(this._onMouseOver,this)),b.observe(c,"mouseout",Ink.bindEvent(this._onMouseOut,this)),b.observe(c,"mousemove",Ink.bindEvent(this._onMouseMove,this)),this.root=a,this.element=c,this._delayTimeout=null,this.tooltip=null},_makeTooltip:function(a){if(!this._getOpt("text")&&!this._getOpt("html")&&!c.hasAttribute(this.element,"title"))return!1;var d=this._createTooltipElement();this.tooltip&&this._removeTooltip(),this.tooltip=d,this._fadeInTooltipElement(d),this._placeTooltipElement(d,a),b.observe(d,"mouseover",Ink.bindEvent(this._onTooltipMouseOver,this));var e=this._getFloatOpt("timeout");e&&setTimeout(Ink.bind(function(){this.tooltip===d&&this._removeTooltip()},this),1e3*e)},_createTooltipElement:function(){var b=this._getOpt("template"),e=this._getOpt("templatefield"),g,h;if(b){var i=document.createElement("DIV");if(i.innerHTML=a.elOrSelector(b,"options.template").outerHTML,g=i.firstChild,e){if(h=d.select(e,g),!h)throw"options.templatefield must be a valid selector within options.template";h=h[0]}else h=g}else g=document.createElement("DIV"),f.addClassName(g,"ink-tooltip"),f.addClassName(g,this._getOpt("color")),h=document.createElement("DIV"),f.addClassName(h,"content"),g.appendChild(h);return this._getOpt("html")?h.innerHTML=this._getOpt("html"):this._getOpt("text")?c.setTextContent(h,this._getOpt("text")):c.setTextContent(h,this.element.getAttribute("title")),g.style.display="block",g.style.position="absolute",g.style.zIndex=this._getIntOpt("zIndex"),g},_fadeInTooltipElement:function(a){var b=this._getFloatOpt("fade");i&&b&&(a.style.opacity="0",a.style[i]=b+"s",a.style[j]="opacity",a.style[k]="ease-in-out",setTimeout(function(){a.style.opacity="1"},0))},_placeTooltipElement:function(a,b){var d=this._getOpt("where");if("mousemove"===d||"mousefix"===d){var e=b;this._setPos(e[0],e[1]),m.appendChild(a)}else if(d.match(/(up|down|left|right)/)){m.appendChild(a);var g=c.offset(this.element),h=g[0],i=g[1],j=c.elementWidth(this.element)/2-c.elementWidth(a)/2,k=c.elementHeight(this.element)/2-c.elementHeight(a)/2,l=this._getIntOpt("spacing"),n=c.elementDimensions(a),o=c.elementDimensions(this.element),p=c.scrollWidth()+c.viewportWidth(),q=c.scrollHeight()+c.viewportHeight();d=this._getWhereValueInsideViewport(d,{left:h-n[0],right:h+n[0],top:i+n[1],bottom:i+n[1]},{right:p,bottom:q}),"up"===d?(i-=n[1],i-=l,h+=j):"down"===d?(i+=o[1],i+=l,h+=j):"left"===d?(h-=n[0],h-=l,i+=k):"right"===d&&(h+=o[0],h+=l,i+=k);var r=null;d.match(/(up|down|left|right)/)&&(r=document.createElement("SPAN"),f.addClassName(r,"arrow"),f.addClassName(r,this._oppositeDirections[d]),a.appendChild(r));var s=h,t=i,u=t+n[1]-q,v=s+n[0]-p,w=0-s,x=0-t;u>0?(r&&(r.style.top=n[1]/2+u+"px"),t-=u):x>0?(r&&(r.style.top=n[1]/2-x+"px"),t+=x):v>0?(r&&(r.style.left=n[0]/2+v+"px"),s-=v):w>0&&(r&&(r.style.left=n[0]/2-w+"px"),s+=w),a.style.left=s+"px",a.style.top=t+"px"}},_getWhereValueInsideViewport:function(a,b,c){return"left"===a&&b.left<0?"right":"right"===a&&b.right>c.right?"left":"up"===a&&b.top<0?"down":"down"===a&&b.bottom>c.bottom?"up":a},_removeTooltip:function(){var a=this.tooltip;if(a){var b=Ink.bind(c.remove,{},a);"mousemove"!==this._getOpt("where")&&i?(a.style.opacity=0,setTimeout(b,1e3*this._getFloatOpt("fade"))):b(),this.tooltip=null}},_getOpt:function(a){var b=c.data(this.element)[c._camelCase("tip-"+a)];if(b)return b;var d=this.root.options[a];return"undefined"!=typeof d?d:void 0},_getIntOpt:function(a){return parseInt(this._getOpt(a),10)},_getFloatOpt:function(a){return parseFloat(this._getOpt(a),10)},_destroy:function(){this.tooltip&&c.remove(this.tooltip),this.root=null,this.element=null,this.tooltip=null},_onMouseOver:function(a){var b=this._getMousePosition(a),c=this._getFloatOpt("delay");c?this._delayTimeout=setTimeout(Ink.bind(function(){this.tooltip||this._makeTooltip(b),this._delayTimeout=null},this),1e3*c):this._makeTooltip(b)},_onMouseMove:function(a){if("mousemove"===this._getOpt("where")&&this.tooltip){var b=this._getMousePosition(a);this._setPos(b[0],b[1])}},_onMouseOut:function(){this._getIntOpt("forever")||this._removeTooltip(),this._delayTimeout&&(clearTimeout(this._delayTimeout),this._delayTimeout=null)},_onTooltipMouseOver:function(){this.tooltip&&this._removeTooltip()},_setPos:function(a,b){a+=this._getIntOpt("left"),b+=this._getIntOpt("top");var d=this._getPageXY();if(this.tooltip){var e=[c.elementWidth(this.tooltip),c.elementHeight(this.tooltip)],f=this._getScroll();e[0]+a-f[0]>=d[0]-20&&(a=a-e[0]-this._getIntOpt("left")-10),e[1]+b-f[1]>=d[1]-20&&(b=b-e[1]-this._getIntOpt("top")-10),this.tooltip.style.left=a+"px",this.tooltip.style.top=b+"px"}},_getPageXY:function(){var a=0,b=0;return"number"==typeof window.innerWidth?(a=window.innerWidth,b=window.innerHeight):document.documentElement&&(document.documentElement.clientWidth||document.documentElement.clientHeight)?(a=document.documentElement.clientWidth,b=document.documentElement.clientHeight):document.body&&(document.body.clientWidth||document.body.clientHeight)&&(a=document.body.clientWidth,b=document.body.clientHeight),[parseInt(a,10),parseInt(b,10)]},_getScroll:function(){var a=document.documentElement,b=document.body;return a&&(a.scrollLeft||a.scrollTop)?[a.scrollLeft,a.scrollTop]:b?[b.scrollLeft,b.scrollTop]:[0,0]},_getMousePosition:function(a){return[parseInt(b.pointerX(a),10),parseInt(b.pointerY(a),10)]}},g}),Ink.createModule("Ink.UI.TreeView","1",["Ink.UI.Common_1","Ink.Dom.Event_1","Ink.Dom.Css_1","Ink.Dom.Element_1","Ink.Dom.Selector_1","Ink.Util.Array_1"],function(a,b,c,d,e,f){"use strict";var g=function(b,c){this._element=a.elOrSelector(b,"[Ink.UI.TreeView_1]"),this._options=a.options("Treeview",{node:["String","li"],child:["String","ul"],children:["String","ul"],parentClass:["String","parent"],openNodeClass:["String","open"],openClass:["String","icon-minus-sign"],closedClass:["String","icon-plus-sign"],hideClass:["String","hide-all"],iconTag:["String","i"],stopDefault:["Boolean",!0]},c||{},this._element),this._options.child&&(Ink.warn("Ink.UI.TreeView: options.child is being renamed to options.children."),this._options.children=this._options.child),this._init()};return g.prototype={_init:function(){this._handlers={click:Ink.bindEvent(this._onClick,this)},b.on(this._element,"click",this._options.node,this._handlers.click),f.each(Ink.ss(this._options.node,this._element),Ink.bind(function(a){if(this.isParent(a)){c.addClassName(a,this._options.parentClass);var b=this.isOpen(a);this._getIcon(a)||d.create(this._options.iconTag,{insertTop:a}),this._setNodeOpen(a,b)}},this))},_getIcon:function(a){return Ink.s("> "+this._options.iconTag,a)},isOpen:function(a){if(!this._getChild(a))throw new Error("not a node!");return"true"===d.data(a).open||c.hasClassName(a,this._options.openNodeClass)},isParent:function(a){return c.hasClassName(a,this._options.parentClass)||null!=this._getChild(a)},_setNodeOpen:function(a,b){var d=this._getChild(a);if(d){c.setClassName(d,this._options.hideClass,!b);var e=this._getIcon(a);a.setAttribute("data-open",b),c.setClassName(e,this._options.openClass,b),c.setClassName(e,this._options.closedClass,!b),c.setClassName(a,this._options.openNodeClass,b)}else Ink.error("Ink.UI.TreeView: node",a,"is not a node!")},open:function(a){this._setNodeOpen(a,!0)},close:function(a){this._setNodeOpen(a,!1)},toggle:function(a){this.isOpen(a)?this.close(a):this.open(a)},_getChild:function(a){return e.select(this._options.child,a)[0]||null},_onClick:function(a){!this.isParent(a.currentTarget)||e.matchesSelector(a.target,this._options.node)||e.matchesSelector(a.target,this._options.child)||(this._options.stopDefault&&a.preventDefault(),this.toggle(a.currentTarget))}},g}),Ink.createModule("Ink.UI.Upload","1",["Ink.Dom.Event_1","Ink.Dom.Element_1","Ink.Dom.Browser_1","Ink.UI.Common_1"],function(a,b,c,d){"use strict";var e=function(a){this.init(a)};e.prototype={init:function(a){this.options=Ink.extendObj({entry:void 0,maxDepth:10},a||{});try{this._read()}catch(b){Ink.error(b)}},_read:function(){if(!this.options.entry)throw"The entry specify you must";try{this._readDirectories()}catch(a){Ink.error(a)}},_readDirectories:function(){var a=[],b=!1,c=0,d=Ink.bind(function(e){var f=e.createReader();b=!0,f.readEntries(Ink.bind(function(e){if(e.length>0){for(var f=0,g=e.length;g>f;f++)a.push(e[f]),e[f].isDirectory&&(c=this.clearArray(e[f].fullPath.split("/")),c.shift(),c=c.length,c<=this.options.maxDepth&&d(e[f]));this._stopActivityTimeout&&clearTimeout(this._stopActivityTimeout),this._stopActivityTimeout=setTimeout(function(){b=!1},250)}e.length||(b=!1)},this),Ink.bind(function(a){this.options.readError(a,e)},this))},this);d(this.options.entry);var e,f=function(){return b?!1:(clearInterval(e),this.options.readComplete&&"function"==typeof this.options.readComplete&&this.options.readComplete(a),!0)};e=setInterval(Ink.bind(f,this),250)},clearArray:function(a){for(var b=a.length-1;b>=0;b--)("undefined"==typeof a[b]||null===a[b]||""===a[b])&&a.splice(b,1);return a}};var f={lists:[],items:[],create:function(a){var b;return a=String(a),this.lists.push({name:a}),b=this.lists.length-1},getItems:function(a){if(!a)return this.items;for(var b=[],c=0,d=this.items.length;d>c;c++)this.items[c].parentId===a&&b.push(this.items[c]);return b},purge:function(a,b){if("number"!=typeof a||isNaN(Number(a)))return!1;try{for(var c=this.items.length;c>=0;c--)this.items[c]&&a===this.items[c].parentId&&this.remove(this.items[c].parentId,this.items[c].pid);return b||this.lists.splice(a,1),!0}catch(d){return Ink.error("Purge: invalid id"),!1 +}},add:function(a,b,c){if(!this.lists[a])return!1;"object"!=typeof b&&(b=String(b));var d=parseInt(Math.round(1e5*Math.random())+""+Math.round(1e5*Math.random()),10);return c=c||0,this.items.push({parentId:a,item:b,priority:c||0,pid:d}),d},view:function(a,b){var c=this._searchByPid(a,b);return c===!1?!1:this.items[c]},remove:function(a,b){try{var c=this._searchByPid(a,b);return c===!1?!1:(this.items.splice(c,1),!0)}catch(d){return Ink.error("Remove: invalid id"),!1}},_searchByPid:function(a,b){if(!a&&"boolean"==typeof a||!b)return!1;if(a=parseInt(a,10),b=parseInt(b,10),isNaN(a)||isNaN(b))return!1;for(var c=0,d=this.items.length;d>c;c++)if(this.items[c].parentId===a&&this.items[c].pid===b)return c;return!1}},g=function(a){this.Upload=a,this.init()};g.prototype={init:function(){this._fileButton=this.Upload.options.fileButton,this._dropzone=this.Upload.options.dropzone,this._setDropEvent(),this._setFileButton()},_setDropEvent:function(){for(var a=this._dropzone,b=0,c=a.length;c>b;b++)a[b].ondrop=Ink.bindEvent(this.Upload._dropEventHandler,this.Upload),a[b].ondragleave=Ink.bindEvent(this._onDragLeave,this),a[b].ondragend=Ink.bindEvent(this._onDragEndEventHandler,this),a[b].ondragenter=Ink.bindEvent(this._onDragEnterHandler,this),a[b].ondragover=Ink.bindEvent(this._onDragOverHandler,this)},_onDragEnterHandler:function(a){return a&&a.stopPropagation&&a.stopPropagation(),a&&a.preventDefault&&a.preventDefault(),a&&(a.returnValue=!1),this.Upload.publish("DragEnter",a),!1},_onDragOverHandler:function(a){return a?(a.preventDefault(),a.stopPropagation(),a.returnValue=!1,!0):!1},_onDragLeave:function(a){return this.Upload.publish("DragLeave",a)},_onDragEndEventHandler:function(a){return this.Upload.publish("DragEnd",a)},_setFileButton:function(){var b=this._fileButton;a.observeMulti(b,"change",Ink.bindEvent(this._fileChangeHandler,this))},_fileChangeHandler:function(c){var d=a.element(c),e=d.files,f=b.findUpwardsByTag(d,"form");return e&&window.FormData&&"withCredentials"in new XMLHttpRequest?(this.Upload._addFilesToQueue(e),void(d.value="")):(f.parentNode.submit(),!1)}};var h=function(a){this.Queue=f,this.init(a),this._events={}};return h.prototype={init:function(a){if("string"==typeof a&&(a=b.data(d.elOrSelector(a,"1st argument"))),this.options=Ink.extendObj({extraData:{},fileFormName:"Ink_Filelist",dropzone:void 0,fileButton:void 0,endpoint:"",endpointChunk:"",endpointChunkCommit:"",maxFilesize:300<<20,chunkSize:4194304,minSizeToUseChunks:20971520,INVALID_FILE_NAME:void 0,foldersEnabled:!0,useChunks:!0,directoryMaxDepth:10},a||{}),this._queueId=f.create("Ink_UPLOAD"),this._queueRunning=!1,this._folders={},this.options.dropzone&&d.elOrSelector(this.options.dropzone,"Upload - dropzone"),this.options.fileButton&&d.elOrSelector(this.options.fileButton,"Upload - fileButton"),!this.options.dropzone&&!this.options.fileButton)throw new TypeError("A file button or dropzone, specify you must, my young padawan");this.options.dropzone=Ink.ss(this.options.dropzone),this.options.fileButton=Ink.ss(this.options.fileButton),new g(this)},_supportChunks:function(a){return this.options.useChunks&&"Blob"in window&&(new Blob).slice&&a>this.options.minSizeToUseChunks},_dropEventHandler:function(a){a&&a.stopPropagation&&a.stopPropagation(),a&&a.preventDefault&&a.preventDefault(),a&&(a.returnValue=!1),this.publish("DropComplete",a.dataTransfer);var b=a.dataTransfer;if(!b||!b.files||!b.files.length)return!1;if(this._files=b.files,this._files=Array.prototype.slice.call(this._files||[],0),b.items&&b.items[0]&&b.items[0].webkitGetAsEntry){if(!this.options.foldersEnabled)return setTimeout(Ink.bind(this._addFilesToQueue,this,this._files),0);for(var c,d=[],e=a.dataTransfer.items.length-1;e>=0;e--)c=a.dataTransfer.items[e].webkitGetAsEntry(),c&&c.isDirectory&&(d.push(c),this._files[e].isDirectory=!0,this._files.splice(e,1));this._addFolderToQueue(d,Ink.bind(function(){setTimeout(Ink.bind(this._addFilesToQueue,this,this._files),0)},this))}else setTimeout(Ink.bind(this._addFilesToQueue,this,this._files),0);return!0},_addFolderToQueue:function(a,b){var c=[],d={};if(!a||!a.length)return b(),c;var f=function(a){for(var b=[],c=0,d=a.length;d>c;c++)a[c].isFile&&b.push(a[c]);return b},g=function(a,b){var d;return b=b||0,this._files[b]?"fileentry"!==this._files[b].constructor.name.toLowerCase()?g.apply(this,[a,++b]):void this._files[b].file(Ink.bind(function(c){d=this._files[b].fullPath,this._files[b]=c,this._files[b].hasParent=!0,this._files[b].fullPath||(this._files[b].fullPath=d),g.apply(this,[a,++b])},this),Ink.bind(function(){this._files.splice(b,1),g.apply(this,[a,b])},this)):(a(),c)},h=Ink.bind(function(i){return a[i]?void new e({entry:a[i],maxDepth:this.options.directoryMaxDepth,readComplete:Ink.bind(function(b){if(c=c.concat(f(b)),a[i]&&!(a[i].fullPath in this._folders)){this._folders[a[i].fullPath]={items:b,files:c,length:b.length,created:!1,root:!0};for(var e=0,g=b.length;g>e;e++)b[e].isFile||(b[e].fullPath in d?delete d[b[e].fullPath]:this._folders[b[e].fullPath]={created:!1,root:!1});h(++i)}},this),readError:Ink.bind(function(a,b){d[b.fullPath]={},d[b.fullPath].error=a},this)}):(this._files=this._files.concat(c),g.call(this,b),!1)},this);return h(0),c},_addFilesToQueue:function(a){for(var b,d,e,g=0,h=a.length;h>g;g++)b=a[g],b.isDirectory||null!==b&&(b.type||b.size%4096!==0||c.CHROME&&this.options.foldersEnabled)?b.size>this.options.maxFilesize?this.publish("MaxSizeFailure",b,this.options.maxFilesize):(d=parseInt(Math.round(1e5*Math.random())+""+Math.round(1e5*Math.random()),10),e={id:g,data:b,fileID:d,directory:b.isDirectory},f.add(this._queueId,e),this.publish("FileAddedToQueue",e)):this.publish("InvalidFile",b,"size");this._processQueue(!0),this._files=[]},_processQueue:function(a){if(this._queueRunning)return!1;this.running=0;var b=1,c=0,d,e=f.items.length;this._queueRunning=!0,this.interval=setInterval(Ink.bind(function(){if(f.items.length===c&&0===this.running&&(f.purge(this._queueId,!0),this._queueRunning=!1,clearInterval(this.interval),this.publish("QueueEnd",this._queueId,e)),d=f.getItems(this._queueId),this.runningb.chunk_offset){if(c.response){var e=JSON.parse(c.response),f=b.chunk_offset&&e.offset!==b.chunk_offset+this.options.chunkSize&&b.size!==e.offset;f?(a.cb&&a.cb(),this.publish("ErrorUpload",b,d)):(b.chunk_upload_id=e.upload_id,b.chunk_offset=e.offset,b.chunk_expires=e.expires,this._upload(a))}else a.cb&&a.cb(),this.publish("ErrorUpload",b,d);return c=null}return a.cb&&a.cb(),c.responseText&&c.status<400?this.publish("EndUpload",b,d,c.responseText):this.publish("ErrorUpload",b,d),c=null},this),c.onerror=Ink.bindEvent(function(){a.cb&&a.cb(),this.publish("ErrorUpload",b,d)},this),c.onabort=Ink.bindEvent(function(){a.cb&&a.cb(),this.publish("AbortUpload",b,d,{abortAll:Ink.bind(this.abortAll,this),abortOne:Ink.bind(this.abortOne,this)})},this)},abortAll:function(){return this._queueRunning?(clearInterval(this.interval),this._queueRunning=!1,f.purge(this._queueId,!0),!0):!1},abortOne:function(a,b){for(var c=f.getItems(0),d,e=0,g=c.length;g>e;e++)if(c[e].item.fileID===a)return d={id:c[e].item.fileID,name:c[e].item.data.name,size:c[e].item.data.size,hasParent:c[e].item.data.hasParent},f.remove(0,c[e].pid),b&&b(d),!0;return!1},subscribe:function(a,b){return this._events[a]||(this._events[a]=[]),this._events[a].push(b),this._events[a]},publish:function(a){var b=this._events[a],c=Array.prototype.slice.call(arguments||[],0);if(b)for(var d=0,e=b.length;e>d;d++)try{b[d].apply(this,c.splice(1,c.length))}catch(f){Ink.error(a+": "+f)}}},h}); +//# sourceMappingURL=ink-ui.js.map \ No newline at end of file diff --git a/ajax/libs/ink/2.3.1/js/ink.animate.js b/ajax/libs/ink/2.3.1/js/ink.animate.js new file mode 100644 index 000000000..a67d59bb6 --- /dev/null +++ b/ajax/libs/ink/2.3.1/js/ink.animate.js @@ -0,0 +1,175 @@ +/** + * @module Ink.UI.Animate_1 + * @author inkdev AT sapo.pt + * @version 1 + */ + +Ink.createModule('Ink.UI.Animate', 1, ['Ink.UI.Common_1', 'Ink.Dom.Event_1', 'Ink.Dom.Css_1'], function (Common, InkEvent, Css) { + 'use strict'; + + var animationPrefix = (function (el) { + return ('animationName' in el.style) ? 'animation' : + ('oAnimationName' in el.style) ? 'oAnimation' : + ('msAnimationName' in el.style) ? 'msAnimation' : + ('webkitAnimationName' in el.style) ? 'webkitAnimation' : null; + }(document.createElement('div'))); + + var animationEndEventName = { + animation: 'animationend', + oAnimation: 'oanimationend', + msAnimation: 'MSAnimationEnd', + webkitAnimation: 'webkitAnimationEnd' + }[animationPrefix]; + + /** + * @class Ink.UI.Animate_1 + * @constructor + * + * @param element {DOMElement} animated element + * @param options {Object} options object + * @param options.animation {String} animation name + * @param [options.duration=medium] {String|Number} duration name (fast|medium|slow) or duration in ms + * @param [options.removeClass=true] {Boolean} Whether to remove the `animation` class when finished animating + * @param [options.onEnd=null] {Function} callback for animation end + * + * @example + * + * + * Hi! + * + * + * + **/ + function Animate(elOrSelector, options) { + this._element = Common.elOrSelector(elOrSelector); + this._options = Common.options({ + trigger: ['Element', null], + duration: ['String', 'slow'], // Actually a string with a duration name, or a number of ms + animation: ['String'], + removeClass: ['Boolean', true], + onEnd: ['Function', function () {}] + }, options || {}, this._element); + + if (!isNaN(parseInt(this._options.duration, 10))) { + this._options.duration = parseInt(this._options.duration, 10); + } + + if (this._options.trigger) { + InkEvent.observe(this._options.trigger, 'click', Ink.bind(function () { + this.animate(); + }, this)); // later + } else { + this.animate(); + } + } + + Animate.prototype.animate = function () { + Animate.animate(this._element, this._options.animation, this._options); + }; + + Ink.extendObj(Animate, { + /** + * Prefix for CSS animation-related properties in this browser. + * + * @property _animationPrefix + * @private + **/ + _animationPrefix: animationPrefix, + + /** + * Whether CSS3 animation is supported in this browser. + * + * @property {Boolean} animationSupported + **/ + animationSupported: !!animationPrefix, + + /** + * The correct event for the animationend event in this browser, with the correct prefix + * + * @property {String} animationEndEventName + **/ + animationEndEventName: animationEndEventName, + + /** + * Animate a div using one of the animate.css classes + * + * **Note: This is a utility method inside the `Animate` class, which you can access through `Animate.animate()`. Do not mix these up.** + * + * @example + * + * Animate.animate(myDiv, 'shake', { + * onEnd: function () { + * alert('Finished shaking!'); + * } + * }); + * + * @static + * @method animate + * @param element {DOMElement} animated element + * @param animation {String} animation name + * @param [options] {Object} + * @param [options.onEnd=null] {Function} callback for animation end + * @param [options.removeClass=false] {Boolean} whether to remove the Css class when finished + * @param [options.duration=medium] {String|Number} duration name (fast|medium|slow) or duration in ms + **/ + animate: function (element, animation, options) { + element = Common.elOrSelector(element); + + if (typeof options === 'number' || typeof options === 'string') { + options = { duration: options }; + } + + if (typeof arguments[3] === 'function') { + options.onEnd = arguments[3]; + } + + if (typeof options.duration !== 'number' && typeof options.duration !== 'string') { + options.duration = 400; + } + + if (!Animate.animationSupported) { + if (options.onEnd) { + setTimeout(function () { + options.onEnd(null); + }, 0); + } + return; + } + + if (typeof options.duration === 'number') { + element.style[animationPrefix + 'Duration'] = options.duration + 'ms'; + } else if (typeof options.duration === 'string') { + Css.addClassName(element, options.duration); + } + + Css.addClassName(element, ['animated', animation]); + + function onAnimationEnd(event) { + if (event.target !== element) { return; } + if (event.animationName !== animation) { return; } + if (options.onEnd) { options.onEnd(event); } + if (options.removeClass) { + Css.removeClassName(element, animation); + } + if (typeof options.duration === 'string') { + Css.removeClassName(element, options.duration); + } + element.removeEventListener(animationEndEventName, onAnimationEnd, false); + } + + element.addEventListener(animationEndEventName, onAnimationEnd, false); + } + }); + + return Animate; +}); + diff --git a/ajax/libs/ink/2.3.1/js/ink.carousel.js b/ajax/libs/ink/2.3.1/js/ink.carousel.js new file mode 100644 index 000000000..f01a425a1 --- /dev/null +++ b/ajax/libs/ink/2.3.1/js/ink.carousel.js @@ -0,0 +1,402 @@ +/** + * @module Ink.UI.Carousel_1 + * @author inkdev AT sapo.pt + * @version 1 + */ +Ink.createModule('Ink.UI.Carousel', '1', + ['Ink.UI.Common_1', 'Ink.Dom.Event_1', 'Ink.Dom.Css_1', 'Ink.Dom.Element_1', 'Ink.UI.Pagination_1', 'Ink.Dom.Browser_1', 'Ink.Dom.Selector_1'], + function(Common, InkEvent, Css, InkElement, Pagination, Browser/*, Selector*/) { + 'use strict'; + + /* + * TODO: + * keyboardSupport + */ + + function limitRange(n, min, max) { + return Math.min(max, Math.max(min, n)); + } + + var requestAnimationFrame = window.requestAnimationFrame || + window.mozRequestAnimationFrame || + window.webkitRequestAnimationFrame || + function (cb) {return setTimeout(cb, 1000 / 30); }; + + /** + * @class Ink.UI.Carousel_1 + * @constructor + * + * @param {String|DOMElement} selector + * @param {Object} [options] + * @param {Integer} [autoAdvance=0] The number of milliseconds to wait between auto-advancing pages. Set to 0 to disable auto-advance. + * @param {String} [options.axis='x'] Can be `'x'` or `'y'`, for a horizontal or vertical carousel + * @param {Boolean} [options.center=false] Center the carousel. + * @param {Number} [options.initialPage=0] When initialized, set the page to this. + * @TODO @param {Boolean} [options.keyboardSupport=false] Enable keyboard support + * @param {Boolean} [options.swipe=true] Enable swipe support where available + * @param {String|DOMElement|Ink.UI.Pagination_1} [options.pagination] Either an `
            ` element to add pagination markup to, or an `Ink.UI.Pagination` instance to use. + * @param {Function} [options.onChange] Callback for when the page is changed. + */ + var Carousel = function(selector, options) { + this._handlers = { + paginationChange: Ink.bindMethod(this, '_onPaginationChange'), + windowResize: InkEvent.throttle(Ink.bindMethod(this, 'refit'), 200) + }; + + InkEvent.observe(window, 'resize', this._handlers.windowResize); + + var element = this._element = Common.elOrSelector(selector, '1st argument'); + + var opts = this._options = Common.options({ + autoAdvance: ['Integer', 0], + axis: ['String', 'x'], + initialPage: ['Integer', 0], + hideLast: ['Boolean', false], + center: ['Boolean', false], + keyboardSupport:['Boolean', false], + pagination: ['String', null], + onChange: ['Function', null], + swipe: ['Boolean', true] + // TODO exponential swipe + // TODO specify break point for next page when moving finger + }, options || {}, element, this); + + this._isY = (opts.axis === 'y'); + + var ulEl = Ink.s('ul.stage', element); + this._ulEl = ulEl; + + InkElement.removeTextNodeChildren(ulEl); + + this.refit(); // recalculate this._numPages + + if (this._isY) { + // Override white-space: no-wrap which is only necessary to make sure horizontal stuff stays horizontal, but breaks stuff intended to be vertical. + this._ulEl.style.whiteSpace = 'normal'; + } + + if (opts.swipe) { + InkEvent.observe(element, 'touchstart', Ink.bindMethod(this, '_onTouchStart')); + InkEvent.observe(element, 'touchmove', Ink.bindMethod(this, '_onTouchMove')); + InkEvent.observe(element, 'touchend', Ink.bindMethod(this, '_onTouchEnd')); + } + + this._setUpPagination(); + this._setUpAutoAdvance(); + this._setUpHider(); + }; + + Carousel.prototype = { + /** + * Measure the carousel once again, adjusting the involved elements' + * sizes. Called automatically when the window resizes, in order to + * cater for changes from responsive media queries, for instance. + * + * @method refit + * @public + */ + refit: function() { + var _isY = this._isY; + + var size = function (elm, perpendicular) { + if (!perpendicular) { + return InkElement.outerDimensions(elm)[_isY ? 1 : 0]; + } else { + return InkElement.outerDimensions(elm)[_isY ? 0 : 1]; + } + }; + + this._liEls = Ink.ss('li.slide', this._ulEl); + var numSlides = this._liEls.length; + + var contRect = this._ulEl.getBoundingClientRect(); + this._ctnLength = _isY ? contRect.bottom - contRect.top : contRect.right - contRect.left; + this._elLength = size(this._liEls[0]); + this._slidesPerPage = Math.floor( this._ctnLength / this._elLength ) || 1; + + var numPages = Math.ceil( numSlides / this._slidesPerPage ); + var numPagesChanged = this._numPages !== numPages; + this._numPages = numPages; + this._deltaLength = this._slidesPerPage * this._elLength; + + this._center(); + this._updateHider(); + this._IE7(); + + if (this._pagination && numPagesChanged) { + this._pagination.setSize(this._numPages); + } + this.setPage(limitRange(this.getPage(), 1, this._numPages)); + }, + + _setUpPagination: function () { + if (this._options.pagination) { + if (Common.isDOMElement(this._options.pagination) || + typeof this._options.pagination === 'string') { + // if dom element or css selector string... + this._pagination = new Pagination(this._options.pagination, { + size: this._numPages, + onChange: this._handlers.paginationChange + }); + } else { + // assumes instantiated pagination + this._pagination = this._options.pagination; + this._pagination._options.onChange = this._handlers.paginationChange; + this._pagination.setSize(this._numPages); + } + this._pagination.setCurrent(this._options.initialPage || 0); + } else { + this._currentPage = this._options.initialPage || 0; + } + }, + + _setUpAutoAdvance: function () { + if (!this._options.autoAdvance) { return; } + var self = this; + + setTimeout(function autoAdvance() { + self.nextPage(true /* wrap */); + setTimeout(autoAdvance, self._options.autoAdvance); + }, this._options.autoAdvance); + }, + + _setUpHider: function () { + if (this._options.hideLast) { + var hiderEl = InkElement.create('div', { + className: 'hider', + insertBottom: this._element + }); + hiderEl.style.position = 'absolute'; + hiderEl.style[ this._isY ? 'left' : 'top' ] = '0'; // fix to top.. + hiderEl.style[ this._isY ? 'right' : 'bottom' ] = '0'; // and bottom... + hiderEl.style[ this._isY ? 'bottom' : 'right' ] = '0'; // and move to the end. + this._hiderEl = hiderEl; + } + }, + + _center: function() { + if (!this._options.center) { return; } + var gap = Math.floor( (this._ctnLength - (this._elLength * this._slidesPerPage) ) / 2 ); + + var pad; + if (this._isY) { + pad = [gap, 'px 0']; + } else { + pad = ['0 ', gap, 'px']; + } + + this._ulEl.style.padding = pad.join(''); + }, + + _updateHider: function() { + if (!this._hiderEl) { return; } + if (this.getPage() === 0) { + var gap = Math.floor( this._ctnLength - (this._elLength * this._slidesPerPage) ); + if (this._options.center) { + gap /= 2; + } + this._hiderEl.style[ this._isY ? 'height' : 'width' ] = gap + 'px'; + } else { + this._hiderEl.style[ this._isY ? 'height' : 'width' ] = '0px'; + } + }, + + /** + * Refit stuff for IE7 because it won't support inline-block. + * + * @method _IE7 + * @private + */ + _IE7: function () { + if (Browser.IE && '' + Browser.version.split('.')[0] === '7') { + // var numPages = this._numPages; + var slides = Ink.ss('li.slide', this._ulEl); + var stl = function (prop, val) {slides[i].style[prop] = val; }; + for (var i = 0, len = slides.length; i < len; i++) { + stl('position', 'absolute'); + stl(this._isY ? 'top' : 'left', (i * this._elLength) + 'px'); + } + } + }, + + _onTouchStart: function (event) { + if (event.touches.length > 1) { return; } + + this._swipeData = { + x: InkEvent.pointerX(event), + y: InkEvent.pointerY(event), + lastUlPos: null + }; + + var ulRect = this._ulEl.getBoundingClientRect(); + + this._swipeData.inUlX = this._swipeData.x - ulRect.left; + this._swipeData.inUlY = this._swipeData.y - ulRect.top; + + setTransitionProperty(this._ulEl, 'none'); + + this._touchMoveIsFirstTouchMove = true; + + // event.preventDefault(); + event.stopPropagation(); + }, + + _onTouchMove: function (event) { + if (event.touches.length > 1) { return; /* multitouch event, not my problem. */ } + + var pointerX = InkEvent.pointerX(event); + var pointerY = InkEvent.pointerY(event); + + var deltaY = Math.abs(pointerY - this._swipeData.y); + var deltaX = Math.abs(pointerX - this._swipeData.x); + + if (this._touchMoveIsFirstTouchMove) { + this._touchMoveIsFirstTouchMove = undefined; + this._scrolling = this._isY ? + deltaX > deltaY : + deltaY > deltaX ; + + if (!this._scrolling) { + this._onAnimationFrame(); + } + } + + if (!this._scrolling && this._swipeData) { + event.preventDefault(); + + this._swipeData.pointerPos = this._isY ? pointerY : pointerX; + } + + event.stopPropagation(); + }, + + _onAnimationFrame: function () { + var swipeData = this._swipeData; + + if (!swipeData || this._scrolling || this._touchMoveIsFirstTouchMove) { return; } + + var elRect = this._element.getBoundingClientRect(); + + var newPos; + + if (!this._isY) { + newPos = swipeData.pointerPos - swipeData.inUlX - elRect.left; + } else { + newPos = swipeData.pointerPos - swipeData.inUlY - elRect.top; + } + + this._ulEl.style[this._isY ? 'top' : 'left'] = newPos + 'px'; + + swipeData.lastUlPos = newPos; + + requestAnimationFrame(Ink.bindMethod(this, '_onAnimationFrame')); + }, + + _onTouchEnd: function (event) { + if (this._swipeData && this._swipeData.pointerPos && !this._scrolling && !this._touchMoveIsFirstTouchMove) { + var snapToNext = 0.1; // swipe 10% of the way to change page + var progress = - this._swipeData.lastUlPos; + + var curPage = this.getPage(); + var estimatedPage = progress / this._elLength / this._slidesPerPage; + + if (Math.round(estimatedPage) === curPage) { + var diff = estimatedPage - curPage; + if (Math.abs(diff) > snapToNext) { + diff = diff > 0 ? 1 : -1; + curPage += diff; + } + } else { + curPage = Math.round(estimatedPage); + } + + this.setPage(curPage); + + event.stopPropagation(); + // event.preventDefault(); + } + + setTransitionProperty(this._ulEl, null /* transition: left, top */); + this._swipeData = null; + this._touchMoveIsFirstTouchMove = undefined; + this._scrolling = undefined; + }, + + _onPaginationChange: function(pgn) { + this._setPage(pgn.getCurrent()); + }, + + /** + * Get the currently displayed page. + * @method getPage + **/ + getPage: function () { + if (this._pagination) { + return this._pagination.getCurrent(); + } else { + return this._currentPage; + } + }, + + /** + * Set the current page to `page` + * @method setPage + * @param page + * @param [wrap=false] Wrap over the first and last pages. (For example, going to the 5th page when there are only 4 pages goes to the 1st page) + **/ + setPage: function (page, wrap) { + if (wrap) { + // Pages outside the range [0..this._numPages] are wrapped. + page = page % this._numPages; + if (page < 0) { page = this._numPages - page; } + } + page = limitRange(page, 0, this._numPages - 1); + + if (this._pagination) { + this._pagination.setCurrent(page); + } else { + this._setPage(page); + } + }, + + _setPage: function (page) { + this._ulEl.style[ this._isY ? 'top' : 'left'] = + ['-', page * this._deltaLength, 'px'].join(''); + + if (this._options.onChange) { + this._options.onChange.call(this, page); + } + + this._currentPage = page; + + this._updateHider(); + }, + + /** + * Change to the next page + * @method nextPage + * @param {Boolean} [wrap=false] If true, going to the page after the last page takes you to the first page. + **/ + nextPage: function (wrap) { + this.setPage(this.getPage() + 1, wrap); + }, + + /** + * Change to the previous page + * @method previousPage + * @param {Boolean} [wrap=false] If true, going to the page after the last page takes you to the first page. + **/ + previousPage: function (wrap) { this.setPage(this.getPage() - 1, wrap); } + }; + + function setTransitionProperty(el, newTransition) { + el.style.transitionProperty = + el.style.oTransitionProperty = + el.style.msTransitionProperty = + el.style.mozTransitionProperty = + el.style.webkitTransitionProperty = newTransition; + } + + return Carousel; + +}); diff --git a/ajax/libs/ink/2.3.1/js/ink.close.js b/ajax/libs/ink/2.3.1/js/ink.close.js new file mode 100644 index 000000000..6ab48a3a7 --- /dev/null +++ b/ajax/libs/ink/2.3.1/js/ink.close.js @@ -0,0 +1,49 @@ +/** + * @module Ink.UI.Close_1 + * @author inkdev AT sapo.pt + */ +Ink.createModule('Ink.UI.Close', '1', ['Ink.Dom.Event_1','Ink.Dom.Element_1'], function(InkEvent, InkElement) { + 'use strict'; + + /** + * Subscribes clicks on the document.body. If and only if you clicked on an element + * having class "ink-close" or "ink-dismiss", will go up the DOM hierarchy looking for an element with any + * of the following classes: "ink-alert", "ink-alert-block". + * If it is found, it is removed from the DOM. + * + * One should call close once per page (full page refresh). + * + * @class Ink.UI.Close + * @constructor + * @example + * + */ + var Close = function() { + InkEvent.observe(document.body, 'click', function(ev) { + var el = InkEvent.element(ev); + + el = InkElement.findUpwardsByClass(el, 'ink-close') || + InkElement.findUpwardsByClass(el, 'ink-dismiss'); + + if (!el) { + return; // ink-close or ink-dismiss class not found + } + + var toRemove = el; + toRemove = InkElement.findUpwardsByClass(el, 'ink-alert') || + InkElement.findUpwardsByClass(el, 'ink-alert-block'); + + if (toRemove) { + InkEvent.stop(ev); + InkElement.remove(toRemove); + } + }); + }; + + return Close; + +}); diff --git a/ajax/libs/ink/2.3.1/js/ink.common.js b/ajax/libs/ink/2.3.1/js/ink.common.js new file mode 100644 index 000000000..2a9ea0d69 --- /dev/null +++ b/ajax/libs/ink/2.3.1/js/ink.common.js @@ -0,0 +1,756 @@ +/** + * @module Ink.UI.Common_1 + * @author inkdev AT sapo.pt + * @version 1 + */ +Ink.createModule('Ink.UI.Common', '1', ['Ink.Dom.Element_1', 'Ink.Net.Ajax_1','Ink.Dom.Css_1','Ink.Dom.Selector_1','Ink.Util.Url_1'], function(InkElement, Ajax,Css,Selector,Url) { + + 'use strict'; + + var instances = {}; + var lastIdNum = 0; + var nothing = {} /* a marker, for reference comparison. */; + + var keys = Object.keys || function (obj) { + var ret = []; + for (var k in obj) if (obj.hasOwnProperty(k)) { + ret.push(k); + } + return ret; + }; + + /** + * The Common class provides auxiliar methods to ease some of the most common/repetitive UI tasks. + * + * @class Ink.UI.Common + * @version 1 + * @static + */ + var Common = { + + /** + * Supported Ink Layouts + * + * @property Layouts + * @type Object + * @readOnly + */ + Layouts: { + SMALL: 'small', + MEDIUM: 'medium', + LARGE: 'large' + }, + + /** + * Method to check if an item is a valid DOM Element. + * + * @method isDOMElement + * @static + * @param {Mixed} o The object to be checked. + * @return {Boolean} True if it's a valid DOM Element. + * @example + * var el = Ink.s('#element'); + * if( Ink.UI.Common.isDOMElement( el ) === true ){ + * // It is a DOM Element. + * } else { + * // It is NOT a DOM Element. + * } + */ + isDOMElement: function(o) { + return o && typeof o === 'object' && 'nodeType' in o && o.nodeType === 1; + }, + + /** + * Method to check if an item is a valid integer. + * + * @method isInteger + * @static + * @param {Mixed} n The value to be checked. + * @return {Boolean} True if 'n' is a valid integer. + * @example + * var value = 1; + * if( Ink.UI.Common.isInteger( value ) === true ){ + * // It is an integer. + * } else { + * // It is NOT an integer. + * } + */ + isInteger: function(n) { + return (typeof n === 'number' && n % 1 === 0); + }, + + /** + * Method to get a DOM Element. The first parameter should be either a DOM Element or a valid CSS Selector. + * If not, then it will throw an exception. Otherwise, it returns a DOM Element. + * + * @method elOrSelector + * @static + * @param {DOMElement|String} elOrSelector DOM Element or CSS Selector + * @param {String} fieldName This field is used in the thrown Exception to identify the parameter. + * @return {DOMElement} Returns the DOMElement passed or the first result of the CSS Selector. Otherwise it throws an exception. + * @example + * // In case there are several .myInput, it will retrieve the first found + * var el = Ink.UI.Common.elOrSelector('.myInput','My Input'); + */ + elOrSelector: function(elOrSelector, fieldName) { + if (!this.isDOMElement(elOrSelector)) { + var t = Selector.select(elOrSelector); + if (t.length === 0) { throw new TypeError(fieldName + ' must either be a DOM Element or a selector expression!\nThe script element must also be after the DOM Element itself.'); } + return t[0]; + } + return elOrSelector; + }, + + /** + * Does the same as `elOrSelector` but returns an array of elements. + * + * see elOrSelector + * + * @method elsOrSelector + * + * @static + * + * @param ... (See elOrSelector's params) + * @param {Boolean} required If true, accept an empty array as output. + * @return {Array} The selected DOM Elements. + * @example + * var elements = Ink.UI.Common.elsOrSelector('input.my-inputs', 'My Input'); + */ + elsOrSelector: function(elsOrSelector, fieldName, required) { + var ret; + if (typeof elsOrSelector === 'string') { + ret = Selector.select(elsOrSelector); + } else if (Common.isDOMElement(elsOrSelector)) { + ret = [elsOrSelector]; + } else if (elsOrSelector && typeof elsOrSelector === 'object' && typeof elsOrSelector.length === 'number') { + ret = elsOrSelector; + } + + if (ret && ret.length) { + return ret; + } else { + if (required || arguments.length === 2) { + throw new TypeError(fieldName + ' must either be a DOM Element, an Array of elements, or a selector expression!\nThe script element must also be after the DOM Element itself.'); + } else { + return []; + } + } + }, + + /** + * Get options from an "options" object and the Element's data attributes. + * + * The element's data attributes take precedence. + * + * Values from the element's data-atrributes are coerced into the required type. + * + * Mainly for Ink UI.* modules + * + * @method options + * + * @param {Object} [fieldId=''] Tag used in thrown exceptions: ": ..." + * @param {Object} defaults Object with arrays of option defaults + * @param {Object} overrides Object containing options given from user through JavaScript + * @param {DOMElement} [element] Element with data-attributes + * + * @example + * + * this._options = Ink.UI.Common.options('MyComponent', { + * 'anobject': ['Object', null], // Defaults to null + * 'target': ['Element', null], + * 'stuff': ['Number', 0.1], + * 'stuff2': ['Integer', 0], + * 'doKickFlip': ['Boolean', false], + * 'targets': ['Elements'], // Required option since no default was given + * 'onClick': ['Function', null] + * }, options || {}, elm) + * + * @example + * + * ### Note about booleans + * + * Here is how options are read from the markup + * data-attributes, for several values`data-a-boolean`. + * + * Options considered true: + * + * - `data-a-boolean="true"` + * - (Every other value which is not on the list below.) + * + * Options considered false: + * + * - `data-a-boolean="false"` + * - `data-a-boolean=""` + * - `data-a-boolean` + * + * Options which go to default: + * + * - (no attribute). When `data-a-boolean` is ommitted, the + * option is not considered true nor false, and as such + * defaults to what is in the `defaults` argument. + * + **/ + options: function (fieldId, defaults, overrides, element) { + if (typeof fieldId !== 'string') { + element = overrides; + overrides = defaults; + defaults = fieldId; + fieldId = ''; + } + overrides = overrides || {}; + var out = {}; + var dataAttrs = element ? InkElement.data(element) : {}; + var fromDataAttrs; + var type; + var lType; + var defaultVal; + + var invalidStr = function (str) { + if (fieldId) { str = fieldId + ': "' + ('' + str).replace(/"/, '\\"') + '"'; } + return str; + }; + + var quote = function (str) { + return '"' + ('' + str).replace(/"/, '\\"') + '"'; + }; + + var invalidThrow = function (str) { + throw new Error(invalidStr(str)); + }; + + var invalid = function (str) { + Ink.error(invalidStr(str) + '. Ignoring option.'); + }; + + function optionValue(key) { + type = defaults[key][0]; + lType = type.toLowerCase(); + defaultVal = defaults[key].length === 2 ? defaults[key][1] : nothing; + + if (!type) { + invalidThrow('Ink.UI.Common.options: Always specify a type!'); + } + if (!(lType in Common._coerce_funcs)) { + invalidThrow('Ink.UI.Common.options: ' + defaults[key][0] + ' is not a valid type. Use one of ' + keys(Common._coerce_funcs).join(', ')); + + } + if (!defaults[key].length || defaults[key].length > 2) { + invalidThrow('the "defaults" argument must be an object mapping option names to [typestring, optional] arrays.'); + } + + if (key in dataAttrs) { + fromDataAttrs = Common._coerce_from_string(lType, dataAttrs[key], key, fieldId); + // (above can return `nothing`) + } else { + fromDataAttrs = nothing; + } + + if (fromDataAttrs !== nothing) { + if (!Common._options_validate(fromDataAttrs, lType)) { + invalid('(' + key + ' option) Invalid ' + lType + ' ' + quote(fromDataAttrs)); + return defaultVal; + } else { + return fromDataAttrs; + } + } else if (key in overrides) { + return overrides[key]; + } else if (defaultVal !== nothing) { + return defaultVal; + } else { + invalidThrow('Option ' + key + ' is required!'); + } + } + + for (var key in defaults) { + if (defaults.hasOwnProperty(key)) { + out[key] = optionValue(key); + } + } + + return out; + }, + + _coerce_from_string: function (type, val, paramName, fieldId) { + if (type in Common._coerce_funcs) { + return Common._coerce_funcs[type](val, paramName, fieldId); + } else { + return val; + } + }, + + _options_validate: function (val, type) { + if (type in Common._options_validate_types) { + return Common._options_validate_types[type].call(Common, val); + } else { + // 'object' options cannot be passed through data-attributes. + // Json you say? Not any good to embed in HTML. + return false; + } + }, + + _coerce_funcs: (function () { + var ret = { + element: function (val) { + return Common.elOrSelector(val, ''); + }, + elements: function (val) { + return Common.elsOrSelector(val, '', false /*not required, so don't throw an exception now*/); + }, + object: function (val) { return val; }, + number: function (val) { return parseFloat(val); }, + 'boolean': function (val) { + return !(val === 'false' || val === '' || val === null); + }, + string: function (val) { return val; }, + 'function': function (val, paramName, fieldId) { + Ink.error(fieldId + ': You cannot specify the option "' + paramName + '" through data-attributes because it\'s a function'); + return nothing; + } + }; + ret['float'] = ret.integer = ret.number; + return ret; + }()), + + _options_validate_types: (function () { + var types = { + string: function (val) { + return typeof val === 'string'; + }, + number: function (val) { + return typeof val === 'number' && !isNaN(val) && isFinite(val); + }, + integer: function (val) { + return val === Math.round(val); + }, + element: function (val) { + return Common.isDOMElement(val); + }, + elements: function (val) { + return val && typeof val === 'object' && typeof val.length === 'number' && val.length; + }, + 'boolean': function (val) { + return typeof val === 'boolean'; + } + }; + types['float'] = types.number; + return types; + }()), + + /** + * Method to make a deep copy (clone) of an object. + * Note: The object cannot have loops. + * + * @method clone + * @static + * @param {Object} o The object to be cloned/copied. + * @return {Object} Returns the result of the clone/copy. + * @example + * var originalObj = { + * key1: 'value1', + * key2: 'value2', + * key3: 'value3' + * }; + * var cloneObj = Ink.UI.Common.clone( originalObj ); + */ + clone: function(o) { + try { + return JSON.parse( JSON.stringify(o) ); + } catch (ex) { + throw new Error('Given object cannot have loops!'); + } + }, + + + /** + * Method to return the 'nth' position that an element occupies relatively to its parent. + * + * @method childIndex + * @static + * @param {DOMElement} childEl Valid DOM Element. + * @return {Number} Numerical position of an element relatively to its parent. + * @example + * + *
              + *
            • One
            • + *
            • Two
            • + *
            • Three
            • + *
            • Four
            • + *
            + * + * + */ + childIndex: function(childEl) { + if( Common.isDOMElement(childEl) ){ + var els = Selector.select('> *', childEl.parentNode); + for (var i = 0, f = els.length; i < f; ++i) { + if (els[i] === childEl) { + return i; + } + } + } + throw 'not found!'; + }, + + + /** + * This method provides a more convenient way to do an async AJAX request and expect a JSON response. + * It offers a callback option, as third paramenter, for a better async handling. + * + * @method ajaxJSON + * @static + * @async + * @param {String} endpoint Valid URL to be used as target by the request. + * @param {Object} params This field is used in the thrown Exception to identify the parameter. + * @example + * // In case there are several .myInput, it will retrieve the first found + * var el = Ink.UI.Common.elOrSelector('.myInput','My Input'); + */ + ajaxJSON: function(endpoint, params, cb) { + new Ajax( + endpoint, + { + evalJS: 'force', + method: 'POST', + parameters: params, + + onSuccess: function( r) { + try { + r = r.responseJSON; + if (r.status !== 'ok') { + throw 'server error: ' + r.message; + } + cb(null, r); + } catch (ex) { + cb(ex); + } + }, + + onFailure: function() { + cb('communication failure'); + } + } + ); + }, + + + /** + * Method to get the current Ink layout applied. + * + * @method currentLayout + * @static + * @return {String} 'small', 'medium' or 'large' + * @example + * var inkLayout = Ink.UI.Common.currentLayout(); + * if (inkLayout === 'small') { + * // ... + * } + */ + currentLayout: function() { + var i, f, k, v, el, detectorEl = Selector.select('#ink-layout-detector')[0]; + if (!detectorEl) { + detectorEl = document.createElement('div'); + detectorEl.id = 'ink-layout-detector'; + for (k in this.Layouts) { + if (this.Layouts.hasOwnProperty(k)) { + v = this.Layouts[k]; + el = document.createElement('div'); + el.className = 'show-' + v + ' hide-all'; + el.setAttribute('data-ink-layout', v); + detectorEl.appendChild(el); + } + } + document.body.appendChild(detectorEl); + } + + var result = ''; + var resultCount = 0; + for (i = 0, f = detectorEl.childNodes.length; i < f; ++i) { + el = detectorEl.childNodes[i]; + if (Css.getStyle(el, 'display') === 'block') { + result = el.getAttribute('data-ink-layout'); + resultCount += 1; + } + } + + if (resultCount === 1) { + return result; + } else { + return 'large'; + } + }, + + + /** + * Method to set the location's hash (window.location.hash). + * + * @method hashSet + * @static + * @param {Object} o Object with the info to be placed in the location's hash. + * @example + * // It will set the location's hash like: #key1=value1&key2=value2&key3=value3 + * Ink.UI.Common.hashSet({ + * key1: 'value1', + * key2: 'value2', + * key3: 'value3' + * }); + */ + hashSet: function(o) { + if (typeof o !== 'object') { throw new TypeError('o should be an object!'); } + var hashParams = Url.getAnchorString(); + hashParams = Ink.extendObj(hashParams, o); + window.location.hash = Url.genQueryString('', hashParams).substring(1); + }, + + /** + * Method to remove children nodes from a given object. + * This method was initially created to help solve a problem in Internet Explorer(s) that occurred when trying + * to set the innerHTML of some specific elements like 'table'. + * + * @method cleanChildren + * @static + * @param {DOMElement} parentEl Valid DOM Element + * @example + * + *
              + *
            • One
            • + *
            • Two
            • + *
            • Three
            • + *
            • Four
            • + *
            + * + * + * + * + *
              + */ + cleanChildren: function(parentEl) { + if( !Common.isDOMElement(parentEl) ){ + throw 'Please provide a valid DOMElement'; + } + var prevEl, el = parentEl.lastChild; + while (el) { + prevEl = el.previousSibling; + parentEl.removeChild(el); + el = prevEl; + } + }, + + /** + * This method stores the id and/or the classes of a given element in a given object. + * + * @method storeIdAndClasses + * @static + * @param {DOMElement} fromEl Valid DOM Element to get the id and classes from. + * @param {Object} inObj Object where the id and classes will be saved. + * @example + *
              + * + * + */ + storeIdAndClasses: function(fromEl, inObj) { + if( !Common.isDOMElement(fromEl) ){ + throw 'Please provide a valid DOMElement as first parameter'; + } + + var id = fromEl.id; + if (id) { + inObj._id = id; + } + + var classes = fromEl.className; + if (classes) { + inObj._classes = classes; + } + }, + + /** + * This method sets the id and className properties of a given DOM Element based on a given similar object + * resultant of the previous function 'storeIdAndClasses'. + * + * @method restoreIdAndClasses + * @static + * @param {DOMElement} toEl Valid DOM Element to set the id and classes on. + * @param {Object} inObj Object where the id and classes to be set are. + * @example + *
              + * + * + * + * + *
              + */ + restoreIdAndClasses: function(toEl, inObj) { + + if( !Common.isDOMElement(toEl) ){ + throw 'Please provide a valid DOMElement as first parameter'; + } + + if (inObj._id && toEl.id !== inObj._id) { + toEl.id = inObj._id; + } + + if (inObj._classes && toEl.className.indexOf(inObj._classes) === -1) { + if (toEl.className) { toEl.className += ' ' + inObj._classes; } + else { toEl.className = inObj._classes; } + } + + if (inObj._instanceId && !toEl.getAttribute('data-instance')) { + toEl.setAttribute('data-instance', inObj._instanceId); + } + }, + + /** + * This method saves a component's instance reference for later retrieval. + * + * @method registerInstance + * @static + * @param {Object} inst Object that holds the instance. + * @param {DOMElement} el DOM Element to associate with the object. + * @param {Object} [optionalPrefix] Defaults to 'instance' + */ + registerInstance: function(inst, el, optionalPrefix) { + if (inst._instanceId) { return; } + + if (typeof inst !== 'object') { throw new TypeError('1st argument must be a JavaScript object!'); } + + if (inst._options && inst._options.skipRegister) { return; } + + if (!this.isDOMElement(el)) { throw new TypeError('2nd argument must be a DOM element!'); } + if (optionalPrefix !== undefined && typeof optionalPrefix !== 'string') { throw new TypeError('3rd argument must be a string!'); } + var id = (optionalPrefix || 'instance') + (++lastIdNum); + instances[id] = inst; + inst._instanceId = id; + var dataInst = el.getAttribute('data-instance'); + dataInst = (dataInst !== null) ? [dataInst, id].join(' ') : id; + el.setAttribute('data-instance', dataInst); + }, + + /** + * This method deletes/destroy an instance with a given id. + * + * @method unregisterInstance + * @static + * @param {String} id Id of the instance to be destroyed. + */ + unregisterInstance: function(id) { + delete instances[id]; + }, + + /** + * This method retrieves the registered instance(s) of a given element or instance id. + * + * @method getInstance + * @static + * @param {String|DOMElement} instanceIdOrElement Instance's id or DOM Element from which we want the instances. + * @return {Object|Object[]} Returns an instance or a collection of instances. + */ + getInstance: function(instanceIdOrElement) { + var ids; + if (this.isDOMElement(instanceIdOrElement)) { + ids = instanceIdOrElement.getAttribute('data-instance'); + if (ids === null) { throw new Error('argument is not a DOM instance element!'); } + } + else { + ids = instanceIdOrElement; + } + + ids = ids.split(' '); + var inst, id, i, l = ids.length; + + var res = []; + for (i = 0; i < l; ++i) { + id = ids[i]; + if (!id) { throw new Error('Element is not a JS instance!'); } + inst = instances[id]; + if (!inst) { throw new Error('Instance "' + id + '" not found!'); } + res.push(inst); + } + + return (l === 1) ? res[0] : res; + }, + + /** + * This method retrieves the registered instance(s) of an element based on the given selector. + * + * @method getInstanceFromSelector + * @static + * @param {String} selector CSS selector to define the element from which it'll get the instance(s). + * @return {Object|Object[]} Returns an instance or a collection of instances. + */ + getInstanceFromSelector: function(selector) { + var el = Selector.select(selector)[0]; + if (!el) { throw new Error('Element not found!'); } + return this.getInstance(el); + }, + + /** + * This method retrieves the registered instances' ids of all instances. + * + * @method getInstanceIds + * @static + * @return {String[]} Id or collection of ids of all existing instances. + */ + getInstanceIds: function() { + var res = []; + for (var id in instances) { + if (instances.hasOwnProperty(id)) { + res.push( id ); + } + } + return res; + }, + + /** + * This method retrieves all existing instances. + * + * @method getInstances + * @static + * @return {Object[]} Collection of existing instances. + */ + getInstances: function() { + var res = []; + for (var id in instances) { + if (instances.hasOwnProperty(id)) { + res.push( instances[id] ); + } + } + return res; + }, + + /** + * This method is not to supposed to be invoked by the Common component. + * Components should copy this method as its destroy method. + * + * @method destroyComponent + * @static + */ + destroyComponent: function() { + Common.unregisterInstance(this._instanceId); + this._element.parentNode.removeChild(this._element); + } + + }; + + return Common; + +}); diff --git a/ajax/libs/ink/2.3.1/js/ink.datepicker.js b/ajax/libs/ink/2.3.1/js/ink.datepicker.js new file mode 100644 index 000000000..ced59877f --- /dev/null +++ b/ajax/libs/ink/2.3.1/js/ink.datepicker.js @@ -0,0 +1,1395 @@ +/** + * @module Ink.UI.DatePicker_1 + * @author inkdev AT sapo.pt + * @version 1 + */ +Ink.createModule('Ink.UI.DatePicker', '1', ['Ink.UI.Common_1','Ink.Dom.Event_1','Ink.Dom.Css_1','Ink.Dom.Element_1','Ink.Dom.Selector_1','Ink.Util.Array_1','Ink.Util.Date_1', 'Ink.Dom.Browser_1'], function(Common, Event, Css, InkElement, Selector, InkArray, InkDate ) { + 'use strict'; + + // Repeat a string. Long version of (new Array(n)).join(str); + function strRepeat(n, str) { + var ret = ''; + for (var i = 0; i < n; i++) { + ret += str; + } + return ret; + } + + // Clamp a number into a min/max limit + function clamp(n, min, max) { + if (n > max) { n = max; } + if (n < min) { n = min; } + + return n; + } + + function dateishFromYMDString(YMD) { + var split = YMD.split('-'); + return dateishFromYMD(+split[0], +split[1] - 1, +split[2]); + } + + function dateishFromYMD(year, month, day) { + return {_year: year, _month: month, _day: day}; + } + + function dateishFromDate(date) { + return {_year: date.getFullYear(), _month: date.getMonth(), _day: date.getDate()}; + } + + /** + * @class Ink.UI.DatePicker + * @constructor + * @version 1 + * + * @param {String|DOMElement} selector + * @param {Object} [options] Options + * @param {Boolean} [options.autoOpen=false] set to `true` to automatically open the datepicker. + * @param {String} [options.cleanText] text to display on clean button. defaults to 'Limpar' + * @param {String} [options.closeText] text to display on close button. defaults to 'Fechar' + * @param {String} [options.cssClass] CSS class to be applied to the datepicker + * @param {String} [options.dateRange] enforce limits to year, month and day for the Date, ex: '1990-08-25:2020-11' + * @param {Boolean} [options.displayInSelect] whether to display the component in a select. defaults to false. + * @param {String|DOMElement} [options.dayField] (if using options.displayInSelect) `` field with months. + * @param {String|DOMElement} [options.yearField] (if using options.displayInSelect) ` + * + */ + var DatePicker = function(selector, options) { + this._element = selector && + Common.elOrSelector(selector, '[Ink.UI.DatePicker_1]: selector argument'); + + this._options = Common.options('Ink.UI.DatePicker_1', { + autoOpen: ['Boolean', false], + cleanText: ['String', 'Clear'], + closeText: ['String', 'Close'], + containerElement:['Element', null], + cssClass: ['String', 'ink-calendar bottom'], + dateRange: ['String', null], + + // use this in a must be a direct child of .control, and if not, remove this block. + this._wrapper = this._element.parentNode; + this._wrapperIsControl = true; + } else { + this._wrapper = InkElement.create('div', { className: 'ink-datepicker-wrapper' }); + InkElement.wrap(this._element, this._wrapper); + } + InkElement.insertAfter(this._containerObject, this._element); + }, + + /** + * Render the topmost bar with the "close" and "clear" buttons. + */ + _renderSuperTopBar: function () { + if((!this._options.showClose) || (!this._options.showClean)){ return; } + + this._superTopBar = document.createElement("div"); + this._superTopBar.className = 'ink-calendar-top-options'; + if(this._options.showClean){ + this._superTopBar.appendChild(InkElement.create('a', { + className: 'clean', + setHTML: this._options.cleanText + })); + } + if(this._options.showClose){ + this._superTopBar.appendChild(InkElement.create('a', { + className: 'close', + setHTML: this._options.closeText + })); + } + this._containerObject.appendChild(this._superTopBar); + }, + + _listenToContainerObjectEvents: function () { + Event.observe(this._containerObject,'mouseover',Ink.bindEvent(function(e){ + Event.stop( e ); + this._hoverPicker = true; + },this)); + + Event.observe(this._containerObject,'mouseout',Ink.bindEvent(function(e){ + Event.stop( e ); + this._hoverPicker = false; + },this)); + + Event.observe(this._containerObject,'click',Ink.bindEvent(this._onClick, this)); + }, + + _onClick: function(e){ + var elem = Event.element(e); + + if (Css.hasClassName(elem, 'ink-calendar-off')) { + Event.stopDefault(e); + return null; + } + + Event.stop(e); + + // Relative changers + this._onRelativeChangerClick(elem); + + // Absolute changers + this._onAbsoluteChangerClick(elem); + + // Mode changers + if (Css.hasClassName(elem, 'ink-calendar-link-month')) { + this._showMonthSelector(); + } else if (Css.hasClassName(elem, 'ink-calendar-link-year')) { + this._showYearSelector(); + } else if(Css.hasClassName(elem, 'clean')){ + this._clean(); + } else if(Css.hasClassName(elem, 'close')){ + this._hide(false); + } + + this._updateDescription(); + }, + + /** + * Handle click events on a changer (« ») for next/prev year/month + * @method _onChangerClick + * @private + **/ + _onRelativeChangerClick: function (elem) { + var changeYear = { + change_year_next: 1, + change_year_prev: -1 + }; + var changeMonth = { + change_month_next: 1, + change_month_prev: -1 + }; + + if( elem.className in changeMonth ) { + this._updateCal(changeMonth[elem.className]); + } else if( elem.className in changeYear ) { + this._showYearSelector(changeYear[elem.className]); + } + }, + + /** + * Handle click events on an atom-changer (day button, month button, year button) + * + * @method _onAbsoluteChangerClick + * @private + */ + _onAbsoluteChangerClick: function (elem) { + var elemData = InkElement.data(elem); + + if( Number(elemData.calDay) ){ + this.setDate( [this._year, this._month + 1, elemData.calDay].join('-') ); + this._hide(); + } else if( Number(elemData.calMonth) ) { + this._month = Number(elemData.calMonth) - 1; + this._showDefaultView(); + this._updateCal(); + } else if( Number(elemData.calYear) ){ + this._changeYear(Number(elemData.calYear)); + } + }, + + _changeYear: function (year) { + year = +year; + if(year){ + this._year = year; + if( typeof this._options.onYearSelected === 'function' ){ + this._options.onYearSelected(this, { + 'year': this._year + }); + } + this._showMonthSelector(); + } + }, + + _clean: function () { + if(this._options.displayInSelect){ + this._options.yearField.selectedIndex = 0; + this._options.monthField.selectedIndex = 0; + this._options.dayField.selectedIndex = 0; + } else { + this._element.value = ''; + } + }, + + /** + * Hides the DatePicker. If the component is shy (options.shy), behaves differently. + * + * @method _hide + * @param [blur=true] Set to false to indicate this is not just a blur and force hiding even if the component is shy. + */ + _hide: function(blur) { + blur = blur === undefined ? true : blur; + if (blur === false || (blur && this._options.shy)) { + Css.addClassName(this._containerObject, 'hide-all'); + } + }, + + /** + * Sets the range of dates allowed to be selected in the Date Picker + * + * @method _setMinMax + * @param {String} dateRange Two dates separated by a ':'. Example: 2013-01-01:2013-12-12 + * @private + */ + _setMinMax: function( dateRange ) { + var self = this; + + var noMinLimit = { + _year: -Number.MAX_VALUE, + _month: 0, + _day: 1 + }; + + var noMaxLimit = { + _year: Number.MAX_VALUE, + _month: 11, + _day: 31 + }; + + function noLimits() { + self._min = noMinLimit; + self._max = noMaxLimit; + } + + if (!dateRange) { return noLimits(); } + + var dates = dateRange.split( ':' ); + var rDate = /^(\d{4})((\-)(\d{1,2})((\-)(\d{1,2}))?)?$/; + + InkArray.each([ + {name: '_min', date: dates[0], noLim: noMinLimit}, + {name: '_max', date: dates[1], noLim: noMaxLimit} + ], Ink.bind(function (data) { + + var lim = data.noLim; + + if ( data.date.toUpperCase() === 'NOW' ) { + var now = new Date(); + lim = dateishFromDate(now); + } else if (data.date.toUpperCase() === 'EVER') { + lim = data.noLim; + } else if ( rDate.test( data.date ) ) { + lim = dateishFromYMDString(data.date); + + lim._month = clamp(lim._month, 0, 11); + lim._day = clamp(lim._day, 1, this._daysInMonth( lim._year, lim._month )); + } + + this[data.name] = lim; + }, this)); + + // Should be equal, or min should be smaller + var valid = this._dateCmp(this._max, this._min) !== -1; + + if (!valid) { + noLimits(); + } + }, + + /** + * Checks if a date is between the valid range. + * Starts by checking if the date passed is valid. If not, will fallback to the 'today' date. + * Then checks if the all params are inside of the date range specified. If not, it will fallback to the nearest valid date (either Min or Max). + * + * @method _fitDateToRange + * @param {Number} year Year with 4 digits (yyyy) + * @param {Number} month Month + * @param {Number} day Day + * @return {Array} Array with the final processed date. + * @private + */ + _fitDateToRange: function( date ) { + if ( !this._isValidDate( date ) ) { + date = dateishFromDate(new Date()); + } + + if (this._dateCmp(date, this._min) === -1) { + return Ink.extendObj({}, this._min); + } else if (this._dateCmp(date, this._max) === 1) { + return Ink.extendObj({}, this._max); + } + + return Ink.extendObj({}, date); // date is okay already, just copy it. + }, + + /** + * Checks whether a date is within the valid date range + * @method _dateWithinRange + * @param year + * @param month + * @param day + * @return {Boolean} + * @private + */ + _dateWithinRange: function (date) { + if (!arguments.length) { + date = this; + } + + return (!this._dateAboveMax(date) && + (!this._dateBelowMin(date))); + }, + + _dateAboveMax: function (date) { + return this._dateCmp(date, this._max) === 1; + }, + + _dateBelowMin: function (date) { + return this._dateCmp(date, this._min) === -1; + }, + + _dateCmp: function (self, oth) { + return this._dateCmpUntil(self, oth, '_day'); + }, + + /** + * _dateCmp with varied precision. You can compare down to the day field, or, just to the month. + * // the following two dates are considered equal because we asked + * // _dateCmpUntil to just check up to the years. + * + * _dateCmpUntil({_year: 2000, _month: 10}, {_year: 2000, _month: 11}, '_year') === 0 + */ + _dateCmpUntil: function (self, oth, depth) { + var props = ['_year', '_month', '_day']; + var i = -1; + + do { + i++; + if (self[props[i]] > oth[props[i]]) { return 1; } + else if (self[props[i]] < oth[props[i]]) { return -1; } + } while (props[i] !== depth && + self[props[i + 1]] !== undefined && oth[props[i + 1]] !== undefined); + + return 0; + }, + + /** + * Sets the markup in the default view mode (showing the days). + * Also disables the previous and next buttons in case they don't meet the range requirements. + * + * @method _showDefaultView + * @private + */ + _showDefaultView: function(){ + this._yearSelector.style.display = 'none'; + this._monthSelector.style.display = 'none'; + this._monthPrev.childNodes[0].className = 'change_month_prev'; + this._monthNext.childNodes[0].className = 'change_month_next'; + + if ( !this._getPrevMonth() ) { + this._monthPrev.childNodes[0].className = 'action_inactive'; + } + + if ( !this._getNextMonth() ) { + this._monthNext.childNodes[0].className = 'action_inactive'; + } + + this._monthContainer.style.display = 'block'; + }, + + /** + * Updates the date shown on the datepicker + * + * @method _updateDate + * @private + */ + _updateDate: function(){ + var dataParsed; + if(!this._options.displayInSelect && this._element.value){ + dataParsed = this._parseDate(this._element.value); + } else if (this._options.displayInSelect) { + dataParsed = { + _year: this._options.yearField[this._options.yearField.selectedIndex].value, + _month: this._options.monthField[this._options.monthField.selectedIndex].value - 1, + _day: this._options.dayField[this._options.dayField.selectedIndex].value + }; + } + + if (dataParsed) { + dataParsed = this._fitDateToRange(dataParsed); + this._year = dataParsed._year; + this._month = dataParsed._month; + this._day = dataParsed._day; + } + this.setDate(); + this._updateDescription(); + this._renderMonth(); + }, + + /** + * Updates the date description shown at the top of the datepicker + * + * EG "12 de November" + * + * @method _updateDescription + * @private + */ + _updateDescription: function(){ + this._monthChanger.innerHTML = this._options.month[ this._month + 1 ]; + this._ofText.innerHTML = this._options.ofText; + this._yearChanger.innerHTML = this._year; + }, + + /** + * Renders the year selector view of the datepicker + * + * @method _showYearSelector + * @private + */ + _showYearSelector: function(inc){ + this._incrementViewingYear(inc); + + var firstYear = this._year - (this._year % 10); + var thisYear = firstYear - 1; + var str = "
              • "; + + if (thisYear > this._min._year) { + str += '
              • ' + this._options.prevLinkText + '
              • '; + } else { + str += '
              •  
              • '; + } + + for (var i=1; i < 11; i++){ + if (i % 4 === 0){ + str+='
                '; + } + + thisYear = firstYear + i - 1; + + str += this._getYearButtonHtml(thisYear); + } + + if( thisYear < this._max._year){ + str += '
              • ' + this._options.nextLinkText + '
              • '; + } else { + str += '
              •  
              • '; + } + + str += "
            • "; + + this._yearSelector.innerHTML = str; + this._monthPrev.childNodes[0].className = 'action_inactive'; + this._monthNext.childNodes[0].className = 'action_inactive'; + this._monthSelector.style.display = 'none'; + this._monthContainer.style.display = 'none'; + this._yearSelector.style.display = 'block'; + }, + + /** + * For the year selector. + * + * Update this._year, to find the next decade or use nextValidDateFn to find it. + */ + _incrementViewingYear: function (inc) { + if (!inc) { return; } + + var year = +this._year + inc*10; + year = year - year % 10; + if ( year > this._max._year || year + 9 < this._min._year){ + return; + } + this._year = +this._year + inc*10; + }, + + _getYearButtonHtml: function (thisYear) { + if ( this._acceptableYear({_year: thisYear}) ){ + var className = (thisYear === this._year) ? ' class="ink-calendar-on"' : ''; + return '
            • ' + thisYear +'
            • '; + } else { + return '
            • ' + thisYear +'
            • '; + + } + }, + + /** + * Show the month selector (happens when you click a year, or the "month" link. + * @method _showMonthSelector + * @private + */ + _showMonthSelector: function () { + this._yearSelector.style.display = 'none'; + this._monthContainer.style.display = 'none'; + this._monthPrev.childNodes[0].className = 'action_inactive'; + this._monthNext.childNodes[0].className = 'action_inactive'; + this._addMonthClassNames(); + this._monthSelector.style.display = 'block'; + }, + + /** + * This function returns the given date in the dateish format + * + * @method _parseDate + * @param {String} dateStr A date on a string. + * @private + */ + _parseDate: function(dateStr){ + var date = InkDate.set( this._options.format , dateStr ); + if (date) { + return dateishFromDate(date); + } + return null; + }, + + /** + * Checks if a date is valid + * + * @method _isValidDate + * @param {Dateish} date + * @private + * @return {Boolean} True if the date is valid, false otherwise + */ + _isValidDate: function(date){ + var yearRegExp = /^\d{4}$/; + var validOneOrTwo = /^\d{1,2}$/; + return ( + yearRegExp.test(date._year) && + validOneOrTwo.test(date._month) && + validOneOrTwo.test(date._day) && + +date._month + 1 >= 1 && + +date._month + 1 <= 12 && + +date._day >= 1 && + +date._day <= this._daysInMonth(date._year, date._month + 1) + ); + }, + + /** + * Checks if a given date is an valid format. + * + * @method _isDate + * @param {String} format A date format. + * @param {String} dateStr A date on a string. + * @private + * @return {Boolean} True if the given date is valid according to the given format + */ + _isDate: function(format, dateStr){ + try { + if (typeof format === 'undefined'){ + return false; + } + var date = InkDate.set( format , dateStr ); + if( date && this._isValidDate( dateishFromDate(date) )) { + return true; + } + } catch (ex) {} + + return false; + }, + + _acceptableDay: function (date) { + return this._acceptableDateComponent(date, 'validDayFn'); + }, + + _acceptableMonth: function (date) { + return this._acceptableDateComponent(date, 'validMonthFn'); + }, + + _acceptableYear: function (date) { + return this._acceptableDateComponent(date, 'validYearFn'); + }, + + /** DRY base for the above 2 functions */ + _acceptableDateComponent: function (date, userCb) { + if (this._options[userCb]) { + return this._callUserCallbackBool(this._options[userCb], date); + } else { + return this._dateWithinRange(date); + } + }, + + /** + * This method returns the date written with the format specified on the options + * + * @method _writeDateInFormat + * @private + * @return {String} Returns the current date of the object in the specified format + */ + _writeDateInFormat:function(){ + return InkDate.get( this._options.format , this.getDate()); + }, + + /** + * This method allows the user to set the DatePicker's date on run-time. + * + * @method setDate + * @param {String} dateString A date string in yyyy-mm-dd format. + * @public + */ + setDate: function( dateString ) { + if ( /\d{4}-\d{1,2}-\d{1,2}/.test( dateString ) ) { + var auxDate = dateString.split( '-' ); + this._year = +auxDate[ 0 ]; + this._month = +auxDate[ 1 ] - 1; + this._day = +auxDate[ 2 ]; + } + + this._setDate( ); + }, + + /** + * Get the current date as a JavaScript date. + * + * @method getDate + */ + getDate: function () { + if (!this._day) { + throw 'Ink.UI.DatePicker: Still picking a date. Cannot getDate now!'; + } + return new Date(this._year, this._month, this._day); + }, + + /** + * Sets the chosen date on the target input field + * + * @method _setDate + * @param {DOMElement} objClicked Clicked object inside the DatePicker's calendar. + * @private + */ + _setDate : function( objClicked ) { + if (objClicked) { + var data = InkElement.data(objClicked); + this._day = (+data.calDay) || this._day; + } + + var dt = this._fitDateToRange(this); + + this._year = dt._year; + this._month = dt._month; + this._day = dt._day; + + if(!this._options.displayInSelect){ + this._element.value = this._writeDateInFormat(); + } else { + this._options.dayField.value = this._day; + this._options.monthField.value = this._month + 1; + this._options.yearField.value = this._year; + } + + if(this._options.onSetDate) { + this._options.onSetDate( this , { date : this.getDate() } ); + } + }, + + /** + * Makes the necessary work to update the calendar + * when choosing a different month + * + * @method _updateCal + * @param {Number} inc Indicates previous or next month + * @private + */ + _updateCal: function(inc){ + if( typeof this._options.onMonthSelected === 'function' ){ + this._options.onMonthSelected(this, { + 'year': this._year, + 'month' : this._month + }); + } + if (inc && this._updateMonth(inc) === null) { + return; + } + this._renderMonth(); + }, + + /** + * Function that returns the number of days on a given month on a given year + * + * @method _daysInMonth + * @param {Number} _y - year + * @param {Number} _m - month + * @private + * @return {Number} The number of days on a given month on a given year + */ + _daysInMonth: function(_y,_m){ + var exceptions = { + 2: ((_y % 400 === 0) || (_y % 4 === 0 && _y % 100 !== 0)) ? 29 : 28, + 4: 30, + 6: 30, + 9: 30, + 11: 30 + }; + + return exceptions[_m] || 31; + }, + + + /** + * Updates the calendar when a different month is chosen + * + * @method _updateMonth + * @param {Number} incValue - indicates previous or next month + * @private + */ + _updateMonth: function(incValue){ + var date; + if (incValue > 0) { + date = this._getNextMonth(); + } else if (incValue < 0) { + date = this._getPrevMonth(); + } + if (!date) { return null; } + this._year = date._year; + this._month = date._month; + this._day = date._day; + }, + + /** + * Get the next month we can show. + */ + _getNextMonth: function (date) { + return this._tryLeap( date, 'Month', 'next', function (d) { + d._month += 1; + if (d._month > 11) { + d._month = 0; + d._year += 1; + } + return d; + }); + }, + + /** + * Get the previous month we can show. + */ + _getPrevMonth: function (date) { + return this._tryLeap( date, 'Month', 'prev', function (d) { + d._month -= 1; + if (d._month < 0) { + d._month = 11; + d._year -= 1; + } + return d; + }); + }, + + /** + * Get the next year we can show. + */ + _getPrevYear: function (date) { + return this._tryLeap( date, 'Year', 'prev', function (d) { + d._year -= 1; + return d; + }); + }, + + /** + * Get the next year we can show. + */ + _getNextYear: function (date) { + return this._tryLeap( date, 'Year', 'next', function (d) { + d._year += 1; + return d; + }); + }, + + /** + * DRY base for a function which tries to get the next or previous valid year or month. + * + * It checks if we can go forward by using _dateCmp with atomic + * precision (this means, {_year} for leaping years, and + * {_year, month} for leaping months), then it tries to get the + * result from the user-supplied callback (nextDateFn or prevDateFn), + * and when this is not present, advance the date forward using the + * `advancer` callback. + */ + _tryLeap: function (date, atomName, directionName, advancer) { + date = date || { _year: this._year, _month: this._month, _day: this._day }; + + var maxOrMin = directionName === 'prev' ? '_min' : '_max'; + var boundary = this[maxOrMin]; + + // Check if we're by the boundary of min/max year/month + if (this._dateCmpUntil(date, boundary, atomName) === 0) { + return null; // We're already at the boundary. Bail. + } + + var leapUserCb = this._options[directionName + 'ValidDateFn']; + if (leapUserCb) { + return this._callUserCallbackDate(leapUserCb, date); + } else { + date = advancer(date); + } + + date = this._fitDateToRange(date); + + return this['_acceptable' + atomName](date) ? date : null; + }, + + _getNextDecade: function (date) { + date = date || { _year: this._year, _month: this._month, _day: this._day }; + var decade = this._getCurrentDecade(date); + if (decade + 10 > this._max._year) { return null; } + return decade + 10; + }, + + _getPrevDecade: function (date) { + date = date || { _year: this._year, _month: this._month, _day: this._day }; + var decade = this._getCurrentDecade(date); + if (decade - 10 < this._min._year) { return null; } + return decade - 10; + }, + + /** Returns the decade given a date or year*/ + _getCurrentDecade: function (year) { + year = year ? (year._year || year) : this._year; + return Math.floor(year / 10) * 10; // Round to first place + }, + + _callUserCallbackBase: function (cb, date) { + return cb.call(this, date._year, date._month + 1, date._day); + }, + + _callUserCallbackBool: function (cb, date) { + return !!this._callUserCallbackBase(cb, date); + }, + + _callUserCallbackDate: function (cb, date) { + var ret = this._callUserCallbackBase(cb, date); + return ret ? dateishFromDate(ret) : null; + }, + + /** + * Key-value object that (for a given key) points to the correct parsing format for the DatePicker + * @property _dateParsers + * @type {Object} + * @readOnly + */ + _dateParsers: { + 'yyyy-mm-dd' : 'Y-m-d' , + 'yyyy/mm/dd' : 'Y/m/d' , + 'yy-mm-dd' : 'y-m-d' , + 'yy/mm/dd' : 'y/m/d' , + 'dd-mm-yyyy' : 'd-m-Y' , + 'dd/mm/yyyy' : 'd/m/Y' , + 'dd-mm-yy' : 'd-m-y' , + 'dd/mm/yy' : 'd/m/y' , + 'mm/dd/yyyy' : 'm/d/Y' , + 'mm-dd-yyyy' : 'm-d-Y' + }, + + /** + * Renders the current month + * + * @method _renderMonth + * @private + */ + _renderMonth: function(){ + var month = this._month; + var year = this._year; + + // Week day of the first day in the month + var wDayFirst = (new Date( year , month , 1 )).getDay(); + + var startWeekDay = this._options.startWeekDay || 0; + + this._showDefaultView(); + + if(startWeekDay > wDayFirst) { + wDayFirst = 7 + startWeekDay - wDayFirst; + } else { + wDayFirst += startWeekDay; + } + + var html = ''; + + html += this._getMonthCalendarHeaderHtml(startWeekDay); + + var counter = 0; + html+='
                '; + + var emptyHtml = '
              •  
              • '; + + // Add padding if the first day of the month is not monday. + if(wDayFirst !== 0) { + var empties = wDayFirst - startWeekDay - 1; + counter += empties; + html += strRepeat(empties, emptyHtml); + } + + html += this._getDayButtonsHtml(counter, year, month); + + html += '
              '; + + this._monthContainer.innerHTML = html; + }, + + _getDayButtonsHtml: function (counter, year, month) { + var daysInMonth = this._daysInMonth(year, month); + var ret = ''; + for (var day = 1; day <= daysInMonth; day++) { + if (counter === 7){ // new week + counter=0; + ret += '
                '; + } + + ret += this._getDayButtonHtml(year, month, day); + + counter++; + if(counter === 7){ + ret += '
              '; + } + } + return ret; + }, + + /** + * Get the HTML markup for a single day in month view, given year, month, day. + * + * @method _getDayButtonHtml + * @private + */ + _getDayButtonHtml: function (year, month, day) { + var attrs = ' '; + var date = dateishFromYMD(year, month, day); + if (!this._acceptableDay(date)) { + attrs += 'class="ink-calendar-off"'; + } else { + attrs += 'data-cal-day="' + day + '"'; + } + + if (this._day && this._dateCmp(date, this) === 0) { + attrs += 'class="ink-calendar-on" data-cal-day="' + day + '"'; + } + + return '
            • ' + day + '
            • '; + }, + + /** Write the top bar of the calendar (M T W T F S S) */ + _getMonthCalendarHeaderHtml: function (startWeekDay) { + var ret = '
                '; + var wDay; + for(var i=0; i<7; i++){ + wDay = (startWeekDay + i) % 7; + ret += '
              • ' + + this._options.wDay[wDay].substring(0,1) + + '
              • '; + } + return ret + '
              '; + }, + + /** + * This method adds class names to month buttons, to visually distinguish. + * + * @method _addMonthClassNames + * @param {DOMElement} parent DOMElement where all the months are. + * @private + */ + _addMonthClassNames: function(parent){ + InkArray.forEach( + (parent || this._monthSelector).getElementsByTagName('a'), + Ink.bindMethod(this, '_addMonthButtonClassNames')); + }, + + /** + * Add the ink-calendar-on className if the given button is the current month, + * otherwise add the ink-calendar-off className if the given button refers to + * an unacceptable month (given dateRange and validMonthFn) + */ + _addMonthButtonClassNames: function (btn) { + var data = InkElement.data(btn); + if (!data.calMonth) { throw 'not a calendar month button!'; } + + var month = +data.calMonth - 1; + + if ( month === this._month ) { + Css.addClassName( btn, 'ink-calendar-on' ); // This month + Css.removeClassName( btn, 'ink-calendar-off' ); + } else { + Css.removeClassName( btn, 'ink-calendar-on' ); // Not this month + + var toDisable = !this._acceptableMonth({_year: this._year, _month: month}); + Css.addRemoveClassName( btn, 'ink-calendar-off', toDisable); + } + }, + + /** + * Prototype's method to allow the 'i18n files' to change all objects' language at once. + * @param {Object} options Object with the texts' configuration. + * @param {String} closeText Text of the close anchor + * @param {String} cleanText Text of the clean text anchor + * @param {String} prevLinkText "Previous" link's text + * @param {String} nextLinkText "Next" link's text + * @param {String} ofText The text "of", present in 'May of 2013' + * @param {Object} month An object with keys from 1 to 12 that have the full months' names + * @param {Object} wDay An object with keys from 0 to 6 that have the full weekdays' names + * @public + */ + lang: function( options ){ + this._lang = options; + }, + + /** + * This calls the rendering of the selected month. (Deprecated: use show() instead) + * + * @method showMonth + * @public + */ + showMonth: function(){ + this._renderMonth(); + }, + + /** + * Returns true if the calendar sceen is in 'select day' mode + * + * @return {Boolean} True if the calendar sceen is in 'select day' mode + * @public + */ + isMonthRendered: function(){ + var header = Selector.select('.ink-calendar-header', this._containerObject)[0]; + + return ((Css.getStyle(header.parentNode,'display') !== 'none') && + (Css.getStyle(header.parentNode.parentNode,'display') !== 'none') ); + }, + + /** + * Destroys this datepicker, removing it from the page. + * + * @public + **/ + destroy: function () { + InkElement.unwrap(this._element); + InkElement.remove(this._wrapper); + InkElement.remove(this._containerObject); + Common.unregisterInstance.call(this); + } + }; + + return DatePicker; +}); diff --git a/ajax/libs/ink/2.3.1/js/ink.draggable.js b/ajax/libs/ink/2.3.1/js/ink.draggable.js new file mode 100644 index 000000000..9e36818e3 --- /dev/null +++ b/ajax/libs/ink/2.3.1/js/ink.draggable.js @@ -0,0 +1,441 @@ +/* + * @module Ink.UI.Draggable_1 + * @author inkdev AT sapo.pt + * @version 1 + */ +Ink.createModule("Ink.UI.Draggable","1",["Ink.Dom.Element_1", "Ink.Dom.Event_1", "Ink.Dom.Css_1", "Ink.Dom.Browser_1", "Ink.Dom.Selector_1", "Ink.UI.Common_1"],function( InkElement, InkEvent, Css, Browser, Selector, Common) { + 'use strict'; + + var x = 0, + y = 1; // For accessing coords in [x, y] arrays + + // Get a value between two boundaries + function between (val, min, max) { + val = Math.min(val, max); + val = Math.max(val, min); + return val; + } + + /** + * @class Ink.UI.Draggable + * @version 1 + * @constructor + * @param {String|DOMElement} target Target element. + * @param {Object} [options] Optional object for configuring the component + * @param {String} [options.constraint] Movement constraint. None by default. Can be `vertical`, `horizontal`, or `both`. + * @param {String|DomElement} [options.constraintElm] Constrain dragging to be within this element. None by default. + * @param {Number} [options.top,left,right,bottom] Limits for constraining draggable movement. + * @param {String|DOMElement} [options.handle] if specified, this element will be used as a handle for dragging. + * @param {Boolean} [options.revert] if true, reverts the draggable to the original position when dragging stops + * @param {String} [options.cursor] cursor type (CSS `cursor` value) used when the mouse is over the draggable object + * @param {Number} [options.zIndex] zindex applied to the draggable element while dragged + * @param {Number} [options.fps] if defined, on drag will run every n frames per second only + * @param {DomElement} [options.droppableProxy] if set, a shallow copy of the droppableProxy will be put on document.body with transparent bg + * @param {String} [options.mouseAnchor] defaults to mouse cursor. can be 'left|center|right top|center|bottom' + * @param {String} [options.dragClass='drag'] class to add when the draggable is being dragged. + * @param {Function} [options.onStart] callback called when dragging starts + * @param {Function} [options.onEnd] callback called when dragging stops + * @param {Function} [options.onDrag] callback called while dragging, prior to position updates + * @param {Function} [options.onChange] callback called while dragging, after position updates + * @example + * Ink.requireModules( ['Ink.UI.Draggable_1'], function( Draggable ){ + * new Draggable( '#myElementId' ); + * }); + */ + var Draggable = function(element, options) { + this.init(element, options); + }; + + Draggable.prototype = { + + /** + * Init function called by the constructor + * + * @method _init + * @param {String|DOMElement} element ID of the element or DOM Element. + * @param {Object} [options] Options object for configuration of the module. + * @private + */ + init: function(element, options) { + var o = Ink.extendObj( { + constraint: false, + constraintElm: false, + top: false, + right: false, + bottom: false, + left: false, + handle: options.handler /* old option name */ || false, + revert: false, + cursor: 'move', + zindex: options.zindex /* old option name */ || 9999, + dragClass: 'drag', + onStart: false, + onEnd: false, + onDrag: false, + onChange: false, + droppableProxy: false, + mouseAnchor: undefined, + skipChildren: true, + fps: 100, + debug: false + }, options || {}, InkElement.data(element)); + + this.options = o; + this.element = Common.elOrSelector(element); + this.constraintElm = o.constraintElm && Common.elOrSelector(o.constraintElm); + + this.handle = false; + this.elmStartPosition = false; + this.active = false; + this.dragged = false; + this.prevCoords = false; + this.placeholder = false; + + this.position = false; + this.zindex = false; + this.firstDrag = true; + + if (o.fps) { + this.deltaMs = 1000 / o.fps; + this.lastRunAt = 0; + } + + this.handlers = {}; + this.handlers.start = Ink.bindEvent(this._onStart,this); + this.handlers.dragFacade = Ink.bindEvent(this._onDragFacade,this); + this.handlers.drag = Ink.bindEvent(this._onDrag,this); + this.handlers.end = Ink.bindEvent(this._onEnd,this); + this.handlers.selectStart = function(event) { InkEvent.stop(event); return false; }; + + // set handle + this.handle = (this.options.handle) ? + Common.elOrSelector(this.options.handle) : this.element; + this.handle.style.cursor = o.cursor; + + InkEvent.observe(this.handle, 'touchstart', this.handlers.start); + InkEvent.observe(this.handle, 'mousedown', this.handlers.start); + + if (Browser.IE) { + InkEvent.observe(this.element, 'selectstart', this.handlers.selectStart); + } + }, + + /** + * Removes the ability of the element of being dragged + * + * @method destroy + * @public + */ + destroy: function() { + InkEvent.stopObserving(this.handle, 'touchstart', this.handlers.start); + InkEvent.stopObserving(this.handle, 'mousedown', this.handlers.start); + + if (Browser.IE) { + InkEvent.stopObserving(this.element, 'selectstart', this.handlers.selectStart); + } + }, + + /** + * Gets coordinates for a given event (with added page scroll) + * + * @method _getCoords + * @param {Object} e window.event object. + * @return {Array} Array where the first position is the x coordinate, the second is the y coordinate + * @private + */ + _getCoords: function(e) { + var ps = [InkElement.scrollWidth(), InkElement.scrollHeight()]; + return { + x: (e.touches ? e.touches[0].clientX : e.clientX) + ps[x], + y: (e.touches ? e.touches[0].clientY : e.clientY) + ps[y] + }; + }, + + /** + * Clones src element's relevant properties to dst + * + * @method _cloneStyle + * @param {DOMElement} src Element from where we're getting the styles + * @param {DOMElement} dst Element where we're placing the styles. + * @private + */ + _cloneStyle: function(src, dst) { + dst.className = src.className; + dst.style.borderWidth = '0'; + dst.style.padding = '0'; + dst.style.position = 'absolute'; + dst.style.width = InkElement.elementWidth(src) + 'px'; + dst.style.height = InkElement.elementHeight(src) + 'px'; + dst.style.left = InkElement.elementLeft(src) + 'px'; + dst.style.top = InkElement.elementTop(src) + 'px'; + dst.style.cssFloat = Css.getStyle(src, 'float'); + dst.style.display = Css.getStyle(src, 'display'); + }, + + /** + * onStart event handler + * + * @method _onStart + * @param {Object} e window.event object + * @return {Boolean|void} In some cases return false. Otherwise is void + * @private + */ + _onStart: function(e) { + if (!this.active && InkEvent.isLeftClick(e) || typeof e.button === 'undefined') { + + var tgtEl = InkEvent.element(e); + if (this.options.skipChildren && tgtEl !== this.handle) { return; } + + InkEvent.stop(e); + + Css.addClassName(this.element, this.options.dragClass); + + this.elmStartPosition = [ + InkElement.elementLeft(this.element), + InkElement.elementTop( this.element) + ]; + + var pos = [ + parseInt(Css.getStyle(this.element, 'left'), 10), + parseInt(Css.getStyle(this.element, 'top'), 10) + ]; + + var dims = InkElement.elementDimensions(this.element); + + this.originalPosition = [ pos[x] ? pos[x]: null, pos[y] ? pos[y] : null ]; + this.delta = this._getCoords(e); // mouse coords at beginning of drag + + this.active = true; + this.position = Css.getStyle(this.element, 'position'); + this.zindex = Css.getStyle(this.element, 'zIndex'); + + var div = document.createElement('div'); + div.style.position = this.position; + div.style.width = dims[x] + 'px'; + div.style.height = dims[y] + 'px'; + div.style.marginTop = Css.getStyle(this.element, 'margin-top'); + div.style.marginBottom = Css.getStyle(this.element, 'margin-bottom'); + div.style.marginLeft = Css.getStyle(this.element, 'margin-left'); + div.style.marginRight = Css.getStyle(this.element, 'margin-right'); + div.style.borderWidth = '0'; + div.style.padding = '0'; + div.style.cssFloat = Css.getStyle(this.element, 'float'); + div.style.display = Css.getStyle(this.element, 'display'); + div.style.visibility = 'hidden'; + + this.delta2 = [ this.delta.x - this.elmStartPosition[x], this.delta.y - this.elmStartPosition[y] ]; // diff between top-left corner of obj and mouse + if (this.options.mouseAnchor) { + var parts = this.options.mouseAnchor.split(' '); + var ad = [dims[x], dims[y]]; // starts with 'right bottom' + if (parts[0] === 'left') { ad[x] = 0; } else if(parts[0] === 'center') { ad[x] = parseInt(ad[x]/2, 10); } + if (parts[1] === 'top') { ad[y] = 0; } else if(parts[1] === 'center') { ad[y] = parseInt(ad[y]/2, 10); } + this.applyDelta = [this.delta2[x] - ad[x], this.delta2[y] - ad[y]]; + } + + var dragHandlerName = this.options.fps ? 'dragFacade' : 'drag'; + + this.placeholder = div; + + if (this.options.onStart) { this.options.onStart(this.element, e); } + + if (this.options.droppableProxy) { // create new transparent div to optimize DOM traversal during drag + this.proxy = document.createElement('div'); + dims = [ + window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth, + window.innerHeight || document.documentElement.clientHeight || document.body.clientHeight + ]; + var fs = this.proxy.style; + fs.width = dims[x] + 'px'; + fs.height = dims[y] + 'px'; + fs.position = 'fixed'; + fs.left = '0'; + fs.top = '0'; + fs.zIndex = this.options.zindex + 1; + fs.backgroundColor = '#FF0000'; + Css.setOpacity(this.proxy, 0); + + var firstEl = document.body.firstChild; + while (firstEl && firstEl.nodeType !== 1) { firstEl = firstEl.nextSibling; } + document.body.insertBefore(this.proxy, firstEl); + + + InkEvent.observe(this.proxy, 'mousemove', this.handlers[dragHandlerName]); + InkEvent.observe(this.proxy, 'touchmove', this.handlers[dragHandlerName]); + } + else { + InkEvent.observe(document, 'mousemove', this.handlers[dragHandlerName]); + } + + this.element.style.position = 'absolute'; + this.element.style.zIndex = this.options.zindex; + this.element.parentNode.insertBefore(this.placeholder, this.element); + + this._onDrag(e); + + InkEvent.observe(document, 'mouseup', this.handlers.end); + InkEvent.observe(document, 'touchend', this.handlers.end); + + return false; + } + }, + + /** + * Function that gets the timestamp of the current run from time to time. (FPS) + * + * @method _onDragFacade + * @param {Object} window.event object. + * @private + */ + _onDragFacade: function(e) { + var now = +new Date(); + if (!this.lastRunAt || now > this.lastRunAt + this.deltaMs) { + this.lastRunAt = now; + this._onDrag(e); + } + }, + + /** + * Function that handles the dragging movement + * + * @method _onDrag + * @param {Object} window.event object. + * @private + */ + _onDrag: function(e) { + if (this.active) { + InkEvent.stop(e); + this.dragged = true; + var mouseCoords = this._getCoords(e), + mPosX = mouseCoords.x, + mPosY = mouseCoords.y, + o = this.options, + newX = false, + newY = false; + + if (this.prevCoords && mPosX !== this.prevCoords.x || mPosY !== this.prevCoords.y) { + if (o.onDrag) { o.onDrag(this.element, e); } + this.prevCoords = mouseCoords; + + newX = this.elmStartPosition[x] + mPosX - this.delta.x; + newY = this.elmStartPosition[y] + mPosY - this.delta.y; + + var draggableSize = InkElement.elementDimensions(this.element); + + if (this.constraintElm) { + var offset = InkElement.offset(this.constraintElm); + var size = InkElement.elementDimensions(this.constraintElm); + var constTop = offset[y] + (o.top || 0), + constBottom = offset[y] + size[y] - (o.bottom || 0), + constLeft = offset[x] + (o.left || 0), + constRight = offset[x] + size[x] - (o.right || 0); + + newY = between(newY, constTop, constBottom - draggableSize[y]); + newX = between(newX, constLeft, constRight - draggableSize[x]); + } else if (o.constraint) { + var right = o.right === false ? InkElement.pageWidth() - draggableSize[x] : o.right, + left = o.left === false ? 0 : o.left, + top = o.top === false ? 0 : o.top, + bottom = o.bottom === false ? InkElement.pageHeight() - draggableSize[y] : o.bottom; + if (o.constraint === 'horizontal' || o.constraint === 'both') { + newX = between(newX, left, right); + } + if (o.constraint === 'vertical' || o.constraint === 'both') { + newY = between(newY, top, bottom); + } + } + + var Droppable = Ink.getModule('Ink.UI.Droppable_1'); + if (this.firstDrag) { + if (Droppable) { Droppable.updateAll(); } + /*this.element.style.position = 'absolute'; + this.element.style.zIndex = this.options.zindex; + this.element.parentNode.insertBefore(this.placeholder, this.element);*/ + this.firstDrag = false; + } + + if (newX) { this.element.style.left = newX + 'px'; } + if (newY) { this.element.style.top = newY + 'px'; } + + if (Droppable) { + // apply applyDelta defined on drag init + var mouseCoords2 = this.options.mouseAnchor ? + {x: mPosX - this.applyDelta[x], y: mPosY - this.applyDelta[y]} : + mouseCoords; + Droppable.action(mouseCoords2, 'drag', e, this.element); + } + if (o.onChange) { o.onChange(this); } + } + } + }, + + /** + * Function that handles the end of the dragging process + * + * @method _onEnd + * @param {Object} window.event object. + * @private + */ + _onEnd: function(e) { + InkEvent.stopObserving(document, 'mousemove', this.handlers.drag); + InkEvent.stopObserving(document, 'touchmove', this.handlers.drag); + + if (this.options.fps) { + this._onDrag(e); + } + + Css.removeClassName(this.element, this.options.dragClass); + + if (this.active && this.dragged) { + + if (this.options.droppableProxy) { // remove transparent div... + document.body.removeChild(this.proxy); + } + + if (this.pt) { // remove debugging element... + InkElement.remove(this.pt); + this.pt = undefined; + } + + /*if (this.options.revert) { + this.placeholder.parentNode.removeChild(this.placeholder); + }*/ + + if(this.placeholder) { + InkElement.remove(this.placeholder); + } + + if (this.options.revert) { + this.element.style.position = this.position; + if (this.zindex !== null) { + this.element.style.zIndex = this.zindex; + } + else { + this.element.style.zIndex = 'auto'; + } // restore default zindex of it had none + + this.element.style.left = (this.originalPosition[x]) ? this.originalPosition[x] + 'px' : ''; + this.element.style.top = (this.originalPosition[y]) ? this.originalPosition[y] + 'px' : ''; + } + + if (this.options.onEnd) { + this.options.onEnd(this.element, e); + } + + var Droppable = Ink.getModule('Ink.UI.Droppable_1'); + if (Droppable) { + Droppable.action(this._getCoords(e), 'drop', e, this.element); + } + + this.position = false; + this.zindex = false; + this.firstDrag = true; + } + + this.active = false; + this.dragged = false; + } + }; + + return Draggable; + +}); diff --git a/ajax/libs/ink/2.3.1/js/ink.dropdown.js b/ajax/libs/ink/2.3.1/js/ink.dropdown.js new file mode 100644 index 000000000..2bf1b475e --- /dev/null +++ b/ajax/libs/ink/2.3.1/js/ink.dropdown.js @@ -0,0 +1,196 @@ +/** + * @module Ink.UI.Dropdown_1 + * + * @author inkdev AT sapo.pt + * @version 1 + */ +Ink.createModule('Ink.UI.Dropdown', '1', ['Ink.UI.Common_1', 'Ink.UI.Toggle_1', 'Ink.Dom.Event_1', 'Ink.Dom.Element_1'], function(Common, Toggle, InkEvent, InkElement) { + 'use strict'; + + function Dropdown(trigger, options) { + this._init(trigger, options); + } + + Dropdown.prototype = { + /** + * Use this UI module to achieve a dropdown menu. + * + * @class Ink.UI.Dropdown + * + * @constructor + * @param {DOMElement|String} trigger + * @param {Object} options + * @param {DOMElement|String} options.target Target of the dropdown action. + */ + _init: function(trigger, options) { + this._element = Common.elOrSelector(trigger); + this._options = Common.options('Ink.UI.Dropdown_1', { + 'target': ['Element'], + 'hoverOpen': ['Number', null], + 'dismissOnInsideClick': ['Boolean', false], + 'dismissOnOutsideClick': ['Boolean', true], + 'dismissAfter': ['Number', null], + 'onInsideClick': ['Function', null], + 'onOutsideClick': ['Function', null], + 'onOpen': ['Function', null], + 'onDismiss': ['Function', null] + }, options || {}, this._element); + + this._toggle = new Toggle(this._element, { + target: this._options.target, + closeOnInsideClick: null, + closeOnClick: false, + onChangeState: Ink.bind(function (newState) { + return this._openOrDismiss(newState, true, true); + }, this) + }); + + // Event where we set this._dismissTimeout and clear this._openTimeout + InkEvent.observeMulti([this._options.target, this._element], + 'mouseout', Ink.bindMethod(this, '_onMouseOut')); + + // Events to keep clearing this._dismissTimeout and set this._openTimeout + InkEvent.observeMulti([this._options.target, this._element], + 'mouseover', Ink.bindMethod(this, '_onMouseOver')); + + // to call dismissOnInsideClick and onInsideClick + InkEvent.observe(this._options.target, 'click', Ink.bindMethod(this, '_onInsideClick')); + // to call dismissOnOutsideClick and onOutsideClick + InkEvent.observe(document, 'click', Ink.bindMethod(this, '_onOutsideClick')); + }, + + /** + * Called when the mouse is over the toggler, or the dropdown. + * + * Deals with "hoverOpen" by setting the dropdown to open later. Also cancels "dismissAfter". + * @method _onMouseOver + * @private + **/ + _onMouseOver: function () { + if (typeof this._options.hoverOpen === 'number' && this._toggle.getState() === false) { + clearTimeout(this._openTimeout); + this._openTimeout = setTimeout( + Ink.bindMethod(this, 'open', true), + this._options.hoverOpen * 1000); + } + if (typeof this._options.dismissAfter === 'number') { + clearTimeout(this._dismissTimeout); + } + }, + + /** + * Called when the mouse leaves either the toggler, or the dropdown. + * + * Deals with "dismissAfter" by setting the dropdown to be dismissed later. Also cancels "hoverOpen". + * @method _onMouseOut + * @private + **/ + _onMouseOut: function () { + if (typeof this._options.dismissAfter === 'number' && this._toggle.getState() === true) { + clearTimeout(this._dismissTimeout); + this._dismissTimeout = setTimeout( + Ink.bindMethod(this, 'dismiss', true), + this._options.dismissAfter * 1000); + } + if (typeof this._options.hoverOpen === 'number') { + clearTimeout(this._openTimeout); + } + }, + + /** + * Handle clicks on the dropdown. + * @method _onInsideClick + * @private + */ + _onInsideClick: function (event) { + var ret = this._handlerCall('onInsideClick', InkEvent.element(event)); + if (ret === false) { return false; } + if (this._options.dismissOnInsideClick) { + this.dismiss(true); + } + InkEvent.stop(event); + }, + + /** + * Handle clicks outside the dropdown. + * @method _onInsideClick + * @private + */ + _onOutsideClick: function (event) { + var target = InkEvent.element(event); + var foundElem = InkElement.findUpwardsHaving(target, Ink.bind(function (needle) { + return needle === this._element; + }, this)); + var foundTarget = InkElement.findUpwardsHaving(target, Ink.bind(function (needle) { + return needle === this._options.target; + }, this)); + + if (!foundElem && !foundTarget) { + var ret = this._handlerCall('onOutsideClick', target); + if (ret === false) { return false; } + if (this._options.dismissOnOutsideClick) { + this.dismiss(true); + } + InkEvent.stop(event); + } + }, + + /** + * Dismiss the dropdown. + * + * @method dismiss + * @param [callHandler=false] call onDismiss handler + */ + dismiss: function (callHandler, doNotInformToggle) { + this._openOrDismiss(false, callHandler, doNotInformToggle); + }, + + /** + * Open the dropdown + * + * @method open + * @param [callHandler=false] call onOpen handler + */ + open: function (callHandler, _doNotInformToggle) { + this._openOrDismiss(true, callHandler, _doNotInformToggle); + }, + + /** + * DRY'ing up open() and dismiss() + * + * @method _openOrDismiss + * @param [newState=false] + * @param [callHandler=false] + * @private + */ + _openOrDismiss: function (newState, callHandler, _doNotInformToggle) { + if (this._toggle && this._toggle.getState() === newState) { return; } + if (callHandler) { + if (this._handlerCall(newState ? 'onOpen' : 'onDismiss') === false) { + return false; // canceled by event handler + } + } + if (!_doNotInformToggle) { + this._toggle.setState(newState); + } + clearTimeout(this._dismissTimeout); + clearTimeout(this._openTimeout); + }, + + /** + * call a method given by the user through the options + * + * @method _handlerCall + * @params handler {String} The handler name in this._options + * @params ... Arguments to pass to function + */ + _handlerCall: function (handler/*, ... */) { + if (this._options[handler]) { + return this._options[handler].call(this, [].slice.call(arguments, 1)); + } + } + }; + + return Dropdown; +}); + diff --git a/ajax/libs/ink/2.3.1/js/ink.droppable.js b/ajax/libs/ink/2.3.1/js/ink.droppable.js new file mode 100644 index 000000000..d68cd5761 --- /dev/null +++ b/ajax/libs/ink/2.3.1/js/ink.droppable.js @@ -0,0 +1,310 @@ +/** + * @module Ink.UI.Droppable_1 + * @author inkdev AT sapo.pt + * @version 1 + */ +Ink.createModule("Ink.UI.Droppable","1",["Ink.Dom.Element_1", "Ink.Dom.Event_1", "Ink.Dom.Css_1", "Ink.UI.Common_1", "Ink.Util.Array_1", "Ink.Dom.Selector_1"], function( InkElement, InkEvent, Css, Common, InkArray, Selector) { + 'use strict'; + + // Higher order functions + var hAddClassName = function (element) { + return function (className) {return Css.addClassName(element, className);}; + }; + var hRemoveClassName = function (element) { + return function (className) {return Css.removeClassName(element, className);}; + }; + + /** + * @class Ink.UI.Droppable + * @version 1 + * @static + */ + var Droppable = { + /** + * Flag that determines if it's in debug mode or not + * + * @property debug + * @type {Boolean} + * @private + */ + debug: false, + + /** + * Array with the data of each element (`{element: ..., data: ..., options: ...}`) + * + * @property _droppables + * @type {Array} + * @private + */ + _droppables: [], + + /** + * Array of data for each draggable. (`{element: ..., data: ...}`) + * + * @property _draggables + * @type {Array} + * @private + */ + _draggables: [], + + /** + * Makes an element droppable and adds it to the stack of droppable elements. + * Can consider it a constructor of droppable elements, but where no Droppable object is returned. + * + * In the following arguments, any events/callbacks you may pass, can be either functions or strings. If the 'move' or 'copy' strings are passed, the draggable gets moved into this droppable. If 'revert' is passed, an acceptable droppable is moved back to the element it came from. + + * + * @method add + * @param {String|DOMElement} element Target element + * @param {Object} [options] options object + * @param {String} [options.hoverClass] Classname(s) applied when an acceptable draggable element is hovering the element + * @param {String} [options.accept] Selector for choosing draggables which can be dropped in this droppable. + * @param {Function} [options.onHover] callback called when an acceptable draggable element is hovering the droppable. Gets the draggable and the droppable element as parameters. + * @param {Function|String} [options.onDrop] callback called when an acceptable draggable element is dropped. Gets the draggable, the droppable and the event as parameters. + * @param {Function|String} [options.onDropOut] callback called when a droppable is dropped outside this droppable. Gets the draggable, the droppable and the event as parameters. (see above for string options). + * @public + * + * @example + * + * + *
                + *
              • Draggable 1
              • + *
              • Draggable 2
              • + *
              • Draggable 3
              • + *
              + *
                + *
              + * + * + */ + add: function(element, options) { + element = Common.elOrSelector(element, 'Droppable.add target element'); + + var opt = Ink.extendObj( { + hoverClass: options.hoverclass /* old name */ || false, + accept: false, + onHover: false, + onDrop: false, + onDropOut: false + }, options || {}, InkElement.data(element)); + + if (typeof opt.hoverClass === 'string') { + opt.hoverClass = opt.hoverClass.split(/\s+/); + } + + function cleanStyle(draggable) { + draggable.style.position = 'inherit'; + } + var that = this; + var namedEventHandlers = { + move: function (draggable, droppable/*, event*/) { + cleanStyle(draggable); + droppable.appendChild(draggable); + }, + copy: function (draggable, droppable/*, event*/) { + cleanStyle(draggable); + droppable.appendChild(draggable.cloneNode); + }, + revert: function (draggable/*, droppable, event*/) { + that._findDraggable(draggable).originalParent.appendChild(draggable); + cleanStyle(draggable); + } + }; + var name; + + if (typeof opt.onHover === 'string') { + name = opt.onHover; + opt.onHover = namedEventHandlers[name]; + if (opt.onHover === undefined) { + throw new Error('Unknown hover event handler: ' + name); + } + } + if (typeof opt.onDrop === 'string') { + name = opt.onDrop; + opt.onDrop = namedEventHandlers[name]; + if (opt.onDrop === undefined) { + throw new Error('Unknown drop event handler: ' + name); + } + } + if (typeof opt.onDropOut === 'string') { + name = opt.onDropOut; + opt.onDropOut = namedEventHandlers[name]; + if (opt.onDropOut === undefined) { + throw new Error('Unknown dropOut event handler: ' + name); + } + } + + var elementData = { + element: element, + data: {}, + options: opt + }; + this._droppables.push(elementData); + this._update(elementData); + }, + + /** + * find droppable data about `element`. this data is added in `.add` + * + * @method _findData + * @param {DOMElement} element Needle + * @return {object} Droppable data of the element + * @private + */ + _findData: function (element) { + var elms = this._droppables; + for (var i = 0, len = elms.length; i < len; i++) { + if (elms[i].element === element) { + return elms[i]; + } + } + }, + /** + * Find draggable data about `element` + * + * @method _findDraggable + * @param {DOMElement} element Needle + * @return {Object} Draggable data queried + * @private + */ + _findDraggable: function (element) { + var elms = this._draggables; + for (var i = 0, len = elms.length; i < len; i++) { + if (elms[i].element === element) { + return elms[i]; + } + } + }, + + /** + * Invoke every time a drag starts + * + * @method updateAll + * @private + */ + updateAll: function() { + InkArray.each(this._droppables, Droppable._update); + }, + + /** + * Updates location and size of droppable element + * + * @method update * @param {String|DOMElement} element - target element + * @private + */ + update: function(element) { + this._update(this._findData(element)); + }, + + _update: function(elementData) { + var data = elementData.data; + var element = elementData.element; + data.left = InkElement.offsetLeft(element); + data.top = InkElement.offsetTop( element); + data.right = data.left + InkElement.elementWidth( element); + data.bottom = data.top + InkElement.elementHeight(element); + }, + + /** + * Removes an element from the droppable stack and removes the droppable behavior + * + * @method remove + * @param {String|DOMElement} elOrSelector Droppable element to disable. + * @return {Boolean} Whether the object was found and deleted + * @public + */ + remove: function(el) { + el = Common.elOrSelector(el); + var len = this._droppables.length; + for (var i = 0; i < len; i++) { + if (this._droppables[i].element === el) { + this._droppables.splice(i, 1); + break; + } + } + return len !== this._droppables.length; + }, + + /** + * Method called by a draggable to execute an action on a droppable + * + * @method action + * @param {Object} coords coordinates where the action happened + * @param {String} type type of action. drag or drop. + * @param {Object} ev Event object + * @param {Object} draggable draggable element + * @private + */ + action: function(coords, type, ev, draggable) { + // check all droppable elements + InkArray.each(this._droppables, Ink.bind(function(elementData) { + var data = elementData.data; + var opt = elementData.options; + var element = elementData.element; + + if (opt.accept && !Selector.matches(opt.accept, [draggable]).length) { + return; + } + + if (type === 'drag' && !this._findDraggable(draggable)) { + this._draggables.push({ + element: draggable, + originalParent: draggable.parentNode + }); + } + + // check if our draggable is over our droppable + if (coords.x >= data.left && coords.x <= data.right && + coords.y >= data.top && coords.y <= data.bottom) { + // INSIDE + if (type === 'drag') { + if (opt.hoverClass) { + InkArray.each(opt.hoverClass, + hAddClassName(element)); + } + if (opt.onHover) { + opt.onHover(draggable, element); + } + } else if (type === 'drop') { + if (opt.hoverClass) { + InkArray.each(opt.hoverClass, + hRemoveClassName(element)); + } + if (opt.onDrop) { + opt.onDrop(draggable, element, ev); + } + } + } else { + // OUTSIDE + + if (type === 'drag' && opt.hoverClass) { + InkArray.each(opt.hoverClass, hRemoveClassName(element)); + } else if (type === 'drop') { + if(opt.onDropOut){ + opt.onDropOut(draggable, element, ev); + } + } + } + }, this)); + } + }; + + return Droppable; +}); diff --git a/ajax/libs/ink/2.3.1/js/ink.formvalidator-2.js b/ajax/libs/ink/2.3.1/js/ink.formvalidator-2.js new file mode 100644 index 000000000..0f181ec73 --- /dev/null +++ b/ajax/libs/ink/2.3.1/js/ink.formvalidator-2.js @@ -0,0 +1,930 @@ +/** + * @module Ink.UI.FormValidator_2 + * @author inkdev AT sapo.pt + * @version 2 + */ +Ink.createModule('Ink.UI.FormValidator', '2', [ 'Ink.UI.Common_1','Ink.Dom.Element_1','Ink.Dom.Event_1','Ink.Dom.Selector_1','Ink.Dom.Css_1','Ink.Util.Array_1','Ink.Util.I18n_1','Ink.Util.Validator_1'], function( Common, Element, Event, Selector, Css, InkArray, I18n, InkValidator ) { + 'use strict'; + + /** + * Validation Functions to be used + * Some functions are a port from PHP, others are the 'best' solutions available + * + * @type {Object} + * @private + * @static + */ + var validationFunctions = { + + /** + * Checks if the value is actually defined and is not empty + * + * @method validationFunctions.required + * @param {String} value Value to be checked + * @return {Boolean} True case is defined, false if it's empty or not defined. + */ + 'required': function( value ){ + return ( (typeof value !== 'undefined') && ( !(/^\s*$/).test(value) ) ); + }, + + /** + * Checks if the value has a minimum length + * + * @method validationFunctions.min_length + * @param {String} value Value to be checked + * @param {String|Number} minSize Number of characters that the value at least must have. + * @return {Boolean} True if the length of value is equal or bigger than the minimum chars defined. False if not. + */ + 'min_length': function( value, minSize ){ + return ( (typeof value === 'string') && ( value.length >= parseInt(minSize,10) ) ); + }, + + /** + * Checks if the value has a maximum length + * + * @method validationFunctions.max_length + * @param {String} value Value to be checked + * @param {String|Number} maxSize Number of characters that the value at maximum can have. + * @return {Boolean} True if the length of value is equal or smaller than the maximum chars defined. False if not. + */ + 'max_length': function( value, maxSize ){ + return ( (typeof value === 'string') && ( value.length <= parseInt(maxSize,10) ) ); + }, + + /** + * Checks if the value has an exact length + * + * @method validationFunctions.exact_length + * @param {String} value Value to be checked + * @param {String|Number} exactSize Number of characters that the value must have. + * @return {Boolean} True if the length of value is equal to the size defined. False if not. + */ + 'exact_length': function( value, exactSize ){ + return ( (typeof value === 'string') && ( value.length === parseInt(exactSize,10) ) ); + }, + + /** + * Checks if the value has a valid e-mail address + * + * @method validationFunctions.email + * @param {String} value Value to be checked + * @return {Boolean} True if the value is a valid e-mail address. False if not. + */ + 'email': function( value ){ + return ( ( typeof value === 'string' ) && InkValidator.mail( value ) ); + }, + + /** + * Checks if the value has a valid URL + * + * @method validationFunctions.url + * @param {String} value Value to be checked + * @param {Boolean} fullCheck Flag that specifies if the value must be validated as a full url (with the protocol) or not. + * @return {Boolean} True if the URL is considered valid. False if not. + */ + 'url': function( value, fullCheck ){ + fullCheck = fullCheck || false; + return ( (typeof value === 'string') && InkValidator.url( value, fullCheck ) ); + }, + + /** + * Checks if the value is a valid IP. Supports ipv4 and ipv6 + * + * @method validationFunctions.ip + * @param {String} value Value to be checked + * @param {String} ipType Type of IP to be validated. The values are: ipv4, ipv6. By default is ipv4. + * @return {Boolean} True if the value is a valid IP address. False if not. + */ + 'ip': function( value, ipType ){ + if( typeof value !== 'string' ){ + return false; + } + + return InkValidator.isIP(value, ipType); + }, + + /** + * Checks if the value is a valid phone number. Supports several countries, based in the Ink.Util.Validator class. + * + * @method validationFunctions.phone + * @param {String} value Value to be checked + * @param {String} phoneType Country's initials to specify the type of phone number to be validated. Ex: 'AO'. + * @return {Boolean} True if it's a valid phone number. False if not. + */ + 'phone': function( value, phoneType ){ + if( typeof value !== 'string' ){ + return false; + } + + var countryCode = phoneType ? phoneType.toUpperCase() : ''; + + return InkValidator['is' + countryCode + 'Phone'](value); + }, + + /** + * Checks if it's a valid credit card. + * + * @method validationFunctions.credit_card + * @param {String} value Value to be checked + * @param {String} cardType Type of credit card to be validated. The card types available are in the Ink.Util.Validator class. + * @return {Boolean} True if the value is a valid credit card number. False if not. + */ + 'credit_card': function( value, cardType ){ + if( typeof value !== 'string' ){ + return false; + } + + return InkValidator.isCreditCard( value, cardType || 'default' ); + }, + + /** + * Checks if the value is a valid date. + * + * @method validationFunctions.date + * @param {String} value Value to be checked + * @param {String} format Specific format of the date. + * @return {Boolean} True if the value is a valid date. False if not. + */ + 'date': function( value, format ){ + return ( (typeof value === 'string' ) && InkValidator.isDate(format, value) ); + }, + + /** + * Checks if the value only contains alphabetical values. + * + * @method validationFunctions.alpha + * @param {String} value Value to be checked + * @param {Boolean} supportSpaces Allow whitespace + * @return {Boolean} True if the value is alphabetical-only. False if not. + */ + 'alpha': function( value, supportSpaces ){ + return InkValidator.ascii(value, {singleLineWhitespace: supportSpaces}); + }, + + /* + * Check that the value contains only printable unicode text characters + * from the Basic Multilingual plane (BMP) + * Optionally allow punctuation and whitespace + * + * @method validationFunctions.text + * @param {String} value Value to be checked + * @return {Boolean} Whether the value only contains printable text characters + **/ + 'text': function (value, whitespace, punctuation) { + return InkValidator.unicode(value, { + singleLineWhitespace: whitespace, + unicodePunctuation: punctuation}); + }, + + /* + * Check that the value contains only printable text characters + * available in the latin-1 encoding. + * + * Optionally allow punctuation and whitespace + * + * @method validationFunctions.text + * @param {String} value Value to be checked + * @return {Boolean} Whether the value only contains printable text characters + **/ + 'latin': function (value, punctuation, whitespace) { + if ( typeof value !== 'string') { return false; } + return InkValidator.latin1(value, {latin1Punctuation: punctuation, singleLineWhitespace: whitespace}); + }, + + /** + * Checks if the value only contains alphabetical and numerical characters. + * + * @method validationFunctions.alpha_numeric + * @param {String} value Value to be checked + * @return {Boolean} True if the value is a valid alphanumerical. False if not. + */ + 'alpha_numeric': function( value ){ + return InkValidator.ascii(value, {numbers: true}); + }, + + /** + * Checks if the value only contains alphabetical, dash or underscore characteres. + * + * @method validationFunctions.alpha_dashes + * @param {String} value Value to be checked + * @return {Boolean} True if the value is a valid. False if not. + */ + 'alpha_dash': function( value ){ + return InkValidator.ascii(value, {dash: true, underscore: true}); + }, + + /** + * Checks if the value is a digit (an integer of length = 1). + * + * @method validationFunctions.digit + * @param {String} value Value to be checked + * @return {Boolean} True if the value is a valid digit. False if not. + */ + 'digit': function( value ){ + return ((typeof value === 'string') && /^[0-9]{1}$/.test(value)); + }, + + /** + * Checks if the value is a valid integer. + * + * @method validationFunctions.integer + * @param {String} value Value to be checked + * @param {String} positive Flag that specifies if the integer is must be positive (unsigned). + * @return {Boolean} True if the value is a valid integer. False if not. + */ + 'integer': function( value, positive ){ + return InkValidator.number(value, { + negative: !positive, + decimalPlaces: 0 + }); + }, + + /** + * Checks if the value is a valid decimal number. + * + * @method validationFunctions.decimal + * @param {String} value Value to be checked + * @param {String} decimalSeparator Character that splits the integer part from the decimal one. By default is '.'. + * @param {String} [decimalPlaces] Maximum number of digits that the decimal part must have. + * @param {String} [leftDigits] Maximum number of digits that the integer part must have, when provided. + * @return {Boolean} True if the value is a valid decimal number. False if not. + */ + 'decimal': function( value, decimalSeparator, decimalPlaces, leftDigits ){ + return InkValidator.number(value, { + decimalSep: decimalSeparator || '.', + decimalPlaces: +decimalPlaces || null, + maxDigits: +leftDigits + }); + }, + + /** + * Checks if it is a numeric value. + * + * @method validationFunctions.numeric + * @param {String} value Value to be checked + * @param {String} decimalSeparator Verifies if it's a valid decimal. Otherwise checks if it's a valid integer. + * @param {String} [decimalPlaces] (when the number is decimal) Maximum number of digits that the decimal part must have. + * @param {String} [leftDigits] (when the number is decimal) Maximum number of digits that the integer part must have, when provided. + * @return {Boolean} True if the value is numeric. False if not. + */ + 'numeric': function( value, decimalSeparator, decimalPlaces, leftDigits ){ + decimalSeparator = decimalSeparator || '.'; + if( value.indexOf(decimalSeparator) !== -1 ){ + return validationFunctions.decimal( value, decimalSeparator, decimalPlaces, leftDigits ); + } else { + return validationFunctions.integer( value ); + } + }, + + /** + * Checks if the value is in a specific range of values. The parameters after the first one are used for specifying the range, and are similar in function to python's range() function. + * + * @method validationFunctions.range + * @param {String} value Value to be checked + * @param {String} minValue Left limit of the range. + * @param {String} maxValue Right limit of the range. + * @param {String} [multipleOf] In case you want numbers that are only multiples of another number. + * @return {Boolean} True if the value is within the range. False if not. + */ + 'range': function( value, minValue, maxValue, multipleOf ){ + value = +value; + minValue = +minValue; + maxValue = +maxValue; + + if (isNaN(value) || isNaN(minValue) || isNaN(maxValue)) { + return false; + } + + if( value < minValue || value > maxValue ){ + return false; + } + + if (multipleOf) { + return (value - minValue) % multipleOf === 0; + } else { + return true; + } + }, + + /** + * Checks if the value is a valid color. + * + * @method validationFunctions.color + * @param {String} value Value to be checked + * @return {Boolean} True if the value is a valid color. False if not. + */ + 'color': function( value ){ + return InkValidator.isColor(value); + }, + + /** + * Checks if the value matches the value of a different field. + * + * @method validationFunctions.matches + * @param {String} value Value to be checked + * @param {String} fieldToCompare Name or ID of the field to compare. + * @return {Boolean} True if the values match. False if not. + */ + 'matches': function( value, fieldToCompare ){ + return ( value === this.getFormElements()[fieldToCompare][0].getValue() ); + } + + }; + + /** + * Error messages for the validation functions above + * @type {Object} + * @private + * @static + */ + var validationMessages = new I18n({ + en_US: { + 'formvalidator.required' : 'The {field} filling is mandatory', + 'formvalidator.min_length': 'The {field} must have a minimum size of {param1} characters', + 'formvalidator.max_length': 'The {field} must have a maximum size of {param1} characters', + 'formvalidator.exact_length': 'The {field} must have an exact size of {param1} characters', + 'formvalidator.email': 'The {field} must have a valid e-mail address', + 'formvalidator.url': 'The {field} must have a valid URL', + 'formvalidator.ip': 'The {field} does not contain a valid {param1} IP address', + 'formvalidator.phone': 'The {field} does not contain a valid {param1} phone number', + 'formvalidator.credit_card': 'The {field} does not contain a valid {param1} credit card', + 'formvalidator.date': 'The {field} should contain a date in the {param1} format', + 'formvalidator.alpha': 'The {field} should only contain letters', + 'formvalidator.text': 'The {field} should only contain alphabetic characters', + 'formvalidator.latin': 'The {field} should only contain alphabetic characters', + 'formvalidator.alpha_numeric': 'The {field} should only contain letters or numbers', + 'formvalidator.alpha_dashes': 'The {field} should only contain letters or dashes', + 'formvalidator.digit': 'The {field} should only contain a digit', + 'formvalidator.integer': 'The {field} should only contain an integer', + 'formvalidator.decimal': 'The {field} should contain a valid decimal number', + 'formvalidator.numeric': 'The {field} should contain a number', + 'formvalidator.range': 'The {field} should contain a number between {param1} and {param2}', + 'formvalidator.color': 'The {field} should contain a valid color', + 'formvalidator.matches': 'The {field} should match the field {param1}', + 'formvalidator.validation_function_not_found': 'The rule {rule} has not been defined' + }, + pt_PT: { + 'formvalidator.required' : 'Preencher {field} é obrigatório', + 'formvalidator.min_length': '{field} deve ter no mínimo {param1} caracteres', + 'formvalidator.max_length': '{field} tem um tamanho máximo de {param1} caracteres', + 'formvalidator.exact_length': '{field} devia ter exactamente {param1} caracteres', + 'formvalidator.email': '{field} deve ser um e-mail válido', + 'formvalidator.url': 'O {field} deve ser um URL válido', + 'formvalidator.ip': '{field} não tem um endereço IP {param1} válido', + 'formvalidator.phone': '{field} deve ser preenchido com um número de telefone {param1} válido.', + 'formvalidator.credit_card': '{field} não tem um cartão de crédito {param1} válido', + 'formvalidator.date': '{field} deve conter uma data no formato {param1}', + 'formvalidator.alpha': 'O campo {field} deve conter apenas caracteres alfabéticos', + 'formvalidator.text': 'O campo {field} deve conter apenas caracteres alfabéticos', + 'formvalidator.latin': 'O campo {field} deve conter apenas caracteres alfabéticos', + 'formvalidator.alpha_numeric': '{field} deve conter apenas letras e números', + 'formvalidator.alpha_dashes': '{field} deve conter apenas letras e traços', + 'formvalidator.digit': '{field} destina-se a ser preenchido com apenas um dígito', + 'formvalidator.integer': '{field} deve conter um número inteiro', + 'formvalidator.decimal': '{field} deve conter um número válido', + 'formvalidator.numeric': '{field} deve conter um número válido', + 'formvalidator.range': '{field} deve conter um número entre {param1} e {param2}', + 'formvalidator.color': '{field} deve conter uma cor válida', + 'formvalidator.matches': '{field} deve corresponder ao campo {param1}', + 'formvalidator.validation_function_not_found': '[A regra {rule} não foi definida]' + } + }, 'en_US'); + + /** + * Constructor of a FormElement. + * This type of object has particular methods to parse rules and validate them in a specific DOM Element. + * + * @param {DOMElement} element DOM Element + * @param {Object} options Object with configuration options + * @return {FormElement} FormElement object + */ + var FormElement = function( element, options ){ + this._element = Common.elOrSelector( element, 'Invalid FormElement' ); + this._errors = {}; + this._rules = {}; + this._value = null; + + this._options = Ink.extendObj( { + label: this._getLabel() + }, Element.data(this._element) ); + + this._options = Ink.extendObj( this._options, options || {} ); + + }; + + /** + * FormElement's prototype + */ + FormElement.prototype = { + + /** + * Function to get the label that identifies the field. + * If it can't find one, it will use the name or the id + * (depending on what is defined) + * + * @method _getLabel + * @return {String} Label to be used in the error messages + * @private + */ + _getLabel: function(){ + + var controlGroup = Element.findUpwardsByClass(this._element,'control-group'); + var label = Ink.s('label',controlGroup); + if( label ){ + label = Element.textContent(label); + } else { + label = this._element.name || this._element.id || ''; + } + + return label; + }, + + /** + * Function to parse a rules' string. + * Ex: required|number|max_length[30] + * + * @method _parseRules + * @param {String} rules String with the rules + * @private + */ + _parseRules: function( rules ){ + this._rules = {}; + rules = rules.split("|"); + var i, rulesLength = rules.length, rule, params, paramStartPos ; + if( rulesLength > 0 ){ + for( i = 0; i < rulesLength; i++ ){ + rule = rules[i]; + if( !rule ){ + continue; + } + + if( ( paramStartPos = rule.indexOf('[') ) !== -1 ){ + params = rule.substr( paramStartPos+1 ); + params = params.split(']'); + params = params[0]; + params = params.split(','); + for (var p = 0, len = params.length; p < len; p++) { + params[p] = + params[p] === 'true' ? true : + params[p] === 'false' ? false : + params[p]; + } + params.splice(0,0,this.getValue()); + + rule = rule.substr(0,paramStartPos); + + this._rules[rule] = params; + } else { + this._rules[rule] = [this.getValue()]; + } + } + } + }, + + /** + * Function to add an error to the FormElement's 'errors' object. + * It basically receives the rule where the error occurred, the parameters passed to it (if any) + * and the error message. + * Then it replaces some tokens in the message for a more 'custom' reading + * + * @method _addError + * @param {String|null} rule Rule that failed, or null if no rule was found. + * @private + * @static + */ + _addError: function(rule){ + var params = this._rules[rule] || []; + + var paramObj = { + field: this._options.label, + value: this.getValue() + }; + + for( var i = 1; i < params.length; i++ ){ + paramObj['param' + i] = params[i]; + } + + var i18nKey = 'formvalidator.' + rule; + + this._errors[rule] = validationMessages.text(i18nKey, paramObj); + + if (this._errors[rule] === i18nKey) { + this._errors[rule] = 'Validation message not found'; + } + }, + + /** + * Function to retrieve the element's value + * + * @method getValue + * @return {mixed} The DOM Element's value + * @public + */ + getValue: function(){ + + switch(this._element.nodeName.toLowerCase()){ + case 'select': + return Ink.s('option:selected',this._element).value; + case 'textarea': + return this._element.innerHTML; + case 'input': + if( "type" in this._element ){ + if( (this._element.type === 'radio') && (this._element.type === 'checkbox') ){ + if( this._element.checked ){ + return this._element.value; + } + } else if( this._element.type !== 'file' ){ + return this._element.value; + } + } else { + return this._element.value; + } + return; + default: + return this._element.innerHTML; + } + }, + + /** + * Function that returns the constructed errors object. + * + * @method getErrors + * @return {Object} Errors' object + * @public + */ + getErrors: function(){ + return this._errors; + }, + + /** + * Function that returns the DOM element related to it. + * + * @method getElement + * @return {Object} DOM Element + * @public + */ + getElement: function(){ + return this._element; + }, + + /** + * Get other elements in the same form. + * + * @method getFormElements + * @return {Object} A mapping of keys to other elements in this form. + * @public + */ + getFormElements: function () { + return this._options.form._formElements; + }, + + /** + * Function used to validate the element based on the rules defined. + * It parses the rules defined in the _options.rules property. + * + * @method validate + * @return {Boolean} True if every rule was valid. False if one fails. + * @public + */ + validate: function(){ + this._errors = {}; + + if( "rules" in this._options || 1){ + this._parseRules( this._options.rules ); + } + + if( ("required" in this._rules) || (this.getValue() !== '') ){ + for(var rule in this._rules) { + if (this._rules.hasOwnProperty(rule)) { + if( (typeof validationFunctions[rule] === 'function') ){ + if( validationFunctions[rule].apply(this, this._rules[rule] ) === false ){ + + this._addError( rule ); + return false; + + } + + } else { + + this._addError( null ); + return false; + } + } + } + } + + return true; + + } + }; + + + + /** + * @class Ink.UI.FormValidator_2 + * @version 2 + * @constructor + * @param {String|DOMElement} selector Either a CSS Selector string, or the form's DOMElement + * @param {String} [options.eventTrigger='submit'] What event do we listen for. + * @param {Boolean} [options.neverSubmit=false] Always cancel the event? Use this to avoid submitting the form. + * @param {Selector} [options.searchFor='input, select, textarea, .control-group'] Look in these inputs for validation data-attributes. + * @param {Function} [options.beforeValidation] Callback to be executed before validating the form + * @param {Function} [options.onError] Validation error callback + * @param {Function} [options.onSuccess] Validation success callback + * + * @example + * Ink.requireModules( ['Ink.UI.FormValidator_2'], function( FormValidator ){ + * var myValidator = new FormValidator( '#my-form' ); + * }); + */ + var FormValidator = function( selector, options ){ + + /** + * DOMElement of the being validated + * + * @property _rootElement + * @type {DOMElement} + */ + this._rootElement = Common.elOrSelector( selector ); + + /** + * Object that will gather the form elements by name + * + * @property _formElements + * @type {Object} + */ + this._formElements = {}; + + /** + * Error message DOMElements + * + * @property _errorMessages + */ + this._errorMessages = []; + + /** + * Array of elements marked with validation errors + * + * @property _markedErrorElements + */ + this._markedErrorElements = []; + + /** + * Configuration options. Fetches the data attributes first, then the ones passed when executing the constructor. + * By doing that, the latter will be the one with highest priority. + * + * @property _options + * @type {Object} + */ + this._options = Ink.extendObj({ + eventTrigger: 'submit', + neverSubmit: 'false', + searchFor: 'input, select, textarea, .control-group', + beforeValidation: undefined, + onError: undefined, + onSuccess: undefined + },Element.data(this._rootElement)); + + this._options = Ink.extendObj( this._options, options || {} ); + + // Sets an event listener for a specific event in the form, if defined. + // By default is the 'submit' event. + if( typeof this._options.eventTrigger === 'string' ){ + Event.observe( this._rootElement,this._options.eventTrigger, Ink.bindEvent(this.validate,this) ); + } + + this._init(); + }; + + /** + * Method used to set validation functions (either custom or ovewrite the existent ones) + * + * @method setRule + * @param {String} name Name of the function. E.g. 'required' + * @param {String} errorMessage Error message to be displayed in case of returning false. E.g. 'Oops, you passed {param1} as parameter1, lorem ipsum dolor...' + * @param {Function} cb Function to be executed when calling this rule + * @public + * @static + */ + FormValidator.setRule = function( name, errorMessage, cb ){ + validationFunctions[ name ] = cb; + if (validationMessages.getKey('formvalidator.' + name) !== errorMessage) { + var langObj = {}; langObj['formvalidator.' + name] = errorMessage; + var dictObj = {}; dictObj[validationMessages.lang()] = langObj; + validationMessages.append(dictObj); + } + }; + + /** + * Get the i18n object in charge of the error messages + * + * @method getI18n + * @return {Ink.Util.I18n} The i18n object the FormValidator is using. + */ + FormValidator.getI18n = function () { + return validationMessages; + }; + + /** + * Sets the I18n object for validation error messages + * + * @method setI18n + * @param {Ink.Util.I18n} i18n The I18n object. + */ + FormValidator.setI18n = function (i18n) { + validationMessages = i18n; + }; + + /** + * Add to the I18n dictionary. See `Ink.Util.I18n.append()` documentation. + * + * @method AppendI18n + */ + FormValidator.appendI18n = function () { + validationMessages.append.apply(validationMessages, [].slice.call(arguments)); + }; + + /** + * Sets the language of the error messages. pt_PT and en_US are available, but you can add new languages by using append() + * + * See the `Ink.Util.I18n.lang()` setter + * + * @method setLanguage + * @param language The language to set i18n to. + */ + FormValidator.setLanguage = function (language) { + validationMessages.lang(language); + }; + + /** + * Method used to get the existing defined validation functions + * + * @method getRules + * @return {Object} Object with the rules defined + * @public + * @static + */ + FormValidator.getRules = function(){ + return validationFunctions; + }; + + FormValidator.prototype = { + _init: function(){ + + }, + + /** + * Function that searches for the elements of the form, based in the + * this._options.searchFor configuration. + * + * @method getElements + * @return {Object} An object with the elements in the form, indexed by name/id + * @public + */ + getElements: function(){ + this._formElements = {}; + var formElements = Selector.select( this._options.searchFor, this._rootElement ); + if( formElements.length ){ + var i, element; + for( i=0; i'); + this._errorMessages.push(paragraph); + }, this)); + return false; + } + } + }; + + /** + * Returns the FormValidator's Object + */ + return FormValidator; + +}); diff --git a/ajax/libs/ink/2.3.1/js/ink.formvalidator.js b/ajax/libs/ink/2.3.1/js/ink.formvalidator.js new file mode 100644 index 000000000..322464443 --- /dev/null +++ b/ajax/libs/ink/2.3.1/js/ink.formvalidator.js @@ -0,0 +1,709 @@ +/** + * @module Ink.UI.FormValidator_1 + * @author inkdev AT sapo.pt + * @version 1 + **/ +Ink.createModule('Ink.UI.FormValidator', '1', ['Ink.Dom.Element_1', 'Ink.Dom.Css_1','Ink.Util.Validator_1','Ink.Dom.Selector_1'], function( InkElement, Css, InkValidator , Selector) { + 'use strict'; + + function elementsWithSameName(elm) { + if (!elm.name) { return []; } + if (!elm.form) { + return Selector.select('name="' + elm.name + '"'); + } + var ret = elm.form[elm.name]; + if(typeof(ret.length) === 'undefined') { + ret = [ret]; + } + return ret; + } + /** + * @class Ink.UI.FormValidator + * @version 1 + */ + var FormValidator = { + + /** + * Specifies the version of the component + * + * @property version + * @type {String} + * @readOnly + * @public + */ + version: '1', + + /** + * Available flags to use in the validation process. + * The keys are the 'rules', and their values are objects with the key 'msg', determining + * what is the error message. + * + * @property _flagMap + * @type {Object} + * @readOnly + * @private + */ + _flagMap: { + //'ink-fv-required': {msg: 'Campo obrigatório'}, + 'ink-fv-required': {msg: 'Required field'}, + //'ink-fv-email': {msg: 'E-mail inválido'}, + 'ink-fv-email': {msg: 'Invalid e-mail address'}, + //'ink-fv-url': {msg: 'URL inválido'}, + 'ink-fv-url': {msg: 'Invalid URL'}, + //'ink-fv-number': {msg: 'Número inválido'}, + 'ink-fv-number': {msg: 'Invalid number'}, + //'ink-fv-phone_pt': {msg: 'Número de telefone inválido'}, + 'ink-fv-phone_pt': {msg: 'Invalid phone number'}, + //'ink-fv-phone_cv': {msg: 'Número de telefone inválido'}, + 'ink-fv-phone_cv': {msg: 'Invalid phone number'}, + //'ink-fv-phone_mz': {msg: 'Número de telefone inválido'}, + 'ink-fv-phone_mz': {msg: 'Invalid phone number'}, + //'ink-fv-phone_ao': {msg: 'Número de telefone inválido'}, + 'ink-fv-phone_ao': {msg: 'Invalid phone number'}, + //'ink-fv-date': {msg: 'Data inválida'}, + 'ink-fv-date': {msg: 'Invalid date'}, + //'ink-fv-confirm': {msg: 'Confirmação inválida'}, + 'ink-fv-confirm': {msg: 'Confirmation does not match'}, + 'ink-fv-custom': {msg: ''} + }, + + /** + * This property holds all form elements for later validation + * + * @property elements + * @type {Object} + * @public + */ + elements: {}, + + /** + * This property holds the objects needed to cross-check for the 'confirm' rule + * + * @property confirmElms + * @type {Object} + * @public + */ + confirmElms: {}, + + /** + * This property holds the previous elements in the confirmElms property, but with a + * true/false specifying if it has the class ink-fv-confirm. + * + * @property hasConfirm + * @type {Object} + */ + hasConfirm: {}, + + /** + * Defined class name to use in error messages label + * + * @property _errorClassName + * @type {String} + * @readOnly + * @private + */ + _errorClassName: 'tip error', + + /** + * @property _errorValidationClassName + * @type {String} + * @readOnly + * @private + */ + _errorValidationClassName: 'validaton', + + /** + * @property _errorTypeWarningClassName + * @type {String} + * @readOnly + * @private + */ + _errorTypeWarningClassName: 'warning', + + /** + * @property _errorTypeErrorClassName + * @type {String} + * @readOnly + * @private + */ + _errorTypeErrorClassName: 'error', + + /** + * Check if a form is valid or not + * + * @method validate + * @param {DOMElement|String} elm DOM form element or form id + * @param {Object} options Options for + * @param {Function} [options.onSuccess] function to run when form is valid + * @param {Function} [options.onError] function to run when form is not valid + * @param {Array} [options.customFlag] custom flags to use to validate form fields + * @public + * @return {Boolean} Whether the form is deemed valid or not. + * + * @example + * + * ## What markup do I need? + * + * Besides the markup structure you can see in + * , you need to add + * the `ink-fv-*` classes to your inputs, which correspond to validation + * rules in this component. Available classes are: + * + * - `ink-fv-required` : Required field + * - `ink-fv-email` : Valid e-mail + * - `ink-fv-url` : Valid URL address + * - `ink-fv-number` : Valid number + * - `ink-fv-phone_pt`, `ink-fv-phone_cv`, `ink-fv-phone_mz`, `ink-fv-phone_ao` : Valid telephone number in Portugal, Cape Verde, Mozambique or Angola. + * - `ink-fv-date` : Valid date + * - `ink-fv-confirm` : Make the user type the same thing twice. Common rule for confirming passwords. + * - `ink-fv-custom` : Custom rule (see below example "Custom rule") + * + * E-mail field:
              + * Phone number field:
              + * Website field (optional): + * + * ## Simple usage + * + * So you have a form and would like to validate it? This example shows + * how to validate a form and stop it from being submitted when invalid. + * To use this, add the several ink-fv-* classes to your input elements. + * + * The validate() function will also add "invalid" classes to each of + * your elements so the user gets a color feedback and an error message + * below each element (control-group, really). + * + * var myForm = Ink.i('my-form'); + * InkEvent.observe(myForm, 'submit', function (ev) { + * var formIsValid = FormValidator.validate(myForm); + * if (!formIsValid) { + * InkEvent.stop(ev); // Cancel submission of form. + * } + * }); + * + * @example + * + * ## Custom rule. + * + * The following code validates using a custom rule named `minthree`, + * which fails if the input string has less than three characters. + * To do this, you must add the `ink-fv-custom` and `minthree` classes + * to the input elements you want to validate, and pass the `customFlag` + * option to this function, like so: + * + * var isValid = FormValidator.validate(myForm, { + * customFlag: [ + * { + * flag: 'minthree', // The name of this rule (add this class to your s + * msg: 'Please input at least three characters', // Error message when rule fails + * callback: function (el) { + * return el.value.length >= 3 // Return true when okay, false when not + * } + * } + * ] + * }); + */ + validate: function(elm, options) { + this._free(); + + options = Ink.extendObj({ + onSuccess: false, + onError: false, + customFlag: false, + confirmGroup: [] + }, options || {}); + + if(typeof(elm) === 'string') { + elm = document.getElementById(elm); + } + if(elm === null){ + return false; + } + this.element = elm; + + if(typeof(this.element.id) === 'undefined' || this.element.id === null || this.element.id === '') { + // generate a random ID + // TODO ugly and potentially problematic, and you know Murphy's law. + this.element.id = 'ink-fv_randomid_'+(Math.round(Math.random() * 99999)); + } + + this.custom = options.customFlag; + + this.confirmGroup = options.confirmGroup; + + var fail = this._validateElements(); + + if(fail.length > 0) { + if(options.onError) { + options.onError(fail); + } else { + this._showError(elm, fail); + } + return false; + } else { + if(!options.onError) { + this._clearError(elm); + } + this._clearCache(); + if(options.onSuccess) { + options.onSuccess(); + } + return true; + } + + }, + + /** + * Reset previously generated validation errors + * + * @method reset + * @public + */ + reset: function() + { + this._clearError(); + this._clearCache(); + }, + + /** + * Cleans the object + * + * @method _free + * @private + */ + _free: function() + { + this.element = null; + //this.elements = []; + this.custom = false; + this.confirmGroup = false; + }, + + /** + * Cleans the properties responsible for caching + * + * @method _clearCache + * @private + */ + _clearCache: function() + { + this.element = null; + this.elements = []; + this.custom = false; + this.confirmGroup = false; + }, + + /** + * Gets the form elements and stores them in the caching properties + * + * @method _getElements + * @private + */ + _getElements: function() + { + //this.elements = []; + // if(typeof(this.elements[this.element.id]) !== 'undefined') { + // return; + // } + + var elements = this.elements[this.element.id] = []; + this.confirmElms[this.element.id] = []; + //console.log(this.element); + //console.log(this.element.elements); + var formElms = Selector.select(':input', this.element); + var curElm = false; + for(var i=0, totalElm = formElms.length; i < totalElm; i++) { + curElm = formElms[i]; + var type = (curElm.getAttribute('type') + '').toLowerCase(); + + if (type === 'radio' || type === 'checkbox') { + if(elements.length === 0 || + ( + curElm.getAttribute('type') !== elements[elements.length - 1].getAttribute('type') && + curElm.getAttribute('name') !== elements[elements.length - 1].getAttribute('name') + )) { + for(var flag in this._flagMap) { + if(Css.hasClassName(curElm, flag)) { + elements.push(curElm); + break; + } + } + } + } else { + for(var flag2 in this._flagMap) { + if(Css.hasClassName(curElm, flag2) && flag2 !== 'ink-fv-confirm') { + /*if(flag2 == 'ink-fv-confirm') { + this.confirmElms[this.element.id].push(curElm); + this.hasConfirm[this.element.id] = true; + }*/ + elements.push(curElm); + break; + } + } + + if(Css.hasClassName(curElm, 'ink-fv-confirm')) { + this.confirmElms[this.element.id].push(curElm); + this.hasConfirm[this.element.id] = true; + } + + } + } + }, + + /** + * Runs the validation for each element + * + * @method _validateElements + * @private + */ + _validateElements: function() { + var oGroups; + this._getElements(); + if(this.hasConfirm[this.element.id] === true) { + oGroups = this._makeConfirmGroups(); + } + + var errors = []; + + var curElm = false; + var customErrors = false; + var inArray; + for(var i=0, totalElm = this.elements[this.element.id].length; i < totalElm; i++) { + inArray = false; + curElm = this.elements[this.element.id][i]; + + if(!curElm.disabled) { + for(var flag in this._flagMap) { + if(Css.hasClassName(curElm, flag)) { + if(flag !== 'ink-fv-custom' && flag !== 'ink-fv-confirm') { + if(!this._isValid(curElm, flag)) { + if(!inArray) { + errors.push({elm: curElm, errors:[flag]}); + inArray = true; + } else { + errors[(errors.length - 1)].errors.push(flag); + } + } + } else if(flag !== 'ink-fv-confirm'){ + customErrors = this._isCustomValid(curElm); + if(customErrors.length > 0) { + errors.push({elm: curElm, errors:[flag], custom: customErrors}); + } + } else if(flag === 'ink-fv-confirm'){ + continue; + } + } + } + } + } + errors = this._validateConfirmGroups(oGroups, errors); + //console.log(InkDumper.returnDump(errors)); + return errors; + }, + + /** + * Runs the 'confirm' validation for each group of elements + * + * @method _validateConfirmGroups + * @param {Array} oGroups Array/Object that contains the group of confirm objects + * @param {Array} errors Array that will store the errors + * @private + * @return {Array} Array of errors that was passed as 2nd parameter (either changed, or not, depending if errors were found). + */ + _validateConfirmGroups: function(oGroups, errors) { + //console.log(oGroups); + var curGroup = false; + for(var i in oGroups) if (oGroups.hasOwnProperty(i)) { + curGroup = oGroups[i]; + if(curGroup.length === 2) { + if(curGroup[0].value !== curGroup[1].value) { + errors.push({elm:curGroup[1], errors:['ink-fv-confirm']}); + } + } + } + return errors; + }, + + /** + * Creates the groups of 'confirm' objects + * + * @method _makeConfirmGroups + * @private + * @return {Array|Boolean} Returns the array of confirm elements or false on error. + */ + _makeConfirmGroups: function() + { + var oGroups; + if(this.confirmGroup && this.confirmGroup.length > 0) { + oGroups = {}; + var curElm = false; + var curGroup = false; + //this.confirmElms[this.element.id]; + for(var i=0, total=this.confirmElms[this.element.id].length; i < total; i++) { + curElm = this.confirmElms[this.element.id][i]; + for(var j=0, totalG=this.confirmGroup.length; j < totalG; j++) { + curGroup = this.confirmGroup[j]; + if(Css.hasClassName(curElm, curGroup)) { + if(typeof(oGroups[curGroup]) === 'undefined') { + oGroups[curGroup] = [curElm]; + } else { + oGroups[curGroup].push(curElm); + } + } + } + } + return oGroups; + } else { + if(this.confirmElms[this.element.id].length === 2) { + oGroups = { + "ink-fv-confirm": [ + this.confirmElms[this.element.id][0], + this.confirmElms[this.element.id][1] + ] + }; + } + return oGroups; + } + return false; + }, + + /** + * Validates an element with a custom validation + * + * @method _isCustomValid + * @param {DOMElemenmt} elm Element to be validated + * @private + * @return {Array} Array of errors. If no errors are found, results in an empty array. + */ + _isCustomValid: function(elm) + { + var customErrors = []; + var curFlag = false; + for(var i=0, tCustom = this.custom.length; i < tCustom; i++) { + curFlag = this.custom[i]; + if(Css.hasClassName(elm, curFlag.flag)) { + if(!curFlag.callback(elm, curFlag.msg)) { + customErrors.push({flag: curFlag.flag, msg: curFlag.msg}); + } + } + } + return customErrors; + }, + + /** + * Runs the normal validation functions for a specific element + * + * @method _isValid + * @param {DOMElement} elm DOMElement that will be validated + * @param {String} fieldType Rule to be validated. This must be one of the keys present in the _flagMap property. + * @private + * @return {Boolean} The result of the validation. + */ + _isValid: function(elm, fieldType) { + var nodeName = elm.nodeName.toLowerCase(); + var inputType = (elm.getAttribute('type') || '').toLowerCase(); + var value = this._trim(elm.value); + + // When we're analyzing emails, telephones, etc, and the field is + // empty, we check if it is required. If not required, it's valid. + if (fieldType !== 'ink-fv-required' && + inputType !== 'checkbox' && inputType !== 'radio' && + value === '') { + return !Css.hasClassName(elm, 'ink-fv-required'); + } + + switch(fieldType) { + case 'ink-fv-required': + if(nodeName === 'select') { + if(elm.selectedIndex > 0) { + return true; + } else { + return false; + } + } + if(inputType !== 'checkbox' && inputType !== 'radio' && + value !== '') { + return true; // A input type=text,email,etc. + } else if(inputType === 'checkbox' || inputType === 'radio') { + var aFormRadios = elementsWithSameName(elm); + var isChecked = false; + // check if any input of the radio is checked + for(var i=0, totalRadio = aFormRadios.length; i < totalRadio; i++) { + if(aFormRadios[i].checked === true) { + isChecked = true; + break; + } + } + return isChecked; + } + return false; + + case 'ink-fv-email': + return InkValidator.mail(elm.value); + + case 'ink-fv-url': + return InkValidator.url(elm.value); + + case 'ink-fv-number': + return !isNaN(Number(elm.value)) && isFinite(Number(elm.value)); + + case 'ink-fv-phone_pt': + return InkValidator.isPTPhone(elm.value); + + case 'ink-fv-phone_cv': + return InkValidator.isCVPhone(elm.value); + + case 'ink-fv-phone_ao': + return InkValidator.isAOPhone(elm.value); + + case 'ink-fv-phone_mz': + return InkValidator.isMZPhone(elm.value); + + case 'ink-fv-date': + var Element = Ink.getModule('Ink.Dom.Element',1); + var dataset = Element.data( elm ); + var validFormat = 'yyyy-mm-dd'; + + if( Css.hasClassName(elm, 'ink-datepicker') && ('format' in dataset) ){ + validFormat = dataset.format; + } else if( ('validFormat' in dataset) ){ + validFormat = dataset.validFormat; + } + + if( !(validFormat in InkValidator._dateParsers ) ){ + var validValues = []; + for( var val in InkValidator._dateParsers ){ + if (InkValidator._dateParsers.hasOwnProperty(val)) { + validValues.push(val); + } + } + throw new Error( + 'The attribute data-valid-format must be one of ' + + 'the following values: ' + validValues.join(', ')); + } + + return InkValidator.isDate( validFormat, elm.value ); + case 'ink-fv-custom': + break; + } + + return false; + }, + + /** + * Makes the necessary changes to the markup to show the errors of a given element + * + * @method _showError + * @param {DOMElement} formElm The form element to be changed to show the errors + * @param {Array} aFail An array with the errors found. + * @private + */ + _showError: function(formElm, aFail) { + this._clearError(formElm); + + //ink-warning-field + + //console.log(aFail); + var curElm = false; + for(var i=0, tFail = aFail.length; i < tFail; i++) { + curElm = aFail[i].elm; + if (curElm) { + this._showAnErrorOnElement(curElm, aFail[i]); + } + } + }, + + _showAnErrorOnElement: function (curElm, error) { + /* jshint noempty:false */ + + var controlGroupElm = InkElement.findUpwardsByClass( + curElm, 'control-group'); + var controlElm = InkElement.findUpwardsByClass( + curElm, 'control'); + + var errorClasses = [ + this._errorClassName, + this._errorTypeClassName].join(' '); + + var errorMsg = InkElement.create('p', { + className: errorClasses + }); + + if(error.errors[0] !== 'ink-fv-custom') { + errorMsg.innerHTML = this._flagMap[error.errors[0]].msg; + } else { + errorMsg.innerHTML = error.custom[0].msg; + } + + var target = (controlElm || controlGroupElm); + if (target) { + target.appendChild(errorMsg); + } else { + InkElement.insertAfter(errorMsg, curElm); + } + + if (controlElm) { + if(error.errors[0] === 'ink-fv-required') { + Css.addClassName(controlGroupElm, 'validation error'); + } else { + Css.addClassName(controlGroupElm, 'validation warning'); + } + } + }, + + /** + * Clears the error of a given element. Normally executed before any validation, for all elements, as a reset. + * + * @method _clearErrors + * @param {DOMElement} formElm Form element to be cleared. + * @private + */ + _clearError: function(formElm) { + //return; + var aErrorLabel = formElm.getElementsByTagName('p'); + + var curElm; + var control; + + for(var i = (aErrorLabel.length - 1); i >= 0; i--) { + curElm = aErrorLabel[i]; + if(Css.hasClassName(curElm, this._errorClassName)) { + control = InkElement.findUpwardsBySelector(curElm, '.control-group'); + if (control) { + Css.removeClassName(control, ['validation', 'error', 'warning']); + } + + if(Css.hasClassName(curElm, this._errorClassName, true /*both*/)) { + InkElement.remove(curElm); + } + } + } + + var aErrorLabel2 = formElm.getElementsByTagName('ul'); + for(i = (aErrorLabel2.length - 1); i >= 0; i--) { + curElm = aErrorLabel2[i]; + if(Css.hasClassName(curElm, 'control-group')) { + Css.removeClassName(curElm, 'validation error'); + } + } + }, + + /** + * Removes unnecessary spaces to the left or right of a string + * + * @method _trim + * @param {String} stri String to be trimmed + * @private + * @return {String|undefined} String trimmed. + */ + _trim: function(str) + { + if(typeof(str) === 'string') + { + return str.replace(/^\s+|\s+$|\n+$/g, ''); + } + } + }; + + return FormValidator; + +}); \ No newline at end of file diff --git a/ajax/libs/ink/2.3.1/js/ink.imagequery.js b/ajax/libs/ink/2.3.1/js/ink.imagequery.js new file mode 100644 index 000000000..769701028 --- /dev/null +++ b/ajax/libs/ink/2.3.1/js/ink.imagequery.js @@ -0,0 +1,211 @@ +/** + * @module Ink.UI.ImageQuery_1 + * @author inkdev AT sapo.pt + * @version 1 + */ +Ink.createModule('Ink.UI.ImageQuery', '1', ['Ink.UI.Common_1','Ink.Dom.Event_1','Ink.Dom.Element_1','Ink.Util.Array_1'], function(Common, Event, Element, InkArray ) { + 'use strict'; + + /** + * @class Ink.UI.ImageQuery + * @constructor + * @version 1 + * + * @param {String|DOMElement} selector + * @param {Object} [options] Options + * @param {String|Function} [options.src] String or Callback function (that returns a string) with the path to be used to get the images. + * @param {String|Function} [options.retina] String or Callback function (that returns a string) with the path to be used to get RETINA specific images. + * @param {Array} [options.queries] Array of queries + * @param {String} [options.queries.label] Label of the query. Ex. 'small' + * @param {Number} [options.queries.width] Min-width to use this query + * @param {Function} [options.onLoad] Date format string + * + * @example + *
              + * + *
              + * + */ + var ImageQuery = function(selector, options){ + + /** + * Get elements, create more ImageQueries if selector finds more than one + * + * [improvement] This is a useful pattern. More UI modules could use it. + */ + this._element = Common.elsOrSelector(selector, 'Ink.UI.ImageQuery', /*required=*/true); + + // In case we have several elements + for (var i = 1 /* start from second element*/; i < this._element.length; i++) { + new ImageQuery(this._element[i], options); + } + + this._element = this._element[0]; + + /** + * Default options, overriden by data-attributes if any. + * The parameters are: + * @param {array} queries Array of objects that determine the label/name and its min-width to be applied. + * @param {boolean} allowFirstLoad Boolean flag to allow the loading of the first element. + */ + this._options = Ink.extendObj({ + queries:[], + onLoad: null + }, options || {}, Element.data(this._element)); + + /** + * Determining the original basename (with the querystring) of the file. + */ + var pos; + if( (pos=this._element.src.lastIndexOf('?')) !== -1 ){ + var search = this._element.src.substr(pos); + this._filename = this._element.src.replace(search,'').split('/').pop()+search; + } else { + this._filename = this._element.src.split('/').pop(); + } + + this._init(); + }; + + ImageQuery.prototype = { + + /** + * Init function called by the constructor + * + * @method _init + * @private + */ + _init: function(){ + // Sort queries by width, in descendant order. + this._options.queries = InkArray.sortMulti(this._options.queries, 'width').reverse(); + + if( typeof this._options.onLoad === 'function' ){ + Event.observe(this._element, 'onload', Ink.bindEvent(this._onLoad, this)); + } + + Event.observe(window, 'resize', Ink.bindEvent(this._onResize, this)); + + // Imediate call to apply the right images based on the current viewport + this._onResize(); + }, + + /** + * Handles the resize event (as specified in the _init function) + * + * @method _onResize + * @private + */ + _onResize: Event.throttle(function(){ + if( !this._options.queries.length ){ + return; + } + + var current = this._findCurrentQuery(); + + /** + * Choosing the right src. The rule is: + * + * "If there is specifically defined in the query object, use that. Otherwise uses the global src." + * + * The above rule applies to a retina src. + */ + var src = current.src || this._options.src; + if ( window.devicePixelRatio > 1 && ('retina' in this._options ) ) { + src = current.retina || this._options.retina; + } + + /** + * Injects the file variable for usage in the 'templating system' below + */ + current.file = this._filename; + + /** + * Since we allow the src to be a callback, let's run it and get the results. + * For the inside, we're passing the element (img) being processed and the object of the selected + * query. + */ + if( typeof src === 'function' ){ + src = src.apply(this,[this._element,current]); + if( typeof src !== 'string' ){ + throw '[ImageQuery] :: "src" callback does not return a string'; + } + } + + /** + * Replace the values of the existing properties on the query object (except src and retina) in the + * defined src and/or retina. + */ + src = src.replace(/{:(.*?)}/g, function(_, prop) { + return current[prop]; + }); + + this._element.src = src; + + // Removes the injected file property + delete current.file; + }, 500), + + /** + * Queries are in a descendant order. We want to find the query with the highest width that fits + * the viewport, therefore the first one. + */ + _findCurrentQuery: function () { + /** + * Gets viewport width + */ + var viewportWidth = window.innerWidth || + document.documentElement.clientWidth || + document.body.clientWidth; + + var queries = this._options.queries; + var last = queries.length - 1; + + for( var query=0; query < last; query+=1 ){ + if (queries[query].width <= viewportWidth){ + return queries[query]; + } + } + + return queries[last]; + }, + + /** + * Handles the element loading (img onload) event + * + * @method _onLoad + * @private + */ + _onLoad: function(){ + + /** + * Since we allow a callback for this let's run it. + */ + this._options.onLoad.call(this); + } + + }; + + return ImageQuery; + +}); diff --git a/ajax/libs/ink/2.3.1/js/ink.js b/ajax/libs/ink/2.3.1/js/ink.js new file mode 100644 index 000000000..018f70fae --- /dev/null +++ b/ajax/libs/ink/2.3.1/js/ink.js @@ -0,0 +1,13257 @@ +;(function(window, document) { + + 'use strict'; + + /** + * @module Ink_1 + */ + + /** + * global object + * + * @class Ink + */ + + + // skip redefinition of Ink core + if ('Ink' in window) { return; } + + + // internal data + + /* + * NOTE: + * invoke Ink.setPath('Ink', '/Ink/'); before requiring local modules + */ + var paths = {}; + var modules = {}; + var modulesLoadOrder = []; + var modulesRequested = {}; + var pendingRMs = []; + var modulesWaitingForDeps = {}; + + var apply = Function.prototype.apply; + + // auxiliary fns + var isEmptyObject = function(o) { + /*jshint unused:false */ + if (typeof o !== 'object') { return false; } + for (var k in o) { + if (o.hasOwnProperty(k)) { + return false; + } + } + return true; + }; + + window.Ink = { + + _checkPendingRequireModules: function() { + var I, F, o, dep, mod, cb, pRMs = []; + for (I = 0, F = pendingRMs.length; I < F; ++I) { + o = pendingRMs[I]; + + if (!o) { continue; } + + for (dep in o.left) { + if (o.left.hasOwnProperty(dep)) { + mod = modules[dep]; + if (mod) { + o.args[o.left[dep] ] = mod; + delete o.left[dep]; + --o.remaining; + } + } + } + + if (o.remaining > 0) { + pRMs.push(o); + } + else { + cb = o.cb; + if (!cb) { continue; } + delete o.cb; // to make sure I won't call this more than once! + cb.apply(false, o.args); + } + } + + pendingRMs = pRMs; + + if (pendingRMs.length > 0) { + setTimeout( function() { Ink._checkPendingRequireModules(); }, 0 ); + } + }, + + /** + * Get the path of a certain module by looking up the paths given in setPath (and ultimately the default Ink path) + * + * @method getPath + * @param modName Name of the module you want the path of. + * @param noLib Exclude the 'lib.js' filename + */ + getPath: function(key, noLib) { + var split = key.split(/[._]/g); + var curKey; + var i; + var root; + var path; + // Look for Ink.Dom.Element.1, Ink.Dom.Element, Ink.Dom, Ink in this order. + for (i = split.length; i >= 0; i -= 1) { + curKey = split.slice(0, i + 1).join('.'); // See comment in setPath + if (paths[curKey]) { + root = curKey; + break; + } + } + path = paths[root || 'Ink']; + if (!/\/$/.test(path)) { + path += '/'; + } + if (i < split.length) { + path += split.slice(i + 1).join('/') + '/'; + } + if (!noLib) { + path += 'lib.js'; + } + return path; + }, + + /** + * Sets the URL path for a namespace. Use this to customize where + * requireModules (and createModule) will load dependencies from. + * + * @method setPath + * + * @param key + * @param rootURI + * + * @example + * Ink.setPath('Ink', 'http://my-cdn/Ink/'); + * Ink.setPath('Lol', 'http://my-cdn/Lol/'); + * + * // Loads from http://my-cdn/Ink/Dom/Whatever/lib.js + * Ink.requireModules(['Ink.Dom.Whatever'], function () { ... }); + * // Loads from http://my-cdn/Lol/Whatever/lib.js + * Ink.requireModules(['Lol.Whatever'], function () { ... }); + */ + setPath: function(key, rootURI) { + // Replacing version separator with dot because the difference + // between a submodule and a version doesn't matter here. + // It would also overcomplicate the implementation of getPath + paths[key.replace(/_/, '.')] = rootURI; + }, + + /** + * Loads a script by creating a ` + */ + var Browser = { + /** + * True if the browser is Internet Explorer + * + * @property IE + * @type {Boolean} + * @public + * @static + */ + IE: false, + + /** + * True if the browser is Gecko based + * + * @property GECKO + * @type {Boolean} + * @public + * @static + */ + GECKO: false, + + /** + * True if the browser is Opera + * + * @property OPERA + * @type {Boolean} + * @public + * @static + */ + OPERA: false, + + /** + * True if the browser is Safari + * + * @property SAFARI + * @type {Boolean} + * @public + * @static + */ + SAFARI: false, + + /** + * True if the browser is Konqueror + * + * @property KONQUEROR + * @type {Boolean} + * @public + * @static + */ + KONQUEROR: false, + + /** + * True if browser is Chrome + * + * @property CHROME + * @type {Boolean} + * @public + * @static + */ + CHROME: false, + + /** + * The specific browser model. False if it is unavailable. + * + * @property model + * @type {Boolean|String} + * @public + * @static + */ + model: false, + + /** + * The browser version. False if it is unavailable. + * + * @property version + * @type {Boolean|String} + * @public + * @static + */ + version: false, + + /** + * The user agent string. False if it is unavailable. + * + * @property userAgent + * @type {Boolean|String} + * @public + * @static + */ + userAgent: false, + + /** + * Initialization function for the Browser object. + * + * Is called automatically when this module is loaded, and calls setDimensions, setBrowser and setReferrer. + * + * @method init + * @public + */ + init: function() { + this.detectBrowser(); + this.setDimensions(); + this.setReferrer(); + }, + + /** + * Retrieves and stores window dimensions in this object. Called automatically when this module is loaded. + * + * @method setDimensions + * @public + */ + setDimensions: function() { + //this.windowWidth=window.innerWidth !== null? window.innerWidth : document.documentElement && document.documentElement.clientWidth ? document.documentElement.clientWidth : document.body !== null ? document.body.clientWidth : null; + //this.windowHeight=window.innerHeight != null? window.innerHeight : document.documentElement && document.documentElement.clientHeight ? document.documentElement.clientHeight : document.body != null? document.body.clientHeight : null; + var myWidth = 0, myHeight = 0; + if ( typeof window.innerWidth=== 'number' ) { + myWidth = window.innerWidth; + myHeight = window.innerHeight; + } else if( document.documentElement && ( document.documentElement.clientWidth || document.documentElement.clientHeight ) ) { + myWidth = document.documentElement.clientWidth; + myHeight = document.documentElement.clientHeight; + } else if( document.body && ( document.body.clientWidth || document.body.clientHeight ) ) { + myWidth = document.body.clientWidth; + myHeight = document.body.clientHeight; + } + this.windowWidth = myWidth; + this.windowHeight = myHeight; + }, + + /** + * Stores the referrer. Called automatically when this module is loaded. + * + * @method setReferrer + * @public + */ + setReferrer: function() { + if (document.referrer && document.referrer.length) { + this.referrer = window.escape(document.referrer); + } else { + this.referrer = false; + } + }, + + /** + * Detects the browser and stores the found properties. Called automatically when this module is loaded. + * + * @method detectBrowser + * @public + */ + detectBrowser: function() { + this._sniffUserAgent(navigator.userAgent); + }, + + _sniffUserAgent: function (sAgent) { + this.userAgent = sAgent; + + sAgent = sAgent.toLowerCase(); + + if (/applewebkit\//.test(sAgent)) { + this.cssPrefix = '-webkit-'; + this.domPrefix = 'Webkit'; + if(/(chrome|crios)\//.test(sAgent)) { + // Chrome + this.CHROME = true; + this.model = 'chrome'; + this.version = sAgent.replace(/(.*)chrome\/([^\s]+)(.*)/, "$2"); + } else { + // Safari + this.SAFARI = true; + this.model = 'safari'; + var rVersion = /version\/([^) ]+)/; + if (rVersion.test(sAgent)) { + this.version = sAgent.match(rVersion)[1]; + } else { + this.version = sAgent.replace(/(.*)applewebkit\/([^\s]+)(.*)/, "$2"); + } + } + } else if (/opera/.test(sAgent)) { + // Opera + this.OPERA = true; + this.model = 'opera'; + this.version = sAgent.replace(/(.*)opera.([^\s$]+)(.*)/, "$2"); + this.cssPrefix = '-o-'; + this.domPrefix = 'O'; + } else if (/konqueror/.test(sAgent)) { + // Konqueroh + this.KONQUEROR = true; + this.model = 'konqueror'; + this.version = sAgent.replace(/(.*)konqueror\/([^;]+);(.*)/, "$2"); + this.cssPrefix = '-khtml-'; + this.domPrefix = 'Khtml'; + } else if (/(msie|trident)/i.test(sAgent)) { + // MSIE + this.IE = true; + this.model = 'ie'; + if (/rv:((?:\d|\.)+)/.test(sAgent)) { // IE 11 + this.version = sAgent.match(/rv:((?:\d|\.)+)/)[1]; + } else { + this.version = sAgent.replace(/(.*)\smsie\s([^;]+);(.*)/, "$2"); + } + this.cssPrefix = '-ms-'; + this.domPrefix = 'ms'; + } else if (/gecko/.test(sAgent)) { + // GECKO + // Supports only: + // Camino, Chimera, Epiphany, Minefield (firefox 3), Firefox, Firebird, Phoenix, Galeon, + // Iceweasel, K-Meleon, SeaMonkey, Netscape, Songbird, Sylera, + this.cssPrefix = '-moz-'; + this.domPrefix = 'Moz'; + + this.GECKO = true; + + var re = /(camino|chimera|epiphany|minefield|firefox|firebird|phoenix|galeon|iceweasel|k\-meleon|seamonkey|netscape|songbird|sylera)/; + if(re.test(sAgent)) { + this.model = sAgent.match(re)[1]; + this.version = sAgent.replace(new RegExp("(.*)"+this.model+"\/([^;\\s$]+)(.*)"), "$2"); + } else { + // probably is mozilla + this.model = 'mozilla'; + var reVersion = /(.*)rv:([^)]+)(.*)/; + if(reVersion.test(sAgent)) { + this.version = sAgent.replace(reVersion, "$2"); + } + } + } + }, + + /** + * Debug function which displays browser (and Ink.Dom.Browser) information as an alert message. + * + * @method debug + * @public + * + * @example + * + * The following code + * + * Ink.requireModules(['Ink.Dom.Browser_1'], function (Browser) { + * Browser.debug(); + * }); + * + * Alerts (On Firefox 22): + * + * known browsers: (ie, gecko, opera, safari, konqueror) + * false,true,false,false,false + * model -> firefox + * version -> 22.0 + * + * original UA -> Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:22.0) Gecko/20100101 Firefox/22.0 + */ + debug: function() { + /*global alert:false */ + var str = "known browsers: (ie, gecko, opera, safari, konqueror) \n"; + str += [this.IE, this.GECKO, this.OPERA, this.SAFARI, this.KONQUEROR] +"\n"; + str += "model -> "+this.model+"\n"; + str += "version -> "+this.version+"\n"; + str += "\n"; + str += "original UA -> "+this.userAgent; + + alert(str); + } + }; + + Browser.init(); + + return Browser; +}); + +/** + * @author inkdev AT sapo.pt + */ + +Ink.createModule( 'Ink.Dom.Css', 1, [], function() { + + 'use strict'; + + /** + * @module Ink.Dom.Css_1 + */ + + // getComputedStyle feature detection. + var getCs = ("defaultView" in document) && ("getComputedStyle" in document.defaultView) ? document.defaultView.getComputedStyle : window.getComputedStyle; + + /** + * @class Ink.Dom.Css + * @static + */ + + var Css = { + /** + * adds or removes a class to the given element according to addRemState + * + * @method addRemoveClassName + * @param {DOMElement|string} elm DOM element or element id + * @param {string} className class name to add or remove. + * @param {boolean} addRemState Whether to add or remove. `true` to add, `false` to remove. + * + * @example + * Ink.requireModules(['Ink.Dom.Css_1'], function (Css) { + * Css.addRemoveClassName(myElm, 'classss', true); // Adds the `classss` class. + * Css.addRemoveClassName(myElm, 'classss', false); // Removes the `classss` class. + * }); + */ + addRemoveClassName: function(elm, className, addRemState) { + if (addRemState) { + return this.addClassName(elm, className); + } + this.removeClassName(elm, className); + }, + + /** + * add a class to a given element + * + * @method addClassName + * @param {DOMElement|String} elm DOM element or element id + * @param {String} className + */ + addClassName: function(elm, className) { + elm = Ink.i(elm); + if (!elm || !className) { return null; } + className = ('' + className).split(/[, ]+/); + var i = 0; + var len = className.length; + + for (; i < len; i++) { + if (typeof elm.classList !== "undefined") { + elm.classList.add(className[i]); + } else if (!Css.hasClassName(elm, className[i])) { + elm.className += (elm.className ? ' ' : '') + className[i]; + } + } + }, + + /** + * removes a class from a given element + * + * @method removeClassName + * @param {DOMElement|String} elm DOM element or element id + * @param {String} className + */ + removeClassName: function(elm, className) { + elm = Ink.i(elm); + if (!elm || !className) { return null; } + + className = ('' + className).split(/[, ]+/); + var i = 0; + var len = className.length; + + if (typeof elm.classList !== "undefined"){ + for (; i < len; i++) { + elm.classList.remove(className[i]); + } + } else { + var elmClassName = elm.className || ''; + var re; + for (; i < len; i++) { + re = new RegExp("(^|\\s+)" + className[i] + "(\\s+|$)"); + elmClassName = elmClassName.replace(re, ' '); + } + elm.className = (elmClassName + .replace(/^\s+/, '') + .replace(/\s+$/, '')); + } + }, + + /** + * Alias to addRemoveClassName. Utility function, saves many if/elses. + * + * @method setClassName + * @param {DOMElement|String} elm DOM element or element id + * @param {String} className + * @param {Boolean} add true to add, false to remove + */ + setClassName: function(elm, className, add) { + this.addRemoveClassName(elm, className, add || false); + }, + + /** + * @method hasClassName + * @param {DOMElement|String} elm DOM element or element id + * @param {String|Array} classNames classNames to test + * @param {Boolean} [all=false] if true, return whether all classes in classNames are there. Otherwise, return true if any is present. + * @return {Boolean} true if a given class is applied to a given element + */ + hasClassName: function(elm, className, all) { + elm = Ink.i(elm); + if (!elm || !className) { return false; } + + className = ('' + className).split(/[, ]+/); + var i = 0; + var len = className.length; + var has; + var re; + + for ( ; i < len; i++) { + if (typeof elm.classList !== "undefined"){ + has = elm.classList.contains(className[i]); + } else { + var elmClassName = elm.className; + if (elmClassName === className[i]) { + has = true; + } else { + re = new RegExp("(^|\\s)" + className[i] + "(\\s|$)"); + has = re.test(elmClassName); + } + } + if (has && !all) { return true; } // return if looking for any class + if (!has && all) { return false; } // return if looking for all classes + } + + if (all) { + // if we got here, all classes were found so far + return true; + } else { + // if we got here with all == false, no class was found + return false; + } + }, + + /** + * Add and removes the class from the element with a timeout, so it blinks + * + * @method blinkClass + * @param {DOMElement|String} elm DOM element or element id + * @param {String} className class name + * @param {Boolean} timeout timeout in ms between adding and removing, default 100 ms + * @param {Boolean} negate is true, class is removed then added + */ + blinkClass: function(element, className, timeout, negate){ + element = Ink.i(element); + Css.addRemoveClassName(element, className, !negate); + setTimeout(function() { + Css.addRemoveClassName(element, className, negate); + }, Number(timeout) || 100); + }, + + /** + * Add or remove a class name from a given element + * + * @method toggleClassName + * @param {DOMElement|String} elm DOM element or element id + * @param {String} className class name + * @param {Boolean} forceAdd forces the addition of the class if it doesn't exists + */ + toggleClassName: function(elm, className, forceAdd) { + if (elm && className){ + if (typeof elm.classList !== "undefined" && !/[, ]/.test(className)){ + elm = Ink.i(elm); + if (elm !== null){ + elm.classList.toggle(className); + } + return true; + } + } + + if (typeof forceAdd !== 'undefined') { + if (forceAdd === true) { + Css.addClassName(elm, className); + } + else if (forceAdd === false) { + Css.removeClassName(elm, className); + } + } else { + if (Css.hasClassName(elm, className)) { + Css.removeClassName(elm, className); + } else { + Css.addClassName(elm, className); + } + } + }, + + /** + * sets the opacity of given client a given element + * + * @method setOpacity + * @param {DOMElement|String} elm DOM element or element id + * @param {Number} value allows 0 to 1(default mode decimal) or percentage (warning using 0 or 1 will reset to default mode) + */ + setOpacity: function(elm, value) { + elm = Ink.i(elm); + if (elm !== null){ + var val = 1; + + if (!isNaN(Number(value))){ + if (value <= 0) { val = 0; } + else if (value <= 1) { val = value; } + else if (value <= 100) { val = value / 100; } + else { val = 1; } + } + + if (typeof elm.style.opacity !== 'undefined') { + elm.style.opacity = val; + } + else { + elm.style.filter = "alpha(opacity:"+(val*100|0)+")"; + } + } + }, + + /** + * Converts a css property name to a string in camelcase to be used with CSSStyleDeclaration. + * @method _camelCase + * @private + * @param {String} str String to convert + * @return {String} Converted string + */ + _camelCase: function(str) { + return str ? str.replace(/-(\w)/g, function (_, $1) { + return $1.toUpperCase(); + }) : str; + }, + + + /** + * Gets the value for an element's style attribute + * + * @method getStyle + * @param {DOMElement|String} elm DOM element or element id + * @param {String} style Which css attribute to fetch + * @return Style value + */ + getStyle: function(elm, style) { + elm = Ink.i(elm); + if (elm !== null) { + style = style === 'float' ? 'cssFloat': this._camelCase(style); + + var value = elm.style[style]; + + if (getCs && (!value || value === 'auto')) { + var css = getCs(elm, null); + value = css ? css[style] : null; + } + else if (!value && elm.currentStyle) { + value = elm.currentStyle[style]; + if (value === 'auto' && (style === 'width' || style === 'height')) { + value = elm["offset" + style.charAt(0).toUpperCase() + style.slice(1)] + "px"; + } + } + + if (style === 'opacity') { + return value ? parseFloat(value, 10) : 1.0; + } + else if (style === 'borderTopWidth' || style === 'borderBottomWidth' || + style === 'borderRightWidth' || style === 'borderLeftWidth' ) { + if (value === 'thin') { return '1px'; } + else if (value === 'medium') { return '3px'; } + else if (value === 'thick') { return '5px'; } + } + + return value === 'auto' ? null : value; + } + }, + + + /** + * Adds CSS rules to an element's style attribute. + * + * @method setStyle + * @param {DOMElement|String} elm DOM element or element id + * @param {String} style Which css attribute to set + * + * @example + * Change his color + *

              "He" is me

              + * + * + */ + setStyle: function(elm, style) { + elm = Ink.i(elm); + if (elm === null) { return; } + if (typeof style === 'string') { + elm.style.cssText += '; '+style; + + if (style.indexOf('opacity') !== -1) { + this.setOpacity(elm, style.match(/opacity:\s*(\d?\.?\d*)/)[1]); + } + } + else { + for (var prop in style) { + if (style.hasOwnProperty(prop)){ + if (prop === 'opacity') { + this.setOpacity(elm, style[prop]); + } + else if (prop === 'float' || prop === 'cssFloat') { + if (typeof elm.style.styleFloat === 'undefined') { + elm.style.cssFloat = style[prop]; + } + else { + elm.style.styleFloat = style[prop]; + } + } else { + elm.style[prop] = style[prop]; + } + } + } + } + }, + + + /** + * Makes an element visible + * + * @method show + * @param {DOMElement|String} elm DOM element or element id + * @param {String} forceDisplayProperty Css display property to apply on show + */ + show: function(elm, forceDisplayProperty) { + elm = Ink.i(elm); + if (elm !== null) { + elm.style.display = (forceDisplayProperty) ? forceDisplayProperty : ''; + } + }, + + /** + * Hides an element + * + * @method hide + * @param {DOMElement|String} elm DOM element or element id + */ + hide: function(elm) { + elm = Ink.i(elm); + if (elm !== null) { + elm.style.display = 'none'; + } + }, + + /** + * shows or hides according to param show + * + * @method showHide + * @param {DOMElement|String} elm DOM element or element id + * @param {boolean} [show=false] Whether to show or hide `elm`. + */ + showHide: function(elm, show) { + elm = Ink.i(elm); + if (elm) { + elm.style.display = show ? '' : 'none'; + } + }, + + /** + * Shows or hides an element depending on current state + * @method toggle + * @param {DOMElement|String} elm DOM element or element id + * @param {Boolean} forceShow Forces showing if element is hidden + */ + toggle: function(elm, forceShow) { + elm = Ink.i(elm); + if (elm !== null) { + if (typeof forceShow !== 'undefined') { + if (forceShow === true) { + this.show(elm); + } else { + this.hide(elm); + } + } else { + if (this.getStyle(elm,'display').toLowerCase() === 'none') { + this.show(elm); + } + else { + this.hide(elm); + } + } + } + }, + + _getRefTag: function(head){ + if (head.firstElementChild) { + return head.firstElementChild; + } + + for (var child = head.firstChild; child; child = child.nextSibling){ + if (child.nodeType === 1){ + return child; + } + } + return null; + }, + + /** + * Adds css style tags to the head section of a page + * + * @method appendStyleTag + * @param {String} selector The css selector for the rule + * @param {String} style The content of the style rule + * @param {Object} options Options for the tag + * @param {String} [options.type] file type + * @param {Boolean} [options.force] if true, style tag will be appended to end of head + */ + appendStyleTag: function(selector, style, options){ + options = Ink.extendObj({ + type: 'text/css', + force: false + }, options || {}); + + var styles = document.getElementsByTagName("style"), + oldStyle = false, setStyle = true, i, l; + + for (i=0, l=styles.length; i= 0) { + setStyle = false; + } + } + + if (setStyle) { + var defStyle = document.createElement("style"), + head = document.getElementsByTagName("head")[0], + refTag = false, styleStr = ''; + + defStyle.type = options.type; + + styleStr += selector +" {"; + styleStr += style; + styleStr += "} "; + + if (typeof defStyle.styleSheet !== "undefined") { + defStyle.styleSheet.cssText = styleStr; + } else { + defStyle.appendChild(document.createTextNode(styleStr)); + } + + if (options.force){ + head.appendChild(defStyle); + } else { + refTag = this._getRefTag(head); + if (refTag){ + head.insertBefore(defStyle, refTag); + } + } + } + }, + + /** + * Adds a link tag for a stylesheet to the head section of a page + * + * @method appendStylesheet + * @param {String} path File path + * @param {Object} options Options for the tag + * @param {String} [options.media='screen'] media type + * @param {String} [options.type='text/css'] file type + * @param {Boolean} [options.force=false] if true, tag will be appended to end of head + */ + appendStylesheet: function(path, options){ + options = Ink.extendObj({ + media: 'screen', + type: 'text/css', + force: false + }, options || {}); + + var refTag, + style = document.createElement("link"), + head = document.getElementsByTagName("head")[0]; + + style.media = options.media; + style.type = options.type; + style.href = path; + style.rel = "Stylesheet"; + + if (options.force){ + head.appendChild(style); + } + else { + refTag = this._getRefTag(head); + if (refTag){ + head.insertBefore(style, refTag); + } + } + }, + + /** + * Loads CSS via LINK element inclusion in HEAD (skips append if already there) + * + * Works similarly to appendStylesheet but: + * a) supports all browsers; + * b) supports optional callback which gets invoked once the CSS has been applied + * + * @method appendStylesheetCb + * @param {String} cssURI URI of the CSS to load, if empty ignores and just calls back directly + * @param {Function(cssURI)} [callback] optional callback which will be called once the CSS is loaded + */ + _loadingCSSFiles: {}, + _loadedCSSFiles: {}, + appendStylesheetCb: function(url, callback) { + if (!url) { + return callback(url); + } + + if (this._loadedCSSFiles[url]) { + return callback(url); + } + + var cbs = this._loadingCSSFiles[url]; + if (cbs) { + return cbs.push(callback); + } + + this._loadingCSSFiles[url] = [callback]; + + var linkEl = document.createElement('link'); + linkEl.type = 'text/css'; + linkEl.rel = 'stylesheet'; + linkEl.href = url; + + var headEl = document.getElementsByTagName('head')[0]; + headEl.appendChild(linkEl); + + var imgEl = document.createElement('img'); + /* + var _self = this; + (function(_url) { + imgEl.onerror = function() { + //var url = this; + var url = _url; + _self._loadedCSSFiles[url] = true; + var callbacks = _self._loadingCSSFiles[url]; + for (var i = 0, f = callbacks.length; i < f; ++i) { + callbacks[i](url); + } + delete _self._loadingCSSFiles[url]; + }; + })(url); + */ + imgEl.onerror = Ink.bindEvent(function(event, _url) { + //var url = this; + var url = _url; + this._loadedCSSFiles[url] = true; + var callbacks = this._loadingCSSFiles[url]; + for (var i = 0, f = callbacks.length; i < f; ++i) { + callbacks[i](url); + } + delete this._loadingCSSFiles[url]; + }, this, url); + imgEl.src = url; + }, + + /** + * Converts decimal to hexadecimal values, for use with colors + * + * @method decToHex + * @param {String} dec Either a single decimal value, + * an rgb(r, g, b) string or an Object with r, g and b properties + * @return Hexadecimal value + */ + decToHex: function(dec) { + var normalizeTo2 = function(val) { + if (val.length === 1) { + val = '0' + val; + } + val = val.toUpperCase(); + return val; + }; + + if (typeof dec === 'object') { + var rDec = normalizeTo2(parseInt(dec.r, 10).toString(16)); + var gDec = normalizeTo2(parseInt(dec.g, 10).toString(16)); + var bDec = normalizeTo2(parseInt(dec.b, 10).toString(16)); + return rDec+gDec+bDec; + } + else { + dec += ''; + var rgb = dec.match(/\((\d+),\s?(\d+),\s?(\d+)\)/); + if (rgb !== null) { + return normalizeTo2(parseInt(rgb[1], 10).toString(16)) + + normalizeTo2(parseInt(rgb[2], 10).toString(16)) + + normalizeTo2(parseInt(rgb[3], 10).toString(16)); + } + else { + return normalizeTo2(parseInt(dec, 10).toString(16)); + } + } + }, + + /** + * Converts hexadecimal values to decimal, for use with colors + * + * @method hexToDec + * @param {String} hex hexadecimal value with 6, 3, 2 or 1 characters + * @return {Number} Object with properties r, g, b if length of number is >= 3 or decimal value instead. + */ + hexToDec: function(hex){ + if (hex.indexOf('#') === 0) { + hex = hex.substr(1); + } + if (hex.length === 6) { // will return object RGB + return { + r: parseInt(hex.substr(0,2), 16), + g: parseInt(hex.substr(2,2), 16), + b: parseInt(hex.substr(4,2), 16) + }; + } + else if (hex.length === 3) { // will return object RGB + return { + r: parseInt(hex.charAt(0) + hex.charAt(0), 16), + g: parseInt(hex.charAt(1) + hex.charAt(1), 16), + b: parseInt(hex.charAt(2) + hex.charAt(2), 16) + }; + } + else if (hex.length <= 2) { // will return int + return parseInt(hex, 16); + } + }, + + /** + * use this to obtain the value of a CSS property (searched from loaded CSS documents) + * + * @method getPropertyFromStylesheet + * @param {String} selector a CSS rule. must be an exact match + * @param {String} property a CSS property + * @return {String} value of the found property, or null if it wasn't matched + */ + getPropertyFromStylesheet: function(selector, property) { + var rule = this.getRuleFromStylesheet(selector); + if (rule) { + return rule.style[property]; + } + return null; + }, + + getPropertyFromStylesheet2: function(selector, property) { + var rules = this.getRulesFromStylesheet(selector); + /* + rules.forEach(function(rule) { + var x = rule.style[property]; + if (x !== null && x !== undefined) { + return x; + } + }); + */ + var x; + for(var i=0, t=rules.length; i < t; i++) { + x = rules[i].style[property]; + if (x !== null && x !== undefined) { + return x; + } + } + return null; + }, + + getRuleFromStylesheet: function(selector) { + var sheet, rules, ri, rf, rule; + var s = document.styleSheets; + if (!s) { + return null; + } + + for (var si = 0, sf = document.styleSheets.length; si < sf; ++si) { + sheet = document.styleSheets[si]; + rules = sheet.rules ? sheet.rules : sheet.cssRules; + if (!rules) { return null; } + + for (ri = 0, rf = rules.length; ri < rf; ++ri) { + rule = rules[ri]; + if (!rule.selectorText) { continue; } + if (rule.selectorText === selector) { + return rule; + } + } + } + + return null; + }, + + getRulesFromStylesheet: function(selector) { + var res = []; + var sheet, rules, ri, rf, rule; + var s = document.styleSheets; + if (!s) { return res; } + + for (var si = 0, sf = document.styleSheets.length; si < sf; ++si) { + sheet = document.styleSheets[si]; + rules = sheet.rules ? sheet.rules : sheet.cssRules; + if (!rules) { + return null; + } + + for (ri = 0, rf = rules.length; ri < rf; ++ri) { + rule = rules[ri]; + if (!rule.selectorText) { continue; } + if (rule.selectorText === selector) { + res.push(rule); + } + } + } + + return res; + }, + + getPropertiesFromRule: function(selector) { + var rule = this.getRuleFromStylesheet(selector); + var props = {}; + var prop, i, f; + + /*if (typeof rule.style.length === 'snumber') { + for (i = 0, f = rule.style.length; i < f; ++i) { + prop = this._camelCase( rule.style[i] ); + props[prop] = rule.style[prop]; + } + } + else { // HANDLES IE 8, FIREFOX RULE JOINING... */ + rule = rule.style.cssText; + var parts = rule.split(';'); + var steps, val, pre, pos; + for (i = 0, f = parts.length; i < f; ++i) { + if (parts[i].charAt(0) === ' ') { + parts[i] = parts[i].substring(1); + } + steps = parts[i].split(':'); + prop = this._camelCase( steps[0].toLowerCase() ); + val = steps[1]; + if (val) { + val = val.substring(1); + + if (prop === 'padding' || prop === 'margin' || prop === 'borderWidth') { + + if (prop === 'borderWidth') { pre = 'border'; pos = 'Width'; } + else { pre = prop; pos = ''; } + + if (val.indexOf(' ') !== -1) { + val = val.split(' '); + props[pre + 'Top' + pos] = val[0]; + props[pre + 'Bottom'+ pos] = val[0]; + props[pre + 'Left' + pos] = val[1]; + props[pre + 'Right' + pos] = val[1]; + } + else { + props[pre + 'Top' + pos] = val; + props[pre + 'Bottom'+ pos] = val; + props[pre + 'Left' + pos] = val; + props[pre + 'Right' + pos] = val; + } + } + else if (prop === 'borderRadius') { + if (val.indexOf(' ') !== -1) { + val = val.split(' '); + props.borderTopLeftRadius = val[0]; + props.borderBottomRightRadius = val[0]; + props.borderTopRightRadius = val[1]; + props.borderBottomLeftRadius = val[1]; + } + else { + props.borderTopLeftRadius = val; + props.borderTopRightRadius = val; + props.borderBottomLeftRadius = val; + props.borderBottomRightRadius = val; + } + } + else { + props[prop] = val; + } + } + } + //} + //console.log(props); + + return props; + }, + + /** + * Changes the font size of the elements which match the given CSS rule + * For this function to work, the CSS file must be in the same domain than the host page, otherwise JS can't access it. + * + * @method changeFontSize + * @param {String} selector CSS selector rule + * @param {Number} delta number of pixels to change on font-size + * @param {String} [op] supported operations are '+' and '*'. defaults to '+' + * @param {Number} [minVal] if result gets smaller than minVal, change does not occurr + * @param {Number} [maxVal] if result gets bigger than maxVal, change does not occurr + */ + changeFontSize: function(selector, delta, op, minVal, maxVal) { + var that = this; + Ink.requireModules(['Ink.Dom.Selector_1'], function(Selector) { + var e; + if (typeof selector !== 'string') { e = '1st argument must be a CSS selector rule.'; } + else if (typeof delta !== 'number') { e = '2nd argument must be a number.'; } + else if (op !== undefined && op !== '+' && op !== '*') { e = '3rd argument must be one of "+", "*".'; } + else if (minVal !== undefined && (typeof minVal !== 'number' || minVal <= 0)) { e = '4th argument must be a positive number.'; } + else if (maxVal !== undefined && (typeof maxVal !== 'number' || maxVal < maxVal)) { e = '5th argument must be a positive number greater than minValue.'; } + if (e) { throw new TypeError(e); } + + var val, el, els = Selector.select(selector); + if (minVal === undefined) { minVal = 1; } + op = (op === '*') ? function(a,b){return a*b;} : function(a,b){return a+b;}; + for (var i = 0, f = els.length; i < f; ++i) { + el = els[i]; + val = parseFloat( that.getStyle(el, 'fontSize')); + val = op(val, delta); + if (val < minVal) { continue; } + if (typeof maxVal === 'number' && val > maxVal) { continue; } + el.style.fontSize = val + 'px'; + } + }); + } + + }; + + return Css; + +}); + +/** + * @author inkdev AT sapo.pt + */ + +Ink.createModule('Ink.Dom.Element', 1, [], function() { + + 'use strict'; + + var createContextualFragmentSupport = ( + typeof document.createRange === 'function' && + typeof window.Range.prototype.createContextualFragment === 'function'); + + var deleteThisTbodyToken = 'Ink.Dom.Element tbody: ' + Math.random(); + var browserCreatesTbodies = (function () { + var div = document.createElement('div'); + div.innerHTML = ''; + return div.getElementsByTagName('tbody').length !== 0; + }()); + + function rect(elem){ + var dimensions = {}; + try { + dimensions = elem.getBoundingClientRect(); + } catch(e){ + dimensions = { top: elem.offsetTop, left: elem.offsetLeft }; + } + return dimensions; + } + + /** + * @module Ink.Dom.Element_1 + */ + + /** + * @class Ink.Dom.Element + */ + + var InkElement = { + + /** + * Shortcut for `document.getElementById` + * + * @method get + * @param {String|DOMElement} elm Either an ID of an element, or an element. + * @return {DOMElement|null} The DOM element with the given id or null when it was not found + */ + get: function(elm) { + if(typeof elm !== 'undefined') { + if(typeof elm === 'string') { + return document.getElementById(elm); + } + return elm; + } + return null; + }, + + /** + * Creates a DOM element + * + * @method create + * @param {String} tag tag name + * @param {Object} properties object with properties to be set on the element. You can also call other functions in Ink.Dom.Element like this + * + * @example + * + * var myPanel = InkElement.create('div', { + * appendHTML: '', + * className: 'classes to add', + * insertAfter: anotherPane + * }; + * + * myPanel.innerHTML; // -> '
              + * myPanel.parentNode; // -> anotherPane + */ + create: function(tag, properties) { + var el = document.createElement(tag); + //Ink.extendObj(el, properties); + for(var property in properties) { + if(properties.hasOwnProperty(property)) { + if (property in InkElement) { + InkElement[property](el, properties[property]); + } else { + if(property === 'className' || property === 'class') { + el.className = properties.className || properties['class']; + } else { + el.setAttribute(property, properties[property]); + } + } + } + } + return el; + }, + + /** + * Removes a DOM Element from the DOM + * + * @method remove + * @param {DOMElement} elm The element to remove + */ + remove: function(el) { + var parEl; + if (el && (parEl = el.parentNode)) { + parEl.removeChild(el); + } + }, + + /** + * Scrolls the window to an element + * + * @method scrollTo + * @param {DOMElement|String} elm Element where to scroll + */ + scrollTo: function(elm) { + elm = InkElement.get(elm); + if(elm) { + if (elm.scrollIntoView) { + return elm.scrollIntoView(); + } + + var elmOffset = {}, + elmTop = 0, elmLeft = 0; + + do { + elmTop += elm.offsetTop || 0; + elmLeft += elm.offsetLeft || 0; + + elm = elm.offsetParent; + } while(elm); + + elmOffset = {x: elmLeft, y: elmTop}; + + window.scrollTo(elmOffset.x, elmOffset.y); + } + }, + + /** + * Gets the top cumulative offset for an element + * + * Requires Ink.Dom.Browser + * + * @method offsetTop + * @param {DOMElement|String} elm target element + * @return {Number} Offset from the target element to the top of the document + */ + offsetTop: function(elm) { + return InkElement.offset(elm)[1]; + }, + + /** + * Gets the left cumulative offset for an element + * + * Requires Ink.Dom.Browser + * + * @method offsetLeft + * @param {DOMElement|String} elm target element + * @return {Number} Offset from the target element to the left of the document + */ + offsetLeft: function(elm) { + return InkElement.offset(elm)[0]; + }, + + /** + * Gets the element offset relative to its closest positioned ancestor + * + * @method positionedOffset + * @param {DOMElement|String} elm target element + * @return {Array} Array with the element offsetleft and offsettop relative to the closest positioned ancestor + */ + positionedOffset: function(element) { + var valueTop = 0, valueLeft = 0; + element = InkElement.get(element); + do { + valueTop += element.offsetTop || 0; + valueLeft += element.offsetLeft || 0; + element = element.offsetParent; + if (element) { + if (element.tagName.toLowerCase() === 'body') { break; } + + var value = element.style.position; + if (!value && element.currentStyle) { + value = element.currentStyle.position; + } + if ((!value || value === 'auto') && typeof getComputedStyle !== 'undefined') { + var css = getComputedStyle(element, null); + value = css ? css.position : null; + } + if (value === 'relative' || value === 'absolute') { break; } + } + } while (element); + return [valueLeft, valueTop]; + }, + + /** + * Gets the cumulative offset for an element + * + * Returns the top left position of the element on the page + * + * Requires Ink.Dom.Browser + * + * @method offset + * @param {DOMElement|String} elm Target element + * @return {[Number, Number]} Array with pixel distance from the target element to the top left corner of the document + */ + offset: function(el) { + /*jshint boss:true */ + el = Ink.i(el); + var res = [0, 0]; + var doc = el.ownerDocument, + docElem = doc.documentElement, + box = rect(el), + body = doc.body, + clientTop = docElem.clientTop || body.clientTop || 0, + clientLeft = docElem.clientLeft || body.clientLeft || 0, + scrollTop = doc.pageYOffset || docElem.scrollTop || body.scrollTop, + scrollLeft = doc.pageXOffset || docElem.scrollLeft || body.scrollLeft, + top = box.top + scrollTop - clientTop, + left = box.left + scrollLeft - clientLeft; + res = [left, top]; + return res; + }, + + /** + * Gets the scroll of the element + * + * @method scroll + * @param {DOMElement|String} [elm] target element or document.body + * @returns {Array} offset values for x and y scroll + */ + scroll: function(elm) { + elm = elm ? Ink.i(elm) : document.body; + return [ + ( ( !window.pageXOffset ) ? elm.scrollLeft : window.pageXOffset ), + ( ( !window.pageYOffset ) ? elm.scrollTop : window.pageYOffset ) + ]; + }, + + _getPropPx: function(cs, prop) { + var n, c; + var val = cs.getPropertyValue ? cs.getPropertyValue(prop) : cs[prop]; + if (!val) { n = 0; } + else { + c = val.indexOf('px'); + if (c === -1) { n = 0; } + else { + n = parseFloat(val, 10); + } + } + + //console.log([prop, ' "', val, '" ', n].join('')); + + return n; + }, + + /** + * Alias for offset() + * + * @method offset2 + * @deprecated Kept for historic reasons. Use offset() instead. + */ + offset2: function(el) { + return InkElement.offset(el); + }, + + /** + * Verifies the existence of an attribute + * + * @method hasAttribute + * @param {Object} elm target element + * @param {String} attr attribute name + * @return {Boolean} Boolean based on existance of attribute + */ + hasAttribute: function(elm, attr){ + return elm.hasAttribute ? elm.hasAttribute(attr) : !!elm.getAttribute(attr); + }, + /** + * Inserts a element immediately after a target element + * + * @method insertAfter + * @param {DOMElement} newElm element to be inserted + * @param {DOMElement|String} targetElm key element + */ + insertAfter: function(newElm, targetElm) { + /*jshint boss:true */ + if (targetElm = InkElement.get(targetElm)) { + if (targetElm.nextSibling !== null) { + targetElm.parentNode.insertBefore(newElm, targetElm.nextSibling); + } else { + targetElm.parentNode.appendChild(newElm); + } + } + }, + + /** + * Inserts an element before a target element + * + * @method insertBefore + * @param {DOMElement} newElm element to be inserted + * @param {DOMElement|String} targetElm key element + */ + insertBefore: function (newElm, targetElm) { + /*jshint boss:true */ + if ( (targetElm = InkElement.get(targetElm)) ) { + targetElm.parentNode.insertBefore(newElm, targetElm); + } + }, + + /** + * Inserts a element at the top of the childNodes of a target element + * + * @method insertTop + * @param {DOMElement} newElm element to be inserted + * @param {DOMElement|String} targetElm key element + */ + insertTop: function(newElm,targetElm) { + /*jshint boss:true */ + if (targetElm = InkElement.get(targetElm)) { + if (targetElm.firstChild) { + targetElm.insertBefore(newElm, targetElm.firstChild); + } else { + targetElm.appendChild(newElm); + } + } + }, + + /** + * Inserts an element after all the child nodes of another element + * + * @method insertBottom + * @param {DOMElement} newElm element to be inserted + * @param {DOMElement|String} targetElm key element + */ + insertBottom: function(newElm,targetElm) { + /*jshint boss:true */ + targetElm.appendChild(newElm); + }, + + /** + * Retrieves textContent from node + * + * @method innerText + * @param {DOMNode} node from which to retreive text from. Can be any node type. + * @return {String} the text + */ + textContent: function(node){ + node = Ink.i(node); + var text, k, cs, m; + + switch(node && node.nodeType) { + case 9: /*DOCUMENT_NODE*/ + // IE quirks mode does not have documentElement + return InkElement.textContent(node.documentElement || node.body && node.body.parentNode || node.body); + + case 1: /*ELEMENT_NODE*/ + text = node.innerText; + if (typeof text !== 'undefined') { + return text; + } + /* falls through */ + case 11: /*DOCUMENT_FRAGMENT_NODE*/ + text = node.textContent; + if (typeof text !== 'undefined') { + return text; + } + + if (node.firstChild === node.lastChild) { + // Common case: 0 or 1 children + return InkElement.textContent(node.firstChild); + } + + text = []; + cs = node.childNodes; + for (k = 0, m = cs.length; k < m; ++k) { + text.push( InkElement.textContent( cs[k] ) ); + } + return text.join(''); + + case 3: /*TEXT_NODE*/ + case 4: /*CDATA_SECTION_NODE*/ + return node.nodeValue; + } + return ''; + }, + + /** + * Removes all nodes children and adds the text + * + * @method setTextContent + * @param {DOMNode} node node to add the text to. Can be any node type. + * @param {String} text text to be appended to the node. + */ + setTextContent: function(node, text){ + node = Ink.i(node); + switch(node && node.nodeType) + { + case 1: /*ELEMENT_NODE*/ + if ('innerText' in node) { + node.innerText = text; + break; + } + /* falls through */ + case 11: /*DOCUMENT_FRAGMENT_NODE*/ + if ('textContent' in node) { + node.textContent = text; + break; + } + /* falls through */ + case 9: /*DOCUMENT_NODE*/ + while(node.firstChild) { + node.removeChild(node.firstChild); + } + if (text !== '') { + var doc = node.ownerDocument || node; + node.appendChild(doc.createTextNode(text)); + } + break; + + case 3: /*TEXT_NODE*/ + case 4: /*CDATA_SECTION_NODE*/ + node.nodeValue = text; + break; + } + }, + + /** + * Tells if element is a clickable link + * + * @method isLink + * @param {DOMNode} node node to check if it's link + * @return {Boolean} + */ + isLink: function(element){ + var b = element && element.nodeType === 1 && ((/^a|area$/i).test(element.tagName) || + element.hasAttributeNS && element.hasAttributeNS('http://www.w3.org/1999/xlink','href')); + return !!b; + }, + + /** + * Tells if ancestor is ancestor of node + * + * @method isAncestorOf + * @param {DOMNode} ancestor ancestor node + * @param {DOMNode} node descendant node + * @return {Boolean} + */ + isAncestorOf: function(ancestor, node){ + /*jshint boss:true */ + if (!node || !ancestor) { + return false; + } + if (node.compareDocumentPosition) { + return (ancestor.compareDocumentPosition(node) & 0x10) !== 0;/*Node.DOCUMENT_POSITION_CONTAINED_BY*/ + } + while (node = node.parentNode){ + if (node === ancestor){ + return true; + } + } + return false; + }, + + /** + * Tells if descendant is descendant of node + * + * @method descendantOf + * @param {DOMNode} node the ancestor + * @param {DOMNode} descendant the descendant + * @return {Boolean} true if 'descendant' is descendant of 'node' + */ + descendantOf: function(node, descendant){ + return node !== descendant && InkElement.isAncestorOf(node, descendant); + }, + + /** + * Get first child in document order of node type 1 + * @method firstElementChild + * @param {DOMNode} elm parent node + * @return {DOMNode} the element child + */ + firstElementChild: function(elm){ + if(!elm) { + return null; + } + if ('firstElementChild' in elm) { + return elm.firstElementChild; + } + var child = elm.firstChild; + while(child && child.nodeType !== 1) { + child = child.nextSibling; + } + return child; + }, + + /** + * Get last child in document order of node type 1 + * @method lastElementChild + * @param {DOMNode} elm parent node + * @return {DOMNode} the element child + */ + lastElementChild: function(elm){ + if(!elm) { + return null; + } + if ('lastElementChild' in elm) { + return elm.lastElementChild; + } + var child = elm.lastChild; + while(child && child.nodeType !== 1) { + child = child.previousSibling; + } + return child; + }, + + /** + * Get the first element sibling after the node + * + * @method nextElementSibling + * @param {DOMNode} node current node + * @return {DOMNode|Null} the first element sibling after node or null if none is found + */ + nextElementSibling: function(node){ + var sibling = null; + + if(!node){ return sibling; } + + if("nextElementSibling" in node){ + return node.nextElementSibling; + } else { + sibling = node.nextSibling; + + // 1 === Node.ELEMENT_NODE + while(sibling && sibling.nodeType !== 1){ + sibling = sibling.nextSibling; + } + + return sibling; + } + }, + + /** + * Get the first element sibling before the node + * + * @method previousElementSibling + * @param {DOMNode} node current node + * @return {DOMNode|Null} the first element sibling before node or null if none is found + */ + previousElementSibling: function(node){ + var sibling = null; + + if(!node){ return sibling; } + + if("previousElementSibling" in node){ + return node.previousElementSibling; + } else { + sibling = node.previousSibling; + + // 1 === Node.ELEMENT_NODE + while(sibling && sibling.nodeType !== 1){ + sibling = sibling.previousSibling; + } + + return sibling; + } + }, + + /** + * Returns the width of the given element, in pixels + * + * @method elementWidth + * @param {DOMElement|string} element target DOM element or target ID + * @return {Number} the element's width + */ + elementWidth: function(element) { + if(typeof element === "string") { + element = document.getElementById(element); + } + return element.offsetWidth; + }, + + /** + * Returns the height of the given element, in pixels + * + * @method elementHeight + * @param {DOMElement|string} element target DOM element or target ID + * @return {Number} the element's height + */ + elementHeight: function(element) { + if(typeof element === "string") { + element = document.getElementById(element); + } + return element.offsetHeight; + }, + + /** + * Returns the element's left position in pixels + * + * @method elementLeft + * @param {DOMElement|string} element target DOM element or target ID + * @return {Number} element's left position + */ + elementLeft: function(element) { + if(typeof element === "string") { + element = document.getElementById(element); + } + return element.offsetLeft; + }, + + /** + * Returns the element's top position in pixels + * + * @method elementTop + * @param {DOMElement|string} element target DOM element or target ID + * @return {Number} element's top position + */ + elementTop: function(element) { + if(typeof element === "string") { + element = document.getElementById(element); + } + return element.offsetTop; + }, + + /** + * Returns the dimensions of the given element, in pixels + * + * @method elementDimensions + * @param {element} element target element + * @return {Array} array with element's width and height + */ + elementDimensions: function(element) { + element = Ink.i(element); + return [element.offsetWidth, element.offsetHeight]; + }, + + /** + * Returns the outer (width + margin + padding included) dimensions of an element, in pixels. + * + * Requires Ink.Dom.Css + * + * @method outerDimensions + * @param {DOMElement} element Target element + * @return {Array} Array with element width and height. + */ + outerDimensions: function (element) { + var bbox = rect(element); + + var Css = Ink.getModule('Ink.Dom.Css_1'); + var getStyle = Ink.bindMethod(Css, 'getStyle', element); + + return [ + bbox.right - bbox.left + parseFloat(getStyle('marginLeft') || 0) + parseFloat(getStyle('marginRight') || 0), // w + bbox.bottom - bbox.top + parseFloat(getStyle('marginTop') || 0) + parseFloat(getStyle('marginBottom') || 0) // h + ]; + }, + + /** + * Check whether an element is inside the viewport + * + * @method inViewport + * @param {DOMElement} element Element to check + * @param {Boolean} [partial=false] Return `true` even if it is only partially visible. + * @return {Boolean} + */ + inViewport: function (element, partial) { + var dims = rect(Ink.i(element)); + if (partial) { + return dims.bottom > 0 && // from the top + dims.left < InkElement.viewportWidth() && // from the right + dims.top < InkElement.viewportHeight() && // from the bottom + dims.right > 0; // from the left + } else { + return dims.top > 0 && // from the top + dims.right < InkElement.viewportWidth() && // from the right + dims.bottom < InkElement.viewportHeight() && // from the bottom + dims.left > 0; // from the left + } + }, + + /** + * Check whether an element is hidden + * Taken from Mootools Element extras ( https://gist.github.com/cheeaun/73342 ) + * Does not take into account visibility:hidden + * @method isHidden + * @param {DOMElement} element Element to check + * @return {Boolean} + */ + + isHidden: function (element) { + var w = element.offsetWidth, + h = element.offsetHeight, + force = (element.tagName.toLowerCase() === 'tr'); + + var Css = Ink.getModule('Ink.Dom.Css_1'); + + return (w===0 && h===0 && !force) ? true : + (w!==0 && h!==0 && !force) ? false : + Css.getStyle(element, 'display').toLowerCase() === 'none'; + }, + + /** + * Check whether an element is visible + * + * @method isVisible + * @param {DOMElement} element Element to check + * @return {Boolean} + */ + + isVisible: function (element) { + return !this.isHidden(element); + }, + + /** + * Applies the cloneFrom's dimensions to cloneTo + * + * @method clonePosition + * @param {DOMElement} cloneTo element to be position cloned + * @param {DOMElement} cloneFrom element to get the cloned position + * @return {DOMElement} the element with positionClone + */ + clonePosition: function(cloneTo, cloneFrom){ + var pos = InkElement.offset(cloneFrom); + cloneTo.style.left = pos[0]+'px'; + cloneTo.style.top = pos[1]+'px'; + + return cloneTo; + }, + + /** + * Slices off a piece of text at the end of the element and adds the ellipsis + * so all text fits in the element. + * + * @method ellipsizeText + * @param {DOMElement} element which text is to add the ellipsis + * @param {String} [ellipsis='\u2026'] String to append to the chopped text + */ + ellipsizeText: function(element, ellipsis){ + /*jshint boss:true */ + if (element = Ink.i(element)){ + while (element && element.scrollHeight > (element.offsetHeight + 8)) { + element.textContent = element.textContent.replace(/(\s+\S+)\s*$/, ellipsis || '\u2026'); + } + } + }, + + /** + * Searches up the DOM tree for an element fulfilling the boolTest function (returning trueish) + * + * @method findUpwardsHaving + * @param {HtmlElement} element + * @param {Function} boolTest + * @return {HtmlElement|false} the matched element or false if did not match + */ + findUpwardsHaving: function(element, boolTest) { + while (element && element.nodeType === 1) { + if (boolTest(element)) { + return element; + } + element = element.parentNode; + } + return false; + }, + + /** + * Śearches up the DOM tree for an element of specified class name + * + * @method findUpwardsByClass + * @param {HtmlElement} element + * @param {String} className + * @returns {HtmlElement|false} the matched element or false if did not match + */ + findUpwardsByClass: function(element, className) { + var re = new RegExp("(^|\\s)" + className + "(\\s|$)"); + var tst = function(el) { + var cls = el.className; + return cls && re.test(cls); + }; + return InkElement.findUpwardsHaving(element, tst); + }, + + /** + * Śearches up the DOM tree for an element of specified tag + * + * @method findUpwardsByTag + * @param {HtmlElement} element + * @param {String} tag + * @returns {HtmlElement|false} the matched element or false if did not match + */ + findUpwardsByTag: function(element, tag) { + tag = tag.toUpperCase(); + var tst = function(el) { + return el.nodeName && el.nodeName.toUpperCase() === tag; + }; + return InkElement.findUpwardsHaving(element, tst); + }, + + /** + * Śearches up the DOM tree for an element of specified id + * + * @method findUpwardsById + * @param {HtmlElement} element + * @param {String} id + * @returns {HtmlElement|false} the matched element or false if did not match + */ + findUpwardsById: function(element, id) { + var tst = function(el) { + return el.id === id; + }; + return InkElement.findUpwardsHaving(element, tst); + }, + + /** + * Śearches up the DOM tree for an element matching the given selector + * + * @method findUpwardsBySelector + * @param {HtmlElement} element + * @param {String} sel + * @returns {HtmlElement|false} the matched element or false if did not match + */ + findUpwardsBySelector: function(element, sel) { + var Selector = Ink.getModule('Ink.Dom.Selector'); + if (!Selector) { + throw new Error('This method requires Ink.Dom.Selector'); + } + var tst = function(el) { + return Selector.matchesSelector(el, sel); + }; + return InkElement.findUpwardsHaving(element, tst); + }, + + /** + * Returns trimmed text content of descendants + * + * @method getChildrenText + * @param {DOMElement} el element being seeked + * @param {Boolean} [removeIt] whether to remove the found text nodes or not + * @return {String} text found + */ + getChildrenText: function(el, removeIt) { + var node, + j, + part, + nodes = el.childNodes, + jLen = nodes.length, + text = ''; + + if (!el) { + return text; + } + + for (j = 0; j < jLen; ++j) { + node = nodes[j]; + if (!node) { continue; } + if (node.nodeType === 3) { // TEXT NODE + part = InkElement._trimString( String(node.data) ); + if (part.length > 0) { + text += part; + if (removeIt) { el.removeChild(node); } + } + else { el.removeChild(node); } + } + } + + return text; + }, + + /** + * String trim implementation + * Used by getChildrenText + * + * function _trimString + * param {String} text + * return {String} trimmed text + */ + _trimString: function(text) { + return (String.prototype.trim) ? text.trim() : text.replace(/^\s*/, '').replace(/\s*$/, ''); + }, + + /** + * Returns the values of a select element + * + * @method getSelectValues + * @param {DomElement|String} select element + * @return {Array} selected values + */ + getSelectValues: function (select) { + var selectEl = Ink.i(select); + var values = []; + for (var i = 0; i < selectEl.options.length; ++i) { + values.push( selectEl.options[i].value ); + } + return values; + }, + + + /* used by fills */ + _normalizeData: function(data) { + var d, data2 = []; + for (var i = 0, f = data.length; i < f; ++i) { + d = data[i]; + + if (!(d instanceof Array)) { // if not array, wraps primitive twice: val -> [val, val] + d = [d, d]; + } + else if (d.length === 1) { // if 1 element array: [val] -> [val, val] + d.push(d[0]); + } + data2.push(d); + } + return data2; + }, + + + /** + * Fills select element with choices + * + * @method fillSelect + * @param {DomElement|String} container select element which will get filled + * @param {Array} data data which will populate the component + * @param {Boolean} [skipEmpty] true to skip empty option + * @param {String|Number} [defaultValue] primitive value to select at beginning + */ + fillSelect: function(container, data, skipEmpty, defaultValue) { + var containerEl = Ink.i(container); + if (!containerEl) { return; } + + containerEl.innerHTML = ''; + var d, optionEl; + + if (!skipEmpty) { + // add initial empty option + optionEl = document.createElement('option'); + optionEl.setAttribute('value', ''); + containerEl.appendChild(optionEl); + } + + data = InkElement._normalizeData(data); + + for (var i = 0, f = data.length; i < f; ++i) { + d = data[i]; + + optionEl = document.createElement('option'); + optionEl.setAttribute('value', d[0]); + if (d.length > 2) { + optionEl.setAttribute('extra', d[2]); + } + optionEl.appendChild( document.createTextNode(d[1]) ); + + if (d[0] === defaultValue) { + optionEl.setAttribute('selected', 'selected'); + } + + containerEl.appendChild(optionEl); + } + }, + + + /** + * Select element on steroids - allows the creation of new values + * + * @method fillSelect2 + * @param {DomElement|String} ctn select element which will get filled + * @param {Object} opts + * @param {Array} [opts.data] data which will populate the component + * @param {Boolean} [opts.skipEmpty] if true empty option is not created (defaults to false) + * @param {String} [opts.emptyLabel] label to display on empty option + * @param {String} [opts.createLabel] label to display on create option + * @param {String} [opts.optionsGroupLabel] text to display on group surrounding value options + * @param {String} [opts.defaultValue] option to select initially + * @param {Function(selEl, addOptFn)} [opts.onCreate] callback that gets called once user selects the create option + */ + fillSelect2: function(ctn, opts) { + ctn = Ink.i(ctn); + ctn.innerHTML = ''; + + var defs = { + skipEmpty: false, + skipCreate: false, + emptyLabel: 'none', + createLabel: 'create', + optionsGroupLabel: 'groups', + emptyOptionsGroupLabel: 'none exist', + defaultValue: '' + }; + if (!opts) { throw 'param opts is a requirement!'; } + if (!opts.data) { throw 'opts.data is a requirement!'; } + opts = Ink.extendObj(defs, opts); + + var optionEl, d; + + var optGroupValuesEl = document.createElement('optgroup'); + optGroupValuesEl.setAttribute('label', opts.optionsGroupLabel); + + opts.data = InkElement._normalizeData(opts.data); + + if (!opts.skipCreate) { + opts.data.unshift(['$create$', opts.createLabel]); + } + + if (!opts.skipEmpty) { + opts.data.unshift(['', opts.emptyLabel]); + } + + for (var i = 0, f = opts.data.length; i < f; ++i) { + d = opts.data[i]; + + optionEl = document.createElement('option'); + optionEl.setAttribute('value', d[0]); + optionEl.appendChild( document.createTextNode(d[1]) ); + + if (d[0] === opts.defaultValue) { optionEl.setAttribute('selected', 'selected'); } + + if (d[0] === '' || d[0] === '$create$') { + ctn.appendChild(optionEl); + } + else { + optGroupValuesEl.appendChild(optionEl); + } + } + + var lastValIsNotOption = function(data) { + var lastVal = data[data.length-1][0]; + return (lastVal === '' || lastVal === '$create$'); + }; + + if (lastValIsNotOption(opts.data)) { + optionEl = document.createElement('option'); + optionEl.setAttribute('value', '$dummy$'); + optionEl.setAttribute('disabled', 'disabled'); + optionEl.appendChild( document.createTextNode(opts.emptyOptionsGroupLabel) ); + optGroupValuesEl.appendChild(optionEl); + } + + ctn.appendChild(optGroupValuesEl); + + var addOption = function(v, l) { + var optionEl = ctn.options[ctn.options.length - 1]; + if (optionEl.getAttribute('disabled')) { + optionEl.parentNode.removeChild(optionEl); + } + + // create it + optionEl = document.createElement('option'); + optionEl.setAttribute('value', v); + optionEl.appendChild( document.createTextNode(l) ); + optGroupValuesEl.appendChild(optionEl); + + // select it + ctn.options[ctn.options.length - 1].setAttribute('selected', true); + }; + + if (!opts.skipCreate) { + ctn.onchange = function() { + if ((ctn.value === '$create$') && (typeof opts.onCreate === 'function')) { opts.onCreate(ctn, addOption); } + }; + } + }, + + + /** + * Creates set of radio buttons, returns wrapper + * + * @method fillRadios + * @param {DomElement|String} insertAfterEl element which will precede the input elements + * @param {String} name name to give to the form field ([] is added if not as suffix already) + * @param {Array} data data which will populate the component + * @param {Boolean} [skipEmpty] true to skip empty option + * @param {String|Number} [defaultValue] primitive value to select at beginning + * @param {String} [splitEl] name of element to add after each input element (example: 'br') + * @return {DOMElement} wrapper element around radio buttons + */ + fillRadios: function(insertAfterEl, name, data, skipEmpty, defaultValue, splitEl) { + var afterEl = Ink.i(insertAfterEl); + afterEl = afterEl.nextSibling; + while (afterEl && afterEl.nodeType !== 1) { + afterEl = afterEl.nextSibling; + } + var containerEl = document.createElement('span'); + if (afterEl) { + afterEl.parentNode.insertBefore(containerEl, afterEl); + } else { + Ink.i(insertAfterEl).appendChild(containerEl); + } + + data = InkElement._normalizeData(data); + + if (name.substring(name.length - 1) !== ']') { + name += '[]'; + } + + var d, inputEl; + + if (!skipEmpty) { + // add initial empty option + inputEl = document.createElement('input'); + inputEl.setAttribute('type', 'radio'); + inputEl.setAttribute('name', name); + inputEl.setAttribute('value', ''); + containerEl.appendChild(inputEl); + if (splitEl) { containerEl.appendChild( document.createElement(splitEl) ); } + } + + for (var i = 0; i < data.length; ++i) { + d = data[i]; + + inputEl = document.createElement('input'); + inputEl.setAttribute('type', 'radio'); + inputEl.setAttribute('name', name); + inputEl.setAttribute('value', d[0]); + containerEl.appendChild(inputEl); + containerEl.appendChild( document.createTextNode(d[1]) ); + if (splitEl) { containerEl.appendChild( document.createElement(splitEl) ); } + + if (d[0] === defaultValue) { + inputEl.checked = true; + } + } + + return containerEl; + }, + + + /** + * Creates set of checkbox buttons, returns wrapper + * + * @method fillChecks + * @param {DomElement|String} insertAfterEl element which will precede the input elements + * @param {String} name name to give to the form field ([] is added if not as suffix already) + * @param {Array} data data which will populate the component + * @param {Boolean} [skipEmpty] true to skip empty option + * @param {String|Number} [defaultValue] primitive value to select at beginning + * @param {String} [splitEl] name of element to add after each input element (example: 'br') + * @return {DOMElement} wrapper element around checkboxes + */ + fillChecks: function(insertAfterEl, name, data, defaultValue, splitEl) { + var afterEl = Ink.i(insertAfterEl); + afterEl = afterEl.nextSibling; + while (afterEl && afterEl.nodeType !== 1) { + afterEl = afterEl.nextSibling; + } + var containerEl = document.createElement('span'); + if (afterEl) { + afterEl.parentNode.insertBefore(containerEl, afterEl); + } else { + Ink.i(insertAfterEl).appendChild(containerEl); + } + + data = InkElement._normalizeData(data); + + if (name.substring(name.length - 1) !== ']') { + name += '[]'; + } + + var d, inputEl; + + for (var i = 0; i < data.length; ++i) { + d = data[i]; + + inputEl = document.createElement('input'); + inputEl.setAttribute('type', 'checkbox'); + inputEl.setAttribute('name', name); + inputEl.setAttribute('value', d[0]); + containerEl.appendChild(inputEl); + containerEl.appendChild( document.createTextNode(d[1]) ); + if (splitEl) { containerEl.appendChild( document.createElement(splitEl) ); } + + if (d[0] === defaultValue) { + inputEl.checked = true; + } + } + + return containerEl; + }, + + + /** + * Returns index of element from parent, -1 if not child of parent... + * + * @method parentIndexOf + * @param {DOMElement} parentEl Element to parse + * @param {DOMElement} childEl Child Element to look for + * @return {Number} + */ + parentIndexOf: function(parentEl, childEl) { + var node, idx = 0; + for (var i = 0, f = parentEl.childNodes.length; i < f; ++i) { + node = parentEl.childNodes[i]; + if (node.nodeType === 1) { // ELEMENT + if (node === childEl) { return idx; } + ++idx; + } + } + return -1; + }, + + + /** + * Returns an array of elements - the next siblings + * + * @method nextSiblings + * @param {String|DomElement} elm element + * @return {Array} Array of next sibling elements + */ + nextSiblings: function(elm) { + if(typeof(elm) === "string") { + elm = document.getElementById(elm); + } + if(typeof(elm) === 'object' && elm !== null && elm.nodeType && elm.nodeType === 1) { + var elements = [], + siblings = elm.parentNode.children, + index = InkElement.parentIndexOf(elm.parentNode, elm); + + for(var i = ++index, len = siblings.length; i
              " + deleteThisTbodyToken + "
              "; + } else { + div.innerHTML = "" + html + "
              "; + } + return div.firstChild; + }, + TBODY: function (div, html) { + div.innerHTML = '' + html + '
              '; + return div.firstChild.getElementsByTagName('tbody')[0]; + }, + THEAD: function (div, html) { + div.innerHTML = '' + html + '
              '; + return div.firstChild.getElementsByTagName('thead')[0]; + }, + TFOOT: function (div, html) { + div.innerHTML = '' + html + '
              '; + return div.firstChild.getElementsByTagName('tfoot')[0]; + }, + TR: function (div, html) { + div.innerHTML = '' + html + '
              '; + return div.firstChild.firstChild.firstChild; + } + }, + + /** + * Gets a wrapper DIV with a certain HTML content for being inserted in `elm`. + * Necessary for appendHTML,prependHTML functions, because they need a container element to copy the children from. + * + * Works around IE table quirks + * @method _getWrapper + * @private + * @param elm + * @param html + */ + _getWrapper: function (elm, html) { + var nodeName = elm.nodeName && elm.nodeName.toUpperCase(); + var wrapper = document.createElement('div'); + var wrapFunc = InkElement._wrapElements[nodeName]; + + if ( !wrapFunc ) { + wrapper.innerHTML = html; + return wrapper; + } + // special cases + wrapper = wrapFunc(wrapper, html); + // worst case: tbody auto-creation even when our HTML has a tbody. + if (browserCreatesTbodies && nodeName === 'TABLE') { + // terrible case. Deal with tbody creation too. + var tds = wrapper.getElementsByTagName('td'); + for (var i = 0, len = tds.length; i < len; i++) { + if (tds[i].innerHTML === deleteThisTbodyToken) { + var tbody = tds[i].parentNode.parentNode; + tbody.parentNode.removeChild(tbody); + } + } + } + return wrapper; + }, + + /** + * parses and appends an html string to a container, not destroying its contents + * + * @method appendHTML + * @param {String|DomElement} elm element + * @param {String} html markup string + */ + appendHTML: function(elm, html){ + var wrapper = InkElement._getWrapper(elm, html); + while (wrapper.firstChild) { + elm.appendChild(wrapper.firstChild); + } + }, + + /** + * parses and prepends an html string to a container, not destroying its contents + * + * @method prependHTML + * @param {String|DomElement} elm element + * @param {String} html markup string + */ + prependHTML: function(elm, html){ + var wrapper = InkElement._getWrapper(elm, html); + while (wrapper.lastChild) { + elm.insertBefore(wrapper.lastChild, elm.firstChild); + } + }, + + /** + * sets the Inner HTML of an element to the given HTML string + * + * @method setHTML + * @param {String|DomElement} elm element + * @param {String} html markup string + */ + setHTML: function (elm, html) { + try { + elm.innerHTML = html; + } catch (e) { + // Tables in IE7 + while (elm.firstChild) { + elm.removeChild(elm.firstChild); + } + InkElement.appendHTML(elm, html); + } + }, + + /** + * Wraps an element inside a container. + * + * The container may or may not be in the document yet. + * + * @method wrap + * @param {String|DomElement} target Element to be wrapped + * @param {String|DomElement} container Element to wrap the target + * @return Container element + * + * @example + * before: + * + *
              + * + * call this function to wrap #target with a wrapper div. + * + * InkElement.wrap('target', InkElement.create('div', {id: 'container'}); + * + * after: + * + *
              + */ + wrap: function (target, container) { + target = Ink.i(target); + container = Ink.i(container); + + var nextNode = target.nextSibling; + var parent = target.parentNode; + + container.appendChild(target); + + if (nextNode !== null) { + parent.insertBefore(container, nextNode); + } else { + parent.appendChild(container); + } + + return container; + }, + + /** + * Pulls an element out of its wrapper. + * + * @method unwrap + * @param elem The element you're trying to unwrap. This should be a child of the wrapper. + * @param {String} [wrapperSelector] Use this if you want to find your wrapper (if `elem` is inside several layers of wrappers). + * + * @example + * + * When you have this: + * + *
              + *
              + *
              + * + * If you do this: + * + * InkElement.unwrap('unwrapMe'); + * + * You get this: + * + *
              + *
              + * + **/ + unwrap: function (elem, wrapperSelector) { + elem = Ink.i(elem); + var wrapper; + if (wrapperSelector) { + wrapper = InkElement.findUpwardsBySelector(elem, wrapperSelector); + } else { + wrapper = elem.parentNode; + } + if (!wrapper || !wrapper.parentNode) { return; } + + InkElement.insertBefore(elem, wrapper); + }, + + /** + * Replaces an element with another. + * + * @method replace + * @param element The element to be replaced. + * @param replacement The new element. + * + * @example + * var newelement1 = InkElement.create('div'); + * // ... + * replace(Ink.i('element1'), newelement1); + */ + replace: function (element, replacement) { + InkElement.insertBefore(replacement, element); + InkElement.remove(element); + }, + + /** + * Removes direct children on type text. + * Useful to remove nasty layout gaps generated by whitespace on the markup. + * + * @method removeTextNodeChildren + * @param {DOMElement} el + */ + removeTextNodeChildren: function(el) { + var prevEl, toRemove, parent = el; + el = el.firstChild; + while (el) { + toRemove = (el.nodeType === 3); + prevEl = el; + el = el.nextSibling; + if (toRemove) { + parent.removeChild(prevEl); + } + } + }, + + /** + * Pass an HTML string and receive a documentFragment with the corresponding elements + * @method htmlToFragment + * @param {String} html html string + * @return {DocumentFragment} DocumentFragment containing all of the elements from the html string + */ + htmlToFragment: (createContextualFragmentSupport ? + function(html){ + var range; + + if(typeof html !== 'string'){ return document.createDocumentFragment(); } + + range = document.createRange(); + + // set the context to document.body (firefox does this already, webkit doesn't) + range.selectNode(document.body); + + return range.createContextualFragment(html); + } : function (html) { + var fragment = document.createDocumentFragment(), + tempElement, + current; + + if(typeof html !== 'string'){ return fragment; } + + tempElement = document.createElement('div'); + tempElement.innerHTML = html; + + // append child removes elements from the original parent + while( (current = tempElement.firstChild) ){ // intentional assignment + fragment.appendChild(current); + } + + return fragment; + }), + + _camelCase: function(str) + { + return str ? str.replace(/-(\w)/g, function (_, $1){ + return $1.toUpperCase(); + }) : str; + }, + + /** + * Gets all of the data attributes from an element + * + * @method data + * @param {String|DomElement} selector Element or CSS selector + * @return {Object} Object with the data-* properties. If no data-attributes are present, an empty object is returned. + */ + data: function(selector) { + var el; + if (typeof selector !== 'object' && typeof selector !== 'string') { + throw '[Ink.Dom.Element.data] :: Invalid selector defined'; + } + + if (typeof selector === 'object') { + el = selector; + } + else { + var InkDomSelector = Ink.getModule('Ink.Dom.Selector', 1); + if (!InkDomSelector) { + throw "[Ink.Dom.Element.data] :: this method requires Ink.Dom.Selector - v1"; + } + el = InkDomSelector.select(selector); + if (el.length <= 0) { + throw "[Ink.Dom.Element.data] :: Can't find any element with the specified selector"; + } + el = el[0]; + } + + var dataset = {}; + var attrs = el.attributes || []; + + var curAttr, curAttrName, curAttrValue; + if (attrs) { + for (var i = 0, total = attrs.length; i < total; ++i) { + curAttr = attrs[i]; + curAttrName = curAttr.name; + curAttrValue = curAttr.value; + if (curAttrName && curAttrName.indexOf('data-') === 0) { + dataset[InkElement._camelCase(curAttrName.replace('data-', ''))] = curAttrValue; + } + } + } + + return dataset; + }, + + /** + * @method moveCursorTo + * @param {Input|Textarea} el + * @param {Number} t + */ + moveCursorTo: function(el, t) { + if (el.setSelectionRange) { + el.setSelectionRange(t, t); + //el.focus(); + } + else { + var range = el.createTextRange(); + range.collapse(true); + range.moveEnd( 'character', t); + range.moveStart('character', t); + range.select(); + } + }, + + /** + * @method pageWidth + * @return {Number} page width + */ + pageWidth: function() { + var xScroll; + + if (window.innerWidth && window.scrollMaxX) { + xScroll = window.innerWidth + window.scrollMaxX; + } else if (document.body.scrollWidth > document.body.offsetWidth){ + xScroll = document.body.scrollWidth; + } else { + xScroll = document.body.offsetWidth; + } + + var windowWidth; + + if (window.self.innerWidth) { + if(document.documentElement.clientWidth){ + windowWidth = document.documentElement.clientWidth; + } else { + windowWidth = window.self.innerWidth; + } + } else if (document.documentElement && document.documentElement.clientWidth) { + windowWidth = document.documentElement.clientWidth; + } else if (document.body) { + windowWidth = document.body.clientWidth; + } + + if(xScroll < windowWidth){ + return xScroll; + } else { + return windowWidth; + } + }, + + /** + * @method pageHeight + * @return {Number} page height + */ + pageHeight: function() { + var yScroll; + + if (window.innerHeight && window.scrollMaxY) { + yScroll = window.innerHeight + window.scrollMaxY; + } else if (document.body.scrollHeight > document.body.offsetHeight){ + yScroll = document.body.scrollHeight; + } else { + yScroll = document.body.offsetHeight; + } + + var windowHeight; + + if (window.self.innerHeight) { + windowHeight = window.self.innerHeight; + } else if (document.documentElement && document.documentElement.clientHeight) { + windowHeight = document.documentElement.clientHeight; + } else if (document.body) { + windowHeight = document.body.clientHeight; + } + + if(yScroll < windowHeight){ + return windowHeight; + } else { + return yScroll; + } + }, + + /** + * @method viewportWidth + * @return {Number} viewport width in pixels + */ + viewportWidth: function() { + if(typeof window.innerWidth !== "undefined") { + return window.innerWidth; + } + if (document.documentElement && typeof document.documentElement.offsetWidth !== "undefined") { + return document.documentElement.offsetWidth; + } + }, + + /** + * @method viewportHeight + * @return {Number} viewport height + */ + viewportHeight: function() { + if (typeof window.innerHeight !== "undefined") { + return window.innerHeight; + } + if (document.documentElement && typeof document.documentElement.offsetHeight !== "undefined") { + return document.documentElement.offsetHeight; + } + }, + + /** + * @method scrollWidth + * @return {Number} scroll width + */ + scrollWidth: function() { + if (typeof window.self.pageXOffset !== 'undefined') { + return window.self.pageXOffset; + } + if (typeof document.documentElement !== 'undefined' && typeof document.documentElement.scrollLeft !== 'undefined') { + return document.documentElement.scrollLeft; + } + return document.body.scrollLeft; + }, + + /** + * @method scrollHeight + * @return {Number} scroll height + */ + scrollHeight: function() { + if (typeof window.self.pageYOffset !== 'undefined') { + return window.self.pageYOffset; + } + if (typeof document.documentElement !== 'undefined' && typeof document.documentElement.scrollTop !== 'undefined') { + return document.documentElement.scrollTop; + } + return document.body.scrollTop; + } + }; + + return InkElement; + +}); + +/** + * @author inkdev AT sapo.pt + */ + +Ink.createModule('Ink.Dom.Event', 1, [], function() { + /* jshint + asi:true, + strict:false, + laxcomma:true, + eqeqeq:false, + laxbreak:true, + boss:true, + curly:false, + expr:true + */ + + /*! + * Bean - copyright (c) Jacob Thornton 2011-2012 + * https://github.com/fat/bean + * MIT license + */ + var bean = (function (name, context, definition) { + return definition() + })('bean', this, function (name, context) { + name = name || 'bean' + context = context || this + + var win = window + , old = context[name] + , namespaceRegex = /[^\.]*(?=\..*)\.|.*/ + , nameRegex = /\..*/ + , addEvent = 'addEventListener' + , removeEvent = 'removeEventListener' + , doc = document || {} + , root = doc.documentElement || {} + , W3C_MODEL = root[addEvent] + , eventSupport = W3C_MODEL ? addEvent : 'attachEvent' + , ONE = {} // singleton for quick matching making add() do one() + + , slice = Array.prototype.slice + , str2arr = function (s, d) { return s.split(d || ' ') } + , isString = function (o) { return typeof o == 'string' } + , isFunction = function (o) { return typeof o == 'function' } + + // events that we consider to be 'native', anything not in this list will + // be treated as a custom event + , standardNativeEvents = + 'click dblclick mouseup mousedown contextmenu ' + // mouse buttons + 'mousewheel mousemultiwheel DOMMouseScroll ' + // mouse wheel + 'mouseover mouseout mousemove selectstart selectend ' + // mouse movement + 'keydown keypress keyup ' + // keyboard + 'orientationchange ' + // mobile + 'focus blur change reset select submit ' + // form elements + 'load unload beforeunload resize move DOMContentLoaded ' + // window + 'readystatechange message ' + // window + 'error abort scroll ' // misc + // element.fireEvent('onXYZ'... is not forgiving if we try to fire an event + // that doesn't actually exist, so make sure we only do these on newer browsers + , w3cNativeEvents = + 'show ' + // mouse buttons + 'input invalid ' + // form elements + 'touchstart touchmove touchend touchcancel ' + // touch + 'gesturestart gesturechange gestureend ' + // gesture + 'textinput' + // TextEvent + 'readystatechange pageshow pagehide popstate ' + // window + 'hashchange offline online ' + // window + 'afterprint beforeprint ' + // printing + 'dragstart dragenter dragover dragleave drag drop dragend ' + // dnd + 'loadstart progress suspend emptied stalled loadmetadata ' + // media + 'loadeddata canplay canplaythrough playing waiting seeking ' + // media + 'seeked ended durationchange timeupdate play pause ratechange ' + // media + 'volumechange cuechange ' + // media + 'checking noupdate downloading cached updateready obsolete ' // appcache + + // convert to a hash for quick lookups + , nativeEvents = (function (hash, events, i) { + for (i = 0; i < events.length; i++) events[i] && (hash[events[i]] = 1) + return hash + }({}, str2arr(standardNativeEvents + (W3C_MODEL ? w3cNativeEvents : '')))) + + // custom events are events that we *fake*, they are not provided natively but + // we can use native events to generate them + , customEvents = (function () { + var isAncestor = 'compareDocumentPosition' in root + ? function (element, container) { + return container.compareDocumentPosition && (container.compareDocumentPosition(element) & 16) === 16 + } + : 'contains' in root + ? function (element, container) { + container = container.nodeType === 9 || container === window ? root : container + return container !== element && container.contains(element) + } + : function (element, container) { + while (element = element.parentNode) if (element === container) return 1 + return 0 + } + , check = function (event) { + var related = event.relatedTarget + return !related + ? related == null + : (related !== this && related.prefix !== 'xul' && !/document/.test(this.toString()) + && !isAncestor(related, this)) + } + + return { + mouseenter: { base: 'mouseover', condition: check } + , mouseleave: { base: 'mouseout', condition: check } + , mousewheel: { base: /Firefox/.test(navigator.userAgent) ? 'DOMMouseScroll' : 'mousewheel' } + } + }()) + + // we provide a consistent Event object across browsers by taking the actual DOM + // event object and generating a new one from its properties. + , Event = (function () { + // a whitelist of properties (for different event types) tells us what to check for and copy + var commonProps = str2arr('altKey attrChange attrName bubbles cancelable ctrlKey currentTarget ' + + 'detail eventPhase getModifierState isTrusted metaKey relatedNode relatedTarget shiftKey ' + + 'srcElement target timeStamp type view which propertyName') + , mouseProps = commonProps.concat(str2arr('button buttons clientX clientY dataTransfer ' + + 'fromElement offsetX offsetY pageX pageY screenX screenY toElement')) + , mouseWheelProps = mouseProps.concat(str2arr('wheelDelta wheelDeltaX wheelDeltaY wheelDeltaZ ' + + 'axis')) // 'axis' is FF specific + , keyProps = commonProps.concat(str2arr('char charCode key keyCode keyIdentifier ' + + 'keyLocation location')) + , textProps = commonProps.concat(str2arr('data')) + , touchProps = commonProps.concat(str2arr('touches targetTouches changedTouches scale rotation')) + , messageProps = commonProps.concat(str2arr('data origin source')) + , stateProps = commonProps.concat(str2arr('state')) + , overOutRegex = /over|out/ + // some event types need special handling and some need special properties, do that all here + , typeFixers = [ + { // key events + reg: /key/i + , fix: function (event, newEvent) { + newEvent.keyCode = event.keyCode || event.which + return keyProps + } + } + , { // mouse events + reg: /click|mouse(?!(.*wheel|scroll))|menu|drag|drop/i + , fix: function (event, newEvent, type) { + newEvent.rightClick = event.which === 3 || event.button === 2 + newEvent.pos = { x: 0, y: 0 } + if (event.pageX || event.pageY) { + newEvent.clientX = event.pageX + newEvent.clientY = event.pageY + } else if (event.clientX || event.clientY) { + newEvent.clientX = event.clientX + doc.body.scrollLeft + root.scrollLeft + newEvent.clientY = event.clientY + doc.body.scrollTop + root.scrollTop + } + if (overOutRegex.test(type)) { + newEvent.relatedTarget = event.relatedTarget + || event[(type == 'mouseover' ? 'from' : 'to') + 'Element'] + } + return mouseProps + } + } + , { // mouse wheel events + reg: /mouse.*(wheel|scroll)/i + , fix: function () { return mouseWheelProps } + } + , { // TextEvent + reg: /^text/i + , fix: function () { return textProps } + } + , { // touch and gesture events + reg: /^touch|^gesture/i + , fix: function () { return touchProps } + } + , { // message events + reg: /^message$/i + , fix: function () { return messageProps } + } + , { // popstate events + reg: /^popstate$/i + , fix: function () { return stateProps } + } + , { // everything else + reg: /.*/ + , fix: function () { return commonProps } + } + ] + , typeFixerMap = {} // used to map event types to fixer functions (above), a basic cache mechanism + + , Event = function (event, element, isNative) { + if (!arguments.length) return + event = event || ((element.ownerDocument || element.document || element).parentWindow || win).event + this.originalEvent = event + this.isNative = isNative + this.isBean = true + + if (!event) return + + var type = event.type + , target = event.target || event.srcElement + , i, l, p, props, fixer + + this.target = target && target.nodeType === 3 ? target.parentNode : target + + if (isNative) { // we only need basic augmentation on custom events, the rest expensive & pointless + fixer = typeFixerMap[type] + if (!fixer) { // haven't encountered this event type before, map a fixer function for it + for (i = 0, l = typeFixers.length; i < l; i++) { + if (typeFixers[i].reg.test(type)) { // guaranteed to match at least one, last is .* + typeFixerMap[type] = fixer = typeFixers[i].fix + break + } + } + } + + props = fixer(event, this, type) + for (i = props.length; i--;) { + if (!((p = props[i]) in this) && p in event) this[p] = event[p] + } + } + } + + // preventDefault() and stopPropagation() are a consistent interface to those functions + // on the DOM, stop() is an alias for both of them together + Event.prototype.preventDefault = function () { + if (this.originalEvent.preventDefault) this.originalEvent.preventDefault() + else this.originalEvent.returnValue = false + } + Event.prototype.stopPropagation = function () { + if (this.originalEvent.stopPropagation) this.originalEvent.stopPropagation() + else this.originalEvent.cancelBubble = true + } + Event.prototype.stop = function () { + this.preventDefault() + this.stopPropagation() + this.stopped = true + } + // stopImmediatePropagation() has to be handled internally because we manage the event list for + // each element + // note that originalElement may be a Bean#Event object in some situations + Event.prototype.stopImmediatePropagation = function () { + if (this.originalEvent.stopImmediatePropagation) this.originalEvent.stopImmediatePropagation() + this.isImmediatePropagationStopped = function () { return true } + } + Event.prototype.isImmediatePropagationStopped = function () { + return this.originalEvent.isImmediatePropagationStopped && this.originalEvent.isImmediatePropagationStopped() + } + Event.prototype.clone = function (currentTarget) { + //TODO: this is ripe for optimisation, new events are *expensive* + // improving this will speed up delegated events + var ne = new Event(this, this.element, this.isNative) + ne.currentTarget = currentTarget + return ne + } + + return Event + }()) + + // if we're in old IE we can't do onpropertychange on doc or win so we use doc.documentElement for both + , targetElement = function (element, isNative) { + return !W3C_MODEL && !isNative && (element === doc || element === win) ? root : element + } + + /** + * Bean maintains an internal registry for event listeners. We don't touch elements, objects + * or functions to identify them, instead we store everything in the registry. + * Each event listener has a RegEntry object, we have one 'registry' for the whole instance. + */ + , RegEntry = (function () { + // each handler is wrapped so we can handle delegation and custom events + var wrappedHandler = function (element, fn, condition, args) { + var call = function (event, eargs) { + return fn.apply(element, args ? slice.call(eargs, event ? 0 : 1).concat(args) : eargs) + } + , findTarget = function (event, eventElement) { + return fn.__beanDel ? fn.__beanDel.ft(event.target, element) : eventElement + } + , handler = condition + ? function (event) { + var target = findTarget(event, this) // deleated event + if (condition.apply(target, arguments)) { + if (event) event.currentTarget = target + return call(event, arguments) + } + } + : function (event) { + if (fn.__beanDel) event = event.clone(findTarget(event)) // delegated event, fix the fix + return call(event, arguments) + } + handler.__beanDel = fn.__beanDel + return handler + } + + , RegEntry = function (element, type, handler, original, namespaces, args, root) { + var customType = customEvents[type] + , isNative + + if (type == 'unload') { + // self clean-up + handler = once(removeListener, element, type, handler, original) + } + + if (customType) { + if (customType.condition) { + handler = wrappedHandler(element, handler, customType.condition, args) + } + type = customType.base || type + } + + this.isNative = isNative = nativeEvents[type] && !!element[eventSupport] + this.customType = !W3C_MODEL && !isNative && type + this.element = element + this.type = type + this.original = original + this.namespaces = namespaces + this.eventType = W3C_MODEL || isNative ? type : 'propertychange' + this.target = targetElement(element, isNative) + this[eventSupport] = !!this.target[eventSupport] + this.root = root + this.handler = wrappedHandler(element, handler, null, args) + } + + // given a list of namespaces, is our entry in any of them? + RegEntry.prototype.inNamespaces = function (checkNamespaces) { + var i, j, c = 0 + if (!checkNamespaces) return true + if (!this.namespaces) return false + for (i = checkNamespaces.length; i--;) { + for (j = this.namespaces.length; j--;) { + if (checkNamespaces[i] == this.namespaces[j]) c++ + } + } + return checkNamespaces.length === c + } + + // match by element, original fn (opt), handler fn (opt) + RegEntry.prototype.matches = function (checkElement, checkOriginal, checkHandler) { + return this.element === checkElement && + (!checkOriginal || this.original === checkOriginal) && + (!checkHandler || this.handler === checkHandler) + } + + return RegEntry + }()) + + , registry = (function () { + // our map stores arrays by event type, just because it's better than storing + // everything in a single array. + // uses '$' as a prefix for the keys for safety and 'r' as a special prefix for + // rootListeners so we can look them up fast + var map = {} + + // generic functional search of our registry for matching listeners, + // `fn` returns false to break out of the loop + , forAll = function (element, type, original, handler, root, fn) { + var pfx = root ? 'r' : '$' + if (!type || type == '*') { + // search the whole registry + for (var t in map) { + if (t.charAt(0) == pfx) { + forAll(element, t.substr(1), original, handler, root, fn) + } + } + } else { + var i = 0, l, list = map[pfx + type], all = element == '*' + if (!list) return + for (l = list.length; i < l; i++) { + if ((all || list[i].matches(element, original, handler)) && !fn(list[i], list, i, type)) return + } + } + } + + , has = function (element, type, original, root) { + // we're not using forAll here simply because it's a bit slower and this + // needs to be fast + var i, list = map[(root ? 'r' : '$') + type] + if (list) { + for (i = list.length; i--;) { + if (!list[i].root && list[i].matches(element, original, null)) return true + } + } + return false + } + + , get = function (element, type, original, root) { + var entries = [] + forAll(element, type, original, null, root, function (entry) { + return entries.push(entry) + }) + return entries + } + + , put = function (entry) { + var has = !entry.root && !this.has(entry.element, entry.type, null, false) + , key = (entry.root ? 'r' : '$') + entry.type + ;(map[key] || (map[key] = [])).push(entry) + return has + } + + , del = function (entry) { + forAll(entry.element, entry.type, null, entry.handler, entry.root, function (entry, list, i) { + list.splice(i, 1) + entry.removed = true + if (list.length === 0) delete map[(entry.root ? 'r' : '$') + entry.type] + return false + }) + } + + // dump all entries, used for onunload + , entries = function () { + var t, entries = [] + for (t in map) { + if (t.charAt(0) == '$') entries = entries.concat(map[t]) + } + return entries + } + + return { has: has, get: get, put: put, del: del, entries: entries } + }()) + + // we need a selector engine for delegated events, use querySelectorAll if it exists + // but for older browsers we need Qwery, Sizzle or similar + , selectorEngine + , setSelectorEngine = function (e) { + if (!arguments.length) { + selectorEngine = doc.querySelectorAll + ? function (s, r) { + return r.querySelectorAll(s) + } + : function () { + throw new Error('Bean: No selector engine installed') // eeek + } + } else { + selectorEngine = e + } + } + + // we attach this listener to each DOM event that we need to listen to, only once + // per event type per DOM element + , rootListener = function (event, type) { + if (!W3C_MODEL && type && event && event.propertyName != '_on' + type) return + + var listeners = registry.get(this, type || event.type, null, false) + , l = listeners.length + , i = 0 + + event = new Event(event, this, true) + if (type) event.type = type + + // iterate through all handlers registered for this type, calling them unless they have + // been removed by a previous handler or stopImmediatePropagation() has been called + for (; i < l && !event.isImmediatePropagationStopped(); i++) { + if (!listeners[i].removed) listeners[i].handler.call(this, event) + } + } + + // add and remove listeners to DOM elements + , listener = W3C_MODEL + ? function (element, type, add) { + // new browsers + element[add ? addEvent : removeEvent](type, rootListener, false) + } + : function (element, type, add, custom) { + // IE8 and below, use attachEvent/detachEvent and we have to piggy-back propertychange events + // to simulate event bubbling etc. + var entry + if (add) { + registry.put(entry = new RegEntry( + element + , custom || type + , function (event) { // handler + rootListener.call(element, event, custom) + } + , rootListener + , null + , null + , true // is root + )) + if (custom && element['_on' + custom] == null) element['_on' + custom] = 0 + entry.target.attachEvent('on' + entry.eventType, entry.handler) + } else { + entry = registry.get(element, custom || type, rootListener, true)[0] + if (entry) { + entry.target.detachEvent('on' + entry.eventType, entry.handler) + registry.del(entry) + } + } + } + + , once = function (rm, element, type, fn, originalFn) { + // wrap the handler in a handler that does a remove as well + return function () { + fn.apply(this, arguments) + rm(element, type, originalFn) + } + } + + , removeListener = function (element, orgType, handler, namespaces) { + var type = orgType && orgType.replace(nameRegex, '') + , handlers = registry.get(element, type, null, false) + , removed = {} + , i, l + + for (i = 0, l = handlers.length; i < l; i++) { + if ((!handler || handlers[i].original === handler) && handlers[i].inNamespaces(namespaces)) { + // TODO: this is problematic, we have a registry.get() and registry.del() that + // both do registry searches so we waste cycles doing this. Needs to be rolled into + // a single registry.forAll(fn) that removes while finding, but the catch is that + // we'll be splicing the arrays that we're iterating over. Needs extra tests to + // make sure we don't screw it up. @rvagg + registry.del(handlers[i]) + if (!removed[handlers[i].eventType] && handlers[i][eventSupport]) + removed[handlers[i].eventType] = { t: handlers[i].eventType, c: handlers[i].type } + } + } + // check each type/element for removed listeners and remove the rootListener where it's no longer needed + for (i in removed) { + if (!registry.has(element, removed[i].t, null, false)) { + // last listener of this type, remove the rootListener + listener(element, removed[i].t, false, removed[i].c) + } + } + } + + // set up a delegate helper using the given selector, wrap the handler function + , delegate = function (selector, fn) { + //TODO: findTarget (therefore $) is called twice, once for match and once for + // setting e.currentTarget, fix this so it's only needed once + var findTarget = function (target, root) { + var i, array = isString(selector) ? selectorEngine(selector, root) : selector + for (; target && target !== root; target = target.parentNode) { + for (i = array.length; i--;) { + if (array[i] === target) return target + } + } + } + , handler = function (e) { + var match = findTarget(e.target, this) + if (match) fn.apply(match, arguments) + } + + // __beanDel isn't pleasant but it's a private function, not exposed outside of Bean + handler.__beanDel = { + ft : findTarget // attach it here for customEvents to use too + , selector : selector + } + return handler + } + + , fireListener = W3C_MODEL ? function (isNative, type, element) { + // modern browsers, do a proper dispatchEvent() + var evt = doc.createEvent(isNative ? 'HTMLEvents' : 'UIEvents') + evt[isNative ? 'initEvent' : 'initUIEvent'](type, true, true, win, 1) + element.dispatchEvent(evt) + } : function (isNative, type, element) { + // old browser use onpropertychange, just increment a custom property to trigger the event + element = targetElement(element, isNative) + isNative ? element.fireEvent('on' + type, doc.createEventObject()) : element['_on' + type]++ + } + + /** + * Public API: off(), on(), add(), (remove()), one(), fire(), clone() + */ + + /** + * off(element[, eventType(s)[, handler ]]) + */ + , off = function (element, typeSpec, fn) { + var isTypeStr = isString(typeSpec) + , k, type, namespaces, i + + if (isTypeStr && typeSpec.indexOf(' ') > 0) { + // off(el, 't1 t2 t3', fn) or off(el, 't1 t2 t3') + typeSpec = str2arr(typeSpec) + for (i = typeSpec.length; i--;) + off(element, typeSpec[i], fn) + return element + } + + type = isTypeStr && typeSpec.replace(nameRegex, '') + if (type && customEvents[type]) type = customEvents[type].base + + if (!typeSpec || isTypeStr) { + // off(el) or off(el, t1.ns) or off(el, .ns) or off(el, .ns1.ns2.ns3) + if (namespaces = isTypeStr && typeSpec.replace(namespaceRegex, '')) namespaces = str2arr(namespaces, '.') + removeListener(element, type, fn, namespaces) + } else if (isFunction(typeSpec)) { + // off(el, fn) + removeListener(element, null, typeSpec) + } else { + // off(el, { t1: fn1, t2, fn2 }) + for (k in typeSpec) { + if (typeSpec.hasOwnProperty(k)) off(element, k, typeSpec[k]) + } + } + + return element + } + + /** + * on(element, eventType(s)[, selector], handler[, args ]) + */ + , on = function(element, events, selector, fn) { + var originalFn, type, types, i, args, entry, first + + //TODO: the undefined check means you can't pass an 'args' argument, fix this perhaps? + if (selector === undefined && typeof events == 'object') { + //TODO: this can't handle delegated events + for (type in events) { + if (events.hasOwnProperty(type)) { + on.call(this, element, type, events[type]) + } + } + return + } + + if (!isFunction(selector)) { + // delegated event + originalFn = fn + args = slice.call(arguments, 4) + fn = delegate(selector, originalFn, selectorEngine) + } else { + args = slice.call(arguments, 3) + fn = originalFn = selector + } + + types = str2arr(events) + + // special case for one(), wrap in a self-removing handler + if (this === ONE) { + fn = once(off, element, events, fn, originalFn) + } + + for (i = types.length; i--;) { + // add new handler to the registry and check if it's the first for this element/type + first = registry.put(entry = new RegEntry( + element + , types[i].replace(nameRegex, '') // event type + , fn + , originalFn + , str2arr(types[i].replace(namespaceRegex, ''), '.') // namespaces + , args + , false // not root + )) + if (entry[eventSupport] && first) { + // first event of this type on this element, add root listener + listener(element, entry.eventType, true, entry.customType) + } + } + + return element + } + + /** + * add(element[, selector], eventType(s), handler[, args ]) + * + * Deprecated: kept (for now) for backward-compatibility + */ + , add = function (element, events, fn, delfn) { + return on.apply( + null + , !isString(fn) + ? slice.call(arguments) + : [ element, fn, events, delfn ].concat(arguments.length > 3 ? slice.call(arguments, 5) : []) + ) + } + + /** + * one(element, eventType(s)[, selector], handler[, args ]) + */ + , one = function () { + return on.apply(ONE, arguments) + } + + /** + * fire(element, eventType(s)[, args ]) + * + * The optional 'args' argument must be an array, if no 'args' argument is provided + * then we can use the browser's DOM event system, otherwise we trigger handlers manually + */ + , fire = function (element, type, args) { + var types = str2arr(type) + , i, j, l, names, handlers + + for (i = types.length; i--;) { + type = types[i].replace(nameRegex, '') + if (names = types[i].replace(namespaceRegex, '')) names = str2arr(names, '.') + if (!names && !args && element[eventSupport]) { + fireListener(nativeEvents[type], type, element) + } else { + // non-native event, either because of a namespace, arguments or a non DOM element + // iterate over all listeners and manually 'fire' + handlers = registry.get(element, type, null, false) + args = [false].concat(args) + for (j = 0, l = handlers.length; j < l; j++) { + if (handlers[j].inNamespaces(names)) { + handlers[j].handler.apply(element, args) + } + } + } + } + return element + } + + /** + * clone(dstElement, srcElement[, eventType ]) + * + * TODO: perhaps for consistency we should allow the same flexibility in type specifiers? + */ + , clone = function (element, from, type) { + var handlers = registry.get(from, type, null, false) + , l = handlers.length + , i = 0 + , args, beanDel + + for (; i < l; i++) { + if (handlers[i].original) { + args = [ element, handlers[i].type ] + if (beanDel = handlers[i].handler.__beanDel) args.push(beanDel.selector) + args.push(handlers[i].original) + on.apply(null, args) + } + } + return element + } + + , bean = { + 'on' : on + , 'add' : add + , 'one' : one + , 'off' : off + , 'remove' : off + , 'clone' : clone + , 'fire' : fire + , 'Event' : Event + , 'setSelectorEngine' : setSelectorEngine + , 'noConflict' : function () { + context[name] = old + return this + } + } + + // for IE, clean up on unload to avoid leaks + if (win.attachEvent) { + var cleanup = function () { + var i, entries = registry.entries() + for (i in entries) { + if (entries[i].type && entries[i].type !== 'unload') off(entries[i].element, entries[i].type) + } + win.detachEvent('onunload', cleanup) + win.CollectGarbage && win.CollectGarbage() + } + win.attachEvent('onunload', cleanup) + } + + // initialize selector engine to internal default (qSA or throw Error) + setSelectorEngine(Ink.ss) + + return bean + }); + + /** + * Keep this declaration here and off Bean as it extends the Event + * object and some properties are readonly in strict mode + */ + 'use strict'; + + /** + * Instantiate browser native events array + */ + + /** + * @module Ink.Dom.Event_1 + */ + + /** + * @class Ink.Dom.Event + */ + + var InkEvent = { + + KEY_BACKSPACE: 8, + KEY_TAB: 9, + KEY_RETURN: 13, + KEY_ESC: 27, + KEY_LEFT: 37, + KEY_UP: 38, + KEY_RIGHT: 39, + KEY_DOWN: 40, + KEY_DELETE: 46, + KEY_HOME: 36, + KEY_END: 35, + KEY_PAGEUP: 33, + KEY_PAGEDOWN: 34, + KEY_INSERT: 45, + + /** + * Returns a function which calls `func`, waiting at least `wait` + * milliseconds between calls. This is useful for events such as `scroll` + * or `resize`, which can be triggered too many times per second, slowing + * down the browser with needless function calls. + * + * *note:* This does not delay the first function call to the function. + * + * @method throttle + * @param {Function} func Function to call. Arguments and context are both passed. + * @param {Number} [wait=0] Milliseconds to wait between calls. + * + * @example + * + * Suppose you are observing the `scroll` event, but your application is lagging because `scroll` is triggered too many times. + * + * // BEFORE + * InkEvent.observe(window, 'scroll', function () { + * ... + * }); // When scrolling on mobile devices or on firefox's smooth scroll + * // this is expensive because onscroll is called many times + * + * // AFTER + * InkEvent.observe(window, 'scroll', InkEvent.throttle(function () { + * ... + * }, 100)); // The event handler is called only every 100ms. Problem solved. + * + * @example + * var handler = InkEvent.throttle(function () { + * ... + * }, 100); + * + * InkEvent.observe(window, 'scroll', handler); + * InkEvent.observe(window, 'resize', handler); + * + * // on resize, both the "scroll" and the "resize" events are triggered + * // a LOT of times. This prevents both of them being called a lot of + * // times when the window is being resized by a user. + * + **/ + throttle: function (func, wait) { + wait = wait || 0; + var lastCall = 0; // Warning: This breaks on Jan 1st 1970 0:00 + var timeout; + var throttled = function () { + var now = +new Date(); + var timeDiff = now - lastCall; + if (timeDiff >= wait) { + lastCall = now; + return func.apply(this, [].slice.call(arguments)); + } else { + var that = this; + var args = [].slice.call(arguments); + if (!timeout) { + timeout = setTimeout(function () { + timeout = null; + return throttled.apply(that, args); + }, wait - timeDiff); + } + } + }; + return throttled; + }, + + /** + * Returns the target of the event object + * + * @method element + * @param {Object} ev event object + * @return {Node} The target + */ + element: function(ev) { + var node = ev.delegationTarget || + ev.target || + // IE stuff + (ev.type === 'mouseout' && ev.fromElement) || + (ev.type === 'mouseleave' && ev.fromElement) || + (ev.type === 'mouseover' && ev.toElement) || + (ev.type === 'mouseenter' && ev.toElement) || + ev.srcElement || + null; + return node && (node.nodeType === 3 || node.nodeType === 4) ? node.parentNode : node; + }, + + /** + * Returns the related target of the event object + * + * @method relatedTarget + * @param {Object} ev event object + * @return {Node} The related target + */ + relatedTarget: function(ev){ + var node = ev.relatedTarget || + // IE stuff + (ev.type === 'mouseout' && ev.toElement) || + (ev.type === 'mouseleave' && ev.toElement) || + (ev.type === 'mouseover' && ev.fromElement) || + (ev.type === 'mouseenter' && ev.fromElement) || + null; + return node && (node.nodeType === 3 || node.nodeType === 4) ? node.parentNode : node; + }, + + /** + * Navigate up the DOM tree, looking for a tag with the name `elmTagName`. + * + * If such tag is not found, `document` is returned. + * + * @method findElement + * @param {Object} ev event object + * @param {String} elmTagName tag name to find + * @param {Boolean} [force=false] If this is true, never return `document`, and returns `false` instead. + * @return {DOMElement} the first element which matches given tag name or the document element if the wanted tag is not found + */ + findElement: function(ev, elmTagName, force) + { + var node = this.element(ev); + while(true) { + if(node.nodeName.toLowerCase() === elmTagName.toLowerCase()) { + return node; + } else { + node = node.parentNode; + if(!node) { + if(force) { + return false; + } + return document; + } + if(!node.parentNode){ + if(force){ return false; } + return document; + } + } + } + }, + + /** + * Attaches an event to element + * + * @method observe + * @param {DOMElement|String} element Element id or element + * @param {String} eventName Event name + * @param {Function} callBack Receives event object as a + * parameter. If you're manually firing custom events, check the + * eventName property of the event object to make sure you're handling + * the right event. + * @param {Boolean} [useCapture] Set to true to change event listening from bubbling to capture. + * @return {Function} The event handler used. Hang on to this if you want to `stopObserving` later. + */ + observe: function(element, eventName, callBack, useCapture) { + element = Ink.i(element); + if(element) { + if(element.addEventListener) { + element.addEventListener(eventName, callBack, !!useCapture); + } else { + element.attachEvent('on' + eventName, (callBack = Ink.bind(callBack, element))); + } + return callBack; + } + }, + + /** + * Like observe, but listen to the event only once. + * + * @method observeOnce + * @param {DOMElement|String} element Element id or element + * @param {String} eventName Event name + * @param {Function} callBack Receives event object as a + * parameter. If you're manually firing custom events, check the + * eventName property of the event object to make sure you're handling + * the right event. + * @param {Boolean} [useCapture] Set to true to change event listening from bubbling to capture. + * @return {Function} The event handler used. Hang on to this if you want to `stopObserving` later. + */ + observeOnce: function (element, eventName, callBack, useCapture) { + var onceBack = function () { + InkEvent.stopObserving(element, eventName, onceBack); + return callBack(); + }; + return InkEvent.observe(element, eventName, onceBack, useCapture); + }, + + /** + * Attaches an event to a selector or array of elements. + * + * Requires Ink.Dom.Selector + * + * @method observeMulti + * @param {Array|String} elements + * @param ... See the `observe` function. + * @return {Function} The used callback. + */ + observeMulti: function (elements, eventName, callBack, useCapture) { + if (typeof elements === 'string') { + elements = Ink.ss(elements); + } else if ( /* is an element */ elements && elements.nodeType === 1) { + elements = [elements]; + } + if (!elements[0]) { return false; } + + for (var i = 0, len = elements.length; i < len; i++) { + this.observe(elements[i], eventName, callBack, useCapture); + } + return callBack; + }, + + /** + * Observe an event on the given element and every children which matches the selector string (if provided). + * + * Requires Ink.Dom.Selector if you need to use a selector. + * + * @method observeDelegated + * @param {DOMElement|String} element Element to observe. + * @param {String} eventName Event name to observe. + * @param {String} selector Child element selector. When null, finds any element. + * @param {Function} callback Callback to be called when the event is fired + * @return {Function} The used callback, for ceasing to listen to the event later. + **/ + observeDelegated: function (element, eventName, selector, callback) { + return InkEvent.observe(element, eventName, function (event) { + var fromElement = InkEvent.element(event); + if (!fromElement || fromElement === element) { return; } + + var cursor = fromElement; + + // Go up the document tree until we hit the element itself. + while (cursor !== element && cursor !== document && cursor) { + if (Ink.Dom.Selector_1.matchesSelector(cursor, selector)) { + event.delegationTarget = cursor; + return callback(event); + } + cursor = cursor.parentNode; + } + }); + }, + + /** + * Remove an event attached to an element + * + * @method stopObserving + * @param {DOMElement|String} element element id or element + * @param {String} eventName event name + * @param {Function} callBack callback function + * @param {Boolean} [useCapture] set to true if the event was being observed with useCapture set to true as well. + */ + stopObserving: function(element, eventName, callBack, useCapture) { + element = Ink.i(element); + + if(element) { + if(element.removeEventListener) { + element.removeEventListener(eventName, callBack, !!useCapture); + } else { + element.detachEvent('on' + eventName, callBack); + } + } + }, + + /** + * Stops event propagation and bubbling + * + * @method stop + * @param {Object} event event handle + */ + stop: function(event) + { + if(event.cancelBubble !== null) { + event.cancelBubble = true; + } + if(event.stopPropagation) { + event.stopPropagation(); + } + if(event.preventDefault) { + event.preventDefault(); + } + if(window.attachEvent) { + event.returnValue = false; + } + if(event.cancel !== null) { + event.cancel = true; + } + }, + + /** + * Stops event propagation + * + * @method stopPropagation + * @param {Object} event event handle + */ + stopPropagation: function(event) { + if(event.cancelBubble !== null) { + event.cancelBubble = true; + } + if(event.stopPropagation) { + event.stopPropagation(); + } + }, + + /** + * Stops event default behaviour + * + * @method stopDefault + * @param {Object} event event handle + */ + stopDefault: function(event) + { + if(event.preventDefault) { + event.preventDefault(); + } + if(window.attachEvent) { + event.returnValue = false; + } + if(event.cancel !== null) { + event.cancel = true; + } + }, + + /** + * @method pointer + * @param {Object} ev event object + * @return {Object} an object with the mouse X and Y position + */ + pointer: function(ev) + { + return { + x: this.pointerX(ev), + y: this.pointerY(ev) + }; + }, + + /** + * @method pointerX + * @param {Object} ev event object + * @return {Number} mouse X position + */ + pointerX: function(ev) + { + return (ev.touches && ev.touches[0] && ev.touches[0].pageX) || + (ev.pageX) || + (ev.clientX + (document.documentElement.scrollLeft || document.body.scrollLeft)); + }, + + /** + * @method pointerY + * @param {Object} ev event object + * @return {Number} mouse Y position + */ + pointerY: function(ev) + { + return (ev.touches && ev.touches[0] && ev.touches[0].pageY) || + (ev.pageY) || + (ev.clientY + (document.documentElement.scrollTop || document.body.scrollTop)); + }, + + /** + * @method isLeftClick + * @param {Object} ev event object + * @return {Boolean} True if the event is a left mouse click + */ + isLeftClick: function(ev) { + if (window.addEventListener) { + if(ev.button === 0){ + return true; + } else if(ev.type === 'touchend' && ev.button === null){ + // [todo] do the above check for pointerEvents too + return true; + } + } + else { + if(ev.button === 1){ return true; } + } + return false; + }, + + /** + * @method isRightClick + * @param {Object} ev event object + * @return {Boolean} True if there is a right click on the event + */ + isRightClick: function(ev) { + return (ev.button === 2); + }, + + /** + * @method isMiddleClick + * @param {Object} ev event object + * @return {Boolean} True if there is a middle click on the event + */ + isMiddleClick: function(ev) { + if (window.addEventListener) { + return (ev.button === 1); + } + else { + return (ev.button === 4); + } + return false; + }, + + /** + * Work in Progress. + * Used in SAPO.Component.MaskedInput + * + * @method getCharFromKeyboardEvent + * @param {KeyboardEvent} event keyboard event + * @param {optional Boolean} [changeCasing] if true uppercases, if false lowercases, otherwise keeps casing + * @return {String} character representation of pressed key combination + */ + getCharFromKeyboardEvent: function(event, changeCasing) { + var k = event.keyCode; + var c = String.fromCharCode(k); + + var shiftOn = event.shiftKey; + if (k >= 65 && k <= 90) { // A-Z + if (typeof changeCasing === 'boolean') { + shiftOn = changeCasing; + } + return (shiftOn) ? c : c.toLowerCase(); + } + else if (k >= 96 && k <= 105) { // numpad digits + return String.fromCharCode( 48 + (k-96) ); + } + switch (k) { + case 109: case 189: return '-'; + case 107: case 187: return '+'; + } + return c; + }, + + debug: function(){} +}; + +/** + * bean.on() lets you attach event listeners to both elements and objects. + * http://github.com/fat/bean#on + * + * @method on + * @param {DOMElement|Object} element An HTML DOM element or any JavaScript Object + * @param {String} eventType An Event (or multiple events, space separated) to listen to + * @param {String} [selector] A CSS DOM Element selector string to bind the listener to child elements matching the selector + * @param {Function} [handler] The callback function + * @param {Object} [args...] Additional arguments to pass to the callback function when triggered + * + * @return {DOMElement|Object} Returns the original DOM Element or Javascript Object + */ + +/** + * bean.one() is an alias for bean.on() except that the handler will only be executed once and then removed for the event type(s). + * http://github.com/fat/bean#one + * + * @method one + * @param {DOMElement|Object} element An HTML DOM element or any JavaScript Object + * @param {String} eventType An Event (or multiple events, space separated) to listen to + * @param {String} [selector] A CSS DOM Element selector string to bind the listener to child elements matching the selector + * @param {Function} [handler] The callback function + * @param [args...] Additional arguments to pass to the callback function when triggered + * + * @return {DOMElement|Object} Returns the original DOM Element or Javascript Object + */ + +/** + * bean.off() is how you get rid of handlers once you no longer want them active. It's also a good idea to call off on elements before you remove them from your DOM; this gives Bean a chance to clean up some things and prevents memory leaks. + * http://github.com/fat/bean#off + * + * @method off + * @param {DOMElement|Object} element An HTML DOM element or any JavaScript Object + * @param {String} eventType An Event (or multiple events, space separated) to remove + * @param {Function} [handler] The specific callback function to remove + * + * @return {DOMElement|Object} Returns the original DOM Element or Javascript Object + */ + +/** + * bean.clone() is a method for cloning events from one DOM element or object to another. + * http://github.com/fat/bean#clone + * + * @method clone + * @param {DOMElement|Object} destElement An HTML DOM element or any JavaScript Object to copy events to + * @param {String} srcElement An HTML DOM element or any JavaScript Object to copy events from + * @param {String} [eventType] An Event (or multiple events, space separated) to clone + * + * @return {DOMElement|Object} Returns the original DOM Element or Javascript Object + */ + +/** + * bean.fire() gives you the ability to trigger events. + * http://github.com/fat/bean#fire + * + * @method fire + * @param {DOMElement|Object} destElement An HTML DOM element or any JavaScript Object fire the event on + * @param {String} eventType An Event (or multiple events, space separated) to fire + * @param [args...] Additional arguments to pass to the callback function when triggered + * + * @return {DOMElement|Object} Returns the original DOM Element or Javascript Object + */ + +return Ink.extendObj(InkEvent, bean); + +}); + +/** + * @module Ink.Dom.FormSerialize + * @author inkdev AT sapo.pt + */ + +Ink.createModule('Ink.Dom.FormSerialize', 1, [], function () { + 'use strict'; + /** + * Supports serialization of form data to/from javascript Objects. + * + * Valid applications are ad hoc AJAX/syndicated submission of forms, restoring form values from server side state, etc. + * + * @class Ink.Dom.FormSerialize + * + */ + var FormSerialize = { + + /** + * Serializes a form into an object, turning field names into keys, and field values into values. + * + * note: Multi-select and checkboxes with multiple values will yield arrays + * + * @method serialize + * @return {Object} map of fieldName -> String|String[]|Boolean + * @param {DomElement|String} form form element from which the extraction is to occur + * + * @example + * + * + * + * + * + */ + serialize: function(form) { + form = Ink.i(form); + var map = this._getFieldNameInputsMap(form); + + var map2 = {}; + for (var k in map) if (map.hasOwnProperty(k)) { + if(k !== null) { + var tmpK = k.replace(/\[\]$/, ''); + map2[tmpK] = this._getValuesOfField( map[k] ); + } else { + map2[k] = this._getValuesOfField( map[k] ); + } + } + + delete map2['null']; // this can occur. if so, delete it... + return map2; + }, + + + + + /** + * Sets form elements's values with values given from object + * + * One cannot restore the values of an input with `type="file"` (browser prohibits it) + * + * @method fillIn + * @param {DomElement|String} form form element which is to be populated + * @param {Object} map2 map of fieldName -> String|String[]|Boolean + * @example + *
              + * + * + *
              + * + */ + fillIn: function(form, map2) { + form = Ink.i(form); + var map = this._getFieldNameInputsMap(form); + delete map['null']; // this can occur. if so, delete it... + + for (var k in map2) if (map2.hasOwnProperty(k)) { + this._setValuesOfField( map[k], map2[k] ); + } + }, + + + + _getFieldNameInputsMap: function(formEl) { + var name, nodeName, el, map = {}; + for (var i = 0, f = formEl.elements.length; i < f; ++i) { + el = formEl.elements[i]; + name = el.getAttribute('name'); + nodeName = el.nodeName.toLowerCase(); + if (nodeName === 'fieldset') { + continue; + } else if (map[name] === undefined) { + map[name] = [el]; + } else { + map[name].push(el); + } + } + return map; + }, + + + + _getValuesOfField: function(fieldInputs) { + var nodeName = fieldInputs[0].nodeName.toLowerCase(); + var type = fieldInputs[0].getAttribute('type'); + var value = fieldInputs[0].value; + var i, f, j, o, el, m, res = []; + + switch(nodeName) { + case 'select': + for (i = 0, f = fieldInputs.length; i < f; ++i) { + res[i] = []; + m = fieldInputs[i].getAttribute('multiple'); + for (j = 0, o = fieldInputs[i].options.length; j < o; ++j) { + el = fieldInputs[i].options[j]; + if (el.selected) { + if (m) { + res[i].push(el.value); + } else { + res[i] = el.value; + break; + } + } + } + } + return ((fieldInputs.length > 0 && /\[[^\]]*\]$/.test(fieldInputs[0].getAttribute('name'))) ? res : res[0]); + + case 'textarea': + case 'input': + if (type === 'checkbox' || type === 'radio') { + for (i = 0, f = fieldInputs.length; i < f; ++i) { + el = fieldInputs[i]; + if (el.checked) { + res.push( el.value ); + } + } + if (type === 'checkbox') { + return (fieldInputs.length > 1) ? res : !!(res.length); + } + return (fieldInputs.length > 1) ? res[0] : !!(res.length); // on radios only 1 option is selected at most + } + else { + //if (fieldInputs.length > 1) { throw 'Got multiple input elements with same name!'; } + if(fieldInputs.length > 0 && /\[[^\]]*\]$/.test(fieldInputs[0].getAttribute('name'))) { + var tmpValues = []; + for(i=0, f = fieldInputs.length; i < f; ++i) { + tmpValues.push(fieldInputs[i].value); + } + return tmpValues; + } else { + return value; + } + } + break; // to keep JSHint happy... (reply to this comment by gamboa: - ROTFL) + + default: + //throw 'Unsupported element: "' + nodeName + '"!'; + return undefined; + } + }, + + + + _valInArray: function(val, arr) { + for (var i = 0, f = arr.length; i < f; ++i) { + if (arr[i] === val) { return true; } + } + return false; + }, + + + + _setValuesOfField: function(fieldInputs, fieldValues) { + if (!fieldInputs) { return; } + var nodeName = fieldInputs[0].nodeName.toLowerCase(); + var type = fieldInputs[0].getAttribute('type'); + var i, f, el; + + switch(nodeName) { + case 'select': + if (fieldInputs.length > 1) { throw 'Got multiple select elements with same name!'; } + for (i = 0, f = fieldInputs[0].options.length; i < f; ++i) { + el = fieldInputs[0].options[i]; + el.selected = (fieldValues instanceof Array) ? this._valInArray(el.value, fieldValues) : el.value === fieldValues; + } + break; + case 'textarea': + case 'input': + if (type === 'checkbox' || type === 'radio') { + for (i = 0, f = fieldInputs.length; i < f; ++i) { + el = fieldInputs[i]; + //el.checked = (fieldValues instanceof Array) ? this._valInArray(el.value, fieldValues) : el.value === fieldValues; + el.checked = (fieldValues instanceof Array) ? this._valInArray(el.value, fieldValues) : (fieldInputs.length > 1 ? el.value === fieldValues : !!fieldValues); + } + } + else { + if (fieldInputs.length > 1) { throw 'Got multiple input elements with same name!'; } + if (type !== 'file') { + fieldInputs[0].value = fieldValues; + } + } + break; + + default: + throw 'Unsupported element: "' + nodeName + '"!'; + } + } + }; + + return FormSerialize; +}); + +/** + * @module Ink.Dom.Loaded_1 + * @author inkdev AT sapo.pt + * @version 1 + */ +Ink.createModule('Ink.Dom.Loaded', 1, [], function() { + + 'use strict'; + + /** + * The Loaded class provides a method that allows developers to queue functions to run when + * the page is loaded (document is ready). + * + * @class Ink.Dom.Loaded + * @version 1 + * @static + */ + var Loaded = { + + /** + * Callbacks and their contexts. Array of 2-arrays. + * + * [] + * + * @attribute _contexts Array + * @private + * + */ + _contexts: [], // Callbacks' queue + + /** + * Adds a new function that will be invoked once the document is ready + * + * @method run + * @param {Object} [win=window] Window object to attach/add the event + * @param {Function} fn Callback function to be run after the page is loaded + * @public + * @example + * Ink.requireModules(['Ink.Dom.Loaded_1'], function(Loaded){ + * Loaded.run(function(){ + * console.log('This will run when the page/document is ready/loaded'); + * }); + * }); + */ + run: function(win, fn) { + if (!fn) { + fn = win; + win = window; + } + + var context; + + for (var i = 0, len = this._contexts.length; i < len; i++) { + if (this._contexts[i][0] === win) { + context = this._contexts[i][1]; + break; + } + } + if (!context) { + context = { + cbQueue: [], + win: win, + doc: win.document, + root: win.document.documentElement, + done: false, + top: true + }; + context.handlers = { + checkState: Ink.bindEvent(this._checkState, this, context), + poll: Ink.bind(this._poll, this, context) + }; + this._contexts.push( + [win, context] // Javascript Objects cannot map different windows to + // different values. + ); + } + + var ael = context.doc.addEventListener; + context.add = ael ? 'addEventListener' : 'attachEvent'; + context.rem = ael ? 'removeEventListener' : 'detachEvent'; + context.pre = ael ? '' : 'on'; + context.det = ael ? 'DOMContentLoaded' : 'onreadystatechange'; + context.wet = context.pre + 'load'; + + var csf = context.handlers.checkState; + var alreadyLoaded = ( + context.doc.readyState === 'complete' && + context.win.location.toString() !== 'about:blank'); // https://code.google.com/p/chromium/issues/detail?id=32357 + + if (alreadyLoaded){ + setTimeout(Ink.bind(function () { + fn.call(context.win, 'lazy'); + }, this), 0); + } else { + context.cbQueue.push(fn); + + context.doc[context.add]( context.det , csf ); + context.win[context.add]( context.wet , csf ); + + var frameElement = 1; + try{ + frameElement = context.win.frameElement; + } catch(e) {} + if ( !ael && context.root && context.root.doScroll ) { // IE HACK + try { + context.top = !frameElement; + } catch(e) { } + if (context.top) { + this._poll(context); + } + } + } + }, + + /** + * Function that will be running the callbacks after the page is loaded + * + * @method _checkState + * @param {Event} event Triggered event + * @private + */ + _checkState: function(event, context) { + if ( !event || (event.type === 'readystatechange' && context.doc.readyState !== 'complete')) { + return; + } + var where = (event.type === 'load') ? context.win : context.doc; + where[context.rem](context.pre+event.type, context.handlers.checkState, false); + this._ready(context); + }, + + /** + * Polls the load progress of the page to see if it has already loaded or not + * + * @method _poll + * @private + */ + + /** + * + * function _poll + */ + _poll: function(context) { + try { + context.root.doScroll('left'); + } catch(e) { + return setTimeout(context.handlers.poll, 50); + } + this._ready(context); + }, + + /** + * Function that runs the callbacks from the queue when the document is ready. + * + * @method _ready + * @private + */ + _ready: function(context) { + if (!context.done) { + context.done = true; + for (var i = 0; i < context.cbQueue.length; ++i) { + context.cbQueue[i].call(context.win); + } + context.cbQueue = []; + } + } + }; + + return Loaded; + +}); + +/** + * @module Ink.Dom.Selector_1 + * @author inkdev AT sapo.pt + * @version 1 + */ +Ink.createModule('Ink.Dom.Selector', 1, [], function() { + /*jshint forin:false, eqnull:true, noempty:false, expr:true, boss:true, maxdepth:false*/ + 'use strict'; + + /** + * @class Ink.Dom.Selector + * @static + * @version 1 + */ + + +/*! + * Sizzle CSS Selector Engine + * Copyright 2013 jQuery Foundation and other contributors + * Released under the MIT license + * http://sizzlejs.com/ + */ + +var i, + cachedruns, + Expr, + getText, + isXML, + compile, + outermostContext, + recompare, + sortInput, + + // Local document vars + setDocument, + document, + docElem, + documentIsHTML, + rbuggyQSA, + rbuggyMatches, + matches, + contains, + + // Instance-specific data + expando = "sizzle" + -(new Date()), + preferredDoc = window.document, + support = {}, + dirruns = 0, + done = 0, + classCache = createCache(), + tokenCache = createCache(), + compilerCache = createCache(), + hasDuplicate = false, + sortOrder = function() { return 0; }, + + // General-purpose constants + strundefined = typeof undefined, + MAX_NEGATIVE = 1 << 31, + + // Array methods + arr = [], + pop = arr.pop, + push_native = arr.push, + push = arr.push, + slice = arr.slice, + // Use a stripped-down indexOf if we can't use a native one + indexOf = arr.indexOf || function( elem ) { + var i = 0, + len = this.length; + for ( ; i < len; i++ ) { + if ( this[i] === elem ) { + return i; + } + } + return -1; + }, + + + // Regular expressions + + // 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 quoted, + // then not containing pseudos/brackets, + // then attribute selectors/non-parenthetical expressions, + // then anything else + // These preferences are here to reduce the number of selectors + // needing tokenize in the PSEUDO preFilter + pseudos = ":(" + characterEncoding + ")(?:\\(((['\"])((?:\\\\.|[^\\\\])*?)\\3|((?:\\\\.|[^\\\\()[\\]]|" + attributes.replace( 3, 8 ) + ")*)|.*)\\)|)", + + // 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 ), + ridentifier = new RegExp( "^" + identifier + "$" ), + + 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 ), + "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace + + "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace + + "*(\\d+)|))" + whitespace + "*\\)|)", "i" ), + // For use in libraries implementing .is() + // We use this for POS matching in `select` + "needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + + whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" ) + }, + + rsibling = /[\x20\t\r\n\f]*[+~]/, + + rnative = /^[^{]+\{\s*\[native code/, + + // Easily-parseable/retrievable ID or TAG or CLASS selectors + rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, + + rinputs = /^(?:input|select|textarea|button)$/i, + rheader = /^h\d$/i, + + rescape = /'|\\/g, + rattributeQuotes = /\=[\x20\t\r\n\f]*([^'"\]]*)[\x20\t\r\n\f]*\]/g, + + // CSS escapes http://www.w3.org/TR/CSS21/syndata.html#escaped-characters + runescape = /\\([\da-fA-F]{1,6}[\x20\t\r\n\f]?|.)/g, + funescape = function( _, escaped ) { + var high = "0x" + escaped - 0x10000; + // NaN means non-codepoint + return high !== high ? + escaped : + // BMP codepoint + high < 0 ? + String.fromCharCode( high + 0x10000 ) : + // Supplemental Plane codepoint (surrogate pair) + String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 ); + }; + +// Optimize for push.apply( _, NodeList ) +try { + push.apply( + (arr = slice.call( preferredDoc.childNodes )), + preferredDoc.childNodes + ); + // Support: Android<4.0 + // Detect silently failing push.apply + arr[ preferredDoc.childNodes.length ].nodeType; +} catch ( e ) { + push = { apply: arr.length ? + + // Leverage slice if possible + function( target, els ) { + push_native.apply( target, slice.call(els) ); + } : + + // Support: IE<9 + // Otherwise append directly + function( target, els ) { + var j = target.length, + i = 0; + // Can't trust NodeList.length + while ( (target[j++] = els[i++]) ) {} + target.length = j - 1; + } + }; +} + +/* + * For feature detection + * @param {Function} fn The function to test for native support + */ +function isNative( fn ) { + return rnative.test( fn + "" ); +} + +/* + * Create key-value caches of limited size + * @returns {Function(string, Object)} Returns the Object data after storing it on itself with + * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength) + * deleting the oldest entry + */ +function createCache() { + var cache, + keys = []; + + return (cache = function( key, value ) { + // Use (key + " ") to avoid collision with native prototype properties (see Issue #157) + if ( keys.push( key += " " ) > Expr.cacheLength ) { + // Only keep the most recent entries + delete cache[ keys.shift() ]; + } + return (cache[ key ] = value); + }); +} + +/* + * Mark a function for special use by Sizzle + * @param {Function} fn The function to mark + */ +function markFunction( fn ) { + fn[ expando ] = true; + return fn; +} + +/* + * Support testing using an element + * @param {Function} fn Passed the created div and expects a boolean result + */ +function assert( fn ) { + var div = document.createElement("div"); + + try { + return !!fn( div ); + } catch (e) { + return false; + } finally { + // release memory in IE + div = null; + } +} + +function Sizzle( selector, context, results, seed ) { + var match, elem, m, nodeType, + // QSA vars + i, groups, old, nid, newContext, newSelector; + + if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) { + setDocument( context ); + } + + context = context || document; + results = results || []; + + if ( !selector || typeof selector !== "string" ) { + return results; + } + + if ( (nodeType = context.nodeType) !== 1 && nodeType !== 9 ) { + return []; + } + + if ( documentIsHTML && !seed ) { + + // Shortcuts + 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, context.getElementsByTagName( selector ) ); + return results; + + // Speed-up: Sizzle(".CLASS") + } else if ( (m = match[3]) && support.getElementsByClassName && context.getElementsByClassName ) { + push.apply( results, context.getElementsByClassName( m ) ); + return results; + } + } + + // QSA path + if ( support.qsa && !rbuggyQSA.test(selector) ) { + old = true; + nid = expando; + newContext = context; + newSelector = 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 ( 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 + toSelector( groups[i] ); + } + newContext = rsibling.test( selector ) && context.parentNode || context; + newSelector = groups.join(","); + } + + if ( newSelector ) { + try { + push.apply( results, + newContext.querySelectorAll( newSelector ) + ); + return results; + } catch(qsaError) { + } finally { + if ( !old ) { + context.removeAttribute("id"); + } + } + } + } + } + + // All others + return select( selector.replace( rtrim, "$1" ), context, results, seed ); +} + +/* + * Detect xml + * @param {Element|Object} elem An element or a document + */ +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; +}; + +/* + * Sets document-related variables once based on the current document + * @param {Element|Object} [doc] An element or document object to use to set the document + * @returns {Object} Returns the current document + */ +setDocument = Sizzle.setDocument = function( node ) { + var doc = node ? node.ownerDocument || node : preferredDoc; + + // If no document and documentElement is available, return + if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) { + return document; + } + + // Set our document + document = doc; + docElem = doc.documentElement; + + // Support tests + documentIsHTML = !isXML( doc ); + + // Check if getElementsByTagName("*") returns only elements + support.getElementsByTagName = assert(function( div ) { + div.appendChild( doc.createComment("") ); + return !div.getElementsByTagName("*").length; + }); + + // Check if attributes should be retrieved by attribute nodes + support.attributes = 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 + support.getElementsByClassName = 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 getElementsByName privileges form controls or returns elements by ID + // If so, assume (for broader support) that getElementById returns elements by name + support.getByName = assert(function( div ) { + // Inject content + div.id = expando + 0; + // Support: Windows 8 Native Apps + // Assigning innerHTML with "name" attributes throws uncatchable exceptions + // http://msdn.microsoft.com/en-us/library/ie/hh465388.aspx + div.appendChild( document.createElement("a") ).setAttribute( "name", expando ); + div.appendChild( document.createElement("i") ).setAttribute( "name", expando ); + docElem.appendChild( div ); + + // Test + var pass = doc.getElementsByName && + // buggy browsers will return fewer than the correct 2 + doc.getElementsByName( expando ).length === 2 + + // buggy browsers will return more than the correct 0 + doc.getElementsByName( expando + 0 ).length; + + // Cleanup + docElem.removeChild( div ); + + return pass; + }); + + // Support: Webkit<537.32 + // Detached nodes confoundingly follow *each other* + support.sortDetached = assert(function( div1 ) { + return div1.compareDocumentPosition && + // Should return 1, but Webkit returns 4 (following) + (div1.compareDocumentPosition( document.createElement("div") ) & 1); + }); + + // IE6/7 return modified attributes + Expr.attrHandle = assert(function( div ) { + div.innerHTML = ""; + return div.firstChild && typeof div.firstChild.getAttribute !== strundefined && + div.firstChild.getAttribute("href") === "#"; + }) ? + {} : + { + "href": function( elem ) { + return elem.getAttribute( "href", 2 ); + }, + "type": function( elem ) { + return elem.getAttribute("type"); + } + }; + + // ID find and filter + if ( support.getByName ) { + Expr.find["ID"] = function( id, context ) { + if ( typeof context.getElementById !== strundefined && documentIsHTML ) { + 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] : []; + } + }; + Expr.filter["ID"] = function( id ) { + var attrId = id.replace( runescape, funescape ); + return function( elem ) { + return elem.getAttribute("id") === attrId; + }; + }; + } else { + Expr.find["ID"] = function( id, context ) { + if ( typeof context.getElementById !== strundefined && documentIsHTML ) { + var m = context.getElementById( id ); + + return m ? + m.id === id || typeof m.getAttributeNode !== strundefined && m.getAttributeNode("id").value === id ? + [m] : + undefined : + []; + } + }; + Expr.filter["ID"] = function( id ) { + var attrId = id.replace( runescape, funescape ); + return function( elem ) { + var node = typeof elem.getAttributeNode !== strundefined && elem.getAttributeNode("id"); + return node && node.value === attrId; + }; + }; + } + + // Tag + Expr.find["TAG"] = support.getElementsByTagName ? + function( tag, context ) { + if ( typeof context.getElementsByTagName !== strundefined ) { + return context.getElementsByTagName( tag ); + } + } : + function( tag, context ) { + var elem, + tmp = [], + i = 0, + results = context.getElementsByTagName( tag ); + + // Filter out possible comments + if ( tag === "*" ) { + while ( (elem = results[i++]) ) { + if ( elem.nodeType === 1 ) { + tmp.push( elem ); + } + } + + return tmp; + } + return results; + }; + + // Name + Expr.find["NAME"] = support.getByName && function( tag, context ) { + if ( typeof context.getElementsByName !== strundefined ) { + return context.getElementsByName( name ); + } + }; + + // Class + Expr.find["CLASS"] = support.getElementsByClassName && function( className, context ) { + if ( typeof context.getElementsByClassName !== strundefined && documentIsHTML ) { + return context.getElementsByClassName( className ); + } + }; + + // QSA and matchesSelector support + + // matchesSelector(:active) reports false when true (IE9/Opera 11.5) + rbuggyMatches = []; + + // qSa(:focus) reports false when true (Chrome 21), + // no need to also add to buggyMatches since matches checks buggyQSA + // A support test would require too much code (would include document ready) + rbuggyQSA = [ ":focus" ]; + + if ( (support.qsa = isNative(doc.querySelectorAll)) ) { + // 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 explicitly + // 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 and will not see later tests + if ( !div.querySelectorAll(":checked").length ) { + rbuggyQSA.push(":checked"); + } + }); + + assert(function( div ) { + + // Opera 10-12/IE8 - ^= $= *= and empty values + // Should not select anything + div.innerHTML = ""; + if ( div.querySelectorAll("[i^='']").length ) { + rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:\"\"|'')" ); + } + + // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled) + // IE8 throws error here and will not see later tests + if ( !div.querySelectorAll(":enabled").length ) { + rbuggyQSA.push( ":enabled", ":disabled" ); + } + + // Opera 10-11 does not throw on post-comma invalid pseudos + div.querySelectorAll("*,:x"); + rbuggyQSA.push(",.*:"); + }); + } + + if ( (support.matchesSelector = isNative( (matches = docElem.matchesSelector || + docElem.mozMatchesSelector || + docElem.webkitMatchesSelector || + docElem.oMatchesSelector || + docElem.msMatchesSelector) )) ) { + + assert(function( div ) { + // Check to see if it's possible to do matchesSelector + // on a disconnected node (IE 9) + support.disconnectedMatch = matches.call( div, "div" ); + + // This should fail with an exception + // Gecko does not error, returns false instead + matches.call( div, "[s!='']:x" ); + rbuggyMatches.push( "!=", pseudos ); + }); + } + + rbuggyQSA = new RegExp( rbuggyQSA.join("|") ); + rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join("|") ); + + // Element contains another + // Purposefully does not implement inclusive descendent + // As in, an element does not contain itself + contains = isNative(docElem.contains) || docElem.compareDocumentPosition ? + 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 ) : + a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16 + )); + } : + function( a, b ) { + if ( b ) { + while ( (b = b.parentNode) ) { + if ( b === a ) { + return true; + } + } + } + return false; + }; + + // Document order sorting + sortOrder = docElem.compareDocumentPosition ? + function( a, b ) { + + // Flag for duplicate removal + if ( a === b ) { + hasDuplicate = true; + return 0; + } + + var compare = b.compareDocumentPosition && a.compareDocumentPosition && a.compareDocumentPosition( b ); + + if ( compare ) { + // Disconnected nodes + if ( compare & 1 || + (recompare && b.compareDocumentPosition( a ) === compare) ) { + + // Choose the first element that is related to our preferred document + if ( a === doc || contains(preferredDoc, a) ) { + return -1; + } + if ( b === doc || contains(preferredDoc, b) ) { + return 1; + } + + // Maintain original order + return sortInput ? + ( indexOf.call( sortInput, a ) - indexOf.call( sortInput, b ) ) : + 0; + } + + return compare & 4 ? -1 : 1; + } + + // Not directly comparable, sort on existence of method + return a.compareDocumentPosition ? -1 : 1; + } : + function( a, b ) { + var cur, + i = 0, + aup = a.parentNode, + bup = b.parentNode, + ap = [ a ], + bp = [ b ]; + + // Exit early if the nodes are identical + if ( a === b ) { + hasDuplicate = true; + return 0; + + // Parentless nodes are either documents or disconnected + } else if ( !aup || !bup ) { + return a === doc ? -1 : + b === doc ? 1 : + aup ? -1 : + bup ? 1 : + 0; + + // If the nodes are siblings, we can do a quick check + } else if ( aup === bup ) { + return siblingCheck( a, b ); + } + + // Otherwise we need full lists of their ancestors for comparison + cur = a; + while ( (cur = cur.parentNode) ) { + ap.unshift( cur ); + } + cur = b; + while ( (cur = cur.parentNode) ) { + bp.unshift( cur ); + } + + // Walk down the tree looking for a discrepancy + while ( ap[i] === bp[i] ) { + i++; + } + + return i ? + // Do a sibling check if the nodes have a common ancestor + siblingCheck( ap[i], bp[i] ) : + + // Otherwise nodes in our document sort first + ap[i] === preferredDoc ? -1 : + bp[i] === preferredDoc ? 1 : + 0; + }; + + return document; +}; + +Sizzle.matches = function( expr, elements ) { + return Sizzle( expr, null, null, elements ); +}; + +Sizzle.matchesSelector = function( elem, expr ) { + // Set document vars if needed + if ( ( elem.ownerDocument || elem ) !== document ) { + setDocument( elem ); + } + + // Make sure that attribute selectors are quoted + expr = expr.replace( rattributeQuotes, "='$1']" ); + + // rbuggyQSA always contains :focus, so no need for an existence check + if ( support.matchesSelector && documentIsHTML && (!rbuggyMatches || !rbuggyMatches.test(expr)) && !rbuggyQSA.test(expr) ) { + try { + var ret = matches.call( elem, expr ); + + // IE 9's matchesSelector returns false on disconnected nodes + if ( ret || support.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, document, null, [elem] ).length > 0; +}; + +Sizzle.contains = function( context, elem ) { + // Set document vars if needed + if ( ( context.ownerDocument || context ) !== document ) { + setDocument( context ); + } + return contains( context, elem ); +}; + +Sizzle.attr = function( elem, name ) { + var val; + + // Set document vars if needed + if ( ( elem.ownerDocument || elem ) !== document ) { + setDocument( elem ); + } + + if ( documentIsHTML ) { + name = name.toLowerCase(); + } + if ( (val = Expr.attrHandle[ name ]) ) { + return val( elem ); + } + if ( !documentIsHTML || support.attributes ) { + return elem.getAttribute( name ); + } + return ( (val = elem.getAttributeNode( name )) || elem.getAttribute( name ) ) && elem[ name ] === true ? + name : + val && val.specified ? val.value : null; +}; + +Sizzle.error = function( msg ) { + throw new Error( "Syntax error, unrecognized expression: " + msg ); +}; + +// Document sorting and removing duplicates +Sizzle.uniqueSort = function( results ) { + var elem, + duplicates = [], + j = 0, + i = 0; + + // Unless we *know* we can detect duplicates, assume their presence + hasDuplicate = !support.detectDuplicates; + // Compensate for sort limitations + recompare = !support.sortDetached; + sortInput = !support.sortStable && results.slice( 0 ); + results.sort( sortOrder ); + + if ( hasDuplicate ) { + while ( (elem = results[i++]) ) { + if ( elem === results[ i ] ) { + j = duplicates.push( i ); + } + } + while ( j-- ) { + results.splice( duplicates[ j ], 1 ); + } + } + + return results; +}; + +/* + * Checks document order of two siblings + * @param {Element} a + * @param {Element} b + * @returns Returns -1 if a precedes b, 1 if a follows b + */ +function siblingCheck( a, b ) { + var cur = b && a, + diff = cur && ( ~b.sourceIndex || MAX_NEGATIVE ) - ( ~a.sourceIndex || MAX_NEGATIVE ); + + // Use IE sourceIndex if available on both nodes + if ( diff ) { + return diff; + } + + // Check if b follows a + if ( cur ) { + while ( (cur = cur.nextSibling) ) { + if ( cur === b ) { + return -1; + } + } + } + + return a ? 1 : -1; +} + +// 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 no nodeType, this is expected to be an array + for ( ; (node = elem[i]); i++ ) { + // Do not traverse comment nodes + ret += getText( node ); + } + } else 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 + + return ret; +}; + +Expr = Sizzle.selectors = { + + // Can be adjusted by the user + cacheLength: 50, + + createPseudo: markFunction, + + match: matchExpr, + + find: {}, + + relative: { + ">": { dir: "parentNode", first: true }, + " ": { dir: "parentNode" }, + "+": { dir: "previousSibling", first: true }, + "~": { dir: "previousSibling" } + }, + + preFilter: { + "ATTR": function( match ) { + match[1] = match[1].replace( runescape, funescape ); + + // Move the given value to match[3] whether quoted or unquoted + match[3] = ( match[4] || match[5] || "" ).replace( runescape, funescape ); + + if ( match[2] === "~=" ) { + match[3] = " " + match[3] + " "; + } + + return match.slice( 0, 4 ); + }, + + "CHILD": function( match ) { + /* matches from matchExpr["CHILD"] + 1 type (only|nth|...) + 2 what (child|of-type) + 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...) + 4 xn-component of xn+y argument ([+-]?\d*n|) + 5 sign of xn-component + 6 x of xn-component + 7 sign of y-component + 8 y of y-component + */ + match[1] = match[1].toLowerCase(); + + if ( match[1].slice( 0, 3 ) === "nth" ) { + // nth-* requires argument + if ( !match[3] ) { + Sizzle.error( match[0] ); + } + + // numeric x and y parameters for Expr.filter.CHILD + // remember that false/true cast respectively to 0/1 + match[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === "even" || match[3] === "odd" ) ); + match[5] = +( ( match[7] + match[8] ) || match[3] === "odd" ); + + // other types prohibit arguments + } else if ( match[3] ) { + Sizzle.error( match[0] ); + } + + return match; + }, + + "PSEUDO": function( match ) { + var excess, + unquoted = !match[5] && match[2]; + + if ( matchExpr["CHILD"].test( match[0] ) ) { + return null; + } + + // Accept quoted arguments as-is + if ( match[4] ) { + match[2] = match[4]; + + // Strip excess characters from unquoted arguments + } else if ( unquoted && 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 + match[0] = match[0].slice( 0, excess ); + match[2] = unquoted.slice( 0, excess ); + } + + // Return only captures needed by the pseudo filter method (type and argument) + return match.slice( 0, 3 ); + } + }, + + filter: { + + "TAG": function( nodeName ) { + if ( nodeName === "*" ) { + return function() { return true; }; + } + + nodeName = nodeName.replace( runescape, funescape ).toLowerCase(); + return function( elem ) { + return elem.nodeName && elem.nodeName.toLowerCase() === nodeName; + }; + }, + + "CLASS": function( className ) { + var pattern = classCache[ className + " " ]; + + return pattern || + (pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) && + classCache( className, function( elem ) { + return pattern.test( elem.className || (typeof elem.getAttribute !== strundefined && elem.getAttribute("class")) || "" ); + }); + }, + + "ATTR": function( name, operator, check ) { + return function( elem ) { + 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.slice( -check.length ) === check : + operator === "~=" ? ( " " + result + " " ).indexOf( check ) > -1 : + operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" : + false; + }; + }, + + "CHILD": function( type, what, argument, first, last ) { + var simple = type.slice( 0, 3 ) !== "nth", + forward = type.slice( -4 ) !== "last", + ofType = what === "of-type"; + + return first === 1 && last === 0 ? + + // Shortcut for :nth-*(n) + function( elem ) { + return !!elem.parentNode; + } : + + function( elem, context, xml ) { + var cache, outerCache, node, diff, nodeIndex, start, + dir = simple !== forward ? "nextSibling" : "previousSibling", + parent = elem.parentNode, + name = ofType && elem.nodeName.toLowerCase(), + useCache = !xml && !ofType; + + if ( parent ) { + + // :(first|last|only)-(child|of-type) + if ( simple ) { + while ( dir ) { + node = elem; + while ( (node = node[ dir ]) ) { + if ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) { + return false; + } + } + // Reverse direction for :only-* (if we haven't yet done so) + start = dir = type === "only" && !start && "nextSibling"; + } + return true; + } + + start = [ forward ? parent.firstChild : parent.lastChild ]; + + // non-xml :nth-child(...) stores cache data on `parent` + if ( forward && useCache ) { + // Seek `elem` from a previously-cached index + outerCache = parent[ expando ] || (parent[ expando ] = {}); + cache = outerCache[ type ] || []; + nodeIndex = cache[0] === dirruns && cache[1]; + diff = cache[0] === dirruns && cache[2]; + node = nodeIndex && parent.childNodes[ nodeIndex ]; + + while ( (node = ++nodeIndex && node && node[ dir ] || + + // Fallback to seeking `elem` from the start + (diff = nodeIndex = 0) || start.pop()) ) { + + // When found, cache indexes on `parent` and break + if ( node.nodeType === 1 && ++diff && node === elem ) { + outerCache[ type ] = [ dirruns, nodeIndex, diff ]; + break; + } + } + + // Use previously-cached element index if available + } else if ( useCache && (cache = (elem[ expando ] || (elem[ expando ] = {}))[ type ]) && cache[0] === dirruns ) { + diff = cache[1]; + + // xml :nth-child(...) or :nth-last-child(...) or :nth(-last)?-of-type(...) + } else { + // Use the same loop as above to seek `elem` from the start + while ( (node = ++nodeIndex && node && node[ dir ] || + (diff = nodeIndex = 0) || start.pop()) ) { + + if ( ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) && ++diff ) { + // Cache the index of each encountered element + if ( useCache ) { + (node[ expando ] || (node[ expando ] = {}))[ type ] = [ dirruns, diff ]; + } + + if ( node === elem ) { + break; + } + } + } + } + + // Incorporate the offset, then check against cycle size + diff -= last; + return diff === first || ( diff % first === 0 && diff / first >= 0 ); + } + }; + }, + + "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: { + // Potentially complex 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; + }; + }), + + // "Whether an element is represented by a :lang() selector + // is based solely on the element's language value + // being equal to the identifier C, + // or beginning with the identifier C immediately followed by "-". + // The matching of C against the element's language value is performed case-insensitively. + // The identifier C does not have to be a valid language name." + // http://www.w3.org/TR/selectors/#lang-pseudo + "lang": markFunction( function( lang ) { + // lang value must be a valid identifier + if ( !ridentifier.test(lang || "") ) { + Sizzle.error( "unsupported lang: " + lang ); + } + lang = lang.replace( runescape, funescape ).toLowerCase(); + return function( elem ) { + var elemLang; + do { + if ( (elemLang = documentIsHTML ? + elem.lang : + elem.getAttribute("xml:lang") || elem.getAttribute("lang")) ) { + + elemLang = elemLang.toLowerCase(); + return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0; + } + } while ( (elem = elem.parentNode) && elem.nodeType === 1 ); + return false; + }; + }), + + // Miscellaneous + "target": function( elem ) { + var hash = window.location && window.location.hash; + return hash && hash.slice( 1 ) === elem.id; + }, + + "root": function( elem ) { + return elem === docElem; + }, + + "focus": function( elem ) { + return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex); + }, + + // Boolean properties + "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; + }, + + // Contents + "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 "?") + for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { + if ( elem.nodeName > "@" || elem.nodeType === 3 || elem.nodeType === 4 ) { + return false; + } + } + return true; + }, + + "parent": function( elem ) { + return !Expr.pseudos["empty"]( elem ); + }, + + // Element/input types + "header": function( elem ) { + return rheader.test( elem.nodeName ); + }, + + "input": function( elem ) { + return rinputs.test( elem.nodeName ); + }, + + "button": function( elem ) { + var name = elem.nodeName.toLowerCase(); + return name === "input" && elem.type === "button" || name === "button"; + }, + + "text": function( elem ) { + var 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" && + elem.type === "text" && + ( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === elem.type ); + }, + + // Position-in-collection + "first": createPositionalPseudo(function() { + return [ 0 ]; + }), + + "last": createPositionalPseudo(function( matchIndexes, length ) { + return [ length - 1 ]; + }), + + "eq": createPositionalPseudo(function( matchIndexes, length, argument ) { + return [ argument < 0 ? argument + length : argument ]; + }), + + "even": createPositionalPseudo(function( matchIndexes, length ) { + var i = 0; + for ( ; i < length; i += 2 ) { + matchIndexes.push( i ); + } + return matchIndexes; + }), + + "odd": createPositionalPseudo(function( matchIndexes, length ) { + var i = 1; + for ( ; i < length; i += 2 ) { + matchIndexes.push( i ); + } + return matchIndexes; + }), + + "lt": createPositionalPseudo(function( matchIndexes, length, argument ) { + var i = argument < 0 ? argument + length : argument; + for ( ; --i >= 0; ) { + matchIndexes.push( i ); + } + return matchIndexes; + }), + + "gt": createPositionalPseudo(function( matchIndexes, length, argument ) { + var i = argument < 0 ? argument + length : argument; + for ( ; ++i < length; ) { + matchIndexes.push( i ); + } + return matchIndexes; + }) + } +}; + +// Add button/input type pseudos +for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) { + Expr.pseudos[ i ] = createInputPseudo( i ); +} +for ( i in { submit: true, reset: true } ) { + Expr.pseudos[ i ] = createButtonPseudo( i ); +} + +function tokenize( selector, parseOnly ) { + var matched, match, tokens, type, + soFar, groups, preFilters, + cached = tokenCache[ 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 ) { + // Don't consume trailing commas as valid + soFar = soFar.slice( match[0].length ) || soFar; + } + groups.push( tokens = [] ); + } + + matched = false; + + // Combinators + if ( (match = rcombinators.exec( soFar )) ) { + matched = match.shift(); + tokens.push( { + value: matched, + // Cast descendant combinators to space + type: match[0].replace( rtrim, " " ) + } ); + soFar = soFar.slice( matched.length ); + } + + // Filters + for ( type in Expr.filter ) { + if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] || + (match = preFilters[ type ]( match ))) ) { + matched = match.shift(); + tokens.push( { + value: matched, + type: type, + matches: match + } ); + soFar = soFar.slice( matched.length ); + } + } + + 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 toSelector( tokens ) { + var i = 0, + len = tokens.length, + selector = ""; + for ( ; i < len; i++ ) { + selector += tokens[i].value; + } + return selector; +} + +function addCombinator( matcher, combinator, base ) { + var dir = combinator.dir, + checkNonElements = base && dir === "parentNode", + doneName = done++; + + return combinator.first ? + // Check against closest ancestor/preceding element + function( elem, context, xml ) { + while ( (elem = elem[ dir ]) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + return matcher( elem, context, xml ); + } + } + } : + + // Check against all ancestor/preceding elements + function( elem, context, xml ) { + var data, cache, outerCache, + dirkey = dirruns + " " + doneName; + + // We can't set arbitrary data on XML nodes, so they don't benefit from dir caching + if ( xml ) { + while ( (elem = elem[ dir ]) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + if ( matcher( elem, context, xml ) ) { + return true; + } + } + } + } else { + while ( (elem = elem[ dir ]) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + outerCache = elem[ expando ] || (elem[ expando ] = {}); + if ( (cache = outerCache[ dir ]) && cache[0] === dirkey ) { + if ( (data = cache[1]) === true || data === cachedruns ) { + return data === true; + } + } else { + cache = outerCache[ dir ] = [ dirkey ]; + cache[1] = matcher( elem, context, xml ) || cachedruns; + if ( cache[1] === true ) { + return true; + } + } + } + } + } + }; +} + +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 ) { + var temp, i, elem, + preMap = [], + postMap = [], + preexisting = results.length, + + // Get initial elements from seed or context + elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ), + + // 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 ) { + temp = condense( matcherOut, postMap ); + postFilter( temp, [], context, xml ); + + // Un-match failing elements by moving them back to matcherIn + i = temp.length; + while ( i-- ) { + if ( (elem = temp[i]) ) { + matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem); + } + } + } + + if ( seed ) { + if ( postFinder || preFilter ) { + if ( postFinder ) { + // Get the final matcherOut by condensing this intermediate into postFinder contexts + temp = []; + i = matcherOut.length; + while ( i-- ) { + if ( (elem = matcherOut[i]) ) { + // Restore matcherIn since elem is not yet a final match + temp.push( (matcherIn[i] = elem) ); + } + } + postFinder( null, (matcherOut = []), temp, xml ); + } + + // Move matched elements from seed to results to keep them synchronized + i = matcherOut.length; + while ( i-- ) { + if ( (elem = matcherOut[i]) && + (temp = postFinder ? indexOf.call( seed, elem ) : preMap[i]) > -1 ) { + + seed[temp] = !(results[temp] = elem); + } + } + } + + // Add elements to results, through postFinder if defined + } 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 { + 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 && toSelector( tokens.slice( 0, i - 1 ) ).replace( rtrim, "$1" ), + matcher, + i < j && matcherFromTokens( tokens.slice( i, j ) ), + j < len && matcherFromTokens( (tokens = tokens.slice( j )) ), + j < len && toSelector( tokens ) + ); + } + matchers.push( matcher ); + } + } + + return elementMatcher( matchers ); +} + +function matcherFromGroupMatchers( elementMatchers, setMatchers ) { + // A counter to specify which element is currently being matched + var matcherCachedRuns = 0, + 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 ), + // Use integer dirruns iff this is the outermost matcher + dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1); + + if ( outermost ) { + outermostContext = context !== document && context; + cachedruns = matcherCachedRuns; + } + + // Add elements passing elementMatchers directly to results + // Keep `i` a string if there are no elements so `matchedCount` will be "00" below + for ( ; (elem = elems[i]) != null; i++ ) { + if ( byElement && elem ) { + j = 0; + while ( (matcher = elementMatchers[j++]) ) { + if ( matcher( elem, context, xml ) ) { + results.push( elem ); + break; + } + } + if ( outermost ) { + dirruns = dirrunsUnique; + cachedruns = ++matcherCachedRuns; + } + } + + // 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 ) { + j = 0; + while ( (matcher = setMatchers[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; + }; + + return bySet ? + markFunction( superMatcher ) : + superMatcher; +} + +compile = Sizzle.compile = function( selector, group /* Internal Use Only */ ) { + var i, + setMatchers = [], + elementMatchers = [], + cached = compilerCache[ 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 ) { + var i = 0, + len = contexts.length; + for ( ; i < len; i++ ) { + Sizzle( selector, contexts[i], results ); + } + return results; +} + +function select( selector, context, results, seed ) { + var i, tokens, token, type, find, + match = tokenize( selector ); + + 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 && documentIsHTML && + Expr.relative[ tokens[1].type ] ) { + + context = ( Expr.find["ID"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0]; + if ( !context ) { + return results; + } + + selector = selector.slice( tokens.shift().value.length ); + } + + // Fetch a seed set for right-to-left matching + i = matchExpr["needsContext"].test( selector ) ? 0 : tokens.length; + while ( 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( runescape, funescape ), + rsibling.test( tokens[0].type ) && context.parentNode || context + )) ) { + + // If seed is empty or no tokens remain, we can return early + tokens.splice( i, 1 ); + selector = seed.length && toSelector( tokens ); + if ( !selector ) { + push.apply( results, seed ); + 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, + !documentIsHTML, + results, + rsibling.test( selector ) + ); + return results; +} + +// Deprecated +Expr.pseudos["nth"] = Expr.pseudos["eq"]; + +// Easy API for creating new setFilters +function setFilters() {} +setFilters.prototype = Expr.filters = Expr.pseudos; +Expr.setFilters = new setFilters(); + +// Check sort stability +support.sortStable = expando.split("").sort( sortOrder ).join("") === expando; + +// Initialize with the default document +setDocument(); + +// Always assume the presence of duplicates if sort doesn't +// pass them to our comparison function (as in Google Chrome). +[0, 0].sort( sortOrder ); +support.detectDuplicates = hasDuplicate; + +// EXPOSE +/*if ( typeof define === "function" && define.amd ) { + define(function() { return Sizzle; }); +} else { + window.Sizzle = Sizzle; +}*/ +// EXPOSE + +/** + * Alias for the Sizzle selector engine + * + * @method select + * @param {String} selector CSS selector to search for elements + * @param {DOMElement} [context] By default the search is done in the document element. However, you can specify an element as search context + * @param {Array} [results] By default this is considered an empty array. But if you want to merge it with other searches you did, pass their result array through here. + * @param {Object} [seed] + * @return {Array} Array of resulting DOM Elements + */ + +/** + * Returns elements which match with the second argument to the function. + * + * @method matches + * @param {String} selector CSS selector to search for elements + * @param {Array} matches Elements to be 'matched' with + * @return {Array} Elements that matched + */ + +/** + * Returns true iif element matches given selector + * + * @method matchesSelector + * @param {DOMElement} element to test + * @param {String} selector CSS selector to test the element with + * @return {Boolean} true iif element matches the CSS selector + */ + +return { + select: Sizzle, + matches: Sizzle.matches, + matchesSelector: Sizzle.matchesSelector +}; + + +}); //( window ); + +/** + * @module Ink.Util.Array_1 + * @author inkdev AT sapo.pt + * @version 1 + */ +Ink.createModule('Ink.Util.Array', '1', [], function() { + + 'use strict'; + + var arrayProto = Array.prototype; + + /** + * Utility functions to use with Arrays + * + * @class Ink.Util.Array + * @version 1 + * @static + */ + var InkArray = { + + /** + * Checks if value exists in array + * + * @method inArray + * @param {Mixed} value + * @param {Array} arr + * @return {Boolean} True if value exists in the array + * @public + * @static + * @example + * Ink.requireModules(['Ink.Util.Array_1'], function( InkArray ){ + * var testArray = [ 'value1', 'value2', 'value3' ]; + * if( InkArray.inArray( 'value2', testArray ) === true ){ + * console.log( "Yep it's in the array." ); + * } else { + * console.log( "No it's NOT in the array." ); + * } + * }); + */ + inArray: function(value, arr) { + if (typeof arr === 'object') { + for (var i = 0, f = arr.length; i < f; ++i) { + if (arr[i] === value) { + return true; + } + } + } + return false; + }, + + /** + * Sorts an array of object by an object property + * + * @method sortMulti + * @param {Array} arr array of objects to sort + * @param {String} key property to sort by + * @return {Array|Boolean} False if it's not an array, returns a sorted array if it's an array. + * @public + * @static + * @example + * Ink.requireModules(['Ink.Util.Array_1'], function( InkArray ){ + * var testArray = [ + * { 'myKey': 'value1' }, + * { 'myKey': 'value2' }, + * { 'myKey': 'value3' } + * ]; + * + * InkArray.sortMulti( testArray, 'myKey' ); + * }); + */ + sortMulti: function(arr, key) { + if (typeof arr === 'undefined' || arr.constructor !== Array) { return false; } + if (typeof key !== 'string') { return arr.sort(); } + if (arr.length > 0) { + if (typeof(arr[0][key]) === 'undefined') { return false; } + arr.sort(function(a, b){ + var x = a[key]; + var y = b[key]; + return ((x < y) ? -1 : ((x > y) ? 1 : 0)); + }); + } + return arr; + }, + + /** + * Returns the associated key of an array value + * + * @method keyValue + * @param {String} value Value to search for + * @param {Array} arr Array where the search will run + * @param {Boolean} [first] Flag that determines if the search stops at first occurrence. It also returns an index number instead of an array of indexes. + * @return {Boolean|Number|Array} False if not exists | number if exists and 3rd input param is true | array if exists and 3rd input param is not set or it is !== true + * @public + * @static + * @example + * Ink.requireModules(['Ink.Util.Array_1'], function( InkArray ){ + * var testArray = [ 'value1', 'value2', 'value3', 'value2' ]; + * console.log( InkArray.keyValue( 'value2', testArray, true ) ); // Result: 1 + * console.log( InkArray.keyValue( 'value2', testArray ) ); // Result: [1, 3] + * }); + */ + keyValue: function(value, arr, first) { + if (typeof value !== 'undefined' && typeof arr === 'object' && this.inArray(value, arr)) { + var aKeys = []; + for (var i = 0, f = arr.length; i < f; ++i) { + if (arr[i] === value) { + if (typeof first !== 'undefined' && first === true) { + return i; + } else { + aKeys.push(i); + } + } + } + return aKeys; + } + return false; + }, + + /** + * Returns the array shuffled, false if the param is not an array + * + * @method shuffle + * @param {Array} arr Array to shuffle + * @return {Boolean|Number|Array} False if not an array | Array shuffled + * @public + * @static + * @example + * Ink.requireModules(['Ink.Util.Array_1'], function( InkArray ){ + * var testArray = [ 'value1', 'value2', 'value3', 'value2' ]; + * console.log( InkArray.shuffle( testArray ) ); // Result example: [ 'value3', 'value2', 'value2', 'value1' ] + * }); + */ + shuffle: function(arr) { + if (typeof(arr) !== 'undefined' && arr.constructor !== Array) { return false; } + var total = arr.length, + tmp1 = false, + rnd = false; + + while (total--) { + rnd = Math.floor(Math.random() * (total + 1)); + tmp1 = arr[total]; + arr[total] = arr[rnd]; + arr[rnd] = tmp1; + } + return arr; + }, + + /** + * Runs a function through each of the elements of an array + * + * @method forEach + * @param {Array} arr Array to be cycled/iterated + * @param {Function} cb The function receives as arguments the value, index and array. + * @return {Array} Array iterated. + * @public + * @static + * @example + * Ink.requireModules(['Ink.Util.Array_1'], function( InkArray ){ + * var testArray = [ 'value1', 'value2', 'value3', 'value2' ]; + * InkArray.forEach( testArray, function( value, index, arr ){ + * console.log( 'The value is: ' + value + ' | The index is: ' + index ); + * }); + * }); + */ + forEach: function(array, callback, context) { + if (arrayProto.forEach) { + return arrayProto.forEach.call(array, callback, context); + } + for (var i = 0, len = array.length >>> 0; i < len; i++) { + callback.call(context, array[i], i, array); + } + }, + + /** + * Alias for backwards compatibility. See forEach + * + * @method forEach + */ + each: function () { + InkArray.forEach.apply(InkArray, [].slice.call(arguments)); + }, + + /** + * Run a `map` function for each item in the array. The function will receive each item as argument and its return value will change the corresponding array item. + * @method map + * @param {Array} array The array to map over + * @param {Function} map The map function. Will take `(item, index, array)` and `this` will be the `context` argument. + * @param {Object} [context] Object to be `this` in the map function. + * + * @example + * InkArray.map([1, 2, 3, 4], function (item) { + * return item + 1; + * }); // -> [2, 3, 4, 5] + */ + map: function (array, callback, context) { + if (arrayProto.map) { + return arrayProto.map.call(array, callback, context); + } + var mapped = new Array(len); + for (var i = 0, len = array.length >>> 0; i < len; i++) { + mapped[i] = callback.call(context, array[i], i, array); + } + return mapped; + }, + + /** + * Run a test function through all the input array. Items which pass the test function (for which the test function returned `true`) are kept in the array. Other items are removed. + * @param {Array} array + * @param {Function} test A test function taking `(item, index, array)` + * @param {Object} [context] Object to be `this` in the test function. + * @return filtered array + * + * @example + * InkArray.filter([1, 2, 3, 4, 5], function (val) { + * return val > 2; + * }) // -> [3, 4, 5] + */ + filter: function (array, test, context) { + if (arrayProto.filter) { + return arrayProto.filter.call(array, test, context); + } + var filtered = [], + val = null; + for (var i = 0, len = array.length; i < len; i++) { + val = array[i]; // it might be mutated + if (test.call(context, val, i, array)) { + filtered.push(val); + } + } + return filtered; + }, + + /** + * Runs a callback function, which should return true or false. + * If one of the 'runs' returns true, it will return. Otherwise if none returns true, it will return false. + * See more at: https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array/some (MDN) + * + * @method some + * @param {Array} arr The array you walk to iterate through + * @param {Function} cb The callback that will be called on the array's elements. It receives the value, the index and the array as arguments. + * @param {Object} Context object of the callback function + * @return {Boolean} True if the callback returns true at any point, false otherwise + * @public + * @static + * @example + * Ink.requireModules(['Ink.Util.Array_1'], function( InkArray ){ + * var testArray1 = [ 10, 20, 50, 100, 30 ]; + * var testArray2 = [ 1, 2, 3, 4, 5 ]; + * + * function myTestFunction( value, index, arr ){ + * if( value > 90 ){ + * return true; + * } + * return false; + * } + * console.log( InkArray.some( testArray1, myTestFunction, null ) ); // Result: true + * console.log( InkArray.some( testArray2, myTestFunction, null ) ); // Result: false + * }); + */ + some: function(arr, cb, context){ + + if (arr === null){ + throw new TypeError('First argument is invalid.'); + } + + var t = Object(arr); + var len = t.length >>> 0; + if (typeof cb !== "function"){ throw new TypeError('Second argument must be a function.'); } + + for (var i = 0; i < len; i++) { + if (i in t && cb.call(context, t[i], i, t)){ return true; } + } + + return false; + }, + + /** + * Returns an array containing every item that is shared between the two given arrays + * + * @method intersect + * @param {Array} arr Array1 to be intersected with Array2 + * @param {Array} arr Array2 to be intersected with Array1 + * @return {Array} Empty array if one of the arrays is false (or do not intersect) | Array with the intersected values + * @public + * @static + * @example + * Ink.requireModules(['Ink.Util.Array_1'], function( InkArray ){ + * var testArray1 = [ 'value1', 'value2', 'value3' ]; + * var testArray2 = [ 'value2', 'value3', 'value4', 'value5', 'value6' ]; + * console.log( InkArray.intersect( testArray1,testArray2 ) ); // Result: [ 'value2', 'value3' ] + * }); + */ + intersect: function(arr1, arr2) { + if (!arr1 || !arr2 || arr1 instanceof Array === false || arr2 instanceof Array === false) { + return []; + } + + var shared = []; + for (var i = 0, I = arr1.length; i= from && i < from + rLen){ + continue; + } + + output.push(arr[i]); + } + + return output; + } + }; + + return InkArray; + +}); + + + +/** + * @module Ink.Util.BinPack_1 + * @author inkdev AT sapo.pt + * @version 1 + */ +Ink.createModule('Ink.Util.BinPack', '1', [], function() { + + 'use strict'; + + /*jshint boss:true */ + + // https://github.com/jakesgordon/bin-packing/ + + /* + Copyright (c) 2011, 2012, 2013 Jake Gordon and contributors + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. + */ + + + + var Packer = function(w, h) { + this.init(w, h); + }; + + Packer.prototype = { + + init: function(w, h) { + this.root = { x: 0, y: 0, w: w, h: h }; + }, + + fit: function(blocks) { + var n, node, block; + for (n = 0; n < blocks.length; ++n) { + block = blocks[n]; + if (node = this.findNode(this.root, block.w, block.h)) { + block.fit = this.splitNode(node, block.w, block.h); + } + } + }, + + findNode: function(root, w, h) { + if (root.used) { + return this.findNode(root.right, w, h) || this.findNode(root.down, w, h); + } + else if ((w <= root.w) && (h <= root.h)) { + return root; + } + else { + return null; + } + }, + + splitNode: function(node, w, h) { + node.used = true; + node.down = { x: node.x, y: node.y + h, w: node.w, h: node.h - h }; + node.right = { x: node.x + w, y: node.y, w: node.w - w, h: h }; + return node; + } + + }; + + + + var GrowingPacker = function() {}; + + GrowingPacker.prototype = { + + fit: function(blocks) { + var n, node, block, len = blocks.length; + var w = len > 0 ? blocks[0].w : 0; + var h = len > 0 ? blocks[0].h : 0; + this.root = { x: 0, y: 0, w: w, h: h }; + for (n = 0; n < len ; n++) { + block = blocks[n]; + if (node = this.findNode(this.root, block.w, block.h)) { + block.fit = this.splitNode(node, block.w, block.h); + } + else { + block.fit = this.growNode(block.w, block.h); + } + } + }, + + findNode: function(root, w, h) { + if (root.used) { + return this.findNode(root.right, w, h) || this.findNode(root.down, w, h); + } + else if ((w <= root.w) && (h <= root.h)) { + return root; + } + else { + return null; + } + }, + + splitNode: function(node, w, h) { + node.used = true; + node.down = { x: node.x, y: node.y + h, w: node.w, h: node.h - h }; + node.right = { x: node.x + w, y: node.y, w: node.w - w, h: h }; + return node; + }, + + growNode: function(w, h) { + var canGrowDown = (w <= this.root.w); + var canGrowRight = (h <= this.root.h); + + var shouldGrowRight = canGrowRight && (this.root.h >= (this.root.w + w)); // attempt to keep square-ish by growing right when height is much greater than width + var shouldGrowDown = canGrowDown && (this.root.w >= (this.root.h + h)); // attempt to keep square-ish by growing down when width is much greater than height + + if (shouldGrowRight) { + return this.growRight(w, h); + } + else if (shouldGrowDown) { + return this.growDown(w, h); + } + else if (canGrowRight) { + return this.growRight(w, h); + } + else if (canGrowDown) { + return this.growDown(w, h); + } + else { + return null; // need to ensure sensible root starting size to avoid this happening + } + }, + + growRight: function(w, h) { + this.root = { + used: true, + x: 0, + y: 0, + w: this.root.w + w, + h: this.root.h, + down: this.root, + right: { x: this.root.w, y: 0, w: w, h: this.root.h } + }; + var node; + if (node = this.findNode(this.root, w, h)) { + return this.splitNode(node, w, h); + } + else { + return null; + } + }, + + growDown: function(w, h) { + this.root = { + used: true, + x: 0, + y: 0, + w: this.root.w, + h: this.root.h + h, + down: { x: 0, y: this.root.h, w: this.root.w, h: h }, + right: this.root + }; + var node; + if (node = this.findNode(this.root, w, h)) { + return this.splitNode(node, w, h); + } + else { + return null; + } + } + + }; + + + + var sorts = { + random: function() { return Math.random() - 0.5; }, + w: function(a, b) { return b.w - a.w; }, + h: function(a, b) { return b.h - a.h; }, + a: function(a, b) { return b.area - a.area; }, + max: function(a, b) { return Math.max(b.w, b.h) - Math.max(a.w, a.h); }, + min: function(a, b) { return Math.min(b.w, b.h) - Math.min(a.w, a.h); }, + height: function(a, b) { return sorts.msort(a, b, ['h', 'w']); }, + width: function(a, b) { return sorts.msort(a, b, ['w', 'h']); }, + area: function(a, b) { return sorts.msort(a, b, ['a', 'h', 'w']); }, + maxside: function(a, b) { return sorts.msort(a, b, ['max', 'min', 'h', 'w']); }, + msort: function(a, b, criteria) { /* sort by multiple criteria */ + var diff, n; + for (n = 0; n < criteria.length; ++n) { + diff = sorts[ criteria[n] ](a, b); + if (diff !== 0) { + return diff; + } + } + return 0; + } + }; + + + + // end of Jake's code + + + + // aux, used to display blocks in unfitted property + var toString = function() { + return [this.w, ' x ', this.h].join(''); + }; + + + + /** + * Binary Packing algorithm implementation + * + * Based on the work of Jake Gordon + * + * see https://github.com/jakesgordon/bin-packing/ + * + * @class Ink.Util.BinPack + * @version 1 + * @static + */ + var BinPack = { + + /** + * @method binPack + * @param {Object} o options + * @param {Object[]} o.blocks array of items with w and h integer attributes. + * @param {Number[2]} [o.dimensions] if passed, container has fixed dimensions + * @param {String} [o.sorter] sorter function. one of: random, height, width, area, maxside + * @return {Object} + * * {Number[2]} dimensions - resulted container size, + * * {Number} filled - filled ratio, + * * {Object[]} fitted, + * * {Object[]} unfitted, + * * {Object[]} blocks + * @static + */ + binPack: function(o) { + var i, f, bl; + + + + // calculate area if not there already + for (i = 0, f = o.blocks.length; i < f; ++i) { + bl = o.blocks[i]; + if (! ('area' in bl) ) { + bl.area = bl.w * bl.h; + } + } + + + + // apply algorithm + var packer = o.dimensions ? new Packer(o.dimensions[0], o.dimensions[1]) : new GrowingPacker(); + + if (!o.sorter) { o.sorter = 'maxside'; } + + o.blocks.sort( sorts[ o.sorter ] ); + + packer.fit(o.blocks); + + var dims2 = [packer.root.w, packer.root.h]; + + + + // layout is done here, generating report data... + var fitted = []; + var unfitted = []; + + for (i = 0, f = o.blocks.length; i < f; ++i) { + bl = o.blocks[i]; + if (bl.fit) { + fitted.push(bl); + } + else { + bl.toString = toString; // TO AID SERIALIZATION + unfitted.push(bl); + } + } + + var area = dims2[0] * dims2[1]; + var fit = 0; + for (i = 0, f = fitted.length; i < f; ++i) { + bl = fitted[i]; + fit += bl.area; + } + + return { + dimensions: dims2, + filled: fit / area, + blocks: o.blocks, + fitted: fitted, + unfitted: unfitted + }; + } + }; + + + + return BinPack; + +}); + +/** + * @module Ink.Util.Cookie_1 + * @author inkdev AT sapo.pt + * @version 1 + */ +Ink.createModule('Ink.Util.Cookie', '1', [], function() { + + 'use strict'; + + /** + * Utilities for Cookie handling + * + * @class Ink.Util.Cookie + * @version 1 + * @static + */ + var Cookie = { + + /** + * Gets an object with current page cookies + * + * @method get + * @param {String} name + * @return {String|Object} If the name is specified, it returns the value related to that property. Otherwise it returns the full cookie object + * @public + * @static + * @example + * Ink.requireModules(['Ink.Util.Cookie_1'], function( InkCookie ){ + * var myCookieValue = InkCookie.get('someVarThere'); + * console.log( myCookieValue ); // This will output the value of the cookie 'someVarThere', from the cookie object. + * }); + */ + get: function(name) + { + var cookie = document.cookie || false; + + var _Cookie = {}; + if(cookie) { + cookie = cookie.replace(new RegExp("; ", "g"), ';'); + var aCookie = cookie.split(';'); + var aItem = []; + if(aCookie.length > 0) { + for(var i=0; i < aCookie.length; i++) { + aItem = aCookie[i].split('='); + if(aItem.length === 2) { + _Cookie[aItem[0]] = decodeURIComponent(aItem[1]); + } + aItem = []; + } + } + } + if(name) { + if(typeof(_Cookie[name]) !== 'undefined') { + return _Cookie[name]; + } else { + return null; + } + } + return _Cookie; + }, + + /** + * Sets a cookie + * + * @method set + * @param {String} name Cookie name + * @param {String} value Cookie value + * @param {Number} [expires] Number to add to current Date in seconds + * @param {String} [path] Path to sets cookie (default '/') + * @param {String} [domain] Domain to sets cookie (default current hostname) + * @param {Boolean} [secure] True if wants secure, default 'false' + * @public + * @static + * @example + * Ink.requireModules(['Ink.Util.Cookie_1'], function( InkCookie ){ + * var expireDate = new Date( 2014,00,01, 0,0,0); + * InkCookie.set( 'someVarThere', 'anyValueHere', expireDate.getTime() ); + * }); + */ + set: function(name, value, expires, path, domain, secure) + { + var sName; + if(!name || value===false || typeof(name) === 'undefined' || typeof(value) === 'undefined') { + return false; + } else { + sName = name+'='+encodeURIComponent(value); + } + var sExpires = false; + var sPath = false; + var sDomain = false; + var sSecure = false; + + if(expires && typeof(expires) !== 'undefined' && !isNaN(expires)) { + var oDate = new Date(); + var sDate = (parseInt(Number(oDate.valueOf()), 10) + (Number(parseInt(expires, 10)) * 1000)); + + var nDate = new Date(sDate); + var expiresString = nDate.toGMTString(); + + var re = new RegExp("([^\\s]+)(\\s\\d\\d)\\s(\\w\\w\\w)\\s(.*)"); + expiresString = expiresString.replace(re, "$1$2-$3-$4"); + + sExpires = 'expires='+expiresString; + } else { + if(typeof(expires) !== 'undefined' && !isNaN(expires) && Number(parseInt(expires, 10))===0) { + sExpires = ''; + } else { + sExpires = 'expires=Thu, 01-Jan-2037 00:00:01 GMT'; + } + } + + if(path && typeof(path) !== 'undefined') { + sPath = 'path='+path; + } else { + sPath = 'path=/'; + } + + if(domain && typeof(domain) !== 'undefined') { + sDomain = 'domain='+domain; + } else { + var portClean = new RegExp(":(.*)"); + sDomain = 'domain='+window.location.host; + sDomain = sDomain.replace(portClean,""); + } + + if(secure && typeof(secure) !== 'undefined') { + sSecure = secure; + } else { + sSecure = false; + } + + document.cookie = sName+'; '+sExpires+'; '+sPath+'; '+sDomain+'; '+sSecure; + }, + + /** + * Delete a cookie + * + * @method remove + * @param {String} cookieName Cookie name + * @param {String} [path] Path of the cookie (default '/') + * @param {String} [domain] Domain of the cookie (default current hostname) + * @public + * @static + * @example + * Ink.requireModules(['Ink.Util.Cookie_1'], function( InkCookie ){ + * InkCookie.remove( 'someVarThere' ); + * }); + */ + remove: function(cookieName, path, domain) + { + //var expiresDate = 'Thu, 01-Jan-1970 00:00:01 GMT'; + var sPath = false; + var sDomain = false; + var expiresDate = -999999999; + + if(path && typeof(path) !== 'undefined') { + sPath = path; + } else { + sPath = '/'; + } + + if(domain && typeof(domain) !== 'undefined') { + sDomain = domain; + } else { + sDomain = window.location.host; + } + + this.set(cookieName, 'deleted', expiresDate, sPath, sDomain); + } + }; + + return Cookie; + +}); + +/** + * @module Ink.Util.Date_1 + * @author inkdev AT sapo.pt + * @version 1 + */ +Ink.createModule('Ink.Util.Date', '1', [], function() { + + 'use strict'; + + /** + * Class to provide the same features that php date does + * + * @class Ink.Util.Date + * @version 1 + * @static + */ + var InkDate = { + + /** + * Function that returns the string representation of the month [PT only] + * + * @method _months + * @param {Number} index Month javascript (0 to 11) + * @return {String} The month's name + * @private + * @static + * @example + * console.log( InkDate._months(0) ); // Result: Janeiro + */ + _months: function(index){ + var _m = ['Janeiro', 'Fevereiro', 'Março', 'Abril', 'Maio', 'Junho', 'Julho', 'Agosto', 'Setembro', 'Outubro', 'Novembro', 'Dezembro']; + return _m[index]; + }, + + /** + * Function that returns the month [PT only] ( 0 to 11 ) + * + * @method _iMonth + * @param {String} month Month javascript (0 to 11) + * @return {Number} The month's number + * @private + * @static + * @example + * console.log( InkDate._iMonth('maio') ); // Result: 4 + */ + _iMonth : function( month ) + { + if ( Number( month ) ) { return +month - 1; } + return { + 'janeiro' : 0 , + 'jan' : 0 , + 'fevereiro' : 1 , + 'fev' : 1 , + 'março' : 2 , + 'mar' : 2 , + 'abril' : 3 , + 'abr' : 3 , + 'maio' : 4 , + 'mai' : 4 , + 'junho' : 5 , + 'jun' : 5 , + 'julho' : 6 , + 'jul' : 6 , + 'agosto' : 7 , + 'ago' : 7 , + 'setembro' : 8 , + 'set' : 8 , + 'outubro' : 9 , + 'out' : 9 , + 'novembro' : 10 , + 'nov' : 10 , + 'dezembro' : 11 , + 'dez' : 11 + }[ month.toLowerCase( ) ]; + } , + + /** + * Function that returns the representation the day of the week [PT Only] + * + * @method _wDays + * @param {Number} index Week's day index + * @return {String} The week's day name + * @private + * @static + * @example + * console.log( InkDate._wDays(0) ); // Result: Domingo + */ + _wDays: function(index){ + var _d = ['Domingo', 'Segunda', 'Terça', 'Quarta', 'Quinta', 'Sexta', 'Sábado']; + return _d[index]; + }, + + /** + * Function that returns day of the week in javascript 1 to 7 + * + * @method _iWeek + * @param {String} week Week's day name + * @return {Number} The week's day index + * @private + * @static + * @example + * console.log( InkDate._iWeek('quarta') ); // Result: 3 + */ + _iWeek: function( week ) + { + if ( Number( week ) ) { return +week || 7; } + return { + 'segunda' : 1 , + 'seg' : 1 , + 'terça' : 2 , + 'ter' : 2 , + 'quarta' : 3 , + 'qua' : 3 , + 'quinta' : 4 , + 'qui' : 4 , + 'sexta' : 5 , + 'sex' : 5 , + 'sábado' : 6 , + 'sáb' : 6 , + 'domingo' : 7 , + 'dom' : 7 + }[ week.toLowerCase( ) ]; + }, + + /** + * Function that returns the number of days of a given month (m) on a given year (y) + * + * @method _daysInMonth + * @param {Number} _m Month + * @param {Number} _y Year + * @return {Number} Number of days of a give month on a given year + * @private + * @static + * @example + * console.log( InkDate._daysInMonth(2,2013) ); // Result: 28 + */ + _daysInMonth: function(_m,_y){ + var nDays; + + if(_m===1 || _m===3 || _m===5 || _m===7 || _m===8 || _m===10 || _m===12) + { + nDays= 31; + } + else if ( _m===4 || _m===6 || _m===9 || _m===11) + { + nDays = 30; + } + else + { + if((_y%400===0) || (_y%4===0 && _y%100!==0)) + { + nDays = 29; + } + else + { + nDays = 28; + } + } + return nDays; + }, + + /** + * Function that works exactly as php date() function + * Works like PHP 5.2.2 PHP Date function + * + * @method get + * @param {String} format - as the string in which the date it will be formatted - mandatory + * @param {Date} [_date] - the date to format. If undefined it will do it on now() date. Can receive unix timestamp or a date object + * @return {String} Formatted date + * @public + * @static + * @example + * + */ + get: function(format, _date){ + /*jshint maxcomplexity:65 */ + if(typeof(format) === 'undefined' || format === ''){ + format = "Y-m-d"; + } + + + var iFormat = format.split(""); + var result = new Array(iFormat.length); + var escapeChar = "\\"; + var jsDate; + + if (typeof(_date) === 'undefined'){ + jsDate = new Date(); + } else if (typeof(_date)==='number'){ + jsDate = new Date(_date*1000); + } else { + jsDate = new Date(_date); + } + + var jsFirstDay, jsThisDay, jsHour; + /* This switch is presented in the same order as in php date function (PHP 5.2.2) */ + for (var i = 0; i < iFormat.length; i++) { + switch(iFormat[i]) { + case escapeChar: + result[i] = iFormat[i+1]; + i++; + break; + + + /* DAY */ + case "d": /* Day of the month, 2 digits with leading zeros; ex: 01 to 31 */ + var jsDay = jsDate.getDate(); + result[i] = (String(jsDay).length > 1) ? jsDay : "0" + jsDay; + break; + + case "D": /* A textual representation of a day, three letters; Seg to Dom */ + result[i] = this._wDays(jsDate.getDay()).substring(0, 3); + break; + + case "j": /* Day of the month without leading zeros; ex: 1 to 31 */ + result[i] = jsDate.getDate(); + break; + + case "l": /* A full textual representation of the day of the week; Domingo to Sabado */ + result[i] = this._wDays(jsDate.getDay()); + break; + + case "N": /* ISO-8601 numeric representation of the day of the week; 1 (Segunda) to 7 (Domingo) */ + result[i] = jsDate.getDay() || 7; + break; + + case "S": /* English ordinal suffix for the day of the month, 2 characters; st, nd, rd or th. Works well with j */ + var temp = jsDate.getDate(); + var suffixes = ["st", "nd", "rd"]; + var suffix = ""; + + if (temp >= 11 && temp <= 13) { + result[i] = "th"; + } else { + result[i] = (suffix = suffixes[String(temp).substr(-1) - 1]) ? (suffix) : ("th"); + } + break; + + case "w": /* Numeric representation of the day of the week; 0 (for Sunday) through 6 (for Saturday) */ + result[i] = jsDate.getDay(); + break; + + case "z": /* The day of the year (starting from 0); 0 to 365 */ + jsFirstDay = Date.UTC(jsDate.getFullYear(), 0, 0); + jsThisDay = Date.UTC(jsDate.getFullYear(), jsDate.getMonth(), jsDate.getDate()); + result[i] = Math.floor((jsThisDay - jsFirstDay) / (1000 * 60 * 60 * 24)); + break; + + /* WEEK */ + case "W": /* ISO-8601 week number of year, weeks starting on Monday; ex: 42 (the 42nd week in the year) */ + var jsYearStart = new Date( jsDate.getFullYear( ) , 0 , 1 ); + jsFirstDay = jsYearStart.getDay() || 7; + + var days = Math.floor( ( jsDate - jsYearStart ) / ( 24 * 60 * 60 * 1000 ) + 1 ); + + result[ i ] = Math.ceil( ( days - ( 8 - jsFirstDay ) ) / 7 ) + 1; + break; + + + /* MONTH */ + case "F": /* A full textual representation of a month, such as Janeiro or Marco; Janeiro a Dezembro */ + result[i] = this._months(jsDate.getMonth()); + break; + + case "m": /* Numeric representation of a month, with leading zeros; 01 to 12 */ + var jsMonth = String(jsDate.getMonth() + 1); + result[i] = (jsMonth.length > 1) ? jsMonth : "0" + jsMonth; + break; + + case "M": /* A short textual representation of a month, three letters; Jan a Dez */ + result[i] = this._months(jsDate.getMonth()).substring(0,3); + break; + + case "n": /* Numeric representation of a month, without leading zeros; 1 a 12 */ + result[i] = jsDate.getMonth() + 1; + break; + + case "t": /* Number of days in the given month; ex: 28 */ + result[i] = this._daysInMonth(jsDate.getMonth()+1,jsDate.getYear()); + break; + + /* YEAR */ + case "L": /* Whether it's a leap year; 1 if it is a leap year, 0 otherwise. */ + var jsYear = jsDate.getFullYear(); + result[i] = (jsYear % 4) ? false : ( (jsYear % 100) ? true : ( (jsYear % 400) ? false : true ) ); + break; + + case "o": /* ISO-8601 year number. This has the same value as Y, except that if the ISO week number (W) belongs to the previous or next year, that year is used instead. */ + throw '"o" not implemented!'; + + case "Y": /* A full numeric representation of a year, 4 digits; 1999 */ + result[i] = jsDate.getFullYear(); + break; + + case "y": /* A two digit representation of a year; 99 */ + result[i] = String(jsDate.getFullYear()).substring(2); + break; + + /* TIME */ + case "a": /* Lowercase Ante meridiem and Post meridiem; am or pm */ + result[i] = (jsDate.getHours() < 12) ? "am" : "pm"; + break; + + case "A": /* Uppercase Ante meridiem and Post meridiem; AM or PM */ + result[i] = (jsDate.getHours < 12) ? "AM" : "PM"; + break; + + case "B": /* Swatch Internet time; 000 through 999 */ + throw '"B" not implemented!'; + + case "g": /* 12-hour format of an hour without leading zeros; 1 to 12 */ + jsHour = jsDate.getHours(); + result[i] = (jsHour <= 12) ? jsHour : (jsHour - 12); + break; + + case "G": /* 24-hour format of an hour without leading zeros; 1 to 23 */ + result[i] = String(jsDate.getHours()); + break; + + case "h": /* 12-hour format of an hour with leading zeros; 01 to 12 */ + jsHour = String(jsDate.getHours()); + jsHour = (jsHour <= 12) ? jsHour : (jsHour - 12); + result[i] = (jsHour.length > 1) ? jsHour : "0" + jsHour; + break; + + case "H": /* 24-hour format of an hour with leading zeros; 01 to 24 */ + jsHour = String(jsDate.getHours()); + result[i] = (jsHour.length > 1) ? jsHour : "0" + jsHour; + break; + + case "i": /* Minutes with leading zeros; 00 to 59 */ + var jsMinute = String(jsDate.getMinutes()); + result[i] = (jsMinute.length > 1) ? jsMinute : "0" + jsMinute; + break; + + case "s": /* Seconds with leading zeros; 00 to 59; */ + var jsSecond = String(jsDate.getSeconds()); + result[i] = (jsSecond.length > 1) ? jsSecond : "0" + jsSecond; + break; + + case "u": /* Microseconds */ + throw '"u" not implemented!'; + + + /* TIMEZONE */ + + case "e": /* Timezone identifier */ + throw '"e" not implemented!'; + + case "I": /* "1" if Daylight Savings Time, "0" otherwise. Works only on the northern hemisphere */ + jsFirstDay = new Date(jsDate.getFullYear(), 0, 1); + result[i] = (jsDate.getTimezoneOffset() !== jsFirstDay.getTimezoneOffset()) ? (1) : (0); + break; + + case "O": /* Difference to Greenwich time (GMT) in hours */ + var jsMinZone = jsDate.getTimezoneOffset(); + var jsMinutes = jsMinZone % 60; + jsHour = String(((jsMinZone - jsMinutes) / 60) * -1); + + if (jsHour.charAt(0) !== "-") { + jsHour = "+" + jsHour; + } + + jsHour = (jsHour.length === 3) ? (jsHour) : (jsHour.replace(/([+\-])(\d)/, "$1" + 0 + "$2")); + result[i] = jsHour + jsMinutes + "0"; + break; + + case "P": /* Difference to Greenwich time (GMT) with colon between hours and minutes */ + throw '"P" not implemented!'; + + case "T": /* Timezone abbreviation */ + throw '"T" not implemented!'; + + case "Z": /* Timezone offset in seconds. The offset for timezones west of UTC is always negative, and for those east of UTC is always positive. */ + result[i] = jsDate.getTimezoneOffset() * 60; + break; + + + /* FULL DATE/TIME */ + + case "c": /* ISO 8601 date */ + throw '"c" not implemented!'; + + case "r": /* RFC 2822 formatted date */ + var jsDayName = this._wDays(jsDate.getDay()).substr(0, 3); + var jsMonthName = this._months(jsDate.getMonth()).substr(0, 3); + result[i] = jsDayName + ", " + jsDate.getDate() + " " + jsMonthName + this.get(" Y H:i:s O",jsDate); + break; + + case "U": /* Seconds since the Unix Epoch (January 1 1970 00:00:00 GMT) */ + result[i] = Math.floor(jsDate.getTime() / 1000); + break; + + default: + result[i] = iFormat[i]; + } + } + + return result.join(''); + + }, + + /** + * Functions that works like php date() function but return a date based on the formatted string + * Works like PHP 5.2.2 PHP Date function + * + * @method set + * @param {String} [format] As the string in which the date it will be formatted. By default is 'Y-m-d' + * @param {String} str_date The date formatted - Mandatory. + * @return {Date} Date object based on the formatted date + * @public + * @static + */ + set : function( format , str_date ) { + if ( typeof str_date === 'undefined' ) { return ; } + if ( typeof format === 'undefined' || format === '' ) { format = "Y-m-d"; } + + var iFormat = format.split(""); + var result = new Array( iFormat.length ); + var escapeChar = "\\"; + var mList; + + var objIndex = { + year : undefined , + month : undefined , + day : undefined , + dayY : undefined , + dayW : undefined , + week : undefined , + hour : undefined , + hourD : undefined , + min : undefined , + sec : undefined , + msec : undefined , + ampm : undefined , + diffM : undefined , + diffH : undefined , + date : undefined + }; + + var matches = 0; + + /* This switch is presented in the same order as in php date function (PHP 5.2.2) */ + for ( var i = 0; i < iFormat.length; i++) { + switch( iFormat[ i ] ) { + case escapeChar: + result[i] = iFormat[ i + 1 ]; + i++; + break; + + /* DAY */ + case "d": /* Day of the month, 2 digits with leading zeros; ex: 01 to 31 */ + result[ i ] = '(\\d{2})'; + objIndex.day = { original : i , match : matches++ }; + break; + + case "j": /* Day of the month without leading zeros; ex: 1 to 31 */ + result[ i ] = '(\\d{1,2})'; + objIndex.day = { original : i , match : matches++ }; + break; + + case "D": /* A textual representation of a day, three letters; Seg to Dom */ + result[ i ] = '([\\wá]{3})'; + objIndex.dayW = { original : i , match : matches++ }; + break; + + case "l": /* A full textual representation of the day of the week; Domingo to Sabado */ + result[i] = '([\\wá]{5,7})'; + objIndex.dayW = { original : i , match : matches++ }; + break; + + case "N": /* ISO-8601 numeric representation of the day of the week; 1 (Segunda) to 7 (Domingo) */ + result[ i ] = '(\\d)'; + objIndex.dayW = { original : i , match : matches++ }; + break; + + case "w": /* Numeric representation of the day of the week; 0 (for Sunday) through 6 (for Saturday) */ + result[ i ] = '(\\d)'; + objIndex.dayW = { original : i , match : matches++ }; + break; + + case "S": /* English ordinal suffix for the day of the month, 2 characters; st, nd, rd or th. Works well with j */ + result[ i ] = '\\w{2}'; + break; + + case "z": /* The day of the year (starting from 0); 0 to 365 */ + result[ i ] = '(\\d{1,3})'; + objIndex.dayY = { original : i , match : matches++ }; + break; + + /* WEEK */ + case "W": /* ISO-8601 week number of year, weeks starting on Monday; ex: 42 (the 42nd week in the year) */ + result[ i ] = '(\\d{1,2})'; + objIndex.week = { original : i , match : matches++ }; + break; + + /* MONTH */ + case "F": /* A full textual representation of a month, such as Janeiro or Marco; Janeiro a Dezembro */ + result[ i ] = '([\\wç]{4,9})'; + objIndex.month = { original : i , match : matches++ }; + break; + + case "M": /* A short textual representation of a month, three letters; Jan a Dez */ + result[ i ] = '(\\w{3})'; + objIndex.month = { original : i , match : matches++ }; + break; + + case "m": /* Numeric representation of a month, with leading zeros; 01 to 12 */ + result[ i ] = '(\\d{2})'; + objIndex.month = { original : i , match : matches++ }; + break; + + case "n": /* Numeric representation of a month, without leading zeros; 1 a 12 */ + result[ i ] = '(\\d{1,2})'; + objIndex.month = { original : i , match : matches++ }; + break; + + case "t": /* Number of days in the given month; ex: 28 */ + result[ i ] = '\\d{2}'; + break; + + /* YEAR */ + case "L": /* Whether it's a leap year; 1 if it is a leap year, 0 otherwise. */ + result[ i ] = '\\w{4,5}'; + break; + + case "o": /* ISO-8601 year number. This has the same value as Y, except that if the ISO week number (W) belongs to the previous or next year, that year is used instead. */ + throw '"o" not implemented!'; + + case "Y": /* A full numeric representation of a year, 4 digits; 1999 */ + result[ i ] = '(\\d{4})'; + objIndex.year = { original : i , match : matches++ }; + break; + + case "y": /* A two digit representation of a year; 99 */ + result[ i ] = '(\\d{2})'; + if ( typeof objIndex.year === 'undefined' || iFormat[ objIndex.year.original ] !== 'Y' ) { + objIndex.year = { original : i , match : matches++ }; + } + break; + + /* TIME */ + case "a": /* Lowercase Ante meridiem and Post meridiem; am or pm */ + result[ i ] = '(am|pm)'; + objIndex.ampm = { original : i , match : matches++ }; + break; + + case "A": /* Uppercase Ante meridiem and Post meridiem; AM or PM */ + result[ i ] = '(AM|PM)'; + objIndex.ampm = { original : i , match : matches++ }; + break; + + case "B": /* Swatch Internet time; 000 through 999 */ + throw '"B" not implemented!'; + + case "g": /* 12-hour format of an hour without leading zeros; 1 to 12 */ + result[ i ] = '(\\d{1,2})'; + objIndex.hourD = { original : i , match : matches++ }; + break; + + case "G": /* 24-hour format of an hour without leading zeros; 1 to 23 */ + result[ i ] = '(\\d{1,2})'; + objIndex.hour = { original : i , match : matches++ }; + break; + + case "h": /* 12-hour format of an hour with leading zeros; 01 to 12 */ + result[ i ] = '(\\d{2})'; + objIndex.hourD = { original : i , match : matches++ }; + break; + + case "H": /* 24-hour format of an hour with leading zeros; 01 to 24 */ + result[ i ] = '(\\d{2})'; + objIndex.hour = { original : i , match : matches++ }; + break; + + case "i": /* Minutes with leading zeros; 00 to 59 */ + result[ i ] = '(\\d{2})'; + objIndex.min = { original : i , match : matches++ }; + break; + + case "s": /* Seconds with leading zeros; 00 to 59; */ + result[ i ] = '(\\d{2})'; + objIndex.sec = { original : i , match : matches++ }; + break; + + case "u": /* Microseconds */ + throw '"u" not implemented!'; + + /* TIMEZONE */ + case "e": /* Timezone identifier */ + throw '"e" not implemented!'; + + case "I": /* "1" if Daylight Savings Time, "0" otherwise. Works only on the northern hemisphere */ + result[i] = '\\d'; + break; + + case "O": /* Difference to Greenwich time (GMT) in hours */ + result[ i ] = '([-+]\\d{4})'; + objIndex.diffH = { original : i , match : matches++ }; + break; + + case "P": /* Difference to Greenwich time (GMT) with colon between hours and minutes */ + throw '"P" not implemented!'; + + case "T": /* Timezone abbreviation */ + throw '"T" not implemented!'; + + case "Z": /* Timezone offset in seconds. The offset for timezones west of UTC is always negative, and for those east of UTC is always positive. */ + result[ i ] = '(\\-?\\d{1,5})'; + objIndex.diffM = { original : i , match : matches++ }; + break; + + /* FULL DATE/TIME */ + case "c": /* ISO 8601 date */ + throw '"c" not implemented!'; + + case "r": /* RFC 2822 formatted date */ + result[ i ] = '([\\wá]{3}, \\d{1,2} \\w{3} \\d{4} \\d{2}:\\d{2}:\\d{2} [+\\-]\\d{4})'; + objIndex.date = { original : i , match : matches++ }; + break; + + case "U": /* Seconds since the Unix Epoch (January 1 1970 00:00:00 GMT) */ + result[ i ] = '(\\d{1,13})'; + objIndex.date = { original : i , match : matches++ }; + break; + + default: + result[ i ] = iFormat[ i ]; + } + } + + var pattr = new RegExp( result.join('') ); + + try { + mList = str_date.match( pattr ); + if ( !mList ) { return; } + } + catch ( e ) { return ; } + + var _haveDatetime = typeof objIndex.date !== 'undefined'; + + var _haveYear = typeof objIndex.year !== 'undefined'; + + var _haveYDay = typeof objIndex.dayY !== 'undefined'; + + var _haveDay = typeof objIndex.day !== 'undefined'; + var _haveMonth = typeof objIndex.month !== 'undefined'; + var _haveMonthDay = _haveMonth && _haveDay; + var _haveOnlyDay = !_haveMonth && _haveDay; + + var _haveWDay = typeof objIndex.dayW !== 'undefined'; + var _haveWeek = typeof objIndex.week !== 'undefined'; + var _haveWeekWDay = _haveWeek && _haveWDay; + var _haveOnlyWDay = !_haveWeek && _haveWDay; + + var _validDate = _haveYDay || _haveMonthDay || !_haveYear && _haveOnlyDay || _haveWeekWDay || !_haveYear && _haveOnlyWDay; + var _noDate = !_haveYear && !_haveYDay && !_haveDay && !_haveMonth && !_haveWDay && !_haveWeek; + + var _haveHour12 = typeof objIndex.hourD !== 'undefined' && typeof objIndex.ampm !== 'undefined'; + var _haveHour24 = typeof objIndex.hour !== 'undefined'; + var _haveHour = _haveHour12 || _haveHour24; + + var _haveMin = typeof objIndex.min !== 'undefined'; + var _haveSec = typeof objIndex.sec !== 'undefined'; + var _haveMSec = typeof objIndex.msec !== 'undefined'; + + var _haveMoreM = !_noDate || _haveHour; + var _haveMoreS = _haveMoreM || _haveMin; + + var _haveDiffM = typeof objIndex.diffM !== 'undefined'; + var _haveDiffH = typeof objIndex.diffH !== 'undefined'; + //var _haveGMT = _haveDiffM || _haveDiffH; + var hour; + var min; + + if ( _haveDatetime ) { + if ( iFormat[ objIndex.date.original ] === 'U' ) { + return new Date( +mList[ objIndex.date.match + 1 ] * 1000 ); + } + + var dList = mList[ objIndex.date.match + 1 ].match( /\w{3}, (\d{1,2}) (\w{3}) (\d{4}) (\d{2}):(\d{2}):(\d{2}) ([+\-]\d{4})/ ); + hour = +dList[ 4 ] + ( +dList[ 7 ].slice( 0 , 3 ) ); + min = +dList[ 5 ] + ( dList[ 7 ].slice( 0 , 1 ) + dList[ 7 ].slice( 3 ) ) / 100 * 60; + + return new Date( dList[ 3 ] , this._iMonth( dList[ 2 ] ) , dList[ 1 ] , hour , min , dList[ 6 ] ); + } + + var _d = new Date( ); + var year; + var month; + var day; + var sec; + var msec; + var gmt; + + if ( !_validDate && !_noDate ) { return ; } + + if ( _validDate ) { + if ( _haveYear ) { + var _y = _d.getFullYear( ) - 50 + ''; + year = mList[ objIndex.year.match + 1 ]; + if ( iFormat[ objIndex.year.original ] === 'y' ) { + year = +_y.slice( 0 , 2 ) + ( year >= ( _y ).slice( 2 ) ? 0 : 1 ) + year; + } + } else { + year = _d.getFullYear(); + } + + if ( _haveYDay ) { + month = 0; + day = mList[ objIndex.dayY.match + 1 ]; + } else if ( _haveDay ) { + if ( _haveMonth ) { + month = this._iMonth( mList[ objIndex.month.match + 1 ] ); + } else { + month = _d.getMonth( ); + } + + day = mList[ objIndex.day.match + 1 ]; + } else { + month = 0; + + var week; + if ( _haveWeek ) { + week = mList[ objIndex.week.match + 1 ]; + } else { + week = this.get( 'W' , _d ); + } + + day = ( week - 2 ) * 7 + ( 8 - ( ( new Date( year , 0 , 1 ) ).getDay( ) || 7 ) ) + this._iWeek( mList[ objIndex.week.match + 1 ] ); + } + + if ( month === 0 && day > 31 ) { + var aux = new Date( year , month , day ); + month = aux.getMonth( ); + day = aux.getDate( ); + } + } + else { + year = _d.getFullYear( ); + month = _d.getMonth( ); + day = _d.getDate( ); + } + + if ( _haveHour12 ) { hour = +mList[ objIndex.hourD.match + 1 ] + ( mList[ objIndex.ampm.match + 1 ] === 'pm' ? 12 : 0 ); } + else if ( _haveHour24 ) { hour = mList[ objIndex.hour.match + 1 ]; } + else if ( _noDate ) { hour = _d.getHours( ); } + else { hour = '00'; } + + if ( _haveMin ) { min = mList[ objIndex.min.match + 1 ]; } + else if ( !_haveMoreM ) { min = _d.getMinutes( ); } + else { min = '00'; } + + if ( _haveSec ) { sec = mList[ objIndex.sec.match + 1 ]; } + else if ( !_haveMoreS ) { sec = _d.getSeconds( ); } + else { sec = '00'; } + + if ( _haveMSec ) { msec = mList[ objIndex.msec.match + 1 ]; } + else { msec = '000'; } + + if ( _haveDiffH ) { gmt = mList[ objIndex.diffH.match + 1 ]; } + else if ( _haveDiffM ) { gmt = String( -1 * mList[ objIndex.diffM.match + 1 ] / 60 * 100 ).replace( /^(\d)/ , '+$1' ).replace( /(^[\-+])(\d{3}$)/ , '$10$2' ); } + else { gmt = '+0000'; } + + return new Date( year, month, day, hour, min, sec ); + } + }; + + + return InkDate; + +}); + +/** + * @module Ink.Util.Dumper_1 + * @author inkdev AT sapo.pt + * @version 1 + */ +Ink.createModule('Ink.Util.Dumper', '1', [], function() { + + 'use strict'; + + /** + * Dump/Profiling Utilities + * + * @class Ink.Util.Dumper + * @version 1 + * @static + */ + var Dumper = { + + /** + * Hex code for the 'tab' + * + * @property _tab + * @type {String} + * @private + * @readOnly + * @static + * + */ + _tab: '\xA0\xA0\xA0\xA0', + + /** + * Function that returns the argument passed formatted + * + * @method _formatParam + * @param {Mixed} param + * @return {String} The argument passed formatted + * @private + * @static + */ + _formatParam: function(param) + { + var formated = ''; + + switch(typeof(param)) { + case 'string': + formated = '(string) '+param; + break; + case 'number': + formated = '(number) '+param; + break; + case 'boolean': + formated = '(boolean) '+param; + break; + case 'object': + if(param !== null) { + if(param.constructor === Array) { + formated = 'Array \n{\n' + this._outputFormat(param, 0) + '\n}'; + } else { + formated = 'Object \n{\n' + this._outputFormat(param, 0) + '\n}'; + } + } else { + formated = 'null'; + } + break; + default: + formated = false; + } + + return formated; + }, + + /** + * Function that returns the tabs concatenated + * + * @method _getTabs + * @param {Number} numberOfTabs Number of Tabs + * @return {String} Tabs concatenated + * @private + * @static + */ + _getTabs: function(numberOfTabs) + { + var tabs = ''; + for(var _i = 0; _i < numberOfTabs; _i++) { + tabs += this._tab; + } + return tabs; + }, + + /** + * Function that formats the parameter to display + * + * @method _outputFormat + * @param {Any} param + * @param {Number} dim + * @return {String} The parameter passed formatted to displat + * @private + * @static + */ + _outputFormat: function(param, dim) + { + var formated = ''; + //var _strVal = false; + var _typeof = false; + for(var key in param) { + if(param[key] !== null) { + if(typeof(param[key]) === 'object' && (param[key].constructor === Array || param[key].constructor === Object)) { + if(param[key].constructor === Array) { + _typeof = 'Array'; + } else if(param[key].constructor === Object) { + _typeof = 'Object'; + } + formated += this._tab + this._getTabs(dim) + '[' + key + '] => '+_typeof+'\n'; + formated += this._tab + this._getTabs(dim) + '{\n'; + formated += this._outputFormat(param[key], dim + 1) + this._tab + this._getTabs(dim) + '}\n'; + } else if(param[key].constructor === Function) { + continue; + } else { + formated = formated + this._tab + this._getTabs(dim) + '[' + key + '] => ' + param[key] + '\n'; + } + } else { + formated = formated + this._tab + this._getTabs(dim) + '[' + key + '] => null \n'; + } + } + return formated; + }, + + /** + * Print variable structure. Can be passed an output target + * + * @method printDump + * @param {Object|String|Boolean} param + * @param {optional String|Object} target (can be an element ID or an element) + * @public + * @static + */ + printDump: function(param, target) + { + /*jshint evil:true */ + if(!target || typeof(target) === 'undefined') { + document.write('
              '+this._formatParam(param)+'
              '); + } else { + if(typeof(target) === 'string') { + document.getElementById(target).innerHTML = '
              ' + this._formatParam(param) + '
              '; + } else if(typeof(target) === 'object') { + target.innerHTML = '
              '+this._formatParam(param)+'
              '; + } else { + throw "TARGET must be an element or an element ID"; + } + } + }, + + /** + * Function that returns the variable's structure + * + * @method returnDump + * @param {Object|String|Boolean} param + * @return {String} The variable structure + * @public + * @static + */ + returnDump: function(param) + { + return this._formatParam(param); + }, + + /** + * Function that alerts the variable structure + * + * @method alertDump + * @param {Object|String|Boolean} param + * @public + * @static + */ + alertDump: function(param) + { + window.alert(this._formatParam(param).replace(/()(Array|Object)(<\/b>)/g, "$2")); + }, + + /** + * Print to new window the variable structure + * + * @method windowDump + * @param {Object|String|Boolean} param + * @public + * @static + */ + windowDump: function(param) + { + var dumperwindow = 'dumperwindow_'+(Math.random() * 10000); + var win = window.open('', + dumperwindow, + 'width=400,height=300,left=50,top=50,status,menubar,scrollbars,resizable' + ); + win.document.open(); + win.document.write('
              '+this._formatParam(param)+'
              '); + win.document.close(); + win.focus(); + } + + }; + + return Dumper; + +}); + +/** + * @module Ink.Util.I18n_1 + * @author inkdev AT sapo.pt + */ + +Ink.createModule('Ink.Util.I18n', '1', [], function () { + 'use strict'; + + var pattrText = /\{(?:(\{.*?})|(?:%s:)?(\d+)|(?:%s)?|([\w-]+))}/g; + + var funcOrVal = function( ret , args ) { + if ( typeof ret === 'function' ) { + return ret.apply(this, args); + } else if (typeof ret !== undefined) { + return ret; + } else { + return ''; + } + }; + + /** + * Creates a new internationalization helper object + * + * @class Ink.Util.I18n + * @constructor + * + * @param {Object} dict object mapping language codes (in the form of `pt_PT`, `pt_BR`, `fr`, `en_US`, etc.) to their Object dictionaries. + * @param {Object} dict.(dictionaries...) + * @param {String} [lang='pt_PT'] language code of the target language + * + * @example + * var dictionaries = { // This could come from a JSONP request from your server + * 'pt_PT': { + * 'hello': 'olá', + * 'me': 'eu', + * 'i have a {} for you': 'tenho um {} para ti' // Old syntax using `{%s}` tokens still available + * }, + * 'pt_BR': { + * 'hello': 'oi', + * 'me': 'eu', + * 'i have a {} for you': 'tenho um {} para você' + * } + * }; + * Ink.requireModules(['Ink.Util.I18n_1'], function (I18n) { + * var i18n = new I18n(dictionaries, 'pt_PT'); + * i18n.text('hello'); // returns 'olá' + * i18n.text('i have a {} for you', 'IRON SWORD'); // returns 'tenho um IRON SWORD' para ti + * + * i18n.lang('pt_BR'); // Changes language. pt_BR dictionary is loaded + * i18n.text('hello'); // returns 'oi' + * + * i18n.lang('en_US'); // Missing language. + * i18n.text('hello'); // returns 'hello'. If testMode is on, returns '[hello]' + * }); + * + * @example + * // The old {%s} syntax from libsapo's i18n is still supported + * i18n.text('hello, {%s}!', 'someone'); // -> 'olá, someone!' + */ + var I18n = function( dict , lang , testMode ) { + if ( !( this instanceof I18n ) ) { return new I18n( dict , lang , testMode ); } + + this.reset( ) + .lang( lang ) + .testMode( testMode ) + .append( dict || { } , lang ); + }; + + I18n.prototype = { + reset: function( ) { + this._dicts = [ ]; + this._dict = { }; + this._testMode = false; + this._lang = this._gLang; + + return this; + }, + /** + * Adds translation strings for this helper to use. + * + * @method append + * @param {Object} dict object containing language objects identified by their language code + * @example + * var i18n = new I18n({}, 'pt_PT'); + * i18n.append({'pt_PT': { + * 'sfraggles': 'braggles' + * }}); + * i18n.text('sfraggles') // -> 'braggles' + */ + append: function( dict ) { + this._dicts.push( dict ); + + this._dict = Ink.extendObj(this._dict , dict[ this._lang ] ); + + return this; + }, + /** + * Get the language code + * + * @returns {String} the language code for this instance + * @method {String} lang + */ + /** + * Set the language. If there are more dictionaries available in cache, they will be loaded. + * + * @method lang + * @param lang {String} Language code to set this instance to. + */ + lang: function( lang ) { + if ( !arguments.length ) { return this._lang; } + + if ( lang && this._lang !== lang ) { + this._lang = lang; + + this._dict = { }; + + for ( var i = 0, l = this._dicts.length; i < l; i++ ) { + this._dict = Ink.extendObj( this._dict , this._dicts[ i ][ lang ] || { } ); + } + } + + return this; + }, + /** + * Get the testMode + * + * @returns {Boolean} the testMode for this instance + * @method {Boolean} testMode + */ + /** + * Sets or unsets test mode. In test mode, unknown strings are wrapped + * in `[ ... ]`. This is useful for debugging your application and + * making sure all your translation keys are in place. + * + * @method testMode + * @param {Boolean} bool boolean value to set the test mode to. + */ + testMode: function( bool ) { + if ( !arguments.length ) { return !!this._testMode; } + + if ( bool !== undefined ) { this._testMode = !!bool; } + + return this; + }, + + /** + * Return an arbitrary key from the current language dictionary + * + * @method getKey + * @param {String} key + * @return {Any} The object which happened to be in the current language dictionary on the given key. + * + * @example + * _.getKey('astring'); // -> 'a translated string' + * _.getKey('anobject'); // -> {'a': 'translated object'} + * _.getKey('afunction'); // -> function () { return 'this is a localized function' } + */ + getKey: function( key ) { + var ret; + var gLang = this._gLang; + var lang = this._lang; + + if ( key in this._dict ) { + ret = this._dict[ key ]; + } else { + I18n.lang( lang ); + + ret = this._gDict[ key ]; + + I18n.lang( gLang ); + } + + return ret; + }, + + /** + * Given a translation key, return a translated string, with replaced parameters. + * When a translated string is not available, the original string is returned unchanged. + * + * @method {String} text + * @param {String} str key to look for in i18n dictionary (which is returned verbatim if unknown) + * @param {Object} [namedParms] named replacements. Replaces {named} with values in this object. + * @param {String} [arg1] replacement #1 (replaces first {} and all {1}) + * @param {String} [arg2] replacement #2 (replaces second {} and all {2}) + * @param {String} [argn...] replacement #n (replaces nth {} and all {n}) + * + * @example + * _('Gosto muito de {} e o céu é {}.', 'carros', 'azul'); + * // returns 'Gosto muito de carros e o céu é azul.' + * + * @example + * _('O {1} é {2} como {2} é a cor do {3}.', 'carro', 'azul', 'FCP'); + * // returns 'O carro é azul como azul é o FCP.' + * + * @example + * _('O {person1} dava-se com a {person2}', {person1: 'coisinho', person2: 'coisinha'}); + * // -> 'O coisinho dava-se com a coisinha' + * + * @example + * // This is a bit more complex + * var i18n = make().lang('pt_PT').append({ + * pt_PT: { + * array: [1, 2], + * object: {'a': '-a-', 'b': '-b-'}, + * func: function (a, b) {return '[[' + a + ',' + b + ']]';} + * } + * }); + * i18n.text('array', 0); // -> '1' + * i18n.text('object', 'a'); // -> '-a-' + * i18n.text('func', 'a', 'b'); // -> '[[a,b]]' + */ + text: function( str /*, replacements...*/ ) { + if ( typeof str !== 'string' ) { return; } // Backwards-compat + + var pars = Array.prototype.slice.call( arguments , 1 ); + var idx = 0; + var isObj = typeof pars[ 0 ] === 'object'; + + var original = this.getKey( str ); + if ( original === undefined ) { original = this._testMode ? '[' + str + ']' : str; } + if ( typeof original === 'number' ) { original += ''; } + + if (typeof original === 'string') { + original = original.replace( pattrText , function( m , $1 , $2 , $3 ) { + var ret = + $1 ? $1 : + $2 ? pars[ $2 - ( isObj ? 0 : 1 ) ] : + $3 ? pars[ 0 ][ $3 ] || '' : + pars[ (idx++) + ( isObj ? 1 : 0 ) ]; + return funcOrVal( ret , [idx].concat(pars) ); + }); + return original; + } + + return ( + typeof original === 'function' ? original.apply( this , pars ) : + original instanceof Array ? funcOrVal( original[ pars[ 0 ] ] , pars ) : + typeof original === 'object' ? funcOrVal( original[ pars[ 0 ] ] , pars ) : + ''); + }, + + /** + * Given a singular string, a plural string, and a number, translates + * either the singular or plural string. + * + * @method ntext + * @return {String} + * + * @param {String} strSin word to use when count is 1 + * @param {String} strPlur word to use otherwise + * @param {Number} count number which defines which word to use + * @param [...] extra arguments, to be passed to `text()` + * + * @example + * i18n.ntext('platypus', 'platypuses', 1); // returns 'ornitorrinco' + * i18n.ntext('platypus', 'platypuses', 2); // returns 'ornitorrincos' + * + * @example + * // The "count" argument is passed to text() + * i18n.ntext('{} platypus', '{} platypuses', 1); // returns '1 ornitorrinco' + * i18n.ntext('{} platypus', '{} platypuses', 2); // returns '2 ornitorrincos' + */ + ntext: function( strSin , strPlur , count ) { + var pars = Array.prototype.slice.apply( arguments ); + var original; + + if ( pars.length === 2 && typeof strPlur === 'number' ) { + original = this.getKey( strSin ); + if ( !( original instanceof Array ) ) { return ''; } + + pars.splice( 0 , 1 ); + original = original[ strPlur === 1 ? 0 : 1 ]; + } else { + pars.splice( 0 , 2 ); + original = count === 1 ? strSin : strPlur; + } + + return this.text.apply( this , [ original ].concat( pars ) ); + }, + + /** + * Returns the ordinal suffix of `num` (For example, 1 > 'st', 2 > 'nd', 5 > 'th', ...). + * + * This works by using transforms (in the form of Objects or Functions) passed into the + * function or found in the special key `_ordinals` in the active language dictionary. + * + * @method ordinal + * + * @param {Number} num Input number + * + * @param {Object|Function} [options={}] + * + * Maps for translating. Each of these options' fallback is found in the current + * language's dictionary. The lookup order is the following: + * + * 1. `exceptions` + * 2. `byLastDigit` + * 3. `default` + * + * Each of these may be either an `Object` or a `Function`. If it's a function, it + * is called (with `number` and `digit` for any function except for byLastDigit, + * which is called with the `lastDigit` of the number in question), and if the + * function returns a string, that is used. If it's an object, the property is + * looked up using `[...]`. If what is found is a string, it is used. + * + * @param {Object|Function} [options.byLastDigit={}] + * If the language requires the last digit to be considered, mappings of last digits + * to ordinal suffixes can be created here. + * + * @param {Object|Function} [options.exceptions={}] + * Map unique, special cases to their ordinal suffixes. + * + * @returns {String} Ordinal suffix for `num`. + * + * @example + * var i18n = new I18n({ + * pt_PT: { // 1º, 2º, 3º, 4º, ... + * _ordinal: { // The _ordinals key each translation dictionary is special. + * 'default': "º" // Usually the suffix is "º" in portuguese... + * } + * }, + * fr: { // 1er, 2e, 3e, 4e, ... + * _ordinal: { // The _ordinals key is special. + * 'default': "e", // Usually the suffix is "e" in french... + * exceptions: { + * 1: "er" // ... Except for the number one. + * } + * } + * }, + * en_US: { // 1st, 2nd, 3rd, 4th, ..., 11th, 12th, ... 21st, 22nd... + * _ordinal: { + * 'default': "th",// Usually the digit is "th" in english... + * byLastDigit: { + * 1: "st", // When the last digit is 1, use "th"... + * 2: "nd", // When the last digit is 2, use "nd"... + * 3: "rd" // When the last digit is 3, use "rd"... + * }, + * exceptions: { // But these numbers are special + * 0: "", + * 11: "th", + * 12: "th", + * 13: "th" + * } + * } + * } + * }, 'pt_PT'); + * + * i18n.ordinal(1); // returns 'º' + * i18n.ordinal(2); // returns 'º' + * i18n.ordinal(11); // returns 'º' + * + * i18n.lang('fr'); + * i18n.ordinal(1); // returns 'er' + * i18n.ordinal(2); // returns 'e' + * i18n.ordinal(11); // returns 'e' + * + * i18n.lang('en_US'); + * i18n.ordinal(1); // returns 'st' + * i18n.ordinal(2); // returns 'nd' + * i18n.ordinal(12); // returns 'th' + * i18n.ordinal(22); // returns 'nd' + * i18n.ordinal(3); // returns 'rd' + * i18n.ordinal(4); // returns 'th' + * i18n.ordinal(5); // returns 'th' + * + **/ + ordinal: function( num ) { + if ( num === undefined ) { return ''; } + + var lastDig = +num.toString( ).slice( -1 ); + + var ordDict = this.getKey( '_ordinals' ); + if ( ordDict === undefined ) { return ''; } + + if ( typeof ordDict === 'string' ) { return ordDict; } + + var ret; + + if ( typeof ordDict === 'function' ) { + ret = ordDict( num , lastDig ); + + if ( typeof ret === 'string' ) { return ret; } + } + + if ( 'exceptions' in ordDict ) { + ret = typeof ordDict.exceptions === 'function' ? ordDict.exceptions( num , lastDig ) : + num in ordDict.exceptions ? funcOrVal( ordDict.exceptions[ num ] , [num , lastDig] ) : + undefined; + + if ( typeof ret === 'string' ) { return ret; } + } + + if ( 'byLastDigit' in ordDict ) { + ret = typeof ordDict.byLastDigit === 'function' ? ordDict.byLastDigit( lastDig , num ) : + lastDig in ordDict.byLastDigit ? funcOrVal( ordDict.byLastDigit[ lastDig ] , [lastDig , num] ) : + undefined; + + if ( typeof ret === 'string' ) { return ret; } + } + + if ( 'default' in ordDict ) { + ret = funcOrVal( ordDict['default'] , [ num , lastDig ] ); + + if ( typeof ret === 'string' ) { return ret; } + } + + return ''; + }, + + /** + * Returns an alias to `text()`, for convenience. The resulting function is + * traditionally assigned to "_". + * + * @method alias + * @returns {Function} an alias to `text()`. You can also access the rest of the translation API through this alias. + * + * @example + * var i18n = new I18n({ + * 'pt_PT': { + * 'hi': 'olá', + * '{} day': '{} dia', + * '{} days': '{} dias', + * '_ordinals': { + * 'default': 'º' + * } + * } + * }, 'pt_PT'); + * var _ = i18n.alias(); + * _('hi'); // -> 'olá' + * _('{} days', 3); // -> '3 dias' + * _.ntext('{} day', '{} days', 2); // -> '2 dias' + * _.ntext('{} day', '{} days', 1); // -> '1 dia' + * _.ordinal(3); // -> 'º' + */ + alias: function( ) { + var ret = Ink.bind( I18n.prototype.text , this ); + ret.ntext = Ink.bind( I18n.prototype.ntext , this ); + ret.append = Ink.bind( I18n.prototype.append , this ); + ret.ordinal = Ink.bind( I18n.prototype.ordinal , this ); + ret.testMode = Ink.bind( I18n.prototype.testMode , this ); + + return ret; + } + }; + + /** + * @static + * @method I18n.reset + * + * Reset I18n global state (global dictionaries, and default language for instances) + **/ + I18n.reset = function( ) { + I18n.prototype._gDicts = [ ]; + I18n.prototype._gDict = { }; + I18n.prototype._gLang = 'pt_PT'; + }; + I18n.reset( ); + + /** + * @static + * @method I18n.append + * + * @param dict {Object} Dictionary to be added + * @param lang {String} Language to be added to + * + * Add a dictionary to be used in all I18n instances for the corresponding language + */ + I18n.append = function( dict , lang ) { + if ( lang ) { + if ( !( lang in dict ) ) { + var obj = { }; + + obj[ lang ] = dict; + + dict = obj; + } + + if ( lang !== I18n.prototype._gLang ) { I18n.lang( lang ); } + } + + I18n.prototype._gDicts.push( dict ); + + Ink.extendObj( I18n.prototype._gDict , dict[ I18n.prototype._gLang ] ); + }; + + /** + * @static + * @method I18n.lang + * + * @param lang {String} String in the format `"pt_PT"`, `"fr"`, etc. + * + * Set global default language of I18n instances to `lang` + */ + /** + * @static + * @method I18n.lang + * + * Get the current default language of I18n instances. + * + * @return {String} language code + */ + I18n.lang = function( lang ) { + if ( !arguments.length ) { return I18n.prototype._gLang; } + + if ( lang && I18n.prototype._gLang !== lang ) { + I18n.prototype._gLang = lang; + + I18n.prototype._gDict = { }; + + for ( var i = 0, l = I18n.prototype._gDicts.length; i < l; i++ ) { + Ink.extendObj( I18n.prototype._gDict , I18n.prototype._gDicts[ i ][ lang ] || { } ); + } + } + }; + + return I18n; +}); + +/** + * @module Ink.Util.Json_1 + * + * @author inkdev AT sapo.pt + */ + +Ink.createModule('Ink.Util.Json', '1', [], function() { + 'use strict'; + + var function_call = Function.prototype.call; + var cx = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g; + + function twoDigits(n) { + var r = '' + n; + if (r.length === 1) { + return '0' + r; + } else { + return r; + } + } + + var dateToISOString = Date.prototype.toISOString ? + Ink.bind(function_call, Date.prototype.toISOString) : + function(date) { + // Adapted from https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString + return date.getUTCFullYear() + + '-' + twoDigits( date.getUTCMonth() + 1 ) + + '-' + twoDigits( date.getUTCDate() ) + + 'T' + twoDigits( date.getUTCHours() ) + + ':' + twoDigits( date.getUTCMinutes() ) + + ':' + twoDigits( date.getUTCSeconds() ) + + '.' + String( (date.getUTCMilliseconds()/1000).toFixed(3) ).slice( 2, 5 ) + + 'Z'; + }; + + /** + * Use this class to convert JSON strings to JavaScript objects + * `(Json.parse)` and also to do the opposite operation `(Json.stringify)`. + * Internally, the standard JSON implementation is used if available + * Otherwise, the functions mimic the standard implementation. + * + * Here's how to produce JSON from an existing object: + * + * Ink.requireModules(['Ink.Util.Json_1'], function (Json) { + * var obj = { + * key1: 'value1', + * key2: 'value2', + * keyArray: ['arrayValue1', 'arrayValue2', 'arrayValue3'] + * }; + * Json.stringify(obj); // The above object as a JSON string + * }); + * + * And here is how to parse JSON: + * + * Ink.requireModules(['Ink.Util.Json_1'], function (Json) { + * var source = '{"key": "value", "array": [true, null, false]}'; + * Json.parse(source); // The above JSON string as an object + * }); + * @class Ink.Util.Json + * @static + * + */ + var InkJson = { + _nativeJSON: window.JSON || null, + + _convertToUnicode: false, + + // Escape characters so as to embed them in JSON strings + _escape: function (theString) { + var _m = { '\b': '\\b', '\t': '\\t', '\n': '\\n', '\f': '\\f', '\r': '\\r', '"': '\\"', '\\': '\\\\' }; + + if (/["\\\x00-\x1f]/.test(theString)) { + theString = theString.replace(/([\x00-\x1f\\"])/g, function(a, b) { + var c = _m[b]; + if (c) { + return c; + } + c = b.charCodeAt(); + return '\\u00' + Math.floor(c / 16).toString(16) + (c % 16).toString(16); + }); + } + + return theString; + }, + + // A character conversion map + _toUnicode: function (theString) + { + if(!this._convertToUnicode) { + return this._escape(theString); + } else { + var unicodeString = ''; + var inInt = false; + var theUnicode = false; + var i = 0; + var total = theString.length; + while(i < total) { + inInt = theString.charCodeAt(i); + if( (inInt >= 32 && inInt <= 126) || + //(inInt >= 48 && inInt <= 57) || + //(inInt >= 65 && inInt <= 90) || + //(inInt >= 97 && inInt <= 122) || + inInt === 8 || + inInt === 9 || + inInt === 10 || + inInt === 12 || + inInt === 13 || + inInt === 32 || + inInt === 34 || + inInt === 47 || + inInt === 58 || + inInt === 92) { + + if(inInt === 34 || inInt === 92 || inInt === 47) { + theUnicode = '\\'+theString.charAt(i); + } else if(inInt === 8) { + theUnicode = '\\b'; + } else if(inInt === 9) { + theUnicode = '\\t'; + } else if(inInt === 10) { + theUnicode = '\\n'; + } else if(inInt === 12) { + theUnicode = '\\f'; + } else if(inInt === 13) { + theUnicode = '\\r'; + } else { + theUnicode = theString.charAt(i); + } + } else { + if(this._convertToUnicode) { + theUnicode = theString.charCodeAt(i).toString(16)+''.toUpperCase(); + while (theUnicode.length < 4) { + theUnicode = '0' + theUnicode; + } + theUnicode = '\\u' + theUnicode; + } else { + theUnicode = theString.charAt(i); + } + } + unicodeString += theUnicode; + + i++; + } + + return unicodeString; + } + + }, + + _stringifyValue: function(param) { + if (typeof param === 'string') { + return '"' + this._toUnicode(param) + '"'; + } else if (typeof param === 'number' && (isNaN(param) || !isFinite(param))) { // Unusable numbers go null + return 'null'; + } else if (typeof param === 'undefined' || param === null) { // And so does undefined + return 'null'; + } else if (typeof param.toJSON === 'function') { + var t = param.toJSON(); + if (typeof t === 'string') { + return '"' + this._escape(t) + '"'; + } else { + return this._escape(t.toString()); + } + } else if (typeof param === 'number' || typeof param === 'boolean') { // These ones' toString methods return valid JSON. + return '' + param; + } else if (typeof param === 'function') { + return 'null'; // match JSON.stringify + } else if (param.constructor === Date) { + return '"' + this._escape(dateToISOString(param)) + '"'; + } else if (param.constructor === Array) { + var arrayString = ''; + for (var i = 0, len = param.length; i < len; i++) { + if (i > 0) { + arrayString += ','; + } + arrayString += this._stringifyValue(param[i]); + } + return '[' + arrayString + ']'; + } else { // Object + var objectString = ''; + for (var k in param) { + if ({}.hasOwnProperty.call(param, k)) { + if (objectString !== '') { + objectString += ','; + } + objectString += '"' + this._escape(k) + '": ' + this._stringifyValue(param[k]); + } + } + return '{' + objectString + '}'; + } + }, + + /** + * serializes a JSON object into a string. + * + * @method stringify + * @param {Object} input Data to be serialized into JSON + * @param {Boolean} convertToUnicode When `true`, converts string contents to unicode \uXXXX + * @return {String} serialized string + * + * @example + * Json.stringify({a:1.23}); // -> string: '{"a": 1.23}' + */ + stringify: function(input, convertToUnicode) { + this._convertToUnicode = !!convertToUnicode; + if(!this._convertToUnicode && this._nativeJSON) { + return this._nativeJSON.stringify(input); + } + return this._stringifyValue(input); // And recurse. + }, + + /** + * @method parse + * @param text {String} Input string + * @param reviver {Function} Function receiving `(key, value)`, and `this`=(containing object), used to walk objects. + * + * @example + * Simple example: + * + * Json.parse('{"a": "3","numbers":false}', + * function (key, value) { + * if (!this.numbers && key === 'a') { + * return "NO NUMBERS"; + * } else { + * return value; + * } + * }); // -> object: {a: 'NO NUMBERS', numbers: false} + */ + /* From https://github.com/douglascrockford/JSON-js/blob/master/json.js */ + parse: function (text, reviver) { + /*jshint evil:true*/ + +// The parse method takes a text and an optional reviver function, and returns +// a JavaScript value if the text is a valid JSON text. + + var j; + + function walk(holder, key) { + +// The walk method is used to recursively walk the resulting structure so +// that modifications can be made. + + var k, v, value = holder[key]; + if (value && typeof value === 'object') { + for (k in value) { + if (Object.prototype.hasOwnProperty.call(value, k)) { + v = walk(value, k); + if (v !== undefined) { + value[k] = v; + } else { + delete value[k]; + } + } + } + } + return reviver.call(holder, key, value); + } + + +// Parsing happens in four stages. In the first stage, we replace certain +// Unicode characters with escape sequences. JavaScript handles many characters +// incorrectly, either silently deleting them, or treating them as line endings. + + text = String(text); + cx.lastIndex = 0; + if (cx.test(text)) { + text = text.replace(cx, function (a) { + return '\\u' + + ('0000' + a.charCodeAt(0).toString(16)).slice(-4); + }); + } + +// In the second stage, we run the text against regular expressions that look +// for non-JSON patterns. We are especially concerned with '()' and 'new' +// because they can cause invocation, and '=' because it can cause mutation. +// But just to be safe, we want to reject all unexpected forms. + +// We split the second stage into 4 regexp operations in order to work around +// crippling inefficiencies in IE's and Safari's regexp engines. First we +// replace the JSON backslash pairs with '@' (a non-JSON character). Second, we +// replace all simple value tokens with ']' characters. Third, we delete all +// open brackets that follow a colon or comma or that begin the text. Finally, +// we look to see that the remaining characters are only whitespace or ']' or +// ',' or ':' or '{' or '}'. If that is so, then the text is safe for eval. + + if (/^[\],:{}\s]*$/ + .test(text.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@') + .replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']') + .replace(/(?:^|:|,)(?:\s*\[)+/g, ''))) { + +// In the third stage we use the eval function to compile the text into a +// JavaScript structure. The '{' operator is subject to a syntactic ambiguity +// in JavaScript: it can begin a block or an object literal. We wrap the text +// in parens to eliminate the ambiguity. + + j = eval('(' + text + ')'); + +// In the optional fourth stage, we recursively walk the new structure, passing +// each name/value pair to a reviver function for possible transformation. + + return typeof reviver === 'function' ? + walk({'': j}, '') : + j; + } + +// If the text is not JSON parseable, then a SyntaxError is thrown. + + throw new SyntaxError('JSON.parse'); + } + }; + + return InkJson; +}); + +/** + * @module Ink.Util.String_1 + * @author inkdev AT sapo.pt + * @version 1 + */ +Ink.createModule('Ink.Util.String', '1', [], function() { + + 'use strict'; + + /** + * String Manipulation Utilities + * + * @class Ink.Util.String + * @version 1 + * @static + */ + var InkUtilString = { + + /** + * List of special chars + * + * @property _chars + * @type {Array} + * @private + * @readOnly + * @static + */ + _chars: ['&','à','á','â','ã','ä','å','æ','ç','è','é', + 'ê','ë','ì','í','î','ï','ð','ñ','ò','ó','ô', + 'õ','ö','ø','ù','ú','û','ü','ý','þ','ÿ','À', + 'Á','Â','Ã','Ä','Å','Æ','Ç','È','É','Ê','Ë', + 'Ì','Í','Î','Ï','Ð','Ñ','Ò','Ó','Ô','Õ','Ö', + 'Ø','Ù','Ú','Û','Ü','Ý','Þ','€','\"','ß','<', + '>','¢','£','¤','¥','¦','§','¨','©','ª','«', + '¬','\xad','®','¯','°','±','²','³','´','µ','¶', + '·','¸','¹','º','»','¼','½','¾'], + + /** + * List of the special characters' html entities + * + * @property _entities + * @type {Array} + * @private + * @readOnly + * @static + */ + _entities: ['amp','agrave','aacute','acirc','atilde','auml','aring', + 'aelig','ccedil','egrave','eacute','ecirc','euml','igrave', + 'iacute','icirc','iuml','eth','ntilde','ograve','oacute', + 'ocirc','otilde','ouml','oslash','ugrave','uacute','ucirc', + 'uuml','yacute','thorn','yuml','Agrave','Aacute','Acirc', + 'Atilde','Auml','Aring','AElig','Ccedil','Egrave','Eacute', + 'Ecirc','Euml','Igrave','Iacute','Icirc','Iuml','ETH','Ntilde', + 'Ograve','Oacute','Ocirc','Otilde','Ouml','Oslash','Ugrave', + 'Uacute','Ucirc','Uuml','Yacute','THORN','euro','quot','szlig', + 'lt','gt','cent','pound','curren','yen','brvbar','sect','uml', + 'copy','ordf','laquo','not','shy','reg','macr','deg','plusmn', + 'sup2','sup3','acute','micro','para','middot','cedil','sup1', + 'ordm','raquo','frac14','frac12','frac34'], + + /** + * List of accented chars + * + * @property _accentedChars + * @type {Array} + * @private + * @readOnly + * @static + */ + _accentedChars:['à','á','â','ã','ä','å', + 'è','é','ê','ë', + 'ì','í','î','ï', + 'ò','ó','ô','õ','ö', + 'ù','ú','û','ü', + 'ç','ñ', + 'À','Á','Â','Ã','Ä','Å', + 'È','É','Ê','Ë', + 'Ì','Í','Î','Ï', + 'Ò','Ó','Ô','Õ','Ö', + 'Ù','Ú','Û','Ü', + 'Ç','Ñ'], + + /** + * List of the accented chars (above), but without the accents + * + * @property _accentedRemovedChars + * @type {Array} + * @private + * @readOnly + * @static + */ + _accentedRemovedChars:['a','a','a','a','a','a', + 'e','e','e','e', + 'i','i','i','i', + 'o','o','o','o','o', + 'u','u','u','u', + 'c','n', + 'A','A','A','A','A','A', + 'E','E','E','E', + 'I','I','I','I', + 'O','O','O','O','O', + 'U','U','U','U', + 'C','N'], + /** + * Object that contains the basic HTML unsafe chars, as keys, and their HTML entities as values + * + * @property _htmlUnsafeChars + * @type {Object} + * @private + * @readOnly + * @static + */ + _htmlUnsafeChars:{'<':'<','>':'>','&':'&','"':'"',"'":'''}, + + /** + * Convert first letter of a word to upper case
              + * If param as more than one word, it converts first letter of all words that have more than 2 letters + * + * @method ucFirst + * @param {String} string + * @param {Boolean} [firstWordOnly=false] capitalize only first word. + * @return {String} string camel cased + * @public + * @static + * + * @example + * InkString.ucFirst('hello world'); // -> 'Hello World' + * InkString.ucFirst('hello world', true); // -> 'Hello world' + */ + ucFirst: function(string, firstWordOnly) { + var replacer = firstWordOnly ? /(^|\s)(\w)(\S{2,})/ : /(^|\s)(\w)(\S{2,})/g; + return string ? String(string).replace(replacer, function(_, $1, $2, $3){ + return $1 + $2.toUpperCase() + $3.toLowerCase(); + }) : string; + }, + + /** + * Remove spaces and new line from biggin and ends of string + * + * @method trim + * @param {String} string + * @return {String} string trimmed + * @public + * @static + */ + trim: function(string) + { + if (typeof string === 'string') { + return string.replace(/^\s+|\s+$|\n+$/g, ''); + } + return string; + }, + + /** + * Removes HTML tags of string + * + * @method stripTags + * @param {String} string + * @param {String} allowed + * @return {String} String stripped from HTML tags, leaving only the allowed ones (if any) + * @public + * @static + * @example + * + */ + stripTags: function(string, allowed) + { + if (allowed && typeof allowed === 'string') { + var aAllowed = InkUtilString.trim(allowed).split(','); + var aNewAllowed = []; + var cleanedTag = false; + for(var i=0; i < aAllowed.length; i++) { + if(InkUtilString.trim(aAllowed[i]) !== '') { + cleanedTag = InkUtilString.trim(aAllowed[i].replace(/(<|\>)/g, '').replace(/\s/, '')); + aNewAllowed.push('(<'+cleanedTag+'\\s[^>]+>|<(\\s|\\/)?(\\s|\\/)?'+cleanedTag+'>)'); + } + } + var strAllowed = aNewAllowed.join('|'); + var reAllowed = new RegExp(strAllowed, "i"); + + var aFoundTags = string.match(new RegExp("<[^>]*>", "g")); + + for(var j=0; j < aFoundTags.length; j++) { + if(!aFoundTags[j].match(reAllowed)) { + string = string.replace((new RegExp(aFoundTags[j], "gm")), ''); + } + } + return string; + } else { + return string.replace(/<[^\>]+\>/g, ''); + } + }, + + /** + * Convert listed characters to HTML entities + * + * @method htmlEntitiesEncode + * @param {String} string + * @return {String} string encoded + * @public + * @static + */ + htmlEntitiesEncode: function(string) + { + if (string && string.replace) { + var re = false; + for (var i = 0; i < InkUtilString._chars.length; i++) { + re = new RegExp(InkUtilString._chars[i], "gm"); + string = string.replace(re, '&' + InkUtilString._entities[i] + ';'); + } + } + return string; + }, + + /** + * Convert listed HTML entities to character + * + * @method htmlEntitiesDecode + * @param {String} string + * @return {String} string decoded + * @public + * @static + */ + htmlEntitiesDecode: function(string) + { + if (string && string.replace) { + var re = false; + for (var i = 0; i < InkUtilString._entities.length; i++) { + re = new RegExp("&"+InkUtilString._entities[i]+";", "gm"); + string = string.replace(re, InkUtilString._chars[i]); + } + string = string.replace(/&#[^;]+;?/g, function($0){ + if ($0.charAt(2) === 'x') { + return String.fromCharCode(parseInt($0.substring(3), 16)); + } + else { + return String.fromCharCode(parseInt($0.substring(2), 10)); + } + }); + } + return string; + }, + + /** + * Encode a string to UTF8 + * + * @method utf8Encode + * @param {String} string + * @return {String} string utf8 encoded + * @public + * @static + */ + utf8Encode: function(string) { + /*jshint bitwise:false*/ + string = string.replace(/\r\n/g,"\n"); + var utfstring = ""; + + for (var n = 0; n < string.length; n++) { + + var c = string.charCodeAt(n); + + if (c < 128) { + utfstring += String.fromCharCode(c); + } + else if((c > 127) && (c < 2048)) { + utfstring += String.fromCharCode((c >> 6) | 192); + utfstring += String.fromCharCode((c & 63) | 128); + } + else { + utfstring += String.fromCharCode((c >> 12) | 224); + utfstring += String.fromCharCode(((c >> 6) & 63) | 128); + utfstring += String.fromCharCode((c & 63) | 128); + } + + } + return utfstring; + }, + + /** + * Make a string shorter without cutting words + * + * @method shortString + * @param {String} str + * @param {Number} n - number of chars of the short string + * @return {String} string shortened + * @public + * @static + */ + shortString: function(str,n) { + var words = str.split(' '); + var resultstr = ''; + for(var i = 0; i < words.length; i++ ){ + if((resultstr + words[i] + ' ').length>=n){ + resultstr += '…'; + break; + } + resultstr += words[i] + ' '; + } + return resultstr; + }, + + /** + * Truncates a string, breaking words and adding ... at the end + * + * @method truncateString + * @param {String} str + * @param {Number} length - length limit for the string. String will be + * at most this big, ellipsis included. + * @return {String} string truncated + * @public + * @static + */ + truncateString: function(str, length) { + if(str.length - 1 > length) { + return str.substr(0, length - 1) + "\u2026"; + } else { + return str; + } + }, + + /** + * Decode a string from UTF8 + * + * @method utf8Decode + * @param {String} string + * @return {String} string utf8 decoded + * @public + * @static + */ + utf8Decode: function(utfstring) { + /*jshint bitwise:false*/ + var string = ""; + var i = 0, c = 0, c2 = 0, c3 = 0; + + while ( i < utfstring.length ) { + + c = utfstring.charCodeAt(i); + + if (c < 128) { + string += String.fromCharCode(c); + i++; + } + else if((c > 191) && (c < 224)) { + c2 = utfstring.charCodeAt(i+1); + string += String.fromCharCode(((c & 31) << 6) | (c2 & 63)); + i += 2; + } + else { + c2 = utfstring.charCodeAt(i+1); + c3 = utfstring.charCodeAt(i+2); + string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63)); + i += 3; + } + + } + return string; + }, + + /** + * Convert all accented chars to char without accent. + * + * @method removeAccentedChars + * @param {String} string + * @return {String} string without accented chars + * @public + * @static + */ + removeAccentedChars: function(string) + { + var newString = string; + var re = false; + for (var i = 0; i < InkUtilString._accentedChars.length; i++) { + re = new RegExp(InkUtilString._accentedChars[i], "gm"); + newString = newString.replace(re, '' + InkUtilString._accentedRemovedChars[i] + ''); + } + return newString; + }, + + /** + * Count the number of occurrences of a specific needle in a haystack + * + * @method substrCount + * @param {String} haystack + * @param {String} needle + * @return {Number} Number of occurrences + * @public + * @static + */ + substrCount: function(haystack,needle) + { + return haystack ? haystack.split(needle).length - 1 : 0; + }, + + /** + * Eval a JSON string to a JS object + * + * @method evalJSON + * @param {String} strJSON + * @param {Boolean} sanitize + * @return {Object} JS Object + * @public + * @static + */ + evalJSON: function(strJSON, sanitize) { + /* jshint evil:true */ + if( (typeof sanitize === 'undefined' || sanitize === null) || InkUtilString.isJSON(strJSON)) { + try { + if(typeof(JSON) !== "undefined" && typeof(JSON.parse) !== 'undefined'){ + return JSON.parse(strJSON); + } + return eval('('+strJSON+')'); + } catch(e) { + throw new Error('ERROR: Bad JSON string...'); + } + } + }, + + /** + * Checks if a string is a valid JSON object (string encoded) + * + * @method isJSON + * @param {String} str + * @return {Boolean} + * @public + * @static + */ + isJSON: function(str) + { + str = str.replace(/\\./g, '@').replace(/"[^"\\\n\r]*"/g, ''); + return (/^[,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]*$/).test(str); + }, + + /** + * Escapes unsafe html chars to their entities + * + * @method htmlEscapeUnsafe + * @param {String} str String to escape + * @return {String} Escaped string + * @public + * @static + */ + htmlEscapeUnsafe: function(str){ + var chars = InkUtilString._htmlUnsafeChars; + return str !== null ? String(str).replace(/[<>&'"]/g,function(c){return chars[c];}) : str; + }, + + /** + * Normalizes whitespace in string. + * String is trimmed and sequences of many + * Whitespaces are collapsed. + * + * @method normalizeWhitespace + * @param {String} str String to normalize + * @return {String} string normalized + * @public + * @static + */ + normalizeWhitespace: function(str){ + return str !== null ? InkUtilString.trim(String(str).replace(/\s+/g,' ')) : str; + }, + + /** + * Converts string to unicode + * + * @method toUnicode + * @param {String} str + * @return {String} string unicoded + * @public + * @static + */ + toUnicode: function(str) { + if (typeof str === 'string') { + var unicodeString = ''; + var inInt = false; + var theUnicode = false; + var total = str.length; + var i=0; + + while(i < total) + { + inInt = str.charCodeAt(i); + if( (inInt >= 32 && inInt <= 126) || + inInt === 8 || + inInt === 9 || + inInt === 10 || + inInt === 12 || + inInt === 13 || + inInt === 32 || + inInt === 34 || + inInt === 47 || + inInt === 58 || + inInt === 92) { + + /* + if(inInt == 34 || inInt == 92 || inInt == 47) { + theUnicode = '\\'+str.charAt(i); + } else { + } + */ + if(inInt === 8) { + theUnicode = '\\b'; + } else if(inInt === 9) { + theUnicode = '\\t'; + } else if(inInt === 10) { + theUnicode = '\\n'; + } else if(inInt === 12) { + theUnicode = '\\f'; + } else if(inInt === 13) { + theUnicode = '\\r'; + } else { + theUnicode = str.charAt(i); + } + } else { + theUnicode = str.charCodeAt(i).toString(16)+''.toUpperCase(); + while (theUnicode.length < 4) { + theUnicode = '0' + theUnicode; + } + theUnicode = '\\u' + theUnicode; + } + unicodeString += theUnicode; + + i++; + } + return unicodeString; + } + }, + + /** + * Escapes a unicode character. returns \xXX if hex smaller than 0x100, otherwise \uXXXX + * + * @method escape + * @param {String} c Char + * @return {String} escaped char + * @public + * @static + */ + + /** + * @param {String} c char + */ + escape: function(c) { + var hex = (c).charCodeAt(0).toString(16).split(''); + if (hex.length < 3) { + while (hex.length < 2) { hex.unshift('0'); } + hex.unshift('x'); + } + else { + while (hex.length < 4) { hex.unshift('0'); } + hex.unshift('u'); + } + + hex.unshift('\\'); + return hex.join(''); + }, + + /** + * Unescapes a unicode character escape sequence + * + * @method unescape + * @param {String} es Escape sequence + * @return {String} String des-unicoded + * @public + * @static + */ + unescape: function(es) { + var idx = es.lastIndexOf('0'); + idx = idx === -1 ? 2 : Math.min(idx, 2); + //console.log(idx); + var hexNum = es.substring(idx); + //console.log(hexNum); + var num = parseInt(hexNum, 16); + return String.fromCharCode(num); + }, + + /** + * Escapes a string to unicode characters + * + * @method escapeText + * @param {String} txt + * @param {Array} [whiteList] + * @return {String} Escaped to Unicoded string + * @public + * @static + */ + escapeText: function(txt, whiteList) { + if (whiteList === undefined) { + whiteList = ['[', ']', '\'', ',']; + } + var txt2 = []; + var c, C; + for (var i = 0, f = txt.length; i < f; ++i) { + c = txt[i]; + C = c.charCodeAt(0); + if (C < 32 || C > 126 && whiteList.indexOf(c) === -1) { + c = InkUtilString.escape(c); + } + txt2.push(c); + } + return txt2.join(''); + }, + + /** + * Regex to check escaped strings + * + * @property escapedCharRegex + * @type {Regex} + * @public + * @readOnly + * @static + */ + escapedCharRegex: /(\\x[0-9a-fA-F]{2})|(\\u[0-9a-fA-F]{4})/g, + + /** + * Unescapes a string + * + * @method unescapeText + * @param {String} txt + * @return {String} Unescaped string + * @public + * @static + */ + unescapeText: function(txt) { + /*jshint boss:true */ + var m; + while (m = InkUtilString.escapedCharRegex.exec(txt)) { + m = m[0]; + txt = txt.replace(m, InkUtilString.unescape(m)); + InkUtilString.escapedCharRegex.lastIndex = 0; + } + return txt; + }, + + /** + * Compares two strings + * + * @method strcmp + * @param {String} str1 + * @param {String} str2 + * @return {Number} + * @public + * @static + */ + strcmp: function(str1, str2) { + return ((str1 === str2) ? 0 : ((str1 > str2) ? 1 : -1)); + }, + + /** + * Splits long string into string of, at most, maxLen (that is, all but last have length maxLen, + * last can measure maxLen or less) + * + * @method packetize + * @param {String} string string to divide + * @param {Number} maxLen packet size + * @return {Array} string divided + * @public + * @static + */ + packetize: function(str, maxLen) { + var len = str.length; + var parts = new Array( Math.ceil(len / maxLen) ); + var chars = str.split(''); + var sz, i = 0; + while (len) { + sz = Math.min(maxLen, len); + parts[i++] = chars.splice(0, sz).join(''); + len -= sz; + } + return parts; + } + }; + + return InkUtilString; + +}); + +/** + * @module Ink.Util.Url_1 + * @author inkdev AT sapo.pt + * @version 1 + */ +Ink.createModule('Ink.Util.Url', '1', [], function() { + + 'use strict'; + + /** + * Utility functions to use with URLs + * + * @class Ink.Util.Url + * @version 1 + * @static + */ + var Url = { + + /** + * Auxiliary string for encoding + * + * @property _keyStr + * @type {String} + * @readOnly + * @private + */ + _keyStr : 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=', + + + /** + * Get current URL of page + * + * @method getUrl + * @return {String} Current URL + * @public + * @static + * @example + * Ink.requireModules(['Ink.Util.Url_1'], function( InkUrl ){ + * console.log( InkUrl.getUrl() ); // Will return it's window URL + * }); + */ + getUrl: function() + { + return window.location.href; + }, + + /** + * Generates an uri with query string based on the parameters object given + * + * @method genQueryString + * @param {String} uri + * @param {Object} params + * @return {String} URI with query string set + * @public + * @static + * @example + * Ink.requireModules(['Ink.Util.Url_1'], function( InkUrl ){ + * var queryString = InkUrl.genQueryString( 'http://www.sapo.pt/', { + * 'param1': 'valueParam1', + * 'param2': 'valueParam2' + * }); + * + * console.log( queryString ); // Result: http://www.sapo.pt/?param1=valueParam1¶m2=valueParam2 + * }); + */ + genQueryString: function(uri, params) { + var hasQuestionMark = uri.indexOf('?') !== -1; + var sep, pKey, pValue, parts = [uri]; + + for (pKey in params) { + if (params.hasOwnProperty(pKey)) { + if (!hasQuestionMark) { + sep = '?'; + hasQuestionMark = true; + } else { + sep = '&'; + } + pValue = params[pKey]; + if (typeof pValue !== 'number' && !pValue) { + pValue = ''; + } + parts = parts.concat([sep, encodeURIComponent(pKey), '=', encodeURIComponent(pValue)]); + } + } + + return parts.join(''); + }, + + /** + * Get query string of current or passed URL + * + * @method getQueryString + * @param {String} [str] URL String. When not specified it uses the current URL. + * @return {Object} Key-Value object with the pairs variable: value + * @public + * @static + * @example + * Ink.requireModules(['Ink.Util.Url_1'], function( InkUrl ){ + * var queryStringParams = InkUrl.getQueryString( 'http://www.sapo.pt/?var1=valueVar1&var2=valueVar2' ); + * console.log( queryStringParams ); + * // Result: + * // { + * // var1: 'valueVar1', + * // var2: 'valueVar2' + * // } + * }); + */ + getQueryString: function(str) + { + var url; + if(str && typeof(str) !== 'undefined') { + url = str; + } else { + url = this.getUrl(); + } + var aParams = {}; + if(url.match(/\?(.+)/i)) { + var queryStr = url.replace(/^(.*)\?([^\#]+)(\#(.*))?/g, "$2"); + if(queryStr.length > 0) { + var aQueryStr = queryStr.split(/[;&]/); + for(var i=0; i < aQueryStr.length; i++) { + var pairVar = aQueryStr[i].split('='); + aParams[decodeURIComponent(pairVar[0])] = (typeof(pairVar[1]) !== 'undefined' && pairVar[1]) ? decodeURIComponent(pairVar[1]) : false; + } + } + } + return aParams; + }, + + /** + * Get URL hash + * + * @method getAnchor + * @param {String} [str] URL String. If not set, it will get the current URL. + * @return {String|Boolean} Hash in the URL. If there's no hash, returns false. + * @public + * @static + * @example + * Ink.requireModules(['Ink.Util.Url_1'], function( InkUrl ){ + * var anchor = InkUrl.getAnchor( 'http://www.sapo.pt/page.php#TEST' ); + * console.log( anchor ); // Result: TEST + * }); + */ + getAnchor: function(str) + { + var url; + if(str && typeof(str) !== 'undefined') { + url = str; + } else { + url = this.getUrl(); + } + var anchor = false; + if(url.match(/#(.+)/)) { + anchor = url.replace(/([^#]+)#(.*)/, "$2"); + } + return anchor; + }, + + /** + * Get anchor string of current or passed URL + * + * @method getAnchorString + * @param {String} [string] If not provided it uses the current URL. + * @return {Object} Returns a key-value object of the 'variables' available in the hashtag of the URL + * @public + * @static + * @example + * Ink.requireModules(['Ink.Util.Url_1'], function( InkUrl ){ + * var hashParams = InkUrl.getAnchorString( 'http://www.sapo.pt/#var1=valueVar1&var2=valueVar2' ); + * console.log( hashParams ); + * // Result: + * // { + * // var1: 'valueVar1', + * // var2: 'valueVar2' + * // } + * }); + */ + getAnchorString: function(string) + { + var url; + if(string && typeof(string) !== 'undefined') { + url = string; + } else { + url = this.getUrl(); + } + var aParams = {}; + if(url.match(/#(.+)/i)) { + var anchorStr = url.replace(/^([^#]+)#(.*)?/g, "$2"); + if(anchorStr.length > 0) { + var aAnchorStr = anchorStr.split(/[;&]/); + for(var i=0; i < aAnchorStr.length; i++) { + var pairVar = aAnchorStr[i].split('='); + aParams[decodeURIComponent(pairVar[0])] = (typeof(pairVar[1]) !== 'undefined' && pairVar[1]) ? decodeURIComponent(pairVar[1]) : false; + } + } + } + return aParams; + }, + + + /** + * Parse passed URL + * + * @method parseUrl + * @param {String} url URL to be parsed + * @return {Object} Parsed URL as a key-value object. + * @public + * @static + * @example + * Ink.requireModules(['Ink.Util.Url_1'], function( InkUrl ){ + * var parsedURL = InkUrl.parseUrl( 'http://www.sapo.pt/index.html?var1=value1#anchor' ) + * console.log( parsedURL ); + * // Result: + * // { + * // 'scheme' => 'http', + * // 'host' => 'www.sapo.pt', + * // 'path' => '/index.html', + * // 'query' => 'var1=value1', + * // 'fragment' => 'anchor' + * // } + * }); + * + */ + parseUrl: function(url) { + var aURL = {}; + if(url && typeof url === 'string') { + if(url.match(/^([^:]+):\/\//i)) { + var re = /^([^:]+):\/\/([^\/]*)\/?([^\?#]*)\??([^#]*)#?(.*)/i; + if(url.match(re)) { + aURL.scheme = url.replace(re, "$1"); + aURL.host = url.replace(re, "$2"); + aURL.path = '/'+url.replace(re, "$3"); + aURL.query = url.replace(re, "$4") || false; + aURL.fragment = url.replace(re, "$5") || false; + } + } else { + var re1 = new RegExp("^([^\\?]+)\\?([^#]+)#(.*)", "i"); + var re2 = new RegExp("^([^\\?]+)\\?([^#]+)#?", "i"); + var re3 = new RegExp("^([^\\?]+)\\??", "i"); + if(url.match(re1)) { + aURL.scheme = false; + aURL.host = false; + aURL.path = url.replace(re1, "$1"); + aURL.query = url.replace(re1, "$2"); + aURL.fragment = url.replace(re1, "$3"); + } else if(url.match(re2)) { + aURL.scheme = false; + aURL.host = false; + aURL.path = url.replace(re2, "$1"); + aURL.query = url.replace(re2, "$2"); + aURL.fragment = false; + } else if(url.match(re3)) { + aURL.scheme = false; + aURL.host = false; + aURL.path = url.replace(re3, "$1"); + aURL.query = false; + aURL.fragment = false; + } + } + if(aURL.host) { + var regPort = /^(.*?)\\:(\\d+)$/i; + // check for port + if(aURL.host.match(regPort)) { + var tmpHost1 = aURL.host; + aURL.host = tmpHost1.replace(regPort, "$1"); + aURL.port = tmpHost1.replace(regPort, "$2"); + } else { + aURL.port = false; + } + // check for user and pass + if(aURL.host.match(/@/i)) { + var tmpHost2 = aURL.host; + aURL.host = tmpHost2.split('@')[1]; + var tmpUserPass = tmpHost2.split('@')[0]; + if(tmpUserPass.match(/\:/)) { + aURL.user = tmpUserPass.split(':')[0]; + aURL.pass = tmpUserPass.split(':')[1]; + } else { + aURL.user = tmpUserPass; + aURL.pass = false; + } + } + } + } + return aURL; + }, + + /** + * Take a URL object from Ink.Util.Url.parseUrl or a window.location + * object and returns a URL string. + * + * @method format + * @param urlObj window.location, a.href, or parseUrl object to format + * @return {String} Full URL. + */ + format: function (urlObj) { + var protocol = ''; + var host = ''; + var path = ''; + var frag = ''; + var query = ''; + + if (typeof urlObj.protocol === 'string') { + protocol = urlObj.protocol + '//'; // here it comes with the colon + } else if (typeof urlObj.scheme === 'string') { + protocol = urlObj.scheme + '://'; + } + + host = urlObj.host || urlObj.hostname || ''; + path = urlObj.path || ''; + + if (typeof urlObj.query === 'string') { + query = urlObj.query; + } else if (typeof urlObj.search === 'string') { + query = urlObj.search.replace(/^\?/, ''); + } + if (typeof urlObj.fragment === 'string') { + frag = urlObj.fragment; + } else if (typeof urlObj.hash === 'string') { + frag = urlObj.hash.replace(/#$/, ''); + } + + return [ + protocol, + host, + path, + query && '?' + query, + frag && '#' + frag + ].join(''); + }, + + /** + * Get last loaded script element + * + * @method currentScriptElement + * @param {String} [match] String to match against the script src attribute + * @return {DOMElement|Boolean} Returns the + */ + + function upName(dimension) { + // omg IE + var firstCharacter = dimension.match(/^./)[0]; + return firstCharacter.toUpperCase() + dimension.replace(/^./, ''); + } + function maxName(dimension) { + return 'max' + upName(dimension); + } + + var openModals = []; + + var Modal = function(selector, options) { + if (!selector) { + this._element = null; + } else { + this._element = Common.elOrSelector(selector, 'Ink.UI.Modal markup'); + } + + this._options = { + /** + * Width, height and markup really optional, as they can be obtained by the element + */ + width: undefined, + height: undefined, + + /** + * To add extra classes + */ + shadeClass: undefined, + modalClass: undefined, + + /** + * Optional trigger properties + */ + trigger: undefined, + triggerEvent: 'click', + autoDisplay: true, + + /** + * Remaining options + */ + markup: undefined, + onShow: undefined, + onDismiss: undefined, + closeOnClick: false, + closeOnEscape: true, + responsive: true, + disableScroll: true + }; + + + this._handlers = { + click: Ink.bindEvent(this._onShadeClick, this), + keyDown: Ink.bindEvent(this._onKeyDown, this), + resize: Ink.bindEvent(this._onResize, this) + }; + + this._wasDismissed = false; + + /** + * Modal Markup + */ + if( this._element ){ + this._markupMode = Css.hasClassName(this._element,'ink-modal'); // Check if the full modal comes from the markup + } else { + this._markupMode = false; + } + + if( !this._markupMode ){ + this._modalShadow = document.createElement('div'); + this._modalShadowStyle = this._modalShadow.style; + + this._modalDiv = document.createElement('div'); + this._modalDivStyle = this._modalDiv.style; + + if( !!this._element ){ + this._options.markup = this._element.innerHTML; + } + + /** + * Not in full markup mode, let's set the classes and css configurations + */ + Css.addClassName( this._modalShadow,'ink-shade' ); + Css.addClassName( this._modalDiv,'ink-modal ink-space' ); + + /** + * Applying the main css styles + */ + // this._modalDivStyle.position = 'absolute'; + this._modalShadow.appendChild( this._modalDiv); + document.body.appendChild( this._modalShadow ); + } else { + this._modalDiv = this._element; + this._modalDivStyle = this._modalDiv.style; + this._modalShadow = this._modalDiv.parentNode; + this._modalShadowStyle = this._modalShadow.style; + + this._contentContainer = Selector.select(".modal-body", this._modalDiv)[0]; + if( !this._contentContainer){ + throw new Error('Ink.UI.Modal: Missing div with class "modal-body"'); + } + + this._options.markup = this._contentContainer.innerHTML; + + /** + * First, will handle the least important: The dataset + */ + this._options = Ink.extendObj(this._options,InkElement.data(this._element)); + + } + + /** + * Now, the most important, the initialization options + */ + this._options = Ink.extendObj(this._options,options || {}); + + if( !this._markupMode ){ + this.setContentMarkup(this._options.markup); + } + + if( typeof this._options.shadeClass === 'string' ){ + Css.addClassName(this._modalShadow, this._options.shadeClass); + } + + if( typeof this._options.modalClass === 'string' ){ + Css.addClassName(this._modalDiv, this._options.modalClass); + } + + if( ("trigger" in this._options) && ( typeof this._options.trigger !== 'undefined' ) ){ + var triggerElement; + if( typeof this._options.trigger === 'string' ){ + triggerElement = Selector.select( this._options.trigger ); + Event.observeMulti(triggerElement, this._options.triggerEvent, Ink.bindEvent(this.open, this)); + } + } else if ( this._options.autoDisplay.toString() === "true" ) { + this.open(); + } + }; + + Modal.prototype = { + + /** + * Responsible for repositioning the modal + * + * @method _reposition + * @private + */ + _reposition: function(){ + this._modalDivStyle.marginTop = (-InkElement.elementHeight(this._modalDiv)/2) + 'px'; + this._modalDivStyle.marginLeft = (-InkElement.elementWidth(this._modalDiv)/2) + 'px'; + }, + + /** + * Responsible for resizing the modal + * + * @method _onResize + * @param {Boolean|Event} runNow Its executed in the begining to resize/reposition accordingly to the viewport. But usually it's an event object. + * @private + */ + _onResize: function( runNow ){ + if( typeof runNow === 'boolean' ){ + this._timeoutResizeFunction.call(this); + } else if( !this._resizeTimeout && (runNow && typeof runNow === 'object') ){ + this._resizeTimeout = setTimeout(Ink.bind(this._timeoutResizeFunction, this),250); + } + }, + + /** + * Timeout Resize Function + * + * @method _timeoutResizeFunction + * @private + */ + _timeoutResizeFunction: function(){ + /** + * Getting the current viewport size + */ + var isPercentage = { + width: ('' + this._options.width).indexOf('%') !== -1, + height: ('' + this._options.height).indexOf('%') !== -1 + }; + var currentViewport = { + height: InkElement.viewportHeight(), + width: InkElement.viewportWidth() + }; + + InkArray.forEach(['height', 'width'], Ink.bind(function (dimension) { + // Not used for percentage measurements + if (isPercentage[dimension]) { return; } + + if (currentViewport[dimension] > this.originalStatus[dimension]) { + this._modalDivStyle[dimension] = this._modalDivStyle[maxName(dimension)]; + } else { + this._modalDivStyle[dimension] = Math.round(currentViewport[dimension] * 0.9) + 'px'; + } + }, this)); + + this._resizeContainer(); + this._reposition(); + this._resizeTimeout = undefined; + }, + + /** + * Handle clicks on the shade element. + * + * @method _onShadeClick + * @param {Event} ev + * @private + */ + _onShadeClick: function(ev) { + var tgtEl = Event.element(ev); + + if (Css.hasClassName(tgtEl, 'ink-close') || Css.hasClassName(tgtEl, 'ink-dismiss') || + InkElement.findUpwardsBySelector(tgtEl, '.ink-close,.ink-dismiss') || + ( + this._options.closeOnClick && + (!InkElement.descendantOf(this._shadeElement, tgtEl) || (tgtEl === this._shadeElement)) + ) + ) { + var alertsInTheModal = Selector.select('.ink-alert', this._shadeElement), + alertsLength = alertsInTheModal.length; + for( var i = 0; i < alertsLength; i++ ){ + if( InkElement.descendantOf(alertsInTheModal[i], tgtEl) ){ + return; + } + } + + this.dismiss(); + + // Only stop the event if this dismisses this modal + if (this._wasDismissed) { + Event.stop(ev); + } + } + }, + + /** + * Responsible for handling the escape key pressing. + * + * @method _onKeyDown + * @param {Event} ev + * @private + */ + _onKeyDown: function(ev) { + if (ev.keyCode !== 27 || this._wasDismissed) { return; } + if (this._options.closeOnEscape.toString() === 'true' && + openModals[openModals.length - 1] === this) { + this.dismiss(); + if (this._wasDismissed) { + Event.stop(ev); + } + } + }, + + /** + * Responsible for setting the size of the modal (and position) based on the viewport. + * + * @method _resizeContainer + * @private + */ + _resizeContainer: function() { + // [3.0.0] drop this because everyone should have the new CSS now, which has this rule already with .ink-modal-is-open. + this._contentElement.style.overflow = this._contentElement.style.overflowX = this._contentElement.style.overflowY = 'hidden'; + var containerHeight = InkElement.elementHeight(this._modalDiv); + + this._modalHeader = Selector.select('.modal-header',this._modalDiv)[0]; + if( this._modalHeader ){ + containerHeight -= InkElement.elementHeight(this._modalHeader); + } + + this._modalFooter = Selector.select('.modal-footer',this._modalDiv)[0]; + if( this._modalFooter ){ + containerHeight -= InkElement.elementHeight(this._modalFooter); + } + + this._contentContainer.style.height = containerHeight + 'px'; + if( containerHeight !== InkElement.elementHeight(this._contentContainer) ){ + this._contentContainer.style.height = ~~(containerHeight - (InkElement.elementHeight(this._contentContainer) - containerHeight)) + 'px'; + } + + if( this._markupMode ){ return; } + + this._contentContainer.style.overflow = this._contentContainer.style.overflowX = 'hidden'; + this._contentContainer.style.overflowY = 'auto'; + this._contentElement.style.overflow = this._contentElement.style.overflowX = this._contentElement.style.overflowY = 'visible'; + }, + + /** + * Responsible for 'disabling' the page scroll + * + * @method _disableScroll + * @private + */ + _disableScroll: function() { + var htmlEl = document.documentElement; + this._oldHtmlOverflows = [ htmlEl.style.overflowX, + htmlEl.style.overflowY ]; + htmlEl.style.overflowX = htmlEl.style.overflowY = 'hidden'; + }, + + /************** + * PUBLIC API * + **************/ + + /** + * Display this Modal. Useful if you have initialized the modal + * @method open + * @param {Event} [event] (internal) In case its fired by the internal trigger. + */ + open: function(event) { + + if( event ){ Event.stop(event); } + + var elem = (document.compatMode === "CSS1Compat") ? document.documentElement : document.body; + + this._resizeTimeout = null; + + Css.addClassName( this._modalShadow,'ink-shade' ); + this._modalShadowStyle.display = this._modalDivStyle.display = 'block'; + setTimeout(Ink.bind(function() { + Css.addClassName( this._modalShadow, 'visible' ); + Css.addClassName( this._modalDiv, 'visible' ); + }, this), 100); + + /** + * Fallback to the old one + */ + this._contentElement = this._modalDiv; + this._shadeElement = this._modalShadow; + + if( !this._markupMode ){ + /** + * Setting the content of the modal + */ + this.setContentMarkup( this._options.markup ); + } + + /** + * If any size has been user-defined, let's set them as max-width and max-height + */ + + var isPercentage = { + width: ('' + this._options.width).indexOf('%') !== -1, + height: ('' + this._options.height).indexOf('%') !== -1 + }; + + InkArray.forEach(['width', 'height'], Ink.bind(function (dimension) { + if (this._options[dimension] !== undefined) { + this._modalDivStyle[dimension] = this._options[dimension]; + if (!isPercentage[dimension]) { + this._modalDivStyle[maxName(dimension)] = + InkElement['element' + upName(dimension)](this._modalDiv) + 'px'; + } + } else { + this._modalDivStyle[maxName(dimension)] = InkElement['element' + upName(dimension)](this._modalDiv) + 'px'; + } + + if (isPercentage[dimension] && parseInt(elem['client' + maxName(dimension)], 10) <= parseInt(this._modalDivStyle[dimension], 10) ) { + this._modalDivStyle[dimension] = Math.round(parseInt(elem['client' + maxName(dimension)], 10) * 0.9) + 'px'; + } + }, this)); + + this.originalStatus = { + viewportHeight: InkElement.elementHeight(elem), + viewportWidth: InkElement.elementWidth(elem), + height: InkElement.elementHeight(this._modalDiv), + width: InkElement.elementWidth(this._modalDiv) + }; + + /** + * Let's 'resize' it: + */ + if( this._options.responsive.toString() === 'true' ) { + this._onResize(true); + Event.observe( window,'resize',this._handlers.resize ); + } else { + this._resizeContainer(); + this._reposition(); + } + + if (this._options.onShow) { + this._options.onShow(this); + } + + if(this._options.disableScroll.toString() === 'true') { + this._disableScroll(); + } + + // subscribe events + Event.observe(this._shadeElement, 'click', this._handlers.click); + if (this._options.closeOnEscape.toString() === 'true') { + Event.observe(document, 'keydown', this._handlers.keyDown); + } + + Common.registerInstance(this, this._shadeElement, 'modal'); + + this._wasDismissed = false; + openModals.push(this); + + Css.addClassName(document.documentElement, 'ink-modal-is-open'); + }, + + /** + * Dismisses the modal + * + * @method dismiss + * @public + */ + dismiss: function() { + if (this._wasDismissed) { /* Already dismissed. WTF IE. */ return; } + + if (this._options.onDismiss) { + var ret = this._options.onDismiss(this); + if (ret === false) { return; } + } + + this._wasDismissed = true; + + if( this._options.responsive ){ + Event.stopObserving(window, 'resize', this._handlers.resize); + } + + // this._modalShadow.parentNode.removeChild(this._modalShadow); + + if( !this._markupMode ){ + this._modalShadow.parentNode.removeChild(this._modalShadow); + this.destroy(); + } else { + Css.removeClassName( this._modalDiv, 'visible' ); + Css.removeClassName( this._modalShadow, 'visible' ); + + this._waitForFade(this._modalShadow, Ink.bind(function () { + this._modalShadowStyle.display = 'none'; + }, this)); + } + + openModals = InkArray.remove(openModals, InkArray.keyValue(this, openModals), 1); + + if (openModals.length === 0) { // Document level stuff now there are no modals in play. + var htmlEl = document.documentElement; + + // Reenable scroll + if(this._options.disableScroll) { + htmlEl.style.overflowX = this._oldHtmlOverflows[0]; + htmlEl.style.overflowY = this._oldHtmlOverflows[1]; + } + + // Remove the class from the HTML element. + Css.removeClassName(htmlEl, 'ink-modal-is-open'); + } + }, + + /** + * Utility function to listen to the onTransmissionEnd event, or wait using setTimeouts + * + * Specific to this._element + */ + _waitForFade: function (elem, callback) { + if (!opacitySupported) { return callback(); } + + var transitionEndEventNames = [ + 'transitionEnd', 'oTransitionEnd', 'webkitTransitionEnd']; + var classicName; + var evName; + for (var i = 0, len = transitionEndEventNames.length; i < len; i++) { + evName = transitionEndEventNames[i]; + classicName = 'on' + evName.toLowerCase(); + if (classicName in elem) { + Event.observeOnce(elem, evName, callback); + return; + } + } + var fadeChecker = function () { + if( +Css.getStyle(elem, 'opacity') > 0 ){ + setTimeout(fadeChecker, 250); + } else { + callback(); + } + }; + setTimeout(fadeChecker, 500); + }, + + /** + * Removes the modal from the DOM + * + * @method destroy + * @public + */ + destroy: function() { + Common.unregisterInstance(this._instanceId); + }, + + /** + * Returns the content DOM element + * + * @method getContentElement + * @return {DOMElement} Modal main cointainer. + * @public + */ + getContentElement: function() { + return this._contentContainer; + }, + + /** + * Replaces the content markup + * + * @method setContentMarkup + * @param {String} contentMarkup + * @public + */ + setContentMarkup: function(contentMarkup) { + if( !this._markupMode ){ + this._modalDiv.innerHTML = [contentMarkup].join(''); + this._contentContainer = Selector.select(".modal-body",this._modalDiv); + if( !this._contentContainer.length ){ + // throw 'Missing div with class "modal-body"'; + var tempHeader = Selector.select(".modal-header",this._modalDiv); + var tempFooter = Selector.select(".modal-footer",this._modalDiv); + + InkArray.each(tempHeader, InkElement.remove); + InkArray.each(tempFooter, InkElement.remove); + + var body = document.createElement('div'); + Css.addClassName(body,'modal-body'); + body.innerHTML = this._modalDiv.innerHTML; + this._modalDiv.innerHTML = ''; + + var toAdd = tempHeader.concat([body]).concat(tempFooter); + InkArray.each(toAdd, Ink.bindMethod(this._modalDiv, 'appendChild')); + + // InkArray.each(tempHeader,Ink.bind(function( element ){ this._modalDiv.appendChild(element); },this)); + // this._modalDiv.appendChild(body); + // InkArray.each(tempFooter,Ink.bind(function( element ){ this._modalDiv.appendChild(element); },this)); + + this._contentContainer = Selector.select(".modal-body",this._modalDiv); + } + this._contentContainer = this._contentContainer[0]; + } else { + this._contentContainer.innerHTML = contentMarkup; + } + this._contentElement = this._modalDiv; + this._resizeContainer(); + } + + }; + + return Modal; + +}); diff --git a/ajax/libs/ink/2.3.1/js/ink.pagination.js b/ajax/libs/ink/2.3.1/js/ink.pagination.js new file mode 100644 index 000000000..905bc33da --- /dev/null +++ b/ajax/libs/ink/2.3.1/js/ink.pagination.js @@ -0,0 +1,519 @@ +/** + * @module Ink.UI.Pagination_1 + * @author inkdev AT sapo.pt + * @version 1 + */ +Ink.createModule('Ink.UI.Pagination', '1', + ['Ink.UI.Common_1','Ink.Dom.Event_1','Ink.Dom.Css_1','Ink.Dom.Element_1','Ink.Dom.Selector_1'], + function(Common, Event, Css, Element, Selector ) { + 'use strict'; + + /** + * Function to create the pagination anchors + * + * @method genAel + * @param {String} inner HTML to be placed inside the anchor. + * @return {DOMElement} Anchor created + */ + var genAEl = function(inner, index) { + var aEl = document.createElement('a'); + aEl.setAttribute('href', '#'); + if (index !== undefined) { + aEl.setAttribute('data-index', index); + } + aEl.innerHTML = inner; + return aEl; + }; + + /** + * @class Ink.UI.Pagination + * @constructor + * @version 1 + * @param {String|DOMElement} selector + * @param {Object} options Options + * @param {Number} [options.size] number of pages. + * @param {Number} [options.totalItemCount] Total numeber of items to display + * @param {Number} [options.itemsPerPage] number of items per page. + * @param {Number} [options.maxSize] If passed, only shows at most maxSize items. displays also first|prev page and next page|last buttons + * @param {Number} [options.start] start page. defaults to 1 + * @param {String} [options.firstLabel] label to display on first page button + * @param {String} [options.lastLabel] label to display on last page button + * @param {String} [options.previousLabel] label to display on previous button + * @param {String} [options.nextLabel] label to display on next button + * @param {String} [options.previousPageLabel] label to display on previous page button + * @param {String} [options.nextPageLabel] label to display on next page button + * @param {Function} [options.onChange] optional callback. Called with `(thisPaginator, newPageNumber)`. + * @param {String} [options.hashParameter] parameter to use on setHash. by default uses 'page' + * @param {String} [options.parentTag] HTML Tag used as the parent node. + * @param {String} [options.childTag] HTML Tag used as the child nodes. + * @param {String} [options.wrapperClass] CSS Class used in the wrapper element + * @param {String} [options.paginationClass] CSS Class used in the pagination element + * @param {String} [options.activeClass] CSS Class used to mark page as active + * @param {String} [options.disabledClass] CSS Class used to mark page as disabled + * @param {String} [options.hideClass] CSS Class used to hide elements + * @param {String} [options.previousClass] CSS Class used in the previous element + * @param {String} [options.previousPageClass] CSS Class used in the previous page element + * @param {String} [options.nextClass] CSS Class used in the next element + * @param {String} [options.nextPageClass] CSS Class used in the next page element + * @param {Function} [options.numberFormatter] optional function which takes and 0-indexed number and returns the string which appears on a numbered button + */ + var Pagination = function(selector, options) { + + this._element = Common.elOrSelector(selector, 'Ink.UI.Pagination element'); + + this._options = Common.options('Ink.UI.Pagination_1', { + size: ['Integer', null], + totalItemCount: ['Integer', null], + itemsPerPage: ['Integer', null], + maxSize: ['Integer', null], + start: ['Integer', 1], + firstLabel: ['String', 'First'], + lastLabel: ['String', 'Last'], + previousLabel: ['String', 'Previous'], + nextLabel: ['String', 'Next'], + previousPageLabel: ['String', null], + nextPageLabel: ['String', null], + onChange: ['Function', undefined], + hashParameter: ['String', 'page'], + parentTag: ['String', 'ul'], + childTag: ['String', 'li'], + wrapperClass: ['String', 'ink-navigation'], + paginationClass: ['String', 'pagination'], + activeClass: ['String', 'active'], + disabledClass: ['String', 'disabled'], + hideClass: ['String', 'hide-all'], + previousClass: ['String', 'previous'], + previousPageClass: ['String', 'previousPage'], + nextClass: ['String', 'next'], + nextPageClass: ['String', 'nextPage'], + + numberFormatter: ['Function', function(i) { return i + 1; }] + }, options || {}, this._element); + + if (!this._options.previousPageLabel) { + this._options.previousPageLabel = this._options.previousLabel + ' ' + this._options.maxSize; + } + + if (!this._options.nextPageLabel) { + this._options.nextPageLabel = this._options.nextLabel + ' ' + this._options.maxSize; + } + + this._handlers = { + click: Ink.bindEvent(this._onClick,this) + }; + + if (Common.isInteger(this._options.totalItemCount) && Common.isInteger(this._options.itemsPerPage)) { + this._size = Math.ceil(this._options.totalItemCount / this._options.itemsPerPage); + } else if (Common.isInteger(this._options.size)) { + this._size = this._options.size; + } else { + throw new TypeError('Ink.UI.Pagination: Please supply a size option or totalItemCount and itemsPerPage options.'); + } + + if (!Common.isInteger(this._options.start) && this._options.start > 0 && this._options.start <= this._size) { + throw new TypeError('start option is a required integer between 1 and size!'); + } + + if (this._options.maxSize && !Common.isInteger(this._options.maxSize) && this._options.maxSize > 0) { + throw new TypeError('maxSize option is a positive integer!'); + } + + else if (this._size < 0) { + throw new RangeError('size option must be equal or more than 0!'); + } + + this.setOnChange(this._options.onChange); + + this._current = this._options.start - 1; + this._itemLiEls = []; + + this._init(); + }; + + Pagination.prototype = { + + /** + * Init function called by the constructor + * + * @method _init + * @private + */ + _init: function() { + // generate and apply DOM + this._generateMarkup(this._element); + + this._updateItems(); + + // subscribe events + this._observe(); + + Common.registerInstance(this, this._element, 'pagination'); + }, + + /** + * Responsible for setting listener in the 'click' event of the Pagination element. + * + * @method _observe + * @private + */ + _observe: function() { + Event.observeDelegated(this._element, 'click', '.' + this._options.paginationClass + ' > ' + this._options.childTag, this._handlers.click); + }, + + /** + * Updates the markup everytime there's a change in the Pagination object. + * + * @method _updateItems + * @private + */ + _updateItems: function() { + var liEls = this._itemLiEls; + + var isSimpleToggle = this._size === liEls.length; + + var i, f, liEl; + + if (isSimpleToggle) { + // just toggle active class + for (i = 0, f = this._size; i < f; ++i) { + Css.setClassName(liEls[i], this._options.activeClass, i === this._current); + } + } + else { + // remove old items + for (i = liEls.length - 1; i >= 0; --i) { + this._ulEl.removeChild(liEls[i]); + } + + // add new items + liEls = []; + for (i = 0, f = this._size; i < f; ++i) { + liEl = document.createElement(this._options.childTag); + liEl.appendChild( genAEl( this._options.numberFormatter(i), i) ); + Css.setClassName(liEl, this._options.activeClass, i === this._current); + this._ulEl.insertBefore(liEl, this._nextEl); + liEls.push(liEl); + } + this._itemLiEls = liEls; + } + + if (this._options.maxSize) { + // toggle visible items + var page = Math.floor( this._current / this._options.maxSize ); + var pi = this._options.maxSize * page; + var pf = pi + this._options.maxSize - 1; + + for (i = 0, f = this._size; i < f; ++i) { + liEl = liEls[i]; + Css.setClassName(liEl, this._options.hideClass, i < pi || i > pf); + } + + this._pageStart = pi; + this._pageEnd = pf; + this._page = page; + + Css.setClassName(this._prevPageEl, this._options.disabledClass, !this.hasPreviousPage()); + Css.setClassName(this._nextPageEl, this._options.disabledClass, !this.hasNextPage()); + + Css.setClassName(this._firstEl, this._options.disabledClass, this.isFirst()); + Css.setClassName(this._lastEl, this._options.disabledClass, this.isLast()); + } + + // update prev and next + Css.setClassName(this._prevEl, this._options.disabledClass, !this.hasPrevious()); + Css.setClassName(this._nextEl, this._options.disabledClass, !this.hasNext()); + }, + + /** + * Returns the top element for the gallery DOM representation + * + * @method _generateMarkup + * @param {DOMElement} el + * @private + */ + _generateMarkup: function(el) { + Css.addClassName(el, 'ink-navigation'); + + var ulEl,liEl, + hasUlAlready = false; + if( ( ulEl = Selector.select('.' + this._options.paginationClass,el)).length < 1 ){ + ulEl = document.createElement(this._options.parentTag); + Css.addClassName(ulEl, this._options.paginationClass); + } else { + hasUlAlready = true; + ulEl = ulEl[0]; + } + + if (this._options.maxSize) { + liEl = document.createElement(this._options.childTag); + liEl.appendChild( genAEl(this._options.firstLabel) ); + this._firstEl = liEl; + Css.addClassName(liEl, this._options.firstClass); + ulEl.appendChild(liEl); + + liEl = document.createElement(this._options.childTag); + liEl.appendChild( genAEl(this._options.previousPageLabel) ); + this._prevPageEl = liEl; + Css.addClassName(liEl, this._options.previousPageClass); + ulEl.appendChild(liEl); + } + + liEl = document.createElement(this._options.childTag); + liEl.appendChild( genAEl(this._options.previousLabel) ); + this._prevEl = liEl; + Css.addClassName(liEl, this._options.previousClass); + ulEl.appendChild(liEl); + + liEl = document.createElement(this._options.childTag); + liEl.appendChild( genAEl(this._options.nextLabel) ); + this._nextEl = liEl; + Css.addClassName(liEl, this._options.nextClass); + ulEl.appendChild(liEl); + + if (this._options.maxSize) { + liEl = document.createElement(this._options.childTag); + liEl.appendChild( genAEl(this._options.nextPageLabel) ); + this._nextPageEl = liEl; + Css.addClassName(liEl, this._options.nextPageClass); + ulEl.appendChild(liEl); + + liEl = document.createElement(this._options.childTag); + liEl.appendChild( genAEl(this._options.lastLabel) ); + this._lastEl = liEl; + Css.addClassName(liEl, this._options.lastClass); + ulEl.appendChild(liEl); + } + + if( !hasUlAlready ){ + el.appendChild(ulEl); + } + + this._ulEl = ulEl; + }, + + /** + * Click handler + * + * @method _onClick + * @param {Event} ev + * @private + */ + _onClick: function(ev) { + Event.stop(ev); + + var liEl = Event.element(ev); + if ( Css.hasClassName(liEl, this._options.activeClass) || + Css.hasClassName(liEl, this._options.disabledClass) ) { return; } + + var isPrev = Css.hasClassName(liEl, this._options.previousClass); + var isNext = Css.hasClassName(liEl, this._options.nextClass); + var isPrevPage = Css.hasClassName(liEl, this._options.previousPageClass); + var isNextPage = Css.hasClassName(liEl, this._options.nextPageClass); + var isFirst = Css.hasClassName(liEl, this._options.firstClass); + var isLast = Css.hasClassName(liEl, this._options.lastClass); + + if (isFirst) { + this.setCurrent(0); + } + else if (isLast) { + this.setCurrent(this._size - 1); + } + else if (isPrevPage || isNextPage) { + this.setCurrent( (isPrevPage ? -1 : 1) * this._options.maxSize, true); + } + else if (isPrev || isNext) { + this.setCurrent(isPrev ? -1 : 1, true); + } + else { + var aElem = Ink.s('[data-index]', liEl); + var nr = parseInt( aElem.getAttribute('data-index'), 10); + this.setCurrent(nr); + } + }, + + + /** + * Allows you to subscribe to the onChange event + * + * @method setOnChange + * @param cb {Function} Callback called with `(thisPaginator, newPageNumber)`. + */ + setOnChange: function (onChange) { + if (onChange !== undefined && typeof onChange !== 'function') { + throw new TypeError('onChange option must be a function!'); + } + this._onChange = onChange; + }, + + /************** + * PUBLIC API * + **************/ + + /** + * Sets the number of pages + * + * @method setSize + * @param {Number} sz number of pages + * @public + */ + setSize: function(sz) { + if (!Common.isInteger(sz)) { + throw new TypeError('1st argument must be an integer number!'); + } + + this._size = sz; + this._updateItems(); + this._current = 0; + }, + + /** + * Calculate the number of pages, then call setSize(). + * + * @param setSizeInItems + * @param {Number} totalItems + * @param {Number} itemsPerPage + */ + setSizeInItems: function (totalItems, itemsPerPage) { + var pageNumber = Math.ceil(totalItems / itemsPerPage); + this.setSize(pageNumber); + }, + + /** + * Sets the current page + * + * @method setCurrent + * @param {Number} nr sets the current page to given number + * @param {Boolean} isRelative trueish to set relative change instead of absolute (default) + * @public + */ + setCurrent: function(nr, isRelative) { + if (!Common.isInteger(nr)) { + throw new TypeError('1st argument must be an integer number!'); + } + + if (isRelative) { + nr += this._current; + } + + if (nr > this._size - 1) { + nr = this._size - 1; + } + + if (nr < 0) { + nr = 0; + } + + this._current = nr; + this._updateItems(); + + if (this._onChange) { + this._onChange(this, nr); + } + + /*if (this._options.setHash) { + var o = {}; + o[this._options.hashParameter] = nr; + Common.setHash(o); + }*/ // undocumented option, removing + }, + + /** + * Returns the number of pages + * + * @method getSize + * @return {Number} Number of pages + * @public + */ + getSize: function() { + return this._size; + }, + + /** + * Returns current page + * + * @method getCurrent + * @return {Number} Current page + * @public + */ + getCurrent: function() { + return this._current; + }, + + /** + * Returns true iif at first page + * + * @method isFirst + * @return {Boolean} True if at first page + * @public + */ + isFirst: function() { + return this._current === 0; + }, + + /** + * Returns true iif at last page + * + * @method isLast + * @return {Boolean} True if at last page + * @public + */ + isLast: function() { + return this._current === this._size - 1; + }, + + /** + * Returns true iif has prior pages + * + * @method hasPrevious + * @return {Boolean} True if has prior pages + * @public + */ + hasPrevious: function() { + return this._current > 0; + }, + + /** + * Returns true iif has pages ahead + * + * @method hasNext + * @return {Boolean} True if has pages ahead + * @public + */ + hasNext: function() { + return this._current < this._size - 1; + }, + + /** + * Returns true iif has prior set of page(s) + * + * @method hasPreviousPage + * @return {Boolean} Returns true iif has prior set of page(s) + * @public + */ + hasPreviousPage: function() { + return this._options.maxSize && this._current > this._options.maxSize - 1; + }, + + /** + * Returns true iif has set of page(s) ahead + * + * @method hasNextPage + * @return {Boolean} Returns true iif has set of page(s) ahead + * @public + */ + hasNextPage: function() { + return this._options.maxSize && this._size - this._current >= this._options.maxSize + 1; + }, + + /** + * Unregisters the component and removes its markup from the DOM + * + * @method destroy + * @public + */ + destroy: Common.destroyComponent + }; + + return Pagination; + +}); diff --git a/ajax/libs/ink/2.3.1/js/ink.progressbar.js b/ajax/libs/ink/2.3.1/js/ink.progressbar.js new file mode 100644 index 000000000..304c907d6 --- /dev/null +++ b/ajax/libs/ink/2.3.1/js/ink.progressbar.js @@ -0,0 +1,108 @@ +/** + * @module Ink.UI.ProgressBar_1 + * @author inkdev AT sapo.pt + * @version 1 + */ +Ink.createModule('Ink.UI.ProgressBar', '1', ['Ink.Dom.Selector_1','Ink.Dom.Element_1'], function( Selector, Element ) { + 'use strict'; + + /** + * Associated to a .ink-progress-bar element, it provides the necessary + * method - setValue() - for the user to change the element's value. + * + * @class Ink.UI.ProgressBar + * @constructor + * @version 1 + * @param {String|DOMElement} selector + * @param {Object} [options] Options + * @param {Number} [options.startValue] Percentage of the bar that is filled. Range between 0 and 100. Default: 0 + * @param {Function} [options.onStart] Callback that is called when a change of value is started + * @param {Function} [options.onEnd] Callback that is called when a change of value ends + * + * @example + *
              + * I am a grey progress bar + *
              + *
              + * + */ + var ProgressBar = function( selector, options ){ + + if( typeof selector !== 'object' ){ + if( typeof selector !== 'string' ){ + throw '[Ink.UI.ProgressBar] :: Invalid selector'; + } else { + this._element = Selector.select(selector); + if( this._element.length < 1 ){ + throw "[Ink.UI.ProgressBar] :: Selector didn't find any elements"; + } + this._element = this._element[0]; + } + } else { + this._element = selector; + } + + + this._options = Ink.extendObj({ + 'startValue': 0, + 'onStart': function(){}, + 'onEnd': function(){} + },Element.data(this._element)); + + this._options = Ink.extendObj( this._options, options || {}); + this._value = this._options.startValue; + + this._init(); + }; + + ProgressBar.prototype = { + + /** + * Init function called by the constructor + * + * @method _init + * @private + */ + _init: function(){ + this._elementBar = Selector.select('.bar',this._element); + if( this._elementBar.length < 1 ){ + throw '[Ink.UI.ProgressBar] :: Bar element not found'; + } + this._elementBar = this._elementBar[0]; + + this._options.onStart = Ink.bind(this._options.onStart,this); + this._options.onEnd = Ink.bind(this._options.onEnd,this); + this.setValue( this._options.startValue ); + }, + + /** + * Sets the value of the Progressbar + * + * @method setValue + * @param {Number} newValue Numeric value, between 0 and 100, that represents the percentage of the bar. + * @public + */ + setValue: function( newValue ){ + this._options.onStart( this._value); + + newValue = parseInt(newValue,10); + if( isNaN(newValue) || (newValue < 0) ){ + newValue = 0; + } else if( newValue>100 ){ + newValue = 100; + } + this._value = newValue; + this._elementBar.style.width = this._value + '%'; + + this._options.onEnd( this._value ); + } + }; + + return ProgressBar; + +}); diff --git a/ajax/libs/ink/2.3.1/js/ink.smoothscroller.js b/ajax/libs/ink/2.3.1/js/ink.smoothscroller.js new file mode 100644 index 000000000..c94b4ce8d --- /dev/null +++ b/ajax/libs/ink/2.3.1/js/ink.smoothscroller.js @@ -0,0 +1,224 @@ +/** + * @module Ink.UI.SmoothScroller_1 + * @author inkdev AT sapo.pt + * @version 1 + */ +Ink.createModule('Ink.UI.SmoothScroller', '1', ['Ink.Dom.Event_1','Ink.Dom.Selector_1','Ink.Dom.Loaded_1'], function(Event, Selector, Loaded) { + 'use strict'; + + var requestAnimationFrame = + window.requestAnimationFrame || + function (cb) { return setTimeout(cb, 10); }; + + var cancelAnimationFrame = + window.cancelAnimationFrame || + function (id) { clearTimeout(id); }; + + /** + * @class Ink.UI.SmoothScroller + * @version 1 + * @static + * + * @example + * + * go to Part 1 + * + * [lots and lots of content...] + * + *

              Part 1

              + * + * + */ + var SmoothScroller = { + + /** + * Sets the speed of the scrolling + * + * @property speed + * @type {Number} + * @readOnly + * @static + */ + speed: 10, + + /** + * Returns the Y position of an element, relative to the document + * + * @method getTop + * @param {DOMElement} d DOMElement to get the Y position from + * @return {Number} Y position of div 'd' + * @public + * @static + */ + getTop: function(d) { + return Math.round( + SmoothScroller.scrollTop() + d.getBoundingClientRect().top); + }, + + + /** + * Returns the current scroll position + * + * @method scrollTop + * @return {Number} Current scroll position + * @public + * @static + */ + scrollTop: function() { + var body = document.body, + d = document.documentElement; + if (body && body.scrollTop){ + return body.scrollTop; + } + if (d && d.scrollTop){ + return d.scrollTop; + } + if (window.pageYOffset){ + return window.pageYOffset; + } + return 0; + }, + + /** + * Attaches an event for an element + * + * @method add + * @param {DOMElement} el DOMElement to make the listening of the event + * @param {String} event Event name to be listened + * @param {DOMElement} fn Callback function to run when the event is triggered. + * @public + * @static + */ + add: function(el, event, fn) { + Event.observe(el,event,fn); + }, + + + /** + * Kill an event of an element + * + * @method end + * @param {String} e Event to be killed/stopped + * @public + * @static + */ + // kill an event of an element + end: function(e) { + Event.stopDefault(e); + }, + + + /** + * Moves the scrollbar to the target element. This is the function + * which animates the scroll position bit by bit. It calls itself in + * the end through requestAnimationFrame + * + * @method scroll + * @param {Number} d Y coordinate value to stop + * @public + * @static + */ + scroll: function(d) { + var a = SmoothScroller.scrollTop(); + if (d > a) { + a += Math.ceil((d - a) / SmoothScroller.speed); + } else { + a = a + (d - a) / SmoothScroller.speed; + } + + window.scrollTo(0, a); + + cancelAnimationFrame(SmoothScroller.interval); + + if (!((a) === d || SmoothScroller.offsetTop === a)) { + SmoothScroller.interval = requestAnimationFrame( + Ink.bindMethod(SmoothScroller, 'scroll', d), document.body); + } else { + SmoothScroller.onDone(); + } + SmoothScroller.offsetTop = a; + }, + + + /** + * Has smooth scrolling applied to relevant elements upon page load. + * + * @method init + * @param [selector='a.scrollableLink,a.ink-smooth-scroll'] Selector string for finding links with smooth scrolling enabled. + * @public + * @static + */ + init: function(selector) { + Loaded.run(Ink.bindMethod(SmoothScroller, 'render', selector)); + }, + + /** + * This method extracts all the anchors and validates them as # and attaches the events + * + * @method render + * @public + * @static + */ + render: function(selector) { + var a = Selector.select(selector || 'a.scrollableLink,a.ink-smooth-scroll'); + + for (var i = 0; i < a.length; i++) { + var _elm = a[i]; + if (_elm.href && _elm.href.indexOf('#') !== -1 && ((_elm.pathname === location.pathname) || ('/' + _elm.pathname === location.pathname))) { + Event.observe(_elm,'click', Ink.bindEvent(SmoothScroller.onClick, this, _elm)); + } + } + }, + + + /** + * Click handler + * + * @method onClick + * @public + * @static + */ + onClick: function(event, _elm) { + SmoothScroller.end(event); + if(_elm !== null && _elm.getAttribute('href') !== null) { + var hashIndex = _elm.href.indexOf('#'); + if (hashIndex === -1) { + return; + } + var hash = _elm.href.substr((hashIndex + 1)); + var activeLiSelector = 'ul > li.active > ' + selector; + + var selector = 'a[name="' + hash + '"],#' + hash; + var elm = Selector.select(selector)[0]; + var activeLi = Selector.select(activeLiSelector)[0]; + activeLi = activeLi && activeLi.parentNode; + + if (typeof(elm) !== 'undefined') { + if (_elm.parentNode.className.indexOf('active') === -1) { + if (activeLi) { + activeLi.className = activeLi.className.replace(/(^|\s+)active($|\s+)/g, ''); + } + _elm.parentNode.className += " active"; + } + SmoothScroller.hash = hash; + SmoothScroller.scroll(SmoothScroller.getTop(elm)); + } + } + }, + + /** + * Called when the scroll movement is done. Updates browser address. + */ + onDone: function () { + window.location.hash = SmoothScroller.hash; + } + }; + + return SmoothScroller; + +}); diff --git a/ajax/libs/ink/2.3.1/js/ink.sortablelist.js b/ajax/libs/ink/2.3.1/js/ink.sortablelist.js new file mode 100644 index 000000000..935cc432b --- /dev/null +++ b/ajax/libs/ink/2.3.1/js/ink.sortablelist.js @@ -0,0 +1,257 @@ +/** + * @module Ink.UI.SortableList_1 + * @author inkdev AT sapo.pt + * @version 1 + */ +Ink.createModule('Ink.UI.SortableList', '1', ['Ink.UI.Common_1','Ink.Dom.Css_1','Ink.Dom.Event_1','Ink.Dom.Element_1','Ink.Dom.Selector_1'], function( Common, Css, Events, Element, Selector ) { + 'use strict'; + var hasTouch = (('ontouchstart' in window) || // html5 browsers + (navigator.maxTouchPoints > 0) || // future IE + (navigator.msMaxTouchPoints > 0)); + + /** + * Adds sortable behaviour to any list! + * + * @class Ink.UI.SortableList + * @constructor + * @version 1 + * @param {String|DOMElement} selector + * @param {String} [options.placeholderClass='placeholder'] CSS class to be added to the "ghost" element being dragged around + * @param {String} [options.draggedClass='hide-all'] CSS class added to the original element. + * @param {String} [options.draggingClass='dragging'] CSS class added to the html element when the user is dragging. + * @param {String} [options.dragSelector='li'] CSS selector for the drag enabled nodes. + * @param {String} [options.handleSelector=null] CSS selector for the drag handle. If present, you can only drag nodes by this selector. + * @param {String} [options.moveSelector=null] CSS selector to validate a node move. If present, you can only move nodes into this selector. + * @param {Boolean} [options.swap=false] Flag to swap moving element with target element instead of changing its order. + * @param {Boolean} [options.cancelMouseOut=false] Flag to cancel moving if mouse leaves the container element. + + * @example + *
                + *
              • drag hereprimeiro
              • + *
              • drag heresegundo
              • + *
              • drag hereterceiro
              • + *
              + * + */ + var Spy = function( selector, options ){ + + this._rootElement = Common.elOrSelector(selector,'1st argument'); + + /** + * Setting default options and - if needed - overriding it with the data attributes + */ + this._options = Ink.extendObj({ + target: undefined, + activeClass: 'active' + }, Element.data( this._rootElement ) ); + + /** + * In case options have been defined when creating the instance, they've precedence + */ + this._options = Ink.extendObj(this._options,options || {}); + + this._options.target = Common.elOrSelector( this._options.target, 'Target' ); + + this._init(); + }; + + Spy.prototype = { + /** + * Init function called by the constructor + * + * @method _init + * @private + */ + _init: function() { + addSpied(this._rootElement, this._options.target); + observeOnScroll(); + onScroll(); + } + }; + + return Spy; + +}); diff --git a/ajax/libs/ink/2.3.1/js/ink.stacker.js b/ajax/libs/ink/2.3.1/js/ink.stacker.js new file mode 100644 index 000000000..e9fced239 --- /dev/null +++ b/ajax/libs/ink/2.3.1/js/ink.stacker.js @@ -0,0 +1,285 @@ +/** + * @module Ink.UI.Stacker_1 + **/ +Ink.createModule('Ink.UI.Stacker', 1, ['Ink.UI.Common_1', 'Ink.Dom.Event_1', 'Ink.Dom.Element_1'], function(InkUICommon, InkEvent, InkElement) { + 'use strict'; + +function Stacker(selector, options) { + this._init(selector, options); +} + +Stacker.prototype = { + /** + * This module combines several stacks of items together, in smaller screen sizes. + * + * The purpose is to have several stacks of items which may have different heights and as such cannot be used because of `float: left` quirks. + * + * For example, when you have three different columns of information: + * + * [col. A: 1] [col. B: 1] [col. C: 1] + * [col. B: 2] [col. C: 2] [col. C: 2] + * + * and the screen resizes and you need a layout of 2 columns, Stacker reorders the stacks so that you get: + * + * [col. A: 1] [col. B: 1] + * [col. C: 1] [col. A: 2] + * [col. B: 2] [col. C: 2] + * + * Note: If you just want to use a different amount of columns for your items in several viewports, but these items are guaranteed to have a fixed height, don't use this module. Use the `small-*`, `medium-*` and `large-*` classes instead. + * + * @class Ink.UI.Stacker_1 + * + * @constructor + * @param [container] {DOMElement|String} Element which contains the stacks (identified by the options.column selector) + * @param [options] + * @param [options.column='.stacker-column'] {String} Select the columns inside the `container` + * @param [options.item='.stacker-item'] {String} Select items in your stack + * + * @param [options.customBreakPoints] {Object} options for each breakpoint name. Use this if you have more breakpoints than Ink by default (`large`, `medium`, `small`) + * @param [options.customBreakpoints.(breakpoint)] {Object} + * @param options.customBreakpoints.(breakpoint).max Maximum screen size as seen in your media query + * @param options.customBreakpoints.(breakpoint).min Minimum screen size as seen in your media query + * @param options.customBreakpoints.(breakpoint).cols Column count for this size. + * + * @param [options.largeMax] {Number} Upper bound of `large` breakpoint + * @param [options.largeMin=961] {Number} Lower bound of `large` breakpoint + * @param [options.mediumMax=960] {Number} Upper bound of `medium` breakpoint + * @param [options.mediumMin=651] {Number} Lower bound of `medium` breakpoint + * @param [options.smallMax=650] {Number} Upper bound of `small` breakpoint + * @param [options.smallMin] {Number} Lower bound of `small` breakpoint + * + * @param [options.largeCols=3] {Integer} Number of columns in the `large` viewport + * @param [options.mediumCols=2] {Integer} Number of columns in the `medium` viewport + * @param [options.smallCols=1] {Integer} Number of columns in the `small` viewport + * + * @param [options.isOrdered=true] {Boolean} When `false`, do not reorder stacks when combining them. + * @param [options.onRunCallback] {Function} Called when instantiated + * @param [options.onResizeCallback] {Function} Called when resized because the window resized. + * @param [options.onAPIReloadCallback] {Function} Called when you ask to reload stack items from the DOM. + * + * @example + * + * Html: + * + *
              + *
              + *
              a
              + *
              d
              + *
              g
              + *
              + *
              + *
              b
              + *
              e
              + *
              h
              + *
              + *
              + *
              c
              + *
              f
              + *
              i
              + *
              + *
              + * + * Javascript: + * + * Ink.requireModules(['Ink.UI.Stacker_1'], function (Stacker) { + * var stacker = new Stacker('#stacker-container'); + * // Keep the "stacker" variable around if you want to call addItem and reloadItems + * }); + **/ + _init: function(selector, options) { + /* globals console */ + this._rootElm = InkUICommon.elsOrSelector(selector, 'Ink.UI.Stacker root element')[0] || null; + if(this._rootElm === null) { + if(typeof console !== 'undefined') { + console.warn('Ink.UI.Stacker: No root element'); + } + } + + this._options = InkUICommon.options({ + column: ['String', '.stacker-column'], + item: ['String', '.stacker-item'], + + // [3.0.0] review this when we have info about our breakpoints from the CSS + customBreakPoints: ['Object', null], // Must be: {xlarge: {max: 9999, min: 1281, cols: 5}, large:{max:1280, min:1001, cols:4} medium:{max:1000, min:801,cols:3}, ...etc..} + largeMax: ['Number', Number.MAX_VALUE], + largeMin: ['Number', 961], + mediumMax: ['Number', 960], + mediumMin: ['Number', 651], + smallMax: ['Number', 650], + smallMin: ['Number', 0], + + largeCols: ['Integer', 3], + mediumCols: ['Integer', 2], + smallCols: ['Integer', 1], + + isOrdered: ['Boolean', true], + onRunCallback: ['Function', null], + onResizeCallback: ['Function', null], + onAPIReloadCallback: ['Function', null] + }, options || {}, this._rootElm); + + this._aList = []; + + this._curLayout = 'large'; + + // [todo] is this needed? + this._runFirstTime = false; + + this._getPageItemsToList(); + + if(this._canApplyLayoutChange() || !this._runFirstTime) { + this._runFirstTime = true; + this._applyLayoutChange(); + if(typeof(this._options.onRunCallback) === 'function') { + this._options.onRunCallback(this._curLayout); + } + } + this._addEvents(); + }, + + /** + * Add an item to the end of your stacks. Call `reloadItems()` when you are done adding items. + * @method addItem + * @param {DOMElement} item + **/ + addItem: function(item) { + this._aList.push(item); + }, + + /** + * Update the layout of your items. + * + * Call this when: + * + * - The width has changed, but not because of the window resizing. + * - You used addItem to add some items + * + * @method reloadItems + **/ + reloadItems: function() { + this._applyLayoutChange(); + if(typeof(this._options.onAPIReloadCallback) === 'function') { + this._options.onAPIReloadCallback(this._curLayout); + } + }, + + _addEvents: function() { + InkEvent.observe(window, 'resize', Ink.bindEvent(this._onResize, this)); + }, + + _onResize: function() { + if(this._canApplyLayoutChange()) { + this._removeDomItems(); + this._applyLayoutChange(); + if(typeof(this._options.onResizeCallback) === 'function') { + this._options.onResizeCallback(this._curLayout); + } + } + }, + + _setCurLayout: function() { + var viewportWidth = InkElement.viewportWidth(); + if(this._options.customBreakpoints && typeof(this._options.customBreakPoints) === 'object') { + for(var prop in this._options.customBreakPoints) { + if(this._options.customBreakPoints.hasOwnProperty(prop)) { + if(viewportWidth >= Number(this._options.customBreakPoints[prop].min) && viewportWidth <= Number(this._options.customBreakPoints[prop].max) && this._curLayout !== prop) { + this._curLayout = prop; + return; + } + } + } + } else { + if(viewportWidth <= Number(this._options.largeMax) && viewportWidth >= Number(this._options.largeMin) && this._curLayout !== 'large') { + this._curLayout = 'large'; + } else if(viewportWidth >= Number(this._options.mediumMin) && viewportWidth <= Number(this._options.mediumMax) && this._curLayout !== 'medium') { + this._curLayout = 'medium'; + } else if(viewportWidth >= Number(this._options.smallMin) && viewportWidth <= Number(this._options.smallMax) && this._curLayout !== 'small') { + this._curLayout = 'small'; + } + } + }, + + _getColumnsToShow: function() { + if(this._options.customBreakPoints && typeof(this._options.customBreakPoints) === 'object') { + return Number(this._options.customBreakPoints[this._curLayout].cols); + } else { + return Number(this._options[this._curLayout+'Cols']); + } + }, + + _canApplyLayoutChange: function() { + var curLayout = this._curLayout; + this._setCurLayout(); + if(curLayout !== this._curLayout) { + return true; + } + return false; + }, + + _getPageItemsToList: function() { + this._aColumn = Ink.ss(this._options.column, this._rootElm); + var totalCols = this._aColumn.length; + var index = 0; + if(totalCols > 0) { + for(var i=0; i < this._aColumn.length; i++) { + var aItems = Ink.ss(this._options.item, this._aColumn[i]); + for(var j=0; j < aItems.length; j++) { + if(this._options.isOrdered) { + index = i + (j * totalCols); + } + this._aList[index] = aItems[j]; + if(!this._options.isOrdered) { + index++; + } + //aItems[j].style.height = (100 + (Math.random() * 100))+'px'; + aItems[j].parentNode.removeChild(aItems[j]); + } + } + if(this._aList.length > 0 && this._options.isOrdered) { + var aNewList = []; + for(var ii=0; ii < this._aList.length; ii++) { + if(typeof(this._aList[ii]) !== 'undefined') { + aNewList.push(this._aList[ii]); + } + } + this._aList = aNewList; + } + } + }, + + _removeDomItems: function() { + var totalCols = this._aColumn.length; + if(totalCols > 0) { + for(var i=0; i < totalCols; i++) { + var aItems = Ink.ss(this._options.item, this._aColumn[i]); + for(var j=aItems.length - 1; j >= 0; j--) { + aItems[j].parentNode.removeChild(aItems[j]); + } + } + } + }, + + _applyLayoutChange: function() { + var totalCols = this._getColumnsToShow(); + var totalItems = this._aList.length; + var index = 0; + var countCol = 0; + if(totalCols > 0) { + while(countCol < totalCols) { + this._aColumn[countCol].appendChild(this._aList[index]); + index++; + countCol++; + if(index === totalItems) { + return; + } + if(countCol === totalCols) { + countCol = 0; + } + } + } + } +}; + +return Stacker; + +}); diff --git a/ajax/libs/ink/2.3.1/js/ink.sticky.js b/ajax/libs/ink/2.3.1/js/ink.sticky.js new file mode 100644 index 000000000..b6eba7348 --- /dev/null +++ b/ajax/libs/ink/2.3.1/js/ink.sticky.js @@ -0,0 +1,279 @@ +/** + * @module Ink.UI.Sticky_1 + * @author inkdev AT sapo.pt + * @version 1 + */ +Ink.createModule('Ink.UI.Sticky', '1', ['Ink.UI.Common_1','Ink.Dom.Event_1','Ink.Dom.Element_1','Ink.Dom.Css_1'], function(Common, Event, Element, Css) { + 'use strict'; + + /** + * The Sticky component takes an element and transforms it's behavior in order to, when the user scrolls he sets its position + * to fixed and maintain it until the user scrolls back to the same place. + * + * @class Ink.UI.Sticky + * @constructor + * @version 1 + * @param {String|DOMElement} selector + * @param {Object} [options] Options + * @param {Number} [options.offsetBottom=0] Number of pixels of distance from the bottomElement. + * @param {Number} [options.offsetTop=0] Number of pixels of distance from the topElement. + * @param {Boolean} [options.inlineDimensions=true] Whether to set "style.height" and "style.width" in the stuck element. Turn this off when your `stickyClass` has its own height and width and you don't want this to be dealt with through javascript. + * @param {Boolean} [options.inlinePosition=true] Whether to set "style.left" in the stuck element. Turn this off when your `stickyClass` has its own "left" position and you don't want this to be dealt with through javascript. + * @param {String} [options.wrapperClass="ink-sticky-wrapper"] Css class for the wrapper element. + * @param {String} [options.stickyClass="ink-sticky-stuck"] Css class for sticking the sticky to the screen. Add your own "stuck" class to define your own sticky behaviour. + * @param {String} [options.topElement] CSS Selector that specifies a top element with which the component could collide. + * @param {String} [options.bottomElement] CSS Selector that specifies a bottom element with which the component could collide. + * @param {Array|String} [options.activateInLayouts='medium,large'] Layouts in which the sticky behaviour is present. Pass an array or comma-separated string. + * @example + * + */ + var Sticky = function( selector, options ){ + this._rootElement = Common.elOrSelector(selector, 'Ink.UI.Sticky_1'); + + this._options = Common.options({ + offsetBottom: ['Integer', 0], + offsetTop: ['Integer', 0], + topElement: ['Element', null], + wrapperClass: ['String', 'ink-sticky-wrapper'], + stickyClass: ['String', 'ink-sticky-stuck'], + inlineDimensions: ['Boolean', true], + inlinePosition: ['Boolean', true], + bottomElement: ['Element', null], + activateInLayouts: ['String', 'medium,large'] + }, options || {}, this._rootElement ); + + // Because String#indexOf is compatible with lt IE8 but not Array#indexOf + this._options.activateInLayouts = this._options.activateInLayouts.toString(); + + this._dims = null; // force a recalculation of the dimensions later + + this._options.offsetTop = parseInt(this._options.offsetTop, 10) || 0; + this._options.offsetBottom = parseInt(this._options.offsetBottom, 10) || 0; + + if (this._options.topElement) { + this._options.topElement = Common.elOrSelector(this._options.topElement, 'Top Element'); + } + if (this._options.bottomElement) { + this._options.bottomElement = Common.elOrSelector(this._options.bottomElement, 'Sticky bottom Element'); + } + + this._wrapper = Element.create('div', { className: this._options.wrapperClass }); + Element.wrap(this._rootElement, this._wrapper); + + this._init(); + }; + + Sticky.prototype = { + + /** + * Init function called by the constructor + * + * @method _init + * @private + */ + _init: function() { + var scrollTarget = document.addEventListener ? document : window; + this._onScroll = Ink.bind(Event.throttle(this._onScroll, 33), this); // Because this is called directly. + Event.observe( scrollTarget, 'scroll', this._onScroll ); + Event.observe( window, 'resize', Ink.bindEvent(Event.throttle(this._onResize, 100), this) ); + this._onScroll(); + }, + + /** + * Returns whether the sticky is disabled in the current view + * + * @method isDisabledInLayout + * @private + */ + _isDisabledInLayout: function () { + var currentLayout = Common.currentLayout(); + if (!currentLayout) { return false; } + return this._options.activateInLayouts.indexOf(currentLayout) === -1; + }, + + /** + * Scroll handler. + * + * @method _onScroll + * @private + */ + _onScroll: function(){ + var dims = this._getDims(); + var scrollHeight = Element.scrollHeight(); + + var unstick = this._isDisabledInLayout() || + scrollHeight <= dims.top - this._options.offsetTop || + (this._options.topElement && this._options.topElement.getBoundingClientRect().bottom + this._options.offsetTop > 0); + + if( unstick ) { + // We're on top, no sticking. position:static is the "normal" position. + this._unstick(); + return; + } + + // If we stick it now, what will be its boundingClientRect.bottom ? + var bottomOfSticky = this._options.offsetTop + dims.height + Element.scrollHeight(); + var maxBottomOfSticky = document.body.scrollHeight; + + if (this._options.bottomElement) { + maxBottomOfSticky = + this._options.bottomElement.getBoundingClientRect().top + + Element.scrollHeight(); + } + + maxBottomOfSticky -= this._options.offsetBottom; + + if ( bottomOfSticky < maxBottomOfSticky ) { + // Stick to screen! + this._stickTo('screen'); + } else { + // Stick to bottom + this._stickTo('bottom'); + } + }, + + /** + * Have the sticky stick nowhere, to the screen, or to the bottom. + * + * @method _stickTo + * @private + */ + _stickTo: function (where) { + var style = this._rootElement.style; + var dims = this._getDims(); + + Css.addClassName(this._rootElement, this._options.stickyClass); + this._wrapper.style.height = dims.height + 'px'; + + this._inlineDimensions(dims.height + 'px', dims.width + 'px'); + + if (this._options.inlinePosition === false) { + return; + } + + style.left = dims.left + 'px'; + + if (where === 'screen') { + style.bottom = null; + style.top = this._options.offsetTop + 'px'; + } else if (where === 'bottom') { + // Distance between bottom of sticky and bottom of document + var bottom = this._getBottomOffset(); + + // Distance between bottom of viewport and bottom of document + var bottomOfViewport = Element.scrollHeight() + Element.viewportHeight(); + var toBottomOfDocument = Element.pageHeight() - bottomOfViewport; + + style.bottom = bottom - toBottomOfDocument + 'px'; + style.top = 'auto'; + } + }, + + /** + * "unstick" the sticky from the screen or bottom of the document + * @method _unstick + * @private + */ + _unstick: function () { + Css.removeClassName(this._rootElement, this._options.stickyClass); + // deinline dimensions of our root element + this._inlineDimensions(null, null); + + // deinline the position of our root element + if (this._options.inlinePosition) { + this._rootElement.style.left = null; + this._rootElement.style.top = null; + this._rootElement.style.bottom = null; + } + + // deinline dimensions of wrapper + this._wrapper.style.height = null; + this._wrapper.style.width = null; + + // Break the "getDims" cache + this._dims = null; + }, + + /** + * Resize handler + * + * @method _onResize + * @private + */ + _onResize: function(){ + this._dims = null; // Blow the cache so _getDims recalculates + this._onScroll(); + }, + + /** + * Recalculate the "dims" cache, or get it. + * + * The "dims" cache is to be set to null when the element is liable to have changed dimensions + * + * (eg: on resize) + * + **/ + _getDims: function () { + if (this._dims !== null) { return this._dims; } + + var style = this._rootElement.style; + + // We unstick the sticky so we can measure. + var oldPosition = style.position; + var oldWidth = style.width; + + style.position = 'static'; // [todo] this should be a class toggle + style.width = null; + + var dimensionsInStatic = Element.outerDimensions(this._rootElement); + var rect = this._wrapper.getBoundingClientRect(); + this._dims = { + height: dimensionsInStatic[1], + width: dimensionsInStatic[0], + left: rect.left + Element.scrollWidth(), + top: rect.top + Element.scrollHeight() + }; + + style.position = oldPosition; + style.width = oldWidth; + + return this._dims; + }, + + /** + * Set style.height and style.width, but not if options.inlineDimensions === false + * + * @method _inlineDimensions + * @private + */ + _inlineDimensions: function (height, width) { + if (this._options.inlineDimensions) { + this._rootElement.style.height = height; + this._rootElement.style.width = width; + } + }, + + /** + * Get the distance between the bottom of the element and the bottom of the page + * + * @method _getBottomOffset + * @private + */ + _getBottomOffset: function () { + var bottom = this._options.offsetBottom; + if (this._options.bottomElement) { + bottom += Element.pageHeight() - + Element.offsetTop(this._options.bottomElement); + } + return bottom; + } + }; + + return Sticky; + +}); diff --git a/ajax/libs/ink/2.3.1/js/ink.swipe.js b/ajax/libs/ink/2.3.1/js/ink.swipe.js new file mode 100644 index 000000000..1d547497a --- /dev/null +++ b/ajax/libs/ink/2.3.1/js/ink.swipe.js @@ -0,0 +1,209 @@ +/** + * @module Ink.UI.Swipe + * @author ink AT sapo.pt + * @version 1 + */ +Ink.createModule('Ink.UI.Swipe', '1', ['Ink.Dom.Event_1', 'Ink.Dom.Element_1', 'Ink.UI.Common_1'], function(InkEvent, InkElement, Common) { + 'use strict'; + + /** + * Subscribe swipe gestures! + * + * Supports filtering swipes be any combination of the criteria supported in the options. + * + * @class Ink.UI.Swipe + * @constructor + * @param {String|DOMElement} el + * @param {Object} options + * @param {Function} [options.onEnd] callback function for the `touchend` event. Gets all the gesture information, and is filtered by min/max Dist and Duration options (see below) + * @param {Function} [options.onStart] callback function for `touchstart` event + * @param {Function} [options.onMove] callback function for every `touchmove` event. Gets current gesture information. + * @param {Number} [options.minDist] minimum allowed distance, in pixels + * @param {Number} [options.maxDist] maximum allowed distance, in pixels + * @param {Number} [options.minDuration] minimum allowed duration, in seconds + * @param {Number} [options.maxDuration] maximum allowed duration, in seconds + * @param {String} [options.axis] if either 'x' or 'y' is passed, only swipes where the dominant axis is the given one trigger the callback + * @param {String} [options.storeGesture=false] store gesture information and provide to the callback + * @param {String} [options.stopEvents=true] stop (default and propagation) of the received events + * + * ----- + * + * Arguments received by the callbacks + * ----------------------------------- + * + * `onStart`, `onMove`, and `onEnd` receive as argument an object containing: + * + * - `event`: the DOMEvent object + * - `element`: the target element + * - `Instance`: the `Ink.UI.Swipe_1` instance + * - `position`: `Array` with `[x, y]` coordinates of current position + * - `dt`: Time passed between now and the first event (onMove only) + * - `gesture`: an Array containing [x,y] coordinates of every touchmove event received (storeGesture only) (onEnd only) + * - `time`: an Array containing all the `dt` values for every touchmove event (onEnd only) + * - `overallMovement`: X and Y distance traveled by the touch movement (`[x, y]`) (onEnd only) + * - `overallTime`: total time passed (onEnd only) + * + */ + function Swipe(el, options) { + el = Common.elOrSelector(el, 'Swipe target'); + + this._options = Ink.extendObj({ + onEnd: undefined, + onStart: undefined, + onMove: undefined, + minDist: undefined, // in pixels + maxDist: undefined, + minDuration: undefined, // in seconds + maxDuration: undefined, + axis: undefined, // x | y + storeGesture: false, + stopEvents: true + }, InkElement.data(el), options || {}); + + if (typeof options === 'function') { + this._options.onEnd = options; + } + + this._handlers = { + down: Ink.bindEvent(this._onDown, this), + move: Ink.bindEvent(this._onMove, this), + up: Ink.bindEvent(this._onUp, this) + }; + + this._element = el; + + this._init(); + } + + Swipe.prototype = { + + version: '0.1', + + _supported: ('ontouchstart' in document.documentElement), + + _init: function() { + var db = document.body; + InkEvent.observe(db, 'touchstart', this._handlers.down); + if (this._options.storeGesture || this._options.onMove) { + InkEvent.observe(db, 'touchmove', this._handlers.move); + } + InkEvent.observe(db, 'touchend', this._handlers.up); + this._isOn = false; + }, + + _isMeOrParent: function(el, parentEl) { + if (!el) {return;} + do { + if (el === parentEl) { return true; } + el = el.parentNode; + } while (el); + return false; + }, + + _pushGesture: function (coords, dt) { + if (this._options.storeGesture) { + this._gesture.push(coords); + this._time.push(dt); + } + }, + + _onDown: function(event) { + if (event.changedTouches.length !== 1) { return; } + if (!this._isMeOrParent(event.target, this._element)) { return; } + + if( this._options.stopEvents === true ){ + InkEvent.stop(event); + } + event = event.changedTouches[0]; + this._isOn = true; + this._target = event.target; + + this._t0 = +new Date(); + this._p0 = [event.pageX, event.pageY]; + + if (this._options.storeGesture) { + this._gesture = []; + this._time = []; + } + + this._pushGesture(this._p0, 0); + + if (this._options.onStart) { + this._options.onStart({ + event: event, + element: this._element, + instance: this, + position: this._p0, + dt: 0 + }); + } + }, + + _onMove: function(event) { + if (!this._isOn || event.changedTouches.length !== 1) { return; } + if( this._options.stopEvents === true ) { + InkEvent.stop(event); + } + + event = event.changedTouches[0]; + var t1 = +new Date(); + var dt = (t1 - this._t0); + + var gesture = [event.pageX, event.pageY]; + + this._pushGesture(gesture, dt); + + if (this._options.onMove) { + this._options.onMove({ + event: event, + element: this._element, + instance: this, + position: gesture, + dt: dt + }); + } + }, + + _onUp: function(event) { + if (!this._isOn || event.changedTouches.length !== 1) { return; } + + if( this._options.stopEvents === true ){ + InkEvent.stop(event); + } + event = event.changedTouches[0]; // TODO SHOULD CHECK IT IS THE SAME TOUCH + this._isOn = false; + + var t1 = +new Date(); + var p1 = [event.pageX, event.pageY]; + var dt = (t1 - this._t0); + var dr = [ + p1[0] - this._p0[0], + p1[1] - this._p0[1] + ]; + var dist = Math.sqrt(dr[0]*dr[0] + dr[1]*dr[1]); + var axis = Math.abs(dr[0]) > Math.abs(dr[1]) ? 'x' : 'y'; + + var o = this._options; + if (o.minDist && dist < o.minDist) { return; } + if (o.maxDist && dist > o.maxDist) { return; } + if (o.minDuration && dt < o.minDuration) { return; } + if (o.maxDuration && dt > o.maxDuration) { return; } + if (o.axis && axis !== o.axis) { return; } + + if (this._options.onEnd) { + this._options.onEnd({ + event: event, + element: this._element, + instance: this, + gesture: this._gesture, + time: this._time, + axis: axis, + overallMovement: dr, + overallTime: dt + }); + } + } + }; + + return Swipe; +}); diff --git a/ajax/libs/ink/2.3.1/js/ink.table.js b/ajax/libs/ink/2.3.1/js/ink.table.js new file mode 100644 index 000000000..8828e6a7c --- /dev/null +++ b/ajax/libs/ink/2.3.1/js/ink.table.js @@ -0,0 +1,807 @@ +/** + * @module Ink.UI.Table_1 + * @author inkdev AT sapo.pt + * @version 1 + */ +Ink.createModule('Ink.UI.Table', '1', ['Ink.Util.Url_1','Ink.UI.Pagination_1','Ink.Net.Ajax_1','Ink.UI.Common_1','Ink.Dom.Event_1','Ink.Dom.Css_1','Ink.Dom.Element_1','Ink.Dom.Selector_1','Ink.Util.Array_1','Ink.Util.String_1', 'Ink.Util.Json_1'], function(InkUrl,Pagination, Ajax, Common, Event, Css, Element, Selector, InkArray, InkString, Json) { + 'use strict'; + + var rNumber = /\d/g; + // Turn into a number, if we can. For sorting data which could be numeric or not. + function maybeTurnIntoNumber(value) { + if( !isNaN(value) && rNumber.test(value) ){ + return parseInt(value, 10); + } else if( !isNaN(value) ){ + return parseFloat(value); + } + return value; + } + function cmp (a, b) { + if( a === b ){ + return 0; + } + return ( ( a > b ) ? 1 : -1 ); + } + // cmp function for comparing data which might be a number. + function numberishEnabledCmp (a, b) { + var aValue = maybeTurnIntoNumber(Element.textContent(a)); + var bValue = maybeTurnIntoNumber(Element.textContent(b)); + + return cmp(aValue, bValue); + } + // Object.keys polyfill + function keys(obj) { + if (typeof Object.keys !== 'undefined') { + return Object.keys(obj); + } + var ret = []; + for (var k in obj) if (obj.hasOwnProperty(k)) { + ret.push(k); + } + return ret; + } + + // Most processJSON* functions can just default to this. + function sameSame(obj) { return obj; } + /** + * The Table component transforms the native/DOM table element into a + * sortable, paginated component. + * + * @class Ink.UI.Table + * @constructor + * @version 1 + * @param {String|DOMElement} selector + * @param {Object} [options] Options + * @param {Number} [options.pageSize] + * Number of rows per page. Omit to avoid paginating. + * + * @param {String} [options.endpoint] + * Endpoint to get the records via AJAX. Omit if you don't want to do AJAX + * + * @param {Function} [options.createEndpointUrl] + * Callback to customise what URL the AJAX endpoint is at. Receives three + * arguments: base (the "endpoint" option), sort (`{ order: 'asc' or 'desc', field: fieldname }`) + * and page ({ page: page number, size: items per page }) + * + * @param {Function} [options.getDataFromEndPoint] + * Callback to allow the user to retrieve the data himself given an URL. + * Must accept two arguments: `url` and `callback`. This `callback` will + * take as a single argument a JavaScript object. + * + * @param {Function} [options.processJSONRows] + * Retrieve an array of rows from the data which came from AJAX. + * + * @param {Function} [options.processJSONHeaders] + * Get an object with all the headers' names as keys, and a { label, sortable } + * object as value. + * Example: `{col1: {label: "Column 1"}, col2: {label: "Column 2", sortable: true}`. + * Takes a single argument, the JSON response. + * + * @param {Function} [options.processJSONRow] + * Process a row object before it gets on the table. + * + * @param {Function} [options.processJSONField] + * Process the field data before putting it on the table. + * You can return HTML, a DOM element, or a string here. + * Arguments you receive: `(column, fieldData, rowIndex)`. + * + * @param {Function} [options.processJSONField.(field_name)] + * The same as processJSONField, but for a particular field. + * + * @param {Function} [options.processJSONTotalRows] + * A callback where you have a chance to say how many rows + * are in the dataset (not only on this page) you have on the + * collection. You get as an argument the JSON response. + * + * @param {Function} [options.getSortKey=null] + * A function taking a `{ columnIndex, columnName, data, element }` + * object and returning a value which serves as a sort key for the + * sorting operation. For example, if you want to sort by a + * `data-sort-key` atribute, set `getSortKey` to: + * + * function (cell) { + * return cell.element.getAttribute('data-sort-key'); + * } + * + * @param {Function} [options.getSortKey.(field_name)] + * Same as `options.getSortKey`, but for a particular field. + * + * @param {Object} [options.tdClassNames] + * An object mapping each field to what classes it gets. + * Example: `{ name: "large-10", isBoss: "hide-small" }` + * + * @param {String|DomElement|Ink.UI.Pagination} [options.pagination] + * Pagination instance or element. + * + * @param {Object} [options.paginationOptions] + * Override the options with which we instantiate the Ink.UI.Pagination. + * + * @param {Boolean} [options.allowResetSorting] + * Allow sort order to be set to "none" in addition to "ascending" and "descending" + * + * @param {String|Array} [options.visibleFields] + * Set of fields which get shown on the table + * @example + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
              PepperScoville Rating
              Trinidad Moruga Scorpion1500000
              Bhut Jolokia1000000
              Naga Viper1463700
              Red Savina Habanero580000
              Habanero350000
              Scotch Bonnet180000
              Malagueta50000
              Tabasco35000
              Serrano Chili27000
              Jalapeño8000
              Poblano1500
              Peperoncino500
              + * + * + */ + var Table = function( selector, options ){ + + /** + * Get the root element + */ + this._rootElement = Common.elOrSelector(selector, 'Ink.UI.Table :'); + + if( this._rootElement.nodeName.toLowerCase() !== 'table' ){ + throw new Error('[Ink.UI.Table] :: The element is not a table'); + } + + this._options = Common.options({ + pageSize: ['Integer', null], + endpoint: ['String', null], + createEndpointUrl: ['Function', null /* default func uses above option */], + getDataFromEndPoint: ['Function', null /* by default use plain ajax for JSON */], + processJSONRows: ['Function', sameSame], + processJSONRow: ['Function', sameSame], + processJSONField: ['Function', sameSame], + processJSONHeaders: ['Function', function (dt) { return dt.fields; }], + processJSONTotalRows: ['Function', function (dt) { return dt.length || dt.totalRows; }], + getSortKey: ['Function', null], + pagination: ['Element', null], + allowResetSorting: ['Boolean', false], + visibleFields: ['String', null], + tdClassNames: ['Object', {}], + paginationOptions: ['Object', null] + }, options || {}, this._rootElement); + + /** + * Checking if it's in markup mode or endpoint mode + */ + this._markupMode = !this._options.endpoint; + + if( this._options.visibleFields ){ + this._options.visibleFields = this._options.visibleFields.toString().split(/[, ]+/g); + } + + this._thead = this._rootElement.tHead || this._rootElement.createTHead(); + this._headers = Selector.select('th', this._thead); + + /** + * Initializing variables + */ + this._handlers = { + thClick: null + }; + this._originalFields = [ + // field headers from the DOM + ]; + this._sortableFields = { + // Identifies which columns are sorted and how. + // columnIndex: 'none'|'asc'|'desc' + }; + this._originalData = this._data = []; + this._pagination = null; + this._totalRows = 0; + + this._handlers.thClick = Event.observeDelegated(this._rootElement, 'click', + 'thead th[data-sortable="true"]', + Ink.bindMethod(this, '_onThClick')); + + this._init(); + }; + + Table.prototype = { + + /** + * Init function called by the constructor + * + * @method _init + * @private + */ + _init: function(){ + /** + * If not is in markup mode, we have to do the initial request + * to get the first data and the headers + */ + if( !this._markupMode ) { + /* Endpoint mode */ + this._getData( ); + } else /* Markup mode */ { + this._resetSortOrder(); + this._addHeadersClasses(); + + /** + * Getting the table's data + */ + this._data = Selector.select('tbody tr', this._rootElement); + this._originalData = this._data.slice(0); + + this._totalRows = this._data.length; + + /** + * Set pagination if options tell us to + */ + this._setPagination(); + } + }, + + /** + * Add the classes in this._options.tdClassNames to our table headers. + * @method _addHeadersClasses + * @private + */ + _addHeadersClasses: function () { + var headerLabel; + var classNames; + for (var i = 0, len = this._headers.length; i < len; i++) { + headerLabel = Element.textContent(this._headers[i]); + classNames = this._options.tdClassNames[headerLabel]; + // TODO do not find header labels this way. But how? + if (classNames) { + Css.addClassName(this._headers[i], classNames); + } + } + }, + + /** + * Click handler. This will mainly handle the sorting (when you click in the headers) + * + * @method _onThClick + * @param {Event} event Event obj + * @private + */ + _onThClick: function( event ){ + var tgtEl = Event.element(event), + paginated = this._options.pageSize !== undefined; + + Event.stop(event); + + var index = InkArray.keyValue(tgtEl, this._headers, true); + var sortable = index !== false && this._sortableFields[index] !== undefined; + + if( !sortable ){ + return; + } + + if( !this._markupMode && paginated ){ + this._invertSortOrder(index, false); + } else { + if ( (this._sortableFields[index] === 'desc') && this._options.allowResetSorting ) { + this._setSortOrderOfColumn(index, null); + this._data = this._originalData.slice(0); + } else { + this._invertSortOrder(index, true); + } + + var tbody = Selector.select('tbody',this._rootElement)[0]; + Common.cleanChildren(tbody); + InkArray.each(this._data, Ink.bindMethod(tbody, 'appendChild')); + + if (this._pagination) { + this._pagination.setCurrent(0); + this._paginate(1); + } + } + }, + + _invertSortOrder: function (index, sortAndReverse) { + var isAscending = this._sortableFields[index] === 'asc'; + + for (var i = 0, len = this._headers.length; i < len; i++) { + this._setSortOrderOfColumn(i, null); + } + + if (sortAndReverse) { + this._sort(index); + if (isAscending) { + this._data.reverse(); + } + } + + this._setSortOrderOfColumn(index, !isAscending); + }, + + _setSortOrderOfColumn: function(index, up) { + var header = this._headers[index]; + var caretHtml = ''; + var order = 'none'; + + if (up === true) { + caretHtml = ''; + order = 'asc'; + } else if (up === false) { + caretHtml = ''; + order = 'desc'; + } + + this._sortableFields[index] = order; + header.innerHTML = Element.textContent(header) + caretHtml; + }, + + /** + * Applies and/or changes the CSS classes in order to show the right columns + * + * @method _paginate + * @param {Number} page Current page + * @private + */ + _paginate: function( page ){ + if (!this._pagination) { return; } + + var pageSize = this._options.pageSize; + + // Hide everything except the items between these indices + var firstIndex = (page - 1) * pageSize; + var lastIndex = firstIndex + pageSize; + + InkArray.each(this._data, function(item, index){ + if (index >= firstIndex && index < lastIndex) { + Css.removeClassName(item,'hide-all'); + } else { + Css.addClassName(item,'hide-all'); + } + }); + + }, + + /* register fields into this._originalFields, whether they come from JSON or a table. + * @method _registerFieldNames + * @private + * @param [names] The field names in an array + **/ + _registerFieldNames: function (names) { + this._originalFields = []; + + InkArray.forEach(names, Ink.bind(function (field) { + if( !this._fieldIsVisible(field) ){ + return; // The user deems this not to be necessary to see. + } + this._originalFields.push(field); + }, this)); + }, + + _fieldIsVisible: function (field) { + return !this._options.visibleFields || + (this._options.visibleFields.indexOf(field) !== -1); + }, + + /** + * Sorts by a specific column. + * + * @method _sort + * @param {Number} index Column number (starting at 0) + * @private + */ + _sort: function( index ){ + // TODO this is THE worst way to declare field names. Incompatible with i18n and a lot of other things. + var fieldName = Element.textContent(this._headers[index]); + var keyFunction = this._options.getSortKey; + + if (keyFunction) { + keyFunction = + typeof keyFunction[fieldName] === 'function' ? + keyFunction[fieldName] : + typeof keyFunction === 'function' ? + keyFunction : + null; + } + + var self = this; + + this._data.sort(function (trA, trB) { + var elementA = Ink.ss('td', trA)[index]; + var elementB = Ink.ss('td', trB)[index]; + if (keyFunction) { + return cmp(userKey(elementA), userKey(elementB)); + } else { + return numberishEnabledCmp(elementA, elementB, index); + } + }); + + function userKey(element) { + return keyFunction.call(self, { + columnIndex: index, + columnName: fieldName, + data: Element.textContent(element), + element: element + }); + } + }, + + /** + * Assembles the headers markup + * + * @method _createHeadersFromJson + * @param {Object} headers Key-value object that contains the fields as keys, their configuration (label and sorting ability) as value + * @private + */ + _createHeadersFromJson: function( headers ){ + this._registerFieldNames(keys(headers)); + + if (this._thead.children.length) { return; } + + var tr = this._thead.insertRow(0); + var th; + + for (var i = 0, len = headers.length; i < len; i++) { + if (this._fieldIsVisible(headers[i])) { + th = Element.create('th'); + th = this._createSingleHeaderFromJson(headers[i], th); + tr.appendChild(th); + this._headers.push(th); + } + } + }, + + _createSingleHeaderFromJson: function (header, th) { + if (header.sortable) { + th.setAttribute('data-sortable','true'); + } + + if (header.label){ + Element.setTextContent(th, header.label); + } + + return th; + }, + + /** + * Reset the sort order as marked on the table headers to "none" + * + * @method _resetSortOrder + * @private + */ + _resetSortOrder: function(){ + /** + * Setting the sortable columns and its event listeners + */ + for (var i = 0, len = this._headers.length; i < len; i++) { + var dataset = Element.data( this._headers[i] ); + if (dataset.sortable && dataset.sortable.toString() === 'true') { + this._sortableFields[i] = 'none'; + } + } + }, + + /** + * This method gets the rows from AJAX and places them as and + * + * @method _createRowsFromJSON + * @param {Object} rows Array of objects with the data to be showed + * @private + */ + _createRowsFromJSON: function( rows ){ + var tbody = Selector.select('tbody',this._rootElement)[0]; + + if( !tbody ){ + tbody = document.createElement('tbody'); + this._rootElement.appendChild( tbody ); + } else { + Element.setHTML(tbody, ''); + } + + this._data = []; + var row; + + for (var trIndex in rows) { + if (rows.hasOwnProperty(trIndex)) { + row = this._options.processJSONRow(rows[trIndex]); + this._createSingleRowFromJson(tbody, row, trIndex); + } + } + + this._originalData = this._data.slice(0); + }, + + _createSingleRowFromJson: function (tbody, row, rowIndex) { + var tr = document.createElement('tr'); + tbody.appendChild( tr ); + for( var field in row ){ + if (row.hasOwnProperty(field)) { + this._createFieldFromJson(tr, row[field], field, rowIndex); + } + } + this._data.push(tr); + }, + + _createFieldFromJson: function (tr, fieldData, fieldName, rowIndex) { + if (!this._fieldIsVisible(fieldName)) { return; } + + var processor = + this._options.processJSONField[fieldName] || // per-field callback + this._options.processJSONField; // generic callback + + var result; + if (typeof processor === 'function') { + result = processor(fieldData, fieldName, rowIndex); + } else { + result = fieldData; + } + var elm = this._elOrFieldData(result); + + var className = this._options.tdClassNames[fieldName]; + if (className) { + Css.addClassName(elm, className); + } + + tr.appendChild(elm); + }, + + _elOrFieldData: function (processed) { + if (Common.isDOMElement(processed)) { + return processed; + } + + var isString = typeof processed === 'string'; + var isNumber = typeof processed === 'number'; + var elm = Element.create('td'); + + if (isString && /^\s*? + * + * + * + * + * + *

              Content

              + *

              Content

              + *

              Content

              + *

              Content

              + *

              Content

              + * + * + * + * + */ + var Tabs = function(selector, options) { + this._element = Common.elOrSelector(selector, 'Ink.UI.Tabs tab container'); + + this._options = Ink.extendObj({ + preventUrlChange: false, + active: undefined, + disabled: [], + onBeforeChange: undefined, + onChange: undefined, + triggerEventsOnLoad: true + }, options || {}, Element.data(this._element)); + + this._handlers = { + tabClicked: Ink.bindEvent(this._onTabClicked,this), + disabledTabClicked: Ink.bindEvent(this._onDisabledTabClicked,this), + resize: Ink.bindEvent(Event.throttle(this._onResize, 100),this) + }; + + this._init(); + }; + + Tabs.prototype = { + + /** + * Init function called by the constructor + * + * @method _init + * @private + */ + _init: function() { + this._menu = Selector.select('.tabs-nav', this._element)[0]; + this._menuTabs = this._menu.children; + this._contentTabs = Selector.select('.tabs-content', this._element); + + //initialization of the tabs, hides all content before setting the active tab + this._initializeDom(); + + // subscribe events + this._observe(); + + //sets the first active tab + this._setFirstActive(); + + this._handlers.resize(); + + Common.registerInstance(this, this._element, 'tabs'); + }, + + /** + * Initialization of the tabs, hides all content before setting the active tab + * + * @method _initializeDom + * @private + */ + _initializeDom: function(){ + for(var i = 0; i < this._contentTabs.length; i++){ + Css.addClassName(this._contentTabs[i], 'hide-all'); + } + }, + + /** + * Subscribe events + * + * @method _observe + * @private + */ + _observe: function() { + InkArray.each(this._menuTabs,Ink.bind(function(elem){ + var link = Selector.select('a', elem)[0]; + if(InkArray.inArray(link.getAttribute('href'), this._options.disabled)){ + this.disable(link); + } else { + this.enable(link); + } + },this)); + + Event.observe(window, 'resize', this._handlers.resize); + }, + + /** + * Run at instantiation, to determine which is the first active tab + * fallsback from window.location.href to options.active to the first not disabled tab + * + * @method _setFirstActive + * @private + */ + _setFirstActive: function() { + var hash = window.location.hash; + + var activeMenuLink = this._findLinkByHref(hash) || + (this._options.active && this._findLinkByHref(this._options.active)) || + Selector.select('a', this._menu)[0]; + + this._changeTab(activeMenuLink, this._options.triggerEventsOnLoad); + }, + + /** + * Changes to the desired tab + * + * @method _changeTab + * @param {DOMElement} link anchor linking to the content container + * @param {boolean} runCallbacks defines if the callbacks should be run or not + * @private + */ + _changeTab: function(link, runCallbacks){ + if(runCallbacks && typeof this._options.onBeforeChange !== 'undefined'){ + this._options.onBeforeChange(this); + } + + var selector = link.getAttribute('href'); + if (this._activeMenuTab) { + Css.removeClassName(this._activeMenuTab, 'active'); + Css.removeClassName(this._activeContentTab, 'active'); + Css.addClassName(this._activeContentTab, 'hide-all'); + } + + this._activeMenuLink = link; + this._activeMenuTab = this._activeMenuLink.parentNode; + this._activeContentTab = Selector.select(selector.substr(selector.indexOf('#')), this._element)[0]; + + if (!this._activeContentTab) { + this._activeMenuLink = this._activeMenuTab = this._activeContentTab = null; + return; + } + + Css.addClassName(this._activeMenuTab, 'active'); + Css.addClassName(this._activeContentTab, 'active'); + Css.removeClassName(this._activeContentTab, 'hide-all'); + + if(runCallbacks && typeof(this._options.onChange) !== 'undefined'){ + this._options.onChange(this); + } + }, + + /** + * Tab clicked handler + * + * @method _onTabClicked + * @param {Event} ev + * @private + */ + _onTabClicked: function(ev) { + Event.stop(ev); + + var target = Event.findElement(ev, 'A'); + if(!target || target.nodeName.toLowerCase() !== 'a') { + return; + } + + var href = target.getAttribute('href').substr(target.getAttribute('href').indexOf('#')); + + if (!href || Ink.i(href.replace(/^#/, '')) === null) { + return; + } + + if (this._options.preventUrlChange.toString() !== 'true') { + window.location.hash = href; + } + + if (target === this._activeMenuLink) { + return; + } + this.changeTab(target); + }, + + /** + * Disabled tab clicked handler + * + * @method _onDisabledTabClicked + * @param {Event} ev + * @private + */ + _onDisabledTabClicked: function(ev) { + Event.stop(ev); + }, + + /** + * Resize handler + * + * @method _onResize + * @private + */ + _onResize: function(){ + var currentLayout = Common.currentLayout(); + if(currentLayout === this._lastLayout){ + return; + } + + if(currentLayout === Common.Layouts.SMALL || currentLayout === Common.Layouts.MEDIUM){ + Css.removeClassName(this._menu, 'menu'); + Css.removeClassName(this._menu, 'horizontal'); + // Css.addClassName(this._menu, 'pills'); + } else { + Css.addClassName(this._menu, 'menu'); + Css.addClassName(this._menu, 'horizontal'); + // Css.removeClassName(this._menu, 'pills'); + } + this._lastLayout = currentLayout; + }, + + /***************** + * Aux Functions * + *****************/ + + /** + * Allows the hash to be passed with or without the cardinal sign + * + * @method _hashify + * @param {String} hash the string to be hashified + * @return {String} Resulting hash + * @private + */ + _hashify: function(hash){ + if(!hash){ + return ""; + } + return hash.indexOf('#') === 0? hash : '#' + hash; + }, + + /** + * Returns the anchor with the desired href + * + * @method _findLinkBuHref + * @param {String} href the href to be found on the returned link + * @return {String|undefined} [description] + * @private + */ + _findLinkByHref: function(href){ + href = this._hashify(href); + + // Find a link which has a href ending with... + return Selector.select('a[href$="' + href + '"]', this._menu)[0]; + }, + + /************** + * PUBLIC API * + **************/ + + /** + * Changes to the desired tag + * + * @method changeTab + * @param {String|DOMElement} selector the id of the desired tab or the link that links to it + * @public + */ + changeTab: function(selector) { + var element = (selector.nodeType === 1)? selector : this._findLinkByHref(this._hashify(selector)); + if(!element || Css.hasClassName(element, 'ink-disabled')){ + return; + } + this._changeTab(element, true); + }, + + /** + * Disables the desired tag + * + * @method disable + * @param {String|DOMElement} selector the id of the desired tab or the link that links to it + * @public + */ + disable: function(selector){ + var element = (selector.nodeType === 1)? selector : this._findLinkByHref(this._hashify(selector)); + if(!element){ + return; + } + Event.stopObserving(element, 'click', this._handlers.tabClicked); + Event.observe(element, 'click', this._handlers.disabledTabClicked); + Css.addClassName(element, 'ink-disabled'); + }, + + /** + * Enables the desired tag + * + * @method enable + * @param {String|DOMElement} selector the id of the desired tab or the link that links to it + * @public + */ + enable: function(selector){ + var element = (selector.nodeType === 1)? selector : this._findLinkByHref(this._hashify(selector)); + if(!element){ + return; + } + Event.stopObserving(element, 'click', this._handlers.disabledTabClicked); + Event.observe(element, 'click', this._handlers.tabClicked); + Css.removeClassName(element, 'ink-disabled'); + }, + + /*********** + * Getters * + ***********/ + + /** + * Returns the active tab id + * + * @method activeTab + * @return {String} ID of the active tab. + * @public + */ + activeTab: function(){ + return this._activeContentTab.getAttribute('id'); + }, + + /** + * Returns the current active Menu LI + * + * @method activeMenuTab + * @return {DOMElement} Active menu LI. + * @public + */ + activeMenuTab: function(){ + return this._activeMenuTab; + }, + + /** + * Returns the current active Menu anchorChanges to the desired tag + * + * @method activeMenuLink + * @return {DOMElement} Active menu link + * @public + */ + activeMenuLink: function(){ + return this._activeMenuLink; + }, + + /** + * Returns the current active Content Tab + * + * @method activeContentTab + * @return {DOMElement} Active Content Tab + * @public + */ + activeContentTab: function(){ + return this._activeContentTab; + }, + + /** + * Unregisters the component and removes its markup from the DOM + * + * @method destroy + * @public + */ + destroy: Common.destroyComponent + }; + + return Tabs; + +}); diff --git a/ajax/libs/ink/2.3.1/js/ink.tagfield.js b/ajax/libs/ink/2.3.1/js/ink.tagfield.js new file mode 100644 index 000000000..897eb6f35 --- /dev/null +++ b/ajax/libs/ink/2.3.1/js/ink.tagfield.js @@ -0,0 +1,266 @@ +/* + * @module Ink.UI.TagField_1 + * @author inkdev AT sapo.pt + * @version 1 + */ +Ink.createModule("Ink.UI.TagField","1",["Ink.Dom.Element_1", "Ink.Dom.Event_1", "Ink.Dom.Css_1", "Ink.Dom.Browser_1", "Ink.UI.Droppable_1", "Ink.Util.Array_1", "Ink.Dom.Selector_1", "Ink.UI.Common_1"],function( InkElement, InkEvent, Css, Browser, Droppable, InkArray, Selector, Common) { + 'use strict'; + + var enterKey = 13; + var backspaceKey = 8; + var isTruthy = function (val) {return !!val;}; + + /** + * Use this class to have a field where a user can input several tags into a single text field. A good example is allowing the user to describe a blog post or a picture through tags, for later searching. + * + * The markup is as follows: + * + * + * + * By applying this UI class to the above input, you get a tag field with the tags "initial" and "value". The class preserves the original input element. It remains hidden and is updated with new tag information dynamically, so regular HTML form logic still applies. + * + * Below "input" refers to the current value of the input tag (updated as the user enters text, of course), and "output" refers to the value which this class writes back to said input tag. + * + * @class Ink.UI.TagField + * @version 1 + * @constructor + * @param {String|InputElement} element Selector or DOM Input Element. + * @param {Object} [options] + * @param {String|Array} [options.tags] initial tags in the input + * @param {Boolean} [options.allowRepeated=true] allow user to input several tags + * @param {RegExp} [options.separator=/[,;(space)]+/g] Split the input by this RegExp. The default splits by spaces, commas and semicolons + * @param {String} [options.outSeparator=','] Use this string to separate each tag from the next in the output. + * @param {Boolean} [options.autoSplit=true] + * @param {Integer} [options.maxTags=-1] Maximum amount of tags the user can write. + * @example + */ + function TagField(element, options) { + this.init(element, options); + } + + TagField.prototype = { + /** + * Init function called by the constructor + * + * @method _init + * @private + */ + init: function(element, options) { + element = this._element = Common.elOrSelector(element, 'Ink.UI.TagField'); + var o = this._options = Common.options('Ink.UI.TagField', { + tags: ['String', []], + tagQuery: ['Object', null], + tagQueryAsync: ['Object', null], + allowRepeated: ['Boolean', false], + maxTags: ['Integer', -1], + outSeparator: ['String', ','], + separator: ['String', /[,; ]+/g], + autoSplit: ['Boolean', true] + }, options || {}, this._element); + + if (typeof o.separator === 'string') { + o.separator = new RegExp(o.separator, 'g'); + } + + if (typeof o.tags === 'string') { + // coerce to array using the separator + o.tags = this._readInput(o.tags); + } + + Css.addClassName(this._element, 'hide-all'); + + this._viewElm = InkElement.create('div', { + className: 'ink-tagfield', + insertAfter: this._element + }); + + this._input = InkElement.create('input', { + type: 'text', + className: 'new-tag-input', + insertBottom: this._viewElm + }); + + var tags = [].concat(o.tags, this._tagsFromMarkup(this._element)); + + this._tags = []; + + InkArray.each(tags, Ink.bindMethod(this, '_addTag')); + + InkEvent.observe(this._input, 'keyup', Ink.bindEvent(this._onKeyUp, this)); + InkEvent.observe(this._input, 'change', Ink.bindEvent(this._onKeyUp, this)); + InkEvent.observe(this._input, 'keydown', Ink.bindEvent(this._onKeyDown, this)); + InkEvent.observe(this._input, 'blur', Ink.bindEvent(this._onBlur, this)); + InkEvent.observe(this._viewElm, 'click', Ink.bindEvent(this._refocus, this)); + }, + + destroy: function () { + InkElement.remove(this._viewElm); + Css.removeClassName(this._element, 'hide-all'); + }, + + _tagsFromMarkup: function (element) { + var tagname = element.tagName.toLowerCase(); + if (tagname === 'input') { + return this._readInput(element.value); + } else if (tagname === 'select') { + return InkArray.map(element.getElementsByTagName('option'), function (option) { + return InkElement.textContent(option); + }); + } else { + throw new Error('Cannot read tags from a ' + tagname + ' tag. Unknown tag'); + } + }, + + _tagsToMarkup: function (tags, element) { + var tagname = element.tagName.toLowerCase(); + if (tagname === 'input') { + if (this._options.separator) { + element.value = tags.join(this._options.outSeparator); + } + } else if (tagname === 'select') { + element.innerHTML = ''; + InkArray.each(tags, function (tag) { + var opt = InkElement.create('option', {selected: 'selected'}); + InkElement.setTextContent(opt, tag); + element.appendChild(opt); + }); + } else { + throw new Error('TagField: Cannot read tags from a ' + tagname + ' tag. Unknown tag'); + } + }, + + _addTag: function (tag) { + if (this._options.maxTags !== -1 && + this._tags.length >= this._options.maxTags) { + return; + } + if ((!this._options.allowRepeated && + InkArray.inArray(tag, this._tags, tag)) || !tag) { + return false; + } + var elm = InkElement.create('span', { + className: 'ink-tag', + setTextContent: tag + ' ' + }); + + var remove = InkElement.create('span', { + className: 'remove icon icon-remove icon-times', // fontawesome 3 changed icon-remove's name to icon-times + insertBottom: elm + }); + InkEvent.observe(remove, 'click', Ink.bindEvent(this._removeTag, this, null)); + + var spc = document.createTextNode(' '); + + this._tags.push(tag); + this._viewElm.insertBefore(elm, this._input); + this._viewElm.insertBefore(spc, this._input); + this._tagsToMarkup(this._tags, this._element); + }, + + _readInput: function (text) { + if (this._options.separator) { + return InkArray.filter(text.split(this._options.separator), isTruthy); + } else { + return [text]; + } + }, + + _onKeyUp: function () { // TODO control input box size + if (!this._options.autoSplit) { + return; + } + var split = this._input.value.split(this._options.separator); + if (split.length <= 1) { + return; + } + var last = split[split.length - 1]; + split = split.splice(0, split.length - 1); + split = InkArray.filter(split, isTruthy); + + InkArray.each(split, Ink.bind(this._addTag, this)); + this._input.value = last; + }, + + _onKeyDown: function (event) { + if (event.which === enterKey) { + return this._onEnterKeyDown(event); + } else if (event.which === backspaceKey) { + return this._onBackspaceKeyDown(); + } else if (this._removeConfirm) { + // user pressed another key, cancel removal from a backspace key + this._unsetRemovingVisual(this._tags.length - 1); + } + }, + + /** + * When the user presses backspace twice on the empty input, we delete the last tag on the field. + * @method onBackspaceKeyDown + * @private + */ + _onBackspaceKeyDown: function () { + if (this._input.value) { return; } + + if (this._removeConfirm) { + this._unsetRemovingVisual(this._tags.length - 1); + this._removeTag(this._tags.length - 1); + this._removeConfirm = null; + } else { + this._setRemovingVisual(this._tags.length - 1); + } + }, + + _onEnterKeyDown: function (event) { + var tag = this._input.value; + if (tag) { + this._addTag(tag); + this._input.value = ''; + } + InkEvent.stopDefault(event); + }, + + _onBlur: function () { + this._addTag(this._input.value); + this._input.value = ''; + }, + + /* For when the user presses backspace. + * Set the style of the tag so that it seems like it's going to be removed + * if they press backspace again. */ + _setRemovingVisual: function (tagIndex) { + var elm = this._viewElm.children[tagIndex]; + Css.addClassName(elm, 'tag-deleting'); + + this._removeRemovingVisualTimeout = setTimeout(Ink.bindMethod(this, '_unsetRemovingVisual', tagIndex), 4000); + InkEvent.observe(this._input, 'blur', Ink.bindMethod(this, '_unsetRemovingVisual', tagIndex)); + this._removeConfirm = true; + }, + _unsetRemovingVisual: function (tagIndex) { + var elm = this._viewElm.children[tagIndex]; + if (elm) { + Css.removeClassName(elm, 'tag-deleting'); + clearTimeout(this._removeRemovingVisualTimeout); + } + this._removeConfirm = null; + }, + + _removeTag: function (event) { + var index; + if (typeof event === 'object') { // click event on close button + var elm = InkEvent.element(event).parentNode; + index = InkElement.parentIndexOf(this._viewElm, elm); + } else if (typeof event === 'number') { // manual removal + index = event; + } + this._tags = InkArray.remove(this._tags, index, 1); + InkElement.remove(this._viewElm.children[index]); + this._tagsToMarkup(this._tags, this._element); + }, + + _refocus: function (event) { + this._input.focus(); + InkEvent.stop(event); + return false; + } + }; + return TagField; +}); diff --git a/ajax/libs/ink/2.3.1/js/ink.toggle.js b/ajax/libs/ink/2.3.1/js/ink.toggle.js new file mode 100644 index 000000000..f640f8bb2 --- /dev/null +++ b/ajax/libs/ink/2.3.1/js/ink.toggle.js @@ -0,0 +1,274 @@ +/** + * @module Ink.UI.Toggle_1 + * @author inkdev AT sapo.pt + * @version 1 + */ +Ink.createModule('Ink.UI.Toggle', '1', ['Ink.UI.Common_1','Ink.Dom.Event_1','Ink.Dom.Css_1','Ink.Dom.Element_1','Ink.Dom.Selector_1','Ink.Util.Array_1'], function(Common, InkEvent, Css, InkElement, Selector, InkArray ) { + 'use strict'; + + /** + * Toggle component + * + * @class Ink.UI.Toggle + * @constructor + * @version 1 + * @param {String|DOMElement} selector + * @param {Object} [options] Options + * @param {String} options.target CSS Selector that specifies the elements that this component will toggle + * @param {String} [options.classNameOn='show-all'] className when toggle is On + * @param {String} [options.classNameOff='hide-all'] className when toggle is Off. + * @param {String} [options.triggerEvent='click'] Event that will trigger the toggling. + * @param {Boolean} [options.closeOnClick=true] When this is on, if the user clicks outside of the toggled content, the target is toggled off. + * @param {Selector} [options.closeOnInsideClick='a[href]'] Toggle off when an element matching this selector is clicked. Set to null to deactivate the check. Default: 'a[href]' (finds links) + * @param {Boolean} [options.initialState=null] Whether to start toggled off, on, or as found in the markup. (false: off, true: on, null: markup) + * @param {Function} [options.onChangeState=null] Callback to be called when the toggle state changes. Return `false` to cancel the event. + * + * @example + *
              + * + * + *
              + * + */ + var Toggle = function( selector, options ){ + this._rootElement = Common.elOrSelector(selector, '[Ink.UI.Toggle root element]:'); + + this._options = Ink.extendObj({ + target : undefined, + triggerEvent: 'click', + closeOnClick: true, + isAccordion: false, + initialState: null, + classNameOn: 'show-all', + classNameOff: 'hide-all', + togglesDisplay: null, + closeOnInsideClick: 'a[href]', // closes the toggle when a target is clicked and it is a link + onChangeState: null + }, options || {}, InkElement.data(this._rootElement)); + + this._targets = Common.elsOrSelector(this._options.target, 'Ink.UI.Toggle target option'); + + // Boolean option handling + this._options.closeOnClick = this._options.closeOnClick.toString() === 'true'; + // Actually a throolean + if (this._options.initialState !== null){ + this._options.initialState = this._options.initialState.toString() === 'true'; + } else { + this._options.initialState = Css.getStyle(this._targets[0], 'display') !== 'none'; + } + + if (this._options.classNameOn !== 'show-all' || this._options.classNameOff !== 'hide-all') { + for (var i = 0, len = this._targets.length; i < len; i++) { + Css.removeClassName(this._targets[i], 'show-all'); + Css.removeClassName(this._targets[i], 'hide-all'); + } + } + + this._init(); + }; + + Toggle.prototype = { + + /** + * Init function called by the constructor + * + * @method _init + * @private + */ + _init: function(){ + this._accordion = ( Css.hasClassName(this._rootElement.parentNode,'accordion') || Css.hasClassName(this._targets[0].parentNode,'accordion') ); + + this._firstTime = true; + + this._bindEvents(); + + if (this._options.initialState !== null) { + this.setState(this._options.initialState, true); + } else { + // Add initial classes matching the current "display" of the object. + var state = Css.getStyle(this._targets[0], 'display') !== 'none'; + this.setState(state, true); + } + // Aditionally, remove any inline "display" style. + for (var i = 0, len = this._targets.length; i < len; i++) { + if (this._targets[i].style.display) { + this._targets[i].style.display = ''; // becomes default + } + } + }, + + /** + * @method _bindEvents + * @private + */ + _bindEvents: function () { + if ( this._options.triggerEvent ) { + InkEvent.observe( + this._rootElement, + this._options.triggerEvent, + Ink.bind(this._onTriggerEvent, this)); + } + if( this._options.closeOnClick ){ + InkEvent.observe( document, 'click', Ink.bind(this._onOutsideClick, this)); + } + if( this._options.closeOnInsideClick ) { + var sel = this._options.closeOnInsideClick; + if (sel.toString() === 'true') { + sel = '*'; + } + InkEvent.observeMulti(this._targets, 'click', Ink.bind(function (e) { + if ( InkElement.findUpwardsBySelector(InkEvent.element(e), sel) ) { + this.setState(false, true); + } + }, this)); + } + }, + + /** + * Event handler. It's responsible for handling the `triggerEvent` as defined in the options. + * + * This will trigger the toggle. + * + * @method _onTriggerEvent + * @param {Event} event + * @private + */ + _onTriggerEvent: function( event ){ + // When the togglee is a child of the toggler, we get the togglee's events here. We have to check that this event is for us. + var target = InkEvent.element(event); + + var isAncestorOfClickedElement = InkArray.some(this._targets, function (thisOne) { + return thisOne === target || InkElement.isAncestorOf(thisOne, target); + }); + + if (isAncestorOfClickedElement) { + return; + } + + if (this._accordion) { + this._updateAccordion(); + } + + var has = this.getState(); + this.setState(!has, true); + if (!has && this._firstTime) { + this._firstTime = false; + } + + InkEvent.stopDefault(event); + }, + + /** + * Be compatible with accordions + * + * @method _updateAccordion + **/ + _updateAccordion: function () { + var elms, accordionElement; + if( Css.hasClassName(this._targets[0].parentNode,'accordion') ){ + accordionElement = this._targets[0].parentNode; + } else { + accordionElement = this._targets[0].parentNode.parentNode; + } + elms = Selector.select('.toggle, .ink-toggle',accordionElement); + for(var i=0; i 0) && (targetElm[0] !== this._targets[0]) ){ + targetElm[0].style.display = 'none'; + } + } + }, + + /** + * Click handler. Will handle clicks outside the toggle component. + * + * @method _onOutsideClick + * @param {Event} event + * @private + */ + _onOutsideClick: function( event ){ + var tgtEl = InkEvent.element(event), + shades; + + var ancestorOfTargets = InkArray.some(this._targets, function (target) { + return InkElement.isAncestorOf(target, tgtEl) || target === tgtEl; + }); + + if( (this._rootElement === tgtEl) || InkElement.isAncestorOf(this._rootElement, tgtEl) || ancestorOfTargets /*|| this._firstTime (I forgot what this last check was for) */) { + return; + } else if( (shades = Ink.ss('.ink-shade')).length ) { + var shadesLength = shades.length; + + for( var i = 0; i < shadesLength; i++ ){ + if( InkElement.isAncestorOf(shades[i],tgtEl) && InkElement.isAncestorOf(shades[i],this._rootElement) ){ + return; + } + } + } + + this.setState(false, true); // dismiss + }, + + /** + * Sets the state of the toggle. (on/off) + * + * @param on {Boolean} New state (on/off) + * + * @method setState + */ + setState: function (on, callHandler) { + if (on === this.getState()) { return; } + if (callHandler && typeof this._options.onChangeState === 'function') { + var ret = this._options.onChangeState(on); + if (ret === false) { return false; } // Canceled by the event handler + } + for (var i = 0, len = this._targets.length; i < len; i++) { + Css.addRemoveClassName(this._targets[i], this._options.classNameOn, on); + Css.addRemoveClassName(this._targets[i], this._options.classNameOff, !on); + } + Css.addRemoveClassName(this._rootElement, 'active', on); + }, + + /** + * Gets the state of the toggle. (on/off) + * + * @method getState + * + * @return {Boolean} whether the toggle is toggled on. + */ + getState: function () { + return Css.hasClassName(this._rootElement, 'active'); + } + }; + + return Toggle; +}); + diff --git a/ajax/libs/ink/2.3.1/js/ink.tooltip.js b/ajax/libs/ink/2.3.1/js/ink.tooltip.js new file mode 100644 index 000000000..5b8cbe31e --- /dev/null +++ b/ajax/libs/ink/2.3.1/js/ink.tooltip.js @@ -0,0 +1,462 @@ +/** + * @module Ink.UI.Tooltip_1 + * @author inkdev AT sapo.pt + */ +Ink.createModule('Ink.UI.Tooltip', '1', ['Ink.UI.Common_1', 'Ink.Dom.Event_1', 'Ink.Dom.Element_1', 'Ink.Dom.Selector_1', 'Ink.Util.Array_1', 'Ink.Dom.Css_1', 'Ink.Dom.Browser_1'], function (Common, InkEvent, InkElement, Selector, InkArray, Css) { + 'use strict'; + + /** + * @class Ink.UI.Tooltip + * @constructor + * + * @param {DOMElement|String} target Target element or selector of elements, to display the tooltips on. + * @param {Object} [options] + * @param [options.text=''] Text content for the tooltip. + * @param [options.html=''] HTML for the tooltip. Same as above, but won't escape HTML. + * @param [options.where='up'] Positioning for the tooltip. Options: + * @param options.where.up/down/left/right Place above, below, to the left of, or to the right of, the target. Show an arrow. + * @param options.where.mousemove Place the tooltip to the bottom and to the right of the mouse when it hovers the element, and follow the mouse as it moves. + * @param options.where.mousefix Place the tooltip to the bottom and to the right of the mouse when it hovers the element, keep the tooltip there motionless. + * + * @param [options.color=''] Color of the tooltip. Options are red, orange, blue, green and black. Default is white. + * @param [options.fade=0.3] Fade time; Duration of the fade in/out effect. + * @param [options.forever=0] Set to 1/true to prevent the tooltip from being erased when the mouse hovers away from the target + * @param [options.timeout=0] Time for the tooltip to live. Useful together with [options.forever]. + * @param [options.delay] Time the tooltip waits until it is displayed. Useful to avoid getting the attention of the user unnecessarily + * @param [options.template=null] Element or selector containing HTML to be cloned into the tooltips. Can be a hidden element, because CSS `display` is set to `block`. + * @param [options.templatefield=null] Selector within the template element to choose where the text is inserted into the tooltip. Useful when a wrapper DIV is required. + * + * @param [options.left,top=10] (Nitty-gritty) Spacing from the target to the tooltip, when `where` is `mousemove` or `mousefix` + * @param [options.spacing=8] (Nitty-gritty) Spacing between the tooltip and the target element, when `where` is `up`, `down`, `left`, or `right` + * + * @example + *
                + *
              • New
              • + *
              • Quit
              • + *
              • Save
              • + *
              + * + * [...] + * + * + */ + function Tooltip(element, options) { + this._init(element, options || {}); + } + + function EachTooltip(root, elm) { + this._init(root, elm); + } + + var transitionDurationName, + transitionPropertyName, + transitionTimingFunctionName; + (function () { // Feature detection + var test = document.createElement('DIV'); + var names = ['transition', 'oTransition', 'msTransition', 'mozTransition', + 'webkitTransition']; + for (var i = 0; i < names.length; i++) { + if (typeof test.style[names[i] + 'Duration'] !== 'undefined') { + transitionDurationName = names[i] + 'Duration'; + transitionPropertyName = names[i] + 'Property'; + transitionTimingFunctionName = names[i] + 'TimingFunction'; + break; + } + } + }()); + + // Body or documentElement + var bodies = document.getElementsByTagName('body'); + var body = bodies.length ? bodies[0] : document.documentElement; + + Tooltip.prototype = { + _init: function(element, options) { + var elements; + + this.options = Ink.extendObj({ + where: 'up', + zIndex: 10000, + left: 10, + top: 10, + spacing: 8, + forever: 0, + color: '', + timeout: 0, + delay: 0, + template: null, + templatefield: null, + fade: 0.3, + text: '' + }, options || {}); + + if (typeof element === 'string') { + elements = Selector.select(element); + } else if (typeof element === 'object') { + elements = [element]; + } else { + throw 'Element expected'; + } + + this.tooltips = []; + + for (var i = 0, len = elements.length; i < len; i++) { + this.tooltips[i] = new EachTooltip(this, elements[i]); + } + }, + /** + * Destroys the tooltips created by this instance + * + * @method destroy + */ + destroy: function () { + InkArray.each(this.tooltips, function (tooltip) { + tooltip._destroy(); + }); + this.tooltips = null; + this.options = null; + } + }; + + EachTooltip.prototype = { + _oppositeDirections: { + left: 'right', + right: 'left', + up: 'down', + down: 'up' + }, + _init: function(root, elm) { + InkEvent.observe(elm, 'mouseover', Ink.bindEvent(this._onMouseOver, this)); + InkEvent.observe(elm, 'mouseout', Ink.bindEvent(this._onMouseOut, this)); + InkEvent.observe(elm, 'mousemove', Ink.bindEvent(this._onMouseMove, this)); + + this.root = root; + this.element = elm; + this._delayTimeout = null; + this.tooltip = null; + }, + _makeTooltip: function (mousePosition) { + if (!this._getOpt('text') && + !this._getOpt('html') && + !InkElement.hasAttribute(this.element, 'title')) { + return false; + } + + var tooltip = this._createTooltipElement(); + + if (this.tooltip) { + this._removeTooltip(); + } + + this.tooltip = tooltip; + + this._fadeInTooltipElement(tooltip); + this._placeTooltipElement(tooltip, mousePosition); + + InkEvent.observe(tooltip, 'mouseover', Ink.bindEvent(this._onTooltipMouseOver, this)); + + var timeout = this._getFloatOpt('timeout'); + if (timeout) { + setTimeout(Ink.bind(function () { + if (this.tooltip === tooltip) { + this._removeTooltip(); + } + }, this), timeout * 1000); + } + }, + _createTooltipElement: function () { + var template = this._getOpt('template'), // User template instead of our HTML + templatefield = this._getOpt('templatefield'), + + tooltip, // The element we float + field; // Element where we write our message. Child or same as the above + + if (template) { // The user told us of a template to use. We copy it. + var temp = document.createElement('DIV'); + temp.innerHTML = Common.elOrSelector(template, 'options.template').outerHTML; + tooltip = temp.firstChild; + + if (templatefield) { + field = Selector.select(templatefield, tooltip); + if (field) { + field = field[0]; + } else { + throw 'options.templatefield must be a valid selector within options.template'; + } + } else { + field = tooltip; // Assume same element if user did not specify a field + } + } else { // We create the default structure + tooltip = document.createElement('DIV'); + Css.addClassName(tooltip, 'ink-tooltip'); + Css.addClassName(tooltip, this._getOpt('color')); + + field = document.createElement('DIV'); + Css.addClassName(field, 'content'); + + tooltip.appendChild(field); + } + + if (this._getOpt('html')) { + field.innerHTML = this._getOpt('html'); + } else if (this._getOpt('text')) { + InkElement.setTextContent(field, this._getOpt('text')); + } else { + InkElement.setTextContent(field, this.element.getAttribute('title')); + } + tooltip.style.display = 'block'; + tooltip.style.position = 'absolute'; + tooltip.style.zIndex = this._getIntOpt('zIndex'); + + return tooltip; + }, + _fadeInTooltipElement: function (tooltip) { + var fadeTime = this._getFloatOpt('fade'); + if (transitionDurationName && fadeTime) { + tooltip.style.opacity = '0'; + tooltip.style[transitionDurationName] = fadeTime + 's'; + tooltip.style[transitionPropertyName] = 'opacity'; + tooltip.style[transitionTimingFunctionName] = 'ease-in-out'; + setTimeout(function () { + tooltip.style.opacity = '1'; + }, 0); // Wait a tick + } + }, + _placeTooltipElement: function (tooltip, mousePosition) { + var where = this._getOpt('where'); + + if (where === 'mousemove' || where === 'mousefix') { + var mPos = mousePosition; + this._setPos(mPos[0], mPos[1]); + body.appendChild(tooltip); + } else if (where.match(/(up|down|left|right)/)) { + body.appendChild(tooltip); + var targetElementPos = InkElement.offset(this.element); + var tleft = targetElementPos[0], + ttop = targetElementPos[1]; + + var centerh = (InkElement.elementWidth(this.element) / 2) - (InkElement.elementWidth(tooltip) / 2), + centerv = (InkElement.elementHeight(this.element) / 2) - (InkElement.elementHeight(tooltip) / 2); + var spacing = this._getIntOpt('spacing'); + + var tooltipDims = InkElement.elementDimensions(tooltip); + var elementDims = InkElement.elementDimensions(this.element); + + var maxX = InkElement.scrollWidth() + InkElement.viewportWidth(); + var maxY = InkElement.scrollHeight() + InkElement.viewportHeight(); + + where = this._getWhereValueInsideViewport(where, { + left: tleft - tooltipDims[0], + right: tleft + tooltipDims[0], + top: ttop + tooltipDims[1], + bottom: ttop + tooltipDims[1] + }, { + right: maxX, + bottom: maxY + }); + + if (where === 'up') { + ttop -= tooltipDims[1]; + ttop -= spacing; + tleft += centerh; + } else if (where === 'down') { + ttop += elementDims[1]; + ttop += spacing; + tleft += centerh; + } else if (where === 'left') { + tleft -= tooltipDims[0]; + tleft -= spacing; + ttop += centerv; + } else if (where === 'right') { + tleft += elementDims[0]; + tleft += spacing; + ttop += centerv; + } + + var arrow = null; + if (where.match(/(up|down|left|right)/)) { + arrow = document.createElement('SPAN'); + Css.addClassName(arrow, 'arrow'); + Css.addClassName(arrow, this._oppositeDirections[where]); + tooltip.appendChild(arrow); + } + + var tooltipLeft = tleft; + var tooltipTop = ttop; + + var toBottom = (tooltipTop + tooltipDims[1]) - maxY; + var toRight = (tooltipLeft + tooltipDims[0]) - maxX; + var toLeft = 0 - tooltipLeft; + var toTop = 0 - tooltipTop; + + if (toBottom > 0) { + if (arrow) { arrow.style.top = (tooltipDims[1] / 2) + toBottom + 'px'; } + tooltipTop -= toBottom; + } else if (toTop > 0) { + if (arrow) { arrow.style.top = (tooltipDims[1] / 2) - toTop + 'px'; } + tooltipTop += toTop; + } else if (toRight > 0) { + if (arrow) { arrow.style.left = (tooltipDims[0] / 2) + toRight + 'px'; } + tooltipLeft -= toRight; + } else if (toLeft > 0) { + if (arrow) { arrow.style.left = (tooltipDims[0] / 2) - toLeft + 'px'; } + tooltipLeft += toLeft; + } + + tooltip.style.left = tooltipLeft + 'px'; + tooltip.style.top = tooltipTop + 'px'; + } + }, + + /** + * Get a value for "where" (left/right/up/down) which doesn't put the + * tooltip off the screen + * + * @method _getWhereValueInsideViewport + * @param where {String} "where" value which was given by the user and we might change + * @param bbox {BoundingBox} A bounding box like what you get from getBoundingClientRect ({top, bottom, left, right}) with pixel positions from the top left corner of the viewport. + * @param viewport {BoundingBox} Bounding box for the viewport. "top" and "left" are omitted because these coordinates are relative to the top-left corner of the viewport so they are zero. + * + * @note: we can't use getBoundingClientRect in this case because it returns {0,0,0,0} on our uncreated tooltip. + */ + _getWhereValueInsideViewport: function (where, bbox, viewport) { + if (where === 'left' && bbox.left < 0) { + return 'right'; + } else if (where === 'right' && bbox.right > viewport.right) { + return 'left'; + } else if (where === 'up' && bbox.top < 0) { + return 'down'; + } else if (where === 'down' && bbox.bottom > viewport.bottom) { + return 'up'; + } + + return where; + }, + _removeTooltip: function() { + var tooltip = this.tooltip; + if (!tooltip) {return;} + + var remove = Ink.bind(InkElement.remove, {}, tooltip); + + if (this._getOpt('where') !== 'mousemove' && transitionDurationName) { + tooltip.style.opacity = 0; + // remove() will operate on correct tooltip, although this.tooltip === null then + setTimeout(remove, this._getFloatOpt('fade') * 1000); + } else { + remove(); + } + this.tooltip = null; + }, + _getOpt: function (option) { + var dataAttrVal = InkElement.data(this.element)[InkElement._camelCase('tip-' + option)]; + if (dataAttrVal /* either null or "" may signify the absense of this attribute*/) { + return dataAttrVal; + } + var instanceOption = this.root.options[option]; + if (typeof instanceOption !== 'undefined') { + return instanceOption; + } + }, + _getIntOpt: function (option) { + return parseInt(this._getOpt(option), 10); + }, + _getFloatOpt: function (option) { + return parseFloat(this._getOpt(option), 10); + }, + _destroy: function () { + if (this.tooltip) { + InkElement.remove(this.tooltip); + } + this.root = null; // Cyclic reference = memory leaks + this.element = null; + this.tooltip = null; + }, + _onMouseOver: function(e) { + // on IE < 10 you can't access the mouse event not even a tick after it fired + var mousePosition = this._getMousePosition(e); + var delay = this._getFloatOpt('delay'); + if (delay) { + this._delayTimeout = setTimeout(Ink.bind(function () { + if (!this.tooltip) { + this._makeTooltip(mousePosition); + } + this._delayTimeout = null; + }, this), delay * 1000); + } else { + this._makeTooltip(mousePosition); + } + }, + _onMouseMove: function(e) { + if (this._getOpt('where') === 'mousemove' && this.tooltip) { + var mPos = this._getMousePosition(e); + this._setPos(mPos[0], mPos[1]); + } + }, + _onMouseOut: function () { + if (!this._getIntOpt('forever')) { + this._removeTooltip(); + } + if (this._delayTimeout) { + clearTimeout(this._delayTimeout); + this._delayTimeout = null; + } + }, + _onTooltipMouseOver: function () { + if (this.tooltip) { // If tooltip is already being removed, this has no effect + this._removeTooltip(); + } + }, + _setPos: function(left, top) { + left += this._getIntOpt('left'); + top += this._getIntOpt('top'); + var pageDims = this._getPageXY(); + if (this.tooltip) { + var elmDims = [InkElement.elementWidth(this.tooltip), InkElement.elementHeight(this.tooltip)]; + var scrollDim = this._getScroll(); + + if((elmDims[0] + left - scrollDim[0]) >= (pageDims[0] - 20)) { + left = (left - elmDims[0] - this._getIntOpt('left') - 10); + } + if((elmDims[1] + top - scrollDim[1]) >= (pageDims[1] - 20)) { + top = (top - elmDims[1] - this._getIntOpt('top') - 10); + } + + this.tooltip.style.left = left + 'px'; + this.tooltip.style.top = top + 'px'; + } + }, + _getPageXY: function() { + var cWidth = 0; + var cHeight = 0; + if( typeof( window.innerWidth ) === 'number' ) { + cWidth = window.innerWidth; + cHeight = window.innerHeight; + } else if( document.documentElement && ( document.documentElement.clientWidth || document.documentElement.clientHeight ) ) { + cWidth = document.documentElement.clientWidth; + cHeight = document.documentElement.clientHeight; + } else if( document.body && ( document.body.clientWidth || document.body.clientHeight ) ) { + cWidth = document.body.clientWidth; + cHeight = document.body.clientHeight; + } + return [parseInt(cWidth, 10), parseInt(cHeight, 10)]; + }, + _getScroll: function() { + var dd = document.documentElement, db = document.body; + if (dd && (dd.scrollLeft || dd.scrollTop)) { + return [dd.scrollLeft, dd.scrollTop]; + } else if (db) { + return [db.scrollLeft, db.scrollTop]; + } else { + return [0, 0]; + } + }, + _getMousePosition: function(e) { + return [parseInt(InkEvent.pointerX(e), 10), parseInt(InkEvent.pointerY(e), 10)]; + } + }; + + return Tooltip; +}); diff --git a/ajax/libs/ink/2.3.1/js/ink.treeview.js b/ajax/libs/ink/2.3.1/js/ink.treeview.js new file mode 100644 index 000000000..a67d5557e --- /dev/null +++ b/ajax/libs/ink/2.3.1/js/ink.treeview.js @@ -0,0 +1,191 @@ +/** + * @module Ink.UI.TreeView_1 + * @author inkdev AT sapo.pt + * @version 1 + */ +Ink.createModule('Ink.UI.TreeView', '1', ['Ink.UI.Common_1','Ink.Dom.Event_1','Ink.Dom.Css_1','Ink.Dom.Element_1','Ink.Dom.Selector_1','Ink.Util.Array_1'], function(Common, Event, Css, Element, Selector, InkArray ) { + 'use strict'; + + /** + * Shows elements in a tree-like hierarchical structure. + * + * @class Ink.UI.TreeView + * @constructor + * @version 1 + * @param {String|DOMElement} selector + * @param {String} [options.node='li'] Selector to define which elements are seen as nodes. + * @param {String} [options.children='ul'] Selector to define which elements are represented as children. + * @param {String} [options.parentClass='parent'] Classes to be added to the parent node. + * @param {String} [options.openClass='icon icon-minus-circle'] Classes to be added to the icon when a parent is open. + * @param {String} [options.closedClass='icon icon-plus-circle'] Classes to be added to the icon when a parent is closed. + * @param {String} [options.hideClass='hide-all'] Class to toggle visibility of the children. + * @param {String} [options.iconTag='i'] The name of icon tag. The component tries to find a tag with that name as a direct child of the node. If it doesn't find it, it creates it. + * @param {Boolean} [options.stopDefault=true] Stops the default behavior of the click handler. + * @example + * + * + */ + var TreeView = function(selector, options){ + this._element = Common.elOrSelector(selector, '[Ink.UI.TreeView_1]'); + + this._options = Common.options('Treeview', { + 'node': ['String', 'li'], + // [3.0.1] Deprecate this terrible, terrible name + 'child': ['String','ul'], + 'children': ['String','ul'], + 'parentClass': ['String','parent'], + // [3.0.0] use these classes because you'll have font-awesome 4 + // 'openClass': ['String','fa fa-minus-circle'], + // 'closedClass': ['String','fa fa-plus-circle'], + 'openNodeClass': ['String', 'open'], + 'openClass': ['String','icon-minus-sign'], + 'closedClass': ['String','icon-plus-sign'], + 'hideClass': ['String','hide-all'], + 'iconTag': ['String', 'i'], + 'stopDefault' : ['Boolean', true] + }, options || {}, this._element); + + if (this._options.child) { + Ink.warn('Ink.UI.TreeView: options.child is being renamed to options.children.'); + this._options.children = this._options.child; + } + + this._init(); + }; + + TreeView.prototype = { + + /** + * Init function called by the constructor. Sets the necessary event handlers. + * + * @method _init + * @private + */ + _init: function(){ + this._handlers = { + click: Ink.bindEvent(this._onClick,this) + }; + + Event.on(this._element, 'click', this._options.node, this._handlers.click); + + InkArray.each(Ink.ss(this._options.node, this._element), Ink.bind(function(item){ + if( this.isParent(item) ) { + Css.addClassName(item, this._options.parentClass); + + var isOpen = this.isOpen(item); + if( !this._getIcon(item) ){ + Element.create(this._options.iconTag, { insertTop: item }); + } + + this._setNodeOpen(item, isOpen); + } + },this)); + }, + + _getIcon: function (node) { + return Ink.s('> ' + this._options.iconTag, node); + }, + + isOpen: function (node) { + if (!this._getChild(node)) { + throw new Error('not a node!'); + } + + return Element.data(node).open === 'true' || + Css.hasClassName(node, this._options.openNodeClass); + }, + + isParent: function (node) { + return Css.hasClassName(node, this._options.parentClass) || + this._getChild(node) != null; + }, + + _setNodeOpen: function (node, beOpen) { + var child = this._getChild(node); + if (child) { + Css.setClassName(child, this._options.hideClass, !beOpen); + var icon = this._getIcon(node); + + node.setAttribute('data-open', beOpen); + + Css.setClassName(icon, this._options.openClass, beOpen); + Css.setClassName(icon, this._options.closedClass, !beOpen); + Css.setClassName(node, this._options.openNodeClass, beOpen); + } else { + Ink.error('Ink.UI.TreeView: node', node, 'is not a node!'); + } + }, + + open: function (node) { + this._setNodeOpen(node, true); + }, + + close: function (node) { + this._setNodeOpen(node, false); + }, + + toggle: function (node) { + if (this.isOpen(node)) { + this.close(node); + } else { + this.open(node); + } + }, + + _getChild: function (node) { + return Selector.select(this._options.child, node)[0] || null; + }, + + /** + * Handles the click event (as specified in the _init function). + * + * @method _onClick + * @param {Event} event + * @private + */ + _onClick: function(ev){ + /** + * Summary: + * If the clicked element is a "node" as defined in the options, will check if it has any "child". + * If so, will toggle its state and stop the event's default behavior if the stopDefault option is true. + **/ + + if (!this.isParent(ev.currentTarget) || + Selector.matchesSelector(ev.target, this._options.node) || + Selector.matchesSelector(ev.target, this._options.child)) { + return; + } + + if (this._options.stopDefault){ + ev.preventDefault(); + } + + this.toggle(ev.currentTarget); + } + }; + + return TreeView; +}); diff --git a/ajax/libs/ink/2.3.1/js/ink.upload.js b/ajax/libs/ink/2.3.1/js/ink.upload.js new file mode 100644 index 000000000..c33a3d88f --- /dev/null +++ b/ajax/libs/ink/2.3.1/js/ink.upload.js @@ -0,0 +1,867 @@ +Ink.createModule('Ink.UI.Upload', '1', [ + 'Ink.Dom.Event_1', + 'Ink.Dom.Element_1', + 'Ink.Dom.Browser_1', + 'Ink.UI.Common_1' +], function(Event, Element, Browser, Common) { + 'use strict'; + + var DirectoryReader = function(options) { + this.init(options); + }; + + DirectoryReader.prototype = { + init: function(options) { + this.options = Ink.extendObj({ + entry: undefined, + maxDepth: 10 + }, options || {}); + + try { + this._read(); + } catch(e) { + Ink.error(e); + } + }, + + + _read: function() { + if(!this.options.entry) { + throw("The entry specify you must"); + } + + try { + this._readDirectories(); + } catch(e) { + Ink.error(e); + } + }, + + + _readDirectories: function() { + var entries = [], + running = false, + maxDepth = 0; + + /* TODO return as tree because much better well */ + var _readEntries = Ink.bind(function(currentEntry) { + var dir = currentEntry.createReader(); + running = true; + + dir.readEntries(Ink.bind(function(res) { + if(res.length > 0) { + for(var i = 0, len = res.length; i=0; i--) { + if(typeof(arr[i]) === 'undefined' || arr[i] === null || arr[i] === '') { + arr.splice(i, 1); + } + } + return arr; + } + }; + + var Queue = { + lists: [], + items: [], + + + /** + * @function {Public} ? Create new queue list + * @param {String} list name + * @param {Function} function to iterate on items + * @return {Object} list id + */ + create: function(name) { + var id; + name = String(name); + this.lists.push({name: name}); + id = this.lists.length - 1; + return id; + }, + + + getItems: function(parentId) { + if(!parentId) { + return this.items; + } + var items = []; + for(var i = 0, len = this.items.length; i=0; i--) { + if(this.items[i] && id === this.items[i].parentId) { + this.remove(this.items[i].parentId, this.items[i].pid); + } + } + if(!keepList) { + this.lists.splice(id, 1); + } + return true; + } catch(e) { + Ink.error('Purge: invalid id'); + return false; + } + }, + + + /** + * @function {Public} ? add an item to a list + * @param {String} name + * @param {Object} item + * @return {Number} pid + */ + add: function(parentId, item, priority) { + if(!this.lists[parentId]) { + return false; + } + if(typeof(item) !== 'object') { + item = String(item); + } + + var pid = parseInt(Math.round(Math.random() * 100000) + "" + Math.round(Math.random() * 100000), 10); + priority = priority || 0; + + this.items.push({parentId: parentId, item: item, priority: priority || 0, pid: pid}); + return pid; + }, + + + /** + * @function {Public} ? view list + * @param {Number} list id + * @param {Number} process id + * @return {Object} item + */ + view: function(parentId, pid) { + var id = this._searchByPid(parentId, pid); + if(id === false) { + return false; + } + return this.items[id]; + }, + + + /** + * @function {Public} ? remove an item + * @param {Object} item + * @return {Object|Boolean} removed item or false if not found + */ + remove: function(parentId, pid) { + try { + var id = this._searchByPid(parentId, pid); + if(id === false) { + return false; + } + this.items.splice(id, 1); + return true; + } catch(e) { + Ink.error('Remove: invalid id'); + return false; + } + }, + + _searchByPid: function(parentId, pid) { + if(!parentId && typeof(parentId) === 'boolean' || !pid) { + return false; + } + + parentId = parseInt(parentId, 10); + pid = parseInt(pid, 10); + + if(isNaN(parentId) || isNaN(pid)) { + return false; + } + + for(var i = 0, len = this.items.length; i this.options.minSizeToUseChunks; + }, + + + _dropEventHandler: function(ev) { + if(ev && ev.stopPropagation) { + ev.stopPropagation(); + } + if(ev && ev.preventDefault) { + ev.preventDefault(); + } + if(ev) { + ev.returnValue = false; + } + + this.publish('DropComplete', ev.dataTransfer); + + var data = ev.dataTransfer; + + if(!data || !data.files || !data.files.length) { + return false; + } + + this._files = data.files; + this._files = Array.prototype.slice.call(this._files || [], 0); + + // check if webkitGetAsEntry exists on first item + if(data.items && data.items[0] && data.items[0].webkitGetAsEntry) { + if(!this.options.foldersEnabled) { + return setTimeout(Ink.bind(this._addFilesToQueue, this, this._files), 0); + } + var entry, folders = []; + for(var i = ev.dataTransfer.items.length-1; i>=0; i--) { + entry = ev.dataTransfer.items[i].webkitGetAsEntry(); + if(entry && entry.isDirectory) { + folders.push(entry); + this._files[i].isDirectory = true; + this._files.splice(i, 1); + } + } + // starting callback hell + this._addFolderToQueue(folders, Ink.bind(function() { + setTimeout(Ink.bind(this._addFilesToQueue, this, this._files), 0); + }, this)); + } else { + setTimeout(Ink.bind(this._addFilesToQueue, this, this._files), 0); + } + + return true; + }, + + + _addFolderToQueue: function(folders, cb) { + var files = [], invalidFolders = {}; + + if(!folders || !folders.length) { + cb(); + return files; + } + + var getFiles = function(entries) { + var files = []; + for(var i = 0, len = entries.length; i this.options.maxFilesize) { + this.publish('MaxSizeFailure', file, this.options.maxFilesize); + continue; + } + + fileID = parseInt(Math.round(Math.random() * 100000) + "" + Math.round(Math.random() * 100000), 10); + o = { id: i, data: file, fileID: fileID, directory: file.isDirectory }; + Queue.add(this._queueId, o); + + this.publish('FileAddedToQueue', o); + } + this._processQueue(true); + this._files = []; + }, + + + _processQueue: function(internalUpload) { + if(this._queueRunning) { + return false; + } + + this.running = 0; + var max = 1, i = 0, items, + queueLen = Queue.items.length; + this._queueRunning = true; + + this.interval = setInterval(Ink.bind(function() { + if(Queue.items.length === i && this.running === 0) { + Queue.purge(this._queueId, true); + this._queueRunning = false; + clearInterval(this.interval); + this.publish('QueueEnd', this._queueId, queueLen); + } + + items = Queue.getItems(this._queueId); + + if(this.running < max && items[i]) { + if(!items[i].canceled) { + _doRequest.call(this, items[i].pid, items[i].item.data, items[i].item.fileID, items[i].item.directory, internalUpload); + this.running++; + i++; + } else { + var j = i; + while(items[j] && items[j].canceled) { + i++; + j++; + } + } + return true; + } + return false; + }, this), 100); + + + var _doRequest = function(pid, data, fileID, directory, internalUpload) { + var o = { + file: data, + fileID: fileID, + cb: Ink.bind(function() { + this.running--; + }, this) + }; + if(internalUpload) { + if(directory) { + // do magic + o.cb(); + } else { + this._upload(o); + } + } + }; + + return true; + }, + + + _upload: function(o) { + var file = o.file, + xhr = new XMLHttpRequest(), + fileID = o.fileID; + + this.publish('BeforeUpload', file, this.options.extraData, fileID, xhr, this._supportChunks(file.size)); + + var forceAbort = function(showError) { + if(o.cb && typeof(o.cb === 'function')) { + o.cb(); + } + + this.publish('OnProgress', { + length: file.size, + lengthComputable: true, + loaded: file.size, + total: file.size + }, file, fileID); + this.publish('EndUpload', file, fileID, (showError ? { error: true } : true)); + this.publish('InvalidFile', file, 'name'); + xhr.abort(); + }; + + if(this.options.INVALID_FILE_NAME && this.options.INVALID_FILE_NAME instanceof RegExp) { + if(this.options.INVALID_FILE_NAME.test(o.file.name)) { + forceAbort.call(this); + return; + } + } + + // If file was renamed, abort it + // FU OPERA: Opera always return lastModified date as null + if(!file.lastModifiedDate && !Ink.Dom.Browser.OPERA) { + forceAbort.call(this, true); + return; + } + + xhr.upload.onprogress = Ink.bind(this.publish, this, 'OnProgress', file, fileID); + + var endpoint, method; + if(this._supportChunks(file.size)) { + if(file.size <= file.chunk_offset) { + endpoint = this.options.endpointChunkCommit; + method = 'POST'; + } else { + endpoint = this.options.endpointChunk; + if(file.chunk_upload_id) { + endpoint += '?upload_id=' + file.chunk_upload_id; + } + if(file.chunk_offset) { + endpoint += '&offset=' + file.chunk_offset; + } + method = 'PUT'; + } + } else { + endpoint = this.options.endpoint; + method = 'POST'; + } + + xhr.open(method, endpoint, true); + xhr.withCredentials = true; + xhr.setRequestHeader("x-requested-with", "XMLHttpRequest"); + if(this._supportChunks(file.size)) { + xhr.setRequestHeader('Content-type', 'application/x-www-form-urlencoded'); + } + + var fd = new FormData(), + blob; + + if("Blob" in window && typeof Blob === 'function') { + blob = new Blob([file], { type: file.type }); + if(this._supportChunks(file.size)) { + file.chunk_offset = file.chunk_offset || 0; + blob = blob.slice(file.chunk_offset, file.chunk_offset + this.options.chunkSize); + } else { + fd.append(this.options.fileFormName, blob, file.name); + } + } else { + fd.append(this.options.fileFormName, file); + } + + if(!this._supportChunks(file.size)) { + for(var k in this.options.extraData) { + if(this.options.extraData.hasOwnProperty(k)) { + fd.append(k, this.options.extraData[k]); + } + } + } else { + fd.append('upload_id', file.chunk_upload_id); + fd.append('path', file.upload_path); + } + + if(!file.hasParent) { + if(!this._supportChunks(file.size)) { + xhr.send(fd); + } else { + if(file.size <= file.chunk_offset) { + xhr.send('upload_id=' + file.chunk_upload_id + '&path=' + file.upload_path + '/' + file.name); + } else { + xhr.send(blob); + } + } + } else { + this.publish('cbCreateFolder', file.parentID, file.fullPath, this.options.extraData, this._folders, file.rootPath, Ink.bind(function() { + if(!this._supportChunks(file.size)) { + xhr.send(fd); + } else { + if(file.size <= file.chunk_offset) { + xhr.send('upload_id=' + file.chunk_upload_id + '&path=' + file.upload_path + '/' + file.name); + } else { + xhr.send(blob); + } + } + }, this)); + } + + + xhr.onload = Ink.bindEvent(function() { + /* jshint boss:true */ + if(this._supportChunks(file.size) && file.size > file.chunk_offset) { + if(xhr.response) { + var response = JSON.parse(xhr.response); + + // check expected offset + var invalidOffset = file.chunk_offset && response.offset !== (file.chunk_offset + this.options.chunkSize) && file.size !== response.offset; + if(invalidOffset) { + if(o.cb) { + o.cb(); + } + this.publish('ErrorUpload', file, fileID); + } else { + file.chunk_upload_id = response.upload_id; + file.chunk_offset = response.offset; + file.chunk_expires = response.expires; + this._upload(o); + } + } else { + if(o.cb) { + o.cb(); + } + this.publish('ErrorUpload', file, fileID); + } + return (xhr = null); + } + + if(o.cb) { + o.cb(); + } + + if(xhr.responseText && xhr['status'] < 400) { + this.publish('EndUpload', file, fileID, xhr.responseText); + } else { + this.publish('ErrorUpload', file, fileID); + } + return (xhr = null); + }, this); + + + xhr.onerror = Ink.bindEvent(function() { + if(o.cb) { + o.cb(); + } + this.publish('ErrorUpload', file, fileID); + }, this); + + xhr.onabort = Ink.bindEvent(function() { + if(o.cb) { + o.cb(); + } + this.publish('AbortUpload', file, fileID, { + abortAll: Ink.bind(this.abortAll, this), + abortOne: Ink.bind(this.abortOne, this) + }); + }, this); + }, + + + abortAll: function() { + if(!this._queueRunning) { + return false; + } + clearInterval(this.interval); + this._queueRunning = false; + Queue.purge(this._queueId, true); + return true; + }, + + abortOne: function(id, cb) { + var items = Queue.getItems(0), + o; + for(var i = 0, len = items.length; i element. This information allows you to progressively enhance + * your pages with a granular level of control over the experience. + * + * Modernizr has an optional (not included) conditional resource loader + * called Modernizr.load(), based on Yepnope.js (yepnopejs.com). + * To get a build that includes Modernizr.load(), as well as choosing + * which tests to include, go to www.modernizr.com/download/ + * + * Authors Faruk Ates, Paul Irish, Alex Sexton + * Contributors Ryan Seddon, Ben Alman + */ + +window.Modernizr = (function( window, document, undefined ) { + + var version = '2.6.3', + + Modernizr = {}, + + /*>>cssclasses*/ + // option for enabling the HTML classes to be added + enableClasses = true, + /*>>cssclasses*/ + + docElement = document.documentElement, + + /** + * Create our "modernizr" element that we do most feature tests on. + */ + mod = 'modernizr', + modElem = document.createElement(mod), + mStyle = modElem.style, + + /** + * Create the input element for various Web Forms feature tests. + */ + inputElem /*>>inputelem*/ = document.createElement('input') /*>>inputelem*/ , + + /*>>smile*/ + smile = ':)', + /*>>smile*/ + + toString = {}.toString, + + // TODO :: make the prefixes more granular + /*>>prefixes*/ + // List of property values to set for css tests. See ticket #21 + prefixes = ' -webkit- -moz- -o- -ms- '.split(' '), + /*>>prefixes*/ + + /*>>domprefixes*/ + // Following spec is to expose vendor-specific style properties as: + // elem.style.WebkitBorderRadius + // and the following would be incorrect: + // elem.style.webkitBorderRadius + + // Webkit ghosts their properties in lowercase but Opera & Moz do not. + // Microsoft uses a lowercase `ms` instead of the correct `Ms` in IE8+ + // erik.eae.net/archives/2008/03/10/21.48.10/ + + // More here: github.com/Modernizr/Modernizr/issues/issue/21 + omPrefixes = 'Webkit Moz O ms', + + cssomPrefixes = omPrefixes.split(' '), + + domPrefixes = omPrefixes.toLowerCase().split(' '), + /*>>domprefixes*/ + + /*>>ns*/ + ns = {'svg': 'http://www.w3.org/2000/svg'}, + /*>>ns*/ + + tests = {}, + inputs = {}, + attrs = {}, + + classes = [], + + slice = classes.slice, + + featureName, // used in testing loop + + + /*>>teststyles*/ + // Inject element with style element and some CSS rules + injectElementWithStyles = function( rule, callback, nodes, testnames ) { + + var style, ret, node, docOverflow, + div = document.createElement('div'), + // After page load injecting a fake body doesn't work so check if body exists + body = document.body, + // IE6 and 7 won't return offsetWidth or offsetHeight unless it's in the body element, so we fake it. + fakeBody = body || document.createElement('body'); + + if ( parseInt(nodes, 10) ) { + // In order not to give false positives we create a node for each test + // This also allows the method to scale for unspecified uses + while ( nodes-- ) { + node = document.createElement('div'); + node.id = testnames ? testnames[nodes] : mod + (nodes + 1); + div.appendChild(node); + } + } + + // '].join(''); + div.id = mod; + // IE6 will false positive on some tests due to the style element inside the test div somehow interfering offsetHeight, so insert it into body or fakebody. + // Opera will act all quirky when injecting elements in documentElement when page is served as xml, needs fakebody too. #270 + (body ? div : fakeBody).innerHTML += style; + fakeBody.appendChild(div); + if ( !body ) { + //avoid crashing IE8, if background image is used + fakeBody.style.background = ''; + //Safari 5.13/5.1.4 OSX stops loading if ::-webkit-scrollbar is used and scrollbars are visible + fakeBody.style.overflow = 'hidden'; + docOverflow = docElement.style.overflow; + docElement.style.overflow = 'hidden'; + docElement.appendChild(fakeBody); + } + + ret = callback(div, rule); + // If this is done after page load we don't want to remove the body so check if body exists + if ( !body ) { + fakeBody.parentNode.removeChild(fakeBody); + docElement.style.overflow = docOverflow; + } else { + div.parentNode.removeChild(div); + } + + return !!ret; + + }, + /*>>teststyles*/ + + /*>>mq*/ + // adapted from matchMedia polyfill + // by Scott Jehl and Paul Irish + // gist.github.com/786768 + testMediaQuery = function( mq ) { + + var matchMedia = window.matchMedia || window.msMatchMedia; + if ( matchMedia ) { + return matchMedia(mq).matches; + } + + var bool; + + injectElementWithStyles('@media ' + mq + ' { #' + mod + ' { position: absolute; } }', function( node ) { + bool = (window.getComputedStyle ? + getComputedStyle(node, null) : + node.currentStyle)['position'] == 'absolute'; + }); + + return bool; + + }, + /*>>mq*/ + + + /*>>hasevent*/ + // + // isEventSupported determines if a given element supports the given event + // kangax.github.com/iseventsupported/ + // + // The following results are known incorrects: + // Modernizr.hasEvent("webkitTransitionEnd", elem) // false negative + // Modernizr.hasEvent("textInput") // in Webkit. github.com/Modernizr/Modernizr/issues/333 + // ... + isEventSupported = (function() { + + var TAGNAMES = { + 'select': 'input', 'change': 'input', + 'submit': 'form', 'reset': 'form', + 'error': 'img', 'load': 'img', 'abort': 'img' + }; + + function isEventSupported( eventName, element ) { + + element = element || document.createElement(TAGNAMES[eventName] || 'div'); + eventName = 'on' + eventName; + + // When using `setAttribute`, IE skips "unload", WebKit skips "unload" and "resize", whereas `in` "catches" those + var isSupported = eventName in element; + + if ( !isSupported ) { + // If it has no `setAttribute` (i.e. doesn't implement Node interface), try generic element + if ( !element.setAttribute ) { + element = document.createElement('div'); + } + if ( element.setAttribute && element.removeAttribute ) { + element.setAttribute(eventName, ''); + isSupported = is(element[eventName], 'function'); + + // If property was created, "remove it" (by setting value to `undefined`) + if ( !is(element[eventName], 'undefined') ) { + element[eventName] = undefined; + } + element.removeAttribute(eventName); + } + } + + element = null; + return isSupported; + } + return isEventSupported; + })(), + /*>>hasevent*/ + + // TODO :: Add flag for hasownprop ? didn't last time + + // hasOwnProperty shim by kangax needed for Safari 2.0 support + _hasOwnProperty = ({}).hasOwnProperty, hasOwnProp; + + if ( !is(_hasOwnProperty, 'undefined') && !is(_hasOwnProperty.call, 'undefined') ) { + hasOwnProp = function (object, property) { + return _hasOwnProperty.call(object, property); + }; + } + else { + hasOwnProp = function (object, property) { /* yes, this can give false positives/negatives, but most of the time we don't care about those */ + return ((property in object) && is(object.constructor.prototype[property], 'undefined')); + }; + } + + // Adapted from ES5-shim https://github.com/kriskowal/es5-shim/blob/master/es5-shim.js + // es5.github.com/#x15.3.4.5 + + if (!Function.prototype.bind) { + Function.prototype.bind = function bind(that) { + + var target = this; + + if (typeof target != "function") { + throw new TypeError(); + } + + var args = slice.call(arguments, 1), + bound = function () { + + if (this instanceof bound) { + + var F = function(){}; + F.prototype = target.prototype; + var self = new F(); + + var result = target.apply( + self, + args.concat(slice.call(arguments)) + ); + if (Object(result) === result) { + return result; + } + return self; + + } else { + + return target.apply( + that, + args.concat(slice.call(arguments)) + ); + + } + + }; + + return bound; + }; + } + + /** + * setCss applies given styles to the Modernizr DOM node. + */ + function setCss( str ) { + mStyle.cssText = str; + } + + /** + * setCssAll extrapolates all vendor-specific css strings. + */ + function setCssAll( str1, str2 ) { + return setCss(prefixes.join(str1 + ';') + ( str2 || '' )); + } + + /** + * is returns a boolean for if typeof obj is exactly type. + */ + function is( obj, type ) { + return typeof obj === type; + } + + /** + * contains returns a boolean for if substr is found within str. + */ + function contains( str, substr ) { + return !!~('' + str).indexOf(substr); + } + + /*>>testprop*/ + + // testProps is a generic CSS / DOM property test. + + // In testing support for a given CSS property, it's legit to test: + // `elem.style[styleName] !== undefined` + // If the property is supported it will return an empty string, + // if unsupported it will return undefined. + + // We'll take advantage of this quick test and skip setting a style + // on our modernizr element, but instead just testing undefined vs + // empty string. + + // Because the testing of the CSS property names (with "-", as + // opposed to the camelCase DOM properties) is non-portable and + // non-standard but works in WebKit and IE (but not Gecko or Opera), + // we explicitly reject properties with dashes so that authors + // developing in WebKit or IE first don't end up with + // browser-specific content by accident. + + function testProps( props, prefixed ) { + for ( var i in props ) { + var prop = props[i]; + if ( !contains(prop, "-") && mStyle[prop] !== undefined ) { + return prefixed == 'pfx' ? prop : true; + } + } + return false; + } + /*>>testprop*/ + + // TODO :: add testDOMProps + /** + * testDOMProps is a generic DOM property test; if a browser supports + * a certain property, it won't return undefined for it. + */ + function testDOMProps( props, obj, elem ) { + for ( var i in props ) { + var item = obj[props[i]]; + if ( item !== undefined) { + + // return the property name as a string + if (elem === false) return props[i]; + + // let's bind a function + if (is(item, 'function')){ + // default to autobind unless override + return item.bind(elem || obj); + } + + // return the unbound function or obj or value + return item; + } + } + return false; + } + + /*>>testallprops*/ + /** + * testPropsAll tests a list of DOM properties we want to check against. + * We specify literally ALL possible (known and/or likely) properties on + * the element including the non-vendor prefixed one, for forward- + * compatibility. + */ + function testPropsAll( prop, prefixed, elem ) { + + var ucProp = prop.charAt(0).toUpperCase() + prop.slice(1), + props = (prop + ' ' + cssomPrefixes.join(ucProp + ' ') + ucProp).split(' '); + + // did they call .prefixed('boxSizing') or are we just testing a prop? + if(is(prefixed, "string") || is(prefixed, "undefined")) { + return testProps(props, prefixed); + + // otherwise, they called .prefixed('requestAnimationFrame', window[, elem]) + } else { + props = (prop + ' ' + (domPrefixes).join(ucProp + ' ') + ucProp).split(' '); + return testDOMProps(props, prefixed, elem); + } + } + /*>>testallprops*/ + + + /** + * Tests + * ----- + */ + + // The *new* flexbox + // dev.w3.org/csswg/css3-flexbox + + tests['flexbox'] = function() { + return testPropsAll('flexWrap'); + }; + + // The *old* flexbox + // www.w3.org/TR/2009/WD-css3-flexbox-20090723/ + + tests['flexboxlegacy'] = function() { + return testPropsAll('boxDirection'); + }; + + // On the S60 and BB Storm, getContext exists, but always returns undefined + // so we actually have to call getContext() to verify + // github.com/Modernizr/Modernizr/issues/issue/97/ + + tests['canvas'] = function() { + var elem = document.createElement('canvas'); + return !!(elem.getContext && elem.getContext('2d')); + }; + + tests['canvastext'] = function() { + return !!(Modernizr['canvas'] && is(document.createElement('canvas').getContext('2d').fillText, 'function')); + }; + + // webk.it/70117 is tracking a legit WebGL feature detect proposal + + // We do a soft detect which may false positive in order to avoid + // an expensive context creation: bugzil.la/732441 + + tests['webgl'] = function() { + return !!window.WebGLRenderingContext; + }; + + /* + * The Modernizr.touch test only indicates if the browser supports + * touch events, which does not necessarily reflect a touchscreen + * device, as evidenced by tablets running Windows 7 or, alas, + * the Palm Pre / WebOS (touch) phones. + * + * Additionally, Chrome (desktop) used to lie about its support on this, + * but that has since been rectified: crbug.com/36415 + * + * We also test for Firefox 4 Multitouch Support. + * + * For more info, see: modernizr.github.com/Modernizr/touch.html + */ + + tests['touch'] = function() { + var bool; + + if(('ontouchstart' in window) || window.DocumentTouch && document instanceof DocumentTouch) { + bool = true; + } else { + injectElementWithStyles(['@media (',prefixes.join('touch-enabled),('),mod,')','{#modernizr{top:9px;position:absolute}}'].join(''), function( node ) { + bool = node.offsetTop === 9; + }); + } + + return bool; + }; + + + // geolocation is often considered a trivial feature detect... + // Turns out, it's quite tricky to get right: + // + // Using !!navigator.geolocation does two things we don't want. It: + // 1. Leaks memory in IE9: github.com/Modernizr/Modernizr/issues/513 + // 2. Disables page caching in WebKit: webk.it/43956 + // + // Meanwhile, in Firefox < 8, an about:config setting could expose + // a false positive that would throw an exception: bugzil.la/688158 + + tests['geolocation'] = function() { + return 'geolocation' in navigator; + }; + + + tests['postmessage'] = function() { + return !!window.postMessage; + }; + + + // Chrome incognito mode used to throw an exception when using openDatabase + // It doesn't anymore. + tests['websqldatabase'] = function() { + return !!window.openDatabase; + }; + + // Vendors had inconsistent prefixing with the experimental Indexed DB: + // - Webkit's implementation is accessible through webkitIndexedDB + // - Firefox shipped moz_indexedDB before FF4b9, but since then has been mozIndexedDB + // For speed, we don't test the legacy (and beta-only) indexedDB + tests['indexedDB'] = function() { + return !!testPropsAll("indexedDB", window); + }; + + // documentMode logic from YUI to filter out IE8 Compat Mode + // which false positives. + tests['hashchange'] = function() { + return isEventSupported('hashchange', window) && (document.documentMode === undefined || document.documentMode > 7); + }; + + // Per 1.6: + // This used to be Modernizr.historymanagement but the longer + // name has been deprecated in favor of a shorter and property-matching one. + // The old API is still available in 1.6, but as of 2.0 will throw a warning, + // and in the first release thereafter disappear entirely. + tests['history'] = function() { + return !!(window.history && history.pushState); + }; + + tests['draganddrop'] = function() { + var div = document.createElement('div'); + return ('draggable' in div) || ('ondragstart' in div && 'ondrop' in div); + }; + + // FF3.6 was EOL'ed on 4/24/12, but the ESR version of FF10 + // will be supported until FF19 (2/12/13), at which time, ESR becomes FF17. + // FF10 still uses prefixes, so check for it until then. + // for more ESR info, see: mozilla.org/en-US/firefox/organizations/faq/ + tests['websockets'] = function() { + return 'WebSocket' in window || 'MozWebSocket' in window; + }; + + + // css-tricks.com/rgba-browser-support/ + tests['rgba'] = function() { + // Set an rgba() color and check the returned value + + setCss('background-color:rgba(150,255,150,.5)'); + + return contains(mStyle.backgroundColor, 'rgba'); + }; + + tests['hsla'] = function() { + // Same as rgba(), in fact, browsers re-map hsla() to rgba() internally, + // except IE9 who retains it as hsla + + setCss('background-color:hsla(120,40%,100%,.5)'); + + return contains(mStyle.backgroundColor, 'rgba') || contains(mStyle.backgroundColor, 'hsla'); + }; + + tests['multiplebgs'] = function() { + // Setting multiple images AND a color on the background shorthand property + // and then querying the style.background property value for the number of + // occurrences of "url(" is a reliable method for detecting ACTUAL support for this! + + setCss('background:url(https://),url(https://),red url(https://)'); + + // If the UA supports multiple backgrounds, there should be three occurrences + // of the string "url(" in the return value for elemStyle.background + + return (/(url\s*\(.*?){3}/).test(mStyle.background); + }; + + + + // this will false positive in Opera Mini + // github.com/Modernizr/Modernizr/issues/396 + + tests['backgroundsize'] = function() { + return testPropsAll('backgroundSize'); + }; + + tests['borderimage'] = function() { + return testPropsAll('borderImage'); + }; + + + // Super comprehensive table about all the unique implementations of + // border-radius: muddledramblings.com/table-of-css3-border-radius-compliance + + tests['borderradius'] = function() { + return testPropsAll('borderRadius'); + }; + + // WebOS unfortunately false positives on this test. + tests['boxshadow'] = function() { + return testPropsAll('boxShadow'); + }; + + // FF3.0 will false positive on this test + tests['textshadow'] = function() { + return document.createElement('div').style.textShadow === ''; + }; + + + tests['opacity'] = function() { + // Browsers that actually have CSS Opacity implemented have done so + // according to spec, which means their return values are within the + // range of [0.0,1.0] - including the leading zero. + + setCssAll('opacity:.55'); + + // The non-literal . in this regex is intentional: + // German Chrome returns this value as 0,55 + // github.com/Modernizr/Modernizr/issues/#issue/59/comment/516632 + return (/^0.55$/).test(mStyle.opacity); + }; + + + // Note, Android < 4 will pass this test, but can only animate + // a single property at a time + // daneden.me/2011/12/putting-up-with-androids-bullshit/ + tests['cssanimations'] = function() { + return testPropsAll('animationName'); + }; + + + tests['csscolumns'] = function() { + return testPropsAll('columnCount'); + }; + + + tests['cssgradients'] = function() { + /** + * For CSS Gradients syntax, please see: + * webkit.org/blog/175/introducing-css-gradients/ + * developer.mozilla.org/en/CSS/-moz-linear-gradient + * developer.mozilla.org/en/CSS/-moz-radial-gradient + * dev.w3.org/csswg/css3-images/#gradients- + */ + + var str1 = 'background-image:', + str2 = 'gradient(linear,left top,right bottom,from(#9f9),to(white));', + str3 = 'linear-gradient(left top,#9f9, white);'; + + setCss( + // legacy webkit syntax (FIXME: remove when syntax not in use anymore) + (str1 + '-webkit- '.split(' ').join(str2 + str1) + + // standard syntax // trailing 'background-image:' + prefixes.join(str3 + str1)).slice(0, -str1.length) + ); + + return contains(mStyle.backgroundImage, 'gradient'); + }; + + + tests['cssreflections'] = function() { + return testPropsAll('boxReflect'); + }; + + + tests['csstransforms'] = function() { + return !!testPropsAll('transform'); + }; + + + tests['csstransforms3d'] = function() { + + var ret = !!testPropsAll('perspective'); + + // Webkit's 3D transforms are passed off to the browser's own graphics renderer. + // It works fine in Safari on Leopard and Snow Leopard, but not in Chrome in + // some conditions. As a result, Webkit typically recognizes the syntax but + // will sometimes throw a false positive, thus we must do a more thorough check: + if ( ret && 'webkitPerspective' in docElement.style ) { + + // Webkit allows this media query to succeed only if the feature is enabled. + // `@media (transform-3d),(-webkit-transform-3d){ ... }` + injectElementWithStyles('@media (transform-3d),(-webkit-transform-3d){#modernizr{left:9px;position:absolute;height:3px;}}', function( node, rule ) { + ret = node.offsetLeft === 9 && node.offsetHeight === 3; + }); + } + return ret; + }; + + + tests['csstransitions'] = function() { + return testPropsAll('transition'); + }; + + + /*>>fontface*/ + // @font-face detection routine by Diego Perini + // javascript.nwbox.com/CSSSupport/ + + // false positives: + // WebOS github.com/Modernizr/Modernizr/issues/342 + // WP7 github.com/Modernizr/Modernizr/issues/538 + tests['fontface'] = function() { + var bool; + + injectElementWithStyles('@font-face {font-family:"font";src:url("https://")}', function( node, rule ) { + var style = document.getElementById('smodernizr'), + sheet = style.sheet || style.styleSheet, + cssText = sheet ? (sheet.cssRules && sheet.cssRules[0] ? sheet.cssRules[0].cssText : sheet.cssText || '') : ''; + + bool = /src/i.test(cssText) && cssText.indexOf(rule.split(' ')[0]) === 0; + }); + + return bool; + }; + /*>>fontface*/ + + // CSS generated content detection + tests['generatedcontent'] = function() { + var bool; + + injectElementWithStyles(['#',mod,'{font:0/0 a}#',mod,':after{content:"',smile,'";visibility:hidden;font:3px/1 a}'].join(''), function( node ) { + bool = node.offsetHeight >= 3; + }); + + return bool; + }; + + + + // These tests evaluate support of the video/audio elements, as well as + // testing what types of content they support. + // + // We're using the Boolean constructor here, so that we can extend the value + // e.g. Modernizr.video // true + // Modernizr.video.ogg // 'probably' + // + // Codec values from : github.com/NielsLeenheer/html5test/blob/9106a8/index.html#L845 + // thx to NielsLeenheer and zcorpan + + // Note: in some older browsers, "no" was a return value instead of empty string. + // It was live in FF3.5.0 and 3.5.1, but fixed in 3.5.2 + // It was also live in Safari 4.0.0 - 4.0.4, but fixed in 4.0.5 + + tests['video'] = function() { + var elem = document.createElement('video'), + bool = false; + + // IE9 Running on Windows Server SKU can cause an exception to be thrown, bug #224 + try { + if ( bool = !!elem.canPlayType ) { + bool = new Boolean(bool); + bool.ogg = elem.canPlayType('video/ogg; codecs="theora"') .replace(/^no$/,''); + + // Without QuickTime, this value will be `undefined`. github.com/Modernizr/Modernizr/issues/546 + bool.h264 = elem.canPlayType('video/mp4; codecs="avc1.42E01E"') .replace(/^no$/,''); + + bool.webm = elem.canPlayType('video/webm; codecs="vp8, vorbis"').replace(/^no$/,''); + } + + } catch(e) { } + + return bool; + }; + + tests['audio'] = function() { + var elem = document.createElement('audio'), + bool = false; + + try { + if ( bool = !!elem.canPlayType ) { + bool = new Boolean(bool); + bool.ogg = elem.canPlayType('audio/ogg; codecs="vorbis"').replace(/^no$/,''); + bool.mp3 = elem.canPlayType('audio/mpeg;') .replace(/^no$/,''); + + // Mimetypes accepted: + // developer.mozilla.org/En/Media_formats_supported_by_the_audio_and_video_elements + // bit.ly/iphoneoscodecs + bool.wav = elem.canPlayType('audio/wav; codecs="1"') .replace(/^no$/,''); + bool.m4a = ( elem.canPlayType('audio/x-m4a;') || + elem.canPlayType('audio/aac;')) .replace(/^no$/,''); + } + } catch(e) { } + + return bool; + }; + + + // In FF4, if disabled, window.localStorage should === null. + + // Normally, we could not test that directly and need to do a + // `('localStorage' in window) && ` test first because otherwise Firefox will + // throw bugzil.la/365772 if cookies are disabled + + // Also in iOS5 Private Browsing mode, attempting to use localStorage.setItem + // will throw the exception: + // QUOTA_EXCEEDED_ERRROR DOM Exception 22. + // Peculiarly, getItem and removeItem calls do not throw. + + // Because we are forced to try/catch this, we'll go aggressive. + + // Just FWIW: IE8 Compat mode supports these features completely: + // www.quirksmode.org/dom/html5.html + // But IE8 doesn't support either with local files + + tests['localstorage'] = function() { + try { + localStorage.setItem(mod, mod); + localStorage.removeItem(mod); + return true; + } catch(e) { + return false; + } + }; + + tests['sessionstorage'] = function() { + try { + sessionStorage.setItem(mod, mod); + sessionStorage.removeItem(mod); + return true; + } catch(e) { + return false; + } + }; + + + tests['webworkers'] = function() { + return !!window.Worker; + }; + + + tests['applicationcache'] = function() { + return !!window.applicationCache; + }; + + + // Thanks to Erik Dahlstrom + tests['svg'] = function() { + return !!document.createElementNS && !!document.createElementNS(ns.svg, 'svg').createSVGRect; + }; + + // specifically for SVG inline in HTML, not within XHTML + // test page: paulirish.com/demo/inline-svg + tests['inlinesvg'] = function() { + var div = document.createElement('div'); + div.innerHTML = ''; + return (div.firstChild && div.firstChild.namespaceURI) == ns.svg; + }; + + // SVG SMIL animation + tests['smil'] = function() { + return !!document.createElementNS && /SVGAnimate/.test(toString.call(document.createElementNS(ns.svg, 'animate'))); + }; + + // This test is only for clip paths in SVG proper, not clip paths on HTML content + // demo: srufaculty.sru.edu/david.dailey/svg/newstuff/clipPath4.svg + + // However read the comments to dig into applying SVG clippaths to HTML content here: + // github.com/Modernizr/Modernizr/issues/213#issuecomment-1149491 + tests['svgclippaths'] = function() { + return !!document.createElementNS && /SVGClipPath/.test(toString.call(document.createElementNS(ns.svg, 'clipPath'))); + }; + + /*>>webforms*/ + // input features and input types go directly onto the ret object, bypassing the tests loop. + // Hold this guy to execute in a moment. + function webforms() { + /*>>input*/ + // Run through HTML5's new input attributes to see if the UA understands any. + // We're using f which is the element created early on + // Mike Taylr has created a comprehensive resource for testing these attributes + // when applied to all input types: + // miketaylr.com/code/input-type-attr.html + // spec: www.whatwg.org/specs/web-apps/current-work/multipage/the-input-element.html#input-type-attr-summary + + // Only input placeholder is tested while textarea's placeholder is not. + // Currently Safari 4 and Opera 11 have support only for the input placeholder + // Both tests are available in feature-detects/forms-placeholder.js + Modernizr['input'] = (function( props ) { + for ( var i = 0, len = props.length; i < len; i++ ) { + attrs[ props[i] ] = !!(props[i] in inputElem); + } + if (attrs.list){ + // safari false positive's on datalist: webk.it/74252 + // see also github.com/Modernizr/Modernizr/issues/146 + attrs.list = !!(document.createElement('datalist') && window.HTMLDataListElement); + } + return attrs; + })('autocomplete autofocus list placeholder max min multiple pattern required step'.split(' ')); + /*>>input*/ + + /*>>inputtypes*/ + // Run through HTML5's new input types to see if the UA understands any. + // This is put behind the tests runloop because it doesn't return a + // true/false like all the other tests; instead, it returns an object + // containing each input type with its corresponding true/false value + + // Big thanks to @miketaylr for the html5 forms expertise. miketaylr.com/ + Modernizr['inputtypes'] = (function(props) { + + for ( var i = 0, bool, inputElemType, defaultView, len = props.length; i < len; i++ ) { + + inputElem.setAttribute('type', inputElemType = props[i]); + bool = inputElem.type !== 'text'; + + // We first check to see if the type we give it sticks.. + // If the type does, we feed it a textual value, which shouldn't be valid. + // If the value doesn't stick, we know there's input sanitization which infers a custom UI + if ( bool ) { + + inputElem.value = smile; + inputElem.style.cssText = 'position:absolute;visibility:hidden;'; + + if ( /^range$/.test(inputElemType) && inputElem.style.WebkitAppearance !== undefined ) { + + docElement.appendChild(inputElem); + defaultView = document.defaultView; + + // Safari 2-4 allows the smiley as a value, despite making a slider + bool = defaultView.getComputedStyle && + defaultView.getComputedStyle(inputElem, null).WebkitAppearance !== 'textfield' && + // Mobile android web browser has false positive, so must + // check the height to see if the widget is actually there. + (inputElem.offsetHeight !== 0); + + docElement.removeChild(inputElem); + + } else if ( /^(search|tel)$/.test(inputElemType) ){ + // Spec doesn't define any special parsing or detectable UI + // behaviors so we pass these through as true + + // Interestingly, opera fails the earlier test, so it doesn't + // even make it here. + + } else if ( /^(url|email)$/.test(inputElemType) ) { + // Real url and email support comes with prebaked validation. + bool = inputElem.checkValidity && inputElem.checkValidity() === false; + + } else { + // If the upgraded input compontent rejects the :) text, we got a winner + bool = inputElem.value != smile; + } + } + + inputs[ props[i] ] = !!bool; + } + return inputs; + })('search tel url email datetime date month week time datetime-local number range color'.split(' ')); + /*>>inputtypes*/ + } + /*>>webforms*/ + + + // End of test definitions + // ----------------------- + + + + // Run through all tests and detect their support in the current UA. + // todo: hypothetically we could be doing an array of tests and use a basic loop here. + for ( var feature in tests ) { + if ( hasOwnProp(tests, feature) ) { + // run the test, throw the return value into the Modernizr, + // then based on that boolean, define an appropriate className + // and push it into an array of classes we'll join later. + featureName = feature.toLowerCase(); + Modernizr[featureName] = tests[feature](); + + classes.push((Modernizr[featureName] ? '' : 'no-') + featureName); + } + } + + /*>>webforms*/ + // input tests need to run. + Modernizr.input || webforms(); + /*>>webforms*/ + + + /** + * addTest allows the user to define their own feature tests + * the result will be added onto the Modernizr object, + * as well as an appropriate className set on the html element + * + * @param feature - String naming the feature + * @param test - Function returning true if feature is supported, false if not + */ + Modernizr.addTest = function ( feature, test ) { + if ( typeof feature == 'object' ) { + for ( var key in feature ) { + if ( hasOwnProp( feature, key ) ) { + Modernizr.addTest( key, feature[ key ] ); + } + } + } else { + + feature = feature.toLowerCase(); + + if ( Modernizr[feature] !== undefined ) { + // we're going to quit if you're trying to overwrite an existing test + // if we were to allow it, we'd do this: + // var re = new RegExp("\\b(no-)?" + feature + "\\b"); + // docElement.className = docElement.className.replace( re, '' ); + // but, no rly, stuff 'em. + return Modernizr; + } + + test = typeof test == 'function' ? test() : test; + + if (typeof enableClasses !== "undefined" && enableClasses) { + docElement.className += ' ' + (test ? '' : 'no-') + feature; + } + Modernizr[feature] = test; + + } + + return Modernizr; // allow chaining. + }; + + + // Reset modElem.cssText to nothing to reduce memory footprint. + setCss(''); + modElem = inputElem = null; + + /*>>shiv*/ + /*! HTML5 Shiv v3.6.1 | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed */ + ;(function(window, document) { + /*jshint evil:true */ + /** Preset options */ + var options = window.html5 || {}; + + /** Used to skip problem elements */ + var reSkip = /^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i; + + /** Not all elements can be cloned in IE **/ + var saveClones = /^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i; + + /** Detect whether the browser supports default html5 styles */ + var supportsHtml5Styles; + + /** Name of the expando, to work with multiple documents or to re-shiv one document */ + var expando = '_html5shiv'; + + /** The id for the the documents expando */ + var expanID = 0; + + /** Cached data for each document */ + var expandoData = {}; + + /** Detect whether the browser supports unknown elements */ + var supportsUnknownElements; + + (function() { + try { + var a = document.createElement('a'); + a.innerHTML = ''; + //if the hidden property is implemented we can assume, that the browser supports basic HTML5 Styles + supportsHtml5Styles = ('hidden' in a); + + supportsUnknownElements = a.childNodes.length == 1 || (function() { + // assign a false positive if unable to shiv + (document.createElement)('a'); + var frag = document.createDocumentFragment(); + return ( + typeof frag.cloneNode == 'undefined' || + typeof frag.createDocumentFragment == 'undefined' || + typeof frag.createElement == 'undefined' + ); + }()); + } catch(e) { + supportsHtml5Styles = true; + supportsUnknownElements = true; + } + + }()); + + /*--------------------------------------------------------------------------*/ + + /** + * Creates a style sheet with the given CSS text and adds it to the document. + * @private + * @param {Document} ownerDocument The document. + * @param {String} cssText The CSS text. + * @returns {StyleSheet} The style element. + */ + function addStyleSheet(ownerDocument, cssText) { + var p = ownerDocument.createElement('p'), + parent = ownerDocument.getElementsByTagName('head')[0] || ownerDocument.documentElement; + + p.innerHTML = 'x'; + return parent.insertBefore(p.lastChild, parent.firstChild); + } + + /** + * Returns the value of `html5.elements` as an array. + * @private + * @returns {Array} An array of shived element node names. + */ + function getElements() { + var elements = html5.elements; + return typeof elements == 'string' ? elements.split(' ') : elements; + } + + /** + * Returns the data associated to the given document + * @private + * @param {Document} ownerDocument The document. + * @returns {Object} An object of data. + */ + function getExpandoData(ownerDocument) { + var data = expandoData[ownerDocument[expando]]; + if (!data) { + data = {}; + expanID++; + ownerDocument[expando] = expanID; + expandoData[expanID] = data; + } + return data; + } + + /** + * returns a shived element for the given nodeName and document + * @memberOf html5 + * @param {String} nodeName name of the element + * @param {Document} ownerDocument The context document. + * @returns {Object} The shived element. + */ + function createElement(nodeName, ownerDocument, data){ + if (!ownerDocument) { + ownerDocument = document; + } + if(supportsUnknownElements){ + return ownerDocument.createElement(nodeName); + } + if (!data) { + data = getExpandoData(ownerDocument); + } + var node; + + if (data.cache[nodeName]) { + node = data.cache[nodeName].cloneNode(); + } else if (saveClones.test(nodeName)) { + node = (data.cache[nodeName] = data.createElem(nodeName)).cloneNode(); + } else { + node = data.createElem(nodeName); + } + + // Avoid adding some elements to fragments in IE < 9 because + // * Attributes like `name` or `type` cannot be set/changed once an element + // is inserted into a document/fragment + // * Link elements with `src` attributes that are inaccessible, as with + // a 403 response, will cause the tab/window to crash + // * Script elements appended to fragments will execute when their `src` + // or `text` property is set + return node.canHaveChildren && !reSkip.test(nodeName) ? data.frag.appendChild(node) : node; + } + + /** + * returns a shived DocumentFragment for the given document + * @memberOf html5 + * @param {Document} ownerDocument The context document. + * @returns {Object} The shived DocumentFragment. + */ + function createDocumentFragment(ownerDocument, data){ + if (!ownerDocument) { + ownerDocument = document; + } + if(supportsUnknownElements){ + return ownerDocument.createDocumentFragment(); + } + data = data || getExpandoData(ownerDocument); + var clone = data.frag.cloneNode(), + i = 0, + elems = getElements(), + l = elems.length; + for(;i>shiv*/ + + // Assign private properties to the return object with prefix + Modernizr._version = version; + + // expose these for the plugin API. Look in the source for how to join() them against your input + /*>>prefixes*/ + Modernizr._prefixes = prefixes; + /*>>prefixes*/ + /*>>domprefixes*/ + Modernizr._domPrefixes = domPrefixes; + Modernizr._cssomPrefixes = cssomPrefixes; + /*>>domprefixes*/ + + /*>>mq*/ + // Modernizr.mq tests a given media query, live against the current state of the window + // A few important notes: + // * If a browser does not support media queries at all (eg. oldIE) the mq() will always return false + // * A max-width or orientation query will be evaluated against the current state, which may change later. + // * You must specify values. Eg. If you are testing support for the min-width media query use: + // Modernizr.mq('(min-width:0)') + // usage: + // Modernizr.mq('only screen and (max-width:768)') + Modernizr.mq = testMediaQuery; + /*>>mq*/ + + /*>>hasevent*/ + // Modernizr.hasEvent() detects support for a given event, with an optional element to test on + // Modernizr.hasEvent('gesturestart', elem) + Modernizr.hasEvent = isEventSupported; + /*>>hasevent*/ + + /*>>testprop*/ + // Modernizr.testProp() investigates whether a given style property is recognized + // Note that the property names must be provided in the camelCase variant. + // Modernizr.testProp('pointerEvents') + Modernizr.testProp = function(prop){ + return testProps([prop]); + }; + /*>>testprop*/ + + /*>>testallprops*/ + // Modernizr.testAllProps() investigates whether a given style property, + // or any of its vendor-prefixed variants, is recognized + // Note that the property names must be provided in the camelCase variant. + // Modernizr.testAllProps('boxSizing') + Modernizr.testAllProps = testPropsAll; + /*>>testallprops*/ + + + /*>>teststyles*/ + // Modernizr.testStyles() allows you to add custom styles to the document and test an element afterwards + // Modernizr.testStyles('#modernizr { position:absolute }', function(elem, rule){ ... }) + Modernizr.testStyles = injectElementWithStyles; + /*>>teststyles*/ + + + /*>>prefixed*/ + // Modernizr.prefixed() returns the prefixed or nonprefixed property name variant of your input + // Modernizr.prefixed('boxSizing') // 'MozBoxSizing' + + // Properties must be passed as dom-style camelcase, rather than `box-sizing` hypentated style. + // Return values will also be the camelCase variant, if you need to translate that to hypenated style use: + // + // str.replace(/([A-Z])/g, function(str,m1){ return '-' + m1.toLowerCase(); }).replace(/^ms-/,'-ms-'); + + // If you're trying to ascertain which transition end event to bind to, you might do something like... + // + // var transEndEventNames = { + // 'WebkitTransition' : 'webkitTransitionEnd', + // 'MozTransition' : 'transitionend', + // 'OTransition' : 'oTransitionEnd', + // 'msTransition' : 'MSTransitionEnd', + // 'transition' : 'transitionend' + // }, + // transEndEventName = transEndEventNames[ Modernizr.prefixed('transition') ]; + + Modernizr.prefixed = function(prop, obj, elem){ + if(!obj) { + return testPropsAll(prop, 'pfx'); + } else { + // Testing DOM property e.g. Modernizr.prefixed('requestAnimationFrame', window) // 'mozRequestAnimationFrame' + return testPropsAll(prop, obj, elem); + } + }; + /*>>prefixed*/ + + + /*>>cssclasses*/ + // Remove "no-js" class from element, if it exists: + docElement.className = docElement.className.replace(/(^|\s)no-js(\s|$)/, '$1$2') + + + // Add the new classes to the element. + (enableClasses ? ' js ' + classes.join(' ') : ''); + /*>>cssclasses*/ + + return Modernizr; + +})(this, this.document); diff --git a/ajax/libs/ink/2.3.1/js/prettify.js b/ajax/libs/ink/2.3.1/js/prettify.js new file mode 100644 index 000000000..30fc2a5d3 --- /dev/null +++ b/ajax/libs/ink/2.3.1/js/prettify.js @@ -0,0 +1,29 @@ +// [3.0.0] remove this file when docs properly separated +var q=null;window.PR_SHOULD_USE_CONTINUATION=!0; +(function(){function L(a){function m(a){var f=a.charCodeAt(0);if(f!==92)return f;var b=a.charAt(1);return(f=r[b])?f:"0"<=b&&b<="7"?parseInt(a.substring(1),8):b==="u"||b==="x"?parseInt(a.substring(2),16):a.charCodeAt(1)}function e(a){if(a<32)return(a<16?"\\x0":"\\x")+a.toString(16);a=String.fromCharCode(a);if(a==="\\"||a==="-"||a==="["||a==="]")a="\\"+a;return a}function h(a){for(var f=a.substring(1,a.length-1).match(/\\u[\dA-Fa-f]{4}|\\x[\dA-Fa-f]{2}|\\[0-3][0-7]{0,2}|\\[0-7]{1,2}|\\[\S\s]|[^\\]/g),a= +[],b=[],o=f[0]==="^",c=o?1:0,i=f.length;c122||(d<65||j>90||b.push([Math.max(65,j)|32,Math.min(d,90)|32]),d<97||j>122||b.push([Math.max(97,j)&-33,Math.min(d,122)&-33]))}}b.sort(function(a,f){return a[0]-f[0]||f[1]-a[1]});f=[];j=[NaN,NaN];for(c=0;ci[0]&&(i[1]+1>i[0]&&b.push("-"),b.push(e(i[1])));b.push("]");return b.join("")}function y(a){for(var f=a.source.match(/\[(?:[^\\\]]|\\[\S\s])*]|\\u[\dA-Fa-f]{4}|\\x[\dA-Fa-f]{2}|\\\d+|\\[^\dux]|\(\?[!:=]|[()^]|[^()[\\^]+/g),b=f.length,d=[],c=0,i=0;c=2&&a==="["?f[c]=h(j):a!=="\\"&&(f[c]=j.replace(/[A-Za-z]/g,function(a){a=a.charCodeAt(0);return"["+String.fromCharCode(a&-33,a|32)+"]"}));return f.join("")}for(var t=0,s=!1,l=!1,p=0,d=a.length;p=5&&"lang-"===b.substring(0,5))&&!(o&&typeof o[1]==="string"))c=!1,b="src";c||(r[f]=b)}i=d;d+=f.length;if(c){c=o[1];var j=f.indexOf(c),k=j+c.length;o[2]&&(k=f.length-o[2].length,j=k-c.length);b=b.substring(5);B(l+i,f.substring(0,j),e,p);B(l+i+j,c,C(b,c),p);B(l+i+k,f.substring(k),e,p)}else p.push(l+i,b)}a.e=p}var h={},y;(function(){for(var e=a.concat(m), +l=[],p={},d=0,g=e.length;d=0;)h[n.charAt(k)]=r;r=r[1];n=""+r;p.hasOwnProperty(n)||(l.push(r),p[n]=q)}l.push(/[\S\s]/);y=L(l)})();var t=m.length;return e}function u(a){var m=[],e=[];a.tripleQuotedStrings?m.push(["str",/^(?:'''(?:[^'\\]|\\[\S\s]|''?(?=[^']))*(?:'''|$)|"""(?:[^"\\]|\\[\S\s]|""?(?=[^"]))*(?:"""|$)|'(?:[^'\\]|\\[\S\s])*(?:'|$)|"(?:[^"\\]|\\[\S\s])*(?:"|$))/,q,"'\""]):a.multiLineStrings?m.push(["str",/^(?:'(?:[^'\\]|\\[\S\s])*(?:'|$)|"(?:[^"\\]|\\[\S\s])*(?:"|$)|`(?:[^\\`]|\\[\S\s])*(?:`|$))/, +q,"'\"`"]):m.push(["str",/^(?:'(?:[^\n\r'\\]|\\.)*(?:'|$)|"(?:[^\n\r"\\]|\\.)*(?:"|$))/,q,"\"'"]);a.verbatimStrings&&e.push(["str",/^@"(?:[^"]|"")*(?:"|$)/,q]);var h=a.hashComments;h&&(a.cStyleComments?(h>1?m.push(["com",/^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/,q,"#"]):m.push(["com",/^#(?:(?:define|elif|else|endif|error|ifdef|include|ifndef|line|pragma|undef|warning)\b|[^\n\r]*)/,q,"#"]),e.push(["str",/^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h|[a-z]\w*)>/,q])):m.push(["com",/^#[^\n\r]*/, +q,"#"]));a.cStyleComments&&(e.push(["com",/^\/\/[^\n\r]*/,q]),e.push(["com",/^\/\*[\S\s]*?(?:\*\/|$)/,q]));a.regexLiterals&&e.push(["lang-regex",/^(?:^^\.?|[!+-]|!=|!==|#|%|%=|&|&&|&&=|&=|\(|\*|\*=|\+=|,|-=|->|\/|\/=|:|::|;|<|<<|<<=|<=|=|==|===|>|>=|>>|>>=|>>>|>>>=|[?@[^]|\^=|\^\^|\^\^=|{|\||\|=|\|\||\|\|=|~|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\s*(\/(?=[^*/])(?:[^/[\\]|\\[\S\s]|\[(?:[^\\\]]|\\[\S\s])*(?:]|$))+\/)/]);(h=a.types)&&e.push(["typ",h]);a=(""+a.keywords).replace(/^ | $/g, +"");a.length&&e.push(["kwd",RegExp("^(?:"+a.replace(/[\s,]+/g,"|")+")\\b"),q]);m.push(["pln",/^\s+/,q," \r\n\t\xa0"]);e.push(["lit",/^@[$_a-z][\w$@]*/i,q],["typ",/^(?:[@_]?[A-Z]+[a-z][\w$@]*|\w+_t\b)/,q],["pln",/^[$_a-z][\w$@]*/i,q],["lit",/^(?:0x[\da-f]+|(?:\d(?:_\d+)*\d*(?:\.\d*)?|\.\d\+)(?:e[+-]?\d+)?)[a-z]*/i,q,"0123456789"],["pln",/^\\[\S\s]?/,q],["pun",/^.[^\s\w"-$'./@\\`]*/,q]);return x(m,e)}function D(a,m){function e(a){switch(a.nodeType){case 1:if(k.test(a.className))break;if("BR"===a.nodeName)h(a), +a.parentNode&&a.parentNode.removeChild(a);else for(a=a.firstChild;a;a=a.nextSibling)e(a);break;case 3:case 4:if(p){var b=a.nodeValue,d=b.match(t);if(d){var c=b.substring(0,d.index);a.nodeValue=c;(b=b.substring(d.index+d[0].length))&&a.parentNode.insertBefore(s.createTextNode(b),a.nextSibling);h(a);c||a.parentNode.removeChild(a)}}}}function h(a){function b(a,d){var e=d?a.cloneNode(!1):a,f=a.parentNode;if(f){var f=b(f,1),g=a.nextSibling;f.appendChild(e);for(var h=g;h;h=g)g=h.nextSibling,f.appendChild(h)}return e} +for(;!a.nextSibling;)if(a=a.parentNode,!a)return;for(var a=b(a.nextSibling,0),e;(e=a.parentNode)&&e.nodeType===1;)a=e;d.push(a)}var k=/(?:^|\s)nocode(?:\s|$)/,t=/\r\n?|\n/,s=a.ownerDocument,l;a.currentStyle?l=a.currentStyle.whiteSpace:window.getComputedStyle&&(l=s.defaultView.getComputedStyle(a,q).getPropertyValue("white-space"));var p=l&&"pre"===l.substring(0,3);for(l=s.createElement("LI");a.firstChild;)l.appendChild(a.firstChild);for(var d=[l],g=0;g=0;){var h=m[e];A.hasOwnProperty(h)?window.console&&console.warn("cannot override language handler %s",h):A[h]=a}}function C(a,m){if(!a||!A.hasOwnProperty(a))a=/^\s*=o&&(h+=2);e>=c&&(a+=2)}}catch(w){"console"in window&&console.log(w&&w.stack?w.stack:w)}}var v=["break,continue,do,else,for,if,return,while"],w=[[v,"auto,case,char,const,default,double,enum,extern,float,goto,int,long,register,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile"], +"catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof"],F=[w,"alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,dynamic_cast,explicit,export,friend,inline,late_check,mutable,namespace,nullptr,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where"],G=[w,"abstract,boolean,byte,extends,final,finally,implements,import,instanceof,null,native,package,strictfp,super,synchronized,throws,transient"], +H=[G,"as,base,by,checked,decimal,delegate,descending,dynamic,event,fixed,foreach,from,group,implicit,in,interface,internal,into,is,lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var"],w=[w,"debugger,eval,export,function,get,null,set,undefined,var,with,Infinity,NaN"],I=[v,"and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,with,yield,False,True,None"], +J=[v,"alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END"],v=[v,"case,done,elif,esac,eval,fi,function,in,local,set,then,until"],K=/^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\d*)/,N=/\S/,O=u({keywords:[F,H,w,"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END"+ +I,J,v],hashComments:!0,cStyleComments:!0,multiLineStrings:!0,regexLiterals:!0}),A={};k(O,["default-code"]);k(x([],[["pln",/^[^]*(?:>|$)/],["com",/^<\!--[\S\s]*?(?:--\>|$)/],["lang-",/^<\?([\S\s]+?)(?:\?>|$)/],["lang-",/^<%([\S\s]+?)(?:%>|$)/],["pun",/^(?:<[%?]|[%?]>)/],["lang-",/^]*>([\S\s]+?)<\/xmp\b[^>]*>/i],["lang-js",/^]*>([\S\s]*?)(<\/script\b[^>]*>)/i],["lang-css",/^]*>([\S\s]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i]]), +["default-markup","htm","html","mxml","xhtml","xml","xsl"]);k(x([["pln",/^\s+/,q," \t\r\n"],["atv",/^(?:"[^"]*"?|'[^']*'?)/,q,"\"'"]],[["tag",/^^<\/?[a-z](?:[\w-.:]*\w)?|\/?>$/i],["atn",/^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],["lang-uq.val",/^=\s*([^\s"'>]*(?:[^\s"'/>]|\/(?=\s)))/],["pun",/^[/<->]+/],["lang-js",/^on\w+\s*=\s*"([^"]+)"/i],["lang-js",/^on\w+\s*=\s*'([^']+)'/i],["lang-js",/^on\w+\s*=\s*([^\s"'>]+)/i],["lang-css",/^style\s*=\s*"([^"]+)"/i],["lang-css",/^style\s*=\s*'([^']+)'/i],["lang-css", +/^style\s*=\s*([^\s"'>]+)/i]]),["in.tag"]);k(x([],[["atv",/^[\S\s]+/]]),["uq.val"]);k(u({keywords:F,hashComments:!0,cStyleComments:!0,types:K}),["c","cc","cpp","cxx","cyc","m"]);k(u({keywords:"null,true,false"}),["json"]);k(u({keywords:H,hashComments:!0,cStyleComments:!0,verbatimStrings:!0,types:K}),["cs"]);k(u({keywords:G,cStyleComments:!0}),["java"]);k(u({keywords:v,hashComments:!0,multiLineStrings:!0}),["bsh","csh","sh"]);k(u({keywords:I,hashComments:!0,multiLineStrings:!0,tripleQuotedStrings:!0}), +["cv","py"]);k(u({keywords:"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END",hashComments:!0,multiLineStrings:!0,regexLiterals:!0}),["perl","pl","pm"]);k(u({keywords:J,hashComments:!0,multiLineStrings:!0,regexLiterals:!0}),["rb"]);k(u({keywords:w,cStyleComments:!0,regexLiterals:!0}),["js"]);k(u({keywords:"all,and,by,catch,class,else,extends,false,finally,for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,true,try,unless,until,when,while,yes", +hashComments:3,cStyleComments:!0,multilineStrings:!0,tripleQuotedStrings:!0,regexLiterals:!0}),["coffee"]);k(x([],[["str",/^[\S\s]+/]]),["regex"]);window.prettyPrintOne=function(a,m,e){var h=document.createElement("PRE");h.innerHTML=a;e&&D(h,e);E({g:m,i:e,h:h});return h.innerHTML};window.prettyPrint=function(a){function m(){for(var e=window.PR_SHOULD_USE_CONTINUATION?l.now()+250:Infinity;p=0){var k=k.match(g),f,b;if(b= +!k){b=n;for(var o=void 0,c=b.firstChild;c;c=c.nextSibling)var i=c.nodeType,o=i===1?o?b:c:i===3?N.test(c.nodeValue)?b:o:o;b=(f=o===b?void 0:o)&&"CODE"===f.tagName}b&&(k=f.className.match(g));k&&(k=k[1]);b=!1;for(o=n.parentNode;o;o=o.parentNode)if((o.tagName==="pre"||o.tagName==="code"||o.tagName==="xmp")&&o.className&&o.className.indexOf("prettyprint")>=0){b=!0;break}b||((b=(b=n.className.match(/\blinenums\b(?::(\d+))?/))?b[1]&&b[1].length?+b[1]:!0:!1)&&D(n,b),d={g:k,h:n,i:b},E(d))}}p

        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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ajax/libs/ink/2.3.1/font/ubuntu-li-webfont.ttf b/ajax/libs/ink/2.3.1/font/ubuntu-li-webfont.ttf new file mode 100644 index 0000000000000000000000000000000000000000..f7ecd54b20f41bac9d11dfbaaf39441f5c9bd615 GIT binary patch literal 58980 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 literal 0 HcmV?d00001 diff --git a/ajax/libs/ink/2.3.1/font/ubuntu-li-webfont.woff b/ajax/libs/ink/2.3.1/font/ubuntu-li-webfont.woff new file mode 100644 index 0000000000000000000000000000000000000000..513095ad4503ac31c198666cf2dd88a7f731bdec GIT binary patch literal 30404 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 literal 0 HcmV?d00001 diff --git a/ajax/libs/ink/2.3.1/font/ubuntu-m-webfont.eot b/ajax/libs/ink/2.3.1/font/ubuntu-m-webfont.eot new file mode 100644 index 0000000000000000000000000000000000000000..991881e855e0f995c1d2959e4b29c18657b94cf6 GIT binary patch literal 22814 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%0ASlhC3)cE`GUJ7oTUYP8b*I3I& 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ajax/libs/ink/2.3.1/font/ubuntu-m-webfont.ttf b/ajax/libs/ink/2.3.1/font/ubuntu-m-webfont.ttf new file mode 100644 index 0000000000000000000000000000000000000000..8f435a9f7e1bf621378ca8f0473b71b9b8a483bb GIT binary patch literal 47248 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 literal 0 HcmV?d00001 diff --git a/ajax/libs/ink/2.3.1/font/ubuntu-m-webfont.woff b/ajax/libs/ink/2.3.1/font/ubuntu-m-webfont.woff new file mode 100644 index 0000000000000000000000000000000000000000..3a7e54dad4a56b42fc4bbe40dd01000748fac8f9 GIT binary patch literal 26376 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 Zz&!g=QYzlZHd~bd00001P(}jo008U8Z1MmA literal 0 HcmV?d00001 diff --git a/ajax/libs/ink/2.3.1/font/ubuntu-mi-webfont.eot b/ajax/libs/ink/2.3.1/font/ubuntu-mi-webfont.eot new file mode 100644 index 0000000000000000000000000000000000000000..122a7ec45b201d2412fd0487e88a8c2ec7f79d21 GIT binary patch literal 25736 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 literal 0 HcmV?d00001 diff --git a/ajax/libs/ink/2.3.1/font/ubuntu-mi-webfont.svg b/ajax/libs/ink/2.3.1/font/ubuntu-mi-webfont.svg new file mode 100644 index 000000000..d23a68600 --- /dev/null +++ b/ajax/libs/ink/2.3.1/font/ubuntu-mi-webfont.svg @@ -0,0 +1,245 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ajax/libs/ink/2.3.1/font/ubuntu-mi-webfont.ttf b/ajax/libs/ink/2.3.1/font/ubuntu-mi-webfont.ttf new file mode 100644 index 0000000000000000000000000000000000000000..0c4e61c20744e79bcb32fbfb5894b354ce0143cc GIT binary patch literal 55960 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 TpUEYjI4rg@si$2&!`S}*#(% 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 z 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 literal 0 HcmV?d00001 diff --git a/ajax/libs/ink/2.3.1/font/ubuntu-r-webfont.eot b/ajax/libs/ink/2.3.1/font/ubuntu-r-webfont.eot new file mode 100644 index 0000000000000000000000000000000000000000..77f5469a57ee1e80ad6e14e403b71c0259fd52de GIT binary patch literal 23130 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 literal 0 HcmV?d00001 diff --git a/ajax/libs/ink/2.3.1/font/ubuntu-r-webfont.svg b/ajax/libs/ink/2.3.1/font/ubuntu-r-webfont.svg new file mode 100644 index 000000000..907a08077 --- /dev/null +++ b/ajax/libs/ink/2.3.1/font/ubuntu-r-webfont.svg @@ -0,0 +1,245 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ajax/libs/ink/2.3.1/font/ubuntu-r-webfont.ttf b/ajax/libs/ink/2.3.1/font/ubuntu-r-webfont.ttf new file mode 100644 index 0000000000000000000000000000000000000000..7662ea6a0d1facddc511a2bf91c026a63034f60d GIT binary patch literal 48952 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⪚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 VXo^*h-WW7HsSZnv8|3#G`+urdEY$!2 literal 0 HcmV?d00001 diff --git a/ajax/libs/ink/2.3.1/font/ubuntu-r-webfont.woff b/ajax/libs/ink/2.3.1/font/ubuntu-r-webfont.woff new file mode 100644 index 0000000000000000000000000000000000000000..d20d54d96f47993f3f873869e01df5eb4140a422 GIT binary patch literal 26688 zcmY&7 zeOfc!u5zNH01&|UWyTLc{V(nQ^}q6e`TzeC6;+Y}06$`FxCM+WQ%?*6Z zbl+eGg9CXH`z@#V&E5Yee}kWGO14H!QCScG0Hyrqi@wv7BI~RdIYox=`(QKQIy&Fb zOND_fFtpaU0|3AozxATOaV8o8z&CVpA_M>+dcJkOeE~$#wGmBB>`biz07&R>o!am6 zj1?OgicR$$zipv9zIDF&|G^JaD|eG`?mIq}@0jwzL2swNnGuz$7t z_?dl^-<e(UMweES{$#)|t^Zi=tN&|D2nr1fYol*%{LMvv+mU>SlD4n@XkusU=mY>5*L>R@|Mw2oV-c&F0MAO0s*x6Mw^s7*%? z`E94{?AspQPc@J2T|rO_*S&Dpcgg$2n#Fsgj`tXj7*dh-2z-vrl5=Q?k8oo7kw4hk zp$G0t2=!BK)%(hP+q$TM;<)LU;&blY*r>t%LK1Vcc9gggkjk|$eA|N7npZu@R` zs2)0EkegEtv~p(-o|fWL^*8K>&Ha;}n0a}&3LCkJ>w_(>8mpP3q9X~$U$n}Vmwb|x z35QodcQ4T9KHM`Orf+$FEt0LC8cd9UxTsiM;xuVB;$0XYy(n8cnXp^Tz|p%Wa6Eis zKUv@m>Uuc-=OUwN8|o?|nZ7zo?@})|_B1O(jXpfI7`f7s4$PtMA0kjme*= z?;+-B9kjl*OZKF#o$$uLjzw2d-$#yd?^DdW$-wA1K(BW1*W9X|!mvgxc#m}IJkHm8 z8!)|iE2|cJU7MKXzoG@E9TcOPV(o?u#$N5kT+3jl-K~BNzCcJgng0IYx;0@k%;@PE z>*?c)SWNNvm&X@m(KS*V80hKg8JHaFn;06H7`XNGKlKF!3bKNswfuVJV*bT={b`~v z^_D!;)1%YZqT%na?}JGK1{OhX$?-c36pRHBsENq`zvb)cnfU2pL5f2Da05MH3V5M~ zr|@gQ4+M=JgfhBe9${W!dN+kPsnFvZauV~G5)c-U6p$5=5Rehj?Uf|b(T~cT0}I}! z{rU=&0WDS4Q|rM5SDwxx%puGr1XH$!QJscXntuN}|1$l`e&>7dzV5!_3+}Ea$Z)fJ z?)8UyBlzcDbJsfrMT6hKUDM*Lwu^PnQUa6!L|Xk|2w0Wo4}g&Y`5hnhH!3qQAtF5_ zIYyWNx44?HlC+kff~1D1imZ-+yo9=lvW&KnqLikXs@!(Z%*e{X!o)`3+}PUC($rS( z?C9#?;^b!k{P_Ct@-!bIBjqnrR$6XiW@;{Sc6weSrm)=3{BqN=i5ID#4BA~*gJo>x z%T?<&KKn&<>rFP>t%g@w-fvjpit}}s%JkF|?iyK>Go0zUfBcE^LI1UFXaxUlPgl4V z_}9_)Hacm|f=JNn^6{97!{N$=%Qbd=u$zC(fLUg4|3eR`h7Xs__qa0;(@JeA&W z_siG?BryMh6++H6wEEQ8 zAc#<Pdg7m3|d>czi@8aSuWjgb8o3SfAHws!V=h6xZtWT+G2OE@3P65G-qe@e2xPAdAD zeK!dY9hq71w*A)45nV7VZq{{`ahG`qjJbmEXO@BQe=O&lD#4^vBtjuq$Xs&x{E7_2 ze&ACsR;I;e&V!XJzj4wir|MG3BzNPrdC-)4SMf#FOjH*@G=W?s@V%-|Yq^7eC#}Ca z(>y5g2p`qYkOn3!u}F(6otn&(C&3{1q9dnBv0!J_+7Z1NujT1G5zU%qp+_Rm8f2kw zl9Fmfs-%~w7Ai!VDX3cq&^2T&rw5+VQw5}{~=d{~0 z#Hn`=PRPt0J+RI!i!dUtzcV`0<>M3KhR0j?i8k)8v}g1fno?p6U?;x5!OAmq(h?sD zL+;h1*Ek_K@ijC% zi2`}~t5ct?-=Yh~(;-dt0!E$*buSLo&T`|m9lU4&` zhMC{+6QWPtgBgKUubiR@dV9kC(CElS*chBP?ApCV5;Q7c5}nAogv8H#d4cKZ4*p%p z#1&!COHz3Rq+`<&<^E&QDVQKOtp*U`d)!fX zjfc8#g|A%w0E~ zIErM$nN6r@QX?Gi1R?XhpreDU#a$)9hzob4t6)mNlvn1BrbxmdYo^gq%Jjx9QG@T= zw!l7vCZKdInHxNWsI=&_EyaPN#3++5Db@7CDjUccqx=*FvA3iV&r#cVLaVt1MXy4$ z?9mW#8L<5HI8N}*__wa3Tkoy7SZYY&(T$5J`h*lC2dVjH3B>QJmUlZE=$DJ}9&K*x z=2=unb!<(*dvd*eD>~lZ-jjUpZ`vuk6gTYHP+nPSu6NyTpt%F~IY_7(TA1vdrKd4H zz^E+-N&87KpQnnYIw4mz{3^?)-bo->PQ%U;Cg1?h|HfBM7c>CFZKJ!NnVdw)4Xg5n zx*irtCBfdA>4~7(v7^JSIvmvaRpEzT52AC2tFqo8qKyXd2yL|7jq2vsfw#r1&4pfA z4i8t7yl>qd=_&9tcw}p|;#TS5!ZTt2t<_78M=#lb(fw$JDGiTp5DfS-RW3n z`&^%mhrd<3|1o)1`XnlG<;*LZS!%$p{SnkA>KzZmL{*gfLYweNq8%u{OgXa{N@^{* zXI(I$S(u%dMJW42XD3vT7BL?D1VkXqnF79nGb{UTgH#Y zQXycNx=l4_%QjrYx)`f`t(jO}h79pEnO4R`UP6jG!G>ivV8x#oF)d8E3G`XeI6g($ zC8S-24B1Yx!LsFyP{Jnb-$}*^j2IWB!oiWrF=|^;TGBZuHq+SM=7Tk>_yqXVZJ27?H znv}b1iRJat>~uB5sZCe|d)!CU$`IYZWD3_dR2<$cvn_7$ds4GNafU_#p9cQA7oq@x zTAus3`hk;wx&{WAubLq&3IFhAPz?>VB4feMhNOLk%d^qx=8&$N3N-sQ+|xBR$MAi2 zuP;BKkS@2qpCOvE!ACq9w(QyGW8INH*?8BVh~1HV=QC1CyA^%rNk59t;?2~aCneMW zng&W>beT=QA@M$*WE1%84i+=pW|2*!AiR4%{=;K1VNE6I<-3S@PPhJtxQMpWqb$us z2pWs2uPkggAff{20HQ*Ri|mvCbMhdGPzcq~EU6g41)h?N7&=vo}#=|aZ*N=X! zF0X*B45$|x!{$tIaR4jl(Dis*MbYlw^)^~{>q6kFplG&S5X`Ot8CChVw*J(J4Mj)y zRLJ@$81^VM@#FaD6>#jt42p`}U>{dv3gJvU`GXZEQh-1b6%r{-5(%DN6uh6zKPt>a z4MB^xl4HlzgU)L*XIKaf(`uHKWee#UG7|G-im2|q{9u|n`-A%YmteH9M~o4#z^5R# zkmnKnN|E}GGR&=oD9L#I1T%|qsu};gk>u|55{eppZ_BuUgJsN{`XhQ%B@+wq87aL( z9z%CTP7BL_Tc$>oy)P?hQ8&^NHO%EFf$$D7v5+7Ob=IsSk$h$3Vk+TP?T{1pFe~V@ zZTt(~3|V~8XCjzna3S>XEGPC3oK^`?=StYL{udo@GL}*c&{ZX-pST!!F|5$&VF{F; zudA(^%n56zzRQHWJT-6`NKUGVD?#M$tSXDNIhwz&%S@ee#;)nQWV^1`C zvUO^r^F-%%I_U6)T9MG|UCK->)LH%f4OoD7hr`L$TCHC0m+f0^p6lz)OYXZ5NspfA z9sfAzV$@jge!agL-WC`5-uLZ$d&lTv;(d6&hC2b_zLop0?!{dH`7G7fmNN_>{2^F--J)zB$3sX?r{d!e`+}O$ zLwDpza3O}UI#VA-fs6yKd30b1V;`^3+aEL#jtyRIsKSI$I0pC+pqr03uFXx&Pz!?( zE}18+VH8NsAN`pzXX)(&&n#VbM1#i~`=)B=MfnrC%Om;M z^^y4If$I}#leIYl-aZY%3%umSezdTzV_E&&U+RtFQ-8!A>5WzGqp(cT847-oWGvuOjLQlSKk6PeFH{+>a9|`bwq%bS< zCJoGGCl141=_m4i@&KrwOzT1N!pHubZti7hb00iE=ykPOZCAOd^ln|3XVE3pl`$oF z)AfAEAncD7IN6Y82t*Nj@5h;AZZFw>j5>ZMFHim2Z!uV?tM2BR=k1H+H;01z_D$TX>(t?r?S<8v(tc)!6;`#rI{O1`srQG^BNcno!vLb(tjv1$ zKO4Tbb{yLF;-_m<4Ta7p;bQ!UqgE27=plh4b?Uptcu_gj46?ws2|p2lix2sfm0lCGIe`LKNs_)@AokFV^r$9$c|{7wcNa2yR%+WEoP|=3 zj6}jZ6yqRJY5NCtF~>WLJwPL>jr55K`U5*17e#^A7|N`~(VXR}{!V zwQk+pRyE>kdBx|oJfeCP23}@M|Anr~Mja_#)Eu0B$NsMGd8Zf1x5hEM>gt;7+u!tf z>EGepi4f&|emlayI74Ck7^P*i?P;rh=iP2m4r#l+^KpOG)@`Tjygrgu79YbFG=9z{ z6s4)L|M;A|;@Q`E!S?u^wcEGU_S;<>XXJ2ak*23SAzUlZ2W2u`D=AQ`4OW^mxyteY zg@-h1x~isVkv>)==Ql`&W^WeCSfx}ZO_n^AKd!_e7C!;CdaEeW2%+Sz znTMxL5rbp0%iiB%D4sArsGE(pSF#@?naUN!S!Ltagh81xx>;lQCR{81vv0DO*Juq^ zzIm<|x>?JebDNGvZ$nDcJdAST?kx^IST^KwK_0Z=h#8?C4)zWKOyAA9w+J^^u>t%| zExBJn>L&Iq%Uy3k0XKA+g9*PVPD1mh&ZfgE3lzLJBC`n-_h=?k9ovtSc|R6%=P!}L znvpY!d2*ky@{-*V(SC8_4ee0$MmKE_TX-A+R3xqmYvf;vdhlI%TJTJGoG?wf2B9)2 z>f^B$-x4EhvC)-;R8^L0UV+;69}@O9i~X#;sT8@t{g$Dh?f#w;=lS4!qqxDB%4(ge zWD=H=h>gtazKk(1tJ1Z0Ws!y@z}Hq!{-sdLS1l3`|08}fI+2y1I^FvasJg9S?^GF* zDnO1Wn3Z&5^iQoM34F<2q9Mhkm~P4-$0}7=9gg8hiZNWW8iH}Ip{xcxkX$fT`MThb zSGpcJGCeIw-no^}LNhgu+7C&0cYntzuWNJrQAedhiwkutX!h(i=GVb3{yc9*&j6l^ zhz6G}G_3E@(m)y+-Pu;6<+AEx^yrP<`3Zpy%fWH1KT7lJS3Sf2 z8wUj-y1VS>k^V4bx7SiZ?73>Syf>J~brLScN{=sOizg16_N~)~4xot*t-q82Ht$>E z3QfXuQ0S!kh4y8mrC)?$3BwX6liJQtmseKrEesv?KI3tx!y4~r37(J9Kj(zvF`gg ziq)5vbX51?7R_)-RxjycD&5YPxkJL|flzA{J{}HIU#Sz-vQtJrFAu!gmrVJ#*KBj2 zcit4%F1EzU?|ZcG8^C25+}^W5s(^^f2NV+O zp-+_T;-OSfi#=0SH1tXk`C|&t5Yj?qnoojm0?L2!op~k$;apxY{GD>W#y2$u_p5nU zzug=1N#7fld|lGTw8M4aknqSwH!3~KIqMqJH+-IEjxKDrudngq+m&*Pv`M9^eL#fuQnlE=t8EkkyS650Y#vfZteyMaQNu#$5tEfk2U4seS9Z(apYE z1+JJ$ucmokN?4_@wsu+2@-&%}cMN&m72{v37{#*&;)YU|s(_`1fNZ9m$d11h)}Pbh38t8V0gSe?bK-YCktQCjVrk}CoWI0Z9s2;(P?_sMcT4nBE$OxBOh*^LKfG@+w%cFgxD{6IJCa1w z%JCiQ6yG{E)5^8>q;3E{HEgq*v|VzAtMTGGx%~E&zo*FXBUM`J zw>{SS4oS(tcskdm7H5Im&+HI(f|WI+ifRvYJ<3i)p~c7h$IA=%V{Y$k_X6jz4LrCZ z^wRosHJ?lT%z1r~-g=2UA&o8}cQp#jU)CA%iob_Vl^`W${<>rZa`MZtlOJ504f$8) z{X8mRL_|%%L`&EfjwSX9!V13E|yJ!-)9NFx(2k2aH8O_I+`H#tM2l8JENoZc-_~N_QjShWWKoFUlfV$ z<8YLsJnhTj^+1MAF5B1n?g(QZ3e_P=4ae!ZVD&H7sNu*5j=CFdQMd%~3LqtRi%;`dYpqLXw~J=(8C7KN%FeRMW% zu448YXuS)&CeF)+j!qgv_W|uxG3o^SbRIoIfqD&`lHY;5iWjq-oe+oM*y5qqp{z(=kpKk>P>P++E?;w#n9L2Mf1!pm8Ll zf(Wq4Af~Syxf14Ka@pqa4hsGrMuI;rJPr3B6P^$<*S31H zfHGR!8x5!FslGsOE|v(f0dJ4Jy?i{p7@drimX_{(!!MBm9!f{39{ki)uOcCx!f?7Y zCUs0irvMnXiWu2`c&Q!~)CumwlAk64EDm{`dwTfpEohB;aRr5#Vi8IML_YAy)1WGp zMN80LenWCz7Z^}k&wD+~m(`WsS8>sq=Zl7jM-i8_G_+R)MdY18$D9c*fcdI}InXb93< zu&Yyc3=OnUu*sF6) zy6Sdar>g5TR=ndG7xxR*HE9f$;blD821@dZ0<6`I8RUfzQDQMsm^;@{%rk?9?C)!w^340%nbL#G z#tTyd^MV#Q+vwGglE|kx8&G7Fa2nx6e!m8*(Q0YZ@{Eg*oC2NZStvPHqd<#Z}jva5q=&|X_Y1XWL z`fTo(uIzSc-!IIWdxU3ijs&AQmx5B!CY%5!dMM#U1sqx-e-UZa0ZwY{m0kidL#kFs zIFq}TR$Dx)H!ItFt<8gRMMb_9<>A}18=9Ez*Y`6z-8R)lUt@=VZ%}RRNEyY301Oel z0H&3hC6Y237Fq~Q;To}-0Y+jHbC?zl?wFO`uU}EHN!V(`drDiRooijLPeymC zN25G3CB@9!X>a8do_`EIM_xHtP>$fD#GncEJ?MMk^HN1& zllU?H#ve{=;0++VA~uJ}Ea&FXq?xhI^@!96^#M?t%~@2N@;^1q3g zMYx^^Xf3R+!vDV!}sF7dtcP8$~orr(U>&fk*50^2cBS|@>#R1Ur*3|8~f4RW-*cy}rY9s!-6MR^2yq8Ai(^gZ`Ln_?Wfb(}1_$%2jQb&AqP3Gl)Zj||F zyAPv9X(>D4qME}}x*}XLovveXmzGvT3r+aUJ!(|h?t?*`$xF`%g#6{UBq+bAX)f4c zr^u|2U&&uV#h6gT52X~YD{Uy4|Cj}j0{Gc9zx`V^{mbEe`I2YZv#wq9gp=c*?O|be z;x08JRX4J0sBR$XWl-y=5!rx5f9_eyM6Zg>@lxy{#ErN9OpJ6;k~0o^v9v{0(m2W@ zk(C;Kb^{s#F&vi|H0lpDwY3B-S{Q0_)S0lKYh0J>qtQ~Q2z%UCwlQ{*Py4BZ{!@<~ zH}A%_;x8dlU4!hDH?p2f&uL?q>?%&XgOQ=6YFy6WLe;i^&VAvkrb)V3=`;vbCNT63 z5+$i7VRGq=rSHZeL;?9>mTI)uRK`(XOP?G3Uw3$X*gmdj8(U8cio-0!hy>)F!_%g` zH!+S3b)_65FlCmzX@GGo3PqxQ3E;C8q>959qkPaO83_mpXb-f|lW2x#o=WC@U>}Im zu`7EJeu|gT)xlb;!s5$Fbg9_WWn?)l1yJ|(Gw3*GIn#~Ue&>F?I^zmRblR58obZoV z2KA&3Jc_i86I+55H;UANS3`ws6iIOcY7396hLmEm zWRLU*&$!QrhzzPpPOt8WbUeZA`I12;l*~{mu^NYHb$KUva?dYD9qIlEVI&KXd-`g4 z{&Hc?O}hthZnwS34v{I-JzMifg4n9s)Xak)u5*~h;Nutu8HAJ?Jgd_9T(Xb&6J9)y zX`LgyEX#9K>{FRRwO@!spY7!WnC?}d;x5B8}jk9q&sgS z&)yZZJ4dy3Owm9 zhCOM^eowe`F8NQ9;AI76%+Rr%BN6()jc8hbr zaM~zErnCb(Z2o4o7)tIXW;W5)nW(}m}a zf4n~`cc!VWpCUlJoxL#%>h?M9G3z!Ag91l={rLq<8~;ibH|vUb`{TMtgWxN%*JkR} z>)u#W6O+VLGpABLmkzIxA)+Z*J+&r)Ueq%7$h@3gaV@RXl>8a3bPS&})=fT3;%8>> z>&?CR_Eyj8(3M&AbOhYiC%s~R=)-597 z%&Y2)9IX^?Cx|JgBURw*J*|oJHN|sRD_(@pi}Q#@CiNXY*}~X*6}alB_%L2|JR>sU zuw&$&u3+52ii3-Fwv@k^Eh}xkYHGVVN7f!c?aDas(kB=q1|K+g5o$Ew7-pHO8V zRyA!ST({tE9nqYOIj@JNSjV@t5u>ur4-!)moMR1j?kAZ5v7y`-D*Rcj9r1y@nbEIK z8fUad`esovIc>bJo6Bvy`!H@EIOJDkA2ZRLo2iUpb%aai_W>%b%Gb|;f=xer;r!7$$`7}R~P5x zklR)L%)@q+N%Ifp$sg2efz;UTl4EEF9XblE`1nE=YSe=Lq2w`I$a%Hnt9Q=<79ji8 z3lC~BSu$4DTkaj*?-k81Ih8fJ)baWD&&Tw@4IB!S;3L_ZUApWm#4`lZ%Q3V$Uk=O~ zyt8a(&d4D3>4GRq7;?<`oEY&z18%&(!P$c$b@KcS)@Xjc>KN8&{I~R5gf;DC__n7Wu>Q`5n3;A)$$*n&a5l~)wcQ_(i90xyM;2yi9*t)EB4?o3Tkq4EG77X z=AC)1X*Kiy0EO*PQ&70ECHe4ND9`_spqmD-w}GI@J_aKHgm;)0Pj36yXEk_x*iSq_Sf&Pt9Z%5y8(eK>geP@#{I56JDRJo~(@U zj~eI(@N&H9y&TSb>;soUs;fxz4ENUsZ*K5_@p03>hiX#e7~j1gOQe>q#{*x< z$F%0kZ|Jo?jE(2LqoemLmbf&O_9LoGebLl}B7`LZ zZErNVweUSZKbXI=6>_NDOvbB0`ab$pNx#8EL^{ld=UCleUi#5eU`15q)8!2R(l*`HDP{m8ti$x5y+{_7qDIz;sU)gOw@ACvrukG>^ENOa#AWzf5bz5b>P9To+NHj`nwNJ2u>aG*42CDtYd+ zNlDba4PsK1r0diS-po+Ssg~A1t+RX&3He#gg{%D-uNW+7J+7$*wequF301-{@KVG@ zzAVfM^Jm%4VcJMX(8^9og$03C=KGMh(6n?@ldOT3UERY*TxluEvmPE$rx$ac2I%5L zpga9_Gcg#!!opWjTa=$FQH6IB)YMKh?&8QypVycj{{s05_lUVfpI0(u0J#^&mR`;I3edM#06s>$eIE37x1{=eW6loNe`(B5BonCQ(K0FQ(5iF^y~ zJ+xYKBM#bBX9xa__O`f3$7e?O1IQnzuF1`iEPZR#YHkOq(uYpG1Ms}|E8DA$h?Hoa z3Knl$ADJ>W%x-iV^@0(a=nZf#`IyHUfZ~q6{8~XIA^ci2wwSF3ac&(Q)GQ>R~yh{ywk2`(dzG z`RO@9z9Yp%ZSi%~n`oNe_enoLYL>n5?`Ch!-so+uO)0IfSfhX4cXoz=iAB|}JxpfW z%X#%{<2-$eM5iwM{6$)*Mj{m?lhwT~@?3i)&_cN5hW?C^;Q{r?5r_`Ms>MzfSM~@e zo>36VT2dIvA54Tr0K=SpzHPvrkB?8J?aOeVkv87lQLp1;ISAWAJI8mby5`y7XlQOv z;jZGkn9ktMuy@%|JcK#RX06tEDxk)(Q+HH1ahl?gu?v^*G<5y>5%6{L8mW1#~t1!pF zUr8cPvKEt{4IO%Jvb1&GG-%x4>yPwpmH8D7d4ELVIobn0iZt9S*mp-$i^tDB7S_wc z!(wNRKpxi0;bRsC_|Lu4AT?~HW4dQ}U!Dt^k>MX2H@;~YP!l`T^?5q46+f`Dowwp8 z`;m60syr0^Rf;)MCVuj6HTHF1RCf)iZC(yj=MG)A$BJbO^m1RYwDP{?%0@J z!9xPqu{RV4x+6N0Q;GAj){TxDJ9l@XME7oHp@N0trR{dWI$)O>40!ts5YUi-d-grv zC4pu=OR`b9D20`q*X4<%C@wlRyin{4cDxj7FXrish|+<_5Jx?Eb)0dpx8=fS^tuXC zkmcfTk~T0DKRKBj$j`qu>_56$M=J~qT8E}_Z>xGb(~=`3&yd|hx4|PYwM6+0A~|u)UaOk(o0G@#63-b zn0!P+g9s@Zy{cCPSEVvFWT@dJM^r0FRA%LDNcQ{QTB~kp%FGstn8nIcW@mNxqgDTI z2#N2<(-*UwTArz?Njy)1xxrWpuP9|`=*tEz-BuumqcE$3f(NCY#LPfRyM9z5PeV%Y z{yf-g^ekx{lqG5grY*QeSStv?X#kc2ygnYMk-|&|V5N_4AF$LUDZ*d!C!>K7eplYK zfpd@gl;@i2!^~I8&`|2D#OFDpldMXd<$RMsyeTpEt=;9Jf_H{3$=&=Z|M2k5)wGMp zW!>NIs*1j@vVaUL)*!?va_H$ck%t0yZ7>A)0<`c+L1W89aNox&Mlg_>>Jkd{@UNL( zoOw>$A0oO6G?$?{>b8ABWzps%1#Gl(v$c5SJNd^}g9_SW80H-R-Y{0XeA`-4Y7?-X z_*g$8Y;X$l_zKqkQHD$prz}caXCCn~*DD4FUnh=I>~pS~Hd9sABjgMYGTEcuD(z1F z19Og-pQ=^N{Tdf~jQr{Oxp%oiY-nQ>&oYt8aJ%HHS$|9_?(sxeItXSX;U?{);iN`C zN)t;&t8U}Va@R!;(!T$*fU&1S$~SDb#lLrE`FiVUBZr1{fSTF{|?5g?5xa8%l=90Fg0RpSNUPy1GWsH4%m|6TEKvX}&4<3Y?c18u-JwTIZ;vz`@q;g)1xsy+m{nYh+}b zIB>I0fE}C0#d&+xYio7tzy=f2$aA-b4Y$TzX0lb+wj*hS5~X@Bhe(!gar z7Zs|T1^cl*dg$Y#y(xoh0O{Rm=Y)6fOAusCj=?dN=2&)i>ozoSSGoJHOM5SX0dZCZ$3D0vCPk6PhLjW3j+u5X8{O+QsbZm9EjCC zcIGVYl{2kOg#={6<(Sb#rqevJSkzJ_f<;4(c!Ly2&I7($^JUM9VfvTZTM$71ONE{D?*{oo~4$=H=7dn1kV4Z^q3w?7SlRgt*=_Zgjd-QG& zmD8RHNjAmrI0(7dUScF_GUN`IHNzCtdU$va5!mH;aB9w930bV1s@A0r@gQi)#cUAEe zvW?18G{Yh!R4L;CS-W)Z*g=zT zxy;e%4G;0l3{|BkTUfR4csJ3kv}P@9i8IhLjkl>L0RmpdrNd?Gunz@;IJt$Qp1Xnc z12nF=QM}#D6ZB>%z-`er3qPY2UW8z6jploX%3)?Fc! zB=cr#iCWXF;9>?fw*cQ&@`mV6Q>TE{AtEUhQ-TK5d8aZ~o6qjDJ`U z#%)NXebBF=JCTNjiZufTZYEVI(*sV~$jXp>G*^JpCVDdUVLBX=xTGX;Ba+mO7Opzv z?NTTdnR6P{^JR(y)s1vk_Xing(W;lWu$K(9)zlk1>CglVVN=k1Hxr>o5$gbqQ|*@c zF1UGDVYA6gKR>KLXt+fOC``X?Ir2dy)va}#-4^`qDty3{O%`$dRv)Nx=RDSSC@Bs1 zoGD@S(|^3hHX7QHF%?7qp`k%$<-FB8x>HO&7Ts~SI6HGBf#Q1V?C^ej>ashp)OCAd zS=ZfKc5l1f3IU?k?EKKp8wNUVxg|a>gd*XLd3}yjEaHk)i_|jiu6pNX^ zd>${`r%{eeH~D zEcEW>K?+*C{QNDL^z%0j#UG{}lC(vIlQHwc3){q=>BiCVfAC6zpmG;sTeYIw!LhXk zOvtM$m(V^k0U>`BW8QXlWCukf!eE zdWPisHM=S`X}^XukAG!Skj~}?r~b}7fRDs3$f!ka9;^DBWhwq~Am_`~s_dbkKHAJ- z^4&c)#wI7`2YKI>5x##|7^}wA8D`B(u@&O>Sk7CeDekIAr&d!9YTtmI$DR$yyWEaw zv80c`H$Rp+Ml4Aq%=f)dKB&q#(`i#ICbplRY2a$G8j`1DL5i87ic11^ngW)q1{pKg)3FpMb+g1~pESFj%fMRJaC zYYDSfd3(GPbC)iusv%)bRvT$x3LsaeT)>kl`qJ7j1Ivaz;0J+m-xt&F%d2g`MI>@NI( zyG-P?Yw4kAd;U&zdSiA~;n;%gqvtYT|1VWkw-Vc{ zOFbc1)|mn#;1RtgZ26kdB#(@;|C-rMP8E&0yB+1i>MZhY<&!Kcf=hFv(!(%{eEM>^ zP^!6+*s49IEhdcwtX&85won|FEEh9fWJf^Jjik(NlP{liufPW)l-_S_$tB_gcq5Uh zT2%hh1sK9ulnoW8>Fm6Sx%MA*>I*PAPC8Wm6;!dgqd`Lf*PCIvnyL$~!2$NV-W%I0 znHy-KZ%N!B?YmfN8;QFzX! zZm|S^A+m0Vly}dfa(HE%4Y4G*K8Y_rPIMbs@v)3D?I0a9H*4Ws71k`HB8Q^gIuF<7 zccnlos?IR5}%OqL0OccDHY_wt! z=t6^3BNmIEGe~;mKn*Py^A5Be(UeZskpDv#AfO0H7v1X_MzMN_?`P52VMOhnKytB| z|2~Q(^4B821&y#)+aQ0fjn$I)nCv>I`0BtG$;G$*yyj}(zH7zpxfpA)d_CINBXjVk zN}XlETtddmAX35QAGfjI4 zMM$|1`JzJh-UyL5hedP)LM4hs9SijB>Za1xsT$_ZE$kEQAL&c$tNjq*maLgzH15n# zpK|DMJ?6&+|68xoSO4y;!=>xiI(79#U1ygvdFfUJPle>DcdG_z^wcxy1nKGNOoxlk zob&n9!Z^=pyNj#SzpZ#_o8IO2`0s6-rr$r}di{~B3QV^*N5AKp9v=8u;^a{Hr>pF2 zjn+of_@yyJf6m+?=1DKg3bGPsj%E3o3wZBvsp62jq+DY0a99>o%aUG53h;*E86%Il z3p25v)hE2dB#!l1*Kvv`LBN&0h7@A+LAzHF#Nq>P2j(DtE(k)%D&2qtEd`_{-9QJy z8i9BJx|kfc_2ALNxb1XHv5hk%89|p1@@%=S+$l^o-{_@*_-!5>nQT$LAVNiTz&_1Y zK}wf;bq<2){3H2_TL`B3wzyi$M5b%2(r~dI5|a0;TzBze%;fIPumyNlD08E&m|)2) zlI{MuIvqPUWSEm1i!V2JuQn;o2#X%O$!U)UrmntjlpA9*-6eghrX~vfX@ExAWL9Ln zhhMzFkA&gCq z{o~_o;|0t>WyG3X9~k$9f#d}J?Db^l~6 zCh2%C?EfLubk$SURr)>&=e<;4VQ+0?kjfTH@H@^g0oyrjt(jL44ts|xy)!d6XCFTi z-lY0Ux2!Ydq7C~sir!`#k!HM4UN|;n_Bb3Fc z4Ygeob9vx{)Y~ba4u^>u~-Kk2fLNRvQ5H*Detkf8BDqfB%+1W0M4%zx;8Jaw# zL@LAb^od7_ST0Y9ugT%d_n%aj%+Hj7rYwt^(||;SOq|&wQy?#nOT-UeK{PUB;ut&H zw>8*4a;D70SV6Ux@z}C%#zx;^GhMMv4pmoJ#S&AB)&L}U#x1F5!9s4W!;mo)wH#Gl`?L{n_44~OgO!r}T0WGiVV!F|5& zRJ3hve*W5{nFB)2iY`RaGKUT?O{W$S~Rn-7k~J+%8qe z2uvKeze*mGPBlAYbMYt-Huda`-bfGiXo|eJZ4n$f(PWfD20RTJXfd&7qRkIX2qE*O zXaP=tq4NPe02dLzRl^!bFTeWAfa(i#kFkYwZ?cbHIXrhEdS{q;$;F}BACcYU4wBk; zEYtOsjQJQD>iv2jYi574Kl3@ce?evk?T1m%{E5^%miEJ_W|VfkymnSt6`6_4SfxQ} zkAdx}k$XXK1~6=vz&<*wBB^ScWU$Vt^Zfh@Y9!;h%@UTk-Rpj!1$)C@8@@M=YjU`%N@ujQD$(P0dnyC1;C$)4=AGyFb=;rzz}D3xtQysdv=sw7n=8FBm4i# zSTJUhJ(lOFm0cK2N;0U*SO#D$R;=5;@mOphVk}rmtY>IqdFhx~Ft^!*QppB(VOWYW zm29XqwgQ?13NR1ecy!oO$sZRjI^4WLgcTn=)M=w0%M@&&;`Ka@cocw&FQJvt=q)=_ zOJ_i?lUT}{)Ri}vNixmP?`zj&n@}DKVR0V@dBB`$36tiO1x-_@+$GwVLyryvHy<(p zQNzS(A&S@|=Oo#B&qv#9uncYpFn+Y(15V)YO;ItaIw#AA{EJxMKL<}CkP|hd2P-1& za@Nw{G*D+#FLhcL_2^b|gpy800Txa2%ACII+&qil^T@xgy7~tE_AQjpxO?Ce%I*c0 z?p_c)Qr^!VqdN$UbTibn#$p84F+44Z!VL{PJ)vwQFw&xZeJUloEXtMw7|)VD4cYHY z6t=y3&aLomo?Y)gf@7V3%g~-?@2Gp!hZqM?ctYN9hTUXn2d4t<>>IiwPV2Rb zVf3XKb;D{6C-$(9rJXca?_2?%q1{Q7_!x6`O6Au%mRZ~uBYLrFhNt}_b9uVeNNQ`5 z;i?SW8&gGXtPpyCT7BNsCNe5(7EuJ73H$Z8T~Cpnq_Vh?_a zZC=zW$jMG*`0RE;nYJ$}dQ2SvjB972gk0090~=$M$HhXJeL-xxqOc5*Z8$D^;C)_9 zN$M?W;}Ktib;A`xK?QDA$OEifz>DSCSeM@Xpa8(F51-*%(<{T}@OBkGr{SY4tm{jq z;WQqt1gz`ztz0Ex-8`?apnT=3@S=vKaw8FNB1H$*%Ndrm6T#kd;ICI;2v_tJQZN3R z79-b(!b_Wvl->{kU#B(6b)YZRo3v*MtbfeKg_w=Yb}d=8T-TDY+_hxdqApuW0l`OX zT!MP(gPWIJMy>UsI+&=YC8PO&a!zPUKX^{$W~w?r)U4QF$?oj@yawpJ!q=Hs#d7nC z{I_{Uwetth?5wQ2Kit&bowwl1+=}SjHZbojGdH0+BGkmiIOv2}Y`QUC4LYJBE{3r* zET%MoT{7{FOLRm-g%GO{8o*Zp9TDTjnrt0W!B0mjVxSbF_zd5gu5GA+xApj(hL5sz zL^PF#(|A-1IwBISt(SB}MI;)lsjY8V+_YFGeR47B#cC`x*pL$9R`9AnBqOe?DL$Av zlQ+~IA8w5~me(Yl%)bK4zc^Ee`)9A^V3cwY!*)sFSba9fF!EdhCc1*BwS4Q~aNPnQ z@opAtDkv2Lp5IG=uY<-um}-w-i_tzDsqR3iB>%4K{J{DvCL znLdl!SQzP22woc029u>gbT^@Ke7oEYv@}TR`}*x$zLKAcC zxb{gFW%+?|PboG;8QTDi&A0s63YHsN;fEX>dTrMZPC@k78{S`J*#T*M1=Nd+Fn!mK z5VwW^H1vWJ3C0vTmxn9+Wr+STLAMePS1wEfrGEvMZre52pThMN#Wk~9#&^4(T;yD% z30SEI49Ex%UO{YW7Z~S!7Z{h^1xDl?sT=lzL9tlU3x;fw9rqsMI4%+6@M^iZRv(Q>8F1k1-_*m)U;sRIRrMa1Yu(QWHq-YRXK!~_y{ z6|*kw{kD>5g>%8KAiE>0_uI%*cb0rCsGj;c$7ZU=|8gjr`4Ksn*Z8UK&Y?OFM|J4c zpK~WP3BU=zl|6|-oZfc|o%)a(d*7xTSgFiH0R|iNv%&^mtdtt>qaT5{l*-Z1PFLjA zf;Z?h&ZC82^Uv?0XdzG`tgJ9&Az_*8T{Vi5-}Ua9-#q_(gyMw&KV2N~+cEYzU0${l zFakVhRrA7!bTd+MSvg{Zr~So&vhtN#xS(MlghoAoYteM;iFrJpSnBZ3&q`$ zhQer7VRCaz@Z5z^_f2b!eq+3;qkLe?rU#mOqR!qmj!=nf>%Dt+aKi(~#~PwNpJ|TY zx<2KJH^mFX{(OtK=3_%`hfkVpPR%im(_!gt>lmmkOr~neJBJgFSUlnD?f>%U-akOG zEA2r8Ji{I|DctjQqb@W;GD3uP*J(skwWJZv)7XfnaxFy#wEUS#iF`5WDubOyA>CH2 zo=Mt-)JJYbgD%QPY)4~61M!i1(r_CTzhyCvcK&aq(P>JfB;M5k(=luR2S^3_=OdEp zGgLi&BwDFRS;;k3hdaQ$h2C$h*rsku13{TF9Rd(We{H=R1FX+%%EX&1d#%9 ziBx5wRT8Ph@|CD}SIaGqlD}_@BRPNg5gQ$ylnrOqM{0P)`IR)|W7(~bWSXhp1e!H5 zw~*NVV$C3k3c65|69C zLWqL41L*{hE6R)2*&bJzpRNc;!NppQ&+x73n)+&ZTZhkS_$bTcTAfP6X*{X{kE>#J zO`YU%g)3G^t841&7kOM8vRHbv_3OyeRk5ljnWu?LX%0Nq%k74@U!$51&v{= z?P=hOy0V5U?wZQ$FylioAUjgKh~(KJ_zx!k=M+GfTtw-11>Jox%_n7icg38ovfj?} z|73b=s;G{?iTOBl@&mN|hRDnKR;%snK>n3c^@gf!%XuvW#M^EGJ5pcydzge9RSbSKQxQ?Jy~^uA zeK=f?kB??Pek0|8+oI8%X)ZXbBz!4G>Am`M%{HzH>`5DN=5LvF1TkeYE|#fgg}NB! z58h}N3jl77&8S-cO46-6x7gBou|`x{?beynvWV|iJX>TF@g8uDSQddlS`~wjTddPesJc;h%ni5| zmA8uaywnF6B$peXZB_?1>&ogiRvKKyzzQPo1t$JV>d^PLj34dw)g-dmbz;ljW93cH z^uPMA*p%#qAU7o&{p&_Y)27kpfg_);eSUIm>$tx#z`8%)h+JfMvOGIE+StFod^xt= z+1+=0=2w|t@@|9u=qcL3Y;D3^5^$Gv?%Fii9&x93wNf?`ZsHhrG(%rtFtda9#9KGt zNzACiLK)mzMKjw~inD@#3T;_rnx%Jxih!RoQ(7L5S0Wkxzy_nwA?*hWms)YBhhPLU z>-{SwGT*p$o`oz)V+WNqw(2?^^^(mUL6=e@?47S3*7^9sC%0BE*Jn>>H|MbNYctmy z3e9~Fe^ZiS+QW|as|qkd+%vkki(TQOE_OmmMCnO>Z6mvKxslz|YKyCIMJW;?tCyY8 zLT?r$7UJ%59Y!-tFq#>>aX&jrnh;jsprIWVk>;S6hFY%E)s6~)%CJz2_Wz4{1DyNd zdGD4&IX9X(+cIC{Ce1rY=UvVW-+10iv;S)+9g-(~nohbTD9w5rW?f2G#7A#kC{0;P z>wfU0HA;x+hSTm)0!5rOZ@?|st1$u^d(YCDhhXMGY34!T_=<>-ii-t+TjDXr9Y8V! zW7A$ELKiCYDHy%5Q5eZqRHaY zE{Q(b5aoJQ`b!0v6wi~3+%X?>TApC4^D^p~Yn4bhlNEcy8sVXx zpYY_>1Q*v9kgVDQ{f%l1?6R2s;aN2+%hLNj@{g;oz6`%zL-!Fcsx2Vbt1Zy~57ZVU z6lTAE)^^Rt{vCh9$`pWGBdKWWEyw@M?1c7iR9>JU82s}`It+XZ9NVmjdiqm79 zMTjnj19-=0ozYHrE_keh3(LC7V4xl*C2!#YD3~_nxKgPs<0pmt(ab4XfTg!YES0yz z4mORahX)@o@$~#Qa-nH(dw8@e6M3VtclD=V+`s+w_Uac)TJCGvw0*soZGNn=>w(q) zxia$1L{p>h=v3E4OGn$FufO#Z6K%tp*Pq*c<;Bt7N1wZ=b+W&@_tC%I!u$D}iZ#6t zV&6Ih*5KE=nFL|4?evGa-f&zD(9(+OSYQ=+vQepwwjic7JYLcUFuBBy1s}G!0{zzl zaAS+9H@o1*7Vy)B1;yaE`tcdQHC+)6qgRX1Y4|A1jrFI}a2k&)z>O{RSFD!Y*n&cT zF}kvg+*mgwb?^m@$oWcFC8SOjU~J}F6N)jEu-pXR@jf8ip=FyDs;=v%UfafS^9>!* z<(nL;eb=uspuG>}y`llE9J{9bq2P}wWmroZAeP7*lBO-{BB|Z<{GKGyua?UxZsciD zuyNgfh)D`EuGbWi{f!JT{!h;Vfx~s@a8v>e*PTREiJ3`r2+}!}%-0Vr?m}6*+ysKx zpTGwUTr&UH9lA>~`_~f*Afyw-7RY*j*$mNK=p{ikqoXhb3X2gRbU(;f8a4cB|! zb$f@Zb}zf;=gQ`LigGf~E>oEcfsGoLxfW2kR<6QLJVGLlw@wuzF~weir#$T_LS&Z5 z)3&pv62GQnhEh1WibuUJ#(2q;t;&;%1Inp%mItmYo!3T-B%&+=VoM41O~oi16d(pj21%r)`wYpj5Mypx#^Wu@E9*FNB=b_LsVM~yRflx2URq11xejg{;OAmyCDsto zJZp)@yR|k zKM~T<@QkSSOH3W$njz}`Px3BE2MrGjq*=ACs-i@*{qHQT;d_Gw3NN-C=moGL$Zi;ASh24#Rm$ogGYJ z+NDAzmCt8SX1dIr11F2&WN}0+=oRCpOozeXzfe4gRStQ@(;M7cr}twahn` z;q1zYP#G6jfGn?$(VGVQFNr~(rW0^a2C#cN?y$=Vop3~q^Ynhf|2z0E2C+3|j+W-7 zaf`g&Ca$IlxsTMK^?GaM1Eu8uzIM%gu*7_C+4VDa_1D^C^xk}7yfZV#p9EVR>+eK9 z5Q|CO7;{t@WRfcL%C)mIMhlHe85cG!%SC$VCGcQtb7E<}1WWvRv)m)4#49)Rlyc6D zXep9PLX1|C@nR0aCX_DRrQ7As+D|6me_Lr*KA)T!8~XwA9*c~`RsOkMY<%uKD_l7l zAB`N#y!C_8i|zX^OhlSo9$UCKJaJ)PJJ#lzXKvSPX5RTFJWE^=IG>~p}AO`Su9z~@$t}(mbnp;wL zCM>tBX}KD-pI@`82(y(t&K{)ky$~a)BiO$~X}6Jz`31 z5AXHH{Revid`2Jh5`*`)amK|Q@CFUB>AV~Vc!wS-d#8!Xm5(zP+Tw;bfX(&_Jr#nX z0`JhG0k6=&i_UDXP{U7aHMHqCKEt=BT^=XA&Bf<5e6+ZsIGn~K7kGtQy(?Gp3N>22 z!RgBNEZ#|-C*6%*ROi5}WpU%)B`#j%##=+K8=uMU<;E=P)b`)_?CKTPp}NAJmhN#T zIXC#oy2qIc{)FQgbWx=5Yd^&Ib@KO_aju*^sc|qSi~?gX`5BE4JI)co3XfV%; z7W5cdsTvU|S51<&1Xs7y;c}0&y7uIwp%7@Va`#H-)(gFn-e)=-t6g}nJkCJ|Gz|Q9 z3HoQ*zpT0>>g8Y7t7tMnYRZGfcJX|=owW&n^zZTKxu(9;9gc|G9dc}a<&OW=+SSCi zQAFY0&2GH5TE}+mZsN7un62x&+r;~0%Q3BsgxtU>2ZT68k(yL$lyKn?OinrEgg79O znj44%ickdz?K-ANAVjaZ6d@lXRB-@_L!?Ud2>mh4do#AzKijkw7w_7uwPwEecHf&f zGv7xstF_zw8h7-}|E>7^cZ;@`HXZ8jVt#BA@lZiu1d05^Hv4-gPK(wQ7jWMQY)%g| zB^?S81eZX?nSwIJ5L~toczb>@_G2mlrouhMROMcUo;&Jb>uCRBehx#>N>CcS5x+`V$gyo%IlLF@Du%jDCyZlI-Sb%DIxoHkEyXi1+-U z%i8tj@Yy?z$ZLM!NT07Nw?ljpIHkyw+zS~YvCC%ZWzFo-Wg>?@xmUq^Go5=K!D@=# z+ffgJr1H>>KBB4v4=WYVE&uzcxGsG`GN4tiVQ{p_)d)idm>36cZXGS(@N~OSOqN@?WRhJKF6J-r6?v z+E*J7+7EO5FExQs|Q2f zx-9>ltQ(&1Z1|!|v_z4ltFvLFr<17A+MGtxBpxy*Cg9Oi%IJv33YQK)wPKRf>BvWd7?4G!WEW1{I8m_6B+`-byA7V(M%N1A03i!Fh}-jcmCoNHcK{R zcO?KFG2$q&QZFqZAT@+Rcp-TwN)x~`O&Jo=iYqFpyD(Z*kRO;a-8(pZeeG0ISu9hLL7~=@ zoCCqZn7k*)sNmp`0v+go-j~u0iw(Bl0p&DP(oqi&GFa)UBF^~tJPyGiNU8I>z4S^Y zx`9N+uU|dMwxKR9{}joBhTHByhXy6xM6hk(2kZ}wy2{*L#(oel+SIs#|r?=Uc;zhpIXNGPAnk_$Pyaj#4+l!*_N=ZFuSkHCx! z?CZlKea{EZgF4(4Y)hXjk~7%vK)qpKPT?R8dCc5^>IYor*_@mB%>I z82FHUxr_N{?0JgY4YRWj-2=Qkb-|+E1aJKg#KjkY7^?7kkcNd3a8kE(Wsu?%qm6)? zuRIrmeeQS+czyoq58a@<{s)zT7bO6A+GAj30D?1T-d|c763=h*l|i0^0W6ZeIT=R( zFa1}`VZ&Ym`DfkXkhAr5eO+GAj3U|=u#7s|lEk@LUw|49xT2A~KEcntuM)&{V6 z+HI3fXcJKsh0na7nJ!8xMY<9ssI4H9RVblUvCcyL>0$z5C{ns8Ap{kqN{TUyB0)r4 zgdmM8D;*SfS%?%Dt}G~mf*TPDp}4gc7ZOE7Jntm~v2@_$ym|M&naepd;v0PMay|pG ziWI6cL``S0q;8|^Hj&dAEI2!;i8ZW~5%~!hSi9o1F(;OgqAts^?g#GW$Sbl;u91LL z$SNuI_wuISoHfsgk<*y;9-^WzVpJbNL;XZiKc`m7c{KDQ?>Ep86TAm|hNxV-ZQRu# zsc95dv!}Lp8osI^p;z%lpTYs}D$;rwN%aQ9>H&Q57+Yp$>L}m8D0jQRq(E7nK&W0I zlAFj=^J)coIgUs@;<}1RxVR(S?hW=uB8hePD{E_{*B_ZPre9VO$SKrWt1E?sJB6ca z90~awO1{Q9@eF~O#unAQKO1|`b))aqJUMK7bZGGPd? z=BTaI$2fkCw)BWSWg<&NHiMONA?gtBdOaHwm{Qw=?c;?k7BqJf3+Lcu9Co@Y><+g#$)-r+Jrn_joVyzU0H; zqvKQKbH-Q7H^_Gb5T5h>i|{&1poj5 z000620RRF3761SN00FQ70001Z+MQLga??N%U6BNnV4!0t7)Av%G{JE~3X&Ek6$~>F zptfwu7LhHDb&hezH&9aW1r(|I0%-UW3O<2%@AhOVILQp7k^OYHyZ3hY-JOWsk?*o5 z!TP3%e8%f=AZ>g(d`)i4SH)}cT)rt@m;3TZ@rK+B+KR7BJ9wzLC7*(>;v4cHI8(d{ z{7doH#!>KF@lDxp?I~^pCyIZ_-PRYyKc(9`lV_4kAq$yGDnl8Gkx=%eE4z3?%=Tmg ziwS1?z!}C~z-AyFAdBsIjQJA31B}do2f$NcgLpCi-%7-BgWph&7|%4k`?T9d)NaH2 zHO7bd&#?9sHM0y1{a*t2Fz47D{trL^ ztfpKeMO?%9u1*H1$4ZT9d4l;65t1vaUavt|Rl(0+K6`vcKaOBM#+n)Qu;ia%BvPEH zZAt8VZS#rfb20N!IYqD^aVDwqU9FP>Yv%F+GkuI$y?Opg#n`T1Qn@zv9OJf<%f1+T zj~aYZwAD{2)de^xc*cCttW}M313MDy~@|Ziv z?!H8}xmwAbLU~2M2_m@&Ht(2RXY58<%hSai^Ls{4u7@LLVYEjH>l1>9(|byGzB8_t zC(Nd(#UA53qAFtg=B(e0HFFgzF=`pPbD$%)WQ(t_K}j!{!(|=6NQo&=hzvG^D({TF z^l>t>9WwW!+RUmm$@R+Ho@(wnEzWb8X+KKc0lD^n>F-pQY27EBu{LflrCl@XBStIO zjSSu;t1%+0IY;~SDOHP(zu`Wy)ri5_a$3~*S?dwmWtwA5#*y~PcF|jV?y36O9vH0b zceu}DbuF7cOI1O3ZFhRt)!y8*UY9xJ<*JwMnzrWjisd8K;e1TB%j+7L6J=GV*2hqB zgX%=hRiCF?A-5l#w^O^(-MdOJ%_=yZdxbB!^QKhyh;a(sIXigfd^%vTJPF3tIpCt~ z{Fl#rtQpnLI(IuBgR|xL2EPUG;ChkruWruE8}B5^fOe0tDAUfCCWRf&@5l#=`-) z!j>IwOfvap=I~_lzC`i2e%m<2|LSwNMWQ5{Xl%p~i=8;)agabFNhFg(DruyXK_*#b zlS3|fGbfGKV=#GJjg%cNUN-3k93VP6!Ui799 zed&h>Fa4>+ho1oqWDtWH!cc}WoDqy<6r&l#SjI7)2~1=XlbOO)rZJrv%%n5VDUW!}6FySQ3!d?u)70^uJ-p^6uc!~d;8(UXhX8Y#&paA9NFxhbK#(RvEMhTB z_{36{vy2t2VkK9?zp;kZtYsZv_{LSvaF%Pl;jK6%K@ufNk|jk_B~8*LLoy{xvL%Oe zoaYjkxy=PGa)-^FkX&wXQ}QIA9a12LQY6JvVh=S048y35XsRAV)!A#QPSveeG;4(e zR8zH7r|MGOYN=YLmaG5rJP}RJHBCotpe_`wsjh0OkE|?zM7Q7O3k4gS2cO>I_eSmr zYpG7v^#{-ko^Jqn+C9uW4#F@HMNv;ooc{+Y4F!^E0Lk0HY0^Ygwv=^Hr-2UEGNAz> z(X%TUfpPcFEAAcMM}#x$Fz(F+aIsS>lv!bIJ8bqeM!Q6z2E&j`ja=+;1Ch`%ONI2^B({c7fb0)PJxK);{X6Gz2idw literal 0 HcmV?d00001 diff --git a/ajax/libs/ink/2.3.1/font/ubuntu-ri-webfont.eot b/ajax/libs/ink/2.3.1/font/ubuntu-ri-webfont.eot new file mode 100644 index 0000000000000000000000000000000000000000..eeb26916b4d0d3e77c3f1bec67b6e02cedbfb0b9 GIT binary patch literal 26250 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 literal 0 HcmV?d00001 diff --git a/ajax/libs/ink/2.3.1/font/ubuntu-ri-webfont.svg b/ajax/libs/ink/2.3.1/font/ubuntu-ri-webfont.svg new file mode 100644 index 000000000..9e6df9f50 --- /dev/null +++ b/ajax/libs/ink/2.3.1/font/ubuntu-ri-webfont.svg @@ -0,0 +1,245 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ajax/libs/ink/2.3.1/font/ubuntu-ri-webfont.ttf b/ajax/libs/ink/2.3.1/font/ubuntu-ri-webfont.ttf new file mode 100644 index 0000000000000000000000000000000000000000..4fbfe2e0e12c969f7088aed236506d8cd12f5ba9 GIT binary patch literal 58816 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 literal 0 HcmV?d00001 diff --git a/ajax/libs/ink/2.3.1/font/ubuntu-ri-webfont.woff b/ajax/libs/ink/2.3.1/font/ubuntu-ri-webfont.woff new file mode 100644 index 0000000000000000000000000000000000000000..dab2b315642c3f0560704c3ec1f85976cd18c6c0 GIT binary patch literal 30008 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 literal 0 HcmV?d00001 diff --git a/ajax/libs/ink/2.3.1/font/ubuntumono-b-webfont.svg b/ajax/libs/ink/2.3.1/font/ubuntumono-b-webfont.svg new file mode 100644 index 000000000..9a4b25104 --- /dev/null +++ b/ajax/libs/ink/2.3.1/font/ubuntumono-b-webfont.svg @@ -0,0 +1,242 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ajax/libs/ink/2.3.1/font/ubuntumono-b-webfont.ttf b/ajax/libs/ink/2.3.1/font/ubuntumono-b-webfont.ttf new file mode 100644 index 0000000000000000000000000000000000000000..c0e5679fc91fe2f50fed5981d0cd5ed2d791e67b GIT binary patch literal 47848 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